From 57fca34dc0d2a8106678d311dd06559642dcb443 Mon Sep 17 00:00:00 2001 From: Okke Formsma Date: Sun, 14 Mar 2021 21:39:31 +0100 Subject: [PATCH 001/289] refactor(hid): Move hid logic into hid.c Move the logic for picking the correct hid function into hid.c. --- app/include/zmk/hid.h | 4 ++++ app/src/hid.c | 20 ++++++++++++++++++++ app/src/hid_listener.c | 39 +++++++++------------------------------ 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index f507b56a..bd6ce2e7 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -133,6 +133,7 @@ int zmk_hid_register_mods(zmk_mod_flags_t explicit_modifiers); int zmk_hid_unregister_mods(zmk_mod_flags_t explicit_modifiers); int zmk_hid_implicit_modifiers_press(zmk_mod_flags_t implicit_modifiers); int zmk_hid_implicit_modifiers_release(); + int zmk_hid_keyboard_press(zmk_key_t key); int zmk_hid_keyboard_release(zmk_key_t key); void zmk_hid_keyboard_clear(); @@ -141,5 +142,8 @@ int zmk_hid_consumer_press(zmk_key_t key); int zmk_hid_consumer_release(zmk_key_t key); void zmk_hid_consumer_clear(); +int zmk_hid_press(uint32_t usage); +int zmk_hid_release(uint32_t usage); + struct zmk_hid_keyboard_report *zmk_hid_get_keyboard_report(); struct zmk_hid_consumer_report *zmk_hid_get_consumer_report(); diff --git a/app/src/hid.c b/app/src/hid.c index d6c63e1d..a8009c7a 100644 --- a/app/src/hid.c +++ b/app/src/hid.c @@ -176,6 +176,26 @@ int zmk_hid_consumer_release(zmk_key_t code) { return 0; }; +int zmk_hid_press(uint32_t usage) { + switch (ZMK_HID_USAGE_PAGE(usage)) { + case HID_USAGE_KEY: + return zmk_hid_keyboard_press(ZMK_HID_USAGE_ID(usage)); + case HID_USAGE_CONSUMER: + return zmk_hid_consumer_press(ZMK_HID_USAGE_ID(usage)); + } + return -EINVAL; +} + +int zmk_hid_release(uint32_t usage) { + switch (ZMK_HID_USAGE_PAGE(usage)) { + case HID_USAGE_KEY: + return zmk_hid_keyboard_release(ZMK_HID_USAGE_ID(usage)); + case HID_USAGE_CONSUMER: + return zmk_hid_consumer_release(ZMK_HID_USAGE_ID(usage)); + } + return -EINVAL; +} + void zmk_hid_consumer_clear() { memset(&consumer_report.body, 0, sizeof(consumer_report.body)); } struct zmk_hid_keyboard_report *zmk_hid_get_keyboard_report() { diff --git a/app/src/hid_listener.c b/app/src/hid_listener.c index c0a82c34..e233b0b8 100644 --- a/app/src/hid_listener.c +++ b/app/src/hid_listener.c @@ -21,21 +21,10 @@ static int hid_listener_keycode_pressed(const struct zmk_keycode_state_changed * LOG_DBG("usage_page 0x%02X keycode 0x%02X implicit_mods 0x%02X explicit_mods 0x%02X", ev->usage_page, ev->keycode, ev->implicit_modifiers, ev->explicit_modifiers); - switch (ev->usage_page) { - case HID_USAGE_KEY: - err = zmk_hid_keyboard_press(ev->keycode); - if (err < 0) { - LOG_ERR("Unable to press keycode"); - return err; - } - break; - case HID_USAGE_CONSUMER: - err = zmk_hid_consumer_press(ev->keycode); - if (err < 0) { - LOG_ERR("Unable to press keycode"); - return err; - } - break; + err = zmk_hid_press(ZMK_HID_USAGE(ev->usage_page, ev->keycode)); + if (err < 0) { + LOG_DBG("Unable to press keycode"); + return err; } explicit_mods_changed = zmk_hid_register_mods(ev->explicit_modifiers); implicit_mods_changed = zmk_hid_implicit_modifiers_press(ev->implicit_modifiers); @@ -56,20 +45,10 @@ static int hid_listener_keycode_released(const struct zmk_keycode_state_changed LOG_DBG("usage_page 0x%02X keycode 0x%02X implicit_mods 0x%02X explicit_mods 0x%02X", ev->usage_page, ev->keycode, ev->implicit_modifiers, ev->explicit_modifiers); - switch (ev->usage_page) { - case HID_USAGE_KEY: - err = zmk_hid_keyboard_release(ev->keycode); - if (err < 0) { - LOG_ERR("Unable to release keycode"); - return err; - } - break; - case HID_USAGE_CONSUMER: - err = zmk_hid_consumer_release(ev->keycode); - if (err < 0) { - LOG_ERR("Unable to release keycode"); - return err; - } + err = zmk_hid_release(ZMK_HID_USAGE(ev->usage_page, ev->keycode)); + if (err < 0) { + LOG_DBG("Unable to release keycode"); + return err; } explicit_mods_changed = zmk_hid_unregister_mods(ev->explicit_modifiers); @@ -104,4 +83,4 @@ int hid_listener(const zmk_event_t *eh) { } ZMK_LISTENER(hid_listener, hid_listener); -ZMK_SUBSCRIPTION(hid_listener, zmk_keycode_state_changed); \ No newline at end of file +ZMK_SUBSCRIPTION(hid_listener, zmk_keycode_state_changed); From c5922fae56e991b55b560e7b5261c7c4cabf50cd Mon Sep 17 00:00:00 2001 From: Okke Formsma Date: Tue, 16 Mar 2021 20:46:24 +0100 Subject: [PATCH 002/289] refactor(hid): add mask to HID_USAGE_PAGE macro --- app/include/dt-bindings/zmk/hid_usage_pages.h | 2 +- app/include/zmk/events/keycode_state_changed.h | 2 +- app/src/behaviors/behavior_caps_word.c | 2 +- app/src/behaviors/behavior_sticky_key.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/include/dt-bindings/zmk/hid_usage_pages.h b/app/include/dt-bindings/zmk/hid_usage_pages.h index 55241522..2ccdba55 100644 --- a/app/include/dt-bindings/zmk/hid_usage_pages.h +++ b/app/include/dt-bindings/zmk/hid_usage_pages.h @@ -12,7 +12,7 @@ #define ZMK_HID_USAGE(page, id) ((page << 16) | id) #define ZMK_HID_USAGE_ID(usage) (usage & 0xFFFF) -#define ZMK_HID_USAGE_PAGE(usage) (usage >> 16) +#define ZMK_HID_USAGE_PAGE(usage) ((usage >> 16) & 0xFF) /* WARNING: DEPRECATED from dt-bindings/zmk/keys.h */ #define USAGE_KEYPAD (0x07) // WARNING: DEPRECATED (DO NOT USE) diff --git a/app/include/zmk/events/keycode_state_changed.h b/app/include/zmk/events/keycode_state_changed.h index 8e60014f..233ec62f 100644 --- a/app/include/zmk/events/keycode_state_changed.h +++ b/app/include/zmk/events/keycode_state_changed.h @@ -23,7 +23,7 @@ ZMK_EVENT_DECLARE(zmk_keycode_state_changed); static inline struct zmk_keycode_state_changed_event * zmk_keycode_state_changed_from_encoded(uint32_t encoded, bool pressed, int64_t timestamp) { - uint16_t page = ZMK_HID_USAGE_PAGE(encoded) & 0xFF; + uint16_t page = ZMK_HID_USAGE_PAGE(encoded); uint16_t id = ZMK_HID_USAGE_ID(encoded); uint8_t implicit_modifiers = 0x00; uint8_t explicit_modifiers = 0x00; diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 3af9a172..0423dc62 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -162,7 +162,7 @@ static int behavior_caps_word_init(const struct device *dev) { #define CAPS_WORD_LABEL(i, _n) DT_INST_LABEL(i) #define PARSE_BREAK(i) \ - {.page = (ZMK_HID_USAGE_PAGE(i) & 0xFF), \ + {.page = ZMK_HID_USAGE_PAGE(i), \ .id = ZMK_HID_USAGE_ID(i), \ .implicit_modifiers = SELECT_MODS(i)}, diff --git a/app/src/behaviors/behavior_sticky_key.c b/app/src/behaviors/behavior_sticky_key.c index 904a84fe..267b81ab 100644 --- a/app/src/behaviors/behavior_sticky_key.c +++ b/app/src/behaviors/behavior_sticky_key.c @@ -199,7 +199,7 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) { if (strcmp(sticky_key->config->behavior.behavior_dev, "KEY_PRESS") == 0 && ZMK_HID_USAGE_ID(sticky_key->param1) == ev->keycode && - (ZMK_HID_USAGE_PAGE(sticky_key->param1) & 0xFF) == ev->usage_page && + ZMK_HID_USAGE_PAGE(sticky_key->param1) == ev->usage_page && SELECT_MODS(sticky_key->param1) == ev->implicit_modifiers) { // don't catch key down events generated by the sticky key behavior itself continue; From 0d5bb100ba9856e9548863f624b4ff7375b227ed Mon Sep 17 00:00:00 2001 From: Caleb Goates Date: Fri, 29 Apr 2022 12:31:21 -0600 Subject: [PATCH 003/289] feat(behavior): Add key toggle --- app/CMakeLists.txt | 1 + app/Kconfig | 6 +++ app/dts/behaviors.dtsi | 1 + app/dts/behaviors/key_toggle.dtsi | 15 ++++++ .../behaviors/zmk,behavior-key-toggle.yaml | 8 +++ app/include/zmk/hid.h | 5 ++ app/src/behaviors/behavior_key_toggle.c | 44 ++++++++++++++++ app/src/hid.c | 50 ++++++++++++++++++- app/tests/keytoggle/behavior_keymap.dtsi | 17 +++++++ .../kt-press-release/events.patterns | 1 + .../kt-press-release/keycode_events.snapshot | 2 + .../kt-press-release/native_posix_64.keymap | 10 ++++ 12 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 app/dts/behaviors/key_toggle.dtsi create mode 100644 app/dts/bindings/behaviors/zmk,behavior-key-toggle.yaml create mode 100644 app/src/behaviors/behavior_key_toggle.c create mode 100644 app/tests/keytoggle/behavior_keymap.dtsi create mode 100644 app/tests/keytoggle/kt-press-release/events.patterns create mode 100644 app/tests/keytoggle/kt-press-release/keycode_events.snapshot create mode 100644 app/tests/keytoggle/kt-press-release/native_posix_64.keymap diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 58b1efbe..c052e901 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -40,6 +40,7 @@ target_sources_ifdef(CONFIG_ZMK_EXT_POWER app PRIVATE src/behaviors/behavior_ext if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/hid.c) target_sources(app PRIVATE src/behaviors/behavior_key_press.c) + target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_KEY_TOGGLE app PRIVATE src/behaviors/behavior_key_toggle.c) target_sources(app PRIVATE src/behaviors/behavior_hold_tap.c) target_sources(app PRIVATE src/behaviors/behavior_sticky_key.c) target_sources(app PRIVATE src/behaviors/behavior_caps_word.c) diff --git a/app/Kconfig b/app/Kconfig index 95c4295e..4bcd88b0 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -330,6 +330,12 @@ config ZMK_BEHAVIORS_QUEUE_SIZE int "Maximum number of behaviors to allow queueing from a macro or other complex behavior" default 64 +DT_COMPAT_ZMK_BEHAVIOR_KEY_TOGGLE := zmk,behavior-key-toggle + +config ZMK_BEHAVIOR_KEY_TOGGLE + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_KEY_TOGGLE)) + endmenu menu "Advanced" diff --git a/app/dts/behaviors.dtsi b/app/dts/behaviors.dtsi index c1dacbcd..b3502cbb 100644 --- a/app/dts/behaviors.dtsi +++ b/app/dts/behaviors.dtsi @@ -1,4 +1,5 @@ #include +#include #include #include #include diff --git a/app/dts/behaviors/key_toggle.dtsi b/app/dts/behaviors/key_toggle.dtsi new file mode 100644 index 00000000..98001b79 --- /dev/null +++ b/app/dts/behaviors/key_toggle.dtsi @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/ { + behaviors { + /omit-if-no-ref/ kt: behavior_key_toggle { + compatible = "zmk,behavior-key-toggle"; + label = "KEY_TOGGLE"; + #binding-cells = <1>; + }; + }; +}; diff --git a/app/dts/bindings/behaviors/zmk,behavior-key-toggle.yaml b/app/dts/bindings/behaviors/zmk,behavior-key-toggle.yaml new file mode 100644 index 00000000..e3ec86f7 --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-key-toggle.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Key toggle behavior + +compatible: "zmk,behavior-key-toggle" + +include: one_param.yaml diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index bd6ce2e7..902b76d1 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -129,6 +129,8 @@ struct zmk_hid_consumer_report { zmk_mod_flags_t zmk_hid_get_explicit_mods(); int zmk_hid_register_mod(zmk_mod_t modifier); int zmk_hid_unregister_mod(zmk_mod_t modifier); +bool zmk_hid_mod_is_pressed(zmk_mod_t modifier); + int zmk_hid_register_mods(zmk_mod_flags_t explicit_modifiers); int zmk_hid_unregister_mods(zmk_mod_flags_t explicit_modifiers); int zmk_hid_implicit_modifiers_press(zmk_mod_flags_t implicit_modifiers); @@ -137,13 +139,16 @@ int zmk_hid_implicit_modifiers_release(); int zmk_hid_keyboard_press(zmk_key_t key); int zmk_hid_keyboard_release(zmk_key_t key); void zmk_hid_keyboard_clear(); +bool zmk_hid_keyboard_is_pressed(zmk_key_t key); int zmk_hid_consumer_press(zmk_key_t key); int zmk_hid_consumer_release(zmk_key_t key); void zmk_hid_consumer_clear(); +bool zmk_hid_consumer_is_pressed(zmk_key_t key); int zmk_hid_press(uint32_t usage); int zmk_hid_release(uint32_t usage); +bool zmk_hid_is_pressed(uint32_t usage); struct zmk_hid_keyboard_report *zmk_hid_get_keyboard_report(); struct zmk_hid_consumer_report *zmk_hid_get_consumer_report(); diff --git a/app/src/behaviors/behavior_key_toggle.c b/app/src/behaviors/behavior_key_toggle.c new file mode 100644 index 00000000..cd2a5dcd --- /dev/null +++ b/app/src/behaviors/behavior_key_toggle.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_behavior_key_toggle + +#include +#include +#include + +#include +#include +#include +#include + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +static int behavior_key_toggle_init(const struct device *dev) { return 0; } + +static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event) { + LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); + bool pressed = zmk_hid_is_pressed(binding->param1); + return ZMK_EVENT_RAISE( + zmk_keycode_state_changed_from_encoded(binding->param1, !pressed, event.timestamp)); +} + +static int on_keymap_binding_released(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event) { + return 0; +} + +static const struct behavior_driver_api behavior_key_toggle_driver_api = { + .binding_pressed = on_keymap_binding_pressed, + .binding_released = on_keymap_binding_released, +}; + +#define KT_INST(n) \ + DEVICE_DT_INST_DEFINE(n, behavior_key_toggle_init, NULL, NULL, NULL, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_key_toggle_driver_api); + +DT_INST_FOREACH_STATUS_OKAY(KT_INST) diff --git a/app/src/hid.c b/app/src/hid.c index a8009c7a..c3462dde 100644 --- a/app/src/hid.c +++ b/app/src/hid.c @@ -4,6 +4,7 @@ * SPDX-License-Identifier: MIT */ +#include "zmk/keys.h" #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -55,6 +56,11 @@ int zmk_hid_unregister_mod(zmk_mod_t modifier) { return current == GET_MODIFIERS ? 0 : 1; } +bool zmk_hid_mod_is_pressed(zmk_mod_t modifier) { + zmk_mod_flags_t mod_flag = 1 << modifier; + return (zmk_hid_get_explicit_mods() & mod_flag) == mod_flag; +} + int zmk_hid_register_mods(zmk_mod_flags_t modifiers) { int ret = 0; for (zmk_mod_t i = 0; i < 8; i++) { @@ -96,6 +102,13 @@ static inline int deselect_keyboard_usage(zmk_key_t usage) { return 0; } +static inline bool check_keyboard_usage(zmk_key_t usage) { + if (usage > ZMK_HID_KEYBOARD_NKRO_MAX_USAGE) { + return false; + } + return keyboard_report.body.keys[usage / 8] & (1 << (usage % 8)); +} + #elif IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_HKRO) #define TOGGLE_KEYBOARD(match, val) \ @@ -119,6 +132,15 @@ static inline int deselect_keyboard_usage(zmk_key_t usage) { return 0; } +static inline int check_keyboard_usage(zmk_key_t usage) { + for (int idx = 0; idx < CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE; idx++) { + if (keyboard_report.body.keys[idx] == usage) { + return true; + } + } + return false; +} + #else #error "A proper HID report type must be selected" #endif @@ -164,6 +186,13 @@ int zmk_hid_keyboard_release(zmk_key_t code) { return 0; }; +bool zmk_hid_keyboard_is_pressed(zmk_key_t code) { + if (code >= HID_USAGE_KEY_KEYBOARD_LEFTCONTROL && code <= HID_USAGE_KEY_KEYBOARD_RIGHT_GUI) { + return zmk_hid_mod_is_pressed(code - HID_USAGE_KEY_KEYBOARD_LEFTCONTROL); + } + return check_keyboard_usage(code); +} + void zmk_hid_keyboard_clear() { memset(&keyboard_report.body, 0, sizeof(keyboard_report.body)); } int zmk_hid_consumer_press(zmk_key_t code) { @@ -176,6 +205,17 @@ int zmk_hid_consumer_release(zmk_key_t code) { return 0; }; +void zmk_hid_consumer_clear() { memset(&consumer_report.body, 0, sizeof(consumer_report.body)); } + +bool zmk_hid_consumer_is_pressed(zmk_key_t key) { + for (int idx = 0; idx < CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE; idx++) { + if (consumer_report.body.keys[idx] == key) { + return true; + } + } + return false; +} + int zmk_hid_press(uint32_t usage) { switch (ZMK_HID_USAGE_PAGE(usage)) { case HID_USAGE_KEY: @@ -196,7 +236,15 @@ int zmk_hid_release(uint32_t usage) { return -EINVAL; } -void zmk_hid_consumer_clear() { memset(&consumer_report.body, 0, sizeof(consumer_report.body)); } +bool zmk_hid_is_pressed(uint32_t usage) { + switch (ZMK_HID_USAGE_PAGE(usage)) { + case HID_USAGE_KEY: + return zmk_hid_keyboard_is_pressed(ZMK_HID_USAGE_ID(usage)); + case HID_USAGE_CONSUMER: + return zmk_hid_consumer_is_pressed(ZMK_HID_USAGE_ID(usage)); + } + return false; +} struct zmk_hid_keyboard_report *zmk_hid_get_keyboard_report() { return &keyboard_report; diff --git a/app/tests/keytoggle/behavior_keymap.dtsi b/app/tests/keytoggle/behavior_keymap.dtsi new file mode 100644 index 00000000..32712a8d --- /dev/null +++ b/app/tests/keytoggle/behavior_keymap.dtsi @@ -0,0 +1,17 @@ +#include +#include +#include + +/ { + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kt B &none + &none &none + >; + }; + }; +}; diff --git a/app/tests/keytoggle/kt-press-release/events.patterns b/app/tests/keytoggle/kt-press-release/events.patterns new file mode 100644 index 00000000..833100f6 --- /dev/null +++ b/app/tests/keytoggle/kt-press-release/events.patterns @@ -0,0 +1 @@ +s/.*hid_listener_keycode_//p \ No newline at end of file diff --git a/app/tests/keytoggle/kt-press-release/keycode_events.snapshot b/app/tests/keytoggle/kt-press-release/keycode_events.snapshot new file mode 100644 index 00000000..259501ba --- /dev/null +++ b/app/tests/keytoggle/kt-press-release/keycode_events.snapshot @@ -0,0 +1,2 @@ +pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/keytoggle/kt-press-release/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release/native_posix_64.keymap new file mode 100644 index 00000000..644caa26 --- /dev/null +++ b/app/tests/keytoggle/kt-press-release/native_posix_64.keymap @@ -0,0 +1,10 @@ +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; \ No newline at end of file From 0977be622a6ae2c61231f89b888c3e77f89bd477 Mon Sep 17 00:00:00 2001 From: Caleb Goates Date: Mon, 2 May 2022 21:47:50 -0600 Subject: [PATCH 004/289] feat(docs): Add docs for key toggle behavior --- docs/docs/behaviors/key-toggle.md | 26 ++++++++++++++++++++++++++ docs/sidebars.js | 1 + 2 files changed, 27 insertions(+) create mode 100644 docs/docs/behaviors/key-toggle.md diff --git a/docs/docs/behaviors/key-toggle.md b/docs/docs/behaviors/key-toggle.md new file mode 100644 index 00000000..85b328f8 --- /dev/null +++ b/docs/docs/behaviors/key-toggle.md @@ -0,0 +1,26 @@ +--- +title: Key Toggle Behavior +sidebar_label: Key Toggle +--- + +## Summary + +The key toggle behavior toggles the press of a key. +If the key is not currently pressed, key toggle will press it, holding it until the key toggle is pressed again or the key is released in some other way. +If the key _is_ currently pressed, key toggle will release it. + +Example uses for key toggle include shift lock, or `ALT-TAB` window switching without holding down the `ALT` modifier. + +### Behavior Binding + +- Reference: `&kt` +- Parameter: The [keycode](../codes/index.mdx), e.g. `LALT` or `DOWN_ARROW` + +Example: + +``` +&kt LALT +``` + +You can use any keycode that works for `&kp` as parameter to `&kt`, however, [modified keys](../codes/modifiers.mdx#modifier-functions) such as `LA(A)` will be toggled based on the status of the base keycode (in this case `A`). +In other words, modifiers are ignored when determining whether or not the key is currently pressed. diff --git a/docs/sidebars.js b/docs/sidebars.js index ab159689..e7d05850 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -28,6 +28,7 @@ module.exports = { "behaviors/mod-tap", "behaviors/mod-morph", "behaviors/macros", + "behaviors/key-toggle", "behaviors/sticky-key", "behaviors/sticky-layer", "behaviors/tap-dance", From 6dc436cb23ac361fd375725d60f638db3b1709da Mon Sep 17 00:00:00 2001 From: Caleb Goates Date: Wed, 4 May 2022 22:30:02 -0600 Subject: [PATCH 005/289] test(behavior): Add alt-tab test and modded alpha test for toggle key Uses multiple toggles of modifier keys overlapping each other. --- .../keytoggle/kt-alt-tab/events.patterns | 1 + .../kt-alt-tab/keycode_events.snapshot | 28 +++++++++++ .../kt-alt-tab/native_posix_64.keymap | 48 +++++++++++++++++++ .../keytoggle/kt-modded-alpha/events.patterns | 1 + .../kt-modded-alpha/keycode_events.snapshot | 12 +++++ .../kt-modded-alpha/native_posix_64.keymap | 38 +++++++++++++++ .../kt-press-release-nkro/events.patterns | 1 + .../keycode_events.snapshot | 2 + .../native_posix_64.conf | 7 +++ .../native_posix_64.keymap | 10 ++++ 10 files changed, 148 insertions(+) create mode 100644 app/tests/keytoggle/kt-alt-tab/events.patterns create mode 100644 app/tests/keytoggle/kt-alt-tab/keycode_events.snapshot create mode 100644 app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap create mode 100644 app/tests/keytoggle/kt-modded-alpha/events.patterns create mode 100644 app/tests/keytoggle/kt-modded-alpha/keycode_events.snapshot create mode 100644 app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap create mode 100644 app/tests/keytoggle/kt-press-release-nkro/events.patterns create mode 100644 app/tests/keytoggle/kt-press-release-nkro/keycode_events.snapshot create mode 100644 app/tests/keytoggle/kt-press-release-nkro/native_posix_64.conf create mode 100644 app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap diff --git a/app/tests/keytoggle/kt-alt-tab/events.patterns b/app/tests/keytoggle/kt-alt-tab/events.patterns new file mode 100644 index 00000000..69eeca5a --- /dev/null +++ b/app/tests/keytoggle/kt-alt-tab/events.patterns @@ -0,0 +1 @@ +s/.*\(hid_listener_keycode_\|hid_implicit_modifiers_\)//p diff --git a/app/tests/keytoggle/kt-alt-tab/keycode_events.snapshot b/app/tests/keytoggle/kt-alt-tab/keycode_events.snapshot new file mode 100644 index 00000000..3318db42 --- /dev/null +++ b/app/tests/keytoggle/kt-alt-tab/keycode_events.snapshot @@ -0,0 +1,28 @@ +pressed: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 +press: Modifiers set to 0x04 +pressed: usage_page 0x07 keycode 0x2B implicit_mods 0x00 explicit_mods 0x00 +press: Modifiers set to 0x04 +released: usage_page 0x07 keycode 0x2B implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x04 +pressed: usage_page 0x07 keycode 0x2B implicit_mods 0x00 explicit_mods 0x00 +press: Modifiers set to 0x04 +released: usage_page 0x07 keycode 0x2B implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x04 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +press: Modifiers set to 0x06 +pressed: usage_page 0x07 keycode 0x2B implicit_mods 0x00 explicit_mods 0x00 +press: Modifiers set to 0x06 +released: usage_page 0x07 keycode 0x2B implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x06 +released: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x02 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +press: Modifiers set to 0x02 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x02 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +press: Modifiers set to 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x00 diff --git a/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap new file mode 100644 index 00000000..f4379893 --- /dev/null +++ b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap @@ -0,0 +1,48 @@ +#include +#include +#include + +&kscan { + events = < + /* Toggle LALT on */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* Tap TAB twice */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* Toggle LSHFT on */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* Tap TAB once */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* Toggle LALT off */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* Tap A */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* Toggle LSHFT off */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* Tap A */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + >; +}; + +/ { + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kt LALT &kp TAB + &kt LSHFT &kp A + >; + }; + }; +}; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-modded-alpha/events.patterns b/app/tests/keytoggle/kt-modded-alpha/events.patterns new file mode 100644 index 00000000..69eeca5a --- /dev/null +++ b/app/tests/keytoggle/kt-modded-alpha/events.patterns @@ -0,0 +1 @@ +s/.*\(hid_listener_keycode_\|hid_implicit_modifiers_\)//p diff --git a/app/tests/keytoggle/kt-modded-alpha/keycode_events.snapshot b/app/tests/keytoggle/kt-modded-alpha/keycode_events.snapshot new file mode 100644 index 00000000..6fd41cb2 --- /dev/null +++ b/app/tests/keytoggle/kt-modded-alpha/keycode_events.snapshot @@ -0,0 +1,12 @@ +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x02 explicit_mods 0x00 +press: Modifiers set to 0x02 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x02 explicit_mods 0x00 +release: Modifiers set to 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +press: Modifiers set to 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x02 explicit_mods 0x00 +release: Modifiers set to 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x02 explicit_mods 0x00 +press: Modifiers set to 0x02 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x00 diff --git a/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap new file mode 100644 index 00000000..3b14e416 --- /dev/null +++ b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap @@ -0,0 +1,38 @@ +#include +#include +#include + +&kscan { + events = < + /* Toggle LS(A) on */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* Toggle LS(A) off */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* Press A */ + ZMK_MOCK_PRESS(1,0,10) + /* Toggle LS(A) on */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* Toggle LS(A) off */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* Release A */ + ZMK_MOCK_RELEASE(1,0,10) + >; +}; + +/ { + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kt LS(A) &trans + &kp A &trans + >; + }; + }; +}; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-press-release-nkro/events.patterns b/app/tests/keytoggle/kt-press-release-nkro/events.patterns new file mode 100644 index 00000000..833100f6 --- /dev/null +++ b/app/tests/keytoggle/kt-press-release-nkro/events.patterns @@ -0,0 +1 @@ +s/.*hid_listener_keycode_//p \ No newline at end of file diff --git a/app/tests/keytoggle/kt-press-release-nkro/keycode_events.snapshot b/app/tests/keytoggle/kt-press-release-nkro/keycode_events.snapshot new file mode 100644 index 00000000..259501ba --- /dev/null +++ b/app/tests/keytoggle/kt-press-release-nkro/keycode_events.snapshot @@ -0,0 +1,2 @@ +pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.conf b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.conf new file mode 100644 index 00000000..01abac5e --- /dev/null +++ b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.conf @@ -0,0 +1,7 @@ +CONFIG_GPIO=n +CONFIG_LOG=y +CONFIG_LOG_BACKEND_SHOW_COLOR=n +CONFIG_ZMK_LOG_LEVEL_DBG=y +CONFIG_DEBUG=y +CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000 +CONFIG_ZMK_HID_REPORT_TYPE_NKRO=y \ No newline at end of file diff --git a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap new file mode 100644 index 00000000..644caa26 --- /dev/null +++ b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap @@ -0,0 +1,10 @@ +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; \ No newline at end of file From 8e67524e629ff55f1f19a3965d49dd84f959374e Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 3 Jun 2022 04:16:19 +0000 Subject: [PATCH 006/289] chore: Bump docusaurus and fix deps issue. --- docs/package-lock.json | 21102 ++++++++++++++++++++++++++++++--------- docs/package.json | 8 +- 2 files changed, 16574 insertions(+), 4536 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 38b3c2be..ad062dcc 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -1,99 +1,15118 @@ { "name": "docs", "version": "0.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, - "dependencies": { - "@algolia/autocomplete-core": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.5.2.tgz", - "integrity": "sha512-DY0bhyczFSS1b/CqJlTE/nQRtnTAHl6IemIkBy0nEWnhDzRDdtdx4p5Uuk3vwAFxwEEgi1WqKwgSSMx6DpNL4A==", - "requires": { - "@algolia/autocomplete-shared": "1.5.2" + "packages": { + "": { + "name": "docs", + "version": "0.0.0", + "dependencies": { + "@docusaurus/core": "^2.0.0-beta.21", + "@docusaurus/preset-classic": "^2.0.0-beta.21", + "@fortawesome/fontawesome-svg-core": "^1.2.32", + "@fortawesome/free-solid-svg-icons": "^5.15.3", + "@fortawesome/react-fontawesome": "^0.1.18", + "@mdx-js/react": "^1.6.22", + "classnames": "^2.2.6", + "js-yaml": "^4.1.0", + "react": "^17.0.2", + "react-async": "^10.0.1", + "react-copy-to-clipboard": "^5.0.3", + "react-dom": "^17.0.2", + "react-toastify": "^7.0.4", + "web-tree-sitter": "^0.19.4" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^2.0.0-beta.21", + "@docusaurus/types": "^2.0.0-beta.21", + "@tsconfig/docusaurus": "^1.0.5", + "@types/js-yaml": "^4.0.5", + "@types/react": "^17.0.3", + "@types/react-helmet": "^6.1.5", + "@types/react-router-dom": "^5.1.7", + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-mdx": "^1.17.0", + "eslint-plugin-react": "^7.30.0", + "json-schema-to-typescript": "^10.1.5", + "mustache": "^4.2.0", + "null-loader": "^4.0.0", + "prebuild-webpack-plugin": "^1.1.1", + "prettier": "2.3.1", + "string-replace-loader": "^3.1.0", + "typescript": "^4.6.3", + "webpack": "^5.72.1" } }, - "@algolia/autocomplete-preset-algolia": { + "node_modules/@algolia/autocomplete-core": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.6.3.tgz", + "integrity": "sha512-dqQqRt01fX3YuVFrkceHsoCnzX0bLhrrg8itJI1NM68KjrPYQPYsE+kY8EZTCM4y8VDnhqJErR73xe/ZsV+qAA==", + "dependencies": { + "@algolia/autocomplete-shared": "1.6.3" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.6.3.tgz", + "integrity": "sha512-UV46bnkTztyADFaETfzFC5ryIdGVb2zpAoYgu0tfcuYWjhg1KbLXveFffZIrGVoboqmAk1b+jMrl6iCja1i3lg==" + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.1.tgz", + "integrity": "sha512-UAUVG2PEfwd/FfudsZtYnidJ9eSCpS+LW9cQiesePQLz41NAcddKxBak6eP2GErqyFagSlnVXe/w2E9h2m2ttg==", + "dependencies": { + "@algolia/cache-common": "4.13.1" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.13.1.tgz", + "integrity": "sha512-7Vaf6IM4L0Jkl3sYXbwK+2beQOgVJ0mKFbz/4qSxKd1iy2Sp77uTAazcX+Dlexekg1fqGUOSO7HS4Sx47ZJmjA==" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.13.1.tgz", + "integrity": "sha512-pZzybCDGApfA/nutsFK1P0Sbsq6fYJU3DwIvyKg4pURerlJM4qZbB9bfLRef0FkzfQu7W11E4cVLCIOWmyZeuQ==", + "dependencies": { + "@algolia/cache-common": "4.13.1" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.13.1.tgz", + "integrity": "sha512-TFLiZ1KqMiir3FNHU+h3b0MArmyaHG+eT8Iojio6TdpeFcAQ1Aiy+2gb3SZk3+pgRJa/BxGmDkRUwE5E/lv3QQ==", + "dependencies": { + "@algolia/client-common": "4.13.1", + "@algolia/client-search": "4.13.1", + "@algolia/transporter": "4.13.1" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.13.1.tgz", + "integrity": "sha512-iOS1JBqh7xaL5x00M5zyluZ9+9Uy9GqtYHv/2SMuzNW1qP7/0doz1lbcsP3S7KBbZANJTFHUOfuqyRLPk91iFA==", + "dependencies": { + "@algolia/client-common": "4.13.1", + "@algolia/client-search": "4.13.1", + "@algolia/requester-common": "4.13.1", + "@algolia/transporter": "4.13.1" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.13.1.tgz", + "integrity": "sha512-LcDoUE0Zz3YwfXJL6lJ2OMY2soClbjrrAKB6auYVMNJcoKZZ2cbhQoFR24AYoxnGUYBER/8B+9sTBj5bj/Gqbg==", + "dependencies": { + "@algolia/requester-common": "4.13.1", + "@algolia/transporter": "4.13.1" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.13.1.tgz", + "integrity": "sha512-1CqrOW1ypVrB4Lssh02hP//YxluoIYXAQCpg03L+/RiXJlCs+uIqlzC0ctpQPmxSlTK6h07kr50JQoYH/TIM9w==", + "dependencies": { + "@algolia/client-common": "4.13.1", + "@algolia/requester-common": "4.13.1", + "@algolia/transporter": "4.13.1" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.13.1.tgz", + "integrity": "sha512-YQKYA83MNRz3FgTNM+4eRYbSmHi0WWpo019s5SeYcL3HUan/i5R09VO9dk3evELDFJYciiydSjbsmhBzbpPP2A==", + "dependencies": { + "@algolia/client-common": "4.13.1", + "@algolia/requester-common": "4.13.1", + "@algolia/transporter": "4.13.1" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" + }, + "node_modules/@algolia/logger-common": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.13.1.tgz", + "integrity": "sha512-L6slbL/OyZaAXNtS/1A8SAbOJeEXD5JcZeDCPYDqSTYScfHu+2ePRTDMgUTY4gQ7HsYZ39N1LujOd8WBTmM2Aw==" + }, + "node_modules/@algolia/logger-console": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.13.1.tgz", + "integrity": "sha512-7jQOTftfeeLlnb3YqF8bNgA2GZht7rdKkJ31OCeSH2/61haO0tWPoNRjZq9XLlgMQZH276pPo0NdiArcYPHjCA==", + "dependencies": { + "@algolia/logger-common": "4.13.1" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.1.tgz", + "integrity": "sha512-oa0CKr1iH6Nc7CmU6RE7TnXMjHnlyp7S80pP/LvZVABeJHX3p/BcSCKovNYWWltgTxUg0U1o+2uuy8BpMKljwA==", + "dependencies": { + "@algolia/requester-common": "4.13.1" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.13.1.tgz", + "integrity": "sha512-eGVf0ID84apfFEuXsaoSgIxbU3oFsIbz4XiotU3VS8qGCJAaLVUC5BUJEkiFENZIhon7hIB4d0RI13HY4RSA+w==" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.13.1.tgz", + "integrity": "sha512-7C0skwtLdCz5heKTVe/vjvrqgL/eJxmiEjHqXdtypcE5GCQCYI15cb+wC4ytYioZDMiuDGeVYmCYImPoEgUGPw==", + "dependencies": { + "@algolia/requester-common": "4.13.1" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.13.1.tgz", + "integrity": "sha512-pICnNQN7TtrcYJqqPEXByV8rJ8ZRU2hCiIKLTLRyNpghtQG3VAFk6fVtdzlNfdUGZcehSKGarPIZEHlQXnKjgw==", + "dependencies": { + "@algolia/cache-common": "4.13.1", + "@algolia/logger-common": "4.13.1", + "@algolia/requester-common": "4.13.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", + "integrity": "sha512-QdwOGF1+eeyFh+17v2Tz626WX0nucd1iKOm6JUTUvCZdbolblCOOQCxGrQPY0f7jEhn36PiAWqZnsC2r5vmUWg==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", + "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", + "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.2", + "@babel/parser": "^7.18.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", + "dependencies": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", + "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", + "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "dependencies": { + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz", + "integrity": "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", + "dependencies": { + "@babel/types": "^7.18.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "dependencies": { + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", + "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", + "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", + "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", + "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", + "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", + "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", + "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", + "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", + "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", + "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", + "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", + "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", + "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", + "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", + "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", + "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", + "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", + "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-remap-async-to-generator": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz", + "integrity": "sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz", + "integrity": "sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-replace-supers": "^7.18.2", + "@babel/helper-split-export-declaration": "^7.16.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", + "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", + "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", + "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", + "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", + "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", + "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", + "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-simple-access": "^7.18.2", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz", + "integrity": "sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-validator-identifier": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", + "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", + "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", + "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-new-target/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", + "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz", + "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", + "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", + "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-jsx": "^7.17.12", + "@babel/types": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", + "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", + "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", + "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", + "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "regenerator-transform": "^0.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", + "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz", + "integrity": "sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", + "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", + "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", + "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz", + "integrity": "sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-typescript": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex/node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", + "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", + "dependencies": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-async-generator-functions": "^7.17.12", + "@babel/plugin-proposal-class-properties": "^7.17.12", + "@babel/plugin-proposal-class-static-block": "^7.18.0", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.17.12", + "@babel/plugin-proposal-json-strings": "^7.17.12", + "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.18.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-private-methods": "^7.17.12", + "@babel/plugin-proposal-private-property-in-object": "^7.17.12", + "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.17.12", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.17.12", + "@babel/plugin-transform-async-to-generator": "^7.17.12", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.17.12", + "@babel/plugin-transform-classes": "^7.17.12", + "@babel/plugin-transform-computed-properties": "^7.17.12", + "@babel/plugin-transform-destructuring": "^7.18.0", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.17.12", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.18.1", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.17.12", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.18.0", + "@babel/plugin-transform-modules-commonjs": "^7.18.2", + "@babel/plugin-transform-modules-systemjs": "^7.18.0", + "@babel/plugin-transform-modules-umd": "^7.18.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", + "@babel/plugin-transform-new-target": "^7.17.12", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.17.12", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.18.0", + "@babel/plugin-transform-reserved-words": "^7.17.12", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.17.12", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.18.2", + "@babel/plugin-transform-typeof-symbol": "^7.17.12", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.18.2", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.22.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", + "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", + "dependencies": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz", + "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-react-display-name": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.17.12", + "@babel/plugin-transform-react-jsx-development": "^7.16.7", + "@babel/plugin-transform-react-pure-annotations": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz", + "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-typescript": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript/node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", + "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.3.tgz", + "integrity": "sha512-l4ddFwrc9rnR+EJsHsh+TJ4A35YqQz/UqcjtlX2ov53hlJYG5CxtQmNZxyajwDVmCxwy++rtvGU5HazCK4W41Q==", + "dependencies": { + "core-js-pure": "^3.20.2", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", + "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@docsearch/css": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.1.0.tgz", + "integrity": "sha512-bh5IskwkkodbvC0FzSg1AxMykfDl95hebEKwxNoq4e5QaGzOXSBgW8+jnMFZ7JU4sTBiB04vZWoUSzNrPboLZA==" + }, + "node_modules/@docsearch/react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.1.0.tgz", + "integrity": "sha512-bjB6ExnZzf++5B7Tfoi6UXgNwoUnNOfZ1NyvnvPhWgCMy5V/biAtLL4o7owmZSYdAKeFSvZ5Lxm0is4su/dBWg==", + "dependencies": { + "@algolia/autocomplete-core": "1.6.3", + "@docsearch/css": "3.1.0", + "algoliasearch": "^4.0.0" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0" + } + }, + "node_modules/@docusaurus/core": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-beta.21.tgz", + "integrity": "sha512-qysDMVp1M5UozK3u/qOxsEZsHF7jeBvJDS+5ItMPYmNKvMbNKeYZGA0g6S7F9hRDwjIlEbvo7BaX0UMDcmTAWA==", + "dependencies": { + "@babel/core": "^7.18.2", + "@babel/generator": "^7.18.2", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.18.2", + "@babel/preset-env": "^7.18.2", + "@babel/preset-react": "^7.17.12", + "@babel/preset-typescript": "^7.17.12", + "@babel/runtime": "^7.18.3", + "@babel/runtime-corejs3": "^7.18.3", + "@babel/traverse": "^7.18.2", + "@docusaurus/cssnano-preset": "2.0.0-beta.21", + "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/mdx-loader": "2.0.0-beta.21", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/utils-common": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", + "@slorber/static-site-generator-webpack-plugin": "^4.0.4", + "@svgr/webpack": "^6.2.1", + "autoprefixer": "^10.4.7", + "babel-loader": "^8.2.5", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.0", + "cli-table3": "^0.6.2", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.22.7", + "css-loader": "^6.7.1", + "css-minimizer-webpack-plugin": "^4.0.0", + "cssnano": "^5.1.9", + "del": "^6.1.1", + "detect-port": "^1.3.0", + "escape-html": "^1.0.3", + "eta": "^1.12.3", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "html-minifier-terser": "^6.1.0", + "html-tags": "^3.2.0", + "html-webpack-plugin": "^5.5.0", + "import-fresh": "^3.3.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.6.0", + "postcss": "^8.4.14", + "postcss-loader": "^7.0.0", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.3", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.3", + "remark-admonitions": "^1.2.1", + "rtl-detect": "^1.0.4", + "semver": "^7.3.7", + "serve-handler": "^6.1.3", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.1", + "tslib": "^2.4.0", + "update-notifier": "^5.1.0", + "url-loader": "^4.1.1", + "wait-on": "^6.0.1", + "webpack": "^5.72.1", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-dev-server": "^4.9.0", + "webpack-merge": "^5.8.0", + "webpackbar": "^5.0.2" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/core/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.21.tgz", + "integrity": "sha512-fhTZrg1vc6zYYZIIMXpe1TnEVGEjqscBo0s1uomSwKjjtMgu7wkzc1KKJYY7BndsSA+fVVkZ+OmL/kAsmK7xxw==", + "dependencies": { + "cssnano-preset-advanced": "^5.3.5", + "postcss": "^8.4.14", + "postcss-sort-media-queries": "^4.2.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/logger": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.0-beta.21.tgz", + "integrity": "sha512-HTFp8FsSMrAj7Uxl5p72U+P7rjYU/LRRBazEoJbs9RaqoKEdtZuhv8MYPOCh46K9TekaoquRYqag2o23Qt4ggA==", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.21.tgz", + "integrity": "sha512-AI+4obJnpOaBOAYV6df2ux5Y1YJCBS+MhXFf0yhED12sVLJi2vffZgdamYd/d/FwvWDw6QLs/VD2jebd7P50yQ==", + "dependencies": { + "@babel/parser": "^7.18.3", + "@babel/traverse": "^7.18.2", + "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "@mdx-js/mdx": "^1.6.22", + "escape-html": "^1.0.3", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "image-size": "^1.0.1", + "mdast-util-to-string": "^2.0.0", + "remark-emoji": "^2.2.0", + "stringify-object": "^3.3.0", + "tslib": "^2.4.0", + "unist-util-visit": "^2.0.3", + "url-loader": "^4.1.1", + "webpack": "^5.72.1" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.21.tgz", + "integrity": "sha512-gRkWICgQZiqSJgrwRKWjXm5gAB+9IcfYdUbCG0PRPP/G8sNs9zBIOY4uT4Z5ox2CWFEm44U3RTTxj7BiLVMBXw==", + "dependencies": { + "@docusaurus/types": "2.0.0-beta.21", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.21.tgz", + "integrity": "sha512-IP21yJViP3oBmgsWBU5LhrG1MZXV4mYCQSoCAboimESmy1Z11RCNP2tXaqizE3iTmXOwZZL+SNBk06ajKCEzWg==", + "dependencies": { + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/mdx-loader": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/utils-common": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", + "cheerio": "^1.0.0-rc.11", + "feed": "^4.2.2", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "remark-admonitions": "^1.2.1", + "tslib": "^2.4.0", + "unist-util-visit": "^2.0.3", + "utility-types": "^3.10.0", + "webpack": "^5.72.1" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/cheerio": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz", + "integrity": "sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/entities": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", + "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/parse5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "dependencies": { + "entities": "^4.3.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.21.tgz", + "integrity": "sha512-aa4vrzJy4xRy81wNskyhE3wzRf3AgcESZ1nfKh8xgHUkT7fDTZ1UWlg50Jb3LBCQFFyQG2XQB9N6llskI/KUnw==", + "dependencies": { + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/mdx-loader": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", + "combine-promises": "^1.1.0", + "fs-extra": "^10.1.0", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "remark-admonitions": "^1.2.1", + "tslib": "^2.4.0", + "utility-types": "^3.10.0", + "webpack": "^5.72.1" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.21.tgz", + "integrity": "sha512-DmXOXjqNI+7X5hISzCvt54QIK6XBugu2MOxjxzuqI7q92Lk/EVdraEj5mthlH8IaEH/VlpWYJ1O9TzLqX5vH2g==", + "dependencies": { + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/mdx-loader": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", + "fs-extra": "^10.1.0", + "remark-admonitions": "^1.2.1", + "tslib": "^2.4.0", + "webpack": "^5.72.1" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.21.tgz", + "integrity": "sha512-P54J4q4ecsyWW0Jy4zbimSIHna999AfbxpXGmF1IjyHrjoA3PtuakV1Ai51XrGEAaIq9q6qMQkEhbUd3CffGAw==", + "dependencies": { + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "fs-extra": "^10.1.0", + "react-json-view": "^1.21.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.21.tgz", + "integrity": "sha512-+5MS0PeGaJRgPuNZlbd/WMdQSpOACaxEz7A81HAxm6kE+tIASTW3l8jgj1eWFy/PGPzaLnQrEjxI1McAfnYmQw==", + "dependencies": { + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.21.tgz", + "integrity": "sha512-4zxKZOnf0rfh6myXLG7a6YZfQcxYDMBsWqANEjCX77H5gPdK+GHZuDrxK6sjFvRBv4liYCrNjo7HJ4DpPoT0zA==", + "dependencies": { + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.21.tgz", + "integrity": "sha512-/ynWbcXZXcYZ6sT2X6vAJbnfqcPxwdGEybd0rcRZi4gBHq6adMofYI25AqELmnbBDxt0If+vlAeUHFRG5ueP7Q==", + "dependencies": { + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/utils-common": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", + "fs-extra": "^10.1.0", + "sitemap": "^7.1.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.21.tgz", + "integrity": "sha512-KvBnIUu7y69pNTJ9UhX6SdNlK6prR//J3L4rhN897tb8xx04xHHILlPXko2Il+C3Xzgh3OCgyvkoz9K6YlFTDw==", + "dependencies": { + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/plugin-content-blog": "2.0.0-beta.21", + "@docusaurus/plugin-content-docs": "2.0.0-beta.21", + "@docusaurus/plugin-content-pages": "2.0.0-beta.21", + "@docusaurus/plugin-debug": "2.0.0-beta.21", + "@docusaurus/plugin-google-analytics": "2.0.0-beta.21", + "@docusaurus/plugin-google-gtag": "2.0.0-beta.21", + "@docusaurus/plugin-sitemap": "2.0.0-beta.21", + "@docusaurus/theme-classic": "2.0.0-beta.21", + "@docusaurus/theme-common": "2.0.0-beta.21", + "@docusaurus/theme-search-algolia": "2.0.0-beta.21" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.21.tgz", + "integrity": "sha512-Ge0WNdTefD0VDQfaIMRRWa8tWMG9+8/OlBRd5MK88/TZfqdBq7b/gnCSaalQlvZwwkj6notkKhHx72+MKwWUJA==", + "dependencies": { + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/plugin-content-blog": "2.0.0-beta.21", + "@docusaurus/plugin-content-docs": "2.0.0-beta.21", + "@docusaurus/plugin-content-pages": "2.0.0-beta.21", + "@docusaurus/theme-common": "2.0.0-beta.21", + "@docusaurus/theme-translations": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/utils-common": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.1.1", + "copy-text-to-clipboard": "^3.0.1", + "infima": "0.2.0-alpha.39", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.14", + "prism-react-renderer": "^1.3.3", + "prismjs": "^1.28.0", + "react-router-dom": "^5.3.3", + "rtlcss": "^3.5.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-beta.21.tgz", + "integrity": "sha512-fTKoTLRfjuFG6c3iwnVjIIOensxWMgdBKLfyE5iih3Lq7tQgkE7NyTGG9BKLrnTJ7cAD2UXdXM9xbB7tBf1qzg==", + "dependencies": { + "@docusaurus/module-type-aliases": "2.0.0-beta.21", + "@docusaurus/plugin-content-blog": "2.0.0-beta.21", + "@docusaurus/plugin-content-docs": "2.0.0-beta.21", + "@docusaurus/plugin-content-pages": "2.0.0-beta.21", + "clsx": "^1.1.1", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^1.3.3", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.21.tgz", + "integrity": "sha512-T1jKT8MVSSfnztSqeebUOpWHPoHKtwDXtKYE0xC99JWoZ+mMfv8AFhVSoSddn54jLJjV36mxg841eHQIySMCpQ==", + "dependencies": { + "@docsearch/react": "^3.1.0", + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/plugin-content-docs": "2.0.0-beta.21", + "@docusaurus/theme-common": "2.0.0-beta.21", + "@docusaurus/theme-translations": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", + "algoliasearch": "^4.13.1", + "algoliasearch-helper": "^3.8.2", + "clsx": "^1.1.1", + "eta": "^1.12.3", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.0-beta.21.tgz", + "integrity": "sha512-dLVT9OIIBs6MpzMb1bAy+C0DPJK3e3DNctG+ES0EP45gzEqQxzs4IsghpT+QDaOsuhNnAlosgJpFWX3rqxF9xA==", + "dependencies": { + "fs-extra": "^10.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/types": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-beta.21.tgz", + "integrity": "sha512-/GH6Npmq81eQfMC/ikS00QSv9jNyO1RXEpNSx5GLA3sFX8Iib26g2YI2zqNplM8nyxzZ2jVBuvUoeODTIbTchQ==", + "dependencies": { + "commander": "^5.1.0", + "history": "^4.9.0", + "joi": "^17.6.0", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.72.1", + "webpack-merge": "^5.8.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-beta.21.tgz", + "integrity": "sha512-M/BrVCDmmUPZLxtiStBgzpQ4I5hqkggcpnQmEN+LbvbohjbtVnnnZQ0vptIziv1w8jry/woY+ePsyOO7O/yeLQ==", + "dependencies": { + "@docusaurus/logger": "2.0.0-beta.21", + "@svgr/webpack": "^6.2.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "github-slugger": "^1.4.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.4.0", + "url-loader": "^4.1.1", + "webpack": "^5.72.1" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-beta.21.tgz", + "integrity": "sha512-5w+6KQuJb6pUR2M8xyVuTMvO5NFQm/p8TOTDFTx60wt3p0P1rRX00v6FYsD4PK6pgmuoKjt2+Ls8dtSXc4qFpQ==", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.21.tgz", + "integrity": "sha512-6NG1FHTRjv1MFzqW//292z7uCs77vntpWEbZBHk3n67aB1HoMn5SOwjLPtRDjbCgn6HCHFmdiJr6euCbjhYolg==", + "dependencies": { + "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "joi": "^17.6.0", + "js-yaml": "^4.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "devOptional": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "devOptional": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "devOptional": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "devOptional": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "0.2.35", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz", + "integrity": "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "1.2.35", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.35.tgz", + "integrity": "sha512-uLEXifXIL7hnh2sNZQrIJWNol7cTVIzwI+4qcBIq9QWaZqUblm0IDrtSqbNg+3SQf8SMGHkiSigD++rHmCHjBg==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.35" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "5.15.3", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.3.tgz", + "integrity": "sha512-XPeeu1IlGYqz4VWGRAT5ukNMd4VHUEEJ7ysZ7pSSgaEtNvSo+FLurybGJVmiqkQdK50OkSja2bfZXOeyMGRD8Q==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.35" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.18.tgz", + "integrity": "sha512-RwLIB4TZw0M9gvy5u+TusAA0afbwM4JQIimNH/j3ygd6aIvYPQLqXMhC9ErY26J23rDPyDZldIfPq/HpTTJ/tQ==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.x" + } + }, + "node_modules/@fortawesome/react-fontawesome/node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "devOptional": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "devOptional": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@mdx-js/mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + } + }, + "node_modules/@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@slorber/static-site-generator-webpack-plugin": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.4.tgz", + "integrity": "sha512-FvMavoWEIePps6/JwGCOLYKCRhuwIHhMtmbKpBFgzNkxwpa/569LfTkrbRk1m1I3n+ezJK4on9E1A6cjuZmD9g==", + "dependencies": { + "bluebird": "^3.7.1", + "cheerio": "^0.22.0", + "eval": "^0.1.8", + "webpack-sources": "^1.4.3" + } + }, + "node_modules/@slorber/static-site-generator-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@slorber/static-site-generator-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", + "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", + "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", + "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", + "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", + "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", + "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", + "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", + "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz", + "integrity": "sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^6.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "^6.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "^6.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "^6.0.0", + "@svgr/babel-plugin-transform-svg-component": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz", + "integrity": "sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA==", + "dependencies": { + "@svgr/plugin-jsx": "^6.2.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz", + "integrity": "sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ==", + "dependencies": { + "@babel/types": "^7.15.6", + "entities": "^3.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz", + "integrity": "sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g==", + "dependencies": { + "@babel/core": "^7.15.5", + "@svgr/babel-preset": "^6.2.0", + "@svgr/hast-util-to-babel-ast": "^6.2.1", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz", + "integrity": "sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q==", + "dependencies": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/webpack": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.2.1.tgz", + "integrity": "sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw==", + "dependencies": { + "@babel/core": "^7.15.5", + "@babel/plugin-transform-react-constant-elements": "^7.14.5", + "@babel/preset-env": "^7.15.6", + "@babel/preset-react": "^7.14.5", + "@babel/preset-typescript": "^7.15.0", + "@svgr/core": "^6.2.1", + "@svgr/plugin-jsx": "^6.2.1", + "@svgr/plugin-svgo": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tsconfig/docusaurus": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.5.tgz", + "integrity": "sha512-KM/TuJa9fugo67dTGx+ktIqf3fVc077J6jwHu845Hex4EQf7LABlNonP/mohDKT0cmncdtlYVHHF74xR/YpThg==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", + "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + }, + "node_modules/@types/lodash": { + "version": "4.14.168", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", + "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", + "dev": true + }, + "node_modules/@types/mdast": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", + "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "17.0.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz", + "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "node_modules/@types/prettier": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", + "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/react": { + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz", + "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-helmet": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.5.tgz", + "integrity": "sha512-/ICuy7OHZxR0YCAZLNg9r7I9aijWUWvxaPR6uTuyxe8tAj5RL4Sw1+R6NhXUtOsarkGYPmaHdBDvuXh2DIN/uA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.13.tgz", + "integrity": "sha512-ZIuaO9Yrln54X6elg8q2Ivp6iK6p4syPsefEYAhRDAoqNh48C8VYUmB9RkXjKSQAJSJV0mbIFCX7I4vZDcHrjg==", + "dependencies": { + "@types/history": "*", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.6.tgz", + "integrity": "sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/react-router-config/node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, + "node_modules/@types/react-router-dom": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", + "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", + "dependencies": { + "@types/history": "*", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", + "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", + "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" + }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "devOptional": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/algoliasearch": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.13.1.tgz", + "integrity": "sha512-dtHUSE0caWTCE7liE1xaL+19AFf6kWEcyn76uhcitWpntqvicFHXKFoZe5JJcv9whQOTRM6+B8qJz6sFj+rDJA==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.13.1", + "@algolia/cache-common": "4.13.1", + "@algolia/cache-in-memory": "4.13.1", + "@algolia/client-account": "4.13.1", + "@algolia/client-analytics": "4.13.1", + "@algolia/client-common": "4.13.1", + "@algolia/client-personalization": "4.13.1", + "@algolia/client-search": "4.13.1", + "@algolia/logger-common": "4.13.1", + "@algolia/logger-console": "4.13.1", + "@algolia/requester-browser-xhr": "4.13.1", + "@algolia/requester-common": "4.13.1", + "@algolia/requester-node-http": "4.13.1", + "@algolia/transporter": "4.13.1" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.8.2.tgz", + "integrity": "sha512-AXxiF0zT9oYwl8ZBgU/eRXvfYhz7cBA5YrLPlw9inZHdaYF0QEya/f1Zp1mPYMXc1v6VkHwBq4pk6/vayBLICg==", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 5" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "devOptional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "node_modules/array-includes": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes/node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "dependencies": { + "follow-redirects": "^1.14.7" + } + }, + "node_modules/babel-loader": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@babel/core": "^7.11.6" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bonjour-service": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz", + "integrity": "sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw==", + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.4" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/boxen/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.12.2.tgz", + "integrity": "sha512-qt6ylCGpLjZ7AaODxbpyBZSs9fCI9SkL3Z9q2oxMBQhs/uyY+VD8jHA8ULCGmWQJlBgqvO3EJeAngOHD8zQCrQ==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", + "escalade": "^3.1.1", + "node-releases": "^2.0.3", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001346", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001346.tgz", + "integrity": "sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", + "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/entities": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", + "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/cheerio/node_modules/css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "engines": { + "node": "*" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/cheerio/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/cheerio/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chrome-trace-event/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + }, + "node_modules/clean-css": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", + "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.1.1", + "d": "^1.0.1", + "es5-ext": "^0.10.51", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.14", + "timers-ext": "^0.1.7" + } + }, + "node_modules/cli-color/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-table3": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", + "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colord": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", + "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==" + }, + "node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" + }, + "node_modules/combine-promises": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", + "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", + "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", + "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz", + "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.22.8", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz", + "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.22.8", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.8.tgz", + "integrity": "sha512-pQnwg4xtuvc2Bs/5zYQPaEYYSuTxsF7LBWF0SvnVhthZo/Qe+rJpcEekrdNK5DWwDJ0gv0oI9NNX5Mppdy0ctg==", + "dependencies": { + "browserslist": "^4.20.3", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-js-pure": { + "version": "3.22.8", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.8.tgz", + "integrity": "sha512-bOxbZIy9S5n4OVH63XaLVXZ49QKicjowDx/UELyJ68vxfCRpYsbyh/WNZNfEfAk+ekA8vSjt+gCDpvh672bc3w==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA==", + "dependencies": { + "cssnano": "^5.1.8", + "jest-worker": "^27.5.1", + "postcss": "^8.4.13", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.10.tgz", + "integrity": "sha512-ACpnRgDg4m6CZD/+8SgnLcGCgy6DDGdkMbOawwdvVxNietTNLe/MtWcenp6qT0PRt5wzhGl6/cjMWCdhKXC9QA==", + "dependencies": { + "cssnano-preset-default": "^5.2.10", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.6.tgz", + "integrity": "sha512-OZHsytu16eStRVrIY3wmPQqhJMaI0+O3raU4JHoKV3uuQYEeQek/FJVUIvYXD55hWR6OjCMyKYNRDw+k3/xgUw==", + "dependencies": { + "autoprefixer": "^10.3.7", + "cssnano-preset-default": "^5.2.10", + "postcss-discard-unused": "^5.1.0", + "postcss-merge-idents": "^5.1.1", + "postcss-reduce-idents": "^5.2.0", + "postcss-zindex": "^5.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.10.tgz", + "integrity": "sha512-H8TJRhTjBKVOPltp9vr9El9I+IfYsOMhmXdK0LwdvwJcxYX9oWkY7ctacWusgPWAgQq1vt/WO8v+uqpfLnM7QA==", + "dependencies": { + "css-declaration-sorter": "^6.2.2", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.2", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.5", + "postcss-merge-rules": "^5.1.2", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.3", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.0", + "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.1", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", + "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==" + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "devOptional": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "dependencies": { + "repeat-string": "^1.5.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/detect-port/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + }, + "node_modules/dns-packet": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", + "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "devOptional": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.144", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.144.tgz", + "integrity": "sha512-R3RV3rU1xWwFJlSClVWDvARaOk6VUO/FubHLodIASDB3Mc2dzuWvNdfOgH9bwHUTqT79u92qw60NWfwUdzAqdg==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "devOptional": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract/node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "devOptional": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-mdx": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-1.17.0.tgz", + "integrity": "sha512-O8+JRfwCzpoR2P6zUI1GDAAM/bsuzcoBS1ArvpQrgQO/E2Km0vBmM15ukiJxZ+YUh5d+qDlrqha0fZB50MojJQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.1", + "remark-mdx": "^1.6.22", + "remark-parse": "^8.0.3", + "remark-stringify": "^8.1.1", + "tslib": "^2.3.1", + "unified": "^9.2.2" + }, + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-mdx/node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "dev": true, + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-markdown": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-2.2.1.tgz", + "integrity": "sha512-FgWp4iyYvTFxPwfbxofTvXxgzPsDuSKHQy2S+a8Ve6savbujey+lgrFFbXQA0HPygISpRYWYBjooPzhYSF81iA==", + "dev": true, + "dependencies": { + "mdast-util-from-markdown": "^0.8.5" + }, + "engines": { + "node": "^8.10.0 || ^10.12.0 || >= 12.0.0" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-mdx": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-1.17.0.tgz", + "integrity": "sha512-Kicizy+fbfsB2UxTDXP92qTtFqITApu4v4DRQUfXMoPwBHeQRvZnaEtXu2S9aia51GYRYsMSqUvoPPih/5oB+g==", + "dev": true, + "dependencies": { + "eslint-mdx": "^1.17.0", + "eslint-plugin-markdown": "^2.2.1", + "synckit": "^0.4.1", + "tslib": "^2.3.1", + "vfile": "^4.2.1" + }, + "engines": { + "node": ">=10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", + "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.1", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "devOptional": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "devOptional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "devOptional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "devOptional": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "devOptional": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "devOptional": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "devOptional": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "devOptional": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "devOptional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "devOptional": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "devOptional": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", + "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/express": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "dependencies": { + "type": "^2.0.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "devOptional": true + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "dependencies": { + "fbjs": "^3.0.0" + } + }, + "node_modules/fbjs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", + "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.30" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "devOptional": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "devOptional": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "devOptional": true + }, + "node_modules/flux": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", + "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", + "dependencies": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.1" + }, + "peerDependencies": { + "react": "^15.0.2 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "devOptional": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/github-slugger": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", + "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-promise": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", + "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "dev": true, + "dependencies": { + "@types/glob": "*" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "glob": "*" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-minifier-terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/html-minifier-terser/node_modules/terser": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "dependencies": { + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-minifier-terser/node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/html-tags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/htmlparser2/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/htmlparser2/node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/htmlparser2/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/htmlparser2/node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", + "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "devOptional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.1.tgz", + "integrity": "sha512-VAwkvNSNGClRw9mDHhc5Efax8PLlsOGcUTh0T/LIriC8vPA3U5PdqXWqkz406MoYHMKW8Uf9gWr05T/rYB44kQ==", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/immer": { + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.14.tgz", + "integrity": "sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.39", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.39.tgz", + "integrity": "sha512-UyYiwD3nwHakGhuOUfpe3baJ8gkiPpRVx4a4sE/Ag+932+Y6swtLsdPoRR8ezhwqGnduzxmFkjumV9roz6QoLw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumeric": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", + "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joi": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", + "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-ref-parser": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", + "integrity": "sha512-uxU9Ix+MVszvCTvBucQiIcNEny3oAEFg7EQHSZw2bquCCuqUqEPEczIdv/Uqo1Zv4/wDPZqOI+ulrMk1ncMtjQ==", + "dev": true, + "dependencies": { + "@apidevtools/json-schema-ref-parser": "9.0.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/json-schema-to-typescript": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-10.1.5.tgz", + "integrity": "sha512-X8bNNksfCQo6LhEuqNxmZr4eZpPjXZajmimciuk8eWXzZlif9Brq7WuMGD/SOhBKcRKP2SGVDNZbC28WQqx9Rg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "@types/lodash": "^4.14.168", + "@types/prettier": "^2.1.5", + "cli-color": "^2.0.0", + "get-stdin": "^8.0.0", + "glob": "^7.1.6", + "glob-promise": "^3.4.0", + "is-glob": "^4.0.1", + "json-schema-ref-parser": "^9.0.6", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.20", + "minimist": "^1.2.5", + "mkdirp": "^1.0.4", + "mz": "^2.7.0", + "prettier": "^2.2.0" + }, + "bin": { + "json2ts": "dist/src/cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/json-schema-to-typescript/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "devOptional": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz", + "integrity": "sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "object.assign": "^4.1.2" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "devOptional": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "node_modules/loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" + }, + "node_modules/lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "devOptional": true + }, + "node_modules/lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "node_modules/lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "node_modules/lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + }, + "node_modules/lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "node_modules/lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "node_modules/lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" + }, + "node_modules/lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" + }, + "node_modules/lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "devOptional": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dev": true, + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "dependencies": { + "unist-util-remove": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-compact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", + "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", + "dev": true, + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz", + "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==", + "dependencies": { + "fs-monkey": "1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/memoizee/node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", + "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/mrmime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz", + "integrity": "sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "devOptional": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", + "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown/node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.5.2.tgz", - "integrity": "sha512-3MRYnYQFJyovANzSX2CToS6/5cfVjbLLqFsZTKcvF3abhQzxbqwwaMBlJtt620uBUOeMzhdfasKhCc40+RHiZw==", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "devOptional": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/entities": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", + "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "dependencies": { + "entities": "^4.3.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", + "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "dependencies": { + "browserslist": "^4.20.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-unused": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", + "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-loader": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.0.tgz", + "integrity": "sha512-IDyttebFzTSY6DI24KuHUcBjbAev1i+RyICoPEWcAstZsj03r533uMXtDn506l6/wlsRYiS5XBdx7TpccCsyUg==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.7" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-merge-idents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", + "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz", + "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", + "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", + "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "dependencies": { + "browserslist": "^4.16.6", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", + "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", + "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", + "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "dependencies": { + "browserslist": "^4.16.6", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", + "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", + "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", + "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz", + "integrity": "sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ==", + "dependencies": { + "sort-css-media-queries": "2.0.4" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/postcss-zindex": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", + "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/prebuild-webpack-plugin": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prebuild-webpack-plugin/-/prebuild-webpack-plugin-1.1.1.tgz", + "integrity": "sha512-H5/VnSl7KZm3NCGj1+8BrBHu0Bn9xzLREdpeE4TRYyp4t4qFnYPExzozk2sfD/CLJRGIuyOFrXbXgJJ4ETdz/g==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "glob": "^7.1.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "devOptional": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", + "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.3.tgz", + "integrity": "sha512-Viur/7tBTCH2HmYzwCHmt2rEFn+rdIWNIINXyg0StiISbDiIhHKhrFuEK8eMkKgvsIYSjgGqy/hNyucHp6FpoQ==", + "peerDependencies": { + "react": ">=0.14.9" + } + }, + "node_modules/prismjs": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "devOptional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" + }, + "node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-async": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/react-async/-/react-async-10.0.1.tgz", + "integrity": "sha512-ORUz5ca0B57QgBIzEZM5SuhJ6xFjkvEEs0gylLNlWf06vuVcLZsjIw3wx58jJkZG38p+0nUAxRgFW2b7mnVZzA==", + "peerDependencies": { + "react": ">=16.3.1" + } + }, + "node_modules/react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=", + "dependencies": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "node_modules/react-copy-to-clipboard": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.3.tgz", + "integrity": "sha512-9S3j+m+UxDZOM0Qb8mhnT/rMR0NGSrj9A/073yz2DSxPMYhmYFBMYIdI2X4o8AjOjyFsSNxDRnCX6s/gRxpriw==", + "dependencies": { + "copy-to-clipboard": "^3", + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, + "node_modules/react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "node_modules/react-helmet-async": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "dependencies": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + }, + "peerDependencies": { + "react": "^17.0.0 || ^16.3.0 || ^15.5.4", + "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" + } + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz", + "integrity": "sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.3", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-textarea-autosize": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", + "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", + "dependencies": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-toastify": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-7.0.4.tgz", + "integrity": "sha512-Rol7+Cn39hZp5hQ/k6CbMNE2CKYV9E5OQdC/hBLtIQU2xz7DdAm7xil4NITQTHR6zEbE5RVFbpgSwTD7xRGLeQ==", + "dependencies": { + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dependencies": { + "minimatch": "3.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "devOptional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" + }, + "node_modules/regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehype-parse": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", + "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", + "dependencies": { + "hast-util-from-parse5": "^5.0.0", + "parse5": "^5.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/hast-util-from-parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", + "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", + "dependencies": { + "ccount": "^1.0.3", + "hastscript": "^5.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.1.2", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/hastscript": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", + "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", + "dependencies": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-admonitions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", + "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", + "dependencies": { + "rehype-parse": "^6.0.2", + "unified": "^8.4.2", + "unist-util-visit": "^2.0.1" + } + }, + "node_modules/remark-admonitions/node_modules/unified": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", + "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "dependencies": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/remark-mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "dependencies": { + "mdast-squeeze-paragraphs": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", + "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", + "dev": true, + "dependencies": { + "ccount": "^1.0.0", + "is-alphanumeric": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "longest-streak": "^2.0.1", + "markdown-escapes": "^1.0.0", + "markdown-table": "^2.0.0", + "mdast-util-compact": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "stringify-entities": "^3.0.0", + "unherit": "^1.0.4", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rtl-detect": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", + "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" + }, + "node_modules/rtlcss": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", + "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", + "dependencies": { + "find-up": "^5.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.3.11", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + } + }, + "node_modules/rtlcss/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rtlcss/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rtlcss/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rtlcss/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "node_modules/selfsigned": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", + "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.0.4", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/sitemap": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", + "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "devOptional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz", + "integrity": "sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw==", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.0.1.tgz", + "integrity": "sha512-mC1Ps9l77/97qeOZc+HrOL7TIaOboHqMZ24dGVQrlxFcpPpfCHpH+qfUT7Dz+6mlG8+JPA1KfBQo19iC/+Ngcw==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-replace-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-replace-loader/-/string-replace-loader-3.1.0.tgz", + "integrity": "sha512-5AOMUZeX5HE/ylKDnEa/KKBqvlnFmRZudSOjVJHxhoJg9QYTwl1rECx7SLR8BBH7tfxb4Rp7EM2XVfQFxIhsbQ==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "peerDependencies": { + "webpack": "^5" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.matchall/node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend/node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart/node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", + "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", + "dev": true, + "dependencies": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylehacks": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", + "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "dependencies": { + "browserslist": "^4.16.6", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/synckit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.4.1.tgz", + "integrity": "sha512-ngUh0+s+DOqEc0sGnrLaeNjbXp0CWHjSGFBqPlQmQ+oN/OfoDoYDBXPh+b4qs1M5QTk5nuQ3AmVz9+2xiY/ldw==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "devOptional": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "devOptional": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "devOptional": true + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", + "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.7", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.7.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/tiny-invariant": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", + "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "devOptional": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive/node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/use-composed-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "devOptional": true + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/wait-on": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", + "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", + "dependencies": { + "axios": "^0.25.0", + "joi": "^17.6.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.5.4" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/web-tree-sitter": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.19.4.tgz", + "integrity": "sha512-8G0xBj05hqZybCqBtW7RPZ/hWEtP3DiLTauQzGJZuZYfVRgw7qj7iaZ+8djNqJ4VPrdOO+pS2dR1JsTbsLxdYg==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/webpack": { + "version": "5.72.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", + "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", + "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", + "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", + "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + }, + "dependencies": { + "@algolia/autocomplete-core": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.6.3.tgz", + "integrity": "sha512-dqQqRt01fX3YuVFrkceHsoCnzX0bLhrrg8itJI1NM68KjrPYQPYsE+kY8EZTCM4y8VDnhqJErR73xe/ZsV+qAA==", "requires": { - "@algolia/autocomplete-shared": "1.5.2" + "@algolia/autocomplete-shared": "1.6.3" } }, "@algolia/autocomplete-shared": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.5.2.tgz", - "integrity": "sha512-ylQAYv5H0YKMfHgVWX0j0NmL8XBcAeeeVQUmppnnMtzDbDnca6CzhKj3Q8eF9cHCgcdTDdb5K+3aKyGWA0obug==" + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.6.3.tgz", + "integrity": "sha512-UV46bnkTztyADFaETfzFC5ryIdGVb2zpAoYgu0tfcuYWjhg1KbLXveFffZIrGVoboqmAk1b+jMrl6iCja1i3lg==" }, "@algolia/cache-browser-local-storage": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.0.tgz", - "integrity": "sha512-nj1vHRZauTqP/bluwkRIgEADEimqojJgoTRCel5f6q8WCa9Y8QeI4bpDQP28FoeKnDRYa3J5CauDlN466jqRhg==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.1.tgz", + "integrity": "sha512-UAUVG2PEfwd/FfudsZtYnidJ9eSCpS+LW9cQiesePQLz41NAcddKxBak6eP2GErqyFagSlnVXe/w2E9h2m2ttg==", "requires": { - "@algolia/cache-common": "4.13.0" + "@algolia/cache-common": "4.13.1" } }, "@algolia/cache-common": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.13.0.tgz", - "integrity": "sha512-f9mdZjskCui/dA/fA/5a+6hZ7xnHaaZI5tM/Rw9X8rRB39SUlF/+o3P47onZ33n/AwkpSbi5QOyhs16wHd55kA==" + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.13.1.tgz", + "integrity": "sha512-7Vaf6IM4L0Jkl3sYXbwK+2beQOgVJ0mKFbz/4qSxKd1iy2Sp77uTAazcX+Dlexekg1fqGUOSO7HS4Sx47ZJmjA==" }, "@algolia/cache-in-memory": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.13.0.tgz", - "integrity": "sha512-hHdc+ahPiMM92CQMljmObE75laYzNFYLrNOu0Q3/eyvubZZRtY2SUsEEgyUEyzXruNdzrkcDxFYa7YpWBJYHAg==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.13.1.tgz", + "integrity": "sha512-pZzybCDGApfA/nutsFK1P0Sbsq6fYJU3DwIvyKg4pURerlJM4qZbB9bfLRef0FkzfQu7W11E4cVLCIOWmyZeuQ==", "requires": { - "@algolia/cache-common": "4.13.0" + "@algolia/cache-common": "4.13.1" } }, "@algolia/client-account": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.13.0.tgz", - "integrity": "sha512-FzFqFt9b0g/LKszBDoEsW+dVBuUe1K3scp2Yf7q6pgHWM1WqyqUlARwVpLxqyc+LoyJkTxQftOKjyFUqddnPKA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.13.1.tgz", + "integrity": "sha512-TFLiZ1KqMiir3FNHU+h3b0MArmyaHG+eT8Iojio6TdpeFcAQ1Aiy+2gb3SZk3+pgRJa/BxGmDkRUwE5E/lv3QQ==", "requires": { - "@algolia/client-common": "4.13.0", - "@algolia/client-search": "4.13.0", - "@algolia/transporter": "4.13.0" + "@algolia/client-common": "4.13.1", + "@algolia/client-search": "4.13.1", + "@algolia/transporter": "4.13.1" } }, "@algolia/client-analytics": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.13.0.tgz", - "integrity": "sha512-klmnoq2FIiiMHImkzOm+cGxqRLLu9CMHqFhbgSy9wtXZrqb8BBUIUE2VyBe7azzv1wKcxZV2RUyNOMpFqmnRZA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.13.1.tgz", + "integrity": "sha512-iOS1JBqh7xaL5x00M5zyluZ9+9Uy9GqtYHv/2SMuzNW1qP7/0doz1lbcsP3S7KBbZANJTFHUOfuqyRLPk91iFA==", "requires": { - "@algolia/client-common": "4.13.0", - "@algolia/client-search": "4.13.0", - "@algolia/requester-common": "4.13.0", - "@algolia/transporter": "4.13.0" + "@algolia/client-common": "4.13.1", + "@algolia/client-search": "4.13.1", + "@algolia/requester-common": "4.13.1", + "@algolia/transporter": "4.13.1" } }, "@algolia/client-common": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.13.0.tgz", - "integrity": "sha512-GoXfTp0kVcbgfSXOjfrxx+slSipMqGO9WnNWgeMmru5Ra09MDjrcdunsiiuzF0wua6INbIpBQFTC2Mi5lUNqGA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.13.1.tgz", + "integrity": "sha512-LcDoUE0Zz3YwfXJL6lJ2OMY2soClbjrrAKB6auYVMNJcoKZZ2cbhQoFR24AYoxnGUYBER/8B+9sTBj5bj/Gqbg==", "requires": { - "@algolia/requester-common": "4.13.0", - "@algolia/transporter": "4.13.0" + "@algolia/requester-common": "4.13.1", + "@algolia/transporter": "4.13.1" } }, "@algolia/client-personalization": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.13.0.tgz", - "integrity": "sha512-KneLz2WaehJmNfdr5yt2HQETpLaCYagRdWwIwkTqRVFCv4DxRQ2ChPVW9jeTj4YfAAhfzE6F8hn7wkQ/Jfj6ZA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.13.1.tgz", + "integrity": "sha512-1CqrOW1ypVrB4Lssh02hP//YxluoIYXAQCpg03L+/RiXJlCs+uIqlzC0ctpQPmxSlTK6h07kr50JQoYH/TIM9w==", "requires": { - "@algolia/client-common": "4.13.0", - "@algolia/requester-common": "4.13.0", - "@algolia/transporter": "4.13.0" + "@algolia/client-common": "4.13.1", + "@algolia/requester-common": "4.13.1", + "@algolia/transporter": "4.13.1" } }, "@algolia/client-search": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.13.0.tgz", - "integrity": "sha512-blgCKYbZh1NgJWzeGf+caKE32mo3j54NprOf0LZVCubQb3Kx37tk1Hc8SDs9bCAE8hUvf3cazMPIg7wscSxspA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.13.1.tgz", + "integrity": "sha512-YQKYA83MNRz3FgTNM+4eRYbSmHi0WWpo019s5SeYcL3HUan/i5R09VO9dk3evELDFJYciiydSjbsmhBzbpPP2A==", "requires": { - "@algolia/client-common": "4.13.0", - "@algolia/requester-common": "4.13.0", - "@algolia/transporter": "4.13.0" + "@algolia/client-common": "4.13.1", + "@algolia/requester-common": "4.13.1", + "@algolia/transporter": "4.13.1" } }, "@algolia/events": { @@ -102,47 +15121,47 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "@algolia/logger-common": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.13.0.tgz", - "integrity": "sha512-8yqXk7rMtmQJ9wZiHOt/6d4/JDEg5VCk83gJ39I+X/pwUPzIsbKy9QiK4uJ3aJELKyoIiDT1hpYVt+5ia+94IA==" + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.13.1.tgz", + "integrity": "sha512-L6slbL/OyZaAXNtS/1A8SAbOJeEXD5JcZeDCPYDqSTYScfHu+2ePRTDMgUTY4gQ7HsYZ39N1LujOd8WBTmM2Aw==" }, "@algolia/logger-console": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.13.0.tgz", - "integrity": "sha512-YepRg7w2/87L0vSXRfMND6VJ5d6699sFJBRWzZPOlek2p5fLxxK7O0VncYuc/IbVHEgeApvgXx0WgCEa38GVuQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.13.1.tgz", + "integrity": "sha512-7jQOTftfeeLlnb3YqF8bNgA2GZht7rdKkJ31OCeSH2/61haO0tWPoNRjZq9XLlgMQZH276pPo0NdiArcYPHjCA==", "requires": { - "@algolia/logger-common": "4.13.0" + "@algolia/logger-common": "4.13.1" } }, "@algolia/requester-browser-xhr": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.0.tgz", - "integrity": "sha512-Dj+bnoWR5MotrnjblzGKZ2kCdQi2cK/VzPURPnE616NU/il7Ypy6U6DLGZ/ZYz+tnwPa0yypNf21uqt84fOgrg==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.1.tgz", + "integrity": "sha512-oa0CKr1iH6Nc7CmU6RE7TnXMjHnlyp7S80pP/LvZVABeJHX3p/BcSCKovNYWWltgTxUg0U1o+2uuy8BpMKljwA==", "requires": { - "@algolia/requester-common": "4.13.0" + "@algolia/requester-common": "4.13.1" } }, "@algolia/requester-common": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.13.0.tgz", - "integrity": "sha512-BRTDj53ecK+gn7ugukDWOOcBRul59C4NblCHqj4Zm5msd5UnHFjd/sGX+RLOEoFMhetILAnmg6wMrRrQVac9vw==" + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.13.1.tgz", + "integrity": "sha512-eGVf0ID84apfFEuXsaoSgIxbU3oFsIbz4XiotU3VS8qGCJAaLVUC5BUJEkiFENZIhon7hIB4d0RI13HY4RSA+w==" }, "@algolia/requester-node-http": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.13.0.tgz", - "integrity": "sha512-9b+3O4QFU4azLhGMrZAr/uZPydvzOR4aEZfSL8ZrpLZ7fbbqTO0S/5EVko+QIgglRAtVwxvf8UJ1wzTD2jvKxQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.13.1.tgz", + "integrity": "sha512-7C0skwtLdCz5heKTVe/vjvrqgL/eJxmiEjHqXdtypcE5GCQCYI15cb+wC4ytYioZDMiuDGeVYmCYImPoEgUGPw==", "requires": { - "@algolia/requester-common": "4.13.0" + "@algolia/requester-common": "4.13.1" } }, "@algolia/transporter": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.13.0.tgz", - "integrity": "sha512-8tSQYE+ykQENAdeZdofvtkOr5uJ9VcQSWgRhQ9h01AehtBIPAczk/b2CLrMsw5yQZziLs5cZ3pJ3478yI+urhA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.13.1.tgz", + "integrity": "sha512-pICnNQN7TtrcYJqqPEXByV8rJ8ZRU2hCiIKLTLRyNpghtQG3VAFk6fVtdzlNfdUGZcehSKGarPIZEHlQXnKjgw==", "requires": { - "@algolia/cache-common": "4.13.0", - "@algolia/logger-common": "4.13.0", - "@algolia/requester-common": "4.13.0" + "@algolia/cache-common": "4.13.1", + "@algolia/logger-common": "4.13.1", + "@algolia/requester-common": "4.13.1" } }, "@ampproject/remapping": { @@ -186,174 +15205,40 @@ } }, "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.16.7" } }, "@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==" + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", + "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==" }, "@babel/core": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", - "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", + "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.2", + "@babel/parser": "^7.18.0", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", + "json5": "^2.2.1", "semver": "^6.3.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -362,29 +15247,13 @@ } }, "@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", "requires": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" } }, "@babel/helper-annotate-as-pure": { @@ -393,22 +15262,6 @@ "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "requires": { "@babel/types": "^7.16.7" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-builder-binary-assignment-operator-visitor": { @@ -418,50 +15271,19 @@ "requires": { "@babel/helper-explode-assignable-expression": "^7.16.7", "@babel/types": "^7.16.7" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", "requires": { - "@babel/compat-data": "^7.17.7", + "@babel/compat-data": "^7.17.10", "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", + "browserslist": "^4.20.2", "semver": "^6.3.0" }, "dependencies": { - "caniuse-lite": { - "version": "1.0.30001325", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", - "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" - }, - "electron-to-chromium": { - "version": "1.4.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", - "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -470,146 +15292,23 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", - "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", + "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", "@babel/helper-optimise-call-expression": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", + "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "regexpu-core": "^5.0.1" @@ -630,33 +15329,11 @@ "semver": "^6.1.2" }, "dependencies": { - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, "@babel/helper-plugin-utils": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -665,28 +15342,9 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "requires": { - "@babel/types": "^7.16.7" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - } - } + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==" }, "@babel/helper-explode-assignable-expression": { "version": "7.16.7", @@ -694,136 +15352,15 @@ "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", "requires": { "@babel/types": "^7.16.7" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", "requires": { - "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - } - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "requires": { - "@babel/types": "^7.16.7" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.17.0" } }, "@babel/helper-hoist-variables": { @@ -832,62 +15369,45 @@ "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "requires": { "@babel/types": "^7.16.7" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.17.0" } }, "@babel/helper-module-imports": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", - "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.16.7" } }, "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.16.7" } }, "@babel/helper-plugin-utils": { @@ -903,41 +15423,26 @@ "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-wrap-function": "^7.16.8", "@babel/types": "^7.16.8" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-replace-supers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", - "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz", + "integrity": "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" } }, "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.18.2" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -946,36 +15451,20 @@ "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "requires": { "@babel/types": "^7.16.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/helper-validator-option": { "version": "7.16.7", @@ -991,234 +15480,24 @@ "@babel/template": "^7.16.7", "@babel/traverse": "^7.16.8", "@babel/types": "^7.16.8" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - } } }, "@babel/helpers": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", - "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - } + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" } }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", + "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -1262,89 +15541,89 @@ } }, "@babel/parser": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", - "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==" + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", + "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", + "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" + "@babel/plugin-proposal-optional-chaining": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", + "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", + "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", + "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, @@ -1365,66 +15644,66 @@ } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", + "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", + "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", + "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", + "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, @@ -1471,69 +15750,69 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", + "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", + "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", + "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", + "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, @@ -1569,9 +15848,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, @@ -1591,6 +15870,21 @@ "@babel/helper-plugin-utils": "^7.8.3" } }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", + "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" + } + } + }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -1664,9 +15958,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, @@ -1686,71 +15980,49 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", + "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", + "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", + "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", "requires": { "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-remap-async-to-generator": "^7.16.8" }, "dependencies": { - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, @@ -1770,190 +16042,69 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz", + "integrity": "sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz", + "integrity": "sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-replace-supers": "^7.18.2", "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "requires": { - "@babel/types": "^7.16.7" - } - }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - }, - "@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", + "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", + "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, @@ -1974,17 +16125,17 @@ } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", + "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, @@ -2005,17 +16156,17 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", + "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, @@ -2037,17 +16188,17 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", + "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, @@ -2067,655 +16218,103 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", + "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "babel-plugin-dynamic-import-node": "^2.3.3" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - }, - "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz", - "integrity": "sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", + "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", "requires": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-simple-access": "^7.18.2", "babel-plugin-dynamic-import-node": "^2.3.3" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - }, - "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz", + "integrity": "sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg==", "requires": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - }, - "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", + "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - }, - "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", - "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", + "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" + } + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", + "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, @@ -2728,146 +16327,25 @@ "@babel/helper-replace-supers": "^7.16.7" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "requires": { - "@babel/types": "^7.16.7" - } - }, "@babel/helper-plugin-utils": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - }, - "@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" } } }, "@babel/plugin-transform-parameters": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz", - "integrity": "sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", + "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, @@ -2917,50 +16395,28 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", - "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", + "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-jsx": "^7.17.12", + "@babel/types": "^7.17.12" }, "dependencies": { - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" }, "@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", - "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", + "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-plugin-utils": "^7.17.12" } } } @@ -2990,67 +16446,53 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", - "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", + "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12", + "regenerator-transform": "^0.15.0" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" + } + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", + "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-transform-runtime": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz", - "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz", + "integrity": "sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg==", "requires": { "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", "semver": "^6.3.0" }, "dependencies": { - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" }, "semver": { "version": "6.3.0", @@ -3075,18 +16517,18 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", + "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, @@ -3106,49 +16548,49 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", + "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", + "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/plugin-transform-typescript": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", - "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz", + "integrity": "sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-typescript": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-typescript": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, @@ -3184,36 +16626,37 @@ } }, "@babel/preset-env": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", - "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", + "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", "requires": { - "@babel/compat-data": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-async-generator-functions": "^7.17.12", + "@babel/plugin-proposal-class-properties": "^7.17.12", + "@babel/plugin-proposal-class-static-block": "^7.18.0", "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.17.12", + "@babel/plugin-proposal-json-strings": "^7.17.12", + "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.18.0", "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-private-methods": "^7.17.12", + "@babel/plugin-proposal-private-property-in-object": "^7.17.12", + "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.17.12", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -3223,84 +16666,62 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-arrow-functions": "^7.17.12", + "@babel/plugin-transform-async-to-generator": "^7.17.12", "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.17.12", + "@babel/plugin-transform-classes": "^7.17.12", + "@babel/plugin-transform-computed-properties": "^7.17.12", + "@babel/plugin-transform-destructuring": "^7.18.0", "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.17.12", "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.18.1", "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-literals": "^7.17.12", "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-modules-systemjs": "^7.16.7", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", - "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.18.0", + "@babel/plugin-transform-modules-commonjs": "^7.18.2", + "@babel/plugin-transform-modules-systemjs": "^7.18.0", + "@babel/plugin-transform-modules-umd": "^7.18.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", + "@babel/plugin-transform-new-target": "^7.17.12", "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.17.12", "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.16.7", - "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.18.0", + "@babel/plugin-transform-reserved-words": "^7.17.12", "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-spread": "^7.17.12", "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.18.2", + "@babel/plugin-transform-typeof-symbol": "^7.17.12", "@babel/plugin-transform-unicode-escapes": "^7.16.7", "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.8", + "@babel/types": "^7.18.2", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.20.2", + "core-js-compat": "^3.22.1", "semver": "^6.3.0" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", + "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", "requires": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" + "@babel/plugin-transform-parameters": "^7.17.12" } }, "semver": { @@ -3323,830 +16744,254 @@ } }, "@babel/preset-react": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", - "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz", + "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.17.12", "@babel/plugin-transform-react-jsx-development": "^7.16.7", "@babel/plugin-transform-react-pure-annotations": "^7.16.7" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/preset-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", - "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz", + "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.7" + "@babel/plugin-transform-typescript": "^7.17.12" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" } } }, "@babel/runtime": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", - "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", + "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz", - "integrity": "sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.3.tgz", + "integrity": "sha512-l4ddFwrc9rnR+EJsHsh+TJ4A35YqQz/UqcjtlX2ov53hlJYG5CxtQmNZxyajwDVmCxwy++rtvGU5HazCK4W41Q==", "requires": { "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==" - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - } + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", + "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.2", "debug": "^4.1.0", "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", - "requires": { - "@babel/types": "^7.14.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "requires": { - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "requires": { - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==" - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==" - }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - } } }, "@babel/types": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", - "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.0", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==" - } } }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true + }, "@docsearch/css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.0.0.tgz", - "integrity": "sha512-1kkV7tkAsiuEd0shunYRByKJe3xQDG2q7wYg24SOw1nV9/2lwEd4WrUYRJC/ukGTl2/kHeFxsaUvtiOy0y6fFA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.1.0.tgz", + "integrity": "sha512-bh5IskwkkodbvC0FzSg1AxMykfDl95hebEKwxNoq4e5QaGzOXSBgW8+jnMFZ7JU4sTBiB04vZWoUSzNrPboLZA==" }, "@docsearch/react": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.0.0.tgz", - "integrity": "sha512-yhMacqS6TVQYoBh/o603zszIb5Bl8MIXuOc6Vy617I74pirisDzzcNh0NEaYQt50fVVR3khUbeEhUEWEWipESg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.1.0.tgz", + "integrity": "sha512-bjB6ExnZzf++5B7Tfoi6UXgNwoUnNOfZ1NyvnvPhWgCMy5V/biAtLL4o7owmZSYdAKeFSvZ5Lxm0is4su/dBWg==", "requires": { - "@algolia/autocomplete-core": "1.5.2", - "@algolia/autocomplete-preset-algolia": "1.5.2", - "@docsearch/css": "3.0.0", + "@algolia/autocomplete-core": "1.6.3", + "@docsearch/css": "3.1.0", "algoliasearch": "^4.0.0" } }, "@docusaurus/core": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-beta.18.tgz", - "integrity": "sha512-puV7l+0/BPSi07Xmr8tVktfs1BzhC8P5pm6Bs2CfvysCJ4nefNCD1CosPc1PGBWy901KqeeEJ1aoGwj9tU3AUA==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-beta.21.tgz", + "integrity": "sha512-qysDMVp1M5UozK3u/qOxsEZsHF7jeBvJDS+5ItMPYmNKvMbNKeYZGA0g6S7F9hRDwjIlEbvo7BaX0UMDcmTAWA==", "requires": { - "@babel/core": "^7.17.8", - "@babel/generator": "^7.17.7", + "@babel/core": "^7.18.2", + "@babel/generator": "^7.18.2", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.17.0", - "@babel/preset-env": "^7.16.11", - "@babel/preset-react": "^7.16.7", - "@babel/preset-typescript": "^7.16.7", - "@babel/runtime": "^7.17.8", - "@babel/runtime-corejs3": "^7.17.8", - "@babel/traverse": "^7.17.3", - "@docusaurus/cssnano-preset": "2.0.0-beta.18", - "@docusaurus/logger": "2.0.0-beta.18", - "@docusaurus/mdx-loader": "2.0.0-beta.18", + "@babel/plugin-transform-runtime": "^7.18.2", + "@babel/preset-env": "^7.18.2", + "@babel/preset-react": "^7.17.12", + "@babel/preset-typescript": "^7.17.12", + "@babel/runtime": "^7.18.3", + "@babel/runtime-corejs3": "^7.18.3", + "@babel/traverse": "^7.18.2", + "@docusaurus/cssnano-preset": "2.0.0-beta.21", + "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/mdx-loader": "2.0.0-beta.21", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.0.0-beta.18", - "@docusaurus/utils-common": "2.0.0-beta.18", - "@docusaurus/utils-validation": "2.0.0-beta.18", + "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/utils-common": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", "@slorber/static-site-generator-webpack-plugin": "^4.0.4", "@svgr/webpack": "^6.2.1", - "autoprefixer": "^10.4.4", - "babel-loader": "^8.2.4", - "babel-plugin-dynamic-import-node": "2.3.0", + "autoprefixer": "^10.4.7", + "babel-loader": "^8.2.5", + "babel-plugin-dynamic-import-node": "^2.3.3", "boxen": "^6.2.1", + "chalk": "^4.1.2", "chokidar": "^3.5.3", - "clean-css": "^5.2.4", - "cli-table3": "^0.6.1", + "clean-css": "^5.3.0", + "cli-table3": "^0.6.2", "combine-promises": "^1.1.0", "commander": "^5.1.0", - "copy-webpack-plugin": "^10.2.4", - "core-js": "^3.21.1", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.22.7", "css-loader": "^6.7.1", - "css-minimizer-webpack-plugin": "^3.4.1", - "cssnano": "^5.1.5", - "del": "^6.0.0", + "css-minimizer-webpack-plugin": "^4.0.0", + "cssnano": "^5.1.9", + "del": "^6.1.1", "detect-port": "^1.3.0", "escape-html": "^1.0.3", "eta": "^1.12.3", "file-loader": "^6.2.0", - "fs-extra": "^10.0.1", + "fs-extra": "^10.1.0", "html-minifier-terser": "^6.1.0", - "html-tags": "^3.1.0", + "html-tags": "^3.2.0", "html-webpack-plugin": "^5.5.0", "import-fresh": "^3.3.0", - "is-root": "^2.1.0", "leven": "^3.1.0", "lodash": "^4.17.21", "mini-css-extract-plugin": "^2.6.0", - "nprogress": "^0.2.0", - "postcss": "^8.4.12", - "postcss-loader": "^6.2.1", + "postcss": "^8.4.14", + "postcss-loader": "^7.0.0", "prompts": "^2.4.2", - "react-dev-utils": "^12.0.0", - "react-helmet-async": "^1.2.3", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.2.0", + "react-router": "^5.3.3", "react-router-config": "^5.1.1", - "react-router-dom": "^5.2.0", + "react-router-dom": "^5.3.3", "remark-admonitions": "^1.2.1", "rtl-detect": "^1.0.4", - "semver": "^7.3.5", + "semver": "^7.3.7", "serve-handler": "^6.1.3", "shelljs": "^0.8.5", "terser-webpack-plugin": "^5.3.1", - "tslib": "^2.3.1", + "tslib": "^2.4.0", "update-notifier": "^5.1.0", "url-loader": "^4.1.1", "wait-on": "^6.0.1", - "webpack": "^5.70.0", + "webpack": "^5.72.1", "webpack-bundle-analyzer": "^4.5.0", - "webpack-dev-server": "^4.7.4", + "webpack-dev-server": "^4.9.0", "webpack-merge": "^5.8.0", "webpackbar": "^5.0.2" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", - "requires": { - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - } - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "webpack": { - "version": "5.71.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", - "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" + "lru-cache": "^6.0.0" } } } }, "@docusaurus/cssnano-preset": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.18.tgz", - "integrity": "sha512-VxhYmpyx16Wv00W9TUfLVv0NgEK/BwP7pOdWoaiELEIAMV7SO1+6iB8gsFUhtfKZ31I4uPVLMKrCyWWakoFeFA==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.21.tgz", + "integrity": "sha512-fhTZrg1vc6zYYZIIMXpe1TnEVGEjqscBo0s1uomSwKjjtMgu7wkzc1KKJYY7BndsSA+fVVkZ+OmL/kAsmK7xxw==", "requires": { - "cssnano-preset-advanced": "^5.3.1", - "postcss": "^8.4.12", - "postcss-sort-media-queries": "^4.2.1" + "cssnano-preset-advanced": "^5.3.5", + "postcss": "^8.4.14", + "postcss-sort-media-queries": "^4.2.1", + "tslib": "^2.4.0" } }, "@docusaurus/logger": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.0-beta.18.tgz", - "integrity": "sha512-frNe5vhH3mbPmH980Lvzaz45+n1PQl3TkslzWYXQeJOkFX17zUd3e3U7F9kR1+DocmAqHkgAoWuXVcvEoN29fg==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.0-beta.21.tgz", + "integrity": "sha512-HTFp8FsSMrAj7Uxl5p72U+P7rjYU/LRRBazEoJbs9RaqoKEdtZuhv8MYPOCh46K9TekaoquRYqag2o23Qt4ggA==", "requires": { "chalk": "^4.1.2", - "tslib": "^2.3.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } + "tslib": "^2.4.0" } }, "@docusaurus/mdx-loader": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.18.tgz", - "integrity": "sha512-pOmAQM4Y1jhuZTbEhjh4ilQa74Mh6Q0pMZn1xgIuyYDdqvIOrOlM/H0i34YBn3+WYuwsGim4/X0qynJMLDUA4A==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.21.tgz", + "integrity": "sha512-AI+4obJnpOaBOAYV6df2ux5Y1YJCBS+MhXFf0yhED12sVLJi2vffZgdamYd/d/FwvWDw6QLs/VD2jebd7P50yQ==", "requires": { - "@babel/parser": "^7.17.8", - "@babel/traverse": "^7.17.3", - "@docusaurus/logger": "2.0.0-beta.18", - "@docusaurus/utils": "2.0.0-beta.18", + "@babel/parser": "^7.18.3", + "@babel/traverse": "^7.18.2", + "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", - "fs-extra": "^10.0.1", + "fs-extra": "^10.1.0", "image-size": "^1.0.1", "mdast-util-to-string": "^2.0.0", - "remark-emoji": "^2.1.0", + "remark-emoji": "^2.2.0", "stringify-object": "^3.3.0", - "tslib": "^2.3.1", - "unist-util-visit": "^2.0.2", + "tslib": "^2.4.0", + "unist-util-visit": "^2.0.3", "url-loader": "^4.1.1", - "webpack": "^5.70.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "webpack": { - "version": "5.71.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", - "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - } - } + "webpack": "^5.72.1" } }, "@docusaurus/module-type-aliases": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.18.tgz", - "integrity": "sha512-e6mples8FZRyT7QyqidGS6BgkROjM+gljJsdOqoctbtBp+SZ5YDjwRHOmoY7eqEfsQNOaFZvT2hK38ui87hCRA==", - "dev": true, + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.21.tgz", + "integrity": "sha512-gRkWICgQZiqSJgrwRKWjXm5gAB+9IcfYdUbCG0PRPP/G8sNs9zBIOY4uT4Z5ox2CWFEm44U3RTTxj7BiLVMBXw==", "requires": { - "@docusaurus/types": "2.0.0-beta.18", + "@docusaurus/types": "2.0.0-beta.21", "@types/react": "*", "@types/react-router-config": "*", "@types/react-router-dom": "*", @@ -4154,331 +16999,196 @@ } }, "@docusaurus/plugin-content-blog": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.18.tgz", - "integrity": "sha512-qzK83DgB+mxklk3PQC2nuTGPQD/8ogw1nXSmaQpyXAyhzcz4CXAZ9Swl/Ee9A/bvPwQGnSHSP3xqIYl8OkFtfw==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.21.tgz", + "integrity": "sha512-IP21yJViP3oBmgsWBU5LhrG1MZXV4mYCQSoCAboimESmy1Z11RCNP2tXaqizE3iTmXOwZZL+SNBk06ajKCEzWg==", "requires": { - "@docusaurus/core": "2.0.0-beta.18", - "@docusaurus/logger": "2.0.0-beta.18", - "@docusaurus/mdx-loader": "2.0.0-beta.18", - "@docusaurus/utils": "2.0.0-beta.18", - "@docusaurus/utils-common": "2.0.0-beta.18", - "@docusaurus/utils-validation": "2.0.0-beta.18", - "cheerio": "^1.0.0-rc.10", + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/mdx-loader": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/utils-common": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", + "cheerio": "^1.0.0-rc.11", "feed": "^4.2.2", - "fs-extra": "^10.0.1", + "fs-extra": "^10.1.0", "lodash": "^4.17.21", "reading-time": "^1.5.0", "remark-admonitions": "^1.2.1", - "tslib": "^2.3.1", + "tslib": "^2.4.0", + "unist-util-visit": "^2.0.3", "utility-types": "^3.10.0", - "webpack": "^5.70.0" + "webpack": "^5.72.1" }, "dependencies": { - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" - }, "cheerio": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz", + "integrity": "sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==", "requires": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "tslib": "^2.4.0" } }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "entities": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", + "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==" + }, "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" } }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "webpack": { - "version": "5.71.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", - "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", + "parse5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" + "entities": "^4.3.0" } } } }, "@docusaurus/plugin-content-docs": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.18.tgz", - "integrity": "sha512-z4LFGBJuzn4XQiUA7OEA2SZTqlp+IYVjd3NrCk/ZUfNi1tsTJS36ATkk9Y6d0Nsp7K2kRXqaXPsz4adDgeIU+Q==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.21.tgz", + "integrity": "sha512-aa4vrzJy4xRy81wNskyhE3wzRf3AgcESZ1nfKh8xgHUkT7fDTZ1UWlg50Jb3LBCQFFyQG2XQB9N6llskI/KUnw==", "requires": { - "@docusaurus/core": "2.0.0-beta.18", - "@docusaurus/logger": "2.0.0-beta.18", - "@docusaurus/mdx-loader": "2.0.0-beta.18", - "@docusaurus/utils": "2.0.0-beta.18", - "@docusaurus/utils-validation": "2.0.0-beta.18", + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/mdx-loader": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", "combine-promises": "^1.1.0", - "fs-extra": "^10.0.1", + "fs-extra": "^10.1.0", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "remark-admonitions": "^1.2.1", - "tslib": "^2.3.1", + "tslib": "^2.4.0", "utility-types": "^3.10.0", - "webpack": "^5.70.0" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "webpack": { - "version": "5.71.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", - "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - } - } + "webpack": "^5.72.1" } }, "@docusaurus/plugin-content-pages": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.18.tgz", - "integrity": "sha512-CJ2Xeb9hQrMeF4DGywSDVX2TFKsQpc8ZA7czyeBAAbSFsoRyxXPYeSh8aWljqR4F1u/EKGSKy0Shk/D4wumaHw==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.21.tgz", + "integrity": "sha512-DmXOXjqNI+7X5hISzCvt54QIK6XBugu2MOxjxzuqI7q92Lk/EVdraEj5mthlH8IaEH/VlpWYJ1O9TzLqX5vH2g==", "requires": { - "@docusaurus/core": "2.0.0-beta.18", - "@docusaurus/mdx-loader": "2.0.0-beta.18", - "@docusaurus/utils": "2.0.0-beta.18", - "@docusaurus/utils-validation": "2.0.0-beta.18", - "fs-extra": "^10.0.1", + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/mdx-loader": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", + "fs-extra": "^10.1.0", "remark-admonitions": "^1.2.1", - "tslib": "^2.3.1", - "webpack": "^5.70.0" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "webpack": { - "version": "5.71.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", - "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - } - } + "tslib": "^2.4.0", + "webpack": "^5.72.1" } }, "@docusaurus/plugin-debug": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.18.tgz", - "integrity": "sha512-inLnLERgG7q0WlVmK6nYGHwVqREz13ivkynmNygEibJZToFRdgnIPW+OwD8QzgC5MpQTJw7+uYjcitpBumy1Gw==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.21.tgz", + "integrity": "sha512-P54J4q4ecsyWW0Jy4zbimSIHna999AfbxpXGmF1IjyHrjoA3PtuakV1Ai51XrGEAaIq9q6qMQkEhbUd3CffGAw==", "requires": { - "@docusaurus/core": "2.0.0-beta.18", - "@docusaurus/utils": "2.0.0-beta.18", - "fs-extra": "^10.0.1", + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } + "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-analytics": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.18.tgz", - "integrity": "sha512-s9dRBWDrZ1uu3wFXPCF7yVLo/+5LUFAeoxpXxzory8gn9GYDt8ZDj80h5DUyCLxiy72OG6bXWNOYS/Vc6cOPXQ==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.21.tgz", + "integrity": "sha512-+5MS0PeGaJRgPuNZlbd/WMdQSpOACaxEz7A81HAxm6kE+tIASTW3l8jgj1eWFy/PGPzaLnQrEjxI1McAfnYmQw==", "requires": { - "@docusaurus/core": "2.0.0-beta.18", - "@docusaurus/utils-validation": "2.0.0-beta.18", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", + "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-gtag": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.18.tgz", - "integrity": "sha512-h7vPuLVo/9pHmbFcvb4tCpjg4SxxX4k+nfVDyippR254FM++Z/nA5pRB0WvvIJ3ZTe0ioOb5Wlx2xdzJIBHUNg==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.21.tgz", + "integrity": "sha512-4zxKZOnf0rfh6myXLG7a6YZfQcxYDMBsWqANEjCX77H5gPdK+GHZuDrxK6sjFvRBv4liYCrNjo7HJ4DpPoT0zA==", "requires": { - "@docusaurus/core": "2.0.0-beta.18", - "@docusaurus/utils-validation": "2.0.0-beta.18", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", + "tslib": "^2.4.0" } }, "@docusaurus/plugin-sitemap": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.18.tgz", - "integrity": "sha512-Klonht0Ye3FivdBpS80hkVYNOH+8lL/1rbCPEV92rKhwYdwnIejqhdKct4tUTCl8TYwWiyeUFQqobC/5FNVZPQ==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.21.tgz", + "integrity": "sha512-/ynWbcXZXcYZ6sT2X6vAJbnfqcPxwdGEybd0rcRZi4gBHq6adMofYI25AqELmnbBDxt0If+vlAeUHFRG5ueP7Q==", "requires": { - "@docusaurus/core": "2.0.0-beta.18", - "@docusaurus/utils": "2.0.0-beta.18", - "@docusaurus/utils-common": "2.0.0-beta.18", - "@docusaurus/utils-validation": "2.0.0-beta.18", - "fs-extra": "^10.0.1", + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/utils-common": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", + "fs-extra": "^10.1.0", "sitemap": "^7.1.1", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } + "tslib": "^2.4.0" } }, "@docusaurus/preset-classic": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.18.tgz", - "integrity": "sha512-TfDulvFt/vLWr/Yy7O0yXgwHtJhdkZ739bTlFNwEkRMAy8ggi650e52I1I0T79s67llecb4JihgHPW+mwiVkCQ==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.21.tgz", + "integrity": "sha512-KvBnIUu7y69pNTJ9UhX6SdNlK6prR//J3L4rhN897tb8xx04xHHILlPXko2Il+C3Xzgh3OCgyvkoz9K6YlFTDw==", "requires": { - "@docusaurus/core": "2.0.0-beta.18", - "@docusaurus/plugin-content-blog": "2.0.0-beta.18", - "@docusaurus/plugin-content-docs": "2.0.0-beta.18", - "@docusaurus/plugin-content-pages": "2.0.0-beta.18", - "@docusaurus/plugin-debug": "2.0.0-beta.18", - "@docusaurus/plugin-google-analytics": "2.0.0-beta.18", - "@docusaurus/plugin-google-gtag": "2.0.0-beta.18", - "@docusaurus/plugin-sitemap": "2.0.0-beta.18", - "@docusaurus/theme-classic": "2.0.0-beta.18", - "@docusaurus/theme-common": "2.0.0-beta.18", - "@docusaurus/theme-search-algolia": "2.0.0-beta.18" + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/plugin-content-blog": "2.0.0-beta.21", + "@docusaurus/plugin-content-docs": "2.0.0-beta.21", + "@docusaurus/plugin-content-pages": "2.0.0-beta.21", + "@docusaurus/plugin-debug": "2.0.0-beta.21", + "@docusaurus/plugin-google-analytics": "2.0.0-beta.21", + "@docusaurus/plugin-google-gtag": "2.0.0-beta.21", + "@docusaurus/plugin-sitemap": "2.0.0-beta.21", + "@docusaurus/theme-classic": "2.0.0-beta.21", + "@docusaurus/theme-common": "2.0.0-beta.21", + "@docusaurus/theme-search-algolia": "2.0.0-beta.21" } }, "@docusaurus/react-loadable": { @@ -4491,176 +17201,104 @@ } }, "@docusaurus/theme-classic": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.18.tgz", - "integrity": "sha512-WJWofvSGKC4Luidk0lyUwkLnO3DDynBBHwmt4QrV+aAVWWSOHUjA2mPOF6GLGuzkZd3KfL9EvAfsU0aGE1Hh5g==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.21.tgz", + "integrity": "sha512-Ge0WNdTefD0VDQfaIMRRWa8tWMG9+8/OlBRd5MK88/TZfqdBq7b/gnCSaalQlvZwwkj6notkKhHx72+MKwWUJA==", "requires": { - "@docusaurus/core": "2.0.0-beta.18", - "@docusaurus/plugin-content-blog": "2.0.0-beta.18", - "@docusaurus/plugin-content-docs": "2.0.0-beta.18", - "@docusaurus/plugin-content-pages": "2.0.0-beta.18", - "@docusaurus/theme-common": "2.0.0-beta.18", - "@docusaurus/theme-translations": "2.0.0-beta.18", - "@docusaurus/utils": "2.0.0-beta.18", - "@docusaurus/utils-common": "2.0.0-beta.18", - "@docusaurus/utils-validation": "2.0.0-beta.18", + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/plugin-content-blog": "2.0.0-beta.21", + "@docusaurus/plugin-content-docs": "2.0.0-beta.21", + "@docusaurus/plugin-content-pages": "2.0.0-beta.21", + "@docusaurus/theme-common": "2.0.0-beta.21", + "@docusaurus/theme-translations": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/utils-common": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", "@mdx-js/react": "^1.6.22", "clsx": "^1.1.1", "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.38", + "infima": "0.2.0-alpha.39", "lodash": "^4.17.21", - "postcss": "^8.4.12", - "prism-react-renderer": "^1.3.1", - "prismjs": "^1.27.0", - "react-router-dom": "^5.2.0", - "rtlcss": "^3.5.0" + "nprogress": "^0.2.0", + "postcss": "^8.4.14", + "prism-react-renderer": "^1.3.3", + "prismjs": "^1.28.0", + "react-router-dom": "^5.3.3", + "rtlcss": "^3.5.0", + "tslib": "^2.4.0" } }, "@docusaurus/theme-common": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-beta.18.tgz", - "integrity": "sha512-3pI2Q6ttScDVTDbuUKAx+TdC8wmwZ2hfWk8cyXxksvC9bBHcyzXhSgcK8LTsszn2aANyZ3e3QY2eNSOikTFyng==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-beta.21.tgz", + "integrity": "sha512-fTKoTLRfjuFG6c3iwnVjIIOensxWMgdBKLfyE5iih3Lq7tQgkE7NyTGG9BKLrnTJ7cAD2UXdXM9xbB7tBf1qzg==", "requires": { - "@docusaurus/module-type-aliases": "2.0.0-beta.18", - "@docusaurus/plugin-content-blog": "2.0.0-beta.18", - "@docusaurus/plugin-content-docs": "2.0.0-beta.18", - "@docusaurus/plugin-content-pages": "2.0.0-beta.18", + "@docusaurus/module-type-aliases": "2.0.0-beta.21", + "@docusaurus/plugin-content-blog": "2.0.0-beta.21", + "@docusaurus/plugin-content-docs": "2.0.0-beta.21", + "@docusaurus/plugin-content-pages": "2.0.0-beta.21", "clsx": "^1.1.1", "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^1.3.1", - "tslib": "^2.3.1", + "prism-react-renderer": "^1.3.3", + "tslib": "^2.4.0", "utility-types": "^3.10.0" - }, - "dependencies": { - "@docusaurus/module-type-aliases": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.18.tgz", - "integrity": "sha512-e6mples8FZRyT7QyqidGS6BgkROjM+gljJsdOqoctbtBp+SZ5YDjwRHOmoY7eqEfsQNOaFZvT2hK38ui87hCRA==", - "requires": { - "@docusaurus/types": "2.0.0-beta.18", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*" - } - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } } }, "@docusaurus/theme-search-algolia": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.18.tgz", - "integrity": "sha512-2w97KO/gnjI49WVtYQqENpQ8iO1Sem0yaTxw7/qv/ndlmIAQD0syU4yx6GsA7bTQCOGwKOWWzZSetCgUmTnWgA==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.21.tgz", + "integrity": "sha512-T1jKT8MVSSfnztSqeebUOpWHPoHKtwDXtKYE0xC99JWoZ+mMfv8AFhVSoSddn54jLJjV36mxg841eHQIySMCpQ==", "requires": { - "@docsearch/react": "^3.0.0", - "@docusaurus/core": "2.0.0-beta.18", - "@docusaurus/logger": "2.0.0-beta.18", - "@docusaurus/plugin-content-docs": "2.0.0-beta.18", - "@docusaurus/theme-common": "2.0.0-beta.18", - "@docusaurus/theme-translations": "2.0.0-beta.18", - "@docusaurus/utils": "2.0.0-beta.18", - "@docusaurus/utils-validation": "2.0.0-beta.18", - "algoliasearch": "^4.13.0", - "algoliasearch-helper": "^3.7.4", + "@docsearch/react": "^3.1.0", + "@docusaurus/core": "2.0.0-beta.21", + "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/plugin-content-docs": "2.0.0-beta.21", + "@docusaurus/theme-common": "2.0.0-beta.21", + "@docusaurus/theme-translations": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/utils-validation": "2.0.0-beta.21", + "algoliasearch": "^4.13.1", + "algoliasearch-helper": "^3.8.2", "clsx": "^1.1.1", "eta": "^1.12.3", - "fs-extra": "^10.0.1", + "fs-extra": "^10.1.0", "lodash": "^4.17.21", - "tslib": "^2.3.1", + "tslib": "^2.4.0", "utility-types": "^3.10.0" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } } }, "@docusaurus/theme-translations": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.0-beta.18.tgz", - "integrity": "sha512-1uTEUXlKC9nco1Lx9H5eOwzB+LP4yXJG5wfv1PMLE++kJEdZ40IVorlUi3nJnaa9/lJNq5vFvvUDrmeNWsxy/Q==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.0-beta.21.tgz", + "integrity": "sha512-dLVT9OIIBs6MpzMb1bAy+C0DPJK3e3DNctG+ES0EP45gzEqQxzs4IsghpT+QDaOsuhNnAlosgJpFWX3rqxF9xA==", "requires": { - "fs-extra": "^10.0.1", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } + "fs-extra": "^10.1.0", + "tslib": "^2.4.0" } }, "@docusaurus/types": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-beta.18.tgz", - "integrity": "sha512-zkuSmPQYP3+z4IjGHlW0nGzSSpY7Sit0Nciu/66zSb5m07TK72t6T1MlpCAn/XijcB9Cq6nenC3kJh66nGsKYg==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-beta.21.tgz", + "integrity": "sha512-/GH6Npmq81eQfMC/ikS00QSv9jNyO1RXEpNSx5GLA3sFX8Iib26g2YI2zqNplM8nyxzZ2jVBuvUoeODTIbTchQ==", "requires": { "commander": "^5.1.0", + "history": "^4.9.0", "joi": "^17.6.0", + "react-helmet-async": "^1.3.0", "utility-types": "^3.10.0", - "webpack": "^5.70.0", + "webpack": "^5.72.1", "webpack-merge": "^5.8.0" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" - }, - "webpack": { - "version": "5.71.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", - "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - } - } } }, "@docusaurus/utils": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-beta.18.tgz", - "integrity": "sha512-v2vBmH7xSbPwx3+GB90HgLSQdj+Rh5ELtZWy7M20w907k0ROzDmPQ/8Ke2DK3o5r4pZPGnCrsB3SaYI83AEmAA==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-beta.21.tgz", + "integrity": "sha512-M/BrVCDmmUPZLxtiStBgzpQ4I5hqkggcpnQmEN+LbvbohjbtVnnnZQ0vptIziv1w8jry/woY+ePsyOO7O/yeLQ==", "requires": { - "@docusaurus/logger": "2.0.0-beta.18", + "@docusaurus/logger": "2.0.0-beta.21", "@svgr/webpack": "^6.2.1", "file-loader": "^6.2.0", - "fs-extra": "^10.0.1", + "fs-extra": "^10.1.0", "github-slugger": "^1.4.0", "globby": "^11.1.0", "gray-matter": "^4.0.3", @@ -4669,98 +17307,36 @@ "micromatch": "^4.0.5", "resolve-pathname": "^3.0.0", "shelljs": "^0.8.5", - "tslib": "^2.3.1", + "tslib": "^2.4.0", "url-loader": "^4.1.1", - "webpack": "^5.70.0" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "webpack": { - "version": "5.71.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", - "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - } - } + "webpack": "^5.72.1" } }, "@docusaurus/utils-common": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-beta.18.tgz", - "integrity": "sha512-pK83EcOIiKCLGhrTwukZMo5jqd1sqqqhQwOVyxyvg+x9SY/lsnNzScA96OEfm+qQLBwK1OABA7Xc1wfkgkUxvw==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-beta.21.tgz", + "integrity": "sha512-5w+6KQuJb6pUR2M8xyVuTMvO5NFQm/p8TOTDFTx60wt3p0P1rRX00v6FYsD4PK6pgmuoKjt2+Ls8dtSXc4qFpQ==", "requires": { - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } + "tslib": "^2.4.0" } }, "@docusaurus/utils-validation": { - "version": "2.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.18.tgz", - "integrity": "sha512-3aDrXjJJ8Cw2MAYEk5JMNnr8UHPxmVNbPU/PIHFWmWK09nJvs3IQ8nc9+8I30aIjRdIyc/BIOCxgvAcJ4hsxTA==", + "version": "2.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.21.tgz", + "integrity": "sha512-6NG1FHTRjv1MFzqW//292z7uCs77vntpWEbZBHk3n67aB1HoMn5SOwjLPtRDjbCgn6HCHFmdiJr6euCbjhYolg==", "requires": { - "@docusaurus/logger": "2.0.0-beta.18", - "@docusaurus/utils": "2.0.0-beta.18", + "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/utils": "2.0.0-beta.21", "joi": "^17.6.0", "js-yaml": "^4.1.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } + "tslib": "^2.4.0" } }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, + "devOptional": true, "requires": { "ajv": "^6.12.4", "debug": "^4.1.1", @@ -4777,7 +17353,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, + "devOptional": true, "requires": { "sprintf-js": "~1.0.2" } @@ -4786,7 +17362,7 @@ "version": "13.10.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", - "dev": true, + "devOptional": true, "requires": { "type-fest": "^0.20.2" } @@ -4795,7 +17371,7 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, + "devOptional": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -4861,7 +17437,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, + "devOptional": true, "requires": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -4872,22 +17448,37 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", - "dev": true + "devOptional": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } }, "@jridgewell/resolve-uri": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" }, + "@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==" + }, "@jridgewell/sourcemap-codec": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" }, "@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -4900,9 +17491,9 @@ "dev": true }, "@leichtgewicht/ip-codec": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz", - "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, "@mdx-js/mdx": { "version": "1.6.22", @@ -4963,7 +17554,8 @@ "@mdx-js/react": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", - "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==" + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "requires": {} }, "@mdx-js/util": { "version": "1.6.22", @@ -5051,42 +17643,50 @@ "@svgr/babel-plugin-add-jsx-attribute": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", - "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==" + "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", + "requires": {} }, "@svgr/babel-plugin-remove-jsx-attribute": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", - "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==" + "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", + "requires": {} }, "@svgr/babel-plugin-remove-jsx-empty-expression": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", - "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==" + "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", + "requires": {} }, "@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", - "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==" + "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", + "requires": {} }, "@svgr/babel-plugin-svg-dynamic-title": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", - "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==" + "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", + "requires": {} }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", - "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==" + "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", + "requires": {} }, "@svgr/babel-plugin-transform-react-native-svg": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", - "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==" + "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", + "requires": {} }, "@svgr/babel-plugin-transform-svg-component": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", - "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==" + "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", + "requires": {} }, "@svgr/babel-preset": { "version": "6.2.0", @@ -5122,20 +17722,6 @@ "entities": "^3.0.1" }, "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, "entities": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", @@ -5305,9 +17891,9 @@ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" }, "@types/http-proxy": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", - "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "requires": { "@types/node": "*" } @@ -5349,9 +17935,9 @@ "dev": true }, "@types/node": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.3.tgz", - "integrity": "sha512-8h7k1YgQKxKXWckzFCMfsIwn0Y61UK6tlD6y2lOb3hTOIMlK3t9/QwHOhc81TwU+RMf0As5fj7NPjroERCnejQ==" + "version": "17.0.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz", + "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==" }, "@types/parse-json": { "version": "4.0.0", @@ -5440,9 +18026,9 @@ } }, "@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, "@types/sax": { "version": "1.2.4", @@ -5643,39 +18229,25 @@ "requires": { "mime-types": "~2.1.34", "negotiator": "0.6.3" - }, - "dependencies": { - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - } } }, "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" }, "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "requires": {} }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "devOptional": true, + "requires": {} }, "acorn-walk": { "version": "8.2.0", @@ -5736,33 +18308,34 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} }, "algoliasearch": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.13.0.tgz", - "integrity": "sha512-oHv4faI1Vl2s+YC0YquwkK/TsaJs79g2JFg5FDm2rKN12VItPTAeQ7hyJMHarOPPYuCnNC5kixbtcqvb21wchw==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.13.1.tgz", + "integrity": "sha512-dtHUSE0caWTCE7liE1xaL+19AFf6kWEcyn76uhcitWpntqvicFHXKFoZe5JJcv9whQOTRM6+B8qJz6sFj+rDJA==", "requires": { - "@algolia/cache-browser-local-storage": "4.13.0", - "@algolia/cache-common": "4.13.0", - "@algolia/cache-in-memory": "4.13.0", - "@algolia/client-account": "4.13.0", - "@algolia/client-analytics": "4.13.0", - "@algolia/client-common": "4.13.0", - "@algolia/client-personalization": "4.13.0", - "@algolia/client-search": "4.13.0", - "@algolia/logger-common": "4.13.0", - "@algolia/logger-console": "4.13.0", - "@algolia/requester-browser-xhr": "4.13.0", - "@algolia/requester-common": "4.13.0", - "@algolia/requester-node-http": "4.13.0", - "@algolia/transporter": "4.13.0" + "@algolia/cache-browser-local-storage": "4.13.1", + "@algolia/cache-common": "4.13.1", + "@algolia/cache-in-memory": "4.13.1", + "@algolia/client-account": "4.13.1", + "@algolia/client-analytics": "4.13.1", + "@algolia/client-common": "4.13.1", + "@algolia/client-personalization": "4.13.1", + "@algolia/client-search": "4.13.1", + "@algolia/logger-common": "4.13.1", + "@algolia/logger-console": "4.13.1", + "@algolia/requester-browser-xhr": "4.13.1", + "@algolia/requester-common": "4.13.1", + "@algolia/requester-node-http": "4.13.1", + "@algolia/transporter": "4.13.1" } }, "algoliasearch-helper": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.8.1.tgz", - "integrity": "sha512-IGK67xeut0wYRXQw+MlSDYmYK/6e+/a++HVf9MgSWYtPd6QIHWiOKpgMYRJMNF/zMjx0FPA16D/AypgWxSVBnQ==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.8.2.tgz", + "integrity": "sha512-AXxiF0zT9oYwl8ZBgU/eRXvfYhz7cBA5YrLPlw9inZHdaYF0QEya/f1Zp1mPYMXc1v6VkHwBq4pk6/vayBLICg==", "requires": { "@algolia/events": "^4.0.1" } @@ -5779,7 +18352,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true + "devOptional": true }, "ansi-html-community": { "version": "0.0.8", @@ -5787,9 +18360,9 @@ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", @@ -5874,21 +18447,13 @@ "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "requires": { - "lodash": "^4.17.14" - } + "devOptional": true }, "at-least-node": { "version": "1.0.0", @@ -5896,33 +18461,16 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "autoprefixer": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", - "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", "requires": { - "browserslist": "^4.20.2", - "caniuse-lite": "^1.0.30001317", + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001325", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", - "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" - }, - "electron-to-chromium": { - "version": "1.4.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", - "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" - } } }, "axios": { @@ -5934,9 +18482,9 @@ } }, "babel-loader": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", - "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "requires": { "find-cache-dir": "^3.3.1", "loader-utils": "^2.0.0", @@ -5966,9 +18514,9 @@ } }, "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "requires": { "object.assign": "^4.1.0" } @@ -6028,12 +18576,12 @@ "base16": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, "big.js": { "version": "5.2.2", @@ -6051,20 +18599,22 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { "bytes": { @@ -6083,14 +18633,14 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, "bonjour-service": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz", - "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz", + "integrity": "sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw==", "requires": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", @@ -6123,15 +18673,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -6150,14 +18691,6 @@ "ansi-regex": "^6.0.1" } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, "type-fest": { "version": "2.12.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.12.2.tgz", @@ -6183,32 +18716,15 @@ } }, "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", "escalade": "^3.1.1", - "node-releases": "^2.0.2", + "node-releases": "^2.0.3", "picocolors": "^1.0.0" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001325", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", - "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" - }, - "electron-to-chromium": { - "version": "1.4.104", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.104.tgz", - "integrity": "sha512-2kjoAyiG7uMyGRM9mx25s3HAzmQG2ayuYXxsFmYugHSDcwxREgLtscZvbL1JcW9S/OemeQ3f/SG6JhDwpnCclQ==" - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" - } } }, "buffer-from": { @@ -6306,9 +18822,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001245", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001245.tgz", - "integrity": "sha512-768fM9j1PKXpOCKws6eTo3RHmvTUsG9UrpT4WoREFeZgJBTi4/X9g565azS/rVUGtqb8nt7FjLeF5u4kukERnA==" + "version": "1.0.30001346", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001346.tgz", + "integrity": "sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ==" }, "ccount": { "version": "1.1.0", @@ -6316,9 +18832,9 @@ "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6433,15 +18949,63 @@ } }, "cheerio-select": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", - "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "requires": { - "css-select": "^4.3.0", - "css-what": "^6.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.3.1", - "domutils": "^2.8.0" + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "dependencies": { + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "entities": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", + "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==" + } } }, "chokidar": { @@ -6532,11 +19096,11 @@ } }, "cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", + "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", "requires": { - "colors": "1.4.0", + "@colors/colors": "1.5.0", "string-width": "^4.2.0" } }, @@ -6591,12 +19155,6 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "optional": true - }, "combine-promises": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", @@ -6615,7 +19173,7 @@ "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "compressible": { "version": "2.0.18", @@ -6650,7 +19208,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, @@ -6701,14 +19259,14 @@ } }, "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "copy-text-to-clipboard": { "version": "3.0.1", @@ -6724,13 +19282,13 @@ } }, "copy-webpack-plugin": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", - "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "requires": { - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", - "globby": "^12.0.2", + "globby": "^13.1.1", "normalize-path": "^3.0.0", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0" @@ -6755,11 +19313,6 @@ "fast-deep-equal": "^3.1.3" } }, - "array-union": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==" - }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -6769,14 +19322,13 @@ } }, "globby": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", - "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz", + "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==", "requires": { - "array-union": "^3.0.1", "dir-glob": "^3.0.1", - "fast-glob": "^3.2.7", - "ignore": "^5.1.9", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^4.0.0" } @@ -6786,14 +19338,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -6818,34 +19362,19 @@ } }, "core-js": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", - "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==" + "version": "3.22.8", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz", + "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==" }, "core-js-compat": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", - "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", + "version": "3.22.8", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.8.tgz", + "integrity": "sha512-pQnwg4xtuvc2Bs/5zYQPaEYYSuTxsF7LBWF0SvnVhthZo/Qe+rJpcEekrdNK5DWwDJ0gv0oI9NNX5Mppdy0ctg==", "requires": { - "browserslist": "^4.19.1", + "browserslist": "^4.20.3", "semver": "7.0.0" }, "dependencies": { - "caniuse-lite": { - "version": "1.0.30001325", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", - "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" - }, - "electron-to-chromium": { - "version": "1.4.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", - "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" - }, "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", @@ -6854,9 +19383,9 @@ } }, "core-js-pure": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz", - "integrity": "sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==" + "version": "3.22.8", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.8.tgz", + "integrity": "sha512-bOxbZIy9S5n4OVH63XaLVXZ49QKicjowDx/UELyJ68vxfCRpYsbyh/WNZNfEfAk+ekA8vSjt+gCDpvh672bc3w==" }, "core-util-is": { "version": "1.0.3", @@ -6901,7 +19430,8 @@ "css-declaration-sorter": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==" + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", + "requires": {} }, "css-loader": { "version": "6.7.1", @@ -6919,13 +19449,13 @@ } }, "css-minimizer-webpack-plugin": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", - "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA==", "requires": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "postcss": "^8.3.5", + "cssnano": "^5.1.8", + "jest-worker": "^27.5.1", + "postcss": "^8.4.13", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1" @@ -7012,22 +19542,22 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssnano": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", - "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.10.tgz", + "integrity": "sha512-ACpnRgDg4m6CZD/+8SgnLcGCgy6DDGdkMbOawwdvVxNietTNLe/MtWcenp6qT0PRt5wzhGl6/cjMWCdhKXC9QA==", "requires": { - "cssnano-preset-default": "^5.2.7", + "cssnano-preset-default": "^5.2.10", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-advanced": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.3.tgz", - "integrity": "sha512-AB9SmTSC2Gd8T7PpKUsXFJ3eNsg7dc4CTZ0+XAJ29MNxyJsrCEk7N1lw31bpHrsQH2PVJr21bbWgGAfA9j0dIA==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.6.tgz", + "integrity": "sha512-OZHsytu16eStRVrIY3wmPQqhJMaI0+O3raU4JHoKV3uuQYEeQek/FJVUIvYXD55hWR6OjCMyKYNRDw+k3/xgUw==", "requires": { "autoprefixer": "^10.3.7", - "cssnano-preset-default": "^5.2.7", + "cssnano-preset-default": "^5.2.10", "postcss-discard-unused": "^5.1.0", "postcss-merge-idents": "^5.1.1", "postcss-reduce-idents": "^5.2.0", @@ -7035,25 +19565,25 @@ } }, "cssnano-preset-default": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", - "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.10.tgz", + "integrity": "sha512-H8TJRhTjBKVOPltp9vr9El9I+IfYsOMhmXdK0LwdvwJcxYX9oWkY7ctacWusgPWAgQq1vt/WO8v+uqpfLnM7QA==", "requires": { "css-declaration-sorter": "^6.2.2", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.0", - "postcss-discard-comments": "^5.1.1", + "postcss-convert-values": "^5.1.2", + "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.4", - "postcss-merge-rules": "^5.1.1", + "postcss-merge-longhand": "^5.1.5", + "postcss-merge-rules": "^5.1.2", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.2", - "postcss-minify-selectors": "^5.2.0", + "postcss-minify-params": "^5.1.3", + "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", "postcss-normalize-positions": "^5.1.0", @@ -7073,7 +19603,8 @@ "cssnano-utils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==" + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "requires": {} }, "csso": { "version": "4.2.0", @@ -7123,7 +19654,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "devOptional": true }, "deepmerge": { "version": "4.2.2", @@ -7157,9 +19688,9 @@ } }, "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "requires": { "globby": "^11.0.1", "graceful-fs": "^4.2.4", @@ -7172,14 +19703,14 @@ } }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "detab": { "version": "2.0.4", @@ -7218,6 +19749,30 @@ } } }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -7229,7 +19784,7 @@ "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" }, "dns-packet": { "version": "5.3.1", @@ -7243,7 +19798,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, + "devOptional": true, "requires": { "esutils": "^2.0.2" } @@ -7267,9 +19822,9 @@ } }, "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" }, "domhandler": { "version": "4.3.1", @@ -7331,7 +19886,12 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "electron-to-chromium": { + "version": "1.4.144", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.144.tgz", + "integrity": "sha512-R3RV3rU1xWwFJlSClVWDvARaOk6VUO/FubHLodIASDB3Mc2dzuWvNdfOgH9bwHUTqT79u92qw60NWfwUdzAqdg==" }, "emoji-regex": { "version": "9.2.2", @@ -7351,7 +19911,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "end-of-stream": { "version": "1.4.4", @@ -7361,20 +19921,11 @@ "once": "^1.4.0" } }, - "enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, + "devOptional": true, "requires": { "ansi-colors": "^4.1.1" } @@ -7524,7 +20075,7 @@ "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, + "devOptional": true, "requires": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -7572,7 +20123,7 @@ "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, + "devOptional": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -7581,7 +20132,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, + "devOptional": true, "requires": { "sprintf-js": "~1.0.2" } @@ -7590,7 +20141,7 @@ "version": "13.10.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", - "dev": true, + "devOptional": true, "requires": { "type-fest": "^0.20.2" } @@ -7599,7 +20150,7 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, + "devOptional": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -7611,7 +20162,8 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true + "dev": true, + "requires": {} }, "eslint-mdx": { "version": "1.17.0", @@ -7627,12 +20179,6 @@ "unified": "^9.2.2" }, "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, "unified": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", @@ -7669,14 +20215,6 @@ "synckit": "^0.4.1", "tslib": "^2.3.1", "vfile": "^4.2.1" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - } } }, "eslint-plugin-react": { @@ -7767,7 +20305,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, + "devOptional": true, "requires": { "eslint-visitor-keys": "^1.1.0" }, @@ -7776,7 +20314,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true + "devOptional": true } } }, @@ -7784,13 +20322,13 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true + "devOptional": true }, "espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, + "devOptional": true, "requires": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", @@ -7801,7 +20339,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true + "devOptional": true } } }, @@ -7814,7 +20352,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, + "devOptional": true, "requires": { "estraverse": "^5.1.0" }, @@ -7823,7 +20361,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true + "devOptional": true } } }, @@ -7860,7 +20398,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "eval": { "version": "0.1.8", @@ -7915,37 +20453,38 @@ } }, "express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -7954,7 +20493,7 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "content-disposition": { "version": "0.5.4", @@ -7975,12 +20514,12 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "range-parser": { "version": "1.2.1", @@ -8019,7 +20558,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "requires": { "is-extendable": "^0.1.0" } @@ -8050,7 +20589,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "devOptional": true }, "fast-url-parser": { "version": "1.1.3", @@ -8115,7 +20654,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, + "devOptional": true, "requires": { "flat-cache": "^3.0.4" } @@ -8143,16 +20682,16 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "dependencies": { @@ -8167,7 +20706,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, @@ -8194,7 +20733,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, + "devOptional": true, "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -8204,7 +20743,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true + "devOptional": true }, "flux": { "version": "4.0.3", @@ -8221,9 +20760,9 @@ "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" }, "fork-ts-checker-webpack-plugin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz", - "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", "requires": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -8293,12 +20832,12 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -8342,7 +20881,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "devOptional": true }, "functions-have-names": { "version": "1.2.3", @@ -8717,7 +21256,7 @@ "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "requires": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -8728,7 +21267,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "readable-stream": { "version": "2.3.7", @@ -8809,9 +21348,9 @@ } }, "html-tags": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", - "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==" }, "html-void-elements": { "version": "1.0.5", @@ -8901,17 +21440,17 @@ "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" }, "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" } }, @@ -8931,9 +21470,9 @@ } }, "http-proxy-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", - "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "requires": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -8965,13 +21504,14 @@ "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "requires": {} }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true + "devOptional": true }, "image-size": { "version": "1.0.1", @@ -8982,14 +21522,14 @@ } }, "immer": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.12.tgz", - "integrity": "sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==" + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.14.tgz", + "integrity": "sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw==" }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -9011,9 +21551,9 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, "infima": { - "version": "0.2.0-alpha.38", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.38.tgz", - "integrity": "sha512-1WsmqSMI5IqzrUx3goq+miJznHBonbE3aoqZ1AR/i/oHhroxNeSV6Awv5VoVfXBhfTzLSnxkHaRI2qpAMYcCzw==" + "version": "0.2.0-alpha.39", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.39.tgz", + "integrity": "sha512-UyYiwD3nwHakGhuOUfpe3baJ8gkiPpRVx4a4sE/Ag+932+Y6swtLsdPoRR8ezhwqGnduzxmFkjumV9roz6QoLw==" }, "inflight": { "version": "1.0.6", @@ -9169,7 +21709,7 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" }, "is-extglob": { "version": "2.1.1", @@ -9182,9 +21722,9 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } @@ -9231,7 +21771,7 @@ "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" }, "is-path-cwd": { "version": "2.2.0", @@ -9275,7 +21815,7 @@ "is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==" }, "is-root": { "version": "2.1.0", @@ -9367,9 +21907,9 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "jest-worker": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", - "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -9421,11 +21961,6 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -9480,7 +22015,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "devOptional": true }, "json-stringify-safe": { "version": "5.0.1", @@ -9489,12 +22024,9 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" }, "jsonfile": { "version": "6.1.0", @@ -9555,7 +22087,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, + "devOptional": true, "requires": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -9613,12 +22145,12 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true + "devOptional": true }, "lodash.curry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" }, "lodash.debounce": { "version": "4.0.8", @@ -9643,7 +22175,7 @@ "lodash.flow": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" }, "lodash.foreach": { "version": "4.5.0", @@ -9658,7 +22190,7 @@ "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" }, "lodash.merge": { "version": "4.6.2", @@ -9689,12 +22221,12 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true + "devOptional": true }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, "longest-streak": { "version": "2.0.4", @@ -9835,17 +22367,17 @@ "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz", + "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==", "requires": { "fs-monkey": "1.0.3" } @@ -9877,7 +22409,7 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "merge-stream": { "version": "2.0.0", @@ -9892,7 +22424,7 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "micromark": { "version": "2.11.4", @@ -9919,16 +22451,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.31", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", - "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.48.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -10013,14 +22545,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } - }, "mrmime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz", @@ -10032,9 +22556,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", - "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "requires": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -10058,15 +22582,15 @@ } }, "nanoid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", - "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==" + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true + "devOptional": true }, "negotiator": { "version": "0.6.3", @@ -10114,6 +22638,11 @@ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, + "node-releases": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -10122,7 +22651,7 @@ "normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" }, "normalize-url": { "version": "6.1.0", @@ -10140,7 +22669,7 @@ "nprogress": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" }, "nth-check": { "version": "2.0.1", @@ -10168,8 +22697,7 @@ "object-inspect": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", - "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==", - "dev": true + "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==" }, "object-keys": { "version": "1.1.1", @@ -10248,9 +22776,9 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { "ee-first": "1.1.1" } @@ -10295,7 +22823,7 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, + "devOptional": true, "requires": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -10311,11 +22839,11 @@ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { - "yocto-queue": "^0.1.0" + "p-try": "^2.0.0" } }, "p-locate": { @@ -10324,16 +22852,6 @@ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - } } }, "p-map": { @@ -10345,11 +22863,11 @@ } }, "p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "requires": { - "@types/retry": "^0.12.0", + "@types/retry": "0.12.0", "retry": "^0.13.1" } }, @@ -10428,11 +22946,35 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", "requires": { - "parse5": "^6.0.1" + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "dependencies": { + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "entities": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", + "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==" + }, + "parse5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "requires": { + "entities": "^4.3.0" + } + } } }, "parseurl": { @@ -10530,14 +23072,6 @@ "path-exists": "^3.0.0" } }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -10549,36 +23083,16 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" } } }, "postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "requires": { - "nanoid": "^3.3.1", + "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } @@ -10601,52 +23115,40 @@ "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001325", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", - "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" - }, - "electron-to-chromium": { - "version": "1.4.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", - "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" - } } }, "postcss-convert-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", - "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", + "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", "requires": { + "browserslist": "^4.20.3", "postcss-value-parser": "^4.2.0" } }, "postcss-discard-comments": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "requires": {} }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==" + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "requires": {} }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==" + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "requires": {} }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==" + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "requires": {} }, "postcss-discard-unused": { "version": "5.1.0", @@ -10657,13 +23159,23 @@ } }, "postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.0.tgz", + "integrity": "sha512-IDyttebFzTSY6DI24KuHUcBjbAev1i+RyICoPEWcAstZsj03r533uMXtDn506l6/wlsRYiS5XBdx7TpccCsyUg==", "requires": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", - "semver": "^7.3.5" + "semver": "^7.3.7" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "postcss-merge-idents": { @@ -10676,40 +23188,23 @@ } }, "postcss-merge-longhand": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", - "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz", + "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==", "requires": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.0" } }, "postcss-merge-rules": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", - "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", + "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", "requires": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001325", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", - "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" - }, - "electron-to-chromium": { - "version": "1.4.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", - "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" - } } }, "postcss-minify-font-values": { @@ -10731,36 +23226,19 @@ } }, "postcss-minify-params": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", - "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", + "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", "requires": { "browserslist": "^4.16.6", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001325", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", - "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" - }, - "electron-to-chromium": { - "version": "1.4.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", - "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" - } } }, "postcss-minify-selectors": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", - "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", "requires": { "postcss-selector-parser": "^6.0.5" } @@ -10768,7 +23246,8 @@ "postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -10799,7 +23278,8 @@ "postcss-normalize-charset": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==" + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "requires": {} }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -10848,23 +23328,6 @@ "requires": { "browserslist": "^4.16.6", "postcss-value-parser": "^4.2.0" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001325", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", - "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" - }, - "electron-to-chromium": { - "version": "1.4.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", - "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" - } } }, "postcss-normalize-url": { @@ -10908,23 +23371,6 @@ "requires": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001325", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", - "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" - }, - "electron-to-chromium": { - "version": "1.4.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", - "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" - } } }, "postcss-reduce-transforms": { @@ -10977,7 +23423,8 @@ "postcss-zindex": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", - "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==" + "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "requires": {} }, "prebuild-webpack-plugin": { "version": "1.1.1", @@ -10994,7 +23441,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true + "devOptional": true }, "prepend-http": { "version": "2.0.0", @@ -11022,14 +23469,15 @@ "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" }, "prism-react-renderer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.1.tgz", - "integrity": "sha512-xUeDMEz074d0zc5y6rxiMp/dlC7C+5IDDlaEUlcBOFE2wddz7hz5PNupb087mPwTt7T9BrFmewObfCBuf/LKwQ==" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.3.tgz", + "integrity": "sha512-Viur/7tBTCH2HmYzwCHmt2rEFn+rdIWNIINXyg0StiISbDiIhHKhrFuEK8eMkKgvsIYSjgGqy/hNyucHp6FpoQ==", + "requires": {} }, "prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==" + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==" }, "process-nextick-args": { "version": "2.0.1", @@ -11040,7 +23488,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "devOptional": true }, "promise": { "version": "7.3.1", @@ -11118,12 +23566,15 @@ "pure-color": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" }, "qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } }, "queue": { "version": "6.0.2", @@ -11152,12 +23603,12 @@ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, "raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -11199,7 +23650,8 @@ "react-async": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/react-async/-/react-async-10.0.1.tgz", - "integrity": "sha512-ORUz5ca0B57QgBIzEZM5SuhJ6xFjkvEEs0gylLNlWf06vuVcLZsjIw3wx58jJkZG38p+0nUAxRgFW2b7mnVZzA==" + "integrity": "sha512-ORUz5ca0B57QgBIzEZM5SuhJ6xFjkvEEs0gylLNlWf06vuVcLZsjIw3wx58jJkZG38p+0nUAxRgFW2b7mnVZzA==", + "requires": {} }, "react-base16-styling": { "version": "0.6.0", @@ -11222,9 +23674,9 @@ } }, "react-dev-utils": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0.tgz", - "integrity": "sha512-xBQkitdxozPxt1YZ9O1097EJiVpwHr9FoAuEVURCKV0Av8NBERovJauzP7bo1ThvuhZ4shsQ1AJiu4vQpoT1AQ==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", "requires": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", @@ -11245,146 +23697,13 @@ "open": "^8.4.0", "pkg-up": "^3.1.0", "prompts": "^2.4.2", - "react-error-overlay": "^6.0.10", + "react-error-overlay": "^6.0.11", "recursive-readdir": "^2.2.2", "shell-quote": "^1.7.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001325", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", - "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - } - }, - "electron-to-chromium": { - "version": "1.4.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", - "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" - }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -11407,15 +23726,13 @@ "p-locate": "^5.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } }, "p-locate": { "version": "5.0.0", @@ -11424,14 +23741,6 @@ "requires": { "p-limit": "^3.0.2" } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } } } }, @@ -11446,9 +23755,9 @@ } }, "react-error-overlay": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz", - "integrity": "sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA==" + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, "react-fast-compare": { "version": "3.2.0", @@ -11456,9 +23765,9 @@ "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" }, "react-helmet-async": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.2.3.tgz", - "integrity": "sha512-mCk2silF53Tq/YaYdkl2sB+/tDoPnaxN7dFS/6ZLJb/rhUY2EWGI5Xj2b4jHppScMqY45MbgPSwTxDchKpZ5Kw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", "requires": { "@babel/runtime": "^7.12.5", "invariant": "^2.2.4", @@ -11506,9 +23815,9 @@ } }, "react-router": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", - "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz", + "integrity": "sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w==", "requires": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -11531,27 +23840,27 @@ } }, "react-router-dom": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", - "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng==", "requires": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", "loose-envify": "^1.3.1", "prop-types": "^15.6.2", - "react-router": "5.2.1", + "react-router": "5.3.3", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" } }, "react-textarea-autosize": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz", - "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", + "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", "requires": { "@babel/runtime": "^7.10.2", - "use-composed-ref": "^1.0.0", - "use-latest": "^1.0.0" + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" } }, "react-toastify": { @@ -11620,9 +23929,9 @@ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "requires": { "@babel/runtime": "^7.8.4" } @@ -11642,7 +23951,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true + "devOptional": true }, "regexpu-core": { "version": "5.0.1", @@ -11815,239 +24124,6 @@ "source-map": "^0.5.0" } }, - "@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", - "requires": { - "@babel/types": "^7.14.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "requires": { - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "requires": { - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "requires": { - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" - }, - "@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", - "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==" - }, - "@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -12120,11 +24196,6 @@ "strip-ansi": "^6.0.1" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, "htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -12135,14 +24206,6 @@ "domutils": "^2.5.2", "entities": "^2.0.0" } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } } } }, @@ -12244,6 +24307,14 @@ "p-locate": "^5.0.0" } }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, "p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", @@ -12350,23 +24421,23 @@ } }, "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "debug": { @@ -12380,7 +24451,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, @@ -12461,10 +24532,15 @@ "ms": "2.0.0" } }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -12475,29 +24551,34 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" } } }, "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" } }, "setimmediate": { @@ -12555,7 +24636,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -12591,13 +24671,6 @@ "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.2.4" - }, - "dependencies": { - "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" - } } }, "slash": { @@ -12609,7 +24682,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, + "devOptional": true, "requires": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -12708,15 +24781,30 @@ "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "std-env": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.0.1.tgz", "integrity": "sha512-mC1Ps9l77/97qeOZc+HrOL7TIaOboHqMZ24dGVQrlxFcpPpfCHpH+qfUT7Dz+6mlG8+JPA1KfBQo19iC/+Ngcw==" }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, "string-replace-loader": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-replace-loader/-/string-replace-loader-3.1.0.tgz", @@ -12814,21 +24902,6 @@ } } }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, "stringify-entities": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", @@ -12851,11 +24924,11 @@ } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "strip-bom-string": { @@ -12888,23 +24961,6 @@ "requires": { "browserslist": "^4.16.6", "postcss-selector-parser": "^6.0.4" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001325", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", - "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" - }, - "electron-to-chromium": { - "version": "1.4.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", - "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" - } } }, "supports-color": { @@ -12956,21 +25012,13 @@ "requires": { "tslib": "^2.3.1", "uuid": "^8.3.2" - }, - "dependencies": { - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - } } }, "table": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "dev": true, + "devOptional": true, "requires": { "ajv": "^8.0.1", "lodash.clonedeep": "^4.5.0", @@ -12984,7 +25032,7 @@ "version": "8.6.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", - "dev": true, + "devOptional": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -12996,7 +25044,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "devOptional": true } } }, @@ -13028,23 +25076,15 @@ } }, "terser-webpack-plugin": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", - "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", + "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", "requires": { - "jest-worker": "^27.0.6", - "p-limit": "^3.1.0", + "@jridgewell/trace-mapping": "^0.3.7", + "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", "terser": "^5.7.2" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } }, "text-table": { @@ -13149,9 +25189,9 @@ "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" }, "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "type": { "version": "1.2.0", @@ -13163,7 +25203,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, + "devOptional": true, "requires": { "prelude-ls": "^1.2.1" } @@ -13193,8 +25233,7 @@ "typescript": { "version": "4.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", - "dev": true + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==" }, "ua-parser-js": { "version": "0.7.31", @@ -13443,21 +25482,23 @@ } }, "use-composed-ref": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.2.1.tgz", - "integrity": "sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "requires": {} }, "use-isomorphic-layout-effect": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==" + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "requires": {} }, "use-latest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.0.tgz", - "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", "requires": { - "use-isomorphic-layout-effect": "^1.0.0" + "use-isomorphic-layout-effect": "^1.1.1" } }, "util-deprecate": { @@ -13489,7 +25530,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true + "devOptional": true }, "value-equal": { "version": "1.0.1", @@ -13574,7 +25615,6 @@ "version": "5.72.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", - "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", @@ -13605,20 +25645,17 @@ "@types/estree": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, "acorn": { "version": "8.7.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" }, "enhanced-resolve": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", - "dev": true, "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -13655,12 +25692,12 @@ } }, "webpack-dev-middleware": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", - "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "requires": { "colorette": "^2.0.10", - "memfs": "^3.4.1", + "memfs": "^3.4.3", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" @@ -13709,9 +25746,9 @@ } }, "webpack-dev-server": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.8.0.tgz", - "integrity": "sha512-yZ7OWVP1nOtv8s10R/ZCsH6zf6QKkNusMRBE9DsQbOknRzKaFYYrbwVPCXp8ynUOTt3RlD9szM8H0pUlrJ6wcw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", + "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -13733,12 +25770,11 @@ "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", - "portfinder": "^1.0.28", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", "selfsigned": "^2.0.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", + "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", "ws": "^8.4.2" @@ -13780,9 +25816,10 @@ } }, "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==" + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", + "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", + "requires": {} } } }, @@ -13898,7 +25935,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "devOptional": true }, "wrap-ansi": { "version": "8.0.1", @@ -13959,7 +25996,8 @@ "ws": { "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==" + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "requires": {} }, "xdg-basedir": { "version": "4.0.0", diff --git a/docs/package.json b/docs/package.json index 2d8eea0a..b2833c30 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,8 +15,8 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "^2.0.0-beta.18", - "@docusaurus/preset-classic": "^2.0.0-beta.18", + "@docusaurus/core": "^2.0.0-beta.21", + "@docusaurus/preset-classic": "^2.0.0-beta.21", "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.1.18", @@ -43,8 +43,8 @@ ] }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.0.0-beta.18", - "@docusaurus/types": "^2.0.0-beta.18", + "@docusaurus/module-type-aliases": "^2.0.0-beta.21", + "@docusaurus/types": "^2.0.0-beta.21", "@tsconfig/docusaurus": "^1.0.5", "@types/js-yaml": "^4.0.5", "@types/react": "^17.0.3", From 6a86cd05473d5a778fde710d7d607469c71fc26d Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 3 Jun 2022 03:25:59 +0000 Subject: [PATCH 007/289] feat(gpio): Add 595 shift register driver. * Use SPI for sending serial data. * Supports 1-4 shift registers chained together by setting `ngios` property appropriately. --- app/drivers/gpio/CMakeLists.txt | 2 +- app/drivers/gpio/Kconfig | 1 + app/drivers/gpio/Kconfig.595 | 24 ++ app/drivers/gpio/gpio_595.c | 215 ++++++++++++++++++ .../dts/bindings/gpio/zmk,gpio-595.yaml | 33 +++ 5 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 app/drivers/gpio/Kconfig.595 create mode 100644 app/drivers/gpio/gpio_595.c create mode 100644 app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml diff --git a/app/drivers/gpio/CMakeLists.txt b/app/drivers/gpio/CMakeLists.txt index b879b238..0df31ad5 100644 --- a/app/drivers/gpio/CMakeLists.txt +++ b/app/drivers/gpio/CMakeLists.txt @@ -4,5 +4,5 @@ zephyr_library_named(zmk__drivers__gpio) zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) +zephyr_library_sources_ifdef(CONFIG_GPIO_595 gpio_595.c) zephyr_library_sources_ifdef(CONFIG_GPIO_MCP23017 gpio_mcp23017.c) -zephyr_library_sources_ifndef(CONFIG_GPIO_MCP23017 ${ZEPHYR_BASE}/misc/empty_file.c) diff --git a/app/drivers/gpio/Kconfig b/app/drivers/gpio/Kconfig index 09f9609f..336d60b9 100644 --- a/app/drivers/gpio/Kconfig +++ b/app/drivers/gpio/Kconfig @@ -1 +1,2 @@ rsource "Kconfig.mcp23017" +rsource "Kconfig.595" \ No newline at end of file diff --git a/app/drivers/gpio/Kconfig.595 b/app/drivers/gpio/Kconfig.595 new file mode 100644 index 00000000..b863adcb --- /dev/null +++ b/app/drivers/gpio/Kconfig.595 @@ -0,0 +1,24 @@ +# 595 GPIO configuration options + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +DT_COMPAT_ZMK_GPIO_595 := zmk,gpio-595 + +menuconfig GPIO_595 + bool "595 Shift Register SPI driver" + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_GPIO_595)) + depends on SPI + select HAS_DTS_GPIO + help + Enable driver for 595 shift register chip using SPI. + +if GPIO_595 + +config GPIO_595_INIT_PRIORITY + int "Init priority" + default 75 + help + Device driver initialization priority. + +endif #GPIO_595 diff --git a/app/drivers/gpio/gpio_595.c b/app/drivers/gpio/gpio_595.c new file mode 100644 index 00000000..32016702 --- /dev/null +++ b/app/drivers/gpio/gpio_595.c @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_gpio_595 + +/** + * @file Driver for 595 SPI-based GPIO driver. + */ + +#include + +#include +#include +#include +#include +#include +#include + +#define LOG_LEVEL CONFIG_GPIO_LOG_LEVEL +#include +LOG_MODULE_REGISTER(gpio_595); + +/** Configuration data */ +struct reg_595_config { + /* gpio_driver_data needs to be first */ + struct gpio_driver_config common; + + struct spi_dt_spec bus; + + uint8_t ngpios; +}; + +/** Runtime driver data */ +struct reg_595_drv_data { + /* gpio_driver_data needs to be first */ + struct gpio_driver_config data; + + struct k_sem lock; + + uint32_t gpio_cache; +}; + +static int reg_595_write_registers(const struct device *dev, uint32_t value) { + const struct reg_595_config *config = dev->config; + struct reg_595_drv_data *const drv_data = (struct reg_595_drv_data *const)dev->data; + int ret = 0; + + uint8_t nwrite = config->ngpios / 8; + uint32_t reg_data = sys_cpu_to_be32(value); + + /* Allow a sequence of 1-4 registers in sequence, lowest byte is for the first in the chain */ + const struct spi_buf tx_buf[1] = {{ + .buf = ((uint8_t *)®_data) + (4 - nwrite), + .len = nwrite, + }}; + + const struct spi_buf_set tx = { + .buffers = tx_buf, + .count = ARRAY_SIZE(tx_buf), + }; + + ret = spi_write_dt(&config->bus, &tx); + if (ret < 0) { + LOG_ERR("spi_write FAIL %d\n", ret); + return ret; + } + + drv_data->gpio_cache = value; + return 0; +} + +/** + * @brief Setup the pin direction (input or output) + * + * @param dev Device struct of the 595 + * @param pin The pin number + * @param flags Flags of pin or port + * + * @return 0 if successful, failed otherwise + */ +static int setup_pin_dir(const struct device *dev, uint32_t pin, int flags) { + if ((flags & GPIO_OUTPUT) == 0U) { + return -ENOTSUP; + } + + return 0; +} + +static int reg_595_pin_config(const struct device *dev, gpio_pin_t pin, gpio_flags_t flags) { + int ret; + + /* Can't do SPI bus operations from an ISR */ + if (k_is_in_isr()) { + return -EWOULDBLOCK; + } + + if ((flags & GPIO_OPEN_DRAIN) != 0U) { + return -ENOTSUP; + }; + + ret = setup_pin_dir(dev, pin, flags); + if (ret) { + LOG_ERR("595: error setting pin direction (%d)", ret); + } + + return ret; +} + +static int reg_595_port_get_raw(const struct device *dev, uint32_t *value) { return -ENOTSUP; } + +static int reg_595_port_set_masked_raw(const struct device *dev, uint32_t mask, uint32_t value) { + struct reg_595_drv_data *const drv_data = (struct reg_595_drv_data *const)dev->data; + uint32_t buf; + int ret; + + /* Can't do SPI bus operations from an ISR */ + if (k_is_in_isr()) { + return -EWOULDBLOCK; + } + + k_sem_take(&drv_data->lock, K_FOREVER); + + buf = drv_data->gpio_cache; + buf = (buf & ~mask) | (mask & value); + + ret = reg_595_write_registers(dev, buf); + + k_sem_give(&drv_data->lock); + return ret; +} + +static int reg_595_port_set_bits_raw(const struct device *dev, uint32_t mask) { + return reg_595_port_set_masked_raw(dev, mask, mask); +} + +static int reg_595_port_clear_bits_raw(const struct device *dev, uint32_t mask) { + return reg_595_port_set_masked_raw(dev, mask, 0); +} + +static int reg_595_port_toggle_bits(const struct device *dev, uint32_t mask) { + struct reg_595_drv_data *const drv_data = (struct reg_595_drv_data *const)dev->data; + uint32_t buf; + int ret; + + /* Can't do SPI bus operations from an ISR */ + if (k_is_in_isr()) { + return -EWOULDBLOCK; + } + + k_sem_take(&drv_data->lock, K_FOREVER); + + buf = drv_data->gpio_cache; + buf ^= mask; + + ret = reg_595_write_registers(dev, buf); + + k_sem_give(&drv_data->lock); + return ret; +} + +static const struct gpio_driver_api api_table = { + .pin_configure = reg_595_pin_config, + .port_get_raw = reg_595_port_get_raw, + .port_set_masked_raw = reg_595_port_set_masked_raw, + .port_set_bits_raw = reg_595_port_set_bits_raw, + .port_clear_bits_raw = reg_595_port_clear_bits_raw, + .port_toggle_bits = reg_595_port_toggle_bits, +}; + +/** + * @brief Initialization function of 595 + * + * @param dev Device struct + * @return 0 if successful, failed otherwise. + */ +static int reg_595_init(const struct device *dev) { + const struct reg_595_config *const config = dev->config; + struct reg_595_drv_data *const drv_data = (struct reg_595_drv_data *const)dev->data; + + if (!device_is_ready(config->bus.bus)) { + LOG_ERR("Unable to get SPI bus device"); + return -ENODEV; + } + + k_sem_init(&drv_data->lock, 1, 1); + + return 0; +} + +#define GPIO_PORT_PIN_MASK_FROM_NGPIOS(ngpios) ((gpio_port_pins_t)(((uint64_t)1 << (ngpios)) - 1U)) + +#define GPIO_PORT_PIN_MASK_FROM_DT_INST(inst) \ + GPIO_PORT_PIN_MASK_FROM_NGPIOS(DT_INST_PROP(inst, ngpios)) + +#define REG_595_INIT(n) \ + static struct reg_595_config reg_595_##n##_config = { \ + .common = \ + { \ + .port_pin_mask = GPIO_PORT_PIN_MASK_FROM_DT_INST(n), \ + }, \ + .bus = \ + SPI_DT_SPEC_INST_GET(n, SPI_OP_MODE_MASTER | SPI_TRANSFER_MSB | SPI_WORD_SET(8), 0), \ + .ngpios = DT_INST_PROP(n, ngpios), \ + }; \ + \ + static struct reg_595_drv_data reg_595_##n##_drvdata = {}; \ + \ + /* This has to init after SPI master */ \ + DEVICE_DT_INST_DEFINE(n, reg_595_init, NULL, ®_595_##n##_drvdata, ®_595_##n##_config, \ + POST_KERNEL, CONFIG_GPIO_595_INIT_PRIORITY, &api_table); + +DT_INST_FOREACH_STATUS_OKAY(REG_595_INIT) diff --git a/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml b/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml new file mode 100644 index 00000000..43fa7511 --- /dev/null +++ b/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml @@ -0,0 +1,33 @@ +# +# Copyright (c) 2022 The ZMK Contributors +# +# SPDX-License-Identifier: MIT +# + +description: > + This is a representation of the 595 Shift Register. + +compatible: "zmk,gpio-595" + +include: [gpio-controller.yaml, spi-device.yaml] + +properties: + label: + required: true + + "#gpio-cells": + const: 2 + + ngpios: + type: int + required: true + enum: + - 8 + - 16 + - 24 + - 32 + description: Number of gpios supported + +gpio-cells: + - pin + - flags From 532c4b92678a98ff6ca14969fb0185c5cf5fa306 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 17 May 2022 21:38:59 -0400 Subject: [PATCH 008/289] refactor(build): Fixes for config/overlay loading. * Move to ZephyrBuildConfig package based on Zephyr best practices. * Support multiple shields properly, e.g. -DSHIELD="foo bar", which allows using existing upstream shields like `ssd1306_128x64` along with another ZMK shield. * Properly *add* the "ZMK config" .conf file to the conf file list, so that existing board .conf files in `app/boards/.conf` are properly honored still. Needed for overrides to usptream boards when combined with a local `.conf` file. --- app/CMakeLists.txt | 6 +- ...k_config.cmake => ZephyrBuildConfig.cmake} | 104 +++++++++++++----- 2 files changed, 76 insertions(+), 34 deletions(-) rename app/cmake/{zmk_config.cmake => ZephyrBuildConfig.cmake} (56%) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index c052e901..4b61fc72 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -1,18 +1,16 @@ cmake_minimum_required(VERSION 3.13.1) set(CONFIG_APPLICATION_DEFINED_SYSCALL true) -list(APPEND BOARD_ROOT ${CMAKE_SOURCE_DIR}) -list(APPEND DTS_ROOT ${CMAKE_SOURCE_DIR}) # Add our custom Zephyr module for drivers w/ syscalls, etc. list(APPEND DTS_ROOT ${CMAKE_SOURCE_DIR}/drivers/zephyr) +set(ZephyrBuildConfiguration_ROOT ${CMAKE_SOURCE_DIR}/cmake) + list(APPEND ZEPHYR_EXTRA_MODULES ${CMAKE_CURRENT_SOURCE_DIR}/drivers ) -include(cmake/zmk_config.cmake) - # Find Zephyr. This also loads Zephyr's build system. find_package(Zephyr REQUIRED HINTS ../zephyr) project(zmk) diff --git a/app/cmake/zmk_config.cmake b/app/cmake/ZephyrBuildConfig.cmake similarity index 56% rename from app/cmake/zmk_config.cmake rename to app/cmake/ZephyrBuildConfig.cmake index c8aa1a00..81b3eb9c 100644 --- a/app/cmake/zmk_config.cmake +++ b/app/cmake/ZephyrBuildConfig.cmake @@ -7,6 +7,9 @@ cmake_minimum_required(VERSION 3.15) +list(APPEND BOARD_ROOT ${APPLICATION_SOURCE_DIR}) +list(APPEND DTS_ROOT ${APPLICATION_SOURCE_DIR}) + get_property(cached_user_config_value CACHE ZMK_CONFIG PROPERTY VALUE) set(user_config_cli_argument ${cached_user_config_value}) # Either new or old @@ -57,9 +60,29 @@ if (ZMK_CONFIG) endif() endif() + +if(DEFINED SHIELD) + string(REPLACE " " ";" SHIELD_AS_LIST "${SHIELD}") +endif() + foreach(root ${BOARD_ROOT}) + set(shield_dir ${root}/boards/shields) + # Match the Kconfig.shield files in the shield directories to make sure we are + # finding shields, e.g. x_nucleo_iks01a1/Kconfig.shield + file(GLOB_RECURSE shields_refs_list ${shield_dir}/*/Kconfig.shield) + unset(SHIELD_LIST) + foreach(shields_refs ${shields_refs_list}) + get_filename_component(shield_path ${shields_refs} DIRECTORY) + file(GLOB shield_overlays RELATIVE ${shield_path} ${shield_path}/*.overlay) + foreach(overlay ${shield_overlays}) + get_filename_component(shield ${overlay} NAME_WE) + list(APPEND SHIELD_LIST ${shield}) + set(SHIELD_DIR_${shield} ${shield_path}) + endforeach() + endforeach() + if (EXISTS "${root}/boards/${BOARD}.overlay") - list(APPEND ZMK_DTC_FILES "${root}/boards/${BOARD}.overlay") + list(APPEND shield_dts_files "${root}/boards/${BOARD}.overlay") endif() if (NOT DEFINED BOARD_DIR_NAME) find_path(BOARD_DIR @@ -74,34 +97,58 @@ foreach(root ${BOARD_ROOT}) endif() if(DEFINED SHIELD) - find_path(shields_refs_list - NAMES ${SHIELD}.overlay - PATHS ${root}/boards/shields/* - NO_DEFAULT_PATH - ) - foreach(shield_path ${shields_refs_list}) - get_filename_component(SHIELD_DIR ${shield_path} NAME) - list(APPEND KEYMAP_DIRS ${shield_path}) + foreach(s ${SHIELD_AS_LIST}) + if(NOT ${s} IN_LIST SHIELD_LIST) + message(WARNING "Didn't find ${s}") + continue() + endif() + message(STATUS "Adding ${SHIELD_DIR_${s}}") + list(APPEND KEYMAP_DIRS ${SHIELD_DIR_${s}}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + list(APPEND SHIELD_DIR ${shield_dir_name}) endforeach() endif() endforeach() +# Give a shield like `kyria_rev2_left` we want to use `kyria_rev2` and `kyria` as candidate names for +# overlay/conf/keymap files. +if(DEFINED SHIELD) + foreach(s ${SHIELD_AS_LIST}) + message(STATUS ${SHIELD_DIR_${s}}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + string(REPLACE "_" ";" S_PIECES ${s}) + list(LENGTH S_PIECES S_PIECES_LEN) + while(NOT S_PIECES STREQUAL "") + list(POP_BACK S_PIECES) + list(JOIN S_PIECES "_" S_SUBSTR) + if (S_SUBSTR STREQUAL ${shield_dir_name}) + break() + endif() + list(APPEND shield_candidate_names ${S_SUBSTR}) + endwhile() + endforeach() +endif() + if (ZMK_CONFIG) if (EXISTS ${ZMK_CONFIG}) message(STATUS "ZMK Config directory: ${ZMK_CONFIG}") list(APPEND DTS_ROOT ${ZMK_CONFIG}) list(PREPEND KEYMAP_DIRS "${ZMK_CONFIG}") - if (SHIELD) - message(STATUS "Board: ${BOARD}, ${BOARD_DIR}, ${SHIELD}, ${SHIELD_DIR}") - list(APPEND overlay_candidates "${ZMK_CONFIG}/${SHIELD_DIR}.overlay") - list(APPEND overlay_candidates "${ZMK_CONFIG}/${SHIELD_DIR}_${BOARD}.overlay") - list(APPEND overlay_candidates "${ZMK_CONFIG}/${SHIELD}_${BOARD}.overlay") - list(APPEND overlay_candidates "${ZMK_CONFIG}/${SHIELD}.overlay") - list(APPEND config_candidates "${ZMK_CONFIG}/${SHIELD_DIR}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/${SHIELD_DIR}_${BOARD}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/${SHIELD}_${BOARD}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/${SHIELD}.conf") + if (DEFINED SHIELD) + foreach (s ${shield_candidate_names}) + if (DEFINED $SHIELD_DIR_${s}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + endif() + list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}_${BOARD}.overlay") + list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}.overlay") + if (NOT "${shield_dir_name}" STREQUAL "${s}") + list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}_${BOARD}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}.conf") + endif() + list(APPEND config_candidates "${ZMK_CONFIG}/${s}_${BOARD}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/${s}.conf") + endforeach() endif() # TODO: Board revisions? @@ -115,7 +162,7 @@ if (ZMK_CONFIG) foreach(overlay ${overlay_candidates}) if (EXISTS "${overlay}") message(STATUS "ZMK Config devicetree overlay: ${overlay}") - list(APPEND ZMK_DTC_FILES "${overlay}") + list(APPEND shield_dts_files "${overlay}") break() endif() endforeach() @@ -123,8 +170,7 @@ if (ZMK_CONFIG) foreach(conf ${config_candidates}) if (EXISTS "${conf}") message(STATUS "ZMK Config Kconfig: ${conf}") - set(CONF_FILE "${conf}") - break() + list(APPEND shield_conf_files "${conf}") endif() endforeach() else() @@ -135,22 +181,20 @@ endif() if(NOT KEYMAP_FILE) foreach(keymap_dir ${KEYMAP_DIRS}) - foreach(keymap_prefix ${SHIELD} ${SHIELD_DIR} ${BOARD} ${BOARD_DIR_NAME}) + foreach(keymap_prefix ${shield_candidate_names} ${SHIELD_AS_LIST} ${SHIELD_DIR} ${BOARD} ${BOARD_DIR_NAME}) if (EXISTS ${keymap_dir}/${keymap_prefix}.keymap) set(KEYMAP_FILE "${keymap_dir}/${keymap_prefix}.keymap" CACHE STRING "Selected keymap file") message(STATUS "Using keymap file: ${KEYMAP_FILE}") + set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) break() endif() endforeach() endforeach() +else() + message(STATUS "Using keymap file: ${KEYMAP_FILE}") + set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) endif() if (NOT KEYMAP_FILE) - message(FATAL_ERROR "Failed to locate keymap file!") -endif() - -list(APPEND ZMK_DTC_FILES ${KEYMAP_FILE}) - -if (ZMK_DTC_FILES) - string(REPLACE ";" " " DTC_OVERLAY_FILE "${ZMK_DTC_FILES}") + message(WARNING "Failed to locate keymap file!") endif() From 02a85e5d54eaa51dbd89a0cf762d9187da567a12 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 18 May 2022 15:27:56 -0400 Subject: [PATCH 009/289] chore: Add Hummingbiard/XIAO BLE to core coverage. --- app/core-coverage.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/core-coverage.yml b/app/core-coverage.yml index 6784287b..90470ba3 100644 --- a/app/core-coverage.yml +++ b/app/core-coverage.yml @@ -11,6 +11,8 @@ shield: include: - board: bdn9_rev2 - board: nice60 +- board: seeeduino_xiao_ble + shield: hummingbird - board: nrf52840_m2 shield: m60 - board: planck_rev6 From 9a9aef78c733636b65838265729b8bb45b202570 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 27 May 2022 15:40:11 -0400 Subject: [PATCH 010/289] refactor: Remove unneeded left/right conf files. --- app/boards/shields/kyria/kyria_rev2_left.conf | 0 app/boards/shields/kyria/kyria_rev2_right.conf | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/boards/shields/kyria/kyria_rev2_left.conf delete mode 100644 app/boards/shields/kyria/kyria_rev2_right.conf diff --git a/app/boards/shields/kyria/kyria_rev2_left.conf b/app/boards/shields/kyria/kyria_rev2_left.conf deleted file mode 100644 index e69de29b..00000000 diff --git a/app/boards/shields/kyria/kyria_rev2_right.conf b/app/boards/shields/kyria/kyria_rev2_right.conf deleted file mode 100644 index e69de29b..00000000 From d01bc6afc68390a5a48c51e3f1d9dcbb0d3eb597 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 4 Jun 2022 05:26:14 +0000 Subject: [PATCH 011/289] fix(build): Another check w/ upstrream shields. * Properly handle not finding a shield in the board roots. --- app/cmake/ZephyrBuildConfig.cmake | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/cmake/ZephyrBuildConfig.cmake b/app/cmake/ZephyrBuildConfig.cmake index 81b3eb9c..294098b4 100644 --- a/app/cmake/ZephyrBuildConfig.cmake +++ b/app/cmake/ZephyrBuildConfig.cmake @@ -114,8 +114,9 @@ endforeach() # overlay/conf/keymap files. if(DEFINED SHIELD) foreach(s ${SHIELD_AS_LIST}) - message(STATUS ${SHIELD_DIR_${s}}) - get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + if (DEFINED $SHIELD_DIR_${s}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + endif() string(REPLACE "_" ";" S_PIECES ${s}) list(LENGTH S_PIECES S_PIECES_LEN) while(NOT S_PIECES STREQUAL "") From b3c9c18feea07646432c0998f767f4cf9b76c399 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 4 Jun 2022 03:27:40 +0000 Subject: [PATCH 012/289] feat(behaviors): Continue on mods in caps word. * Continue caps word when mods are changed, and match the continue list on combination of explicit and implicit modifiers. --- app/src/behaviors/behavior_caps_word.c | 6 +++- .../continue-with-modifiers/events.patterns | 4 +++ .../keycode_events.snapshot | 20 +++++++++++ .../native_posix_64.keymap | 33 +++++++++++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 app/tests/caps-word/continue-with-modifiers/events.patterns create mode 100644 app/tests/caps-word/continue-with-modifiers/keycode_events.snapshot create mode 100644 app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 0423dc62..3842a31f 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -92,7 +93,9 @@ static bool caps_word_is_caps_includelist(const struct behavior_caps_word_config continuation->id, continuation->implicit_modifiers); if (continuation->page == usage_page && continuation->id == usage_id && - continuation->implicit_modifiers == implicit_modifiers) { + (continuation->implicit_modifiers & + (implicit_modifiers | zmk_hid_get_explicit_mods())) == + continuation->implicit_modifiers) { LOG_DBG("Continuing capsword, found included usage: 0x%02X - 0x%02X", usage_page, usage_id); return true; @@ -143,6 +146,7 @@ static int caps_word_keycode_state_changed_listener(const zmk_event_t *eh) { caps_word_enhance_usage(config, ev); if (!caps_word_is_alpha(ev->keycode) && !caps_word_is_numeric(ev->keycode) && + !is_mod(ev->usage_page, ev->keycode) && !caps_word_is_caps_includelist(config, ev->usage_page, ev->keycode, ev->implicit_modifiers)) { LOG_DBG("Deactivating caps_word for 0x%02X - 0x%02X", ev->usage_page, ev->keycode); diff --git a/app/tests/caps-word/continue-with-modifiers/events.patterns b/app/tests/caps-word/continue-with-modifiers/events.patterns new file mode 100644 index 00000000..dd4d3d3f --- /dev/null +++ b/app/tests/caps-word/continue-with-modifiers/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode_//p +s/.*hid_implicit_modifiers_//p +s/.*caps_word_enhance_usage/enhance_usage/p +s/.*caps_word_is_caps_includelist/caps_includelist/p \ No newline at end of file diff --git a/app/tests/caps-word/continue-with-modifiers/keycode_events.snapshot b/app/tests/caps-word/continue-with-modifiers/keycode_events.snapshot new file mode 100644 index 00000000..b4752fd4 --- /dev/null +++ b/app/tests/caps-word/continue-with-modifiers/keycode_events.snapshot @@ -0,0 +1,20 @@ +enhance_usage: Enhancing usage 0x04 with modifiers: 0x02 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x02 explicit_mods 0x00 +press: Modifiers set to 0x02 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +press: Modifiers set to 0x02 +caps_includelist: Comparing with 0x07 - 0x2D (with implicit mods: 0x02) +caps_includelist: Continuing capsword, found included usage: 0x07 - 0x2D +pressed: usage_page 0x07 keycode 0x2D implicit_mods 0x00 explicit_mods 0x00 +press: Modifiers set to 0x02 +released: usage_page 0x07 keycode 0x2D implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x02 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x00 +enhance_usage: Enhancing usage 0x04 with modifiers: 0x02 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x02 explicit_mods 0x00 +press: Modifiers set to 0x02 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x00 diff --git a/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap b/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap new file mode 100644 index 00000000..3053d5df --- /dev/null +++ b/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap @@ -0,0 +1,33 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +/ { + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; + + default_layer { + bindings = < + &caps_word &kp A + &kp LSHFT &kp MINUS + >; + }; + }; +}; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; +}; \ No newline at end of file From 1e8224c296fdba53c1bd949baa757a8cbdb822b1 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 4 Jun 2022 04:01:44 +0000 Subject: [PATCH 013/289] feat(behaviors): Add DEL/BSPC to continue list. * Continue caps word on delete/backspace by default now. Co-authored-by: Cem Aksoylar --- app/dts/behaviors/caps_word.dtsi | 2 +- docs/docs/behaviors/caps-word.md | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/dts/behaviors/caps_word.dtsi b/app/dts/behaviors/caps_word.dtsi index 57d5cab7..ac04e26b 100644 --- a/app/dts/behaviors/caps_word.dtsi +++ b/app/dts/behaviors/caps_word.dtsi @@ -12,7 +12,7 @@ compatible = "zmk,behavior-caps-word"; label = "CAPS_WORD"; #binding-cells = <0>; - continue-list = ; + continue-list = ; }; }; }; diff --git a/docs/docs/behaviors/caps-word.md b/docs/docs/behaviors/caps-word.md index ee493741..479e350f 100644 --- a/docs/docs/behaviors/caps-word.md +++ b/docs/docs/behaviors/caps-word.md @@ -23,8 +23,7 @@ Example: #### Continue List -By default, the caps word will remain active when any alphanumeric character or the underscore (`UNDERSCORE`) characters are pressed. Any other keycode sent, -will turn off caps word. If you would like to override this, you can set a new array of keys in the `continue-list` property in your keymap: +By default, the caps word will remain active when any alphanumeric character or underscore (`UNDERSCORE`), backspace (`BACKSPACE`), or delete (`DELETE`) characters are pressed. Any other non-modifier keycode sent will turn off caps word. If you would like to override this, you can set a new array of keys in the `continue-list` property in your keymap: ``` &caps_word { From 505c481f6a087919c976c90efae27a2baf0ec7d3 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 5 Jun 2022 03:34:07 +0000 Subject: [PATCH 014/289] fix: Fixed conf file loading. * Properly locate conf files for the shield dir name. --- app/cmake/ZephyrBuildConfig.cmake | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/cmake/ZephyrBuildConfig.cmake b/app/cmake/ZephyrBuildConfig.cmake index 294098b4..469f5761 100644 --- a/app/cmake/ZephyrBuildConfig.cmake +++ b/app/cmake/ZephyrBuildConfig.cmake @@ -121,11 +121,11 @@ if(DEFINED SHIELD) list(LENGTH S_PIECES S_PIECES_LEN) while(NOT S_PIECES STREQUAL "") list(POP_BACK S_PIECES) - list(JOIN S_PIECES "_" S_SUBSTR) - if (S_SUBSTR STREQUAL ${shield_dir_name}) + list(JOIN S_PIECES "_" s_substr) + if ("%{s_substr}" STREQUAL "" OR "${s_substr}" STREQUAL ${shield_dir_name}) break() endif() - list(APPEND shield_candidate_names ${S_SUBSTR}) + list(APPEND shield_candidate_names ${s_substr}) endwhile() endforeach() endif() @@ -133,12 +133,11 @@ endif() if (ZMK_CONFIG) if (EXISTS ${ZMK_CONFIG}) message(STATUS "ZMK Config directory: ${ZMK_CONFIG}") - list(APPEND DTS_ROOT ${ZMK_CONFIG}) list(PREPEND KEYMAP_DIRS "${ZMK_CONFIG}") if (DEFINED SHIELD) - foreach (s ${shield_candidate_names}) - if (DEFINED $SHIELD_DIR_${s}) + foreach (s ${shield_candidate_names} ${SHIELD_AS_LIST}) + if (DEFINED ${SHIELD_DIR_${s}}) get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) endif() list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}_${BOARD}.overlay") From b5e73204e85ae656ae7b1d2ef4b2d196c61a7713 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 5 Jun 2022 05:56:45 +0000 Subject: [PATCH 015/289] fix(drivers): Avoid build failures for GPIO driver * Avoid defining the ZMK GPIO drivers lib if none of the drivers are selected. --- app/drivers/CMakeLists.txt | 2 +- app/drivers/gpio/Kconfig | 3 +++ app/drivers/gpio/Kconfig.595 | 1 + app/drivers/gpio/Kconfig.mcp23017 | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/drivers/CMakeLists.txt b/app/drivers/CMakeLists.txt index c58ada48..44d69ac3 100644 --- a/app/drivers/CMakeLists.txt +++ b/app/drivers/CMakeLists.txt @@ -1,7 +1,7 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT -add_subdirectory(gpio) +add_subdirectory_ifdef(CONFIG_ZMK_DRIVERS_GPIO gpio) add_subdirectory(kscan) add_subdirectory(sensor) add_subdirectory(display) diff --git a/app/drivers/gpio/Kconfig b/app/drivers/gpio/Kconfig index 336d60b9..e6f8bfb8 100644 --- a/app/drivers/gpio/Kconfig +++ b/app/drivers/gpio/Kconfig @@ -1,2 +1,5 @@ +menuconfig ZMK_DRIVERS_GPIO + bool "GPIO" + rsource "Kconfig.mcp23017" rsource "Kconfig.595" \ No newline at end of file diff --git a/app/drivers/gpio/Kconfig.595 b/app/drivers/gpio/Kconfig.595 index b863adcb..f43e807b 100644 --- a/app/drivers/gpio/Kconfig.595 +++ b/app/drivers/gpio/Kconfig.595 @@ -10,6 +10,7 @@ menuconfig GPIO_595 default $(dt_compat_enabled,$(DT_COMPAT_ZMK_GPIO_595)) depends on SPI select HAS_DTS_GPIO + select ZMK_DRIVERS_GPIO help Enable driver for 595 shift register chip using SPI. diff --git a/app/drivers/gpio/Kconfig.mcp23017 b/app/drivers/gpio/Kconfig.mcp23017 index 4953b924..049ca82e 100644 --- a/app/drivers/gpio/Kconfig.mcp23017 +++ b/app/drivers/gpio/Kconfig.mcp23017 @@ -7,6 +7,7 @@ menuconfig GPIO_MCP23017 bool "MCP23017 I2C-based GPIO chip" depends on I2C select HAS_DTS_GPIO + select ZMK_DRIVERS_GPIO help Enable driver for MCP23017 I2C-based GPIO chip. From a7e857f7e10d4415580d5099cd4e0ae05fb47fb7 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 6 Jun 2022 14:34:15 +0000 Subject: [PATCH 016/289] fix(docs): Fix acorn dep in package lock file. * Use npm version matching Netlify to fix up our lock file. --- docs/package-lock.json | 97 +++++++++++------------------------------- 1 file changed, 24 insertions(+), 73 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index ad062dcc..06a79af0 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -4254,9 +4254,9 @@ } }, "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", "bin": { "acorn": "bin/acorn" }, @@ -7107,6 +7107,18 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/espree/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "devOptional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", @@ -7801,19 +7813,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -8406,17 +8405,6 @@ "node": ">=12" } }, - "node_modules/html-minifier-terser/node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/html-minifier-terser/node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -14455,17 +14443,6 @@ "node": ">= 10.13.0" } }, - "node_modules/webpack-bundle-analyzer/node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/webpack-bundle-analyzer/node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -14696,17 +14673,6 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, - "node_modules/webpack/node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/webpack/node_modules/enhanced-resolve": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", @@ -18232,9 +18198,9 @@ } }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" }, "acorn-import-assertions": { "version": "1.8.0", @@ -20335,6 +20301,12 @@ "eslint-visitor-keys": "^1.3.0" }, "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "devOptional": true + }, "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", @@ -20854,12 +20826,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -21312,11 +21278,6 @@ "terser": "^5.10.0" }, "dependencies": { - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" - }, "commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -25647,11 +25608,6 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" - }, "enhanced-resolve": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", @@ -25679,11 +25635,6 @@ "ws": "^7.3.1" }, "dependencies": { - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" - }, "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", From 11ac8c4782a01c27268854e4289a0059b23e4a96 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 7 Jun 2022 19:43:23 -0400 Subject: [PATCH 017/289] fix(build): Fix for proper string variable check. * Properly load variable for comparison for shield name substring calculations. --- app/cmake/ZephyrBuildConfig.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/cmake/ZephyrBuildConfig.cmake b/app/cmake/ZephyrBuildConfig.cmake index 469f5761..931dd7ac 100644 --- a/app/cmake/ZephyrBuildConfig.cmake +++ b/app/cmake/ZephyrBuildConfig.cmake @@ -122,7 +122,7 @@ if(DEFINED SHIELD) while(NOT S_PIECES STREQUAL "") list(POP_BACK S_PIECES) list(JOIN S_PIECES "_" s_substr) - if ("%{s_substr}" STREQUAL "" OR "${s_substr}" STREQUAL ${shield_dir_name}) + if ("${s_substr}" STREQUAL "" OR "${s_substr}" STREQUAL "${shield_dir_name}") break() endif() list(APPEND shield_candidate_names ${s_substr}) From 4af3d272fcbfa363673981fc19fc15338b2432ae Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 5 Jan 2022 04:03:50 +0000 Subject: [PATCH 018/289] fix(keymaps): Handle matching `then-layer`s. * Proporly handle multiple conditonal layers w/ the same target `then-layer` values. * Move handling to work callback, to avoid re-entrance for cascading layers enabling other layers. --- app/src/conditional_layer.c | 58 ++++++++++++--- .../events.patterns | 3 + .../keycode_events.snapshot | 20 +++++ .../native_posix_64.keymap | 73 +++++++++++++++++++ .../events.patterns | 3 + .../keycode_events.snapshot | 16 ++++ .../native_posix_64.keymap | 69 ++++++++++++++++++ .../tri-layer-lt/events.patterns | 3 + .../tri-layer-lt/keycode_events.snapshot | 8 ++ .../tri-layer-lt/native_posix_64.keymap | 56 ++++++++++++++ 10 files changed, 297 insertions(+), 12 deletions(-) create mode 100644 app/tests/conditional-layer/same-layer-reached-both-ways/events.patterns create mode 100644 app/tests/conditional-layer/same-layer-reached-both-ways/keycode_events.snapshot create mode 100644 app/tests/conditional-layer/same-layer-reached-both-ways/native_posix_64.keymap create mode 100644 app/tests/conditional-layer/same-layer-reached-differently/events.patterns create mode 100644 app/tests/conditional-layer/same-layer-reached-differently/keycode_events.snapshot create mode 100644 app/tests/conditional-layer/same-layer-reached-differently/native_posix_64.keymap create mode 100644 app/tests/conditional-layer/tri-layer-lt/events.patterns create mode 100644 app/tests/conditional-layer/tri-layer-lt/keycode_events.snapshot create mode 100644 app/tests/conditional-layer/tri-layer-lt/native_posix_64.keymap diff --git a/app/src/conditional_layer.c b/app/src/conditional_layer.c index 4beb87e3..1728a7f4 100644 --- a/app/src/conditional_layer.c +++ b/app/src/conditional_layer.c @@ -7,6 +7,7 @@ #define DT_DRV_COMPAT zmk_conditional_layers #include +#include #include #include @@ -19,6 +20,8 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) +static K_SEM_DEFINE(conditional_layer_sem, 1, 1); + // Conditional layer configuration that activates the specified then-layer when all if-layers are // active. With two if-layers, this is referred to as "tri-layer", and is commonly used to activate // a third "adjust" layer if and only if the "lower" and "raise" layers are both active. @@ -66,22 +69,53 @@ static void conditional_layer_deactivate(int8_t layer) { } } -// On layer state changes, examines each conditional layer config to determine if then-layer in the -// config should activate based on the currently active set of if-layers. static int layer_state_changed_listener(const zmk_event_t *ev) { - for (int i = 0; i < NUM_CONDITIONAL_LAYER_CFGS; i++) { - const struct conditional_layer_cfg *cfg = CONDITIONAL_LAYER_CFGS + i; - zmk_keymap_layers_state_t mask = cfg->if_layers_state_mask; + static bool conditional_layer_updates_needed; - // Activate then-layer if and only if all if-layers are already active. Note that we - // reevaluate the current layer state for each config since activation of one layer can also - // trigger activation of another. - if ((zmk_keymap_layer_state() & mask) == mask) { - conditional_layer_activate(cfg->then_layer); - } else { - conditional_layer_deactivate(cfg->then_layer); + conditional_layer_updates_needed = true; + + // Semaphore ensures we don't re-enter the loop in the middle of doing update, and + // ensures that "waterfalling layer updates" are all processed to trigger subsequent + // nested conditional layers properly. + if (k_sem_take(&conditional_layer_sem, K_NO_WAIT) < 0) { + return 0; + } + + while (conditional_layer_updates_needed) { + int8_t max_then_layer = -1; + uint32_t then_layers = 0; + uint32_t then_layer_state = 0; + + conditional_layer_updates_needed = false; + + // On layer state changes, examines each conditional layer config to determine if then-layer + // in the config should activate based on the currently active set of if-layers. + for (int i = 0; i < NUM_CONDITIONAL_LAYER_CFGS; i++) { + const struct conditional_layer_cfg *cfg = CONDITIONAL_LAYER_CFGS + i; + zmk_keymap_layers_state_t mask = cfg->if_layers_state_mask; + then_layers |= BIT(cfg->then_layer); + max_then_layer = MAX(max_then_layer, cfg->then_layer); + + // Activate then-layer if and only if all if-layers are already active. Note that we + // reevaluate the current layer state for each config since activation of one layer can + // also trigger activation of another. + if ((zmk_keymap_layer_state() & mask) == mask) { + then_layer_state |= BIT(cfg->then_layer); + } + } + + for (uint8_t layer = 0; layer <= max_then_layer; layer++) { + if ((BIT(layer) & then_layers) != 0U) { + if ((BIT(layer) & then_layer_state) != 0U) { + conditional_layer_activate(layer); + } else { + conditional_layer_deactivate(layer); + } + } } } + + k_sem_give(&conditional_layer_sem); return 0; } diff --git a/app/tests/conditional-layer/same-layer-reached-both-ways/events.patterns b/app/tests/conditional-layer/same-layer-reached-both-ways/events.patterns new file mode 100644 index 00000000..14ded795 --- /dev/null +++ b/app/tests/conditional-layer/same-layer-reached-both-ways/events.patterns @@ -0,0 +1,3 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*conditional_layer/cl/p diff --git a/app/tests/conditional-layer/same-layer-reached-both-ways/keycode_events.snapshot b/app/tests/conditional-layer/same-layer-reached-both-ways/keycode_events.snapshot new file mode 100644 index 00000000..49fc0f87 --- /dev/null +++ b/app/tests/conditional-layer/same-layer-reached-both-ways/keycode_events.snapshot @@ -0,0 +1,20 @@ +mo_pressed: position 2 layer 1 +mo_pressed: position 3 layer 2 +cl_activate: layer 4 +mo_pressed: position 1 layer 3 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +mo_released: position 1 layer 3 +mo_released: position 3 layer 2 +cl_deactivate: layer 4 +mo_released: position 2 layer 1 +mo_pressed: position 1 layer 3 +mo_pressed: position 2 layer 1 +cl_activate: layer 4 +mo_pressed: position 3 layer 2 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +mo_released: position 3 layer 2 +mo_released: position 2 layer 1 +cl_deactivate: layer 4 +mo_released: position 1 layer 3 diff --git a/app/tests/conditional-layer/same-layer-reached-both-ways/native_posix_64.keymap b/app/tests/conditional-layer/same-layer-reached-both-ways/native_posix_64.keymap new file mode 100644 index 00000000..c94dcef2 --- /dev/null +++ b/app/tests/conditional-layer/same-layer-reached-both-ways/native_posix_64.keymap @@ -0,0 +1,73 @@ +#include +#include +#include + +/ { + conditional_layers { + compatible = "zmk,conditional-layers"; + conditional_layer_1 { + if-layers = <1 2>; + then-layer = <4>; + }; + conditional_layer_2 { + if-layers = <1 3>; + then-layer = <4>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + &kp A &mo 3 + &mo 1 &mo 2 + >; + }; + layer_1 { + bindings = < + &kp B &trans + &trans &trans + >; + }; + layer_2 { + bindings = < + &kp C &trans + &trans &trans + >; + }; + layer_3 { + bindings = < + &kp D &trans + &trans &trans + >; + }; + layer_4 { + bindings = < + &kp E &trans + &trans &trans + >; + }; + }; +}; + +&kscan { + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; +}; diff --git a/app/tests/conditional-layer/same-layer-reached-differently/events.patterns b/app/tests/conditional-layer/same-layer-reached-differently/events.patterns new file mode 100644 index 00000000..14ded795 --- /dev/null +++ b/app/tests/conditional-layer/same-layer-reached-differently/events.patterns @@ -0,0 +1,3 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*conditional_layer/cl/p diff --git a/app/tests/conditional-layer/same-layer-reached-differently/keycode_events.snapshot b/app/tests/conditional-layer/same-layer-reached-differently/keycode_events.snapshot new file mode 100644 index 00000000..86371d2f --- /dev/null +++ b/app/tests/conditional-layer/same-layer-reached-differently/keycode_events.snapshot @@ -0,0 +1,16 @@ +mo_pressed: position 2 layer 1 +mo_pressed: position 3 layer 2 +cl_activate: layer 4 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +mo_released: position 3 layer 2 +cl_deactivate: layer 4 +mo_released: position 2 layer 1 +mo_pressed: position 1 layer 3 +mo_pressed: position 2 layer 1 +cl_activate: layer 4 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +mo_released: position 2 layer 1 +cl_deactivate: layer 4 +mo_released: position 1 layer 3 diff --git a/app/tests/conditional-layer/same-layer-reached-differently/native_posix_64.keymap b/app/tests/conditional-layer/same-layer-reached-differently/native_posix_64.keymap new file mode 100644 index 00000000..fd127d05 --- /dev/null +++ b/app/tests/conditional-layer/same-layer-reached-differently/native_posix_64.keymap @@ -0,0 +1,69 @@ +#include +#include +#include + +/ { + conditional_layers { + compatible = "zmk,conditional-layers"; + conditional_layer_1 { + if-layers = <1 2>; + then-layer = <4>; + }; + conditional_layer_2 { + if-layers = <1 3>; + then-layer = <4>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + &kp A &mo 3 + &mo 1 &mo 2 + >; + }; + layer_1 { + bindings = < + &kp B &trans + &trans &trans + >; + }; + layer_2 { + bindings = < + &kp C &trans + &trans &trans + >; + }; + layer_3 { + bindings = < + &kp D &trans + &trans &trans + >; + }; + layer_4 { + bindings = < + &kp E &trans + &trans &trans + >; + }; + }; +}; + +&kscan { + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; +}; diff --git a/app/tests/conditional-layer/tri-layer-lt/events.patterns b/app/tests/conditional-layer/tri-layer-lt/events.patterns new file mode 100644 index 00000000..6a0e3bdc --- /dev/null +++ b/app/tests/conditional-layer/tri-layer-lt/events.patterns @@ -0,0 +1,3 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*conditional_layer/cl/p \ No newline at end of file diff --git a/app/tests/conditional-layer/tri-layer-lt/keycode_events.snapshot b/app/tests/conditional-layer/tri-layer-lt/keycode_events.snapshot new file mode 100644 index 00000000..cb452df5 --- /dev/null +++ b/app/tests/conditional-layer/tri-layer-lt/keycode_events.snapshot @@ -0,0 +1,8 @@ +mo_pressed: position 2 layer 1 +mo_pressed: position 3 layer 2 +cl_activate: layer 3 +kp_pressed: usage_page 0x07 keycode 0x0A implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0A implicit_mods 0x00 explicit_mods 0x00 +mo_released: position 3 layer 2 +cl_deactivate: layer 3 +mo_released: position 2 layer 1 diff --git a/app/tests/conditional-layer/tri-layer-lt/native_posix_64.keymap b/app/tests/conditional-layer/tri-layer-lt/native_posix_64.keymap new file mode 100644 index 00000000..7a091609 --- /dev/null +++ b/app/tests/conditional-layer/tri-layer-lt/native_posix_64.keymap @@ -0,0 +1,56 @@ +#include +#include +#include + +< { + flavor = "balanced"; +}; + +/ { + conditional_layers { + compatible = "zmk,conditional-layers"; + tri_layer { + if-layers = <1 2>; + then-layer = <3>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + &kp A &kp B + < 1 I < 2 J + >; + }; + layer_1 { + bindings = < + &kp C &kp D + &trans &trans + >; + }; + layer_2 { + bindings = < + &kp E &kp F + &trans &trans + >; + }; + layer_3 { + bindings = < + &kp G &kp H + &trans &trans + >; + }; + }; +}; + +&kscan { + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; +}; From 53bec710d869440508ebc03fe99bf72d7a8466bc Mon Sep 17 00:00:00 2001 From: WSTRN <45993771+WSTRN@users.noreply.github.com> Date: Fri, 10 Jun 2022 01:54:36 +0800 Subject: [PATCH 019/289] fix(displays): Proper battery charge icon sizing --- app/src/display/widgets/battery_status.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/display/widgets/battery_status.c b/app/src/display/widgets/battery_status.c index d74cc8ed..3dfcdb47 100644 --- a/app/src/display/widgets/battery_status.c +++ b/app/src/display/widgets/battery_status.c @@ -76,7 +76,7 @@ ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent) { widget->obj = lv_label_create(parent, NULL); - lv_obj_set_size(widget->obj, 40, 15); + lv_obj_set_size(widget->obj, 43, 15); sys_slist_append(&widgets, &widget->node); From 3d2bd017472c57f4b3860033f989a44f094febaa Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 8 Jun 2022 03:44:29 +0000 Subject: [PATCH 020/289] fix(split): Raise release events on disconnect. * When a peripheral disconnects from a centraly, raise position events to release any active positions from that peripheral. --- app/src/split/bluetooth/central.c | 36 ++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 2f02faaf..e94a59ae 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -54,6 +54,16 @@ static const struct bt_uuid_128 split_service_uuid = BT_UUID_INIT_128(ZMK_SPLIT_ K_MSGQ_DEFINE(peripheral_event_msgq, sizeof(struct zmk_position_state_changed), CONFIG_ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE, 4); +void peripheral_event_work_callback(struct k_work *work) { + struct zmk_position_state_changed ev; + while (k_msgq_get(&peripheral_event_msgq, &ev, K_NO_WAIT) == 0) { + LOG_DBG("Trigger key position state change for %d", ev.position); + ZMK_EVENT_RAISE(new_zmk_position_state_changed(ev)); + } +} + +K_WORK_DEFINE(peripheral_event_work, peripheral_event_work_callback); + int peripheral_slot_index_for_conn(struct bt_conn *conn) { for (int i = 0; i < ZMK_BLE_SPLIT_PERIPHERAL_COUNT; i++) { if (peripherals[i].conn == conn) { @@ -92,6 +102,22 @@ int release_peripheral_slot(int index) { } slot->state = PERIPHERAL_SLOT_STATE_OPEN; + // Raise events releasing any active positions from this peripheral + for (int i = 0; i < POSITION_STATE_DATA_LEN; i++) { + for (int j = 0; j < 8; j++) { + if (slot->position_state[i] & BIT(j)) { + uint32_t position = (i * 8) + j; + struct zmk_position_state_changed ev = {.source = index, + .position = position, + .state = false, + .timestamp = k_uptime_get()}; + + k_msgq_put(&peripheral_event_msgq, &ev, K_NO_WAIT); + k_work_submit(&peripheral_event_work); + } + } + } + for (int i = 0; i < POSITION_STATE_DATA_LEN; i++) { slot->position_state[i] = 0U; slot->changed_positions[i] = 0U; @@ -136,16 +162,6 @@ int confirm_peripheral_slot_conn(struct bt_conn *conn) { return 0; } -void peripheral_event_work_callback(struct k_work *work) { - struct zmk_position_state_changed ev; - while (k_msgq_get(&peripheral_event_msgq, &ev, K_NO_WAIT) == 0) { - LOG_DBG("Trigger key position state change for %d", ev.position); - ZMK_EVENT_RAISE(new_zmk_position_state_changed(ev)); - } -} - -K_WORK_DEFINE(peripheral_event_work, peripheral_event_work_callback); - static uint8_t split_central_notify_func(struct bt_conn *conn, struct bt_gatt_subscribe_params *params, const void *data, uint16_t length) { From db437574615237daeadda3f80b6e733522029c9b Mon Sep 17 00:00:00 2001 From: Kurtis Lew Date: Tue, 14 Jun 2022 13:29:52 -0700 Subject: [PATCH 021/289] fix(shields): Fix indentation in two_percent_milk.keymap --- .../two_percent_milk/two_percent_milk.keymap | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/boards/shields/two_percent_milk/two_percent_milk.keymap b/app/boards/shields/two_percent_milk/two_percent_milk.keymap index 71152de2..04dc4c0d 100644 --- a/app/boards/shields/two_percent_milk/two_percent_milk.keymap +++ b/app/boards/shields/two_percent_milk/two_percent_milk.keymap @@ -4,19 +4,19 @@ * SPDX-License-Identifier: MIT */ - #include - #include - #include +#include +#include +#include - / { - keymap { - compatible = "zmk,keymap"; +/ { + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp X - &kp Z - >; - }; - }; - }; \ No newline at end of file + default_layer { + bindings = < + &kp X + &kp Z + >; + }; + }; +}; \ No newline at end of file From d7bd81e5c4b24b664e1f1172f6e0f757dd2e3ca1 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 11 Nov 2021 18:36:29 +0000 Subject: [PATCH 022/289] fix(usb): Correctly detect USB connection status. * Fix detection of USB power vs. configuration, to ensure endpoint selection works properly with power-only USB attached. --- app/src/usb.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/usb.c b/app/src/usb.c index 8d2b62f1..5f170ee6 100644 --- a/app/src/usb.c +++ b/app/src/usb.c @@ -31,16 +31,16 @@ enum usb_dc_status_code zmk_usb_get_status() { return usb_status; } enum zmk_usb_conn_state zmk_usb_get_conn_state() { LOG_DBG("state: %d", usb_status); switch (usb_status) { + case USB_DC_SUSPEND: + case USB_DC_CONFIGURED: + return ZMK_USB_CONN_HID; + case USB_DC_DISCONNECTED: case USB_DC_UNKNOWN: return ZMK_USB_CONN_NONE; - case USB_DC_ERROR: - case USB_DC_RESET: - return ZMK_USB_CONN_POWERED; - default: - return ZMK_USB_CONN_HID; + return ZMK_USB_CONN_POWERED; } } From edc60e58488c6b867066c79243752cc5fd4bcf8c Mon Sep 17 00:00:00 2001 From: Kurtis Lew Date: Mon, 20 Jun 2022 18:27:58 -0700 Subject: [PATCH 023/289] fix(docs): Update keycode usage ID for numeric 4 in key-press.md Co-Authored-By: Robert U <978080+urob@users.noreply.github.com> --- docs/docs/behaviors/key-press.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/behaviors/key-press.md b/docs/docs/behaviors/key-press.md index 12d4094f..e8304d77 100644 --- a/docs/docs/behaviors/key-press.md +++ b/docs/docs/behaviors/key-press.md @@ -40,7 +40,7 @@ The "key press" behavior sends standard keycodes on press/release. ### Behavior Binding - Reference: `&kp` -- Parameter: The keycode usage ID from the usage page, e.g. `4` or `A` +- Parameter: The keycode usage ID from the usage page, e.g. `N4` or `A` Example: From 709441412ab538b2a6c061a39d3802ee000f2b42 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 22 Jun 2022 16:21:18 -0400 Subject: [PATCH 024/289] fix: Don't exclude segger, needed for DKs. --- app/west.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/west.yml b/app/west.yml index f7e1ae12..a0c56501 100644 --- a/app/west.yml +++ b/app/west.yml @@ -27,7 +27,6 @@ manifest: - mcuboot - mcumgr - net-tools - - segger - openthread - edtt - trusted-firmware-m From 38e079ef37a871d9abdd932466973d33a310fb97 Mon Sep 17 00:00:00 2001 From: ReFil Date: Thu, 23 Jun 2022 15:15:18 +0100 Subject: [PATCH 025/289] fix(backlight): Improve initial power on behaviour --- app/src/backlight.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/backlight.c b/app/src/backlight.c index e8708642..28a93e73 100644 --- a/app/src/backlight.c +++ b/app/src/backlight.c @@ -91,7 +91,9 @@ static int zmk_backlight_init(const struct device *_arg) { LOG_ERR("Failed to load backlight settings: %d", rc); } #endif - +#if IS_ENABLED(CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB) + state.on = zmk_usb_is_powered(); +#endif return zmk_backlight_update(); } From 90e070b427e28b83eb6b55620e2dee6627075374 Mon Sep 17 00:00:00 2001 From: ReFil <31960031+ReFil@users.noreply.github.com> Date: Sat, 25 Jun 2022 15:56:36 +0100 Subject: [PATCH 026/289] feat(underglow): Add RGB auto off timeout on idle and on usb disconnect Two new options for functionality to enable/disable RGB for USB status or idle events. Co-authored-by: Pete Johanson Co-authored-by: ReFil --- app/Kconfig | 7 +++++ app/src/rgb_underglow.c | 63 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 4bcd88b0..f89d3279 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -243,6 +243,13 @@ config ZMK_RGB_UNDERGLOW_ON_START bool "RGB underglow starts on by default" default y +config ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE + bool "Turn off RGB underglow when keyboard goes into idle state" + +config ZMK_RGB_UNDERGLOW_AUTO_OFF_USB + bool "Turn off RGB underglow when USB is disconnected" + depends on USB_DEVICE_STACK + #ZMK_RGB_UNDERGLOW endif diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 517da1b8..25d4466e 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -19,6 +19,12 @@ #include +#include +#include +#include +#include +#include + LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define STRIP_LABEL DT_LABEL(DT_CHOSEN(zmk_underglow)) @@ -265,7 +271,13 @@ static int zmk_rgb_underglow_init(const struct device *_arg) { settings_load_subtree("rgb/underglow"); #endif - k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(50)); +#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB) + state.on = zmk_usb_is_powered(); +#endif + + if (state.on) { + k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(50)); + } return 0; } @@ -444,4 +456,53 @@ int zmk_rgb_underglow_change_spd(int direction) { return zmk_rgb_underglow_save_state(); } +#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE) || \ + IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB) +static int rgb_underglow_auto_state(bool *prev_state, bool new_state) { + if (state.on == new_state) { + return 0; + } + if (new_state) { + state.on = *prev_state; + *prev_state = false; + return zmk_rgb_underglow_on(); + } else { + state.on = false; + *prev_state = true; + return zmk_rgb_underglow_off(); + } +} + +static int rgb_underglow_event_listener(const zmk_event_t *eh) { + +#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE) + if (as_zmk_activity_state_changed(eh)) { + static bool prev_state = false; + return rgb_underglow_auto_state(&prev_state, + zmk_activity_get_state() == ZMK_ACTIVITY_ACTIVE); + } +#endif + +#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB) + if (as_zmk_usb_conn_state_changed(eh)) { + static bool prev_state = false; + return rgb_underglow_auto_state(&prev_state, zmk_usb_is_powered()); + } +#endif + + return -ENOTSUP; +} + +ZMK_LISTENER(rgb_underglow, rgb_underglow_event_listener); +#endif // IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE) || + // IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB) + +#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE) +ZMK_SUBSCRIPTION(rgb_underglow, zmk_activity_state_changed); +#endif + +#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB) +ZMK_SUBSCRIPTION(rgb_underglow, zmk_usb_conn_state_changed); +#endif + SYS_INIT(zmk_rgb_underglow_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); From da209c453eac57b9bb3818a81ad9b20345618c4b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 20 Jun 2022 03:54:19 +0000 Subject: [PATCH 027/289] refactor(shields): Remove res max Kconfigs * Horizontal/Vertical resolution max is now defaulted from the DTS chosen display automatically, so remove the duplication in our shield Kconfig. --- app/boards/shields/corne/Kconfig.defconfig | 6 ------ app/boards/shields/elephant42/Kconfig.defconfig | 6 ------ app/boards/shields/jorne/Kconfig.defconfig | 6 ------ app/boards/shields/knob_goblin/Kconfig.defconfig | 6 ------ app/boards/shields/kyria/Kconfig.defconfig | 6 ------ app/boards/shields/leeloo/Kconfig.defconfig | 5 ----- app/boards/shields/lily58/Kconfig.defconfig | 6 ------ app/boards/shields/lotus58/Kconfig.defconfig | 6 ------ app/boards/shields/microdox/Kconfig.defconfig | 6 ------ app/boards/shields/murphpad/Kconfig.defconfig | 6 ------ app/boards/shields/nibble/Kconfig.defconfig | 6 ------ app/boards/shields/sofle/Kconfig.defconfig | 6 ------ app/boards/shields/tidbit/Kconfig.defconfig | 6 ------ app/boards/shields/zodiark/Kconfig.defconfig | 6 ------ 14 files changed, 83 deletions(-) diff --git a/app/boards/shields/corne/Kconfig.defconfig b/app/boards/shields/corne/Kconfig.defconfig index 31ca73fd..9160555c 100644 --- a/app/boards/shields/corne/Kconfig.defconfig +++ b/app/boards/shields/corne/Kconfig.defconfig @@ -28,12 +28,6 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_HOR_RES_MAX - default 128 - -config LVGL_VER_RES_MAX - default 32 - config LVGL_VDB_SIZE default 64 diff --git a/app/boards/shields/elephant42/Kconfig.defconfig b/app/boards/shields/elephant42/Kconfig.defconfig index 051e3e89..1e93762c 100644 --- a/app/boards/shields/elephant42/Kconfig.defconfig +++ b/app/boards/shields/elephant42/Kconfig.defconfig @@ -31,12 +31,6 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_HOR_RES_MAX - default 128 - -config LVGL_VER_RES_MAX - default 32 - config LVGL_VDB_SIZE default 64 diff --git a/app/boards/shields/jorne/Kconfig.defconfig b/app/boards/shields/jorne/Kconfig.defconfig index 8d4dfb99..64eb32b8 100644 --- a/app/boards/shields/jorne/Kconfig.defconfig +++ b/app/boards/shields/jorne/Kconfig.defconfig @@ -29,12 +29,6 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_HOR_RES_MAX - default 128 - -config LVGL_VER_RES_MAX - default 32 - config LVGL_VDB_SIZE default 64 diff --git a/app/boards/shields/knob_goblin/Kconfig.defconfig b/app/boards/shields/knob_goblin/Kconfig.defconfig index 07df5996..300fb4eb 100644 --- a/app/boards/shields/knob_goblin/Kconfig.defconfig +++ b/app/boards/shields/knob_goblin/Kconfig.defconfig @@ -21,12 +21,6 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_HOR_RES_MAX - default 128 - -config LVGL_VER_RES_MAX - default 32 - config LVGL_VDB_SIZE default 64 diff --git a/app/boards/shields/kyria/Kconfig.defconfig b/app/boards/shields/kyria/Kconfig.defconfig index 2995daac..0da8a18d 100644 --- a/app/boards/shields/kyria/Kconfig.defconfig +++ b/app/boards/shields/kyria/Kconfig.defconfig @@ -29,12 +29,6 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_HOR_RES_MAX - default 128 - -config LVGL_VER_RES_MAX - default 64 - config LVGL_VDB_SIZE default 64 diff --git a/app/boards/shields/leeloo/Kconfig.defconfig b/app/boards/shields/leeloo/Kconfig.defconfig index a3f4eff3..a4295d1e 100644 --- a/app/boards/shields/leeloo/Kconfig.defconfig +++ b/app/boards/shields/leeloo/Kconfig.defconfig @@ -31,11 +31,6 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_HOR_RES_MAX - default 128 - -config LVGL_VER_RES_MAX - default 32 config LVGL_VDB_SIZE default 64 diff --git a/app/boards/shields/lily58/Kconfig.defconfig b/app/boards/shields/lily58/Kconfig.defconfig index 7da758cd..a5e6fbe8 100644 --- a/app/boards/shields/lily58/Kconfig.defconfig +++ b/app/boards/shields/lily58/Kconfig.defconfig @@ -29,12 +29,6 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_HOR_RES_MAX - default 128 - -config LVGL_VER_RES_MAX - default 32 - config LVGL_VDB_SIZE default 64 diff --git a/app/boards/shields/lotus58/Kconfig.defconfig b/app/boards/shields/lotus58/Kconfig.defconfig index d108d7d8..57ae5ef6 100644 --- a/app/boards/shields/lotus58/Kconfig.defconfig +++ b/app/boards/shields/lotus58/Kconfig.defconfig @@ -31,12 +31,6 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_HOR_RES_MAX - default 128 - -config LVGL_VER_RES_MAX - default 32 - config LVGL_VDB_SIZE default 64 diff --git a/app/boards/shields/microdox/Kconfig.defconfig b/app/boards/shields/microdox/Kconfig.defconfig index 461e7c32..7bf40b8b 100644 --- a/app/boards/shields/microdox/Kconfig.defconfig +++ b/app/boards/shields/microdox/Kconfig.defconfig @@ -31,12 +31,6 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_HOR_RES_MAX - default 128 - -config LVGL_VER_RES_MAX - default 32 - config LVGL_VDB_SIZE default 64 diff --git a/app/boards/shields/murphpad/Kconfig.defconfig b/app/boards/shields/murphpad/Kconfig.defconfig index 8e205a8e..9f491564 100644 --- a/app/boards/shields/murphpad/Kconfig.defconfig +++ b/app/boards/shields/murphpad/Kconfig.defconfig @@ -21,12 +21,6 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_HOR_RES_MAX - default 128 - -config LVGL_VER_RES_MAX - default 32 - config LVGL_VDB_SIZE default 64 diff --git a/app/boards/shields/nibble/Kconfig.defconfig b/app/boards/shields/nibble/Kconfig.defconfig index 2df1d812..a1683f3a 100644 --- a/app/boards/shields/nibble/Kconfig.defconfig +++ b/app/boards/shields/nibble/Kconfig.defconfig @@ -25,12 +25,6 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_HOR_RES_MAX - default 128 - -config LVGL_VER_RES_MAX - default 32 - config LVGL_VDB_SIZE default 64 diff --git a/app/boards/shields/sofle/Kconfig.defconfig b/app/boards/shields/sofle/Kconfig.defconfig index bfa7c3a5..69dac3f2 100644 --- a/app/boards/shields/sofle/Kconfig.defconfig +++ b/app/boards/shields/sofle/Kconfig.defconfig @@ -31,12 +31,6 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_HOR_RES_MAX - default 128 - -config LVGL_VER_RES_MAX - default 32 - config LVGL_VDB_SIZE default 64 diff --git a/app/boards/shields/tidbit/Kconfig.defconfig b/app/boards/shields/tidbit/Kconfig.defconfig index 177e2675..013a0a7c 100644 --- a/app/boards/shields/tidbit/Kconfig.defconfig +++ b/app/boards/shields/tidbit/Kconfig.defconfig @@ -22,12 +22,6 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_HOR_RES_MAX - default 128 - -config LVGL_VER_RES_MAX - default 32 - config LVGL_VDB_SIZE default 64 diff --git a/app/boards/shields/zodiark/Kconfig.defconfig b/app/boards/shields/zodiark/Kconfig.defconfig index 7780abd2..76bfcbd4 100644 --- a/app/boards/shields/zodiark/Kconfig.defconfig +++ b/app/boards/shields/zodiark/Kconfig.defconfig @@ -31,12 +31,6 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_HOR_RES_MAX - default 128 - -config LVGL_VER_RES_MAX - default 64 - config LVGL_VDB_SIZE default 64 From ef3eb339ede6568c96c095648d2e0f20715e2549 Mon Sep 17 00:00:00 2001 From: Kurtis Lew Date: Wed, 22 Jun 2022 15:07:05 -0700 Subject: [PATCH 028/289] feat(shields): Add RGB support to 2% Milk Co-Authored-By: treezoob <98245530+treezoob@users.noreply.github.com> --- .../two_percent_milk/boards/nice_nano.overlay | 31 ++++++++++++++++++ .../boards/nice_nano_v2.overlay | 31 ++++++++++++++++++ .../boards/nrfmicro_11.overlay | 32 +++++++++++++++++++ .../boards/nrfmicro_11_flipped.overlay | 31 ++++++++++++++++++ .../boards/nrfmicro_13.overlay | 31 ++++++++++++++++++ .../two_percent_milk/two_percent_milk.conf | 7 ++++ 6 files changed, 163 insertions(+) create mode 100644 app/boards/shields/two_percent_milk/boards/nice_nano.overlay create mode 100644 app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay create mode 100644 app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay create mode 100644 app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay new file mode 100644 index 00000000..dd7e34c4 --- /dev/null +++ b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <9>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <2>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..dd7e34c4 --- /dev/null +++ b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <9>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <2>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay new file mode 100644 index 00000000..c2dab5a6 --- /dev/null +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay @@ -0,0 +1,32 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <43>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <12>; // 0.12 is not broken out on the nRFMicro + miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <2>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; + diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay new file mode 100644 index 00000000..e53b149a --- /dev/null +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <38>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <12>; // 0.12 is not broken out on the nRFMicro + miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <2>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay new file mode 100644 index 00000000..252329b4 --- /dev/null +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <43>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <12>; // 0.12 is not broken out on the nRFMicro + miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <2>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/two_percent_milk/two_percent_milk.conf b/app/boards/shields/two_percent_milk/two_percent_milk.conf index fb23f20c..4baccacf 100644 --- a/app/boards/shields/two_percent_milk/two_percent_milk.conf +++ b/app/boards/shields/two_percent_milk/two_percent_milk.conf @@ -1,2 +1,9 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT + +# Uncomment the following lines to enable RGB Underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y + +# Uncomment the following line to turn on logging, and set ZMK logging to debug output +# CONFIG_ZMK_USB_LOGGING=y \ No newline at end of file From 91de215bf05be072075095a54c09aaf3c13a04b4 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 2 Jul 2022 20:02:58 -0700 Subject: [PATCH 029/289] fix(docs): Add missing underglow on/off defines --- docs/docs/behaviors/underglow.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/docs/behaviors/underglow.md b/docs/docs/behaviors/underglow.md index a6a47719..c028f832 100644 --- a/docs/docs/behaviors/underglow.md +++ b/docs/docs/behaviors/underglow.md @@ -22,6 +22,8 @@ Here is a table describing the action for each define: | Define | Action | | --------------- | ---------------------------------------------------------------------------------------------- | +| `RGB_ON` | Turns the RGB feature on | +| `RGB_OFF` | Turns the RGB feature off | | `RGB_TOG` | Toggles the RGB feature on and off | | `RGB_HUI` | Increases the hue of the RGB feature | | `RGB_HUD` | Decreases the hue of the RGB feature | From edec4595aebd332880b988742c234dd61c1b4d9a Mon Sep 17 00:00:00 2001 From: Nick Conway Date: Fri, 1 Jul 2022 15:00:51 -0400 Subject: [PATCH 030/289] fix(behaviors): Fix mod morph description --- app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml b/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml index 66b452a5..ed40f936 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml @@ -1,7 +1,7 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT -description: Keyboard Reset Behavior +description: Mod Morph Behavior compatible: "zmk,behavior-mod-morph" From 61806435814f76d435166c3ccffcc6df4eb0ff5c Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 2 Jul 2022 19:47:15 -0700 Subject: [PATCH 031/289] fix(shields): Remove uses of deprecated pro_micro_a/d nodes --- app/boards/shields/a_dux/a_dux.dtsi | 34 ++++++++++++++--------------- app/boards/shields/cradio/README.md | 34 ++++++++++++++--------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/app/boards/shields/a_dux/a_dux.dtsi b/app/boards/shields/a_dux/a_dux.dtsi index 4c28d655..4840227c 100644 --- a/app/boards/shields/a_dux/a_dux.dtsi +++ b/app/boards/shields/a_dux/a_dux.dtsi @@ -29,23 +29,23 @@ compatible = "zmk,kscan-gpio-direct"; label = "KSCAN"; input-gpios = - <&pro_micro_d 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_d 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_a 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_d 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_a 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_d 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_d 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_a 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_d 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_a 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_d 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_d 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_d 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_d 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_d 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_d 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro_d 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> ; }; diff --git a/app/boards/shields/cradio/README.md b/app/boards/shields/cradio/README.md index b1344293..ee1cab0e 100644 --- a/app/boards/shields/cradio/README.md +++ b/app/boards/shields/cradio/README.md @@ -11,23 +11,23 @@ Some revisions of the aforementioned PCBs have slightly different pin arrangemen /* The position of Q and B keys have been swapped */ &kscan0 { input-gpios - = <&pro_micro_d 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_a 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_a 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_a 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_a 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_d 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_d 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_d 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_d 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_d 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_d 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_d 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_d 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_d 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_d 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_d 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro_d 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + = <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> ; }; ``` From 11861a4d303b769a2de615376fbf766e7db433fc Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 6 Mar 2021 20:06:15 -0600 Subject: [PATCH 032/289] docs: Add documentation for config options --- docs/docs/config/behaviors.md | 91 +++++++++ docs/docs/config/combos.md | 42 +++++ docs/docs/config/displays.md | 43 +++++ docs/docs/config/encoders.md | 41 ++++ docs/docs/config/index.md | 237 ++++++++++++++++++++++++ docs/docs/config/keymap.md | 42 +++++ docs/docs/config/kscan.md | 319 ++++++++++++++++++++++++++++++++ docs/docs/config/power.md | 65 +++++++ docs/docs/config/system.md | 66 +++++++ docs/docs/config/underglow.md | 43 +++++ docs/docs/customization.md | 6 +- docs/docs/features/combos.md | 10 +- docs/docs/features/underglow.md | 23 +-- docs/sidebars.js | 12 ++ 14 files changed, 1014 insertions(+), 26 deletions(-) create mode 100644 docs/docs/config/behaviors.md create mode 100644 docs/docs/config/combos.md create mode 100644 docs/docs/config/displays.md create mode 100644 docs/docs/config/encoders.md create mode 100644 docs/docs/config/index.md create mode 100644 docs/docs/config/keymap.md create mode 100644 docs/docs/config/kscan.md create mode 100644 docs/docs/config/power.md create mode 100644 docs/docs/config/system.md create mode 100644 docs/docs/config/underglow.md diff --git a/docs/docs/config/behaviors.md b/docs/docs/config/behaviors.md new file mode 100644 index 00000000..f8a0df7d --- /dev/null +++ b/docs/docs/config/behaviors.md @@ -0,0 +1,91 @@ +--- +title: Behavior Configuration +sidebar_label: Behaviors +--- + +Some behaviors have properties to adjust how they behave. These can also be used as templates to create custom behaviors when none of the built-in behaviors do what you want. + +See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. + +See the [zmk/app/dts/behaviors/](https://github.com/zmkfirmware/zmk/tree/main/app/dts/behaviors) folder for all default behaviors. + +## Hold-Tap + +Creates a custom behavior that triggers one behavior when a key is held or a different one when the key is tapped. + +See the [hold-tap behavior documentation](/docs/behaviors/hold-tap) for more details and examples. + +### Devicetree + +Applies to: `compatible = "zmk,behavior-hold-tap"` + +| Property | Type | Description | Default | +| ----------------- | ------------- | ------------------------------------------------------------------------------ | ------------------ | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must be `<2>` | | +| `bindings` | phandle array | A list of two behaviors: one for hold and one for tap | | +| `tapping-term-ms` | int | How long in milliseconds the key must be held to trigger a hold | | +| `quick-tap-ms` | int | Tap twice within this period in milliseconds to trigger a tap, even when held | -1 | +| `flavor` | string | Adjusts how the behavior chooses between hold and tap | `"hold-preferred"` | +| `retro-tap` | bool | Triggers the tap behavior on release if no other key was pressed during a hold | false | + +The `flavor` property may be one of: + +- `"hold-preferred"` +- `"balanced"` +- `"tap-preferred"` + +See the [hold-tap behavior documentation](/docs/behaviors/hold-tap) for an explanation of each flavor. + +| Node | Behavior | +| ----- | --------------------------------------------- | +| `<` | [Layer-tap](/docs/behaviors/layers#layer-tap) | +| `&mt` | [Mod-tap](/docs/behaviors/mod-tap) | + +## Mod-Morph + +Creates a custom behavior that triggers one behavior when a key is pressed without certain modifiers held or a different one if certain modifiers are held. + +### Devicetree + +Applies to: `compatible = "zmk,behavior-mod-morph"` + +| Property | Type | Description | +| ---------------- | ------------- | ----------------------------------------------------------------------------------- | +| `label` | string | Unique label for the node | +| `#binding-cells` | int | Must be `<0>` | +| `bindings` | phandle array | A list of two behaviors: one for normal press and one for mod morphed press | +| `mods` | int | A bit field of modifiers which will switch to the morph behavior if any are pressed | + +See [dt-bindings/zmk/modifiers.h](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/modifiers.h) for a list of modifiers. + +You can use the following nodes to tweak the default behaviors: + +| Node | Behavior | +| -------- | ------------ | +| `&gresc` | Grave escape | + +## Sticky Key + +Creates a custom behavior that triggers a behavior and keeps it pressed it until another key is pressed and released. + +See the [sticky key behavior](/docs/behaviors/sticky-key) and [sticky layer behavior](/docs/behaviors/sticky-layer) documentation for more details and examples. + +### Devicetree + +Applies to: `compatible = "zmk,behavior-sticky-key"` + +| Property | Type | Description | Default | +| ------------------ | ------------- | ------------------------------------------------------------------------ | ------- | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must match the number of parameters the `bindings` behavior uses | | +| `bindings` | phandle array | A behavior (without parameters) to trigger | | +| `release-after-ms` | int | Releases the key after this many milliseconds if no other key is pressed | 1000 | +| `quick-release` | bool | Release the sticky key on the next key press instead of release | false | + +You can use the following nodes to tweak the default behaviors: + +| Node | Behavior | +| ----- | -------------------------------------------- | +| `&sk` | [Sticky key](/docs/behaviors/sticky-key) | +| `&sl` | [Sticky layer](/docs/behaviors/sticky-layer) | diff --git a/docs/docs/config/combos.md b/docs/docs/config/combos.md new file mode 100644 index 00000000..fe8877ef --- /dev/null +++ b/docs/docs/config/combos.md @@ -0,0 +1,42 @@ +--- +title: Combo Configuration +sidebar_label: Combos +--- + +See the [Combos feature page](/docs/features/combos) for more details and examples. + +See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. + +## Kconfig + +Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) + +| Config | Type | Description | Default | +| ------------------------------------- | ---- | -------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_COMBO_MAX_PRESSED_COMBOS` | int | Maximum number of combos that can be active at the same time | 4 | +| `CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY` | int | Maximum number of active combos that use the same key position | 5 | +| `CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO` | int | Maximum number of keys to press to activate a combo | 4 | + +If `CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY` is 5, you can have 5 separate combos that use position `0`, 5 combos that use position `1`, and so on. + +If you want a combo that triggers when pressing 5 keys, you must set `CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO` to 5. + +## Devicetree + +Applies to: `compatible = "zmk,combo"` + +Definition file: [zmk/app/dts/bindings/zmk,combos.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Ccombos.yaml) + +The `zmk,combos` node itself has no properties. It should have one child node per combo. + +Each child node can have the following properties: + +| Property | Type | Description | Default | +| --------------- | ------------- | ---------------------------------------------------------------------------------- | ------- | +| `bindings` | phandle-array | A [behavior](/docs/features/keymaps#behaviors) to run when the combo is triggered | | +| `key-positions` | array | A list of key position indices for the keys which should trigger the combo | | +| `timeout-ms` | int | All the keys must be pressed within this time in milliseconds to trigger the combo | 50 | +| `slow-release` | bool | Releases the combo when all keys are released instead of when any key is released | false | +| `layers` | array | A list of layers on which the combo may be triggered. `-1` allows all layers. | `<-1>` | + +The `key-positions` array must not be longer than the `CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO` setting, which defaults to 4. If you want a combo that triggers when pressing 5 keys, then you must change the setting to 5. diff --git a/docs/docs/config/displays.md b/docs/docs/config/displays.md new file mode 100644 index 00000000..93d314a8 --- /dev/null +++ b/docs/docs/config/displays.md @@ -0,0 +1,43 @@ +--- +title: Display Configuration +sidebar_label: Displays +--- + +See the [displays feature page](/docs/features/displays) for more details. + +See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. + +## Kconfig + +Definition files: + +- [zmk/app/src/display/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/display/Kconfig) +- [zmk/app/src/display/widgets/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/display/widgets/Kconfig) + +| Config | Type | Description | Default | +| ---------------------------------- | ---- | ---------------------------------------------------- | ------- | +| `CONFIG_ZMK_DISPLAY` | bool | Enable support for displays | n | +| `CONFIG_ZMK_WIDGET_LAYER_STATUS` | bool | Enable a widget to show the highest, active layer | y | +| `CONFIG_ZMK_WIDGET_BATTERY_STATUS` | bool | Enable a widget to show battery charge information | y | +| `CONFIG_ZMK_WIDGET_OUTPUT_STATUS` | bool | Enable a widget to show the current output (USB/BLE) | y | +| `CONFIG_ZMK_WIDGET_WPM_STATUS` | bool | Enable a widget to show words per minute | n | + +If `CONFIG_ZMK_DISPLAY` is enabled, exactly one of the following options must be set to `y`: + +| Config | Type | Description | Default | +| ------------------------------------------- | ---- | ------------------------------ | ------- | +| `CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN` | bool | Use the built-in status screen | y | +| `CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM` | bool | Use a custom status screen | n | + +You must also configure the Zephyr driver for your display. Here are the Kconfig options for common displays. + +- [SSD1306](https://docs.zephyrproject.org/latest/reference/kconfig/CONFIG_SSD1306.html) + +## Devicetree + +See the Zephyr Devicetree bindings for your display. Here are the bindings for common displays: + +- [SSD1306 (i2c)](https://docs.zephyrproject.org/latest/reference/devicetree/bindings/solomon,ssd1306fb-i2c.html) +- [SSD1306 (spi)](https://docs.zephyrproject.org/latest/reference/devicetree/bindings/solomon,ssd1306fb-spi.html) + +A full list of supported drivers can be found in [Zephyr's Devicetree bindings index](https://docs.zephyrproject.org/latest/reference/devicetree/bindings.html). diff --git a/docs/docs/config/encoders.md b/docs/docs/config/encoders.md new file mode 100644 index 00000000..28440738 --- /dev/null +++ b/docs/docs/config/encoders.md @@ -0,0 +1,41 @@ +--- +title: Encoder Configuration +sidebar_label: Encoders +--- + +See the [Encoders feature page](/docs/features/encoders) for more details, including instructions for adding encoder support to a board. + +See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. + +## EC11 Encoders + +### Kconfig + +Definition file: [zmk/app/drivers/sensor/ec11/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/sensor/ec11/Kconfig) + +| Config | Type | Description | Default | +| ------------------------------- | ---- | -------------------------------- | ------- | +| `CONFIG_EC11` | bool | Enable EC11 encoders | n | +| `CONFIG_EC11_THREAD_PRIORITY` | int | Priority of the encoder thread | 10 | +| `CONFIG_EC11_THREAD_STACK_SIZE` | int | Stack size of the encoder thread | 1024 | + +If `CONFIG_EC11` is enabled, exactly one of the following options must be set to `y`: + +| Config | Type | Description | +| ----------------------------------- | ---- | ----------------------------------------------- | +| `CONFIG_EC11_TRIGGER_NONE` | bool | No trigger (encoders are disabled) | +| `CONFIG_EC11_TRIGGER_GLOBAL_THREAD` | bool | Process encoder interrupts on the global thread | +| `CONFIG_EC11_TRIGGER_OWN_THREAD` | bool | Process encoder interrupts on their own thread | + +### Devicetree + +Applies to: `compatible = "alps,ec11"` + +Definition file: [zmk/app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/sensor/alps%2Cec11.yaml) + +| Property | Type | Description | Default | +| ------------ | ---------- | ------------------------------------- | ------- | +| `label` | string | Unique label for the node | | +| `a-gpios` | GPIO array | GPIO connected to the encoder's A pin | | +| `b-gpios` | GPIO array | GPIO connected to the encoder's B pin | | +| `resolution` | int | Number of encoder pulses per tick | 1 | diff --git a/docs/docs/config/index.md b/docs/docs/config/index.md new file mode 100644 index 00000000..71058237 --- /dev/null +++ b/docs/docs/config/index.md @@ -0,0 +1,237 @@ +--- +title: Configuration Overview +sidebar_label: Overview +--- + +ZMK has several configuration settings that can be changed to change the behavior of your keyboard. They are set in either Kconfig or Devicetree files. + +This page describes the Kconfig and Devicetree file formats and how to change settings in them. See the other pages in the configuration section for a list of settings you can change. + +:::note +All configuration is currently set at compile time. After changing any settings, you must build new firmware and flash it for the changes to apply. +::: + +## Config File Locations + +ZMK will search multiple folders for the config files described below. There are three primary locations it will search: + +### User Config Folder + +When building with a `zmk-config` folder, ZMK will search the `zmk-config/config` folder for the following config files, where `` is the name of the shield if using a shield, or the name of the board otherwise: + +- `.conf` (Kconfig) +- `.keymap` (Devicetree) + +These files hold your personal settings for the keyboard. They override any configuration set in the board or shield folders. + +When using a split keyboard, you can use a single file without the `_left` or `_right` suffix to configure both sides. For example, `corne.conf` and `corne.keymap` will apply to both `corne_left` and `corne_right`. + +### Board Folder + +ZMK will search for config files in either of: + +- [`zmk/app/boards/arm/`](https://github.com/zmkfirmware/zmk/tree/main/app/boards/arm) +- `zmk-config/config/boards/arm/` + +...where `` is the name of the board. These files describe the hardware of the board. + +ZMK will search the board folder for the following config files: + +- `_defconfig` (Kconfig) +- `.dts` (Devicetree) +- `.keymap` (Devictree, standalone boards only) + +For more documentation on creating and configuring a new board, see [Zephyr's board porting guide](https://docs.zephyrproject.org/latest/guides/porting/board_porting.html#write-kconfig-files). + +### Shield Folder + +When building with a shield, ZMK will search for config files in either of: + +- [`zmk/app/boards/shields/`](https://github.com/zmkfirmware/zmk/tree/main/app/boards/shields) +- `zmk-config/config/boards/shields/` + +...where `` is the name of the shield. These files describe the hardware of the shield that the board is plugged into. + +ZMK will search the shield folder for the following config files: + +- `.conf` (Kconfig) +- `.overlay` (Devicetree) +- `.keymap` (Devicetree) + +For more documentation on creating and configuring a new shield, see [Zephyr's shield documentation](https://docs.zephyrproject.org/latest/guides/porting/shields.html) and [ZMK's new keyboard shield](/docs/development/new-shield) guide. + +## Kconfig Files + +Kconfig is used to configure global settings such as the keyboard name and enabling certain hardware devices. These typically have a `.conf` file extension and are text files containing `CONFIG_XYZ=value` assignments, with one setting per line. + +Kconfig files look like this: + +``` +CONFIG_ZMK_SLEEP=y +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y +``` + +The list of available settings is determined by various files in ZMK whose names start with `Kconfig`. + +See [Zephyr's Kconfig documentation](https://docs.zephyrproject.org/latest/guides/kconfig/index.html) for more details on Kconfig files. + +### KConfig Value Types + +#### bool + +Either `y` for yes or `n` for no. + +Example: `CONFIG_FOO=y` + +#### int + +An integer. + +Example: `CONFIG_FOO=42` + +#### string + +Text surrounded by double quotes. + +Example: `CONFIG_FOO="foo"` + +## Devicetree Files + +Various Devicetree files are combined to build a tree that describes the hardware for a keyboard. They are also used to define keymaps. Common file extensions for Devicetree files are `.dts`, `.dtsi`, `.overlay`, and `.keymap`. + +Devicetree files look like this: + +```devicetree +/ { + chosen { + zmk,kscan = &kscan0; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + }; +}; +``` + +Devicetree properties apply to specific nodes in the tree instead of globally. The properties that can be set for each node are determined by `.yaml` files in ZMK in the various `dts/bindings` folders. + +See [Zephyr's Devicetree guide](https://docs.zephyrproject.org/latest/guides/dts/index.html) for more details on Devicetree files. + +### Changing Devicetree Properties + +Since Devicetree properties are set for specific nodes in the tree, you will first need to find the node you want to configure. You will typically need to +search through the `.dts` file for you board, `.overlay` file for your shield, or a `.dtsi` file included in by of those files using an `#include` statement. + +A Devicetree node looks like this: + +```devicetree +kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + // more properties and/or nodes... +}; +``` + +The part before the colon, `kscan0`, is a label. This is optional, and it provides a shortcut to allow changing the properties of the node. The part after the colon, `kscan`, is the node's name. The values inside the curly braces are the node's properties. + +The `compatible` property indicates what type of node it is. Search this documentation for the text inside the quotes to see which properties the node +supports. You can also search ZMK for a file whose name is the value of the `compatible` property with a `.yaml` file extension. + +To set a property, see below for examples for common property types, or see [Zephyr's Devicetree documentation](https://docs.zephyrproject.org/latest/guides/dts/intro.html#writing-property-values) for more details on the syntax for properties. + +To change a property for an existing node, first find the node you want to change and find its label. Next, outside of any other node, write an ampersand (`&`) +followed by the node's label, an opening curly brace (`{`), one or more new property values, a closing curly brace (`}`), and a semicolon (`;`). + +For example, to adjust the debouncing of the `zmk,kscan-gpio-matrix` node shown above, you could add this to your keymap: + +```devicetree +&kscan0 { + debounce-period = <7>; +}; +``` + +### Devicetree Property Types + +These are some of the property types you will see most often when working with ZMK. [Zephyr's Devicetree bindings documentation](https://docs.zephyrproject.org/latest/guides/dts/bindings.html) provides more detailed information and a full list of types. + +#### bool + +True or false. To set the property to true, list it with no value. To set it to false, do not list it. + +Example: `property;` + +If a property has already been set to true and you need to override it to false, use the following command to delete the existing property: + +```devicetree +/delete-property/ the-property-name; +``` + +#### int + +A single integer surrounded by angle brackets. Also supports mathematical expressions. + +Example: `property = <42>;` + +#### string + +Text surrounded by double quotes. + +Example: `property = "foo";` + +#### array + +A list of integers surrounded by angle brackets and separated with spaces. Mathematical expressions can be used but must be surrounded by parenthesis. + +Example: `property = <1 2 3 4>;` + +Values can also be split into multiple blocks, e.g. `property = <1 2>, <3 4>;` + +#### phandle + +A single node reference surrounded by angle brackets. + +Example: `property = <&label>` + +#### phandles + +A list of node references surrounded by angle brackets. + +Example: `property = <&label1 &label2 &label3>` + +#### phandle array + +A list of node references and possibly numbers to associate with the node. Mathematical expressions can be used but must be surrounded by parenthesis. + +Example: `property = <&none &mo 1>;` + +Values can also be split into multiple blocks, e.g. `property = <&none>, <&mo 1>;` + +See the documentation for "phandle-array" in [Zephyr's Devicetree bindings documentation](https://docs.zephyrproject.org/latest/guides/dts/bindings.html) +for more details on how parameters are associated with nodes. + +#### GPIO array + +This is just a phandle array. The documentation lists this as a different type to make it clear which properties expect an array of GPIOs. + +Each item in the array should be a label for a GPIO node (the names of which differ between hardware platforms) followed by an index and configuration flags. See [Zephyr's GPIO documentation](https://docs.zephyrproject.org/latest/reference/peripherals/gpio.html) for a full list of flags. + +Example: + +```devicetree +some-gpios = + <&gpio0 0 GPIO_ACTIVE_HIGH>, + <&gpio0 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; +``` + +#### path + +A path to a node, either as a node reference or as a string. + +Examples: + +``` +property = &label; +property = "/path/to/some/node"; +``` diff --git a/docs/docs/config/keymap.md b/docs/docs/config/keymap.md new file mode 100644 index 00000000..917b82c6 --- /dev/null +++ b/docs/docs/config/keymap.md @@ -0,0 +1,42 @@ +--- +title: Keymap Configuration +sidebar_label: Keymap +--- + +See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. + +## Keymap + +### Devicetree + +Applies to: `compatible = "zmk,keymap"` + +Definition file: [zmk/app/dts/bindings/zmk,keymap.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Ckeymap.yaml) + +The `zmk,keymap` node itself has no properties. It should have one child node per layer of the keymap, starting with the default layer (layer 0). + +Each child node can have the following properties: + +| Property | Type | Description | +| ----------------- | ------------- | ---------------------------------------------------------------------- | +| `label` | string | Unique label for the node | +| `bindings` | phandle-array | List of [key behaviors](/docs/features/keymaps#behaviors), one per key | +| `sensor-bindings` | phandle-array | List of sensor behaviors, one per sensor | + +Items for `bindings` must be listed in the order the keys are defined in the [keyboard scan configuration](/docs/config/kscan). + +Items for `sensor-bindings` must be listed in the order the [sensors](#keymap-sensors) are defined. + +## Keymap Sensors + +### Devicetree + +Applies to: `compatible = "zmk,keymap-sensors"` + +| Property | Type | Description | +| --------- | -------- | -------------------- | +| `sensors` | phandles | List of sensor nodes | + +The following types of nodes can be used as a sensor: + +- [`alps,ec11`](/docs/config/encoders#ec11-encoders) diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md new file mode 100644 index 00000000..9b7d1053 --- /dev/null +++ b/docs/docs/config/kscan.md @@ -0,0 +1,319 @@ +--- +title: Keyboard Scan Configuration +sidebar_label: Keyboard Scan +--- + +See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. + +## Common + +### Kconfig + +Definition files: + +- [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) +- [zmk/app/drivers/kscan/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/kscan/Kconfig) + +| Config | Type | Description | Default | +| ----------------------------------- | ---- | ------------------------------------------------------ | ------- | +| `CONFIG_ZMK_KSCAN_GPIO_DRIVER` | bool | Enable GPIO keyboard scan driver to detect key presses | y | +| `CONFIG_ZMK_KSCAN_EVENT_QUEUE_SIZE` | int | Size of the event queue for kscan events | 4 | +| `CONFIG_ZMK_KSCAN_INIT_PRIORITY` | int | Keyboard scan device driver initialization priority | 40 | + +### Devicetree + +Applies to: [`/chosen` node](https://docs.zephyrproject.org/latest/guides/dts/intro.html#aliases-and-chosen-nodes) + +| Property | Type | Description | +| ---------------------- | ---- | ------------------------------------------------------------- | +| `zmk,kscan` | path | The node for the keyboard scan driver to use | +| `zmk,matrix_transform` | path | The node for the [matrix transform](#matrix-transform) to use | + +## Demux Driver + +Keyboard scan driver which works like a regular matrix but uses a demultiplexer to drive the rows or columns. This allows N GPIOs to drive N2 rows or columns instead of just N like with a regular matrix. + +### Devicetree + +Applies to: `compatible = "zmk,kscan-gpio-demux"` + +Definition file: [zmk/app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-demux.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/kscan/zmk%2Ckscan-gpio-demux.yaml) + +| Property | Type | Description | Default | +| ----------------------- | ---------- | -------------------------------- | ------- | +| `label` | string | Unique label for the node | | +| `input-gpios` | GPIO array | Input GPIOs | | +| `output-gpios` | GPIO array | Demultiplexer address GPIOs | | +| `debounce-period` | int | Debounce period in milliseconds | 5 | +| `polling-interval-msec` | int | Polling interval in milliseconds | 25 | + +## Direct GPIO Driver + +Keyboard scan driver where each key has a dedicated GPIO. + +### Kconfig + +Definition file: [zmk/app/drivers/kscan/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/kscan/Kconfig) + +| Config | Type | Description | Default | +| --------------------------------- | ---- | ------------------------------------------------ | ------- | +| `CONFIG_ZMK_KSCAN_DIRECT_POLLING` | bool | Poll for key presses instead of using interrupts | n | + +### Devicetree + +Applies to: `compatible = "zmk,kscan-gpio-direct"` + +Definition file: [zmk/app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/kscan/zmk%2Ckscan-gpio-direct.yaml) + +| Property | Type | Description | Default | +| ----------------- | ---------- | ------------------------------- | ------- | +| `label` | string | Unique label for the node | | +| `input-gpios` | GPIO array | Input GPIOs (one per key) | | +| `debounce-period` | int | Debounce period in milliseconds | 5 | + +## Matrix Driver + +Keyboard scan driver where keys are arranged on a matrix with one GPIO per row and column. + +Definition file: [zmk/app/drivers/kscan/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/kscan/Kconfig) + +| Config | Type | Description | Default | +| --------------------------------- | ---- | ------------------------------------------------ | ------- | +| `CONFIG_ZMK_KSCAN_MATRIX_POLLING` | bool | Poll for key presses instead of using interrupts | n | + +### Devicetree + +Applies to: `compatible = "zmk,kscan-gpio-matrix"` + +Definition file: [zmk/app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-matrix.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/kscan/zmk%2Ckscan-gpio-matrix.yaml) + +| Property | Type | Description | Default | +| ----------------- | ---------- | ------------------------------------------------------------ | ----------- | +| `label` | string | Unique label for the node | | +| `row-gpios` | GPIO array | Matrix row GPIOs in order, starting from the top row | | +| `col-gpios` | GPIO array | Matrix column GPIOs in order, starting from the leftmost row | | +| `debounce-period` | int | Debounce period in milliseconds | 5 | +| `diode-direction` | string | The direction of the matrix diodes | `"row2col"` | + +The `diode-direction` property must be one of: + +| Value | Description | +| ----------- | --------------------------------------------------------------------- | +| `"row2col"` | Diodes point from rows to columns (cathodes are connected to columns) | +| `"col2row"` | Diodes point from columns to rows (cathodes are connected to rows) | + +## Composite Driver + +Keyboard scan driver which combines multiple other keyboard scan drivers. + +### Kconfig + +Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) + +| Config | Type | Description | Default | +| ----------------------------------- | ---- | ----------------------------- | ------- | +| `CONFIG_ZMK_KSCAN_COMPOSITE_DRIVER` | bool | Enable composite kscan driver | n | + +### Devicetree + +Applies to : `compatible = "zmk,kscan-composite"` + +Definition file: [zmk/app/dts/bindings/zmk,kscan-composite.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk,kscan-composite.yaml) + +| Property | Type | Description | Default | +| -------- | ------ | --------------------------------------------- | ------- | +| `label` | string | Unique label for the node | | +| `rows` | int | The number rows of in the composite matrix | | +| `cols` | int | The number columns of in the composite matrix | | + +The `zmk,kscan-composite` node should have one child node per keyboard scan driver that should be composited. Each child node can have the following properties: + +| Property | Type | Description | Default | +| --------------- | ------- | ------------------------------------------------------------------------------ | ------- | +| `label` | string | Unique label for the node | | +| `kscan` | phandle | Label of the kscan driver to include | | +| `row-offset` | int | Shifts row 0 of the included driver to a new row in the composite matrix | 0 | +| `column-offset` | int | Shifts column 0 of the included driver to a new column in the composite matrix | 0 | + +### Example Configuration + +For example, consider a macropad with a 3x3 matrix and two direct GPIO keys: + +
+
+Matrix: + + + + + + + + + + +
Col 0Col 1Col 2
Row 0A0A1A2
Row 1A3A4A5
Row 2A6A7A8
+
+ +
+Direct GPIO: + + + + + + + + +
Col 0Col 1
Row 0B0B1
+
+
+ +To combine them, we need to create a composite matrix with enough rows and columns to fit both sets of keys without overlapping, then set row and/or columns offsets to shift them so they do not overlap. + +One possible way to do this is a 3x4 matrix where the direct GPIO keys are shifted to below the matrix keys... + + + + + + + + + + + +
Col 0Col 1Col 2
Row 0A0A1A2
Row 1A3A4A5
Row 2A6A7A8
Row 3B0B1(none)
+ +...which can be configured with the following Devicetree code: + +```devicetree +/ { + chosen { + zmk,kscan = &kscan0; + }; + + kscan0: kscan_composite { + compatible = "zmk,kscan-composite"; + label = "KSCAN0"; + rows = <3>; + columns = <4>; + + // Include the matrix driver + matrix { + kscan = <&kscan1>; + }; + + // Include the direct GPIO driver... + direct { + kscan = <&kscan2>; + row-offset = <3>; // ..and shift it to not overlap + }; + }; + + kscan1: kscan_matrix { + compatible = "zmk,kscan-gpio-matrix"; + // define 3x3 matrix here... + }; + + kscan2: kscan_direct { + compatible = "zmk,kscan-gpio-direct"; + // define 2 direct GPIOs here... + }; +} +``` + +## Mock Driver + +Mock keyboard scan driver that simulates key events. + +### Kconfig + +Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) + +| Config | Type | Description | Default | +| ------------------------------ | ---- | ------------------------ | ------- | +| `CONFIG_ZMK_KSCAN_MOCK_DRIVER` | bool | Enable mock kscan driver | n | + +### Devicetree + +Applies to: `compatible = "zmk,kscan-mock"` + +Definition file: [zmk/app/dts/bindings/zmk,kscan-mock.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Ckscan-mock.yaml) + +| Property | Type | Description | Default | +| -------------- | ------ | --------------------------------------------- | ------- | +| `label` | string | Unique label for the node | | +| `event-period` | int | Milliseconds between each generated event | | +| `events` | array | List of key events to simulate | | +| `rows` | int | The number rows of in the composite matrix | | +| `cols` | int | The number columns of in the composite matrix | | +| `exit-after` | bool | Exit the program after running all events | false | + +The `events` array should be defined using the macros from [dt-bindings/zmk/kscan_mock.h](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/kscan_mock.h). + +## Matrix Transform + +Defines a mapping from keymap logical positions to physical matrix positions. + +Transforms should be used any time the physical layout of a keyboard's keys does not match the layout of its electrical matrix and/or when not all positions in the matrix are used. This applies to most non-ortholinear boards. + +Transforms can also be used for keyboards with multiple layouts. You can define multiple matrix transform nodes, one for each layout, and users can select which one they want from the `/chosen` node in their keymaps. + +See the [new shield guide](/docs/development/new-shield/#optional-matrix-transform) for more documentation on how to define a matrix transform. + +### Devicetree + +Applies to: `compatible = "zmk,matrix-transform"` + +Definition file: [zmk/app/dts/bindings/zmk,matrix-transform.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Cmatrix-transform.yaml) + +| Property | Type | Description | Default | +| ------------ | ----- | --------------------------------------------------------------------- | ------- | +| `rows` | int | Number of rows in the transformed matrix | | +| `columns` | int | Number of columns in the transformed matrix | | +| `row-offset` | int | Adds an offset to all rows before looking them up in the transform | 0 | +| `col-offset` | int | Adds an offset to all columns before looking them up in the transform | 0 | +| `map` | array | A list of position transforms | | + +The `map` array should be defined using the `RC()` macro from [dt-bindings/zmk/matrix_transform.h](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/matrix_transform.h). It should have one item per logical position in the keymap. Each item should list the physical row and column that should trigger the key in that position. + +### Example Configuration + +Consider a keyboard with a [duplex matrix](https://wiki.ai03.com/books/pcb-design/page/matrices-and-duplex-matrix), where the matrix has twice as many rows and half as many columns as the keyboard has keys. A matrix transform can be used to correct for this so that keymaps can match the layout of the keys, not the layout of the matrix. + +```devicetree +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + rows = <12>; + columns = <8>; + // define the matrix... + }; + + default_transform: matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <6>; + columns = <16>; + // ESC F1 F2 F3 ... + // ` 1 2 3 ... + // Tab Q W E ... + // Caps A S D ... + // Shift Z X C ... + // Ctrl Alt ... + map = < + RC(0,0) RC(1,0) RC(0,1) RC(1,1) // ... + RC(2,0) RC(3,0) RC(2,1) RC(3,1) // ... + RC(4,0) RC(5,0) RC(4,1) RC(5,1) // ... + RC(6,0) RC(7,0) RC(6,1) RC(7,1) // ... + RC(8,0) RC(8,1) RC(9,1) // ... + RC(10,0) RC(11,0) // ... + >; + }; +}; +``` diff --git a/docs/docs/config/power.md b/docs/docs/config/power.md new file mode 100644 index 00000000..c3dae3de --- /dev/null +++ b/docs/docs/config/power.md @@ -0,0 +1,65 @@ +--- +title: Power Management Configuration +sidebar_label: Power Management +--- + +See [Configuration Overview](/docs/config/index) for instructions on how to +change these settings. + +## Idle/Sleep + +Configuration for entering low power modes when the keyboard is idle. + +In the idle state, peripherals such as displays and lighting are disabled, but the keyboard remains connected to Bluetooth so it can immediately respond when you press a key. + +In the deep sleep state, the keyboard additionally disconnects from Bluetooth. This state uses very little power, but it may take a few seconds to reconnect after waking. + +### Kconfig + +Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) + +| Config | Type | Description | Default | +| ------------------------------- | ---- | ----------------------------------------------------- | ------- | +| `CONFIG_ZMK_IDLE_TIMEOUT` | int | Milliseconds of inactivity before entering idle state | 30000 | +| `CONFIG_ZMK_SLEEP` | bool | Enable deep sleep support | n | +| `CONFIG_ZMK_IDLE_SLEEP_TIMEOUT` | int | Milliseconds of inactivity before entering deep sleep | 900000 | + +## External Power Control + +Driver for enabling or disabling power to peripherals such as displays and lighting. This driver must be configured to use [power management behaviors](/docs/behaviors/power). + +### Kconfig + +Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) + +| Config | Type | Description | Default | +| ---------------------- | ---- | ----------------------------------------------- | ------- | +| `CONFIG_ZMK_EXT_POWER` | bool | Enable support to control external power output | y | + +### Devicetree + +Applies to: `compatible = "zmk,ext-power-generic"` + +| Property | Type | Description | +| --------------- | ---------- | ------------------------------------------------------------- | +| `label` | string | Unique label for the node | +| `control-gpios` | GPIO array | List of GPIOs which should be active to enable external power | +| `init-delay-ms` | int | number of milliseconds to delay after initializing the driver | + +## Battery Voltage Divider + +Driver for reading the voltage of a battery using an ADC connected to a voltage divider. + +### Kconfig + +Definition file: [zmk/app/drivers/sensor/battery_voltage_divider/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/sensor/battery_voltage_divider/Kconfig) + +| Config | Type | Description | Default | +| ------------------------------------ | ---- | ------------------------------------------------------------ | ------- | +| `CONFIG_ZMK_BATTERY_VOLTAGE_DIVIDER` | bool | Enable battery voltage divider driver for battery monitoring | n | + +### Devicetree + +Applies to: `compatible = "zmk,battery-voltage-divider"` + +See [Zephyr's voltage divider documentation](https://docs.zephyrproject.org/latest/reference/devicetree/bindings/voltage-divider.html). diff --git a/docs/docs/config/system.md b/docs/docs/config/system.md new file mode 100644 index 00000000..86bf24c7 --- /dev/null +++ b/docs/docs/config/system.md @@ -0,0 +1,66 @@ +--- +title: System Configuration +sidebar_label: System +--- + +These are general settings that control how the keyboard behaves and which features it supports. Several of these settings come from Zephyr and are not specific to ZMK, but they are listed here because they are relevant to how a keyboard functions. + +See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. + +## Kconfig + +Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) + +### General + +| Config | Type | Description | Default | +| ----------------------------------- | ------ | ----------------------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_KEYBOARD_NAME` | string | The name of the keyboard | | +| `CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE` | int | Milliseconds to wait after a setting change before writing it to flash memory | 60000 | +| `CONFIG_ZMK_WPM` | bool | Enable calculating words per minute | n | +| `CONFIG_HEAP_MEM_POOL_SIZE` | int | Size of the heap memory pool | 8192 | + +### USB + +| Config | Type | Description | Default | +| --------------------------------- | ------ | --------------------------------------- | --------------- | +| `CONFIG_USB` | bool | Enable USB drivers | | +| `CONFIG_USB_DEVICE_VID` | int | The vendor ID advertised to USB | `0x1D50` | +| `CONFIG_USB_DEVICE_PID` | int | The product ID advertised to USB | `0x615E` | +| `CONFIG_USB_DEVICE_MANUFACTURER` | string | The manufacturer name advertised to USB | `"ZMK Project"` | +| `CONFIG_USB_HID_POLL_INTERVAL_MS` | int | USB polling interval in milliseconds | 9 | +| `CONFIG_ZMK_USB` | bool | Enable ZMK as a USB keyboard | | +| `CONFIG_ZMK_USB_INIT_PRIORITY` | int | USB init priority | 50 | + +### Bluetooth + +See [Zephyr's Bluetooth stack architecture documentation](https://docs.zephyrproject.org/latest/guides/bluetooth/bluetooth-arch.html) +for more information on configuring Bluetooth. + +| Config | Type | Description | Default | +| ----------------------------------------------------- | ---- | ---------------------------------------------------------------------- | ------- | +| `CONFIG_BT` | bool | Enable Bluetooth support | | +| `CONFIG_BT_MAX_CONN` | int | Maximum number of simultaneous Bluetooth connections | 5 | +| `CONFIG_BT_MAX_PAIRED` | int | Maximum number of paired Bluetooth devices | 5 | +| `CONFIG_ZMK_BLE` | bool | Enable ZMK as a Bluetooth keyboard | | +| `CONFIG_ZMK_BLE_INIT_PRIORITY` | int | BLE init priority | 50 | +| `CONFIG_ZMK_BLE_THREAD_STACK_SIZE` | int | Stack size of the BLE notify thread | 512 | +| `CONFIG_ZMK_BLE_THREAD_PRIORITY` | int | Priority of the BLE notify thread | 5 | +| `CONFIG_ZMK_BLE_KEYBOARD_REPORT_QUEUE_SIZE` | int | Max number of keyboard HID reports to queue for sending over BLE | 20 | +| `CONFIG_ZMK_BLE_CONSUMER__REPORT_QUEUE_SIZE` | int | Max number of consumer HID reports to queue for sending over BLE | 5 | +| `CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START` | bool | Clears all bond information from the keyboard on startup | n | +| `CONFIG_ZMK_BLE_PASSKEY_ENTRY` | bool | Experimental: require typing passkey from host to pair BLE connection | n | +| `CONFIG_ZMK_SPLIT` | bool | Enable split keyboard support | n | +| `CONFIG_ZMK_SPLIT_BLE` | bool | Use BLE to communicate between split keyboard halves | y | +| `CONFIG_ZMK_SPLIT_BLE_ROLE_CENTRAL` | bool | `y` for central device, `n` for peripheral | | +| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue when received from peripherals | 5 | +| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE` | int | Stack size of the split peripheral BLE notify thread | 512 | +| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY` | int | Priority of the split peripheral BLE notify thread | 5 | +| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue to send to the central | 10 | + +### Logging + +| Config | Type | Description | Default | +| ------------------------ | ---- | ---------------------------------------- | ------- | +| `CONFIG_ZMK_USB_LOGGING` | bool | Enable USB CDC ACM logging for debugging | n | +| `CONFIG_ZMK_LOG_LEVEL` | int | Log level for ZMK debug messages | 4 | diff --git a/docs/docs/config/underglow.md b/docs/docs/config/underglow.md new file mode 100644 index 00000000..256e1b4f --- /dev/null +++ b/docs/docs/config/underglow.md @@ -0,0 +1,43 @@ +--- +title: RGB Underglow Configuration +sidebar_label: RGB Underglow +--- + +See the [RGB Underglow feature page](/docs/features/underglow) for more details, including instructions for adding underglow support to a board. + +See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. + +## Kconfig + +RGB underglow depends on [Zephyr's LED strip driver](https://github.com/zephyrproject-rtos/zephyr/tree/master/drivers/led_strip), which provides additional Kconfig options. + +Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) + +| Config | Type | Description | Default | +| ------------------------------------ | ---- | ----------------------------------------------------- | ------- | +| `CONFIG_ZMK_RGB_UNDERGLOW` | bool | Enable RGB underglow | n | +| `CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER` | bool | Underglow toggling also controls external power | y | +| `CONFIG_ZMK_RGB_UNDERGLOW_HUE_STEP` | int | Hue step in degrees (0-359) used by RGB actions | 10 | +| `CONFIG_ZMK_RGB_UNDERGLOW_SAT_STEP` | int | Saturation step in percent used by RGB actions | 10 | +| `CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP` | int | Brightness step in percent used by RGB actions | 10 | +| `CONFIG_ZMK_RGB_UNDERGLOW_HUE_START` | int | Default hue in degrees (0-359) | 0 | +| `CONFIG_ZMK_RGB_UNDERGLOW_SAT_START` | int | Default saturation percent (0-100) | 100 | +| `CONFIG_ZMK_RGB_UNDERGLOW_BRT_START` | int | Default brightness in percent (0-100) | 100 | +| `CONFIG_ZMK_RGB_UNDERGLOW_SPD_START` | int | Default effect speed (1-5) | 3 | +| `CONFIG_ZMK_RGB_UNDERGLOW_EFF_START` | int | Default effect index from the effect list (see below) | 0 | +| `CONFIG_ZMK_RGB_UNDERGLOW_ON_START` | bool | Default on state | y | + +Values for `CONFIG_ZMK_RGB_UNDERGLOW_EFF_START`: + +| Value | Effect | +| ----- | ----------- | +| 0 | Solid color | +| 1 | Breathe | +| 2 | Spectrum | +| 3 | Swirl | + +## Devicetree + +ZMK does not have any Devicetree properties of its own. See the Devicetree bindings for [Zephyr's LED strip driver](https://github.com/zephyrproject-rtos/zephyr/tree/master/dts/bindings/led_strip). + +See the [RGB underglow feature page](/docs/features/underglow) for examples of the properties that must be set to enable underglow. diff --git a/docs/docs/customization.md b/docs/docs/customization.md index ff5da61d..1ffc38cc 100644 --- a/docs/docs/customization.md +++ b/docs/docs/customization.md @@ -9,10 +9,10 @@ with the main `zmk` firmware repository to build your desired firmware. The main working components of ZMK are kept separate from your personal keyboard settings, reducing the amount of file manipulation in the configuration process. This makes flashing ZMK to your keyboard much easier, especially because you don't need to keep an up-to-date copy of zmk on your computer at all times. -On default `zmk-config` folder should contain two files: +By default, the `zmk-config` folder should contain two files: - `.conf` -- ``.keymap +- `.keymap` However, your config folder can also be modified to include a `boards/` directory for keymaps and configurations for multiple boards/shields outside of the default keyboard setting definitions. @@ -23,6 +23,8 @@ The setup script creates a `config/.conf` file that allows you to add ad control what features and options are built into your firmware. Opening that file with your text editor will allow you to see the various config settings that can be commented/uncommented to modify how your firmware is built. +Refer to the [Configuration](/docs/config/index) documentation for more details on this file. + ## Keymap Once you have the basic user config completed, you can find the keymap file in `config/.keymap` and customize from there. diff --git a/docs/docs/features/combos.md b/docs/docs/features/combos.md index 55e1563c..5c73a845 100644 --- a/docs/docs/features/combos.md +++ b/docs/docs/features/combos.md @@ -25,7 +25,7 @@ Combos configured in your `.keymap` file, but are separate from the `keymap` nod - The name of the combo doesn't really matter, but convention is to start the node name with `combo_`. - The `compatible` property should always be `"zmk,combos"` for combos. -- `timeout-ms` is the length of the window (in milliseconds) in which all keys of the combo must be pressed in order to successfully trigger the combo. +- All the keys must be pressed within `timeout-ms` milliseconds to trigger the combo. - `key-positions` is an array of key positions. See the info section below about how to figure out the positions on your board. - `layers = <0 1...>` will allow limiting a combo to specific layers. This is an _optional_ parameter, when omitted it defaults to global scope. - `bindings` is the behavior that is activated when the behavior is pressed. @@ -47,10 +47,4 @@ Key positions are numbered like the keys in your keymap, starting at 0. So, if t Invoking a source-specific behavior such as one of the [reset behaviors](behaviors/reset.md) using a combo will always trigger it on the central side of the keyboard, regardless of the side that the keys corresponding to `key-positions` are on. ::: -### Advanced configuration - -There are three global combo parameters which are set through KConfig. You can set them in the `.conf` file in the same directory as your keymap file. - -- `CONFIG_ZMK_COMBO_MAX_PRESSED_COMBOS` is the number of combos that can be active at the same time. Default 4. -- `CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY` is the maximum number of combos that can be active on a key position. Defaults to 5. (So you can have 5 separate combos that use position `3` for example) -- `CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO` is the maximum number of keys that need to be pressed to activate a combo. Default 4. If you want a combo that triggers when pressing 5 keys, you'd set this to 5 for example. +See [combo configuration](/docs/config/combos) for advanced configuration options. diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index 58b3ef45..d1cd8e20 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -25,7 +25,8 @@ Here you can see the RGB underglow feature in action using WS2812 LEDs. ## Enabling RGB Underglow -To enable RGB underglow on your board or shield, simply enable the `CONFIG_ZMK_RGB_UNDERGLOW` and `X_STRIP` configuration values in the `.conf` file of your user config directory as such: +To enable RGB underglow on your board or shield, simply enable the `CONFIG_ZMK_RGB_UNDERGLOW` and `CONFIG_*_STRIP` configuration values in the `.conf` file for your board or shield. +For example: ``` CONFIG_ZMK_RGB_UNDERGLOW=y @@ -33,24 +34,14 @@ CONFIG_ZMK_RGB_UNDERGLOW=y CONFIG_WS2812_STRIP=y ``` +See [Configuration Overview](/docs/config/index) for more instructions on how to +use Kconfig. + If your board or shield does not have RGB underglow configured, refer to [Adding RGB Underglow to a Board](#adding-rgb-underglow-to-a-board). ## Configuring RGB Underglow -There are various Kconfig options used to configure the RGB underglow feature. These can all be set in the `.conf` file. - -| Option | Description | Default | -| ------------------------------------ | ----------------------------------------------- | ------- | -| `CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER` | Underglow toggling also controls external power | y | -| `CONFIG_ZMK_RGB_UNDERGLOW_HUE_STEP` | Hue step in degrees of 360 used by RGB actions | 10 | -| `CONFIG_ZMK_RGB_UNDERGLOW_SAT_STEP` | Saturation step in percent used by RGB actions | 10 | -| `CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP` | Brightness step in percent used by RGB actions | 10 | -| `CONFIG_ZMK_RGB_UNDERGLOW_HUE_START` | Default hue 0-359 in degrees | 0 | -| `CONFIG_ZMK_RGB_UNDERGLOW_SAT_START` | Default saturation 0-100 in percent | 100 | -| `CONFIG_ZMK_RGB_UNDERGLOW_BRT_START` | Default brightness 0-100 in percent | 100 | -| `CONFIG_ZMK_RGB_UNDERGLOW_SPD_START` | Default effect speed 1-5 | 3 | -| `CONFIG_ZMK_RGB_UNDERGLOW_EFF_START` | Default effect integer from the effect enum | 0 | -| `CONFIG_ZMK_RGB_UNDERGLOW_ON_START` | Default on state | y | +See [RGB underglow configuration](/docs/config/underglow). ## Adding RGB Underglow to a Board @@ -154,7 +145,7 @@ Once you have your `led_strip` properly defined you need to add it to the root d }; ``` -Finally you need to enable the `CONFIG_ZMK_RGB_UNDERGLOW` and `X_STRIP` configuration values in the `.conf` file of your board (or set a default in the `Kconfig.defconfig`): +Finally you need to enable the `CONFIG_ZMK_RGB_UNDERGLOW` and `CONFIG*_STRIP` configuration values in the `.conf` file of your board (or set a default in the `Kconfig.defconfig`): ``` CONFIG_ZMK_RGB_UNDERGLOW=y diff --git a/docs/sidebars.js b/docs/sidebars.js index e7d05850..b8e74e0f 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -52,6 +52,18 @@ module.exports = { "codes/power", "codes/keymap-upgrader", ], + Configuration: [ + "config/index", + "config/behaviors", + "config/combos", + "config/displays", + "config/encoders", + "config/keymap", + "config/kscan", + "config/power", + "config/system", + "config/underglow", + ], Development: [ "development/clean-room", "development/documentation", From d36792db2d776c7c9b45db677fb02a8a4fbe4b94 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Thu, 28 Apr 2022 21:26:57 -0500 Subject: [PATCH 033/289] feat(docs): Update kscan config docs --- docs/docs/config/kscan.md | 46 +++++++++++++++------------------------ 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index 9b7d1053..37910756 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -14,11 +14,14 @@ Definition files: - [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) - [zmk/app/drivers/kscan/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/kscan/Kconfig) -| Config | Type | Description | Default | -| ----------------------------------- | ---- | ------------------------------------------------------ | ------- | -| `CONFIG_ZMK_KSCAN_GPIO_DRIVER` | bool | Enable GPIO keyboard scan driver to detect key presses | y | -| `CONFIG_ZMK_KSCAN_EVENT_QUEUE_SIZE` | int | Size of the event queue for kscan events | 4 | -| `CONFIG_ZMK_KSCAN_INIT_PRIORITY` | int | Keyboard scan device driver initialization priority | 40 | +| Config | Type | Description | Default | +| -------------------------------------- | ---- | ---------------------------------------------------- | ------- | +| `CONFIG_ZMK_KSCAN_EVENT_QUEUE_SIZE` | int | Size of the event queue for kscan events | 4 | +| `CONFIG_ZMK_KSCAN_INIT_PRIORITY` | int | Keyboard scan device driver initialization priority | 40 | +| `CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS` | int | Global debounce time for key press in milliseconds | -1 | +| `CONFIG_ZMK_KSCAN_DEBOUNCE_RELEASE_MS` | int | Global debounce time for key release in milliseconds | -1 | + +If the debounce press/release values are set to any value other than `-1`, they override the `debounce-press-ms` and `debounce-release-ms` devicetree properties for all keyboard scan drivers which support them. ### Devicetree @@ -87,13 +90,16 @@ Applies to: `compatible = "zmk,kscan-gpio-matrix"` Definition file: [zmk/app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-matrix.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/kscan/zmk%2Ckscan-gpio-matrix.yaml) -| Property | Type | Description | Default | -| ----------------- | ---------- | ------------------------------------------------------------ | ----------- | -| `label` | string | Unique label for the node | | -| `row-gpios` | GPIO array | Matrix row GPIOs in order, starting from the top row | | -| `col-gpios` | GPIO array | Matrix column GPIOs in order, starting from the leftmost row | | -| `debounce-period` | int | Debounce period in milliseconds | 5 | -| `diode-direction` | string | The direction of the matrix diodes | `"row2col"` | +| Property | Type | Description | Default | +| ------------------------- | ---------- | -------------------------------------------------------------------------------------------------- | ----------- | +| `label` | string | Unique label for the node | | +| `row-gpios` | GPIO array | Matrix row GPIOs in order, starting from the top row | | +| `col-gpios` | GPIO array | Matrix column GPIOs in order, starting from the leftmost row | | +| `debounce-press-ms` | int | Debounce time for key press in milliseconds. Use 0 for eager debouncing. | 5 | +| `debounce-release-ms` | int | Debounce time for key release in milliseconds. | 5 | +| `debounce-scan-period-ms` | int | Time between reads in milliseconds when any key is pressed. | 1 | +| `diode-direction` | string | The direction of the matrix diodes | `"row2col"` | +| `poll-period-ms` | int | Time between reads in milliseconds when no key is pressed and ZMK_KSCAN_MATRIX_POLLING is enabled. | 10 | The `diode-direction` property must be one of: @@ -106,14 +112,6 @@ The `diode-direction` property must be one of: Keyboard scan driver which combines multiple other keyboard scan drivers. -### Kconfig - -Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) - -| Config | Type | Description | Default | -| ----------------------------------- | ---- | ----------------------------- | ------- | -| `CONFIG_ZMK_KSCAN_COMPOSITE_DRIVER` | bool | Enable composite kscan driver | n | - ### Devicetree Applies to : `compatible = "zmk,kscan-composite"` @@ -227,14 +225,6 @@ One possible way to do this is a 3x4 matrix where the direct GPIO keys are shift Mock keyboard scan driver that simulates key events. -### Kconfig - -Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) - -| Config | Type | Description | Default | -| ------------------------------ | ---- | ------------------------ | ------- | -| `CONFIG_ZMK_KSCAN_MOCK_DRIVER` | bool | Enable mock kscan driver | n | - ### Devicetree Applies to: `compatible = "zmk,kscan-mock"` From bf84481b47fd64bedbfcf665b1dbc09aab5d5029 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Fri, 29 Apr 2022 20:20:21 -0500 Subject: [PATCH 034/289] feat(docs): Update behavior config docs --- docs/docs/behaviors/caps-word.md | 2 +- docs/docs/config/behaviors.md | 151 +++++++++++++++++++++++++++---- 2 files changed, 135 insertions(+), 18 deletions(-) diff --git a/docs/docs/behaviors/caps-word.md b/docs/docs/behaviors/caps-word.md index 479e350f..1b743a59 100644 --- a/docs/docs/behaviors/caps-word.md +++ b/docs/docs/behaviors/caps-word.md @@ -5,7 +5,7 @@ sidebar_label: Caps Word ## Summary -The caps word behavior behaves similar to a caps lock, but will automatically deactivate when one of the configured "break keycodes" is pressed, or if the caps word key is pressed again. For smaller keyboards, using [mod-taps](/docs/behaviors/mod-tap), this can help avoid repeated alternating holds when typing words in all caps. +The caps word behavior behaves similar to a caps lock, but will automatically deactivate when any key not in a continue list is pressed, or if the caps word key is pressed again. For smaller keyboards using [mod-taps](/docs/behaviors/mod-tap), this can help avoid repeated alternating holds when typing words in all caps. The modifiers are applied only to to the alphabetic (`A` to `Z`) keycodes, to avoid automatically appliying them to numeric values, etc. diff --git a/docs/docs/config/behaviors.md b/docs/docs/config/behaviors.md index f8a0df7d..726f2bb2 100644 --- a/docs/docs/config/behaviors.md +++ b/docs/docs/config/behaviors.md @@ -9,6 +9,35 @@ See [Configuration Overview](/docs/config/index) for instructions on how to chan See the [zmk/app/dts/behaviors/](https://github.com/zmkfirmware/zmk/tree/main/app/dts/behaviors) folder for all default behaviors. +## Caps Word + +Creates a custom behavior that behaves similar to a caps lock but deactivates when any key not in a continue list is pressed. + +See the [caps word behavior](/docs/behaviors/caps-word) documentation for more details and examples. + +### Devicetree + +Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-caps-word.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-caps-word.yaml) + +Applies to: `compatible = "zmk,behavior-caps-word"` + +| Property | Type | Description | Default | +| ---------------- | ------ | ------------------------------------------------------------------ | -------------- | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must be `<0>` | | +| `continue-list` | array | List of [key codes](/docs/codes) which do not deactivate caps lock | `` | +| `mods` | int | A bit field of modifiers to apply | `` | + +`continue-list` is treated as if it always includes alphanumeric characters (A-Z, 0-9). + +See [dt-bindings/zmk/modifiers.h](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/modifiers.h) for a list of modifiers. + +You can use the following nodes to tweak the default behaviors: + +| Node | Behavior | +| ------------ | -------------------------------------- | +| `&caps_word` | [Caps Word](/docs/behaviors/caps-word) | + ## Hold-Tap Creates a custom behavior that triggers one behavior when a key is held or a different one when the key is tapped. @@ -17,45 +46,113 @@ See the [hold-tap behavior documentation](/docs/behaviors/hold-tap) for more det ### Devicetree +Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-hold-tap.yaml) + Applies to: `compatible = "zmk,behavior-hold-tap"` -| Property | Type | Description | Default | -| ----------------- | ------------- | ------------------------------------------------------------------------------ | ------------------ | -| `label` | string | Unique label for the node | | -| `#binding-cells` | int | Must be `<2>` | | -| `bindings` | phandle array | A list of two behaviors: one for hold and one for tap | | -| `tapping-term-ms` | int | How long in milliseconds the key must be held to trigger a hold | | -| `quick-tap-ms` | int | Tap twice within this period in milliseconds to trigger a tap, even when held | -1 | -| `flavor` | string | Adjusts how the behavior chooses between hold and tap | `"hold-preferred"` | -| `retro-tap` | bool | Triggers the tap behavior on release if no other key was pressed during a hold | false | +| Property | Type | Description | Default | +| ---------------------------- | ------------- | ----------------------------------------------------------------------------------------- | ------------------ | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must be `<2>` | | +| `bindings` | phandle array | A list of two behaviors (without parameters): one for hold and one for tap | | +| `flavor` | string | Adjusts how the behavior chooses between hold and tap | `"hold-preferred"` | +| `tapping-term-ms` | int | How long in milliseconds the key must be held to trigger a hold | | +| `quick-tap-ms` | int | Tap twice within this period (in milliseconds) to trigger a tap, even when held | -1 (disabled) | +| `global-quick-tap` | bool | If enabled, `quick-tap-ms` also applies when tapping another key and then this one. | false | +| `retro-tap` | bool | Triggers the tap behavior on release if no other key was pressed during a hold | false | +| `hold-trigger-key-positions` | array | If set, pressing the hold-tap and then any key position _not_ in the list triggers a tap. | | The `flavor` property may be one of: - `"hold-preferred"` - `"balanced"` - `"tap-preferred"` +- `"tap-unless-interrupted"` See the [hold-tap behavior documentation](/docs/behaviors/hold-tap) for an explanation of each flavor. +`hold-trigger-key-positions` is an array of zero-based key position indices. + +You can use the following nodes to tweak the default behaviors: + | Node | Behavior | | ----- | --------------------------------------------- | | `<` | [Layer-tap](/docs/behaviors/layers#layer-tap) | | `&mt` | [Mod-tap](/docs/behaviors/mod-tap) | -## Mod-Morph +## Key Repeat -Creates a custom behavior that triggers one behavior when a key is pressed without certain modifiers held or a different one if certain modifiers are held. +Creates a custom behavior that repeats the whatever key code was last sent. + +See the [key repeat behavior](/docs/behaviors/key-repeat) documentation for more details and examples. ### Devicetree +Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-key-repeat.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-key-repeat.yaml) + +Applies to: `compatible = "zmk,behavior-key-repeat"` + +| Property | Type | Description | Default | +| ---------------- | ------ | -------------------------------- | ----------------- | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must be `<0>` | | +| `usage-pages` | array | List of HID usage pages to track | `` | + +For the `usage-pages` property, use the `HID_USAGE_*` defines from [dt-bindings/zmk/hid_usage_pages.h](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/hid_usage_pages.h). + +You can use the following nodes to tweak the default behaviors: + +| Node | Behavior | +| ------------- | ---------------------------------------- | +| `&key_repeat` | [Key repeat](/docs/behaviors/key-repeat) | + +## Macro + +Creates a custom behavior which triggers a sequence of other behaviors. + +See the [macro behavior](/docs/behaviors/macros) documentation for more details and examples. + +### Devicetree + +Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-macro.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-macro.yaml) + +Applies to: `compatible = "zmk,behavior-macro"` + +| Property | Type | Description | Default | +| ---------------- | ------------- | ----------------------------------------------------------------------------------------------------- | ------- | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must be `<0>` | | +| `bindings` | phandle array | List of behaviors to trigger | | +| `wait-ms` | int | The default time to wait (in milliseconds) before triggering the next behavior. | 100 | +| `tap-ms` | int | The default time to wait (in milliseconds) between the press and release events of a tapped behavior. | 100 | + +The following macro-specific behaviors can be added at any point in the `bindings` list to change how the macro triggers subsequent behaviors. + +| Behavior | Description | +| -------------------------- | ----------------------------------------------------------------------------------------------------- | +| `¯o_tap` | Switches to tap mode | +| `¯o_press` | Switches to press mode | +| `¯o_release` | Switches to release mode | +| `¯o_pause_for_release` | Pauses the macro until the macro key itself is released | +| `¯o_wait_time TIME` | Changes the time to wait (in milliseconds) before triggering the next behavior. | +| `¯o_tap_time TIME` | Changes the time to wait (in milliseconds) between the press and release events of a tapped behavior. | + +## Mod-Morph + +Creates a custom behavior that triggers one of two behaviors depending on whether certain modifiers are held. + +### Devicetree + +Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-mod-morph.yaml) + Applies to: `compatible = "zmk,behavior-mod-morph"` -| Property | Type | Description | -| ---------------- | ------------- | ----------------------------------------------------------------------------------- | -| `label` | string | Unique label for the node | -| `#binding-cells` | int | Must be `<0>` | -| `bindings` | phandle array | A list of two behaviors: one for normal press and one for mod morphed press | -| `mods` | int | A bit field of modifiers which will switch to the morph behavior if any are pressed | +| Property | Type | Description | +| ---------------- | ------------- | --------------------------------------------------------------------------------- | +| `label` | string | Unique label for the node | +| `#binding-cells` | int | Must be `<0>` | +| `bindings` | phandle array | A list of two behaviors: one for normal press and one for mod morphed press | +| `mods` | int | A bit field of modifiers. The morph behavior is used if any of these are pressed. | See [dt-bindings/zmk/modifiers.h](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/modifiers.h) for a list of modifiers. @@ -73,6 +170,8 @@ See the [sticky key behavior](/docs/behaviors/sticky-key) and [sticky layer beha ### Devicetree +Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-sticky-key.yaml) + Applies to: `compatible = "zmk,behavior-sticky-key"` | Property | Type | Description | Default | @@ -82,6 +181,7 @@ Applies to: `compatible = "zmk,behavior-sticky-key"` | `bindings` | phandle array | A behavior (without parameters) to trigger | | | `release-after-ms` | int | Releases the key after this many milliseconds if no other key is pressed | 1000 | | `quick-release` | bool | Release the sticky key on the next key press instead of release | false | +| `ignore-modifiers` | bool | If enabled, pressing a modifier key does not cancel the sticky key | true | You can use the following nodes to tweak the default behaviors: @@ -89,3 +189,20 @@ You can use the following nodes to tweak the default behaviors: | ----- | -------------------------------------------- | | `&sk` | [Sticky key](/docs/behaviors/sticky-key) | | `&sl` | [Sticky layer](/docs/behaviors/sticky-layer) | + +## Tap Dance + +Creates a custom behavior that triggers a different behavior corresponding to the number of times the key is tapped. + +### Devicetree + +Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-tap-dance.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-tap-dance.yaml) + +Applies to: `compatible = "zmk,behavior-tap-dance"` + +| Property | Type | Description | Default | +| ----------------- | ------------- | -------------------------------------------------------------------------------------------- | ------- | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must be `<0>` | | +| `bindings` | phandle array | A list of behaviors from which to select | | +| `tapping-term-ms` | int | The maximum time (in milliseconds) between taps before an item from `bindings` is triggered. | 200 | From 71b8f9d4acc0e1a5ba8a077d7efa78756fbe665c Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Fri, 29 Apr 2022 20:46:23 -0500 Subject: [PATCH 035/289] feat(docs): Update display config docs --- docs/docs/config/displays.md | 39 ++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/docs/docs/config/displays.md b/docs/docs/config/displays.md index 93d314a8..685540b7 100644 --- a/docs/docs/config/displays.md +++ b/docs/docs/config/displays.md @@ -22,22 +22,39 @@ Definition files: | `CONFIG_ZMK_WIDGET_OUTPUT_STATUS` | bool | Enable a widget to show the current output (USB/BLE) | y | | `CONFIG_ZMK_WIDGET_WPM_STATUS` | bool | Enable a widget to show words per minute | n | -If `CONFIG_ZMK_DISPLAY` is enabled, exactly one of the following options must be set to `y`: +If `CONFIG_ZMK_DISPLAY` is enabled, exactly zero or one of the following options must be set to `y`. The first option is used if none are set. -| Config | Type | Description | Default | -| ------------------------------------------- | ---- | ------------------------------ | ------- | -| `CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN` | bool | Use the built-in status screen | y | -| `CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM` | bool | Use a custom status screen | n | +| Config | Description | +| ------------------------------------------- | ------------------------------ | +| `CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN` | Use the built-in status screen | +| `CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM` | Use a custom status screen | -You must also configure the Zephyr driver for your display. Here are the Kconfig options for common displays. +If `CONFIG_ZMK_DISPLAY` is enabled, exactly zero or one of the following options must be set to `y`. The first option is used if none are set. -- [SSD1306](https://docs.zephyrproject.org/latest/reference/kconfig/CONFIG_SSD1306.html) +| Config | Description | +| ----------------------------------------- | ----------------------------------------- | +| `CONFIG_ZMK_DISPLAY_WORK_QUEUE_SYSTEM` | Use the system main thread for UI updates | +| `CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED` | Use a dedicated thread for UI updates | + +Using a dedicated thread requires more memory but prevents displays with slow updates (e.g. E-paper) from delaying key scanning and other processes. If enabled, the following options configure the thread: + +| Config | Type | Description | Default | +| ------------------------------------------------ | ---- | ---------------------------- | ------- | +| `CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE` | int | Stack size for the UI thread | 2048 | +| `CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_PRIORITY` | int | Priority for the UI thread | 5 | + +You must also configure the driver for your display. ZMK provides the following display drivers: + +- [IL0323](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/display/Kconfig.il0323) + +Zephyr provides several display drivers as well. Search for the name of your display in [Zephyr's Kconfig options](https://docs.zephyrproject.org/latest/kconfig.html) documentation. ## Devicetree -See the Zephyr Devicetree bindings for your display. Here are the bindings for common displays: +See the Devicetree bindings for your display. Here are the bindings for common displays: -- [SSD1306 (i2c)](https://docs.zephyrproject.org/latest/reference/devicetree/bindings/solomon,ssd1306fb-i2c.html) -- [SSD1306 (spi)](https://docs.zephyrproject.org/latest/reference/devicetree/bindings/solomon,ssd1306fb-spi.html) +- [IL0323](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/display/gooddisplay%2Cil0323.yaml) +- [SSD1306 (i2c)](https://docs.zephyrproject.org/latest/build/dts/api/bindings/display/solomon,ssd1306fb-i2c.html) +- [SSD1306 (spi)](https://docs.zephyrproject.org/latest/build/dts/api/bindings/display/solomon,ssd1306fb-spi.html) -A full list of supported drivers can be found in [Zephyr's Devicetree bindings index](https://docs.zephyrproject.org/latest/reference/devicetree/bindings.html). +A full list of drivers provided by Zephyr can be found in [Zephyr's Devicetree bindings index](https://docs.zephyrproject.org/latest/build/dts/api/bindings.html). From e46eaf5617fd84b18aa6b0512f6407a8c1e28a69 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Fri, 29 Apr 2022 21:10:37 -0500 Subject: [PATCH 036/289] feat(docs): Update power config docs --- docs/docs/config/power.md | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/docs/docs/config/power.md b/docs/docs/config/power.md index c3dae3de..54e44e57 100644 --- a/docs/docs/config/power.md +++ b/docs/docs/config/power.md @@ -50,16 +50,8 @@ Applies to: `compatible = "zmk,ext-power-generic"` Driver for reading the voltage of a battery using an ADC connected to a voltage divider. -### Kconfig - -Definition file: [zmk/app/drivers/sensor/battery_voltage_divider/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/sensor/battery_voltage_divider/Kconfig) - -| Config | Type | Description | Default | -| ------------------------------------ | ---- | ------------------------------------------------------------ | ------- | -| `CONFIG_ZMK_BATTERY_VOLTAGE_DIVIDER` | bool | Enable battery voltage divider driver for battery monitoring | n | - ### Devicetree Applies to: `compatible = "zmk,battery-voltage-divider"` -See [Zephyr's voltage divider documentation](https://docs.zephyrproject.org/latest/reference/devicetree/bindings/voltage-divider.html). +See [Zephyr's voltage divider documentation](https://docs.zephyrproject.org/latest/build/dts/api/bindings/adc/voltage-divider.html). From e8e6b2a33311651be4b6fa1367a39408f60268ce Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Fri, 29 Apr 2022 21:10:49 -0500 Subject: [PATCH 037/289] feat(docs): Update general system config docs --- docs/docs/config/index.md | 2 +- docs/docs/config/system.md | 72 +++++++++++++++++++++++++++----------- 2 files changed, 52 insertions(+), 22 deletions(-) diff --git a/docs/docs/config/index.md b/docs/docs/config/index.md index 71058237..9f24c5a3 100644 --- a/docs/docs/config/index.md +++ b/docs/docs/config/index.md @@ -72,7 +72,7 @@ CONFIG_EC11=y CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y ``` -The list of available settings is determined by various files in ZMK whose names start with `Kconfig`. +The list of available settings is determined by various files in ZMK whose names start with `Kconfig`. Note that options are _not_ prefixed with `CONFIG_` in these files. See [Zephyr's Kconfig documentation](https://docs.zephyrproject.org/latest/guides/kconfig/index.html) for more details on Kconfig files. diff --git a/docs/docs/config/system.md b/docs/docs/config/system.md index 86bf24c7..930ec1e5 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -20,6 +20,32 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/ | `CONFIG_ZMK_WPM` | bool | Enable calculating words per minute | n | | `CONFIG_HEAP_MEM_POOL_SIZE` | int | Size of the heap memory pool | 8192 | +### HID + +| Config | Type | Description | Default | +| ------------------------------------- | ---- | ------------------------------------------------- | ------- | +| `CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE` | int | Number of consumer keys simultaneously reportable | 6 | + +Exactly zero or one of the following options may be set to `y`. The first is used if none are set. + +| Config | Description | +| --------------------------------- | ----------------------------------------------------------------------------------------------------- | +| `CONFIG_ZMK_HID_REPORT_TYPE_HKRO` | Enable `CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE` key roll over. | +| `CONFIG_ZMK_HID_REPORT_TYPE_NKRO` | Enable full N-key roll over. This may prevent the keyboard from working with some BIOS/UEFI versions. | + +If `CONFIG_ZMK_HID_REPORT_TYPE_HKRO` is enabled, it may be configured with the following options: + +| Config | Type | Description | Default | +| ------------------------------------- | ---- | ------------------------------------------------- | ------- | +| `CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE` | int | Number of keyboard keys simultaneously reportable | 6 | + +Exactly zero or one of the following options may be set to `y`. The first is used if none are set. + +| Config | Description | +| --------------------------------------------- | ------------------------------------------------------------------------------------ | +| `CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_FULL` | Enable all consumer key codes, but may have compatibility issues with some host OSes | +| `CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC` | Prevents using some consumer key codes, but allows compatibility with more host OSes | + ### USB | Config | Type | Description | Default | @@ -28,7 +54,7 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/ | `CONFIG_USB_DEVICE_VID` | int | The vendor ID advertised to USB | `0x1D50` | | `CONFIG_USB_DEVICE_PID` | int | The product ID advertised to USB | `0x615E` | | `CONFIG_USB_DEVICE_MANUFACTURER` | string | The manufacturer name advertised to USB | `"ZMK Project"` | -| `CONFIG_USB_HID_POLL_INTERVAL_MS` | int | USB polling interval in milliseconds | 9 | +| `CONFIG_USB_HID_POLL_INTERVAL_MS` | int | USB polling interval in milliseconds | 1 | | `CONFIG_ZMK_USB` | bool | Enable ZMK as a USB keyboard | | | `CONFIG_ZMK_USB_INIT_PRIORITY` | int | USB init priority | 50 | @@ -37,26 +63,30 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/ See [Zephyr's Bluetooth stack architecture documentation](https://docs.zephyrproject.org/latest/guides/bluetooth/bluetooth-arch.html) for more information on configuring Bluetooth. -| Config | Type | Description | Default | -| ----------------------------------------------------- | ---- | ---------------------------------------------------------------------- | ------- | -| `CONFIG_BT` | bool | Enable Bluetooth support | | -| `CONFIG_BT_MAX_CONN` | int | Maximum number of simultaneous Bluetooth connections | 5 | -| `CONFIG_BT_MAX_PAIRED` | int | Maximum number of paired Bluetooth devices | 5 | -| `CONFIG_ZMK_BLE` | bool | Enable ZMK as a Bluetooth keyboard | | -| `CONFIG_ZMK_BLE_INIT_PRIORITY` | int | BLE init priority | 50 | -| `CONFIG_ZMK_BLE_THREAD_STACK_SIZE` | int | Stack size of the BLE notify thread | 512 | -| `CONFIG_ZMK_BLE_THREAD_PRIORITY` | int | Priority of the BLE notify thread | 5 | -| `CONFIG_ZMK_BLE_KEYBOARD_REPORT_QUEUE_SIZE` | int | Max number of keyboard HID reports to queue for sending over BLE | 20 | -| `CONFIG_ZMK_BLE_CONSUMER__REPORT_QUEUE_SIZE` | int | Max number of consumer HID reports to queue for sending over BLE | 5 | -| `CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START` | bool | Clears all bond information from the keyboard on startup | n | -| `CONFIG_ZMK_BLE_PASSKEY_ENTRY` | bool | Experimental: require typing passkey from host to pair BLE connection | n | -| `CONFIG_ZMK_SPLIT` | bool | Enable split keyboard support | n | -| `CONFIG_ZMK_SPLIT_BLE` | bool | Use BLE to communicate between split keyboard halves | y | -| `CONFIG_ZMK_SPLIT_BLE_ROLE_CENTRAL` | bool | `y` for central device, `n` for peripheral | | -| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue when received from peripherals | 5 | -| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE` | int | Stack size of the split peripheral BLE notify thread | 512 | -| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY` | int | Priority of the split peripheral BLE notify thread | 5 | -| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue to send to the central | 10 | +| Config | Type | Description | Default | +| ----------------------------------------------------- | ---- | ----------------------------------------------------------------------- | ------- | +| `CONFIG_BT` | bool | Enable Bluetooth support | | +| `CONFIG_BT_MAX_CONN` | int | Maximum number of simultaneous Bluetooth connections | 5 | +| `CONFIG_BT_MAX_PAIRED` | int | Maximum number of paired Bluetooth devices | 5 | +| `CONFIG_ZMK_BLE` | bool | Enable ZMK as a Bluetooth keyboard | | +| `CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START` | bool | Clears all bond information from the keyboard on startup | n | +| `CONFIG_ZMK_BLE_CONSUMER_REPORT_QUEUE_SIZE` | int | Max number of consumer HID reports to queue for sending over BLE | 5 | +| `CONFIG_ZMK_BLE_KEYBOARD_REPORT_QUEUE_SIZE` | int | Max number of keyboard HID reports to queue for sending over BLE | 20 | +| `CONFIG_ZMK_BLE_INIT_PRIORITY` | int | BLE init priority | 50 | +| `CONFIG_ZMK_BLE_THREAD_PRIORITY` | int | Priority of the BLE notify thread | 5 | +| `CONFIG_ZMK_BLE_THREAD_STACK_SIZE` | int | Stack size of the BLE notify thread | 512 | +| `CONFIG_ZMK_BLE_PASSKEY_ENTRY` | bool | Experimental: require typing passkey from host to pair BLE connection | n | +| `CONFIG_ZMK_SPLIT` | bool | Enable split keyboard support | n | +| `CONFIG_ZMK_SPLIT_BLE` | bool | Use BLE to communicate between split keyboard halves | y | +| `CONFIG_ZMK_SPLIT_BLE_ROLE_CENTRAL` | bool | `y` for central device, `n` for peripheral | | +| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue when received from peripherals | 5 | +| `CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE` | int | Stack size of the BLE split central write thread | 512 | +| `CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE` | int | Max number of behavior run events to queue to send to the peripheral(s) | 5 | +| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE` | int | Stack size of the BLE split peripheral notify thread | 650 | +| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY` | int | Priority of the BLE split peripheral notify thread | 5 | +| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue to send to the central | 10 | + +Note that `CONFIG_BT_MAX_CONN` and `CONFIG_BT_MAX_PAIRED` should be set to the same value. On a split keyboard they should only be set for the central and must be set to one greater than the desired number of bluetooth profiles. ### Logging From 2b122acfc38f82f3a681dbac7b6d47c60d6e6268 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Fri, 29 Apr 2022 21:21:07 -0500 Subject: [PATCH 038/289] feat(docs): Updating lighting config docs --- docs/docs/config/backlight.md | 36 +++++++++++++++++++++++++++++++++++ docs/docs/config/underglow.md | 6 +++--- docs/sidebars.js | 1 + 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 docs/docs/config/backlight.md diff --git a/docs/docs/config/backlight.md b/docs/docs/config/backlight.md new file mode 100644 index 00000000..814a29a1 --- /dev/null +++ b/docs/docs/config/backlight.md @@ -0,0 +1,36 @@ +--- +title: Backlight Configuration +sidebar_label: Backlight +--- + +See the [backlight feature page](/docs/features/backlight) for more details, including instructions for adding backlight support to a board. + +See [Configuration Overview](/docs/config) for instructions on how to change these settings. + +## Kconfig + +Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) + +| Option | Type | Description | Default | +| ------------------------------------ | ---- | ----------------------------------------------------- | ------- | +| `CONFIG_ZMK_BACKLIGHT` | bool | Enables LED backlight | n | +| `CONFIG_ZMK_BACKLIGHT_BRT_STEP` | int | Brightness step in percent | 20 | +| `CONFIG_ZMK_BACKLIGHT_BRT_START` | int | Default brightness in percent | 40 | +| `CONFIG_ZMK_BACKLIGHT_ON_START` | bool | Default backlight state | y | +| `CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE` | bool | Turn off backlight when keyboard goes into idle state | n | +| `CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB` | bool | Turn off backlight when USB is disconnected | n | + +## Devicetree + +Applies to: [`/chosen` node](https://docs.zephyrproject.org/latest/build/dts/intro.html#aliases-and-chosen-nodes) + +| Property | Type | Description | +| --------------- | ---- | -------------------------------------------- | +| `zmk,backlight` | path | The node for the backlight LED driver to use | + +See the Zephyr devicetree bindings for LED drivers: + +- [gpio-leds](https://docs.zephyrproject.org/latest/build/dts/api/bindings/gpio/gpio-leds.html) +- [pwm-leds](https://docs.zephyrproject.org/latest/build/dts/api/bindings/led/pwm-leds.html) + +See the [backlight feature page](/docs/features/backlight) for examples of the properties that must be set to enable backlighting. diff --git a/docs/docs/config/underglow.md b/docs/docs/config/underglow.md index 256e1b4f..4b742362 100644 --- a/docs/docs/config/underglow.md +++ b/docs/docs/config/underglow.md @@ -5,11 +5,11 @@ sidebar_label: RGB Underglow See the [RGB Underglow feature page](/docs/features/underglow) for more details, including instructions for adding underglow support to a board. -See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. +See [Configuration Overview](/docs/config) for instructions on how to change these settings. ## Kconfig -RGB underglow depends on [Zephyr's LED strip driver](https://github.com/zephyrproject-rtos/zephyr/tree/master/drivers/led_strip), which provides additional Kconfig options. +RGB underglow depends on [Zephyr's LED strip driver](https://github.com/zephyrproject-rtos/zephyr/tree/main/drivers/led_strip), which provides additional Kconfig options. Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) @@ -38,6 +38,6 @@ Values for `CONFIG_ZMK_RGB_UNDERGLOW_EFF_START`: ## Devicetree -ZMK does not have any Devicetree properties of its own. See the Devicetree bindings for [Zephyr's LED strip driver](https://github.com/zephyrproject-rtos/zephyr/tree/master/dts/bindings/led_strip). +ZMK does not have any Devicetree properties of its own. See the Devicetree bindings for [Zephyr's LED strip drivers](https://github.com/zephyrproject-rtos/zephyr/tree/main/dts/bindings/led_strip). See the [RGB underglow feature page](/docs/features/underglow) for examples of the properties that must be set to enable underglow. diff --git a/docs/sidebars.js b/docs/sidebars.js index b8e74e0f..231d4f71 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -54,6 +54,7 @@ module.exports = { ], Configuration: [ "config/index", + "config/backlight", "config/behaviors", "config/combos", "config/displays", From c350f7130beb8153ffc717d7567a7aff0d9734a3 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Fri, 29 Apr 2022 21:22:13 -0500 Subject: [PATCH 039/289] fix(docs): Fix links in config pages --- docs/docs/config/backlight.md | 6 +++--- docs/docs/config/behaviors.md | 26 +++++++++++++------------- docs/docs/config/combos.md | 6 +++--- docs/docs/config/displays.md | 4 ++-- docs/docs/config/encoders.md | 4 ++-- docs/docs/config/index.md | 2 +- docs/docs/config/keymap.md | 8 ++++---- docs/docs/config/kscan.md | 4 ++-- docs/docs/config/power.md | 4 ++-- docs/docs/config/system.md | 2 +- docs/docs/config/underglow.md | 6 +++--- docs/docs/customization.md | 2 +- docs/docs/features/underglow.md | 2 +- 13 files changed, 38 insertions(+), 38 deletions(-) diff --git a/docs/docs/config/backlight.md b/docs/docs/config/backlight.md index 814a29a1..abdbc82b 100644 --- a/docs/docs/config/backlight.md +++ b/docs/docs/config/backlight.md @@ -3,9 +3,9 @@ title: Backlight Configuration sidebar_label: Backlight --- -See the [backlight feature page](/docs/features/backlight) for more details, including instructions for adding backlight support to a board. +See the [backlight feature page](../features/backlight.md) for more details, including instructions for adding backlight support to a board. -See [Configuration Overview](/docs/config) for instructions on how to change these settings. +See [Configuration Overview](index.md) for instructions on how to change these settings. ## Kconfig @@ -33,4 +33,4 @@ See the Zephyr devicetree bindings for LED drivers: - [gpio-leds](https://docs.zephyrproject.org/latest/build/dts/api/bindings/gpio/gpio-leds.html) - [pwm-leds](https://docs.zephyrproject.org/latest/build/dts/api/bindings/led/pwm-leds.html) -See the [backlight feature page](/docs/features/backlight) for examples of the properties that must be set to enable backlighting. +See the [backlight feature page](../features/backlight.md) for examples of the properties that must be set to enable backlighting. diff --git a/docs/docs/config/behaviors.md b/docs/docs/config/behaviors.md index 726f2bb2..4a01dfd3 100644 --- a/docs/docs/config/behaviors.md +++ b/docs/docs/config/behaviors.md @@ -5,7 +5,7 @@ sidebar_label: Behaviors Some behaviors have properties to adjust how they behave. These can also be used as templates to create custom behaviors when none of the built-in behaviors do what you want. -See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. +See [Configuration Overview](index.md) for instructions on how to change these settings. See the [zmk/app/dts/behaviors/](https://github.com/zmkfirmware/zmk/tree/main/app/dts/behaviors) folder for all default behaviors. @@ -13,7 +13,7 @@ See the [zmk/app/dts/behaviors/](https://github.com/zmkfirmware/zmk/tree/main/ap Creates a custom behavior that behaves similar to a caps lock but deactivates when any key not in a continue list is pressed. -See the [caps word behavior](/docs/behaviors/caps-word) documentation for more details and examples. +See the [caps word behavior](../behaviors/caps-word.md) documentation for more details and examples. ### Devicetree @@ -36,13 +36,13 @@ You can use the following nodes to tweak the default behaviors: | Node | Behavior | | ------------ | -------------------------------------- | -| `&caps_word` | [Caps Word](/docs/behaviors/caps-word) | +| `&caps_word` | [Caps Word](../behaviors/caps-word.md) | ## Hold-Tap Creates a custom behavior that triggers one behavior when a key is held or a different one when the key is tapped. -See the [hold-tap behavior documentation](/docs/behaviors/hold-tap) for more details and examples. +See the [hold-tap behavior documentation](../behaviors/hold-tap.md) for more details and examples. ### Devicetree @@ -69,7 +69,7 @@ The `flavor` property may be one of: - `"tap-preferred"` - `"tap-unless-interrupted"` -See the [hold-tap behavior documentation](/docs/behaviors/hold-tap) for an explanation of each flavor. +See the [hold-tap behavior documentation](../behaviors/hold-tap.md) for an explanation of each flavor. `hold-trigger-key-positions` is an array of zero-based key position indices. @@ -77,14 +77,14 @@ You can use the following nodes to tweak the default behaviors: | Node | Behavior | | ----- | --------------------------------------------- | -| `<` | [Layer-tap](/docs/behaviors/layers#layer-tap) | -| `&mt` | [Mod-tap](/docs/behaviors/mod-tap) | +| `<` | [Layer-tap](../behaviors/layers.md#layer-tap) | +| `&mt` | [Mod-tap](../behaviors/mod-tap.md) | ## Key Repeat Creates a custom behavior that repeats the whatever key code was last sent. -See the [key repeat behavior](/docs/behaviors/key-repeat) documentation for more details and examples. +See the [key repeat behavior](../behaviors/key-repeat.md) documentation for more details and examples. ### Devicetree @@ -104,13 +104,13 @@ You can use the following nodes to tweak the default behaviors: | Node | Behavior | | ------------- | ---------------------------------------- | -| `&key_repeat` | [Key repeat](/docs/behaviors/key-repeat) | +| `&key_repeat` | [Key repeat](../behaviors/key-repeat.md) | ## Macro Creates a custom behavior which triggers a sequence of other behaviors. -See the [macro behavior](/docs/behaviors/macros) documentation for more details and examples. +See the [macro behavior](../behaviors/macros.md) documentation for more details and examples. ### Devicetree @@ -166,7 +166,7 @@ You can use the following nodes to tweak the default behaviors: Creates a custom behavior that triggers a behavior and keeps it pressed it until another key is pressed and released. -See the [sticky key behavior](/docs/behaviors/sticky-key) and [sticky layer behavior](/docs/behaviors/sticky-layer) documentation for more details and examples. +See the [sticky key behavior](../behaviors/sticky-key.md) and [sticky layer behavior](../behaviors/sticky-layer.md) documentation for more details and examples. ### Devicetree @@ -187,8 +187,8 @@ You can use the following nodes to tweak the default behaviors: | Node | Behavior | | ----- | -------------------------------------------- | -| `&sk` | [Sticky key](/docs/behaviors/sticky-key) | -| `&sl` | [Sticky layer](/docs/behaviors/sticky-layer) | +| `&sk` | [Sticky key](../behaviors/sticky-key.md) | +| `&sl` | [Sticky layer](../behaviors/sticky-layer.md) | ## Tap Dance diff --git a/docs/docs/config/combos.md b/docs/docs/config/combos.md index fe8877ef..479cd8e5 100644 --- a/docs/docs/config/combos.md +++ b/docs/docs/config/combos.md @@ -3,9 +3,9 @@ title: Combo Configuration sidebar_label: Combos --- -See the [Combos feature page](/docs/features/combos) for more details and examples. +See the [Combos feature page](../features/combos.md) for more details and examples. -See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. +See [Configuration Overview](index.md) for instructions on how to change these settings. ## Kconfig @@ -33,7 +33,7 @@ Each child node can have the following properties: | Property | Type | Description | Default | | --------------- | ------------- | ---------------------------------------------------------------------------------- | ------- | -| `bindings` | phandle-array | A [behavior](/docs/features/keymaps#behaviors) to run when the combo is triggered | | +| `bindings` | phandle-array | A [behavior](../features/keymaps.md#behaviors) to run when the combo is triggered | | | `key-positions` | array | A list of key position indices for the keys which should trigger the combo | | | `timeout-ms` | int | All the keys must be pressed within this time in milliseconds to trigger the combo | 50 | | `slow-release` | bool | Releases the combo when all keys are released instead of when any key is released | false | diff --git a/docs/docs/config/displays.md b/docs/docs/config/displays.md index 685540b7..cf6c07ee 100644 --- a/docs/docs/config/displays.md +++ b/docs/docs/config/displays.md @@ -3,9 +3,9 @@ title: Display Configuration sidebar_label: Displays --- -See the [displays feature page](/docs/features/displays) for more details. +See the [displays feature page](../features/displays.md) for more details. -See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. +See [Configuration Overview](index.md) for instructions on how to change these settings. ## Kconfig diff --git a/docs/docs/config/encoders.md b/docs/docs/config/encoders.md index 28440738..f6bd6de1 100644 --- a/docs/docs/config/encoders.md +++ b/docs/docs/config/encoders.md @@ -3,9 +3,9 @@ title: Encoder Configuration sidebar_label: Encoders --- -See the [Encoders feature page](/docs/features/encoders) for more details, including instructions for adding encoder support to a board. +See the [Encoders feature page](../features/encoders.md) for more details, including instructions for adding encoder support to a board. -See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. +See [Configuration Overview](index.md) for instructions on how to change these settings. ## EC11 Encoders diff --git a/docs/docs/config/index.md b/docs/docs/config/index.md index 9f24c5a3..1762839f 100644 --- a/docs/docs/config/index.md +++ b/docs/docs/config/index.md @@ -58,7 +58,7 @@ ZMK will search the shield folder for the following config files: - `.overlay` (Devicetree) - `.keymap` (Devicetree) -For more documentation on creating and configuring a new shield, see [Zephyr's shield documentation](https://docs.zephyrproject.org/latest/guides/porting/shields.html) and [ZMK's new keyboard shield](/docs/development/new-shield) guide. +For more documentation on creating and configuring a new shield, see [Zephyr's shield documentation](https://docs.zephyrproject.org/latest/hardware/porting/shields.html) and [ZMK's new keyboard shield](../development/new-shield.md) guide. ## Kconfig Files diff --git a/docs/docs/config/keymap.md b/docs/docs/config/keymap.md index 917b82c6..b4e81f5e 100644 --- a/docs/docs/config/keymap.md +++ b/docs/docs/config/keymap.md @@ -3,7 +3,7 @@ title: Keymap Configuration sidebar_label: Keymap --- -See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. +See [Configuration Overview](index.md) for instructions on how to change these settings. ## Keymap @@ -20,10 +20,10 @@ Each child node can have the following properties: | Property | Type | Description | | ----------------- | ------------- | ---------------------------------------------------------------------- | | `label` | string | Unique label for the node | -| `bindings` | phandle-array | List of [key behaviors](/docs/features/keymaps#behaviors), one per key | +| `bindings` | phandle-array | List of [key behaviors](../features/keymaps.md#behaviors), one per key | | `sensor-bindings` | phandle-array | List of sensor behaviors, one per sensor | -Items for `bindings` must be listed in the order the keys are defined in the [keyboard scan configuration](/docs/config/kscan). +Items for `bindings` must be listed in the order the keys are defined in the [keyboard scan configuration](kscan.md). Items for `sensor-bindings` must be listed in the order the [sensors](#keymap-sensors) are defined. @@ -39,4 +39,4 @@ Applies to: `compatible = "zmk,keymap-sensors"` The following types of nodes can be used as a sensor: -- [`alps,ec11`](/docs/config/encoders#ec11-encoders) +- [`alps,ec11`](encoders.md#ec11-encoders) diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index 37910756..410f5588 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -3,7 +3,7 @@ title: Keyboard Scan Configuration sidebar_label: Keyboard Scan --- -See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. +See [Configuration Overview](index.md) for instructions on how to change these settings. ## Common @@ -250,7 +250,7 @@ Transforms should be used any time the physical layout of a keyboard's keys does Transforms can also be used for keyboards with multiple layouts. You can define multiple matrix transform nodes, one for each layout, and users can select which one they want from the `/chosen` node in their keymaps. -See the [new shield guide](/docs/development/new-shield/#optional-matrix-transform) for more documentation on how to define a matrix transform. +See the [new shield guide](../development/new-shield.md#optional-matrix-transform) for more documentation on how to define a matrix transform. ### Devicetree diff --git a/docs/docs/config/power.md b/docs/docs/config/power.md index 54e44e57..bf0de718 100644 --- a/docs/docs/config/power.md +++ b/docs/docs/config/power.md @@ -3,7 +3,7 @@ title: Power Management Configuration sidebar_label: Power Management --- -See [Configuration Overview](/docs/config/index) for instructions on how to +See [Configuration Overview](index.md) for instructions on how to change these settings. ## Idle/Sleep @@ -26,7 +26,7 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/ ## External Power Control -Driver for enabling or disabling power to peripherals such as displays and lighting. This driver must be configured to use [power management behaviors](/docs/behaviors/power). +Driver for enabling or disabling power to peripherals such as displays and lighting. This driver must be configured to use [power management behaviors](../behaviors/power.md). ### Kconfig diff --git a/docs/docs/config/system.md b/docs/docs/config/system.md index 930ec1e5..cf88c4f5 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -5,7 +5,7 @@ sidebar_label: System These are general settings that control how the keyboard behaves and which features it supports. Several of these settings come from Zephyr and are not specific to ZMK, but they are listed here because they are relevant to how a keyboard functions. -See [Configuration Overview](/docs/config/index) for instructions on how to change these settings. +See [Configuration Overview](index.md) for instructions on how to change these settings. ## Kconfig diff --git a/docs/docs/config/underglow.md b/docs/docs/config/underglow.md index 4b742362..6353330d 100644 --- a/docs/docs/config/underglow.md +++ b/docs/docs/config/underglow.md @@ -3,9 +3,9 @@ title: RGB Underglow Configuration sidebar_label: RGB Underglow --- -See the [RGB Underglow feature page](/docs/features/underglow) for more details, including instructions for adding underglow support to a board. +See the [RGB Underglow feature page](../features/underglow.md) for more details, including instructions for adding underglow support to a board. -See [Configuration Overview](/docs/config) for instructions on how to change these settings. +See [Configuration Overview](index.md) for instructions on how to change these settings. ## Kconfig @@ -40,4 +40,4 @@ Values for `CONFIG_ZMK_RGB_UNDERGLOW_EFF_START`: ZMK does not have any Devicetree properties of its own. See the Devicetree bindings for [Zephyr's LED strip drivers](https://github.com/zephyrproject-rtos/zephyr/tree/main/dts/bindings/led_strip). -See the [RGB underglow feature page](/docs/features/underglow) for examples of the properties that must be set to enable underglow. +See the [RGB underglow feature page](../features/underglow.md) for examples of the properties that must be set to enable underglow. diff --git a/docs/docs/customization.md b/docs/docs/customization.md index 1ffc38cc..6fb39f85 100644 --- a/docs/docs/customization.md +++ b/docs/docs/customization.md @@ -23,7 +23,7 @@ The setup script creates a `config/.conf` file that allows you to add ad control what features and options are built into your firmware. Opening that file with your text editor will allow you to see the various config settings that can be commented/uncommented to modify how your firmware is built. -Refer to the [Configuration](/docs/config/index) documentation for more details on this file. +Refer to the [Configuration](/docs/config) documentation for more details on this file. ## Keymap diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index d1cd8e20..af182fae 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -34,7 +34,7 @@ CONFIG_ZMK_RGB_UNDERGLOW=y CONFIG_WS2812_STRIP=y ``` -See [Configuration Overview](/docs/config/index) for more instructions on how to +See [Configuration Overview](/docs/config) for more instructions on how to use Kconfig. If your board or shield does not have RGB underglow configured, refer to [Adding RGB Underglow to a Board](#adding-rgb-underglow-to-a-board). From 01ffea1b47c3b94d542ba07ae774774ad2734845 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Fri, 29 Apr 2022 21:37:38 -0500 Subject: [PATCH 040/289] feat(docs): Update configuration overview --- docs/docs/config/index.md | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/docs/docs/config/index.md b/docs/docs/config/index.md index 1762839f..a6cb337e 100644 --- a/docs/docs/config/index.md +++ b/docs/docs/config/index.md @@ -3,7 +3,7 @@ title: Configuration Overview sidebar_label: Overview --- -ZMK has several configuration settings that can be changed to change the behavior of your keyboard. They are set in either Kconfig or Devicetree files. +ZMK has many configuration settings that can be changed to change the behavior of your keyboard. They are set in either Kconfig or Devicetree files. This page describes the Kconfig and Devicetree file formats and how to change settings in them. See the other pages in the configuration section for a list of settings you can change. @@ -41,7 +41,7 @@ ZMK will search the board folder for the following config files: - `.dts` (Devicetree) - `.keymap` (Devictree, standalone boards only) -For more documentation on creating and configuring a new board, see [Zephyr's board porting guide](https://docs.zephyrproject.org/latest/guides/porting/board_porting.html#write-kconfig-files). +For more documentation on creating and configuring a new board, see [Zephyr's board porting guide](https://docs.zephyrproject.org/latest/hardware/porting/board_porting.html#write-kconfig-files). ### Shield Folder @@ -74,7 +74,7 @@ CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y The list of available settings is determined by various files in ZMK whose names start with `Kconfig`. Note that options are _not_ prefixed with `CONFIG_` in these files. -See [Zephyr's Kconfig documentation](https://docs.zephyrproject.org/latest/guides/kconfig/index.html) for more details on Kconfig files. +See [Zephyr's Kconfig documentation](https://docs.zephyrproject.org/latest/build/kconfig/index.html) for more details on Kconfig files. ### KConfig Value Types @@ -117,7 +117,7 @@ Devicetree files look like this: Devicetree properties apply to specific nodes in the tree instead of globally. The properties that can be set for each node are determined by `.yaml` files in ZMK in the various `dts/bindings` folders. -See [Zephyr's Devicetree guide](https://docs.zephyrproject.org/latest/guides/dts/index.html) for more details on Devicetree files. +See [Zephyr's Devicetree guide](https://docs.zephyrproject.org/latest/build/dts/index.html) for more details on Devicetree files. ### Changing Devicetree Properties @@ -138,7 +138,7 @@ The part before the colon, `kscan0`, is a label. This is optional, and it provid The `compatible` property indicates what type of node it is. Search this documentation for the text inside the quotes to see which properties the node supports. You can also search ZMK for a file whose name is the value of the `compatible` property with a `.yaml` file extension. -To set a property, see below for examples for common property types, or see [Zephyr's Devicetree documentation](https://docs.zephyrproject.org/latest/guides/dts/intro.html#writing-property-values) for more details on the syntax for properties. +To set a property, see below for examples for common property types, or see [Zephyr's Devicetree documentation](https://docs.zephyrproject.org/latest/build/dts/intro.html#writing-property-values) for more details on the syntax for properties. To change a property for an existing node, first find the node you want to change and find its label. Next, outside of any other node, write an ampersand (`&`) followed by the node's label, an opening curly brace (`{`), one or more new property values, a closing curly brace (`}`), and a semicolon (`;`). @@ -147,13 +147,23 @@ For example, to adjust the debouncing of the `zmk,kscan-gpio-matrix` node shown ```devicetree &kscan0 { - debounce-period = <7>; + debounce-press-ms = <0>; +}; +``` + +If the node you want to edit doesn't have a label, you can also write a new tree and it will be merged with the existing tree, overriding any properties. Adding this to your keymap would be equivalent to the previous example. + +```devicetree +/ { + kscan { + debounce-press-ms = <0>; + }; }; ``` ### Devicetree Property Types -These are some of the property types you will see most often when working with ZMK. [Zephyr's Devicetree bindings documentation](https://docs.zephyrproject.org/latest/guides/dts/bindings.html) provides more detailed information and a full list of types. +These are some of the property types you will see most often when working with ZMK. [Zephyr's Devicetree bindings documentation](https://docs.zephyrproject.org/latest/build/dts/bindings.html) provides more detailed information and a full list of types. #### bool @@ -207,14 +217,14 @@ Example: `property = <&none &mo 1>;` Values can also be split into multiple blocks, e.g. `property = <&none>, <&mo 1>;` -See the documentation for "phandle-array" in [Zephyr's Devicetree bindings documentation](https://docs.zephyrproject.org/latest/guides/dts/bindings.html) +See the documentation for "phandle-array" in [Zephyr's Devicetree bindings documentation](https://docs.zephyrproject.org/latest/build/dts/bindings.html) for more details on how parameters are associated with nodes. #### GPIO array This is just a phandle array. The documentation lists this as a different type to make it clear which properties expect an array of GPIOs. -Each item in the array should be a label for a GPIO node (the names of which differ between hardware platforms) followed by an index and configuration flags. See [Zephyr's GPIO documentation](https://docs.zephyrproject.org/latest/reference/peripherals/gpio.html) for a full list of flags. +Each item in the array should be a label for a GPIO node (the names of which differ between hardware platforms) followed by an index and configuration flags. See [Zephyr's GPIO documentation](https://docs.zephyrproject.org/latest/hardware/peripherals/gpio.html) for a full list of flags. Example: From e0e0928f9c185bd73ad1391605d945e5e3adaace Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Tue, 3 May 2022 21:28:41 -0500 Subject: [PATCH 041/289] fix(docs): Update config docs for review feedback --- docs/docs/config/combos.md | 16 ++++++++-------- docs/docs/config/kscan.md | 10 +++++++++- docs/docs/features/combos.md | 2 +- docs/docs/features/debouncing.md | 10 ++++++++-- docs/docs/features/underglow.md | 2 +- 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/docs/docs/config/combos.md b/docs/docs/config/combos.md index 479cd8e5..cd351125 100644 --- a/docs/docs/config/combos.md +++ b/docs/docs/config/combos.md @@ -23,7 +23,7 @@ If you want a combo that triggers when pressing 5 keys, you must set `CONFIG_ZMK ## Devicetree -Applies to: `compatible = "zmk,combo"` +Applies to: `compatible = "zmk,combos"` Definition file: [zmk/app/dts/bindings/zmk,combos.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Ccombos.yaml) @@ -31,12 +31,12 @@ The `zmk,combos` node itself has no properties. It should have one child node pe Each child node can have the following properties: -| Property | Type | Description | Default | -| --------------- | ------------- | ---------------------------------------------------------------------------------- | ------- | -| `bindings` | phandle-array | A [behavior](../features/keymaps.md#behaviors) to run when the combo is triggered | | -| `key-positions` | array | A list of key position indices for the keys which should trigger the combo | | -| `timeout-ms` | int | All the keys must be pressed within this time in milliseconds to trigger the combo | 50 | -| `slow-release` | bool | Releases the combo when all keys are released instead of when any key is released | false | -| `layers` | array | A list of layers on which the combo may be triggered. `-1` allows all layers. | `<-1>` | +| Property | Type | Description | Default | +| --------------- | ------------- | ----------------------------------------------------------------------------------------------------- | ------- | +| `bindings` | phandle-array | A [behavior](../features/keymaps.md#behaviors) to run when the combo is triggered | | +| `key-positions` | array | A list of key position indices for the keys which should trigger the combo | | +| `timeout-ms` | int | All the keys in `key-positions` must be pressed within this time in milliseconds to trigger the combo | 50 | +| `slow-release` | bool | Releases the combo when all keys are released instead of when any key is released | false | +| `layers` | array | A list of layers on which the combo may be triggered. `-1` allows all layers. | `<-1>` | The `key-positions` array must not be longer than the `CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO` setting, which defaults to 4. If you want a combo that triggers when pressing 5 keys, then you must change the setting to 5. diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index 410f5588..d81d26b6 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -21,7 +21,7 @@ Definition files: | `CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS` | int | Global debounce time for key press in milliseconds | -1 | | `CONFIG_ZMK_KSCAN_DEBOUNCE_RELEASE_MS` | int | Global debounce time for key release in milliseconds | -1 | -If the debounce press/release values are set to any value other than `-1`, they override the `debounce-press-ms` and `debounce-release-ms` devicetree properties for all keyboard scan drivers which support them. +If the debounce press/release values are set to any value other than `-1`, they override the `debounce-press-ms` and `debounce-release-ms` devicetree properties for all keyboard scan drivers which support them. See the [debouncing documentation](../features/debouncing.md) for more details. ### Devicetree @@ -36,6 +36,10 @@ Applies to: [`/chosen` node](https://docs.zephyrproject.org/latest/guides/dts/in Keyboard scan driver which works like a regular matrix but uses a demultiplexer to drive the rows or columns. This allows N GPIOs to drive N2 rows or columns instead of just N like with a regular matrix. +:::note +Currently this driver does not honor the `CONFIG_ZMK_KSCAN_DEBOUNCE_*` settings. +::: + ### Devicetree Applies to: `compatible = "zmk,kscan-gpio-demux"` @@ -54,6 +58,10 @@ Definition file: [zmk/app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-demux Keyboard scan driver where each key has a dedicated GPIO. +:::note +Currently this driver does not honor the `CONFIG_ZMK_KSCAN_DEBOUNCE_*` settings. +::: + ### Kconfig Definition file: [zmk/app/drivers/kscan/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/kscan/Kconfig) diff --git a/docs/docs/features/combos.md b/docs/docs/features/combos.md index 5c73a845..09191896 100644 --- a/docs/docs/features/combos.md +++ b/docs/docs/features/combos.md @@ -25,7 +25,7 @@ Combos configured in your `.keymap` file, but are separate from the `keymap` nod - The name of the combo doesn't really matter, but convention is to start the node name with `combo_`. - The `compatible` property should always be `"zmk,combos"` for combos. -- All the keys must be pressed within `timeout-ms` milliseconds to trigger the combo. +- All the keys in `key-positions` must be pressed within `timeout-ms` milliseconds to trigger the combo. - `key-positions` is an array of key positions. See the info section below about how to figure out the positions on your board. - `layers = <0 1...>` will allow limiting a combo to specific layers. This is an _optional_ parameter, when omitted it defaults to global scope. - `bindings` is the behavior that is activated when the behavior is pressed. diff --git a/docs/docs/features/debouncing.md b/docs/docs/features/debouncing.md index f0022a59..9629131d 100644 --- a/docs/docs/features/debouncing.md +++ b/docs/docs/features/debouncing.md @@ -19,14 +19,20 @@ socket or using some sharp tweezers to bend the contacts back together. ## Debounce Configuration +:::note +Currently only the `zmk,kscan-gpio-matrix` driver supports these options. The other drivers have not yet been updated to use the new debouncing code. +::: + ### Global Options You can set these options in your `.conf` file to control debouncing globally. -Values must be <= 127. +Values must be <= 16383. - `CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS`: Debounce time for key press in milliseconds. Default = 5. - `CONFIG_ZMK_KSCAN_DEBOUNCE_RELEASE_MS`: Debounce time for key release in milliseconds. Default = 5. +If one of these options is set, it overrides the matching per-driver option described below. + For example, this would shorten the debounce time for both press and release: ```ini @@ -37,7 +43,7 @@ CONFIG_ZMK_KSCAN_DEBOUNCE_RELEASE_MS=3 ### Per-driver Options You can add these Devicetree properties to a kscan node to control debouncing for -that instance of the driver. Values must be <= 127. +that instance of the driver. Values must be <= 16383. - `debounce-press-ms`: Debounce time for key press in milliseconds. Default = 5. - `debounce-release-ms`: Debounce time for key release in milliseconds. Default = 5. diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index af182fae..020701fd 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -145,7 +145,7 @@ Once you have your `led_strip` properly defined you need to add it to the root d }; ``` -Finally you need to enable the `CONFIG_ZMK_RGB_UNDERGLOW` and `CONFIG*_STRIP` configuration values in the `.conf` file of your board (or set a default in the `Kconfig.defconfig`): +Finally you need to enable the `CONFIG_ZMK_RGB_UNDERGLOW` and `CONFIG_*_STRIP` configuration values in the `.conf` file of your board (or set a default in the `Kconfig.defconfig`): ``` CONFIG_ZMK_RGB_UNDERGLOW=y From 74b49339800638b745cf0d1b196bb6c7371055be Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 21 May 2022 16:17:11 -0500 Subject: [PATCH 042/289] feat(docs): Clarify descriptions of config files --- docs/docs/config/index.md | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/docs/config/index.md b/docs/docs/config/index.md index a6cb337e..9e35df83 100644 --- a/docs/docs/config/index.md +++ b/docs/docs/config/index.md @@ -22,9 +22,9 @@ When building with a `zmk-config` folder, ZMK will search the `zmk-config/config - `.conf` (Kconfig) - `.keymap` (Devicetree) -These files hold your personal settings for the keyboard. They override any configuration set in the board or shield folders. +These files hold your personal settings for the keyboard. All files are optional. If present, they override any configuration set in the board or shield folders. Otherwise, the default configuration and/or keymap is used. -When using a split keyboard, you can use a single file without the `_left` or `_right` suffix to configure both sides. For example, `corne.conf` and `corne.keymap` will apply to both `corne_left` and `corne_right`. +When using a split keyboard, you can use a single file without the `_left` or `_right` suffix to configure both sides. For example, `corne.conf` and `corne.keymap` will apply to both `corne_left` and `corne_right`. If a shared config file exists, any left or right files will be ignored. ### Board Folder @@ -38,8 +38,11 @@ ZMK will search for config files in either of: ZMK will search the board folder for the following config files: - `_defconfig` (Kconfig) +- `.conf` (Kconfig) - `.dts` (Devicetree) -- `.keymap` (Devictree, standalone boards only) +- `.keymap` (Devicetree, keyboards with onboard controllers only) + +Shared config files (excluding any `_left` or `_right` suffix) are not currently supported in board folders. For more documentation on creating and configuring a new board, see [Zephyr's board porting guide](https://docs.zephyrproject.org/latest/hardware/porting/board_porting.html#write-kconfig-files). @@ -58,6 +61,8 @@ ZMK will search the shield folder for the following config files: - `.overlay` (Devicetree) - `.keymap` (Devicetree) +Shared config files (excluding any `_left` or `_right` suffix) are not currently supported in shield folders. + For more documentation on creating and configuring a new shield, see [Zephyr's shield documentation](https://docs.zephyrproject.org/latest/hardware/porting/shields.html) and [ZMK's new keyboard shield](../development/new-shield.md) guide. ## Kconfig Files @@ -72,7 +77,7 @@ CONFIG_EC11=y CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y ``` -The list of available settings is determined by various files in ZMK whose names start with `Kconfig`. Note that options are _not_ prefixed with `CONFIG_` in these files. +The list of available settings is determined by various files in ZMK whose names start with `Kconfig`. Files ending with `_defconfig` use the same syntax, but are intended for setting configuration specific to the hardware which users typically won't need to change. Note that options are _not_ prefixed with `CONFIG_` in these files. See [Zephyr's Kconfig documentation](https://docs.zephyrproject.org/latest/build/kconfig/index.html) for more details on Kconfig files. @@ -98,7 +103,14 @@ Example: `CONFIG_FOO="foo"` ## Devicetree Files -Various Devicetree files are combined to build a tree that describes the hardware for a keyboard. They are also used to define keymaps. Common file extensions for Devicetree files are `.dts`, `.dtsi`, `.overlay`, and `.keymap`. +Various Devicetree files are combined to build a tree that describes the hardware for a keyboard. They are also used to define keymaps. + +Devicetree files use various file extensions. These indicate the purpose of the file, but they have no effect on how the file is processed. Common file extensions for Devicetree files include: + +- `.dts`: The base hardware definition. +- `.overlay`: Adds to and/or overrides definitions in a `.dts` file. +- `.keymap`: Holds a keymap and user-specific hardware configuration. +- `.dtsi`: A file which is only intended to be `#include`d from another file. Devicetree files look like this: From 6e67e4a3a52cc962aa4da2024ea42b9af1133583 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 21 May 2022 16:50:20 -0500 Subject: [PATCH 043/289] feat(docs): Update direct GPIO configuration --- docs/docs/config/kscan.md | 45 ++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index d81d26b6..ac773f18 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -58,10 +58,6 @@ Definition file: [zmk/app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-demux Keyboard scan driver where each key has a dedicated GPIO. -:::note -Currently this driver does not honor the `CONFIG_ZMK_KSCAN_DEBOUNCE_*` settings. -::: - ### Kconfig Definition file: [zmk/app/drivers/kscan/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/kscan/Kconfig) @@ -76,11 +72,20 @@ Applies to: `compatible = "zmk,kscan-gpio-direct"` Definition file: [zmk/app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/kscan/zmk%2Ckscan-gpio-direct.yaml) -| Property | Type | Description | Default | -| ----------------- | ---------- | ------------------------------- | ------- | -| `label` | string | Unique label for the node | | -| `input-gpios` | GPIO array | Input GPIOs (one per key) | | -| `debounce-period` | int | Debounce period in milliseconds | 5 | +| Property | Type | Description | Default | +| ------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------- | ----------- | +| `label` | string | Unique label for the node | | +| `input-gpios` | GPIO array | Input GPIOs (one per key) | | +| `debounce-press-ms` | int | Debounce time for key press in milliseconds. Use 0 for eager debouncing. | 5 | +| `debounce-release-ms` | int | Debounce time for key release in milliseconds. | 5 | +| `debounce-scan-period-ms` | int | Time between reads in milliseconds when any key is pressed. | 1 | +| `diode-direction` | string | The direction of the matrix diodes | `"row2col"` | +| `poll-period-ms` | int | Time between reads in milliseconds when no key is pressed and `CONFIG_ZMK_KSCAN_DIRECT_POLLING` is enabled. | 10 | +| `toggle-mode` | bool | Use toggle switch mode. | n | + +By default, a switch will drain current through the internal pull up/down resistor whenever it is pressed. This is not ideal for a toggle switch, where the switch may be left in the "pressed" state for a long time. Enabling `toggle-mode` will make the driver flip between pull up and down as the switch is toggled to optimize for power. + +`toggle-mode` applies to all switches handled by the instance of the driver. To use a toggle switch with other, non-toggle, direct GPIO switches, create two instances of the direct GPIO driver, one with `toggle-mode` and the other without. Then, use a [composite driver](#composite-driver) to combine them. ## Matrix Driver @@ -98,16 +103,16 @@ Applies to: `compatible = "zmk,kscan-gpio-matrix"` Definition file: [zmk/app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-matrix.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/kscan/zmk%2Ckscan-gpio-matrix.yaml) -| Property | Type | Description | Default | -| ------------------------- | ---------- | -------------------------------------------------------------------------------------------------- | ----------- | -| `label` | string | Unique label for the node | | -| `row-gpios` | GPIO array | Matrix row GPIOs in order, starting from the top row | | -| `col-gpios` | GPIO array | Matrix column GPIOs in order, starting from the leftmost row | | -| `debounce-press-ms` | int | Debounce time for key press in milliseconds. Use 0 for eager debouncing. | 5 | -| `debounce-release-ms` | int | Debounce time for key release in milliseconds. | 5 | -| `debounce-scan-period-ms` | int | Time between reads in milliseconds when any key is pressed. | 1 | -| `diode-direction` | string | The direction of the matrix diodes | `"row2col"` | -| `poll-period-ms` | int | Time between reads in milliseconds when no key is pressed and ZMK_KSCAN_MATRIX_POLLING is enabled. | 10 | +| Property | Type | Description | Default | +| ------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------- | ----------- | +| `label` | string | Unique label for the node | | +| `row-gpios` | GPIO array | Matrix row GPIOs in order, starting from the top row | | +| `col-gpios` | GPIO array | Matrix column GPIOs in order, starting from the leftmost row | | +| `debounce-press-ms` | int | Debounce time for key press in milliseconds. Use 0 for eager debouncing. | 5 | +| `debounce-release-ms` | int | Debounce time for key release in milliseconds. | 5 | +| `debounce-scan-period-ms` | int | Time between reads in milliseconds when any key is pressed. | 1 | +| `diode-direction` | string | The direction of the matrix diodes | `"row2col"` | +| `poll-period-ms` | int | Time between reads in milliseconds when no key is pressed and `CONFIG_ZMK_KSCAN_MATRIX_POLLING` is enabled. | 10 | The `diode-direction` property must be one of: @@ -213,7 +218,7 @@ One possible way to do this is a 3x4 matrix where the direct GPIO keys are shift // Include the direct GPIO driver... direct { kscan = <&kscan2>; - row-offset = <3>; // ..and shift it to not overlap + row-offset = <3>; // ...and shift it to not overlap }; }; From 1646cd7f3048e98fb80b09bc56f458b237cfac61 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 21 May 2022 17:15:41 -0500 Subject: [PATCH 044/289] feat(docs): Add a simpler matrix transform example --- docs/docs/config/kscan.md | 65 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index ac773f18..984fd6ac 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -281,7 +281,70 @@ Definition file: [zmk/app/dts/bindings/zmk,matrix-transform.yaml](https://github The `map` array should be defined using the `RC()` macro from [dt-bindings/zmk/matrix_transform.h](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/matrix_transform.h). It should have one item per logical position in the keymap. Each item should list the physical row and column that should trigger the key in that position. -### Example Configuration +### Example: Skipping Unused Positions + +Any keyboard which is not a grid of 1 unit keys will likely have some unused positions in the matrix. A matrix transform can be used to skip the unused positions so users don't have to set them to `&none` in keymaps. + +```devicetree +// numpad.overlay +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + rows = <5>; + columns = <4>; + // define the matrix... + }; + + default_transform: matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <5>; + columns = <4>; + // ┌───┬───┬───┬───┐ + // │NUM│ / │ * │ - │ + // ├───┼───┼───┼───┤ + // │ 7 │ 8 │ 9 │ + │ + // ├───┼───┼───┤ │ + // │ 4 │ 5 │ 6 │ │ + // ├───┼───┼───┼───┤ + // │ 1 │ 2 │ 3 │RET│ + // ├───┴───┼───┤ │ + // │ 0 │ . │ │ + // └───────┴───┴───┘ + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) + RC(2,0) RC(2,1) RC(2,2) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) + RC(4,0) RC(4,1) + >; + }; +}; +``` + +```devicetree +// numpad.keymap +/ { + keymap { + compatible = "zmk,keymap"; + default { + bindings = < + &kp KP_NUM &kp KP_DIV &kp KP_MULT &kp KP_MINUS + &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_PLUS + &kp KP_N4 &kp KP_N5 &kp KP_N6 + &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_ENTER + &kp KP_N0 &kp KP_DOT + >; + }; + } +}; +``` + +### Example: Non-standard Matrix Consider a keyboard with a [duplex matrix](https://wiki.ai03.com/books/pcb-design/page/matrices-and-duplex-matrix), where the matrix has twice as many rows and half as many columns as the keyboard has keys. A matrix transform can be used to correct for this so that keymaps can match the layout of the keys, not the layout of the matrix. From ae78aa247a99b0b0e7d77cf680c7e419955354ca Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 21 May 2022 17:48:27 -0500 Subject: [PATCH 045/289] feat(docs): Update power and lighting config pages Moved battery configuration to its own page to match the feature page. Documented that external power is disabled when in sleep mode. Clarified that the *_START configs apply on first boot, and any changes after that are persisted. --- docs/docs/config/backlight.md | 4 ++++ docs/docs/config/battery.md | 40 +++++++++++++++++++++++++++++++++++ docs/docs/config/behaviors.md | 6 +++--- docs/docs/config/power.md | 12 +---------- docs/docs/config/underglow.md | 4 ++++ docs/docs/features/battery.md | 2 ++ docs/sidebars.js | 3 ++- 7 files changed, 56 insertions(+), 15 deletions(-) create mode 100644 docs/docs/config/battery.md diff --git a/docs/docs/config/backlight.md b/docs/docs/config/backlight.md index abdbc82b..a3650766 100644 --- a/docs/docs/config/backlight.md +++ b/docs/docs/config/backlight.md @@ -20,6 +20,10 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/ | `CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE` | bool | Turn off backlight when keyboard goes into idle state | n | | `CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB` | bool | Turn off backlight when USB is disconnected | n | +:::note +The `*_START` settings only determine the initial backlight state. Any changes you make with the [backlight behavior](../behaviors/backlight.md) are saved to flash after a one minute delay and will be used after that. +::: + ## Devicetree Applies to: [`/chosen` node](https://docs.zephyrproject.org/latest/build/dts/intro.html#aliases-and-chosen-nodes) diff --git a/docs/docs/config/battery.md b/docs/docs/config/battery.md new file mode 100644 index 00000000..73b4ee92 --- /dev/null +++ b/docs/docs/config/battery.md @@ -0,0 +1,40 @@ +--- +title: Battery Level +sidebar_label: Battery Level +--- + +See the [battery level feature page](../features/battery.md) for more details on configuring a battery sensor. + +See [Configuration Overview](index.md) for instructions on how to change these settings. + +### Devicetree + +Applies to: [`/chosen` node](https://docs.zephyrproject.org/latest/guides/dts/intro.html#aliases-and-chosen-nodes) + +| Property | Type | Description | +| ------------- | ---- | --------------------------------------------- | +| `zmk,battery` | path | The node for the battery sensor driver to use | + +## Battery Voltage Divider Sensor + +Driver for reading the voltage of a battery using an ADC connected to a voltage divider. + +### Devicetree + +Applies to: `compatible = "zmk,battery-voltage-divider"` + +See [Zephyr's voltage divider documentation](https://docs.zephyrproject.org/latest/build/dts/api/bindings/adc/voltage-divider.html). + +## nRF VDDH Battery Sensor + +Driver for reading the voltage of a battery using a Nordic nRF52's VDDH pin. This driver has no configuration except for the required `label` property. + +### Devicetree + +Applies to: `compatible = "zmk,battery-nrf-vddh"` + +Definition file: [zmk/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/sensor/zmk%2Cbattery-nrf-vddh.yaml) + +| Property | Type | Description | +| -------- | ------ | ------------------------- | +| `label` | string | Unique label for the node | diff --git a/docs/docs/config/behaviors.md b/docs/docs/config/behaviors.md index 4a01dfd3..72db21d7 100644 --- a/docs/docs/config/behaviors.md +++ b/docs/docs/config/behaviors.md @@ -158,9 +158,9 @@ See [dt-bindings/zmk/modifiers.h](https://github.com/zmkfirmware/zmk/blob/main/a You can use the following nodes to tweak the default behaviors: -| Node | Behavior | -| -------- | ------------ | -| `&gresc` | Grave escape | +| Node | Behavior | +| -------- | ----------------------------------------- | +| `&gresc` | [Grave escape](../behaviors/mod-morph.md) | ## Sticky Key diff --git a/docs/docs/config/power.md b/docs/docs/config/power.md index bf0de718..e09045ed 100644 --- a/docs/docs/config/power.md +++ b/docs/docs/config/power.md @@ -12,7 +12,7 @@ Configuration for entering low power modes when the keyboard is idle. In the idle state, peripherals such as displays and lighting are disabled, but the keyboard remains connected to Bluetooth so it can immediately respond when you press a key. -In the deep sleep state, the keyboard additionally disconnects from Bluetooth. This state uses very little power, but it may take a few seconds to reconnect after waking. +In the deep sleep state, the keyboard additionally disconnects from Bluetooth and any external power output is disabled. This state uses very little power, but it may take a few seconds to reconnect after waking. ### Kconfig @@ -45,13 +45,3 @@ Applies to: `compatible = "zmk,ext-power-generic"` | `label` | string | Unique label for the node | | `control-gpios` | GPIO array | List of GPIOs which should be active to enable external power | | `init-delay-ms` | int | number of milliseconds to delay after initializing the driver | - -## Battery Voltage Divider - -Driver for reading the voltage of a battery using an ADC connected to a voltage divider. - -### Devicetree - -Applies to: `compatible = "zmk,battery-voltage-divider"` - -See [Zephyr's voltage divider documentation](https://docs.zephyrproject.org/latest/build/dts/api/bindings/adc/voltage-divider.html). diff --git a/docs/docs/config/underglow.md b/docs/docs/config/underglow.md index 6353330d..f9d9e15d 100644 --- a/docs/docs/config/underglow.md +++ b/docs/docs/config/underglow.md @@ -36,6 +36,10 @@ Values for `CONFIG_ZMK_RGB_UNDERGLOW_EFF_START`: | 2 | Spectrum | | 3 | Swirl | +:::note +The `*_START` settings only determine the initial underglow state. Any changes you make with the [underglow behavior](../behaviors/underglow.md) are saved to flash after a one minute delay and will be used after that. +::: + ## Devicetree ZMK does not have any Devicetree properties of its own. See the Devicetree bindings for [Zephyr's LED strip drivers](https://github.com/zephyrproject-rtos/zephyr/tree/main/dts/bindings/led_strip). diff --git a/docs/docs/features/battery.md b/docs/docs/features/battery.md index 0b4172c2..42ba6d40 100644 --- a/docs/docs/features/battery.md +++ b/docs/docs/features/battery.md @@ -20,6 +20,8 @@ To enable a battery sensor on a new board, add the driver for the sensor to your - `zmk,battery-voltage-divider`: Reads the voltage on an analog input pin. - `zmk,battery-nrf-vddh`: Reads the power supply voltage on a Nordic nRF52's VDDH pin. +See the [battery level configuration page](../config/battery.md) for the configuration supported by each driver provided by ZMK. + Zephyr also provides some drivers for fuel gauge ICs such as the TI bq274xx series and Maxim MAX17xxx series. If you use a battery sensor that does not have an existing driver, you will need to write a new driver that supports the `SENSOR_CHAN_GAUGE_STATE_OF_CHARGE` sensor channel and contribute it to Zephyr or ZMK. Once you have the sensor driver defined, add a `zmk,battery` property to the `chosen` node and set it to reference the sensor node. For example: diff --git a/docs/sidebars.js b/docs/sidebars.js index 231d4f71..7b445a29 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -55,6 +55,7 @@ module.exports = { Configuration: [ "config/index", "config/backlight", + "config/battery", "config/behaviors", "config/combos", "config/displays", @@ -62,8 +63,8 @@ module.exports = { "config/keymap", "config/kscan", "config/power", - "config/system", "config/underglow", + "config/system", ], Development: [ "development/clean-room", From 851c37e14fb1315203caf5f7807cdf4bf922a464 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 3 Jul 2022 14:05:55 -0700 Subject: [PATCH 046/289] fix(docs): Apply suggestions from #722 reviews --- docs/docs/config/behaviors.md | 12 ++++++------ docs/docs/config/kscan.md | 8 ++++---- docs/docs/config/system.md | 13 +++++++------ docs/docs/development/new-shield.md | 6 ++++++ 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/docs/docs/config/behaviors.md b/docs/docs/config/behaviors.md index 72db21d7..a4e847dc 100644 --- a/docs/docs/config/behaviors.md +++ b/docs/docs/config/behaviors.md @@ -21,12 +21,12 @@ Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-caps-word.yaml](ht Applies to: `compatible = "zmk,behavior-caps-word"` -| Property | Type | Description | Default | -| ---------------- | ------ | ------------------------------------------------------------------ | -------------- | -| `label` | string | Unique label for the node | | -| `#binding-cells` | int | Must be `<0>` | | -| `continue-list` | array | List of [key codes](/docs/codes) which do not deactivate caps lock | `` | -| `mods` | int | A bit field of modifiers to apply | `` | +| Property | Type | Description | Default | +| ---------------- | ------ | ------------------------------------------------------------------ | ------------------------------- | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must be `<0>` | | +| `continue-list` | array | List of [key codes](/docs/codes) which do not deactivate caps lock | `` | +| `mods` | int | A bit field of modifiers to apply | `` | `continue-list` is treated as if it always includes alphanumeric characters (A-Z, 0-9). diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index 984fd6ac..77dc23cb 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -134,8 +134,8 @@ Definition file: [zmk/app/dts/bindings/zmk,kscan-composite.yaml](https://github. | Property | Type | Description | Default | | -------- | ------ | --------------------------------------------- | ------- | | `label` | string | Unique label for the node | | -| `rows` | int | The number rows of in the composite matrix | | -| `cols` | int | The number columns of in the composite matrix | | +| `rows` | int | The number of rows in the composite matrix | | +| `cols` | int | The number of columns in the composite matrix | | The `zmk,kscan-composite` node should have one child node per keyboard scan driver that should be composited. Each child node can have the following properties: @@ -249,8 +249,8 @@ Definition file: [zmk/app/dts/bindings/zmk,kscan-mock.yaml](https://github.com/z | `label` | string | Unique label for the node | | | `event-period` | int | Milliseconds between each generated event | | | `events` | array | List of key events to simulate | | -| `rows` | int | The number rows of in the composite matrix | | -| `cols` | int | The number columns of in the composite matrix | | +| `rows` | int | The number of rows in the composite matrix | | +| `cols` | int | The number of columns in the composite matrix | | | `exit-after` | bool | Exit the program after running all events | false | The `events` array should be defined using the macros from [dt-bindings/zmk/kscan_mock.h](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/kscan_mock.h). diff --git a/docs/docs/config/system.md b/docs/docs/config/system.md index cf88c4f5..af7bced5 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -13,12 +13,13 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/ ### General -| Config | Type | Description | Default | -| ----------------------------------- | ------ | ----------------------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_KEYBOARD_NAME` | string | The name of the keyboard | | -| `CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE` | int | Milliseconds to wait after a setting change before writing it to flash memory | 60000 | -| `CONFIG_ZMK_WPM` | bool | Enable calculating words per minute | n | -| `CONFIG_HEAP_MEM_POOL_SIZE` | int | Size of the heap memory pool | 8192 | +| Config | Type | Description | Default | +| ------------------------------------ | ------ | ----------------------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_KEYBOARD_NAME` | string | The name of the keyboard | | +| `CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE` | int | Milliseconds to wait after a setting change before writing it to flash memory | 60000 | +| `CONFIG_ZMK_WPM` | bool | Enable calculating words per minute | n | +| `CONFIG_HEAP_MEM_POOL_SIZE` | int | Size of the heap memory pool | 8192 | +| `CONFIG_ZMK_BATTERY_REPORT_INTERVAL` | int | Battery level report interval in seconds | 60 | ### HID diff --git a/docs/docs/development/new-shield.md b/docs/docs/development/new-shield.md index b46c319d..03a27289 100644 --- a/docs/docs/development/new-shield.md +++ b/docs/docs/development/new-shield.md @@ -157,6 +157,8 @@ this might look something like: }; ``` +See the [Keyboard Scan configuration documentation](../config/kscan.md) for details on configuring the KSCAN driver. + @@ -260,6 +262,8 @@ This is exemplified with the iris .overlay files. ``` +See the [Keyboard Scan configuration documentation](../config/kscan.md) for details on configuring the KSCAN driver. + ### .conf files (Split Shields) While unibody boards only have one .conf file that applies configuration characteristics to the entire keyboard, @@ -341,6 +345,8 @@ Some important things to note: - `RC(row, column)` is placed sequentially to define what row and column values that position corresponds to. - If you have a keyboard with options for `2u` keys in certain positions, or break away portions, it is a good idea to set the chosen `zmk,matrix_transform` to the default arrangement, and include _other_ possible matrix transform nodes in the devicetree that users can select in their user config by overriding the chosen node. +See the [matrix transform section](../config/kscan.md#matrix-transform) in the Keyboard Scan configuration documentation for details and more examples of matrix transforms. + ## Default Keymap Each keyboard should provide an OOTB default keymap to be used when building the firmware, which can be overridden and customized by user configs. For "shield keyboards", this should be placed in the `app/boards/shields//.keymap` file. The keymap is configured as an additional devicetree overlay that includes the following: From 19d8c5ba40b3e8767f68db7c9f16e595f638e423 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 3 Jul 2022 14:20:47 -0700 Subject: [PATCH 047/289] feat(docs): Document new underglow Kconfig --- docs/docs/config/underglow.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/docs/docs/config/underglow.md b/docs/docs/config/underglow.md index f9d9e15d..1209e60e 100644 --- a/docs/docs/config/underglow.md +++ b/docs/docs/config/underglow.md @@ -13,19 +13,21 @@ RGB underglow depends on [Zephyr's LED strip driver](https://github.com/zephyrpr Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) -| Config | Type | Description | Default | -| ------------------------------------ | ---- | ----------------------------------------------------- | ------- | -| `CONFIG_ZMK_RGB_UNDERGLOW` | bool | Enable RGB underglow | n | -| `CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER` | bool | Underglow toggling also controls external power | y | -| `CONFIG_ZMK_RGB_UNDERGLOW_HUE_STEP` | int | Hue step in degrees (0-359) used by RGB actions | 10 | -| `CONFIG_ZMK_RGB_UNDERGLOW_SAT_STEP` | int | Saturation step in percent used by RGB actions | 10 | -| `CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP` | int | Brightness step in percent used by RGB actions | 10 | -| `CONFIG_ZMK_RGB_UNDERGLOW_HUE_START` | int | Default hue in degrees (0-359) | 0 | -| `CONFIG_ZMK_RGB_UNDERGLOW_SAT_START` | int | Default saturation percent (0-100) | 100 | -| `CONFIG_ZMK_RGB_UNDERGLOW_BRT_START` | int | Default brightness in percent (0-100) | 100 | -| `CONFIG_ZMK_RGB_UNDERGLOW_SPD_START` | int | Default effect speed (1-5) | 3 | -| `CONFIG_ZMK_RGB_UNDERGLOW_EFF_START` | int | Default effect index from the effect list (see below) | 0 | -| `CONFIG_ZMK_RGB_UNDERGLOW_ON_START` | bool | Default on state | y | +| Config | Type | Description | Default | +| ---------------------------------------- | ---- | --------------------------------------------------------- | ------- | +| `CONFIG_ZMK_RGB_UNDERGLOW` | bool | Enable RGB underglow | n | +| `CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER` | bool | Underglow toggling also controls external power | y | +| `CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE` | bool | Turn off RGB underglow when keyboard goes into idle state | n | +| `CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB` | bool | Turn off RGB underglow when USB is disconnected | n | +| `CONFIG_ZMK_RGB_UNDERGLOW_HUE_STEP` | int | Hue step in degrees (0-359) used by RGB actions | 10 | +| `CONFIG_ZMK_RGB_UNDERGLOW_SAT_STEP` | int | Saturation step in percent used by RGB actions | 10 | +| `CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP` | int | Brightness step in percent used by RGB actions | 10 | +| `CONFIG_ZMK_RGB_UNDERGLOW_HUE_START` | int | Default hue in degrees (0-359) | 0 | +| `CONFIG_ZMK_RGB_UNDERGLOW_SAT_START` | int | Default saturation percent (0-100) | 100 | +| `CONFIG_ZMK_RGB_UNDERGLOW_BRT_START` | int | Default brightness in percent (0-100) | 100 | +| `CONFIG_ZMK_RGB_UNDERGLOW_SPD_START` | int | Default effect speed (1-5) | 3 | +| `CONFIG_ZMK_RGB_UNDERGLOW_EFF_START` | int | Default effect index from the effect list (see below) | 0 | +| `CONFIG_ZMK_RGB_UNDERGLOW_ON_START` | bool | Default on state | y | Values for `CONFIG_ZMK_RGB_UNDERGLOW_EFF_START`: From 41c9d810967c3be71df9c3727660ce968756ce34 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 3 Jul 2022 14:48:09 -0700 Subject: [PATCH 048/289] fix(docs): Update config docs for split Kconfig refactor --- docs/docs/config/system.md | 51 +++++++++++++++------------ docs/docs/development/new-behavior.md | 4 +-- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/docs/docs/config/system.md b/docs/docs/config/system.md index af7bced5..4784339c 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -64,28 +64,19 @@ Exactly zero or one of the following options may be set to `y`. The first is use See [Zephyr's Bluetooth stack architecture documentation](https://docs.zephyrproject.org/latest/guides/bluetooth/bluetooth-arch.html) for more information on configuring Bluetooth. -| Config | Type | Description | Default | -| ----------------------------------------------------- | ---- | ----------------------------------------------------------------------- | ------- | -| `CONFIG_BT` | bool | Enable Bluetooth support | | -| `CONFIG_BT_MAX_CONN` | int | Maximum number of simultaneous Bluetooth connections | 5 | -| `CONFIG_BT_MAX_PAIRED` | int | Maximum number of paired Bluetooth devices | 5 | -| `CONFIG_ZMK_BLE` | bool | Enable ZMK as a Bluetooth keyboard | | -| `CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START` | bool | Clears all bond information from the keyboard on startup | n | -| `CONFIG_ZMK_BLE_CONSUMER_REPORT_QUEUE_SIZE` | int | Max number of consumer HID reports to queue for sending over BLE | 5 | -| `CONFIG_ZMK_BLE_KEYBOARD_REPORT_QUEUE_SIZE` | int | Max number of keyboard HID reports to queue for sending over BLE | 20 | -| `CONFIG_ZMK_BLE_INIT_PRIORITY` | int | BLE init priority | 50 | -| `CONFIG_ZMK_BLE_THREAD_PRIORITY` | int | Priority of the BLE notify thread | 5 | -| `CONFIG_ZMK_BLE_THREAD_STACK_SIZE` | int | Stack size of the BLE notify thread | 512 | -| `CONFIG_ZMK_BLE_PASSKEY_ENTRY` | bool | Experimental: require typing passkey from host to pair BLE connection | n | -| `CONFIG_ZMK_SPLIT` | bool | Enable split keyboard support | n | -| `CONFIG_ZMK_SPLIT_BLE` | bool | Use BLE to communicate between split keyboard halves | y | -| `CONFIG_ZMK_SPLIT_BLE_ROLE_CENTRAL` | bool | `y` for central device, `n` for peripheral | | -| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue when received from peripherals | 5 | -| `CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE` | int | Stack size of the BLE split central write thread | 512 | -| `CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE` | int | Max number of behavior run events to queue to send to the peripheral(s) | 5 | -| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE` | int | Stack size of the BLE split peripheral notify thread | 650 | -| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY` | int | Priority of the BLE split peripheral notify thread | 5 | -| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue to send to the central | 10 | +| Config | Type | Description | Default | +| ------------------------------------------- | ---- | --------------------------------------------------------------------- | ------- | +| `CONFIG_BT` | bool | Enable Bluetooth support | | +| `CONFIG_BT_MAX_CONN` | int | Maximum number of simultaneous Bluetooth connections | 5 | +| `CONFIG_BT_MAX_PAIRED` | int | Maximum number of paired Bluetooth devices | 5 | +| `CONFIG_ZMK_BLE` | bool | Enable ZMK as a Bluetooth keyboard | | +| `CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START` | bool | Clears all bond information from the keyboard on startup | n | +| `CONFIG_ZMK_BLE_CONSUMER_REPORT_QUEUE_SIZE` | int | Max number of consumer HID reports to queue for sending over BLE | 5 | +| `CONFIG_ZMK_BLE_KEYBOARD_REPORT_QUEUE_SIZE` | int | Max number of keyboard HID reports to queue for sending over BLE | 20 | +| `CONFIG_ZMK_BLE_INIT_PRIORITY` | int | BLE init priority | 50 | +| `CONFIG_ZMK_BLE_THREAD_PRIORITY` | int | Priority of the BLE notify thread | 5 | +| `CONFIG_ZMK_BLE_THREAD_STACK_SIZE` | int | Stack size of the BLE notify thread | 512 | +| `CONFIG_ZMK_BLE_PASSKEY_ENTRY` | bool | Experimental: require typing passkey from host to pair BLE connection | n | Note that `CONFIG_BT_MAX_CONN` and `CONFIG_BT_MAX_PAIRED` should be set to the same value. On a split keyboard they should only be set for the central and must be set to one greater than the desired number of bluetooth profiles. @@ -95,3 +86,19 @@ Note that `CONFIG_BT_MAX_CONN` and `CONFIG_BT_MAX_PAIRED` should be set to the s | ------------------------ | ---- | ---------------------------------------- | ------- | | `CONFIG_ZMK_USB_LOGGING` | bool | Enable USB CDC ACM logging for debugging | n | | `CONFIG_ZMK_LOG_LEVEL` | int | Log level for ZMK debug messages | 4 | + +### Split keyboards + +Following split keyboard settings are defined in [zmk/app/src/split/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/split/Kconfig) (generic) and [zmk/app/src/split/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/split/bluetooth/Kconfig) (bluetooth). + +| Config | Type | Description | Default | +| ----------------------------------------------------- | ---- | ----------------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_SPLIT` | bool | Enable split keyboard support | n | +| `CONFIG_ZMK_SPLIT_BLE` | bool | Use BLE to communicate between split keyboard halves | y | +| `CONFIG_ZMK_SPLIT_ROLE_CENTRAL` | bool | `y` for central device, `n` for peripheral | | +| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue when received from peripherals | 5 | +| `CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE` | int | Stack size of the BLE split central write thread | 512 | +| `CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE` | int | Max number of behavior run events to queue to send to the peripheral(s) | 5 | +| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE` | int | Stack size of the BLE split peripheral notify thread | 650 | +| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY` | int | Priority of the BLE split peripheral notify thread | 5 | +| `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue to send to the central | 10 | diff --git a/docs/docs/development/new-behavior.md b/docs/docs/development/new-behavior.md index 782dc010..af98613e 100644 --- a/docs/docs/development/new-behavior.md +++ b/docs/docs/development/new-behavior.md @@ -347,8 +347,8 @@ endif() For behaviors that do not require central locality, the following options for updating `app/CmakeLists.txt` also exist: - Behavior applies to unibody, or central or peripheral half of keyboard: place `target_sources(app PRIVATE .c)` line _before_ `if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL)` -- Behavior applies to _only_ central half of split keyboard: place `target_sources(app PRIVATE .c)` after `if (CONFIG_ZMK_SPLIT_BLE AND CONFIG_ZMK_SPLIT_ROLE_CENTRAL)` -- Behavior applies to _only_ peripheral half of split keyboard: place `target_sources(app PRIVATE .c)` after `if (CONFIG_ZMK_SPLIT_BLE AND (NOT CONFIG_ZMK_SPLIT_ROLE_CENTRAL))` +- Behavior applies to _only_ central half of split keyboard: place `target_sources(app PRIVATE .c)` after `if (CONFIG_ZMK_SPLIT AND CONFIG_ZMK_SPLIT_ROLE_CENTRAL)` +- Behavior applies to _only_ peripheral half of split keyboard: place `target_sources(app PRIVATE .c)` after `if (CONFIG_ZMK_SPLIT AND (NOT CONFIG_ZMK_SPLIT_ROLE_CENTRAL))` - Behavior requires certain condition in a keyboard's `.conf` file to be met: use `target_sources_ifdef(CONFIG_ app PRIVATE .c)` instead of `target_sources(.c)` ### Defining common use-cases for the behavior (`.dtsi`) (Optional) From b1ce8a0d3346be78301637a9861e4b70587aa2bb Mon Sep 17 00:00:00 2001 From: "byran.tech" <61983584+Hello9999901@users.noreply.github.com> Date: Tue, 12 Jul 2022 03:47:19 -0400 Subject: [PATCH 049/289] fix(docs): typo fixes --- docs/docs/config/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/config/index.md b/docs/docs/config/index.md index 9e35df83..51fd45b7 100644 --- a/docs/docs/config/index.md +++ b/docs/docs/config/index.md @@ -134,7 +134,7 @@ See [Zephyr's Devicetree guide](https://docs.zephyrproject.org/latest/build/dts/ ### Changing Devicetree Properties Since Devicetree properties are set for specific nodes in the tree, you will first need to find the node you want to configure. You will typically need to -search through the `.dts` file for you board, `.overlay` file for your shield, or a `.dtsi` file included in by of those files using an `#include` statement. +search through the `.dts` file for your board, `.overlay` file for your shield, or a `.dtsi` file included by those files using an `#include` statement. A Devicetree node looks like this: From 08c43feaaff548b4ba7d32a26e72313024a989bc Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 19 Apr 2022 03:02:00 -0400 Subject: [PATCH 050/289] feat(kscan): Kconfig for optional scan delay. Add optional Kconfig setting to delay scanning after each output column is set, and inputs are read, to allow inputs to "settle" after the last column is set back to inactive. --- app/drivers/kscan/Kconfig | 14 ++++++++++++++ app/drivers/kscan/kscan_gpio_matrix.c | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/app/drivers/kscan/Kconfig b/app/drivers/kscan/Kconfig index c9ace0a3..b76a27b4 100644 --- a/app/drivers/kscan/Kconfig +++ b/app/drivers/kscan/Kconfig @@ -30,6 +30,20 @@ config ZMK_KSCAN_GPIO_MATRIX default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_MATRIX)) select ZMK_KSCAN_GPIO_DRIVER +if ZMK_KSCAN_GPIO_MATRIX + +config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS + int "Ticks to wait between each output when scanning" + default 0 + help + When iterating over each output to drive it active, read inputs, then set + inactive again, some boards may take time for the previous output to + "settle" before reading inputs for the next active output column. In that + scenario, set this value to a positive value to configure the number of + usecs to wait after reading each column of keys. + +endif # ZMK_KSCAN_GPIO_MATRIX + config ZMK_KSCAN_MOCK_DRIVER bool default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_MOCK)) diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index fc355ca2..1ab4d442 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -250,6 +250,10 @@ static int kscan_matrix_read(const struct device *dev) { LOG_ERR("Failed to set output %i inactive: %i", o, err); return err; } + +#if CONFIG_ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS > 0 + k_busy_wait(CONFIG_ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS); +#endif } // Process the new state. From f68692effd96a75627d0b3e96d77f47f37d9f5f7 Mon Sep 17 00:00:00 2001 From: GreenAirplane Date: Wed, 20 Jul 2022 11:17:19 -0400 Subject: [PATCH 051/289] feat(docs): Document behavior queue limit for Macros (#1384) Co-authored-by: Cem Aksoylar Co-authored-by: Dom H --- docs/docs/behaviors/macros.md | 6 ++++++ docs/docs/config/behaviors.md | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/docs/docs/behaviors/macros.md b/docs/docs/behaviors/macros.md index aca9eb7a..1648892e 100644 --- a/docs/docs/behaviors/macros.md +++ b/docs/docs/behaviors/macros.md @@ -134,6 +134,12 @@ bindings ; ``` +### Behavior Queue Limit + +Macros use an internal queue to invoke each behavior in the bindings list when triggered, which has a size of 64 by default. Bindings in "press" and "release" modes correspond to one event in the queue, whereas "tap" mode bindings correspond to two (one for press and one for release). As a result, the effective number of actions processed might be less than 64 and this can cause problems for long macros. + +To prevent issues with longer macros, you can change the size of this queue via the `CONFIG_ZMK_BEHAVIORS_QUEUE_SIZE` setting in your configuration, [typically through your `.conf` file](../config/index.md). For example, `CONFIG_ZMK_BEHAVIORS_QUEUE_SIZE=512` would allow your macro to type about 256 characters. + ## Common Patterns Below are some examples of how the macro behavior can be used for various useful functionality. diff --git a/docs/docs/config/behaviors.md b/docs/docs/config/behaviors.md index a4e847dc..67f5ce74 100644 --- a/docs/docs/config/behaviors.md +++ b/docs/docs/config/behaviors.md @@ -9,6 +9,14 @@ See [Configuration Overview](index.md) for instructions on how to change these s See the [zmk/app/dts/behaviors/](https://github.com/zmkfirmware/zmk/tree/main/app/dts/behaviors) folder for all default behaviors. +## Common + +### Kconfig + +| Config | Type | Description | Default | +| --------------------------------- | ---- | ------------------------------------------------------------------------------------ | ------- | +| `CONFIG_ZMK_BEHAVIORS_QUEUE_SIZE` | int | Maximum number of behaviors to allow queueing from a macro or other complex behavior | 64 | + ## Caps Word Creates a custom behavior that behaves similar to a caps lock but deactivates when any key not in a continue list is pressed. From 54aa3e6a1e1dd26d945edaf9c45672bd093dd744 Mon Sep 17 00:00:00 2001 From: "byran.tech" <61983584+Hello9999901@users.noreply.github.com> Date: Mon, 25 Jul 2022 23:43:56 -0400 Subject: [PATCH 052/289] fix(docs): typo fixes * Update user-setup.md --- docs/docs/user-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index faa4bef8..06c168b3 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -199,7 +199,7 @@ storage device. Once the flash is complete, the controller should automatically ZMK will automatically advertise itself as connectable if it is not currently connected to a device. You should be able to see your keyboard from the bluetooth scanning view of your laptop or phone / tablet. It is reported by some users that the connections with Android / iOS devices are generally smoother than with laptops, so if you have trouble connecting, you could try to connect from your phone or tablet first to eliminate any potential hardware issues. -ZMK support multiple BLE “profiles”, which allows you to connect to and switch among multiple devices. Please refer to the [Bluetooth behavior](behaviors/bluetooth.md) section for detailed explanations of how to use them. +ZMK supports multiple BLE “profiles”, which allows you to connect to and switch among multiple devices. Please refer to the [Bluetooth behavior](behaviors/bluetooth.md) section for detailed explanations on how to use them. ### Connecting Split Keyboard Halves From c4a47c08def72ae0b096e949f4388e5a539187b6 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 24 Jan 2022 14:34:48 -0500 Subject: [PATCH 053/289] fix(display): Initialize display on queue as well. --- app/src/display/main.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/app/src/display/main.c b/app/src/display/main.c index 5dfad910..79a054a7 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -85,26 +85,20 @@ static void stop_display_updates() { int zmk_display_is_initialized() { return initialized; } -int zmk_display_init() { +void initialize_display(struct k_work *work) { LOG_DBG(""); display = device_get_binding(ZMK_DISPLAY_NAME); if (display == NULL) { LOG_ERR("Failed to find display device"); - return -EINVAL; + return; } -#if IS_ENABLED(CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED) - k_work_queue_start(&display_work_q, display_work_stack_area, - K_THREAD_STACK_SIZEOF(display_work_stack_area), - CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_PRIORITY, NULL); -#endif - screen = zmk_display_status_screen(); if (screen == NULL) { LOG_ERR("No status screen provided"); - return 0; + return; } lv_scr_load(screen); @@ -112,6 +106,20 @@ int zmk_display_init() { start_display_updates(); initialized = true; +} + +K_WORK_DEFINE(init_work, initialize_display); + +int zmk_display_init() { + LOG_DBG(""); + +#if IS_ENABLED(CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED) + k_work_queue_start(&display_work_q, display_work_stack_area, + K_THREAD_STACK_SIZEOF(display_work_stack_area), + CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_PRIORITY, NULL); +#endif + + k_work_submit_to_queue(zmk_display_work_q(), &init_work); LOG_DBG(""); return 0; From e3efffa9a885c5d10d7b248b96fe8bc163c070ce Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 25 Apr 2022 22:07:13 -0400 Subject: [PATCH 054/289] refactor(display): Move clear to unblank for EPD driver. --- app/drivers/display/il0323.c | 110 +++++++++++++++++------------------ 1 file changed, 53 insertions(+), 57 deletions(-) diff --git a/app/drivers/display/il0323.c b/app/drivers/display/il0323.c index b8117584..f6c9037e 100644 --- a/app/drivers/display/il0323.c +++ b/app/drivers/display/il0323.c @@ -115,28 +115,6 @@ static int il0323_update_display(const struct device *dev) { return 0; } -static int il0323_blanking_off(const struct device *dev) { - struct il0323_data *driver = dev->data; - - if (blanking_on) { - /* Update EPD pannel in normal mode */ - il0323_busy_wait(driver); - if (il0323_update_display(dev)) { - return -EIO; - } - } - - blanking_on = false; - - return 0; -} - -static int il0323_blanking_on(const struct device *dev) { - blanking_on = true; - - return 0; -} - static int il0323_write(const struct device *dev, const uint16_t x, const uint16_t y, const struct display_buffer_descriptor *desc, const void *buf) { struct il0323_data *driver = dev->data; @@ -208,6 +186,58 @@ static int il0323_read(const struct device *dev, const uint16_t x, const uint16_ return -ENOTSUP; } +static int il0323_clear_and_write_buffer(const struct device *dev, uint8_t pattern, bool update) { + struct display_buffer_descriptor desc = { + .buf_size = IL0323_NUMOF_PAGES, + .width = EPD_PANEL_WIDTH, + .height = 1, + .pitch = EPD_PANEL_WIDTH, + }; + uint8_t *line; + + line = k_malloc(IL0323_NUMOF_PAGES); + if (line == NULL) { + return -ENOMEM; + } + + memset(line, pattern, IL0323_NUMOF_PAGES); + for (int i = 0; i < EPD_PANEL_HEIGHT; i++) { + il0323_write(dev, 0, i, &desc, line); + } + + k_free(line); + + if (update == true) { + if (il0323_update_display(dev)) { + return -EIO; + } + } + + return 0; +} + +static int il0323_blanking_off(const struct device *dev) { + struct il0323_data *driver = dev->data; + + if (blanking_on) { + /* Update EPD pannel in normal mode */ + il0323_busy_wait(driver); + if (il0323_clear_and_write_buffer(dev, 0xff, true)) { + return -EIO; + } + } + + blanking_on = false; + + return 0; +} + +static int il0323_blanking_on(const struct device *dev) { + blanking_on = true; + + return 0; +} + static void *il0323_get_framebuffer(const struct device *dev) { LOG_ERR("not supported"); return NULL; @@ -247,36 +277,6 @@ static int il0323_set_pixel_format(const struct device *dev, const enum display_ return -ENOTSUP; } -static int il0323_clear_and_write_buffer(const struct device *dev, uint8_t pattern, bool update) { - struct display_buffer_descriptor desc = { - .buf_size = IL0323_NUMOF_PAGES, - .width = EPD_PANEL_WIDTH, - .height = 1, - .pitch = EPD_PANEL_WIDTH, - }; - uint8_t *line; - - line = k_malloc(IL0323_NUMOF_PAGES); - if (line == NULL) { - return -ENOMEM; - } - - memset(line, pattern, IL0323_NUMOF_PAGES); - for (int i = 0; i < EPD_PANEL_HEIGHT; i++) { - il0323_write(dev, 0, i, &desc, line); - } - - k_free(line); - - if (update == true) { - if (il0323_update_display(dev)) { - return -EIO; - } - } - - return 0; -} - static int il0323_controller_init(const struct device *dev) { struct il0323_data *driver = dev->data; uint8_t tmp[IL0323_TRES_REG_LENGTH]; @@ -350,10 +350,6 @@ static int il0323_controller_init(const struct device *dev) { return -EIO; } - if (il0323_clear_and_write_buffer(dev, 0xff, false)) { - return -1; - } - return 0; } @@ -429,4 +425,4 @@ static struct display_driver_api il0323_driver_api = { }; DEVICE_DT_INST_DEFINE(0, il0323_init, NULL, &il0323_driver, NULL, POST_KERNEL, - CONFIG_APPLICATION_INIT_PRIORITY, &il0323_driver_api); \ No newline at end of file + CONFIG_APPLICATION_INIT_PRIORITY, &il0323_driver_api); From 90b45a1284d11c0003949bb0b57c20a3ecb6d682 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 25 Apr 2022 22:07:21 -0400 Subject: [PATCH 055/289] feat(display): Blank on idle optionally. * Add new defaulted-on Kconfig option to control if displays are blanked/unblanked on idle/activity. --- app/src/display/Kconfig | 4 ++++ app/src/display/main.c | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index 8023025a..ee977556 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -11,6 +11,10 @@ menuconfig ZMK_DISPLAY if ZMK_DISPLAY +config ZMK_DISPLAY_BLANK_ON_IDLE + bool "Blank display on idle" + default y + choice LVGL_TXT_ENC default LVGL_TXT_ENC_UTF8 diff --git a/app/src/display/main.c b/app/src/display/main.c index 79a054a7..9de0ad7f 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -111,8 +111,6 @@ void initialize_display(struct k_work *work) { K_WORK_DEFINE(init_work, initialize_display); int zmk_display_init() { - LOG_DBG(""); - #if IS_ENABLED(CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED) k_work_queue_start(&display_work_q, display_work_stack_area, K_THREAD_STACK_SIZEOF(display_work_stack_area), @@ -125,6 +123,7 @@ int zmk_display_init() { return 0; } +#if IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) int display_event_handler(const zmk_event_t *eh) { struct zmk_activity_state_changed *ev = as_zmk_activity_state_changed(eh); if (ev == NULL) { @@ -148,3 +147,5 @@ int display_event_handler(const zmk_event_t *eh) { ZMK_LISTENER(display, display_event_handler); ZMK_SUBSCRIPTION(display, zmk_activity_state_changed); + +#endif /* IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) */ \ No newline at end of file From 70beff7e624157955ab0c2c1083466eaffec74e9 Mon Sep 17 00:00:00 2001 From: Nick Coutsos Date: Wed, 27 Jul 2022 08:15:46 -0400 Subject: [PATCH 056/289] refactor(docs): Change wording in RGB_COLOR_HSB description Simplify description for second &rgb_ug parameter --- docs/docs/behaviors/underglow.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/behaviors/underglow.md b/docs/docs/behaviors/underglow.md index c028f832..52429e69 100644 --- a/docs/docs/behaviors/underglow.md +++ b/docs/docs/behaviors/underglow.md @@ -41,11 +41,11 @@ Here is a table describing the action for each define: - Reference: `&rgb_ug` - Parameter #1: The RGB action define, e.g. `RGB_TOG` or `RGB_BRI` -- Parameter #2: Only applies to `RGB_COLOR_HSB` and is the HSB values of the color to set within parenthesis and separated by a common (see below for an example) +- Parameter #2: Only applies to `RGB_COLOR_HSB` and is the HSB representation of the color to set (see below for an example) :::note HSB Values -When specifying HSB values you'll need to use `RGB_COLOR_HSB(h, s, b)` in your keymap file. See below for an example. +When specifying HSB values you'll need to use `RGB_COLOR_HSB(h, s, b)` in your keymap file. Value Limits: From 01f51f06dc044f20b38c4cc69403ede2a8cd5aa2 Mon Sep 17 00:00:00 2001 From: HanfG <376840834@qq.com> Date: Wed, 27 Jul 2022 20:17:40 +0800 Subject: [PATCH 057/289] fix(docs): Fix col/row properties in kscan.md example --- docs/docs/config/kscan.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index 77dc23cb..1f54692d 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -207,8 +207,8 @@ One possible way to do this is a 3x4 matrix where the direct GPIO keys are shift kscan0: kscan_composite { compatible = "zmk,kscan-composite"; label = "KSCAN0"; - rows = <3>; - columns = <4>; + rows = <4>; + columns = <3>; // Include the matrix driver matrix { From 8bc96ab9fe6121e586208a8d45666ec136002643 Mon Sep 17 00:00:00 2001 From: "byran.tech" <61983584+Hello9999901@users.noreply.github.com> Date: Wed, 27 Jul 2022 09:07:57 -0400 Subject: [PATCH 058/289] feat(docs): added "how is the latency" * Update docs/docs/faq.md Co-authored-by: Kurtis Lew Co-authored-by: Dom H Co-authored-by: Pete Johanson --- docs/docs/faq.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/docs/faq.md b/docs/docs/faq.md index 36ecc010..edb41f3b 100644 --- a/docs/docs/faq.md +++ b/docs/docs/faq.md @@ -80,6 +80,14 @@ Please note, many keyboards only have a single PCB which includes the “brains Currently, ZMK only supports wireless split, but wired split is possible and we welcome contributions! +### How is the latency? + +The latency of ZMK is comparable to other firmware offerings. ZMK is equipped with a variety of scanning methods and [debounce algorithms](features/debouncing.md) that can affect the final measured latency. [This video](https://www.youtube.com/watch?v=jWL4nU-vtWs) shows a latency comparison of ZMK and other keyboard firmwares. + +### Any chance for 2.4GHz dongle implementation? + +At this time, there are no current plans to implement 2.4GHz dongle mode. This is because utilizing Nordic's proprietary 2.4GHz low level protocols requires use of the Nordic Connect SDK, which is licensed with a more restrictive license than ZMK's MIT license. However, ZMK does plan to implement dongle mode using BLE (with encryption). This will result in a 3.75ms average latency from the protocol itself. + ### What bootloader does ZMK use? ZMK isn’t designed for any particular bootloader, and supports flashing different boards with different flash utilities (e.g. OpenOCD, nrfjprog, etc.). So if you have any difficulties, please let us know on [Discord](https://zmk.dev/community/discord/invite)! From be0d49b62d7a423512e6e9052eca037b331109b7 Mon Sep 17 00:00:00 2001 From: Jason Hazel Date: Wed, 27 Jul 2022 11:39:42 -0400 Subject: [PATCH 059/289] feat(shields) add support for Spaceman Pancake (#1400) * add support for Spaceman Pancake Co-authored-by: Pete Johanson Co-authored-by: Jason Hazel Co-authored-by: Pete Johanson --- app/boards/shields/pancake/Kconfig.defconfig | 9 ++++ app/boards/shields/pancake/Kconfig.shield | 5 ++ app/boards/shields/pancake/pancake.conf | 1 + app/boards/shields/pancake/pancake.keymap | 57 ++++++++++++++++++++ app/boards/shields/pancake/pancake.overlay | 39 ++++++++++++++ app/boards/shields/pancake/pancake.zmk.yml | 8 +++ 6 files changed, 119 insertions(+) create mode 100644 app/boards/shields/pancake/Kconfig.defconfig create mode 100644 app/boards/shields/pancake/Kconfig.shield create mode 100644 app/boards/shields/pancake/pancake.conf create mode 100644 app/boards/shields/pancake/pancake.keymap create mode 100644 app/boards/shields/pancake/pancake.overlay create mode 100644 app/boards/shields/pancake/pancake.zmk.yml diff --git a/app/boards/shields/pancake/Kconfig.defconfig b/app/boards/shields/pancake/Kconfig.defconfig new file mode 100644 index 00000000..47f5e682 --- /dev/null +++ b/app/boards/shields/pancake/Kconfig.defconfig @@ -0,0 +1,9 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_PANCAKE + +config ZMK_KEYBOARD_NAME + default "Pancake" + +endif \ No newline at end of file diff --git a/app/boards/shields/pancake/Kconfig.shield b/app/boards/shields/pancake/Kconfig.shield new file mode 100644 index 00000000..784d25a4 --- /dev/null +++ b/app/boards/shields/pancake/Kconfig.shield @@ -0,0 +1,5 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_PANCAKE + def_bool $(shields_list_contains,pancake) \ No newline at end of file diff --git a/app/boards/shields/pancake/pancake.conf b/app/boards/shields/pancake/pancake.conf new file mode 100644 index 00000000..67b8cb5c --- /dev/null +++ b/app/boards/shields/pancake/pancake.conf @@ -0,0 +1 @@ +# CONFIG_ZMK_USB_LOGGING=y \ No newline at end of file diff --git a/app/boards/shields/pancake/pancake.keymap b/app/boards/shields/pancake/pancake.keymap new file mode 100644 index 00000000..99f2aaff --- /dev/null +++ b/app/boards/shields/pancake/pancake.keymap @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +#define DEF 0 +#define LWR 1 +#define RSE 2 +#define FNC 3 + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { + bindings = < + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SQT &kp SEMI + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp UP &kp ENTER + &kp LCTRL &kp LALT &kp LGUI &mo FNC &mo LWR &kp SPACE &kp SPACE &mo RSE &kp SLASH &kp LEFT &kp DOWN &kp RIGHT + >; + }; + + lower_layer { + bindings = < + &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &kp BSPC + &trans &trans &trans &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &kp LBRC &kp RBRC &kp C_VOL_UP &trans + &trans &trans &trans &trans &trans &trans &trans &trans &kp QMARK &trans &kp C_VOL_DN &trans + >; + }; + + raise_layer { + bindings = < + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &trans &kp BSLH + &trans &trans &trans &trans &trans &trans &trans &trans &kp LBKT &kp RBKT &kp C_VOL_UP &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_VOL_DN &trans + >; + }; + + function_layer { + bindings = < + &bootloader &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &trans + &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp F11 &kp F12 &trans + &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans + &out OUT_BLE &out OUT_USB &out OUT_TOG &trans &trans &trans &trans &trans &trans &trans &trans &trans + >; + }; + }; +}; diff --git a/app/boards/shields/pancake/pancake.overlay b/app/boards/shields/pancake/pancake.overlay new file mode 100644 index 00000000..53e8c8c1 --- /dev/null +++ b/app/boards/shields/pancake/pancake.overlay @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/ { + chosen { + zmk,kscan = &kscan0; + }; + + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; + + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 3 GPIO_ACTIVE_HIGH> + , <&pro_micro 2 GPIO_ACTIVE_HIGH> + ; + + row-gpios + = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; +}; diff --git a/app/boards/shields/pancake/pancake.zmk.yml b/app/boards/shields/pancake/pancake.zmk.yml new file mode 100644 index 00000000..21cc5444 --- /dev/null +++ b/app/boards/shields/pancake/pancake.zmk.yml @@ -0,0 +1,8 @@ +file_format: "1" +id: pancake +name: Pancake +type: shield +url: https://mkultra.click/pancake-keyboard-kit +requires: [pro_micro] +features: + - keys From eee7e1cd41c8bed81c5abcc0e8986c05e811b251 Mon Sep 17 00:00:00 2001 From: Kurtis Lew Date: Sat, 30 Jul 2022 02:24:49 -0700 Subject: [PATCH 060/289] fix(docs): Update tap-dance and hold-tap documentation Co-Authored-By: Cem Aksoylar --- docs/docs/assets/hold-tap/case1_2.png | Bin 10323 -> 0 bytes docs/docs/assets/hold-tap/case1_2.svg | 21 +++ .../assets/hold-tap/case_hold_preferred.png | Bin 6380 -> 0 bytes .../assets/hold-tap/case_hold_preferred.svg | 23 +++ docs/docs/assets/hold-tap/comparison.png | Bin 158912 -> 0 bytes docs/docs/assets/hold-tap/comparison.svg | 131 ++++++++++++++++ docs/docs/assets/tap-dance/timing_diagram.svg | 140 ++++++++---------- docs/docs/behaviors/hold-tap.md | 134 ++++++++++++++--- docs/docs/behaviors/layers.md | 11 +- docs/docs/behaviors/mod-tap.md | 9 +- docs/docs/behaviors/tap-dance.md | 83 +++++++---- 11 files changed, 421 insertions(+), 131 deletions(-) delete mode 100644 docs/docs/assets/hold-tap/case1_2.png create mode 100644 docs/docs/assets/hold-tap/case1_2.svg delete mode 100644 docs/docs/assets/hold-tap/case_hold_preferred.png create mode 100644 docs/docs/assets/hold-tap/case_hold_preferred.svg delete mode 100644 docs/docs/assets/hold-tap/comparison.png create mode 100644 docs/docs/assets/hold-tap/comparison.svg diff --git a/docs/docs/assets/hold-tap/case1_2.png b/docs/docs/assets/hold-tap/case1_2.png deleted file mode 100644 index 818ac83752dd0c47c590b015ca18923797981c42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10323 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 JMA|6uKLDAAvPJ*^ diff --git a/docs/docs/assets/hold-tap/case1_2.svg b/docs/docs/assets/hold-tap/case1_2.svg new file mode 100644 index 00000000..697d7346 --- /dev/null +++ b/docs/docs/assets/hold-tap/case1_2.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/docs/assets/hold-tap/case_hold_preferred.png b/docs/docs/assets/hold-tap/case_hold_preferred.png deleted file mode 100644 index 6d7fd43bb58681629387932f0053995d7d5d0c33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6380 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 diff --git a/docs/docs/assets/hold-tap/case_hold_preferred.svg b/docs/docs/assets/hold-tap/case_hold_preferred.svg new file mode 100644 index 00000000..70b27014 --- /dev/null +++ b/docs/docs/assets/hold-tap/case_hold_preferred.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/docs/assets/hold-tap/comparison.png b/docs/docs/assets/hold-tap/comparison.png deleted file mode 100644 index 419b2040015ecf851e6605950e9e1a48472b8094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158912 zcmd43cU+F||37?{J&Lv>4K!7vP&Ckz_LhbuEfr1eP^2L=rM-7bLz@ta_AVt#OGDc8 zex5$x-~Rn`|8qZXf4tu`uIoIH^Eh6w=Xza_RFq^Xb~5cGkw_F5<)qX|r0qLMq|Ljw zZ^c)Bwp~-i|2Es5zo@Ytf84fT_a%{7Nf)KgY21nW{mn^(wxeg;^i;DE)e{3cy5D~1 z0>vB^uU$LkXq-^f8OU_SgS%!nMTSOE;aJf=;YY$eZ<%)8OW1x=YKzpl$ma1$@hO&r zzrNj__)T8>SLC6c_-}tN+_q@lTz( z@8`(>FJESUdw=u)@hSm%qW8A#_`kfo!{$BI|CbjZ+kWuyoB#7w+NjRTdHt`~M_fVX zp*v4V|NDgp2x`ervy%NUH}mguvmXEd=)#X$ly3Unb@f!@Eer-{{DTlv$HeKq%Q2v->;`EOD!9` zU%otcv#*?yq>^hOmStGgXXemf>As)%g=f#6u?Bzs{`+^p?VmOA<}E4PDJVX)XJ1il z=Et&WMF%jSIsQ}7t~LP#ER-nRF_<8`O$j>|InXiy{jAd^5x!e zetqhcO`A3i3=G6OiCw;Y`StCe4~~5+vbu8m^yz)cLEXQ5OK3zyL`Yus(Py+pnqEXl z2Tt@9?`pvf4IPeu{Nv|OL9<5I_a8s{|2lQE^T{TwLy!FZY37v~7#I?_l(V=^lZmg* zs&moqY;yDT^c1q{rafidd+cHvE-1!e%a$#y?13hSsdwD8vNF1%QipswT?pXh~I$m06hl7T7F1KO1q(=zKEki#Cskdsu2}LwPMr_Y?1M zoMQh;DJ`uqC6i<|Zl;qreYLW6jlRFRyYJ-9eNoZTioF+VPS+dZC&%))?4tkvkj3Me zMf9&oBS5V6Y_bGY(deX6Pnc4zUva&z_{QP*@ zVN8Q!KEV8Mk4@E%Ts}U&JY4Hpx5d5O+}!&_?ajVA;0-!YB*w*&I&uv^;*JFI8;dI| zKQnVHGe)iRM7@3<_;(Dp-kO{-uMre84iIx)R3Z-$yKv3eSh_`GWAz02rcGodB_$={ zrXwkbh8nC}(^R*9Q}o6L`1T9iMkbIcT~A9#$9LPFgRG}cX-9;Ihd(@WDeQY+g{w}n zwZ4NxaND^9!^8o12!HWnf25FkLY~5n8!6LVJddRA)dcRhJZfX~mU|+VZkRvT;6TfX zn$A}b5AoE*unlo)ya}d?9y)h2b1g)o3@g}nRT)QLEZe|k^vKPgB1PlpFHYI~2siY2 zJJy!T7G6h2l31PIgiG>?5p&g&J$0G+{cTEOA3M1(4m@0(ez!+B?74)eczf36O{ACk z`PJBanTeKJ#O;rM_^;c)y$QEp8@%==IGAUC_Itx)+^U0FU%5!-(y#qDy9+J~dDeyT z3AY~7Vz?Fc?q4Y)J>C_2W3>y5{p#V=;WsK+j#s7)Kd{F?)z;qg@!6uMr`K5SY-c~# zx+5$sOvdH}56@0jRaH4<<%fxhhgMft8*>dMI(vHdSMZtaVG)<9h@B_O|ZymV%I;GLYD zoY$*YC;Hs}DhBo(7ZG7JZHW2s?%|%NFJA02H8ovaT#Un4ZaF$?l^Lk2QlSQrNap6| z)o$$7UtgT^F~4-_Qed%@|D#9eG&E?BA3v_5tGg5Lw|VpCIM;>AmqkVGuPJtaqb#=m zcJF*ViG&UHuBK)yX)hJk-Ly2W!J(meoBqm?#`ya+MVZ}BCirvOdFHTnU-=`{raO1; zu(Gm}#9ZgSOG-)%9L$5Gq5|&SBPackJag#Kh1o7=XXi)rn(k*kR`)%9`qVclNLERS zl6L2osHmvMtji~`h8L|WY)cOO`SYi`06Pk6Yj3@PwdUgG-9$p2dDGK##j0y@@s5;~ z6swpR^U~7NEnC}rsi~Z$4&z%{SXi>H7{@)I;OsqnM8kP)X=doP=Y}}xJNA%h?u(ER zZ`{OT4i0t!fjwGUTDNZBKG#!ZMRnl7&1c?JRBRj^Tl4br@Gzv$og+(9<34-#Y-6Rn zYjn)zLQ zv$BqcgoM0#`<4tpC7G%e?HwT*>g~N5UnG%|)Y1)N?JO)ZZXF55rXwdOZw>qU>C>Ch zmefDr-)*%AMRAD4(t3dB!qTwc=+A7Z_Lc1_Ip1B*Ie`SILljd=|WF#ts}9P zGk^b*ktQc6&!2Ic>idwcp86y*(vPTspPsN;^q^2l-??-8$B!RRo<1epwQJYwl9G7+ zGRHfUCBv*wZUT!!-j(MVvnG%PjP5d)?WoL(aNt)%&_B&c$)6k1u0* zcC>}5j`Q&0#-xkEIB4<(F*C6mJju>~f2r!~M%I)bU}pAlXwT8lEb8rgWty&;sb$fl z`|>JTXjqt5HwT{LR;ysYt-JTJwwB!abB&$dFDNJ#hwiBqdwMJ9i4!N71g~vA!pWJL z{r81UB~|UhRDZ0mFD0|66qYcd^q_=CmhIYwhm@)-^Al|zTW{RBG247epedABTO-GF zdDgseoM%J$X6MW1QnZ@_#|hn;KYvuqVxps&zeb6ukBeXZkNe7e+vuyF z0&^NFs%+gt`C&)nYuC)CzrVe1WE5XyU}?R_4#|wHR;sC~ zefsi6L1&?CsxnhUhCjUJ*Vh-^$BwD|blpQqnX)hCpte$+6OW8vU6Fstc>WzyP6Tg1R@M>knH8-mTI*c-%L1All>UWpL=4R@#YD(C$ z_U9uDQ;)`Dfv;b_crT52My`YPBApsSY6c88fQP%4cSJXFnwG*uR+oK^5x68>?_4u z7X6KqD@}>Atrf0Lp?3>28a}^!cRwL9vCaC*g`)c}Uc5Laar9^ay?}vUdU?h<@|wvr zR81S}3lgC{*+16td~BOsvjgwW8+xuupFDX|w2i{+teBYQWIq}tO>Jj)x0-=LjMCJl zl303r`cU$v>gw}M$FKX=uZWXyDU_dwY(pm)mnA;!Gj6z-v7353B_(}3pRz_;;@H0I z(OlV}gBltdNk!uN*FK^_G)ZpNU#I8OO)C0&#%a>G7BAUMY-05azAHsZcdv8XtejF##VNi52ilg&EB{vax9#73X%R8#zghdiO$!gAjM69*?I zvh#y7JZ?=kC;NBbd3j)%KU2Wz;`QE$7`yO*yl%g3J6g%x#Qyzkf@JN74?bGC28tIi zUOXILcabBw2@h{1F-V*`P-Sjf*;HRe=)Jh_->-&BsIB80 z3CD*n+H-PpGM#ZeiuDV^xsyaYO_<~1NZz)4pXA3N76ut+zz|=@iS8q%@^b7?8>=?f zc{7HwsqDYMArrmzokUbSE=yzMLtiBDFXl6j3OceJ!K&a2-uZyMLYD1EOKpdCe!hNO zjf)oTQA`(0YbKTG@9*E8*|xijvX;~C#Yrpb`C_GL(WWoYPniGu^1OPxj{3aV(W45p zmxaumz2|>-T>$)-n!SGAMNV$}(&FM1lo~0Sh&2R5-la4(>S{@8m)+jO^ z*IfTkDD=I!5TVgl}a|>S}7#LqkKVGBR6vK5&JAScr-|2J6$o3iJv=1jFi)|^nhSZ1p7i=$ zhoQQH!tP|$Oh8-n;ri&-6vh3jOSzTH@+K9)5efM?rv>PCq9~N#D&1eyM~Pg(@hvpF znt|ddEhD3qQAc}QN%6zLa*asoZfbxk8j6~i1qDgTm%^KUb}`@!{xdT(T>Sixi7h!d z-oa4Y)zzgcFE5{LH8C`FB*b|Uj1;=4q4Z5M+VB3A^~Ili1}dsnXX=EUCiNmk9e8{mJ{)iL1Zl`R+3fVhOVIe9 zZLP!)XBU^9d1jef*=E?v_Uo(8rS2;yqt7}&>vI|BYuZzxmL78O?47G2Rz?6MfhCuW ziwr|2j@|wtWfTpT)%dqTLYb5X3MT{_6nVxe=T>pI?dQ**6V~cKe|}WCzHC_vjtkWG z?DKV68k!5c=#TD=4z8H4-W6(Vhnju40x$V-HmdA;K%3TCxj6c?$#dkj+JVk@?lj_A zwzV(ydu}}1N=wj16A`ON21A(*U%q@98T=f~GtSM+o5*13raCL0@hmE9q_D$)=7>I7 zqaPiwMwliS?d-1?Hd^wvnzIC#t9v1ADH9VD)0!x|r*IRGuP;y+XQ}bK-V(dEFg`A> zI0l0|=eT;(R1Xyv$Ei_X1@P+@CFB6r>2lWv>q3*M-jYM5KRkP1-{z@f%x7L*Tk~;n znH!VFanrS-yXjXMzHRYMaG6ZnrF_&(4W?v+P{}LLA3l7jl3L1QVZWmQ6qi3FFF(Ke z&Y22ykw<-XPY=oRgsN6X_dH>{P*53!F5^G8irp+#2S~uFyFOVqm63gkBlwZWt^EA_ z1e9nE9@9^iA5q(PUf8+=0JSmh+OA|9Cl5Y38C4YO6p1DX@E$D~=oMYYBG`f_1;DwT&vv zs_aeXzUES|f4s(m_uyfbT^a`tPj{Kds=B$A_j%SfFp+EQp@s$!lJ*7YrEuN`Mew}y zl`B_jKYvcwkWo+2j#qh-o16R6ZE<>lsppcse1?4;7s`Lyoh^1tuPR!x^{FaOY2K}Y z;3MtOo~f-o{>tbf#eR+uo0gQocJJ%w&)*yImeH@)370G@DA1s7{Td;7!MKO6Ke41l zBsnF;;%MTyqgiv(BeQ5wezT)Cew7~~-7HU|p;~6;u8w7QGnw&99CCv4!PIkWyP2E%57;z-eh;z z!an2Qm*daMU7a0i3JDKSoe|*U3*^^(Es0u?@aB!A5i^>UpRcdVm5mD51*zLz!?B(@ zc@m)52~&f>w3$a!t)9G@s@mW$wUFx3Z0`41$yR9x4j%gMJvew>wg1c4ucO_CmQ3UN zrS|D6ebv3q|oBkN+=a=_FOyLOu zc+M#}D=Mnnnv#)}nD19yTXE-4g4q(zx73P%>BrDes8$JOD)tlIg=)|JR`^JwZi_E# zT%e`pr3O|4Q!vx))vUDbtgn9z$}QBM8TGT#5Y$ls&1;vK>8I21=8FjL;dbXRlZXH`YWmA3uJq+mp==`3k&39P%I`aRr)yLZX|TF%lIN%u{=g``Ni-dhy~8 zAoSF{dg7qB7v|?vr=Yvuni;%kJJIkFk&5dEF89Nw*TL@%Cj3*YQ^3k zA}~6dyRTE9^EO}u=o~fPJ81UO(A>vvGO&sUvEkz8KBuKck4E+Yq}uZL1r?PiBV~qd zdD0BVA0JDbn{xwh-(H$A33T7=^_cn0&Rn{kTL36i3j@Ky;-SfkcJKy&2JdCl1qSuQ z4m4Uu)9%peM_Fw|x!=t!N~@l#B(19Y^yL>cVynmRDDu$WQ9oI^xpzPjK`(CAF(QlobdbpHmBj@kWE7?>-x?6^fR6Jj44PEx1E{1=jiy5A~@ z%dQ?bsBkf-NFZZ{5===+Sv?CtF>7(+&4I+|Bk>&R+iI+(^@f zJNgjPl9CPw4i&aBQc;mTSKv_K-5_OLgnBLQuy5>l*Q@GrLP4akC%vhzCKo85zGpBo z{-S(0C1pF)f#(TRwJWCgw^Do`8cHs##AC3uD(1MDtOg9nICOH-CDlR~bPh^+wWW=XO?KWR2vqAUQxdqVZTnAI(;mrEWF96Ja#H5*u9VP!6e09qnwrNu zcwCl-!VAMx>lw-S4oL-kpj}IwD5)E>FzkOV&;Hcc_Id`_$5}#Aa5=b%)F8GHHFDP9 zF8o^C^RmH+7(uNLvxE0OT6m|Xrk+b&1NeLL>{)_i$@%ywpV=%Cnn$eFdZwXif)w6q?~&f3RE&FopMl zBsa&hErU+feuPyw$4%|fQ#nFhj9$)Nb(fSP9)Ass$n3X&1!7=m$fwAvCqs`TyzXgi zY!KwOq~v5aAtBoM_;{V7n~W(+(SB2vE0m6oj-th(U=0BQyU#+Jh3u1H>~DKs`CHxx z6-GuzXjJDN9g7;n6gV!RwWdY!PiO`F(ReDKoG|KlpC`mP*vpHQJ!gJx>~!kM4+Aye zdQZc`9^foOZu6h_$FA5u)H*=}vhfj=KVF4vdhw6(Dvtd=Av2X^TU6ib=)-7b(%Qet zlKk+Z1s!9Uz)Vu6)U!{A`%X)1)iI@~X zj-HNFIpB>gk(aa{e{={Ot+Ts6+z^|qvF#1E%olxIg@%2ZmUo^=@)g()$^WxP=GIsL zDhC$t{aRN?qtBRV)f#_%$ZHH#%4P0SNqKN^aC^@MvPPHv*(j1m5Z`sjOPv3vbeo8a zi|cl5Q{j$iJ^7>a-Mb4vZHKNjLr1Fa>oZ98&~W>5&c&tl+}$GE6*QTS689l@S&`G~ zvOSK+lFGT4bILs}dZuRiw1X285?-3Oa73NHO@90KZBaw+j9REc1K+=U_4ew8goYYH z=(+PV@RXE^ubhyYcH2bQtNeWL4!9aG3k%!Q*ZfvWil$iI7sOBvwV*0)1K4ZP?tz4Nr15P-Q8tZZ1-d+ecQ2cz^bKhIj-_PCbuVlsv7X4P=zYj}>Mnw6$uVO!g zfI;gS$~LKv)8}c1KJL*F7C+_?Wt?@o{G^Xx9{4u zX?pPKrVMJA+TtV3r*E-BN|CM${dqug!7dx%{Vg>14<9~|{^J|X8hwd~V2L}gzQ|3x^6_$8-+->&1h>aB}Z=aKW>!)p{3FP(g z_3P6W%c@Uv$ZmX?NLuyKXqrFBYh49-CVE*_^+SWYcI^a&ru*F;$yWLjmhQDL5~fl* zB`np@oo{@JxQklAn5_hi8gM{_nvIQ(6w_Ojc`eR;vR7n4^*}~W&ZhT0eT`Erk}FP6 zDpw8~2eb(XG6`36#=6}D3}*zmlR=YZXJ?cP*c zb#!vIAvR5k<9rpncf`#eLD%EazI{fs_wjOj=7HXx?(S=#Z=!RF>{bn%+mqMO=k~Am zUWNtqr$o2Z+VJ1f7CLMQwJr+t)YAXAEWn?ie;^$1XzA8O~5O;2X{r zpo2GzffVJ~$53gmSXK~ygnR<0l8u-5(rna?p&kbcw80^{D?=O17pgo-6aD9wCtcy7 zX**1G)4}=t2$T$)ZGG{O`1+!;>UnNX&Ta0?vv0wFeVpIEeY;P>;>8RTrbmN$3%MMF4$+J^3QI0Z5gya#^#Ajg)7|AxwHKiOL%Z>6QF znd3%wy1wZHESqDV>uyHf?d|js!9`sbCIeycz5V?8qFl-q9i6M_G&%&dbb$f;nDNAo zIJliKmQLFaZhx?wk^Ly4IiY2d&Xyc{hoZpSrm8=z`yWFx#eYZbs9m|H_%F*k#<4n$ zwLAa)toUsb#XEDjY`&Mn(^tBF*?%-PtoO(pScJd3KHlFvwpUhGwy8io@mQ#Ap;ngc z{voMXIf<@?bJ?C7>#(dkGFj-%nbI?}uEl1$Sn3Whubs5&)^J_X zH1ex_acv`u8(k!U)fLuAXP)uHnx^zp%H`3nSDZ{jW?rz{&T#|}fVk8Yn75Ef$Di*m zbDE;B%_!ApU|nC`y|$jNvj+?!gYopOxMOm0uV3$@qM{mUNez0r>Mu~amtyZC;CjJX~I1Ur#S~N;7)q%0}9uP8s{=5UgxXpz< z3eZLU8*G0xQHGSz*a3&%oq_|;zn~W+B$XZ?GF`wa9dqj`@$1)I?d7l8cOu45yF()& zC?tpv0Ovf>hq;l@SKRgtrVf%^**qzZv5$_K?w4Gok)HF1OId+h_E4q)p#|d^QookLh<0RGc zpqE4b@~vAhrz3p<>O*IV8A1757>Z9 zZ;iEbXAePgJybqFGefN}c*7T3dlNIWy>kln^x&9)er|dDpbvw=UIPYNT2>(;jnp|9 zcJ`&qUqTcJ*n8s05$SQc9^gxYowZs!)P4O*XHZsJYQb0KFs@ZGpAIlim=NfzDZD_a zC>SdXQw+6fWu=rPLb={q4e2aPy{xu>TZ6<#d3`Yv=1Ga3aXQVa#Kps+P5Snj4<$9z zHg?vk7!EbWD7(-eVJSkb?|{M%Rzv4={_X>c{ng#wOls*G1r-Yap(&@lD{m|5=|xRn zsNyFuXhYc=cr%IQxxSQoO!=GDMY1>e4Ulu%6f8UvIwJ8fege#m#vi5=B_hN=ZTYcXTXQy`;Q;@ zP-+fwaMXOC&#b0(XF>fn)9qO=fe*rC$Y#z{TP$=*POeesq@Wzy->Vo93qNuKmct@|DB%{+3q+UDK8ouRhn*3 zl?=yRfa>it>KDY`=y6M-9^mq`3;lUR zlafU|puGGnNqITVE%_<;kEreg563S#SG{(cim9V)M!`{+xC^WvVoGEFCbRZ=dz(ag%#}29#L)Qu6&aN(VJpv(Rj%OU=AbA0d zDUSc`FShF8D7Wq|;Ep_Ll~HKm-X@YLMamxgsaN*u=N z5mWg7^XGk}1hklhzLwN&n2!CY(`H!@oFjKoxO$Zp4gZLO=WLVg_C0&FudEYpy#9v* zbTzidrcgBdw693GHSu|bBqt?ZgD zH5w!hcHGWl3AG{g$v0rDY{8$WA>W_l3DrtpTj+CDzQfGO_~`Ph8|V1LGml=;(+lV@ zaHVjX>^)~-aIm_%TB>1drghDvtBT5A-2yW<1<$!QZC`(X^~?QGcmE898@6}zcGbz& zk}E%39kb?hgeXKX3u$TTeNeZLZ9x4>pfS~~dCbgPzJW*lyQf%LCuMZ3)YhLtfWEx} zxsClchj0W0Jy!3)UQ@6?i)cefSrG8q6S>3HvmnB`^A$&R3%29fyhTP&YJ6XF z4jYJspzHiiBNy0!7E>0}(*qa2#7Y=OSbr;ZNIqlFc&0u*`}S+LkcCXhhBtd(tD2Oc z8|`Ki+75ju!Soq<_kw?194nB@Rw&@iD1k@LTErPvc}&mEwY?_J;lR|CfP!+=Y1Iik z<2ug*BoQ`GUpLeReydp~3XztW;9Wd8)VyPG1q+>@!P@nmRI%{$XR^p=5sog)8l9&Y z8XkU#ZM&nT-+h6($ogAGksDmJt$Pmcey;EU*%ZAB7di+`3CB^a`+ENsYf&GaK>xtN zBc$qnoHL3HQ^fZYT$EzPv-5jltbJ~2QRgx>H@^rlnusdi2=k2ls; zyE*6r4~prg*}(&$-M3GUWcIr=&wlU|mAsr>9273d5PJ#W-TDyeh_oy_RNw^LQr%ZK z0?ouAP3e}{9*GurkIXTwQbI*cf*7rW?wr>9{t-=EdkN&h_$UpYw$61}z0z|~1)ETx zxsD%yh7{lEr>BPqqCPV>M;E$+eHl>1j1V4s$OhtY4!R#{-8TpqX9!`LQP9G~zrzhJ zZJFA{uL&W1di>NWA`0U&9PQ+t4>%^eaD`^io;~sP0OPtQ&ylIwVFE3Shc5_Kt6~pg zV#^S*xbfb|qRK(_O2Ec_3Tu%p4iZUD^KcQar4$(x7XL5&mex71aAk0q<2slNv03#}3@X;c64^CS5$^r3klCGPW zNQ1%)nbgw8mm}pg(e>&f_8-@Y6Y6Q&SAM6tWsym~dq9y$1buGaJjyKQ5+aVC$o6=8 zVIdXLjH(_L9w-=p5*n?#kr5k}*dy7{@w2yoc(+fu4peVx5=GJ|v=#!c3LdNUkWA1) zMT8}jGPQG?A(5B^UjZ&2K8mH&cGWxK7^S}d$1VLIQFY-0mc8w0xr1Y4Jbn~??hE>& zh|v*if~I@{Tb1U=L$(VKG?u?Sq-2&aw&_m+e=2m>>>IB8d4N>lzTz0&Hx3{EGqMr1 zKRuxU+T(IcT^IOKgqlEa(xm7`1c9O$n@AD#?ekDjOvxt-J+_NY3`3ci!&!0b6>1${R+PQOQKt3N~R|q?q|0e8; z+ToK#H#Uz(g3O{d?P*#z%<&dz)kNHYU%yleHh3Z^+Y=2Qx(_j9*KGb{VRZhNg+b?e zsEx=#z*a+j4!uXG=y^ycU@vu6hS{arumxq2Tbc_CMB)knLFzBIn_1(@bUEiIZy=?Q zppTwEuhC)%C5NyZO`xui5(Ql4wN`C@nRWDlCDno*r#o zal|PK-M{4-%O=mjb?O*jt3)Re_4GjDprxlzDdMLrU^I4kKEq0OVI5uL9DuRr6;Eg* z4oEdxiXm<|3(Q1K)dYH;ng0cU=WosAb1b(Teyk)Ii9FM{*SGKc`XYv%ldpgb9o2K| zCnPF(?>h@`cB!RWSwlnpv(1zUy)ZxAZ~TPR6g-&5Kb45s5X2i;k=(pgnsI zo=t0gaR2`O8oPKuvX{j6(e?5As^+b zRy3O1BaLiu9_5E-fT^ywWoVvunN54Sfh|Hou%ghG0s$9Do651`3C_6{^N|KCQ_x?i z7#JP`>Lnm&$x|nntcG~h&Zed&9oVk*4kr-!_%bVa7cpml|6SGZ-U-_DoeljHjf*pI zpVQQU?woy%O6kz-g@PM7SDTw)$_bf+9!o zjtS6mA{-4l&g@%h;b-w}CXi@}^(S)GDk@%tu-o6y!lzr17B=Xjx$o5!qRr?>ukD5@ zZSCxc%Y(n&bmA2}rV$Y{P!kzffg1MU&wH7f1K+=w`ZQ#F$JO-^D{EZyE5A@Ng#TfK z+{5Z2t(%dZ>*M3&`}nbpi;F0p98W>52Qe#;7LRTr~)yClEEBsg9mIA zmktzs0RjKUAmGNg@Y$x81DF%rG!9tbB$Cj9`%mG%NkBEk3Im>NUJ*y!5#id06%}G` z?(Wj}FDhK*4+po}iaCZ)_4TMyo1lfm@Ga9V(I*V^NW@$>UB7;vM1p_Oi0P8(4q+{Y zmqzcleu)s=^d|Ui1Qxkk6q<>zpI?e%aFTx z@hyzCr_Z17c&@M&J06ZXI|Ay|kEC)-k@;CGx%5vR=fT|3812wGau|x$=wp_zWzjDI z#{c~%FEVNMXSoKCG)&^?$!)|}W87C?|9?MZ1)ELcAE1NX7yWO=A_~3`O^JO1GohLB?{pr{7%~ZBYZ@RZR#u9zJq}vBY#a z({iZ+;NlJ51JqFX8y)El_H`3#JV8u=x^hM*&kB!qd(`bSE~MB)oo0k)d*Rz<%WU@C0%^rV`FeN|K0q z72+JMEF7m|V`nEvYGrG-VcWje2n%(?j7=_yG5p2COS)DF_A+uuDS>egVNh zAjWzwRpD7Z2@l_P;>5cec5UIU!YSRY3|j8U`#u6KWWzH691#A-Oze;6tl@PS3~B-- zBZkFDaE70RhWY?o{{%u@obR#u(|*Oq2);C&!0a#&O<~i0^z>Ux^eEFcEUdi2ZmPzJh`CP^iU}HZ;X!H#?8HVcf2*uP7%bY%Q#T3b{9w z43$gvzdNaj?3j>*s3;Q>g>Nu(()h|$IZDFwApUSn1(lRIhf?0b-or%F@oPc5wO=e( zXDDC4ei&8xKjUN(7XdFb1K8Bn)$>4~Fv52b(T+C&zCL8>ZB3jPH2?c5upc^PS-J}+ zx$}f&bJE2KG1nrqgH!|Pyb(xTd#o>+CP5`rZEzoo6 z^`lc%xc1W1KbW4r1x5yYXUE;U|EA@DWH>|4c&wf#vJphso)|1jTf=cM2FiL30qOd2 zMq+%-4j?ZtiRA3>i3vgb5tZF6;s^fCGeLh~J#u6Vw)7itphg(H@^dDpra!@cvE#{M zEPWpz_s3iNi!+!IVkPV`K%8wD$U; zMgvI#BgiX=@zDZc6P7i=xG_9(v#$K)wBLx2eV>>JMACt1!JYXgyP(+{nVLQXZ2k_- zr*-M!>a%Cmt4L!J8xrYY3=;XE-WkK=yfc~{?rjU@wi<}**3TLWAcb9r8vkWGF=8MK z+5j5ti;{RgUWJv5Ydf6jlfB=*@fNzn6!G@<{*K%;apHSl3xc%X>u%)YJ)o=d;tw>w#4QFftO6TQ|&z;1mEK#|;1IIXfn+1( zGAh&wa;kXL!8=fljEs%%!`>rO1q3GgJ~rkDOgw;GaHfXg<;#qe2Tpt8$*`X|K?B(Z zms#9hCOhJKG`w!8v)uW_`ud6uhSUfV-m1IcEztsz3(TG>j>^e9Fg^G@XUC2mccv;9 zp2WmFhRCu78U!nQfmIJZo^g@Erc?)!4NM-byH zO@HCn(9l4gK$SOi5lk?Mh0d{@aoo+R6eWoSRuk^3aE)k9rm^k>aDrA?)jSg9d&N=wr&6NZsx2HY&S6HFb%T#6Ax^9e!eDzTb-ES zBfUXB>^34Dn6{3C>Wjj8vb?;Ur!7@^J=k|IHT69>7p%gkzgOT3{&TIAX9$T%2J-h-3Z}y$*tV3E2haLKWxBv0o`@m0eHc$8 zVq^}Z`@<0oL7IYWqUYS-;^6<51t@-)naK;H>=O~O4N{gIN0r%7ZzRc&!-&Waw2-AS9i06_WyI1%rVWWS5{ za1FOP{pSzWP!oI&Z=7~EKzX3)j|j01pl%@-f>6HzWc!E69dsAl1mS#Zjh+`VUJufq zTX`U;waK?F4M&rjgkd}H8e7l+PHaPz!bB*!M(bFN&)waTpr#{j+J?ypU8+Ou+D?Mp z@vOO}MS2ePQ}x!ZV`QwLAv3eHhaX9uhk-kbbmR6RsPx-Ogzg%F$>U2%_Og+XDptfH z9)x5_`h?IwBw)S}cbt>$q-?_~gVuFm#O);DmL`}C7f+bhCjnUPC5`n}oS~zm+hIb4 z?8zmu)U*cq(&6!j5)F6HJvT&7*I(48E`&64vS4g>MpTMJ!aV7DT$dZ z$mmKW?31Ca>}@7Hxmkwh^VLmZqLU$a+ND9D_ct)Ec0K!WF-+6nW{eO4&4uGAQH@{pxl7b<-O+Y6O`vM&Xm9@ccZfpoS8ag@e?ZAib-}&HZmI zB!z0hHss>*K(~`{-_5uMZ(Gf;jEv7?{_M>{uAQaB_GJSw z*XQso)J`cfLZDP8jSxm_={Joz>DYw?CFc#GSLq!C@M?CD-NfYF2tGHVIv>WEHBcp6Tn?SBs)I&_gI^cl`OFx!s5khDHw0+txs!sbj6=QFI-+pZf* zQ$ECb3YoXWG&dcceK0&!fhgrTg3aAfSOLGNChiXr(gwl$EuhH%kxAEuF2SSw|i!yLA#&VF&3eK8(eZg`#U}cB!|v zxXSicx(e5)4K_K6%S`;!32I0>Ei6%t6US0i;;!OW66oMk~ofK&VZ_ZH5WP4PA<){cuavtQl ze)X3*1)*7^AF2sSUSM`NE}4n=+R+gXqUXH?fOS4!Rpf@cZ2#Xq?9|lPYKP_m+2+KQ zGXn(&A*yaCDLy}*tX4*h=suPEHxRsH_KEc_CiU);REW#^^Wy_yoAKaT!WG;8Sw(*< zA$Vts*)tzjQBz}I^!IehGz=`dShaL{Cu4(BLp466BjUCUQaZ z{^r?0i2&eT7lEPsVi25;-h7A@>oVZh4pPORn*F-td{c&!l3pW=Wl&kjB~d0*04R1! zyumhYhEuSeGj>wJt%37RtB8uykSw|j(#>2q zK&z_VOqOd*hI*DaI?JZgxN?g3eD6=zHs|q8*k06m?Ow%uaxI~n2U}=B-k8d2as(9v zF`;7?kfthBlat3<)M>#80gYQwgf^=eHPH zSn!AyRJgAcg(Uq#rhs2HTUU6LJv&3S_2Wm`bTZ{hIPljX)HF*gwrw%!^9ozJ#>a5r zz)`O#gWI+<6RrTQAqTHkxh<)YM8vl3O5mYaERtq+b|b9tNbS69(qxjOR{5B2L$Zao z&(CB2_wxu5yA;A{X?7tf1&N@?=G{<{wvYx!N7FULF{kB{c(LyduZ=H04aktVg&~g@NQhyMb$k5q~il# z4BDo}wg2Ejem#ACY1B6Fy%}eAeA*v1BOXAW^q|6F#STH1eju=*%LLGokaTn6)I?%9wu2#J(Z-n*DwX#`96V*DB~&GUo691*AxO z0rJCA%w724tuP=#QjG}(ZY4Hv9iRe|ttiW|>R?~Xaur#wzsU^ze7 ze=+W*NK(pz`4Pc~3UYFLiN)^j)^(9&=d>B&{ql*i+n)N#DesK2y_IH7?14;6k9^av zbKT@5WAmP6)moQ%mD16M(!7)O1LKNnJQC*3hgCDR_y|tUCe_rlThoEMQD~!4voF!& zN^Q7+KtN!i<}U_(yb?Vj7u~9uS)BRh2DN6dWc`aqR2z*5PS3mODjv;3iaioTHc7)C zaYvnyNlLd~x^Jl1K;t0vHP5FpE7mmjNABKKKSBvz2L7ZpaEN1)+~T`X_6ibGJ` zs0gRT{2R~2ZG#*V_0Bybh&M2d8n8{ty`0&$gj7?LOOO5B{*Dj*``KOo?v}Kn06!#2 zLh&MfM`tH_!NTGW6+U@V2AMhx*>Jcsj3S;!iktqXQv#Lw2XNLR&_-LkVWJEL=?y-C zWO}6OkdHGy`{WH`B)e%4ovkx`eT$4VjbsY<*G$b!dLSS|!h|>O;|xBgy?jFv;K%6t zbx3KO3+IMX(|Vr0$XFBD;4trV#>ZDc?>(=k_Dm@I+6O;m*xB&u3ULK7&<4m!&@Ph9 zXMT2J#5;M0gM&l9|H0R(vt(Xjd{@X9rxw%fF#JxEM7`Chw*esaikf;q9J+Ak6)DMv zp3Z(Z^p!xwiduo!2g+{yq-#e*2H;k-v$a+88wNMW$BZ?L*Jk7BzI^rS9m*sET=B

v=mX|&cA`aBl<}f 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

PS-t8+}tN=<%$fuLj)8^>@g5<-1abqat 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 diff --git a/docs/docs/assets/hold-tap/comparison.svg b/docs/docs/assets/hold-tap/comparison.svg new file mode 100644 index 00000000..eef79f39 --- /dev/null +++ b/docs/docs/assets/hold-tap/comparison.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/docs/assets/tap-dance/timing_diagram.svg b/docs/docs/assets/tap-dance/timing_diagram.svg index ab02dcaf..3bf0b137 100644 --- a/docs/docs/assets/tap-dance/timing_diagram.svg +++ b/docs/docs/assets/tap-dance/timing_diagram.svg @@ -1,83 +1,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index d0255c70..528b9aec 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -3,6 +3,9 @@ title: Hold-Tap Behavior sidebar_label: Hold-Tap --- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + ## Summary Hold-tap is the basis for other behaviors such as layer-tap and mod-tap. @@ -13,11 +16,11 @@ Simply put, the hold-tap key will output the 'hold' behavior if it's held for a The graph below shows how the hold-tap decides between a 'tap' and a 'hold'. -![Simple behavior](../assets/hold-tap/case1_2.png) +![Simple behavior](../assets/hold-tap/case1_2.svg) By default, the hold-tap is configured to also select the 'hold' functionality if another key is tapped while it's active: -![Hold preferred behavior](../assets/hold-tap/case1_2.png) +![Hold preferred behavior](../assets/hold-tap/case_hold_preferred.svg) We call this the 'hold-preferred' flavor of hold-taps. While this flavor may work very well for a ctrl/escape key, it's not very well suited for home-row mods or layer-taps. That's why there are two more flavors to choose from: 'tap-preferred' and 'balanced'. @@ -30,11 +33,11 @@ We call this the 'hold-preferred' flavor of hold-taps. While this flavor may wor When the hold-tap key is released and the hold behavior has not been triggered, the tap behavior will trigger. -![Hold-tap comparison](../assets/hold-tap/comparison.png) +![Hold-tap comparison](../assets/hold-tap/comparison.svg) ### Basic usage -For basic usage, please see [mod-tap](mod-tap.md) and [layer-tap](layers.md) pages. +For basic usage, please see the [mod-tap](mod-tap.md) and [layer-tap](layers.md#layer-tap) pages. ### Advanced Configuration @@ -50,9 +53,9 @@ In QMK, unlike ZMK, this functionality is enabled by default, and you turn it of #### `global-quick-tap` -If global quick tap is enabled, then `quick-tap-ms` will apply not only when the given hold-tap is tapped but for any key tap before it. This effectively disables the hold tap when typing quickly, which can be quite useful for home row mods. It can also have the effect of removing the input delay when typing quickly. +If `global-quick-tap` is enabled, then `quick-tap-ms` will apply not only when the given hold-tap is tapped, but for any key tapped before it. This effectively disables the hold-tap when typing quickly, which can be quite useful for homerow mods. It can also have the effect of removing the input delay when typing quickly. -For example, the following hold-tap configuration enables global quick tap with a 125 millisecond term. +For example, the following hold-tap configuration enables `global-quick-tap` with a 125 millisecond `quick-tap-ms` term. ``` gqt: global-quick-tap { @@ -69,11 +72,11 @@ gqt: global-quick-tap { If you press `&kp A` and then `&gqt LEFT_SHIFT B` **within** 125 ms, then `ab` will be output. Importantly, `b` will be output immediately since it was within the `quick-tap-ms`. This quick-tap behavior will work for any key press, whether it is within a behavior like hold-tap, or a simple `&kp`. This means the `&gqt LEFT_SHIFT B` binding will only have its underlying hold-tap behavior if it is pressed 125 ms **after** a key press. -Note that the higher the `quick-tap-ms` the harder it will be to use the hold behavior, making this less applicable for something like capitalizing letter while typing normally. However, if the hold behavior isn't used during fast typing, then it can be an effective way to mitigate misfires. +Note that the greater the value of `quick-tap-ms` is, the harder it will be to invoke the hold behavior, making this feature less applicable for use-cases like capitalizing letters while typing normally. However, if the hold behavior isn't used during fast typing, then it can be an effective way to mitigate misfires. #### `retro-tap` -If retro tap is enabled, the tap behavior is triggered when releasing the hold-tap key if no other key was pressed in the meantime. +If `retro-tap` is enabled, the tap behavior is triggered when releasing the hold-tap key if no other key was pressed in the meantime. For example, if you press `&mt LEFT_SHIFT A` and then release it without pressing another key, it will output `a`. @@ -85,16 +88,20 @@ For example, if you press `&mt LEFT_SHIFT A` and then release it without pressin #### Positional hold-tap and `hold-trigger-key-positions` -- Including `hold-trigger-key-positions` in your hold-tap definition turns on the positional hold-tap feature. -- With positional hold-tap enabled, if you press any key **NOT** listed in `hold-trigger-key-positions` before `tapping-term-ms` expires, it will produce a tap. -- In all other situations, positional hold-tap will not modify the behavior of your hold-tap. -- Positional hold-tap is useful with home-row modifiers. If you have a home-row modifier key in the left hand for example, by including only keys positions from the right hand in `hold-trigger-key-positions`, you will only get hold behaviors during cross-hand key combinations. -- Note that `hold-trigger-key-positions` is an array of key position indexes. Key positions are numbered according to your keymap, starting with 0. So if the first key in your keymap is Q, this key is in position 0. The next key (probably W) will be in position 1, et cetera. -- See the following example, which uses a hold-tap behavior definition, configured with the `hold-preferred` flavor, and with positional hold-tap enabled: +Including `hold-trigger-key-positions` in your hold-tap definition turns on the positional hold-tap feature. With positional hold-tap enabled, if you press any key **NOT** listed in `hold-trigger-key-positions` before `tapping-term-ms` expires, it will produce a tap. + +In all other situations, positional hold-tap will not modify the behavior of your hold-tap. Positional hold-tap is useful when used with home-row modifiers: for example, if you have a home-row modifier key in the left hand, by including only key positions from the right hand in `hold-trigger-key-positions`, you will only get hold behaviors during cross-hand key combinations. + +:::info +Note that `hold-trigger-key-positions` is an array of key position indexes. Key positions are numbered sequentially according to your keymap, starting with 0. So if the first key in your keymap is Q, this key is in position 0. The next key (probably W) will be in position 1, et cetera. +::: + +See the following example, which uses a hold-tap behavior definition, configured with the `hold-preferred` flavor, and with positional hold-tap enabled: ``` #include #include + / { behaviors { pht: positional_hold_tap { @@ -125,15 +132,26 @@ For example, if you press `&mt LEFT_SHIFT A` and then release it without pressin - The sequence `(pht_down, W_down, W_up, pht_up)` produces `W`. The normal hold behavior (LEFT_SHIFT) **is NOT** modified into a tap behavior (Q) by positional hold-tap because the first key pressed after the hold-tap key is the `W key`, which is in position 1, which **IS** included in `hold-trigger-key-positions`. - If the `LEFT_SHIFT / Q key` is held by itself for longer than `tapping-term-ms`, a hold behavior is produced. This is because positional hold-tap only modifies the behavior of a hold-tap if another key is pressed before the `tapping-term-ms` period expires. -#### Home row mods +### Example Use-Cases + + + + The following are suggested hold-tap configurations that work well with home row mods: ##### Option 1: cross-hand only modifiers, using `tap-unless-interrupted` and positional hold-tap (`hold-trigger-key-positions`) -``` +```dtsi title="Homerow Mods: Cross-hand Example" #include #include + / { behaviors { lh_pht: left_hand_positional_hold_tap { @@ -162,7 +180,7 @@ The following are suggested hold-tap configurations that work well with home row ##### Option 2: `tap-preferred` -``` +```dtsi title="Homerow Mods: Tap-Preferred Example" #include #include @@ -188,12 +206,11 @@ The following are suggested hold-tap configurations that work well with home row }; }; }; - ``` ##### Option 3: `balanced` -``` +```dtsi title="Homerow Mods: Balanced Example" #include #include @@ -219,9 +236,84 @@ The following are suggested hold-tap configurations that work well with home row }; }; }; - ``` -#### Comparison to QMK + + + + +A popular method of implementing Autoshift in ZMK involves a C-preprocessor macro, commonly defined as `AS(keycode)`. This macro applies the `LSHIFT` modifier to the specified `keycode` when `AS(keycode)` is held, and simply performs a [keypress](key-press.md), `&kp keycode`, when the `AS(keycode)` binding is tapped. This simplifies the use of Autoshift in a keymap, as the complete hold-tap bindings for each desired Autoshift key, as in `&as LS() &as LS() ... &as LS() `, can be quite cumbersome to use when applied to a large portion of the keymap. + +```dtsi title="Hold-Tap Example: Autoshift" +#include +#include + +#define AS(keycode) &as LS(keycode) keycode // Autoshift Macro + +/ { + behaviors { + as: auto_shift { + compatible = "zmk,behavior-hold-tap"; + label = "AUTO_SHIFT"; + #binding-cells = <2>; + tapping_term_ms = <135>; + quick_tap_ms = <0>; + flavor = "tap-preferred"; + bindings = <&kp>, <&kp>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + AS(Q) AS(W) AS(E) AS(R) AS(T) AS(Y) // Autoshift applied for QWERTY keys + >; + }; + }; +}; +``` + + + + + +This hold-tap example implements a [toggle-layer](layers.md/#toggle-layer) when the keybind is tapped and a [momentary-layer](layers.md/#momentary-layer) when it is held. Similarly to the Autoshift and Sticky Hold use-cases, a `TOG_MO(layer)` macro is defined such that the `&tog` and `&mo` behaviors can target a single layer. + +```dtsi title="Hold-Tap Example: Toggle layer on Tap, Momentary layer on Hold" +#include +#include + +#define TOG_MO(layer) &tog_mo layer layer // Macro to apply toggle-layer-on-tap/momentary-layer-on-hold to a specific layer + +/ { + behaviors { + tog_mo: behavior_mo_tog { + compatible = "zmk,behavior-hold-tap"; + label = "mo_tog"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <200>; + bindings = <&tog>, <&mo>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + &tog_mo 2 1 // &mo 2 on hold, &tog 1 on tap + TOG_MO(3) // &mo 3 on hold, &tog 3 on tap + >; + }; + }; +}; +``` + + + + + +### Comparison to QMK The hold-preferred flavor works similar to the `HOLD_ON_OTHER_KEY_PRESS` setting in QMK. The 'balanced' flavor is similar to the `PERMISSIVE_HOLD` setting, and the `tap-preferred` flavor is similar to `IGNORE_MOD_TAP_INTERRUPT`. diff --git a/docs/docs/behaviors/layers.md b/docs/docs/behaviors/layers.md index 694b516a..0818aaae 100644 --- a/docs/docs/behaviors/layers.md +++ b/docs/docs/behaviors/layers.md @@ -43,7 +43,7 @@ Example: ## Layer-tap -The "layer-tap" behavior enables a layer when a key is held, and output another key when the key is only tapped for a short time. For more information on the inner workings of layer-tap, see [hold-tap](hold-tap.md). +The "layer-tap" behavior enables a layer when a key is held, and outputs a [keypress](key-press.md) when the key is only tapped for a short time. ### Behavior Binding @@ -57,6 +57,15 @@ Example: < LOWER SPACE ``` +:::info +Functionally, the layer-tap is a [hold-tap](hold-tap.md) of the ["tap-preferred" flavor](hold-tap.md/#flavors) and a [`tapping-term-ms`](hold-tap.md/#tapping-term-ms) of 200 that takes in a [`momentary layer`](#momentary-layer) and a [keypress](key-press.md) as its "hold" and "tap" parameters, respectively. + +For users who want to send a different [keycode](../codes/index.mdx) depending on if the same key is held or tapped, see [Mod-Tap](mod-tap.md). + +Similarly, for users looking to create a keybind like the layer-tap that depending on how long the key is held, invokes behaviors like [sticky keys](sticky-key.md) or [key toggles](key-toggle.md), see [Hold-Tap](hold-tap.md). + +::: + ## To Layer The "to layer" behavior enables a layer and disables _all_ other layers _except_ the default layer. diff --git a/docs/docs/behaviors/mod-tap.md b/docs/docs/behaviors/mod-tap.md index cc2b1ce0..5f4fa506 100644 --- a/docs/docs/behaviors/mod-tap.md +++ b/docs/docs/behaviors/mod-tap.md @@ -44,6 +44,11 @@ You can configure a different tapping term in your keymap: }; ``` -### Additional information +:::info +Under the hood, the mod-tap is simply a [hold-tap](hold-tap.md) of the ["hold-preferred" flavor](hold-tap.md/#flavors) with a [`tapping-term-ms`](hold-tap.md/#tapping-term-ms) of 200 that takes in two [keypresses](key-press.md) as its "hold" and "tap" parameters. This means that the mod-tap can be used to invoke **any** [keycode](../codes/index.mdx), and is not limited to only activating [modifier keys](../codes/modifiers.mdx) when it is held. -The mod-tap is a [hold-tap](hold-tap.md) under the hood with the "hold-preferred" flavor and tapping-term-ms 200. +For users who want to momentarily access a specific [layer](../features/keymaps#layers) while a key is held and send a keycode when the same key is tapped, see [Layer-Tap](layers.md/#layer-tap). + +Similarly, for users looking to create a keybind like the mod-tap that invokes behaviors _other_ than [keypresses](key-press.md), like [sticky keys](sticky-key.md) or [key toggles](key-toggle.md), see [Hold-Tap](hold-tap.md). + +::: diff --git a/docs/docs/behaviors/tap-dance.md b/docs/docs/behaviors/tap-dance.md index af49ca3c..65d5e765 100644 --- a/docs/docs/behaviors/tap-dance.md +++ b/docs/docs/behaviors/tap-dance.md @@ -3,39 +3,41 @@ title: Tap-Dance Behavior sidebar_label: Tap-Dance --- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + ## Summary -A tap-dance key invokes a different behavior (e.g. `kp`) corresponding -to how many times it is pressed. For example, you could configure a -tap-dance key that acts as `LSHIFT` if tapped once, or Caps _Lock_ if tapped twice. -The expandability of the number of [`bindings`](#bindings) attached to a -particular tap-dance is a great way to add more functionality to a single key, -especially for keyboards with a limited number of keys. -Tap-dances are completely custom, so for every unique tap-dance key, -a new tap-dance must be defined in your keymap's `behaviors`. +A tap-dance key invokes a different behavior (e.g. `kp`) corresponding to how many times it is pressed. For example, you could configure a tap-dance key that acts as `LSHIFT` if tapped once, or Caps _Lock_ if tapped twice. The expandability of the number of [`bindings`](#bindings) attached to a particular tap-dance is a great way to add more functionality to a single key, especially for keyboards with a limited number of keys. Tap-dances are completely custom, so for every unique tap-dance key,a new tap-dance must be defined in your keymap's `behaviors`. -Tap-dances are designed to resolve immediately when interrupted by another keypress. -Meaning, when a keybind is pressed other than any active tap-dances, -the tap-dance will activate according to the current value of its -counter before the interrupting keybind is registered. +Tap-dances are designed to resolve immediately when interrupted by another keypress. Meaning, when a keybind is pressed other than any active tap-dances, the tap-dance will activate according to the current value of its counter before the interrupting keybind is registered. ### Configuration #### `tapping-term-ms` -Defines the maximum elapsed time after the last tap-dance keybind press -before a binding is selected from [`bindings`](#bindings). -Default value is `200`ms. +Defines the maximum elapsed time after the last tap-dance keybind press before a binding is selected from [`bindings`](#bindings). Default value is `200`ms. #### `bindings` -An array of one or more keybinds. This list can include [any ZMK keycode](../codes/) and bindings for ZMK behaviors. +An array of one or more keybinds. This list can include [any ZMK keycode](../codes/) and any listed ZMK behavior, like [hold-taps](hold-tap.md), or [sticky keys](sticky-key.md). The index of a keybind in the `bindings` array corresponds to the number of times the tap-dance binding is pressed. For example, in the [basic tap-dance counter](#basic-example-counter) shown below, `&kp N2` is the second binding in the array of `bindings`: we then see an output of `2` when the `td0` binding is pressed twice. -#### Example Usage +The number of bindings in this array also determines the tap-dance's maximum number of keypresses. When a tap-dance reaches its maximum number of keypresses, it will immediately invoke the last behavior in its list of `bindings`, rather than waiting for [`tapping-term-ms`](#tapping-term-ms) to expire before the output is displayed. -This example configures a tap-dance named `td0` that outputs the number of times it is pressed from 1-3. +### Example Usage -``` + + + + +This example configures a tap-dance named `td0` that outputs the number of times its binding is pressed from 1-3. + +```title="Basic Tap-Dance Example: Counter" #include #include @@ -67,10 +69,41 @@ The following image describes the behavior of this particular tap-dance. ![Timing Diagram](../assets/tap-dance/timing_diagram.svg) :::note -Alphanumeric [`key press`](key-press.md) bindings, like those used for `td0`, -will release as soon as an interrupting key press occurs. -For instance, if a modifier key like `LSHIFT` were to replace the `N1` -binding in the last example above, it would remain pressed until `td0`'s -binding is released and the output would instead be `J`. Any following -alphanumeric key presses would be capitalized as long as `td0` is held down. +Alphanumeric [`key press`](key-press.md) bindings, like those used for `td0`, will release as soon as an interrupting key press occurs. For instance, if a modifier key like `LSHIFT` were to replace the `N1` binding in the last example above, it would remain pressed until `td0`'s binding is released and the output would instead be `J`. Any following alphanumeric key presses would be capitalized as long as `td0` is held down. ::: + + + + + +This example configures a mod-tap inside a tap-dance named `td_mt` that outputs `CAPSLOCK` on a single tap, `LSHIFT` on a single press and hold, and `LCTRL` when the tap-dance is pressed twice. + +```title="Advanced Tap-Dance Example: Nested Mod-Tap" +#include +#include + +/ { + behaviors { + td_mt: tap_dance_mod_tap { + compatible = "zmk,behavior-tap-dance"; + label = "TAP_DANCE_MOD_TAP"; + #binding-cells = <0>; + tapping-term-ms = <200>; + bindings = <&mt LSHIFT CAPSLOCK>, <&kp LCTRL>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + bindings = < + &td_mt + >; + }; + }; +}; +``` + + + From fc511e40cc1a274473a753c959f8d7e5fcc317d0 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Wed, 3 Aug 2022 20:09:50 -0400 Subject: [PATCH 061/289] fix(behaviors): Fixing erroneous combo triggering, hold-taps sticking * This is a very simple fix to a rather complicated issue. Essentially, hold-taps will "release" (raise) their captured keys before actually telling the event manager they have captured a key. This means the event manager ends up assigning the `last_listener_index` to the hold-tap subscription rather than the combo. So when the combo calls `ZMK_EVENT_RELEASE` it raises after the hold-tap instead of after the combo as the combo code expects. * The corresponding test (which fails without this change) has also been added. * An event can be captured and released in the same event handler, before the last_listener_index would have been updated. This causes some handlers to be triggered multiple times. * The solution is to update the last_listener_index before calling the next event handler, so capturing and releasing within an event handler is harmless. * Also see discussion at https://github.com/zmkfirmware/zmk/pull/1401 * If our handler dedides our undedided hold-tap, return early before continuing. * Fix incorrect pointer logic, resulting in combo candidate filtering leaving incorrect timeout details. Co-authored-by: Andrew Rae Co-authored-by: okke --- app/src/behaviors/behavior_hold_tap.c | 4 ++ app/src/combo.c | 2 +- app/src/event_manager.c | 2 +- .../combos-and-holdtaps-3/events.patterns | 1 + .../keycode_events.snapshot | 5 ++ .../native_posix_64.keymap | 40 ++++++++++++++++ .../combos-and-holdtaps-4/events.patterns | 1 + .../keycode_events.snapshot | 4 ++ .../native_posix_64.keymap | 46 +++++++++++++++++++ 9 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 app/tests/combo/combos-and-holdtaps-3/events.patterns create mode 100644 app/tests/combo/combos-and-holdtaps-3/keycode_events.snapshot create mode 100644 app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap create mode 100644 app/tests/combo/combos-and-holdtaps-4/events.patterns create mode 100644 app/tests/combo/combos-and-holdtaps-4/keycode_events.snapshot create mode 100644 app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index 413806b4..f09006ed 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -612,6 +612,10 @@ static int position_state_changed_listener(const zmk_event_t *eh) { decide_hold_tap(undecided_hold_tap, HT_TIMER_EVENT); } + if (undecided_hold_tap == NULL) { + return ZMK_EV_EVENT_BUBBLE; + } + if (!ev->state && find_captured_keydown_event(ev->position) == NULL) { // no keydown event has been captured, let it bubble. // we'll catch modifiers later in modifier_state_changed_listener diff --git a/app/src/combo.c b/app/src/combo.c index 13ed1709..e434ae17 100644 --- a/app/src/combo.c +++ b/app/src/combo.c @@ -211,7 +211,7 @@ static int filter_timed_out_candidates(int64_t timestamp) { if (candidate->timeout_at > timestamp) { // reorder candidates so they're contiguous candidates[num_candidates].combo = candidate->combo; - candidates[num_candidates].timeout_at = candidates->timeout_at; + candidates[num_candidates].timeout_at = candidate->timeout_at; num_candidates++; } else { candidate->combo = NULL; diff --git a/app/src/event_manager.c b/app/src/event_manager.c index eef5d839..471432a8 100644 --- a/app/src/event_manager.c +++ b/app/src/event_manager.c @@ -25,6 +25,7 @@ int zmk_event_manager_handle_from(zmk_event_t *event, uint8_t start_index) { if (ev_sub->event_type != event->event) { continue; } + event->last_listener_index = i; ret = ev_sub->listener->callback(event); switch (ret) { case ZMK_EV_EVENT_BUBBLE: @@ -35,7 +36,6 @@ int zmk_event_manager_handle_from(zmk_event_t *event, uint8_t start_index) { goto release; case ZMK_EV_EVENT_CAPTURED: LOG_DBG("Listener captured the event"); - event->last_listener_index = i; // Listeners are expected to free events they capture return 0; default: diff --git a/app/tests/combo/combos-and-holdtaps-3/events.patterns b/app/tests/combo/combos-and-holdtaps-3/events.patterns new file mode 100644 index 00000000..833100f6 --- /dev/null +++ b/app/tests/combo/combos-and-holdtaps-3/events.patterns @@ -0,0 +1 @@ +s/.*hid_listener_keycode_//p \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-3/keycode_events.snapshot b/app/tests/combo/combos-and-holdtaps-3/keycode_events.snapshot new file mode 100644 index 00000000..843832dd --- /dev/null +++ b/app/tests/combo/combos-and-holdtaps-3/keycode_events.snapshot @@ -0,0 +1,5 @@ +pressed: usage_page 0x07 keycode 0xE5 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap new file mode 100644 index 00000000..d4053793 --- /dev/null +++ b/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap @@ -0,0 +1,40 @@ +#include +#include +#include + +&mt { + flavor = "hold-preferred"; +}; + +/ { + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <40>; + key-positions = <0 1>; + bindings = <&kp X>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; + + default_layer { + bindings = < + &kp A &kp B + &mt RSHFT RET &kp C + >; + }; + }; +}; + +&kscan { + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,1,50) + ZMK_MOCK_RELEASE(1,1,50) + >; +}; diff --git a/app/tests/combo/combos-and-holdtaps-4/events.patterns b/app/tests/combo/combos-and-holdtaps-4/events.patterns new file mode 100644 index 00000000..833100f6 --- /dev/null +++ b/app/tests/combo/combos-and-holdtaps-4/events.patterns @@ -0,0 +1 @@ +s/.*hid_listener_keycode_//p \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-4/keycode_events.snapshot b/app/tests/combo/combos-and-holdtaps-4/keycode_events.snapshot new file mode 100644 index 00000000..f84bc761 --- /dev/null +++ b/app/tests/combo/combos-and-holdtaps-4/keycode_events.snapshot @@ -0,0 +1,4 @@ +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap new file mode 100644 index 00000000..ba6cecc6 --- /dev/null +++ b/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap @@ -0,0 +1,46 @@ +#include +#include +#include + + +#define ZMK_COMBO(name, combo_bindings, keypos, combo_term) \ +/ { \ + combos { \ + compatible = "zmk,combos"; \ + combo_ ## name { \ + key-positions = ; \ + bindings = ; \ + timeout-ms = ; \ + }; \ + }; \ +}; + +ZMK_COMBO(qmark, &kp QMARK, 0 3, 30) +ZMK_COMBO(dllr, &kp DLLR, 1 3, 50) +ZMK_COMBO(tilde, &kp TILDE, 3 4, 50) + +/ { + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; + + default_layer { + bindings = < + &none &none + &kp A &mt LSHFT T + &none + >; + }; + }; +}; + +&kscan { + rows = <3>; + columns = <2>; + events = < + ZMK_MOCK_PRESS(1,1,500) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,500) + ZMK_MOCK_RELEASE(1,1,0) + >; +}; \ No newline at end of file From f238001904a220a08b53606fff034e747b0dbd77 Mon Sep 17 00:00:00 2001 From: Anton <14187674+antosha417@users.noreply.github.com> Date: Fri, 12 Aug 2022 14:37:06 +0300 Subject: [PATCH 062/289] doc(keymaps): fix typo (#1425) --- docs/docs/features/keymaps.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/features/keymaps.md b/docs/docs/features/keymaps.md index 59577d8f..6d4e5f2c 100644 --- a/docs/docs/features/keymaps.md +++ b/docs/docs/features/keymaps.md @@ -58,7 +58,7 @@ in the stack _also_ get the event. Binding a behavior at a certain key position may include up to two extra parameters that are used to alter the behavior when that specific key position is activated/deactivated. For example, when binding -the "key press" (`kp`) behavior at a certain key position, you must specific _which_ keycode should +the "key press" (`kp`) behavior at a certain key position, you must specify _which_ keycode should be used for that key position. ``` From b21ddcf79ab11a6631e6e992aa4ec291ae09db2f Mon Sep 17 00:00:00 2001 From: "byran.tech" <61983584+Hello9999901@users.noreply.github.com> Date: Fri, 19 Aug 2022 10:29:12 -0400 Subject: [PATCH 063/289] fix(docs): added concrete number for Bluetooth advertising name length * Update new-shield.md * Update config docs. --- docs/docs/config/system.md | 2 +- docs/docs/development/new-shield.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/config/system.md b/docs/docs/config/system.md index 4784339c..a5347b96 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -15,7 +15,7 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/ | Config | Type | Description | Default | | ------------------------------------ | ------ | ----------------------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_KEYBOARD_NAME` | string | The name of the keyboard | | +| `CONFIG_ZMK_KEYBOARD_NAME` | string | The name of the keyboard (max 16 characters) | | | `CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE` | int | Milliseconds to wait after a setting change before writing it to flash memory | 60000 | | `CONFIG_ZMK_WPM` | bool | Enable calculating words per minute | n | | `CONFIG_HEAP_MEM_POOL_SIZE` | int | Size of the heap memory pool | 8192 | diff --git a/docs/docs/development/new-shield.md b/docs/docs/development/new-shield.md index 03a27289..565f424c 100644 --- a/docs/docs/development/new-shield.md +++ b/docs/docs/development/new-shield.md @@ -77,7 +77,7 @@ which controls the display name of the device over USB and BLE. The updated new default values should always be wrapped inside a conditional on the shield config name defined in the `Kconfig.shield` file. Here's the simplest example file. :::warning -Do not make the keyboard name too long, otherwise the bluetooth advertising might fail and you will not be able to find your keyboard from your laptop / tablet. +The keyboard name must be less than or equal to 16 characters in length, otherwise the bluetooth advertising might fail and you will not be able to find your keyboard from your device. ::: ``` From 391f80f06952c288e2f66c23eaa742644fd927e1 Mon Sep 17 00:00:00 2001 From: Shreyas <69219163+shrekale@users.noreply.github.com> Date: Mon, 22 Aug 2022 00:27:47 -0400 Subject: [PATCH 064/289] feat(hid): Add C_AC_DESKTOP_SHOW_ALL_APPLICATIONS * support for C_AC_DESKTOP_SHOW_ALL_APPLICATIONS Co-authored-by: Shreyas Kale --- app/include/dt-bindings/zmk/keys.h | 4 ++++ docs/src/data/groups.js | 1 + docs/src/data/hid.js | 25 +++++++++++++++++++++++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/app/include/dt-bindings/zmk/keys.h b/app/include/dt-bindings/zmk/keys.h index 32e78795..d144ebb3 100644 --- a/app/include/dt-bindings/zmk/keys.h +++ b/app/include/dt-bindings/zmk/keys.h @@ -1404,6 +1404,10 @@ #define C_AC_DESKTOP_SHOW_ALL_WINDOWS \ (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_DESKTOP_SHOW_ALL_WINDOWS)) +/* Consumer AC Desktop Show All Applications */ +#define C_AC_DESKTOP_SHOW_ALL_APPLICATIONS \ + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_DESKTOP_SHOW_ALL_APPLICATIONS)) + /* Consumer Keyboard Input Assist Previous */ #define C_KEYBOARD_INPUT_ASSIST_PREVIOUS \ (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS)) diff --git a/docs/src/data/groups.js b/docs/src/data/groups.js index f7ced161..0eb15d27 100644 --- a/docs/src/data/groups.js +++ b/docs/src/data/groups.js @@ -47,6 +47,7 @@ export default { "C_AC_DEL", "C_AC_VIEW_TOGGLE", "C_AC_DESKTOP_SHOW_ALL_WINDOWS", + "C_AC_DESKTOP_SHOW_ALL_APPLICATIONS", "C_VOICE_COMMAND", ], applications: [ diff --git a/docs/src/data/hid.js b/docs/src/data/hid.js index f2bde565..ac90ea80 100644 --- a/docs/src/data/hid.js +++ b/docs/src/data/hid.js @@ -7251,7 +7251,7 @@ export default [ windows: null, linux: true, android: true, - macos: null, + macos: true, ios: null, }, footnotes: {}, @@ -7713,7 +7713,28 @@ export default [ windows: null, linux: true, android: null, - macos: null, + macos: true, + ios: null, + }, + footnotes: {}, + }, + { + names: ["C_AC_DESKTOP_SHOW_ALL_APPLICATIONS"], + description: "Desktop Show All Applications", + context: "Consumer AC", + clarify: true, + usages: [ + { + application: consumerApplication, + item: usage(consumerPage, 0x2a2), + }, + ], + documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=153", + os: { + windows: null, + linux: true, + android: null, + macos: true, ios: null, }, footnotes: {}, From ce7a0e2b6c72ac19008d9974be8b14c0455b9f0f Mon Sep 17 00:00:00 2001 From: Elliot Pahl Date: Tue, 6 Sep 2022 08:07:02 +1000 Subject: [PATCH 065/289] feat(shields): Add Eternal Keypad * Add Eternal Keypad Co-authored-by: Duccio --- .../shields/eternal_keypad/Kconfig.defconfig | 9 +++ .../shields/eternal_keypad/Kconfig.shield | 8 +++ app/boards/shields/eternal_keypad/README.md | 10 ++++ .../boards/nice_nano_v2.overlay | 38 +++++++++++++ .../eternal_keypad/eternal_keypad.conf | 9 +++ .../eternal_keypad/eternal_keypad.dtsi | 53 ++++++++++++++++++ .../eternal_keypad/eternal_keypad.keymap | 56 +++++++++++++++++++ .../eternal_keypad/eternal_keypad.overlay | 7 +++ .../eternal_keypad/eternal_keypad.zmk.yml | 9 +++ .../eternal_keypad_lefty.keymap | 56 +++++++++++++++++++ .../eternal_keypad_lefty.overlay | 7 +++ .../eternal_keypad_lefty.zmk.yml | 9 +++ 12 files changed, 271 insertions(+) create mode 100644 app/boards/shields/eternal_keypad/Kconfig.defconfig create mode 100644 app/boards/shields/eternal_keypad/Kconfig.shield create mode 100644 app/boards/shields/eternal_keypad/README.md create mode 100644 app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/eternal_keypad/eternal_keypad.conf create mode 100644 app/boards/shields/eternal_keypad/eternal_keypad.dtsi create mode 100644 app/boards/shields/eternal_keypad/eternal_keypad.keymap create mode 100644 app/boards/shields/eternal_keypad/eternal_keypad.overlay create mode 100644 app/boards/shields/eternal_keypad/eternal_keypad.zmk.yml create mode 100644 app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap create mode 100644 app/boards/shields/eternal_keypad/eternal_keypad_lefty.overlay create mode 100644 app/boards/shields/eternal_keypad/eternal_keypad_lefty.zmk.yml diff --git a/app/boards/shields/eternal_keypad/Kconfig.defconfig b/app/boards/shields/eternal_keypad/Kconfig.defconfig new file mode 100644 index 00000000..4d4195ef --- /dev/null +++ b/app/boards/shields/eternal_keypad/Kconfig.defconfig @@ -0,0 +1,9 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_ETERNAL_KEYPAD || SHIELD_ETERNAL_KEYPAD_LEFTY + +config ZMK_KEYBOARD_NAME + default "Eternal Keypad" + +endif diff --git a/app/boards/shields/eternal_keypad/Kconfig.shield b/app/boards/shields/eternal_keypad/Kconfig.shield new file mode 100644 index 00000000..4a59379e --- /dev/null +++ b/app/boards/shields/eternal_keypad/Kconfig.shield @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_ETERNAL_KEYPAD + def_bool $(shields_list_contains,eternal_keypad) + +config SHIELD_ETERNAL_KEYPAD_LEFTY + def_bool $(shields_list_contains,eternal_keypad_lefty) diff --git a/app/boards/shields/eternal_keypad/README.md b/app/boards/shields/eternal_keypad/README.md new file mode 100644 index 00000000..4b217c5f --- /dev/null +++ b/app/boards/shields/eternal_keypad/README.md @@ -0,0 +1,10 @@ +# Eternal Keypad + +Eternal Keypad is an open-source input device for gaming that can be assembled for both right and left hand mouse users. + +Firmware is described in the [Eternal Keypad](https://github.com/duckyb/eternal-keypad) repository [README](https://github.com/duckyb/eternal-keypad#firmware). + +Two keymaps are included: + +- eternal_keypad (default) +- eternal_keypad_lefty (for left handed users) diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..61950d18 --- /dev/null +++ b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + /* Cannot be used together with i2c0. */ + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "SK6812mini"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <8>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/eternal_keypad/eternal_keypad.conf b/app/boards/shields/eternal_keypad/eternal_keypad.conf new file mode 100644 index 00000000..65fa2955 --- /dev/null +++ b/app/boards/shields/eternal_keypad/eternal_keypad.conf @@ -0,0 +1,9 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +# Uncomment to turn on logging, and set ZMK logging to debug output +# CONFIG_ZMK_USB_LOGGING=y + +# Uncomment the following lines to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/eternal_keypad/eternal_keypad.dtsi b/app/boards/shields/eternal_keypad/eternal_keypad.dtsi new file mode 100644 index 00000000..6319d9e0 --- /dev/null +++ b/app/boards/shields/eternal_keypad/eternal_keypad.dtsi @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + + row-gpios + = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + col-gpios + = <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <8>; + rows = <5>; + map = < + RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) + RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,5) RC(4,7) + >; + }; +}; diff --git a/app/boards/shields/eternal_keypad/eternal_keypad.keymap b/app/boards/shields/eternal_keypad/eternal_keypad.keymap new file mode 100644 index 00000000..0f3eda7b --- /dev/null +++ b/app/boards/shields/eternal_keypad/eternal_keypad.keymap @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +#define BASE 0 +#define ARROW 1 +#define FUNC 2 + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp N7 + &kp F13 &kp ENTER &kp A &kp S &kp D &kp F &kp G &kp N8 + &kp F14 &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N9 + &kp F15 &kp LCTRL &sl FUNC &kp LALT &kp SPACE < ARROW N0 + >; + }; + + arrow_layer { + bindings = < + &bt BT_SEL 0 &bt BT_SEL 1 &trans &trans &trans &out OUT_USB &out OUT_BLE + &trans &trans &kp UP &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_HUD + &bt BT_CLR &trans &kp LEFT &kp DOWN &kp RIGHT &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD + &reset &trans &trans &trans &trans &trans &rgb_ug RGB_EFF &rgb_ug RGB_EFR + &bootloader &trans &trans &trans &trans &trans + >; + }; + + function_layer { + bindings = < + &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 + &trans &kp P &kp O &kp I &kp U &kp Y &kp F7 + &bt BT_CLR &kp BSPC &kp SEMI &kp L &kp K &kp J &kp H &kp F8 + &reset &trans &kp LGUI &kp M &kp N &kp F12 &kp F11 &kp F9 + &bootloader &trans &trans &trans &trans &kp F10 + >; + }; + }; +}; diff --git a/app/boards/shields/eternal_keypad/eternal_keypad.overlay b/app/boards/shields/eternal_keypad/eternal_keypad.overlay new file mode 100644 index 00000000..4828baf7 --- /dev/null +++ b/app/boards/shields/eternal_keypad/eternal_keypad.overlay @@ -0,0 +1,7 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "eternal_keypad.dtsi" diff --git a/app/boards/shields/eternal_keypad/eternal_keypad.zmk.yml b/app/boards/shields/eternal_keypad/eternal_keypad.zmk.yml new file mode 100644 index 00000000..c5c86bc7 --- /dev/null +++ b/app/boards/shields/eternal_keypad/eternal_keypad.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: eternal_keypad +name: Eternal Keypad +type: shield +url: https://github.com/duckyb/eternal-keypad +requires: [pro_micro] +features: + - keys + - underglow diff --git a/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap new file mode 100644 index 00000000..e1bddbad --- /dev/null +++ b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +#define BASE 0 +#define ARROW 1 +#define FUNC 2 + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp N7 + &kp F13 &kp ENTER &kp D &kp S &kp A &kp F &kp G &kp N8 + &kp F14 &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N9 + &kp F15 &kp LCTRL &sl FUNC &kp LALT &kp SPACE < ARROW N0 + >; + }; + + arrow_layer { + bindings = < + &bt BT_SEL 0 &bt BT_SEL 1 &trans &trans &trans &out OUT_USB &out OUT_BLE + &trans &trans &kp UP &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_HUD + &bt BT_CLR &trans &kp RIGHT &kp DOWN &kp RIGHT &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD + &reset &trans &trans &trans &trans &trans &rgb_ug RGB_EFF &rgb_ug RGB_EFR + &bootloader &trans &trans &trans &trans &trans + >; + }; + + function_layer { + bindings = < + &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 + &trans &kp P &kp O &kp I &kp U &kp Y &kp F7 + &bt BT_CLR &kp BSPC &kp SEMI &kp L &kp K &kp J &kp H &kp F8 + &reset &trans &kp LGUI &kp M &kp N &kp F12 &kp F11 &kp F9 + &bootloader &trans &trans &trans &trans &kp F10 + >; + }; + }; +}; diff --git a/app/boards/shields/eternal_keypad/eternal_keypad_lefty.overlay b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.overlay new file mode 100644 index 00000000..0c5599a1 --- /dev/null +++ b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.overlay @@ -0,0 +1,7 @@ +/* + * Copyright (c) 202 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "eternal_keypad.dtsi" diff --git a/app/boards/shields/eternal_keypad/eternal_keypad_lefty.zmk.yml b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.zmk.yml new file mode 100644 index 00000000..9f5fb578 --- /dev/null +++ b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: eternal_keypad_lefty +name: Eternal Keypad Lefty +type: shield +url: https://github.com/duckyb/eternal-keypad +requires: [pro_micro] +features: + - keys + - underglow From 41bfc56e137df2b30e2208fd0b9afafd4d4db4b6 Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 6 Sep 2022 00:15:24 +0200 Subject: [PATCH 066/289] feat(board): add puchi_ble_v1 to boards * feat(board): Add Puchi-BLE v1 board --- app/boards/arm/puchi_ble/CMakeLists.txt | 6 + app/boards/arm/puchi_ble/Kconfig | 3 + app/boards/arm/puchi_ble/Kconfig.board | 8 ++ app/boards/arm/puchi_ble/Kconfig.defconfig | 28 ++++ .../arm/puchi_ble/arduino_pro_micro_pins.dtsi | 59 +++++++++ app/boards/arm/puchi_ble/board.cmake | 6 + app/boards/arm/puchi_ble/pinmux.c | 29 +++++ app/boards/arm/puchi_ble/puchi_ble_v1.dts | 121 ++++++++++++++++++ app/boards/arm/puchi_ble/puchi_ble_v1.yaml | 15 +++ app/boards/arm/puchi_ble/puchi_ble_v1.zmk.yml | 10 ++ .../arm/puchi_ble/puchi_ble_v1_defconfig | 24 ++++ 11 files changed, 309 insertions(+) create mode 100644 app/boards/arm/puchi_ble/CMakeLists.txt create mode 100644 app/boards/arm/puchi_ble/Kconfig create mode 100644 app/boards/arm/puchi_ble/Kconfig.board create mode 100644 app/boards/arm/puchi_ble/Kconfig.defconfig create mode 100644 app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi create mode 100644 app/boards/arm/puchi_ble/board.cmake create mode 100644 app/boards/arm/puchi_ble/pinmux.c create mode 100644 app/boards/arm/puchi_ble/puchi_ble_v1.dts create mode 100644 app/boards/arm/puchi_ble/puchi_ble_v1.yaml create mode 100644 app/boards/arm/puchi_ble/puchi_ble_v1.zmk.yml create mode 100644 app/boards/arm/puchi_ble/puchi_ble_v1_defconfig diff --git a/app/boards/arm/puchi_ble/CMakeLists.txt b/app/boards/arm/puchi_ble/CMakeLists.txt new file mode 100644 index 00000000..12cf9b1c --- /dev/null +++ b/app/boards/arm/puchi_ble/CMakeLists.txt @@ -0,0 +1,6 @@ + +if(CONFIG_PINMUX) +zephyr_library() +zephyr_library_sources(pinmux.c) +zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) +endif() \ No newline at end of file diff --git a/app/boards/arm/puchi_ble/Kconfig b/app/boards/arm/puchi_ble/Kconfig new file mode 100644 index 00000000..719c3845 --- /dev/null +++ b/app/boards/arm/puchi_ble/Kconfig @@ -0,0 +1,3 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + diff --git a/app/boards/arm/puchi_ble/Kconfig.board b/app/boards/arm/puchi_ble/Kconfig.board new file mode 100644 index 00000000..07638885 --- /dev/null +++ b/app/boards/arm/puchi_ble/Kconfig.board @@ -0,0 +1,8 @@ +# Puchi-BLE board configuration + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_PUCHI_BLE_v1 + bool "puchi_ble_v1" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/puchi_ble/Kconfig.defconfig b/app/boards/arm/puchi_ble/Kconfig.defconfig new file mode 100644 index 00000000..94d12c17 --- /dev/null +++ b/app/boards/arm/puchi_ble/Kconfig.defconfig @@ -0,0 +1,28 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_PUCHI_BLE_v1 + +config BOARD + default "puchi_ble" + +if USB_DEVICE_STACK + +config USB_NRFX + default y + +endif # USB_DEVICE_STACK + +config BT_CTLR + default BT + +config ZMK_BLE + default y + +config ZMK_USB + default y + +config PINMUX + default y + +endif # BOARD_PUCHI_BLE_v1 diff --git a/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi b/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi new file mode 100644 index 00000000..ed3317f1 --- /dev/null +++ b/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + + +/ { + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 15 0> /* D2 */ + , <3 0 &gpio0 17 0> /* D3 */ + , <4 0 &gpio0 20 0> /* D4/A6 */ + , <5 0 &gpio0 13 0> /* D5 */ + , <6 0 &gpio0 24 0> /* D6/A7 */ + , <7 0 &gpio0 9 0> /* D7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + , <16 0 &gpio0 28 0> /* D16 */ + , <14 0 &gpio0 3 0> /* D14 */ + , <15 0 &gpio1 13 0> /* D15 */ + , <18 0 &gpio0 2 0> /* D18/A0 */ + , <19 0 &gpio0 29 0> /* D19/A1 */ + , <20 0 &gpio0 31 0> /* D20/A2 */ + , <21 0 &gpio0 30 0> /* D21/A3 */ + ; + }; + + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 2 0> /* D18/A0 */ + , <1 0 &gpio0 29 0> /* D19/A1 */ + , <2 0 &gpio0 31 0> /* D20/A2 */ + , <3 0 &gpio0 30 0> /* D21/A3 */ + , <6 0 &gpio0 20 0> /* D4/A6 */ + , <7 0 &gpio0 24 0> /* D6/A7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + ; + }; +}; + + +pro_micro_d: &pro_micro {}; +pro_micro_i2c: &i2c0 {}; +pro_micro_spi: &spi0 {}; +pro_micro_serial: &uart0 {}; diff --git a/app/boards/arm/puchi_ble/board.cmake b/app/boards/arm/puchi_ble/board.cmake new file mode 100644 index 00000000..3b5c4aea --- /dev/null +++ b/app/boards/arm/puchi_ble/board.cmake @@ -0,0 +1,6 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/arm/puchi_ble/pinmux.c b/app/boards/arm/puchi_ble/pinmux.c new file mode 100644 index 00000000..78cea314 --- /dev/null +++ b/app/boards/arm/puchi_ble/pinmux.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include +#include + +static int pinmux_puchi_ble_init(const struct device *port) { + ARG_UNUSED(port); + +#if CONFIG_BOARD_PUCHI_BLE_v1 + const struct device *p0 = device_get_binding("GPIO_0"); +#if CONFIG_BOARD_PUCHI_BLE_CHARGER + gpio_pin_configure(p0, 5, GPIO_OUTPUT); + gpio_pin_set(p0, 5, 0); +#else + gpio_pin_configure(p0, 5, GPIO_INPUT); +#endif +#endif + return 0; +} + +SYS_INIT(pinmux_puchi_ble_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1.dts b/app/boards/arm/puchi_ble/puchi_ble_v1.dts new file mode 100644 index 00000000..e324cccc --- /dev/null +++ b/app/boards/arm/puchi_ble/puchi_ble_v1.dts @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; +#include +#include "arduino_pro_micro_pins.dtsi" + +/ { + model = "puchi_ble"; + compatible = "puchi_ble"; + + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; +}; + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&i2c0 { + compatible = "nordic,nrf-twi"; + sda-pin = <15>; + scl-pin = <17>; +}; + +&uart0 { + compatible = "nordic,nrf-uarte"; + tx-pin = <6>; + rx-pin = <8>; +}; + +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; + + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; + + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; +}; diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1.yaml b/app/boards/arm/puchi_ble/puchi_ble_v1.yaml new file mode 100644 index 00000000..18770722 --- /dev/null +++ b/app/boards/arm/puchi_ble/puchi_ble_v1.yaml @@ -0,0 +1,15 @@ +identifier: puchi_ble_v1 +name: puchi_ble_v1 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1.zmk.yml b/app/boards/arm/puchi_ble/puchi_ble_v1.zmk.yml new file mode 100644 index 00000000..f3114008 --- /dev/null +++ b/app/boards/arm/puchi_ble/puchi_ble_v1.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: puchi_ble_v1 +name: Puchi-BLE V1 +type: board +arch: arm +outputs: + - usb + - ble +url: https://keycapsss.com/keyboard-parts/mcu-controller/202/puchi-ble-wireless-microcontroller +exposes: [pro_micro] diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig b/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig new file mode 100644 index 00000000..e32886d0 --- /dev/null +++ b/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig @@ -0,0 +1,24 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_PUCHI_BLE_v1=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y + +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y +CONFIG_CLOCK_CONTROL_NRF=y +CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y From 6124d254f94ab6c115172311e0878a159b8ddcaa Mon Sep 17 00:00:00 2001 From: John Drogo Date: Sun, 11 Sep 2022 00:05:15 -0700 Subject: [PATCH 067/289] fix(usb): add USB_DC_RESUME to supported states All credit for this one goes to @xudongzheng (thanks for helping debug this!). Should fix the issue where keyboards go unresponsive after their host machine wakes from sleep due to the USB driver entering an error state. I was able to both reliably reproduce the issue before the patch goes in and confirmed it no longer occurs post patch. The `USB_DC_RESUME` state indicates the host event has resumed the connection. Adding it to the list of valid connection states to prevent the error when waking from sleep. Zephyr API Link: https://docs.zephyrproject.org/apidoc/latest/group____usb__device__controller__api.html#gac09e3e0af1a2b41a5bfbad91f900baf7 fixes #1372 --- app/src/usb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/usb.c b/app/src/usb.c index 5f170ee6..aa2d3e75 100644 --- a/app/src/usb.c +++ b/app/src/usb.c @@ -33,6 +33,7 @@ enum zmk_usb_conn_state zmk_usb_get_conn_state() { switch (usb_status) { case USB_DC_SUSPEND: case USB_DC_CONFIGURED: + case USB_DC_RESUME: return ZMK_USB_CONN_HID; case USB_DC_DISCONNECTED: From 3f28a55452eb34d02876e0c98bdc4be9e00936c3 Mon Sep 17 00:00:00 2001 From: Robert U <978080+urob@users.noreply.github.com> Date: Sun, 11 Sep 2022 21:06:04 -0400 Subject: [PATCH 068/289] fix(docs): Fix ambiguous tap-preferred desc. --- docs/docs/behaviors/hold-tap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index 528b9aec..667e5df8 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -28,7 +28,7 @@ We call this the 'hold-preferred' flavor of hold-taps. While this flavor may wor - The 'hold-preferred' flavor triggers the hold behavior when the `tapping-term-ms` has expired or another key is pressed. - The 'balanced' flavor will trigger the hold behavior when the `tapping-term-ms` has expired or another key is pressed and released. -- The 'tap-preferred' flavor triggers the hold behavior when the `tapping-term-ms` has expired. It triggers the tap behavior when another key is pressed. +- The 'tap-preferred' flavor triggers the hold behavior when the `tapping-term-ms` has expired. Pressing another key within `tapping-term-ms` does not affect the decision. - The 'tap-unless-interrupted' flavor triggers a hold behavior only when another key is pressed before `tapping-term-ms` has expired. It triggers the tap behavior in all other situations. When the hold-tap key is released and the hold behavior has not been triggered, the tap behavior will trigger. From cc6dd5fc49f977546c3a686a5a89f66af781485c Mon Sep 17 00:00:00 2001 From: ReFil <31960031+ReFil@users.noreply.github.com> Date: Tue, 13 Sep 2022 13:45:52 +0100 Subject: [PATCH 069/289] chore(lighting): fix deprecation Removed deprecated macros, replace with correct Zephyr 3 implementation --- app/src/backlight.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/backlight.c b/app/src/backlight.c index 28a93e73..159c6fb2 100644 --- a/app/src/backlight.c +++ b/app/src/backlight.c @@ -75,7 +75,7 @@ static void backlight_save_work_handler(struct k_work *work) { settings_save_one("backlight/state", &state, sizeof(state)); } -static K_DELAYED_WORK_DEFINE(backlight_save_work, backlight_save_work_handler); +static struct k_work_delayable backlight_save_work; #endif static int zmk_backlight_init(const struct device *_arg) { @@ -90,6 +90,7 @@ static int zmk_backlight_init(const struct device *_arg) { if (rc != 0) { LOG_ERR("Failed to load backlight settings: %d", rc); } + k_work_init_delayable(&backlight_save_work, backlight_save_work_handler); #endif #if IS_ENABLED(CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB) state.on = zmk_usb_is_powered(); @@ -104,8 +105,8 @@ static int zmk_backlight_update_and_save() { } #if IS_ENABLED(CONFIG_SETTINGS) - k_delayed_work_cancel(&backlight_save_work); - return k_delayed_work_submit(&backlight_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); + int ret = k_work_reschedule(&backlight_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); + return MIN(ret, 0); #else return 0; #endif From 597a48ff2db4e88188ce8f7acf6ac57069f04de7 Mon Sep 17 00:00:00 2001 From: "David A. Bell" <8835326+dabell-cc@users.noreply.github.com> Date: Tue, 2 Aug 2022 14:41:55 -0400 Subject: [PATCH 070/289] Update hold-tap.md The bindings for the toggle-layer-on-tap/momentary-layer-on-hold example code were backwards, resulting in toggle-on-hold. This also made momentary unachievable. --- docs/docs/behaviors/hold-tap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index 667e5df8..8fc94523 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -294,7 +294,7 @@ This hold-tap example implements a [toggle-layer](layers.md/#toggle-layer) when #binding-cells = <2>; flavor = "hold-preferred"; tapping-term-ms = <200>; - bindings = <&tog>, <&mo>; + bindings = <&mo>, <&tog>; }; }; From 9756a16306e0c927ea2d869c87e73fdd518fac28 Mon Sep 17 00:00:00 2001 From: "David A. Bell" <8835326+dabell-cc@users.noreply.github.com> Date: Wed, 3 Aug 2022 20:11:11 -0400 Subject: [PATCH 071/289] fix(docs): Consistent naming in Mo-Tog example. Updated all references in example to conform to Hold action-Tap action wording order. --- docs/docs/behaviors/hold-tap.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index 8fc94523..212cff9f 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -276,19 +276,19 @@ A popular method of implementing Autoshift in ZMK involves a C-preprocessor macr - + -This hold-tap example implements a [toggle-layer](layers.md/#toggle-layer) when the keybind is tapped and a [momentary-layer](layers.md/#momentary-layer) when it is held. Similarly to the Autoshift and Sticky Hold use-cases, a `TOG_MO(layer)` macro is defined such that the `&tog` and `&mo` behaviors can target a single layer. +This hold-tap example implements a [momentary-layer](layers.md/#momentary-layer) when it is held and a [toggle-layer](layers.md/#toggle-layer) when the keybind is tapped. Similarly to the Autoshift and Sticky Hold use-cases, a `MO_TOG(layer)` macro is defined such that the `&mo` and `&tog` behaviors can target a single layer. -```dtsi title="Hold-Tap Example: Toggle layer on Tap, Momentary layer on Hold" +```dtsi title="Hold-Tap Example: Momentary layer on Hold, Toggle layer on Tap" #include #include -#define TOG_MO(layer) &tog_mo layer layer // Macro to apply toggle-layer-on-tap/momentary-layer-on-hold to a specific layer +#define MO_TOG(layer) &mo_tog layer layer // Macro to apply momentary-layer-on-hold/toggle-layer-on-tap to a specific layer / { behaviors { - tog_mo: behavior_mo_tog { + mo_tog: behavior_mo_tog { compatible = "zmk,behavior-hold-tap"; label = "mo_tog"; #binding-cells = <2>; @@ -302,8 +302,8 @@ This hold-tap example implements a [toggle-layer](layers.md/#toggle-layer) when compatible = "zmk,keymap"; default_layer { bindings = < - &tog_mo 2 1 // &mo 2 on hold, &tog 1 on tap - TOG_MO(3) // &mo 3 on hold, &tog 3 on tap + &mo_tog 2 1 // &mo 2 on hold, &tog 1 on tap + MO_TOG(3) // &mo 3 on hold, &tog 3 on tap >; }; }; From 8f6733395705fa3ad52632f4be11d3d055bbddf8 Mon Sep 17 00:00:00 2001 From: "David A. Bell" <8835326+dabell-cc@users.noreply.github.com> Date: Thu, 4 Aug 2022 08:00:25 -0400 Subject: [PATCH 072/289] Update docs/docs/behaviors/hold-tap.md Co-authored-by: Cem Aksoylar --- docs/docs/behaviors/hold-tap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index 212cff9f..8b2dbba8 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -278,7 +278,7 @@ A popular method of implementing Autoshift in ZMK involves a C-preprocessor macr -This hold-tap example implements a [momentary-layer](layers.md/#momentary-layer) when it is held and a [toggle-layer](layers.md/#toggle-layer) when the keybind is tapped. Similarly to the Autoshift and Sticky Hold use-cases, a `MO_TOG(layer)` macro is defined such that the `&mo` and `&tog` behaviors can target a single layer. +This hold-tap example implements a [momentary-layer](layers.md/#momentary-layer) when the keybind is held and a [toggle-layer](layers.md/#toggle-layer) when it is tapped. Similar to the Autoshift and Sticky Hold use-cases, a `MO_TOG(layer)` macro is defined such that the `&mo` and `&tog` behaviors can target a single layer. ```dtsi title="Hold-Tap Example: Momentary layer on Hold, Toggle layer on Tap" #include From b655554b03f16519b23626b612b2d70cc2a648b8 Mon Sep 17 00:00:00 2001 From: ReFil <31960031+ReFil@users.noreply.github.com> Date: Thu, 22 Sep 2022 19:14:09 +0000 Subject: [PATCH 073/289] refactor(boards): CRBN and Planck keymap fixes * Update planck_rev6.keymap Third layer was causing problems so i moved reset and bootloader to second layer * BT_sel functions A customer requested this so we added it * Update crbn.keymap Co-authored-by: Nick Winans --- app/boards/arm/planck/planck_rev6.keymap | 42 +++++++++++++++++++----- app/boards/shields/crbn/README.md | 1 - app/boards/shields/crbn/crbn.keymap | 22 +++++++------ 3 files changed, 45 insertions(+), 20 deletions(-) delete mode 100644 app/boards/shields/crbn/README.md diff --git a/app/boards/arm/planck/planck_rev6.keymap b/app/boards/arm/planck/planck_rev6.keymap index 47e63dc0..bbfb770e 100644 --- a/app/boards/arm/planck/planck_rev6.keymap +++ b/app/boards/arm/planck/planck_rev6.keymap @@ -1,3 +1,9 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + #include #include @@ -6,16 +12,34 @@ compatible = "zmk,keymap"; default_layer { -// ----------------------------------------------------------------------------------------- -// | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | -// | ESC | A | S | D | F | G | H | J | K | L | ; | ' | -// | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | -// | FN | LGUI | LALT | LCTL | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | + // ----------------------------------------------------------------------------------------- + // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | + // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | + // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | bindings = < - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp DEL - &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp BSLH &kp RET - &trans &kp LGUI &kp LALT &kp LCTRL &trans &trans &kp SPACE &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET + &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &trans &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + >; + }; + + lower { + bindings = < + &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(HASH) &kp LS(BSLH) &kp HOME &kp END &trans + &trans &trans &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + >; + }; + + raise { + bindings = < + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans + &reset &bootloader &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP >; }; }; diff --git a/app/boards/shields/crbn/README.md b/app/boards/shields/crbn/README.md deleted file mode 100644 index fee388f1..00000000 --- a/app/boards/shields/crbn/README.md +++ /dev/null @@ -1 +0,0 @@ -A 40% Ortho keyboard made by Polarity Works diff --git a/app/boards/shields/crbn/crbn.keymap b/app/boards/shields/crbn/crbn.keymap index d9aeaa95..9423e1af 100644 --- a/app/boards/shields/crbn/crbn.keymap +++ b/app/boards/shields/crbn/crbn.keymap @@ -13,16 +13,16 @@ compatible = "zmk,keymap"; default_layer { - // ----------------------------------------------------------------------------------------- - // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | - // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | - // | FN | LGUI | LALT | LCTL | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | + // ----------------------------------------------------------------------------------------- + // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | + // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | + // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | bindings = < &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp BSLH &kp RET - &trans &kp LGUI &kp LALT &kp LCTRL &mo 1 &kp SPACE &trans &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET + &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &kp SPACE &trans &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT >; sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; @@ -31,7 +31,7 @@ lower { bindings = < &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL - &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LT &kp GT &kp PIPE + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(HASH) &kp LS(BSLH) &kp HOME &kp END &trans &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP >; @@ -46,12 +46,14 @@ &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans &trans &trans &trans &trans &mo 3 &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP >; + + sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; }; - + control { bindings = < &reset &bootloader &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &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 &trans &trans &trans >; From 8976b353ae792b1c58726e3a80506ab289d1eb5d Mon Sep 17 00:00:00 2001 From: Kurtis Lew Date: Fri, 23 Sep 2022 21:48:18 -0700 Subject: [PATCH 074/289] fix(docs): Correct mo_tog implementation in tabbed menu --- docs/docs/behaviors/hold-tap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index 8b2dbba8..793e350d 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -139,7 +139,7 @@ defaultValue="homerow_mods" values={[ {label: 'Homerow Mods', value: 'homerow_mods'}, {label: 'Autoshift', value: 'autoshift'}, -{label: 'Toggle-on-Tap, Momentary-on-Hold Layers', value: 'tog_mo'}, +{label: 'Toggle-on-Tap, Momentary-on-Hold Layers', value: 'mo_tog'}, ]}> From fad8dd66126fb4aa4a69239ac7a26c108f31c7fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Jul 2022 17:47:41 +0000 Subject: [PATCH 075/289] chore(deps): bump terser from 5.9.0 to 5.14.2 in /docs Bumps [terser](https://github.com/terser/terser) from 5.9.0 to 5.14.2. - [Release notes](https://github.com/terser/terser/releases) - [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md) - [Commits](https://github.com/terser/terser/commits) --- updated-dependencies: - dependency-name: terser dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 102 +++++++++++------------------------------ 1 file changed, 28 insertions(+), 74 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 06a79af0..4297f7ac 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -3323,6 +3323,15 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", @@ -8413,36 +8422,6 @@ "node": ">= 12" } }, - "node_modules/html-minifier-terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/html-minifier-terser/node_modules/terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", - "dependencies": { - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-minifier-terser/node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, "node_modules/html-tags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", @@ -13561,12 +13540,13 @@ } }, "node_modules/terser": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", - "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "bin": { @@ -13614,14 +13594,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, - "node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -17436,6 +17408,15 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==" }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "@jridgewell/sourcemap-codec": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", @@ -21282,29 +21263,6 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - }, - "terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", - "requires": { - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - } } } }, @@ -25015,12 +24973,13 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, "terser": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", - "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "dependencies": { @@ -25028,11 +24987,6 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" } } }, From 0b39bf433639ac3aa537d8ca203d253cc7c04dc1 Mon Sep 17 00:00:00 2001 From: innovaker <66737976+innovaker@users.noreply.github.com> Date: Sat, 19 Jun 2021 11:07:29 +0100 Subject: [PATCH 076/289] ci: remove `4-` prefix from zephyr-modules cache keys This is no longer required. --- .github/workflows/build.yml | 8 ++++---- .github/workflows/test.yml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a5989cef..8e945cde 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -35,11 +35,11 @@ jobs: tools/ zephyr/ bootloader/ - key: 4-${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('app/west.yml') }} + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('app/west.yml') }} restore-keys: | - 4-${{ runner.os }}-build-${{ env.cache-name }}- - 4-${{ runner.os }}-build- - 4-${{ runner.os }}- + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- timeout-minutes: 2 continue-on-error: true - name: Initialize workspace (west init) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1f019cdc..3393d0c4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -47,11 +47,11 @@ jobs: tools/ zephyr/ bootloader/ - key: 4-${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('app/west.yml') }} + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('app/west.yml') }} restore-keys: | - 4-${{ runner.os }}-build-${{ env.cache-name }}- - 4-${{ runner.os }}-build- - 4-${{ runner.os }}- + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- timeout-minutes: 2 continue-on-error: true - name: Initialize workspace (west init) From 978251839767ab754b727d1c59e478ac8be30894 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 28 Sep 2022 17:59:25 +0000 Subject: [PATCH 077/289] feature(drivers): Option for read wait on matrix. * Add a new Kconfig option, `ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS` to delay reading inputs after setting an output active. --- app/drivers/kscan/Kconfig | 12 +++++++++++- app/drivers/kscan/kscan_gpio_matrix.c | 4 ++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/app/drivers/kscan/Kconfig b/app/drivers/kscan/Kconfig index b76a27b4..51546006 100644 --- a/app/drivers/kscan/Kconfig +++ b/app/drivers/kscan/Kconfig @@ -32,6 +32,16 @@ config ZMK_KSCAN_GPIO_MATRIX if ZMK_KSCAN_GPIO_MATRIX +config ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS + int "Ticks to wait before reading inputs after an output set active" + default 0 + help + When iterating over each output to drive it active, read inputs, then set + inactive again, some boards may take time for output to propagate to the + inputs. In that scenario, set this value to a positive value to configure + the number of ticks to wait after setting an output active before reading + the inputs for their active state. + config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS int "Ticks to wait between each output when scanning" default 0 @@ -40,7 +50,7 @@ config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS inactive again, some boards may take time for the previous output to "settle" before reading inputs for the next active output column. In that scenario, set this value to a positive value to configure the number of - usecs to wait after reading each column of keys. + ticks to wait after reading each column of keys. endif # ZMK_KSCAN_GPIO_MATRIX diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index 1ab4d442..71fcad29 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -235,6 +235,10 @@ static int kscan_matrix_read(const struct device *dev) { return err; } +#if CONFIG_ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS > 0 + k_busy_wait(CONFIG_ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS); +#endif + for (int i = 0; i < config->inputs.len; i++) { const struct gpio_dt_spec *in_gpio = &config->inputs.gpios[i]; From 30e9accc95ff4c5035bbd7137c28d1a483ed5a48 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 28 Sep 2022 18:14:35 +0000 Subject: [PATCH 078/289] feat(docs): Wait options for matrix driver. * Document `CONFIG_ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS` and `CONFIG_ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS` options --- docs/docs/config/kscan.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index 1f54692d..787d5136 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -93,9 +93,11 @@ Keyboard scan driver where keys are arranged on a matrix with one GPIO per row a Definition file: [zmk/app/drivers/kscan/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/kscan/Kconfig) -| Config | Type | Description | Default | -| --------------------------------- | ---- | ------------------------------------------------ | ------- | -| `CONFIG_ZMK_KSCAN_MATRIX_POLLING` | bool | Poll for key presses instead of using interrupts | n | +| Config | Type | Description | Default | +| ---------------------------------------------- | ----------- | ------------------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_KSCAN_MATRIX_POLLING` | bool | Poll for key presses instead of using interrupts | n | +| `CONFIG_ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS` | int (ticks) | How long to wait before reading input pins after setting output active | 0 | +| `CONFIG_ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS` | int (ticks) | How long to wait between each output to allow previous output to "settle" | 0 | ### Devicetree From 3d3c45bc80607c68cd82a94d9c3e372b6c5ec63e Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Thu, 29 Sep 2022 20:11:26 -0500 Subject: [PATCH 079/289] feature(shields): Add nice!view * Use two shield system, nice_view, and nice_view_adapter * Build system fixes for interconnect use. --- .github/workflows/build-user-config.yml | 2 +- .github/workflows/build.yml | 5 +++- .../shields/nice_view/Kconfig.defconfig | 22 ++++++++++++++++++ app/boards/shields/nice_view/Kconfig.shield | 5 ++++ app/boards/shields/nice_view/README.md | 5 ++++ app/boards/shields/nice_view/nice_view.conf | 4 ++++ .../shields/nice_view/nice_view.overlay | 23 +++++++++++++++++++ .../shields/nice_view/nice_view.zmk.yml | 8 +++++++ .../nice_view_adapter/Kconfig.defconfig | 2 ++ .../shields/nice_view_adapter/Kconfig.shield | 5 ++++ .../shields/nice_view_adapter/README.md | 11 +++++++++ .../boards/bluemicro840_v1.overlay | 17 ++++++++++++++ .../boards/mikoto_520.overlay | 17 ++++++++++++++ .../boards/nice_nano.overlay | 17 ++++++++++++++ .../boards/nice_nano_v2.overlay | 17 ++++++++++++++ .../boards/nrfmicro_11.overlay | 17 ++++++++++++++ .../boards/nrfmicro_11_flipped.overlay | 17 ++++++++++++++ .../boards/nrfmicro_13.overlay | 17 ++++++++++++++ .../boards/puchi_ble_v1.overlay | 17 ++++++++++++++ .../nice_view_adapter/nice_view_adapter.conf | 2 ++ .../nice_view_adapter.overlay | 5 ++++ .../nice_view_adapter.zmk.yml | 7 ++++++ app/core-coverage.yml | 3 +++ docs/docs/hardware.mdx | 8 +++---- docs/src/components/hardware-utils.ts | 6 ++++- 25 files changed, 252 insertions(+), 7 deletions(-) create mode 100644 app/boards/shields/nice_view/Kconfig.defconfig create mode 100644 app/boards/shields/nice_view/Kconfig.shield create mode 100644 app/boards/shields/nice_view/README.md create mode 100644 app/boards/shields/nice_view/nice_view.conf create mode 100644 app/boards/shields/nice_view/nice_view.overlay create mode 100644 app/boards/shields/nice_view/nice_view.zmk.yml create mode 100644 app/boards/shields/nice_view_adapter/Kconfig.defconfig create mode 100644 app/boards/shields/nice_view_adapter/Kconfig.shield create mode 100644 app/boards/shields/nice_view_adapter/README.md create mode 100644 app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay create mode 100644 app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay create mode 100644 app/boards/shields/nice_view_adapter/boards/nice_nano.overlay create mode 100644 app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay create mode 100644 app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay create mode 100644 app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay create mode 100644 app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay create mode 100644 app/boards/shields/nice_view_adapter/nice_view_adapter.conf create mode 100644 app/boards/shields/nice_view_adapter/nice_view_adapter.overlay create mode 100644 app/boards/shields/nice_view_adapter/nice_view_adapter.zmk.yml diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index c31b6783..215ccb63 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -61,7 +61,7 @@ jobs: set -x if [ -n "${{ matrix.shield }}" ] then - EXTRA_CMAKE_ARGS="-DSHIELD=${{ matrix.shield }}" + EXTRA_CMAKE_ARGS="-DSHIELD=\"${{ matrix.shield }}\"" ARTIFACT_NAME="${{ matrix.shield }}-${{ matrix.board }}-zmk" DISPLAY_NAME="${{ matrix.shield }} - ${{ matrix.board }}" else diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8e945cde..16373673 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -71,7 +71,7 @@ jobs: for (const shieldArgs of buildShieldArgs) { try { - const output = execSync(`west build -s app -p -b ${{ matrix.board }} -- ${shieldArgs.shield ? '-DSHIELD=' + shieldArgs.shield : ''} ${shieldArgs['cmake-args'] || ''}`); + const output = execSync(`west build -s app -p -b ${{ matrix.board }} -- ${shieldArgs.shield ? '-DSHIELD="' + shieldArgs.shield + '"' : ''} ${shieldArgs['cmake-args'] || ''}`); console.log(`::group::${{ matrix.board}} ${shieldArgs.shield} Build`) console.log(output.toString()); @@ -246,6 +246,9 @@ jobs: return hm.requires.flatMap(i => metadata.interconnects[i].boards.flatMap(b => boardAndShield(b, hm)) ); + } else { + console.warn("Unhandled shield without keys"); + return []; } break; case "interconnect": diff --git a/app/boards/shields/nice_view/Kconfig.defconfig b/app/boards/shields/nice_view/Kconfig.defconfig new file mode 100644 index 00000000..622c7498 --- /dev/null +++ b/app/boards/shields/nice_view/Kconfig.defconfig @@ -0,0 +1,22 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_NICE_VIEW + +config ZMK_DISPLAY + select LVGL_FONT_MONTSERRAT_26 + +if ZMK_DISPLAY + +config SPI + default y + +config LS0XX + default y + +config ZMK_WIDGET_WPM_STATUS + default y if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL + +endif # ZMK_DISPLAY + +endif diff --git a/app/boards/shields/nice_view/Kconfig.shield b/app/boards/shields/nice_view/Kconfig.shield new file mode 100644 index 00000000..55cba788 --- /dev/null +++ b/app/boards/shields/nice_view/Kconfig.shield @@ -0,0 +1,5 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_NICE_VIEW + def_bool $(shields_list_contains,nice_view) diff --git a/app/boards/shields/nice_view/README.md b/app/boards/shields/nice_view/README.md new file mode 100644 index 00000000..0b4ac21f --- /dev/null +++ b/app/boards/shields/nice_view/README.md @@ -0,0 +1,5 @@ +# nice!view + +The nice!view is a low power, high refresh rate display meant to replace I2C OLEDs traditionally used. + +This shield requires that an `&nice_view_spi` labelled SPI bus is provided with *at least* MOSI, SCK, and CS pins defined. diff --git a/app/boards/shields/nice_view/nice_view.conf b/app/boards/shields/nice_view/nice_view.conf new file mode 100644 index 00000000..368e848a --- /dev/null +++ b/app/boards/shields/nice_view/nice_view.conf @@ -0,0 +1,4 @@ +# Enable nice!view +CONFIG_ZMK_DISPLAY=y +CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_26=y +CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y diff --git a/app/boards/shields/nice_view/nice_view.overlay b/app/boards/shields/nice_view/nice_view.overlay new file mode 100644 index 00000000..eacdd41a --- /dev/null +++ b/app/boards/shields/nice_view/nice_view.overlay @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +&nice_view_spi { + status = "okay"; + nice_view: ls0xx@0 { + compatible = "sharp,ls0xx"; + label = "DISPLAY"; + spi-max-frequency = <1000000>; + reg = <0>; + width = <160>; + height = <68>; + }; +}; + +/ { + chosen { + zephyr,display = &nice_view; + }; +}; diff --git a/app/boards/shields/nice_view/nice_view.zmk.yml b/app/boards/shields/nice_view/nice_view.zmk.yml new file mode 100644 index 00000000..04b98a8a --- /dev/null +++ b/app/boards/shields/nice_view/nice_view.zmk.yml @@ -0,0 +1,8 @@ +file_format: "1" +id: nice_view +name: nice!view +type: shield +url: https://nicekeyboards.com/nice-view +requires: [nice_view_header] +features: + - display diff --git a/app/boards/shields/nice_view_adapter/Kconfig.defconfig b/app/boards/shields/nice_view_adapter/Kconfig.defconfig new file mode 100644 index 00000000..fb23f20c --- /dev/null +++ b/app/boards/shields/nice_view_adapter/Kconfig.defconfig @@ -0,0 +1,2 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT diff --git a/app/boards/shields/nice_view_adapter/Kconfig.shield b/app/boards/shields/nice_view_adapter/Kconfig.shield new file mode 100644 index 00000000..bf9ba7cb --- /dev/null +++ b/app/boards/shields/nice_view_adapter/Kconfig.shield @@ -0,0 +1,5 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_NICE_VIEW_ADAPTER + def_bool $(shields_list_contains,nice_view_adapter) diff --git a/app/boards/shields/nice_view_adapter/README.md b/app/boards/shields/nice_view_adapter/README.md new file mode 100644 index 00000000..ec4665a3 --- /dev/null +++ b/app/boards/shields/nice_view_adapter/README.md @@ -0,0 +1,11 @@ +# nice!view Adapter + +This shield is used as an adapter between the nice!view and existing shields/boards that expose an I2C OLED header. + +To use this shield, you should add this shield to your list of shields *before* `nice_view`. + +The nice!view will use the SDA/SCL pins of the OLED, and then the adapter expects a final pin to be "bodged" from your microcontroller to the nice!view CS pin. This adapter assumes that the CS pin bodged is the `&pro_micro 1` pin or "D1", which is the top left pin when looking at the front of the board. If you can't use this pin, you'll need to override the `cs-gpios` for the `&nice_view_spi` bus (in your `zmk-config` keymap for example) or you will want to define your own `&nice_view_spi` bus without using this adapter. + +``` +west build -b nice_nano_v2 -- -DSHIELD="lily58_left nice_view_adapter nice_view" +``` diff --git a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay new file mode 100644 index 00000000..9d9ab734 --- /dev/null +++ b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +nice_view_spi: &spi0 { + compatible = "nordic,nrf-spim"; + sck-pin = <17>; + mosi-pin = <15>; + miso-pin = <25>; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; +}; + +&pro_micro_i2c { + status = "disabled"; +}; diff --git a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay new file mode 100644 index 00000000..9f6fad1c --- /dev/null +++ b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +nice_view_spi: &spi0 { + compatible = "nordic,nrf-spim"; + sck-pin = <20>; + mosi-pin = <17>; + miso-pin = <5>; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; +}; + +&pro_micro_i2c { + status = "disabled"; +}; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay new file mode 100644 index 00000000..3a0ad462 --- /dev/null +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +nice_view_spi: &spi0 { + compatible = "nordic,nrf-spim"; + sck-pin = <20>; + mosi-pin = <17>; + miso-pin = <25>; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; +}; + +&pro_micro_i2c { + status = "disabled"; +}; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..3a0ad462 --- /dev/null +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +nice_view_spi: &spi0 { + compatible = "nordic,nrf-spim"; + sck-pin = <20>; + mosi-pin = <17>; + miso-pin = <25>; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; +}; + +&pro_micro_i2c { + status = "disabled"; +}; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay new file mode 100644 index 00000000..9d9ab734 --- /dev/null +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +nice_view_spi: &spi0 { + compatible = "nordic,nrf-spim"; + sck-pin = <17>; + mosi-pin = <15>; + miso-pin = <25>; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; +}; + +&pro_micro_i2c { + status = "disabled"; +}; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay new file mode 100644 index 00000000..7b12c252 --- /dev/null +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +nice_view_spi: &spi0 { + compatible = "nordic,nrf-spim"; + sck-pin = <31>; + mosi-pin = <30>; + miso-pin = <25>; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; +}; + +&pro_micro_i2c { + status = "disabled"; +}; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay new file mode 100644 index 00000000..9d9ab734 --- /dev/null +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +nice_view_spi: &spi0 { + compatible = "nordic,nrf-spim"; + sck-pin = <17>; + mosi-pin = <15>; + miso-pin = <25>; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; +}; + +&pro_micro_i2c { + status = "disabled"; +}; diff --git a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay new file mode 100644 index 00000000..9d9ab734 --- /dev/null +++ b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +nice_view_spi: &spi0 { + compatible = "nordic,nrf-spim"; + sck-pin = <17>; + mosi-pin = <15>; + miso-pin = <25>; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; +}; + +&pro_micro_i2c { + status = "disabled"; +}; diff --git a/app/boards/shields/nice_view_adapter/nice_view_adapter.conf b/app/boards/shields/nice_view_adapter/nice_view_adapter.conf new file mode 100644 index 00000000..c5fe224e --- /dev/null +++ b/app/boards/shields/nice_view_adapter/nice_view_adapter.conf @@ -0,0 +1,2 @@ +# Disable OLED +CONFIG_SSD1306=n diff --git a/app/boards/shields/nice_view_adapter/nice_view_adapter.overlay b/app/boards/shields/nice_view_adapter/nice_view_adapter.overlay new file mode 100644 index 00000000..2b82df5c --- /dev/null +++ b/app/boards/shields/nice_view_adapter/nice_view_adapter.overlay @@ -0,0 +1,5 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ diff --git a/app/boards/shields/nice_view_adapter/nice_view_adapter.zmk.yml b/app/boards/shields/nice_view_adapter/nice_view_adapter.zmk.yml new file mode 100644 index 00000000..e63b01e5 --- /dev/null +++ b/app/boards/shields/nice_view_adapter/nice_view_adapter.zmk.yml @@ -0,0 +1,7 @@ +file_format: "1" +id: nice_view_adapter +name: nice!view adapter +type: shield +url: https://nicekeyboards.com/nice-view +requires: [i2c_oled] +exposes: [nice_view_header] diff --git a/app/core-coverage.yml b/app/core-coverage.yml index 90470ba3..12c03613 100644 --- a/app/core-coverage.yml +++ b/app/core-coverage.yml @@ -30,3 +30,6 @@ include: shield: romac_plus cmake-args: "-DCONFIG_ZMK_RGB_UNDERGLOW=y -DCONFIG_WS2812_STRIP=y" nickname: "underglow" +- board: nice_nano_v2 + shield: lily58_left nice_view_adapter nice_view + nickname: "niceview" diff --git a/docs/docs/hardware.mdx b/docs/docs/hardware.mdx index d2b6aa9d..6f377073 100644 --- a/docs/docs/hardware.mdx +++ b/docs/docs/hardware.mdx @@ -21,13 +21,13 @@ export const toc = [ id: "composite", level: 2, }, - ...Object.values(groupedMetadata(Metadata).interconnects).map( - ({ interconnect }) => ({ + ...Object.values(groupedMetadata(Metadata).interconnects) + .filter((ic) => ic.interconnect !== undefined) + .map(({ interconnect }) => ({ value: `${interconnect.name} Interconnect`, id: interconnect.id, level: 3, - }) - ), + })), { value: "Other Hardware", id: "other-hardware", diff --git a/docs/src/components/hardware-utils.ts b/docs/src/components/hardware-utils.ts index 13ca5eb6..76452dc3 100644 --- a/docs/src/components/hardware-utils.ts +++ b/docs/src/components/hardware-utils.ts @@ -41,7 +41,11 @@ function groupedShield(agg: GroupedMetadata, shield: Shield) { ic.shields.push(shield); agg.interconnects[id] = ic; }); - + shield.exposes?.forEach((id) => { + let ic = agg.interconnects[id] ?? { boards: [], shields: [] }; + ic.shields.push(shield); + agg.interconnects[id] = ic; + }); return agg; } From cc3d5529fd9c24bed1a08c8a32899d09257197c9 Mon Sep 17 00:00:00 2001 From: zhiayang <500236+zhiayang@users.noreply.github.com> Date: Fri, 30 Sep 2022 09:22:01 +0800 Subject: [PATCH 080/289] feat(drivers): Driver for MAX7318 GPIO expander (#1295) Add driver for max7318 i2c gpio expander Co-authored-by: Pete Johanson --- app/drivers/gpio/CMakeLists.txt | 3 +- app/drivers/gpio/Kconfig | 3 +- app/drivers/gpio/Kconfig.max7318 | 25 ++ app/drivers/gpio/gpio_max7318.c | 336 ++++++++++++++++++ .../dts/bindings/gpio/maxim,max7318.yaml | 29 ++ 5 files changed, 394 insertions(+), 2 deletions(-) create mode 100644 app/drivers/gpio/Kconfig.max7318 create mode 100644 app/drivers/gpio/gpio_max7318.c create mode 100644 app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml diff --git a/app/drivers/gpio/CMakeLists.txt b/app/drivers/gpio/CMakeLists.txt index 0df31ad5..f4378151 100644 --- a/app/drivers/gpio/CMakeLists.txt +++ b/app/drivers/gpio/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2020 The ZMK Contributors +# Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT zephyr_library_named(zmk__drivers__gpio) @@ -6,3 +6,4 @@ zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) zephyr_library_sources_ifdef(CONFIG_GPIO_595 gpio_595.c) zephyr_library_sources_ifdef(CONFIG_GPIO_MCP23017 gpio_mcp23017.c) +zephyr_library_sources_ifdef(CONFIG_GPIO_MAX7318 gpio_max7318.c) diff --git a/app/drivers/gpio/Kconfig b/app/drivers/gpio/Kconfig index e6f8bfb8..43c7c24e 100644 --- a/app/drivers/gpio/Kconfig +++ b/app/drivers/gpio/Kconfig @@ -2,4 +2,5 @@ menuconfig ZMK_DRIVERS_GPIO bool "GPIO" rsource "Kconfig.mcp23017" -rsource "Kconfig.595" \ No newline at end of file +rsource "Kconfig.max7318" +rsource "Kconfig.595" diff --git a/app/drivers/gpio/Kconfig.max7318 b/app/drivers/gpio/Kconfig.max7318 new file mode 100644 index 00000000..ded7f926 --- /dev/null +++ b/app/drivers/gpio/Kconfig.max7318 @@ -0,0 +1,25 @@ +# MAX7318 GPIO configuration options + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +DT_COMPAT_MAXIM_MAX7318 := maxim,max7318 + +menuconfig GPIO_MAX7318 + bool "MAX7318 I2C-based GPIO chip" + default $(dt_compat_enabled,$(DT_COMPAT_MAXIM_MAX7318)) + depends on I2C + select HAS_DTS_GPIO + select ZMK_DRIVERS_GPIO + help + Enable driver for MAX7318 I2C-based GPIO chip. + +if GPIO_MAX7318 + +config GPIO_MAX7318_INIT_PRIORITY + int "Init priority" + default 75 + help + Device driver initialization priority. + +endif #GPIO_MAX7318 diff --git a/app/drivers/gpio/gpio_max7318.c b/app/drivers/gpio/gpio_max7318.c new file mode 100644 index 00000000..3dcc710c --- /dev/null +++ b/app/drivers/gpio/gpio_max7318.c @@ -0,0 +1,336 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT maxim_max7318 + +/** + * @file Driver for MAX7318 I2C-based GPIO driver. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#define LOG_LEVEL CONFIG_GPIO_LOG_LEVEL +#include + +LOG_MODULE_REGISTER(gpio_max7318); + +// Register definitions +#define REG_INPUT_PORTA 0x00 +#define REG_INPUT_PORTB 0x01 +#define REG_OUTPUT_PORTA 0x02 +#define REG_OUTPUT_PORTB 0x03 +#define REG_IPOL_PORTA 0x04 +#define REG_IPOL_PORTB 0x05 +#define REG_CONFIG_PORTA 0x06 +#define REG_CONFIG_PORTB 0x07 + +// Configuration data +struct max7318_config { + struct gpio_driver_config common; + + struct i2c_dt_spec i2c_bus; + uint8_t ngpios; +}; + +// Runtime driver data +struct max7318_drv_data { + // gpio_driver_data needs to be first + struct gpio_driver_config data; + + struct k_sem lock; + + struct { + uint16_t ipol; + uint16_t config; + uint16_t output; + } reg_cache; +}; + +/** + * @brief Read the value of two consecutive registers + * + * Read two consecutive bytes from the register at address `reg` and `reg + 1`, + * typically reading from registers for port 0 and 1 simultaneously. + * + * @param dev The max7318 device. + * @param reg Register to read (the PORT0 of the pair of registers). + * @param buf Buffer to read data into. + * + * @return 0 if successful, failed otherwise. + */ +static int read_registers(const struct device *dev, uint8_t reg, uint16_t *buf) { + const struct max7318_config *config = dev->config; + + uint16_t data = 0; + int ret = i2c_burst_read_dt(&config->i2c_bus, reg, (uint8_t *)&data, sizeof(data)); + if (ret) { + LOG_DBG("i2c_write_read FAIL %d\n", ret); + return ret; + } + + *buf = sys_le16_to_cpu(data); + + LOG_DBG("max7318: read: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, (*buf & 0xFF), (reg + 1), + (*buf >> 8)); + + return 0; +} + +/** + * @brief Write the value of two consecutive registers + * + * Write two consecutive bytes from the register at address `reg` and `reg + 1`, + * typically to registers for port 0 and 1 simultaneously. + * + * @param dev The max7318 device. + * @param reg Register to write (usually the register for PORT0). + * @param value The value to write + * + * @return 0 if successful, failed otherwise. + */ +static int write_registers(const struct device *dev, uint8_t reg, uint16_t value) { + const struct max7318_config *config = dev->config; + + LOG_DBG("max7318: write: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, (value & 0xFF), (reg + 1), + (value >> 8)); + + uint16_t data = sys_cpu_to_le16(value); + + return i2c_burst_write_dt(&config->i2c_bus, reg, (uint8_t *)&data, sizeof(data)); +} + +/** + * @brief Setup the pin direction (input or output) + * + * @param dev The max7318 device. + * @param pin The pin number. + * @param flags Flags of pin or port. + * + * @return 0 if successful, failed otherwise + */ +static int set_pin_direction(const struct device *dev, uint32_t pin, int flags) { + struct max7318_drv_data *const drv_data = (struct max7318_drv_data *const)dev->data; + uint16_t *dir = &drv_data->reg_cache.config; + uint16_t *output = &drv_data->reg_cache.output; + + /* + The output register is 1=high, 0=low; the direction (config) register + is 1=input, 0=output. + */ + if ((flags & GPIO_OUTPUT) != 0U) { + if ((flags & GPIO_OUTPUT_INIT_HIGH) != 0U) { + *output |= BIT(pin); + } else if ((flags & GPIO_OUTPUT_INIT_LOW) != 0U) { + *output &= ~BIT(pin); + } + *dir &= ~BIT(pin); + } else { + *dir |= BIT(pin); + } + + int ret = write_registers(dev, REG_OUTPUT_PORTA, *output); + if (ret != 0) { + return ret; + } + + return write_registers(dev, REG_CONFIG_PORTA, *dir); +} + +/** + * @brief Setup the pin pull up/pull down status. This function doesn't actually set any + * registers, since the max7318 only supports a pullup, and it can't be controlled. + * + * @param dev The max7318 device. + * @param pin The pin number + * @param flags Flags of pin or port + * + * @return 0 if successful, failed otherwise + */ +static int set_pin_pull_direction(const struct device *dev, uint32_t pin, int flags) { + // actually, this chip only supports pull-up, and it can't be disabled. + // so, if we try to set anything else, return enotsup; we don't actually + // need to set any registers. + if ((flags & GPIO_PULL_DOWN) != 0U) { + return -ENOTSUP; + } + + return 0; +} + +static int max7318_config(const struct device *dev, gpio_pin_t pin, gpio_flags_t flags) { + struct max7318_drv_data *const drv_data = (struct max7318_drv_data *const)dev->data; + + /* Can't do I2C bus operations from an ISR */ + if (k_is_in_isr()) { + return -EWOULDBLOCK; + } + + k_sem_take(&drv_data->lock, K_FOREVER); + + int ret = 0; + if ((flags & GPIO_OPEN_DRAIN) != 0U) { + ret = -ENOTSUP; + goto done; + }; + + ret = set_pin_direction(dev, pin, flags); + if (ret != 0) { + LOG_ERR("error setting pin direction (%d)", ret); + goto done; + } + + ret = set_pin_pull_direction(dev, pin, flags); + if (ret != 0) { + LOG_ERR("error setting pin pull up/down (%d)", ret); + goto done; + } + +done: + k_sem_give(&drv_data->lock); + return ret; +} + +static int max7318_port_get_raw(const struct device *dev, uint32_t *value) { + struct max7318_drv_data *const drv_data = (struct max7318_drv_data *const)dev->data; + + /* Can't do I2C bus operations from an ISR */ + if (k_is_in_isr()) { + return -EWOULDBLOCK; + } + + k_sem_take(&drv_data->lock, K_FOREVER); + + uint16_t buf = 0; + int ret = read_registers(dev, REG_INPUT_PORTA, &buf); + if (ret != 0) { + goto done; + } + + *value = buf; + +done: + k_sem_give(&drv_data->lock); + return ret; +} + +static int max7318_port_set_masked_raw(const struct device *dev, uint32_t mask, uint32_t value) { + struct max7318_drv_data *const drv_data = (struct max7318_drv_data *const)dev->data; + + /* Can't do I2C bus operations from an ISR */ + if (k_is_in_isr()) { + return -EWOULDBLOCK; + } + + k_sem_take(&drv_data->lock, K_FOREVER); + + uint16_t buf = drv_data->reg_cache.output; + buf = (buf & ~mask) | (mask & value); + + int ret = write_registers(dev, REG_OUTPUT_PORTA, buf); + if (ret == 0) { + drv_data->reg_cache.output = buf; + } + + k_sem_give(&drv_data->lock); + return ret; +} + +static int max7318_port_set_bits_raw(const struct device *dev, uint32_t mask) { + return max7318_port_set_masked_raw(dev, mask, mask); +} + +static int max7318_port_clear_bits_raw(const struct device *dev, uint32_t mask) { + return max7318_port_set_masked_raw(dev, mask, 0); +} + +static int max7318_port_toggle_bits(const struct device *dev, uint32_t mask) { + struct max7318_drv_data *const drv_data = (struct max7318_drv_data *const)dev->data; + + /* Can't do I2C bus operations from an ISR */ + if (k_is_in_isr()) { + return -EWOULDBLOCK; + } + + k_sem_take(&drv_data->lock, K_FOREVER); + + uint16_t buf = drv_data->reg_cache.output; + buf ^= mask; + + int ret = write_registers(dev, REG_OUTPUT_PORTA, buf); + if (ret == 0) { + drv_data->reg_cache.output = buf; + } + + k_sem_give(&drv_data->lock); + return ret; +} + +static int max7318_pin_interrupt_configure(const struct device *dev, gpio_pin_t pin, + enum gpio_int_mode mode, enum gpio_int_trig trig) { + return -ENOTSUP; +} + +static const struct gpio_driver_api api_table = { + .pin_configure = max7318_config, + .port_get_raw = max7318_port_get_raw, + .port_set_masked_raw = max7318_port_set_masked_raw, + .port_set_bits_raw = max7318_port_set_bits_raw, + .port_clear_bits_raw = max7318_port_clear_bits_raw, + .port_toggle_bits = max7318_port_toggle_bits, + .pin_interrupt_configure = max7318_pin_interrupt_configure, +}; + +/** + * @brief Initialisation function of MAX7318 + * + * @param dev Device struct + * @return 0 if successful, failed otherwise. + */ +static int max7318_init(const struct device *dev) { + const struct max7318_config *const config = dev->config; + struct max7318_drv_data *const drv_data = (struct max7318_drv_data *const)dev->data; + + if (!device_is_ready(config->i2c_bus.bus)) { + LOG_WRN("i2c bus not ready!"); + return -EINVAL; + } + + LOG_INF("device initialised at 0x%x", config->i2c_bus.addr); + + k_sem_init(&drv_data->lock, 1, 1); + return 0; +} + +#define GPIO_PORT_PIN_MASK_FROM_NGPIOS(ngpios) ((gpio_port_pins_t)(((uint64_t)1 << (ngpios)) - 1U)) + +#define GPIO_PORT_PIN_MASK_FROM_DT_INST(inst) \ + GPIO_PORT_PIN_MASK_FROM_NGPIOS(DT_INST_PROP(inst, ngpios)) + +#define MAX7318_INIT(inst) \ + static struct max7318_config max7318_##inst##_config = { \ + .common = {.port_pin_mask = GPIO_PORT_PIN_MASK_FROM_DT_INST(inst)}, \ + .i2c_bus = I2C_DT_SPEC_INST_GET(inst)}; \ + \ + static struct max7318_drv_data max7318_##inst##_drvdata = { \ + /* Default for registers according to datasheet */ \ + .reg_cache.ipol = 0x0, \ + .reg_cache.config = 0xFFFF, \ + .reg_cache.output = 0xFFFF, \ + }; \ + \ + DEVICE_DT_INST_DEFINE(inst, max7318_init, NULL, &max7318_##inst##_drvdata, \ + &max7318_##inst##_config, POST_KERNEL, \ + CONFIG_GPIO_MAX7318_INIT_PRIORITY, &api_table); + +DT_INST_FOREACH_STATUS_OKAY(MAX7318_INIT) diff --git a/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml b/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml new file mode 100644 index 00000000..2db84bcd --- /dev/null +++ b/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml @@ -0,0 +1,29 @@ +# +# Copyright (c) 2022 The ZMK Contributors +# +# SPDX-License-Identifier: MIT +# + +description: > + This is a representation of the Maxim MAX7318 I2C Gpio Expander. + +compatible: "maxim,max7318" + +include: [gpio-controller.yaml, i2c-device.yaml] + +properties: + label: + required: true + + "#gpio-cells": + const: 2 + + ngpios: + type: int + required: true + const: 16 + description: Number of gpios supported + +gpio-cells: + - pin + - flags From 1e25ee77d232e34cc5ed88912b7390acab8703bd Mon Sep 17 00:00:00 2001 From: Pavel Glushkov Date: Mon, 3 Oct 2022 04:01:55 +0200 Subject: [PATCH 081/289] fear(boards): Add nrfmicro_13_52833 board * Add nrfmicro_13_52833 board definition. Co-authored-by: Alexander Krikun Co-authored-by: Pete Johanson --- app/boards/arm/nrfmicro/Kconfig | 4 +- app/boards/arm/nrfmicro/Kconfig.board | 4 + app/boards/arm/nrfmicro/Kconfig.defconfig | 8 +- .../arduino_pro_micro_pins_52833.dtsi | 59 +++++++++ app/boards/arm/nrfmicro/nrfmicro_13_52833.dts | 121 ++++++++++++++++++ .../arm/nrfmicro/nrfmicro_13_52833.yaml | 15 +++ .../arm/nrfmicro/nrfmicro_13_52833.zmk.yml | 10 ++ .../arm/nrfmicro/nrfmicro_13_52833_defconfig | 23 ++++ app/boards/arm/nrfmicro/pinmux.c | 2 +- 9 files changed, 239 insertions(+), 7 deletions(-) create mode 100644 app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi create mode 100644 app/boards/arm/nrfmicro/nrfmicro_13_52833.dts create mode 100644 app/boards/arm/nrfmicro/nrfmicro_13_52833.yaml create mode 100644 app/boards/arm/nrfmicro/nrfmicro_13_52833.zmk.yml create mode 100644 app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig diff --git a/app/boards/arm/nrfmicro/Kconfig b/app/boards/arm/nrfmicro/Kconfig index 35019722..12b06621 100644 --- a/app/boards/arm/nrfmicro/Kconfig +++ b/app/boards/arm/nrfmicro/Kconfig @@ -2,9 +2,9 @@ config BOARD_ENABLE_DCDC bool "Enable DCDC mode" select SOC_DCDC_NRF52X default y - depends on (BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13) + depends on (BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) config BOARD_NRFMICRO_CHARGER bool "Enable battery charger" default y - depends on (BOARD_NRFMICRO_13) + depends on (BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) diff --git a/app/boards/arm/nrfmicro/Kconfig.board b/app/boards/arm/nrfmicro/Kconfig.board index 36b2d55e..244242a9 100644 --- a/app/boards/arm/nrfmicro/Kconfig.board +++ b/app/boards/arm/nrfmicro/Kconfig.board @@ -14,3 +14,7 @@ config BOARD_NRFMICRO_11_FLIPPED config BOARD_NRFMICRO_13 bool "nrfmicro_13" depends on SOC_NRF52840_QIAA + +config BOARD_NRFMICRO_13_52833 + bool "nrfmicro_13_52833" + depends on SOC_NRF52833_QIAA diff --git a/app/boards/arm/nrfmicro/Kconfig.defconfig b/app/boards/arm/nrfmicro/Kconfig.defconfig index 159d9ade..751d592b 100644 --- a/app/boards/arm/nrfmicro/Kconfig.defconfig +++ b/app/boards/arm/nrfmicro/Kconfig.defconfig @@ -3,7 +3,7 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT -if BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 +if BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 config BOARD default "nrfmicro" @@ -27,11 +27,11 @@ config ZMK_USB config PINMUX default y -if BOARD_NRFMICRO_13 +if BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 config BOARD_NRFMICRO_CHARGER default y -endif # BOARD_NRFMICRO_13 +endif # BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 -endif # BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 +endif # BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 diff --git a/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi new file mode 100644 index 00000000..651edb94 --- /dev/null +++ b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + + +/ { + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 15 0> /* D2 */ + , <3 0 &gpio0 17 0> /* D3 */ + , <4 0 &gpio0 20 0> /* D4/A6 */ + , <5 0 &gpio0 13 0> /* D5 */ + , <6 0 &gpio0 24 0> /* D6/A7 */ + , <7 0 &gpio0 9 0> /* D7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 4 0> /* D10/A10 */ + , <16 0 &gpio0 28 0> /* D16 */ + , <14 0 &gpio0 3 0> /* D14 */ + , <15 0 &gpio1 5 0> /* D15 */ + , <18 0 &gpio0 2 0> /* D18/A0 */ + , <19 0 &gpio0 29 0> /* D19/A1 */ + , <20 0 &gpio0 31 0> /* D20/A2 */ + , <21 0 &gpio0 30 0> /* D21/A3 */ + ; + }; + + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 2 0> /* D18/A0 */ + , <1 0 &gpio0 29 0> /* D19/A1 */ + , <2 0 &gpio0 31 0> /* D20/A2 */ + , <3 0 &gpio0 30 0> /* D21/A3 */ + , <6 0 &gpio0 20 0> /* D4/A6 */ + , <7 0 &gpio0 24 0> /* D6/A7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + ; + }; +}; + + +pro_micro_d: &pro_micro {}; +pro_micro_i2c: &i2c0 {}; +pro_micro_spi: &spi0 {}; +pro_micro_serial: &uart0 {}; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts new file mode 100644 index 00000000..7f833ff5 --- /dev/null +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; +#include +#include "arduino_pro_micro_pins_52833.dtsi" + +/ { + model = "nrfmicro"; + compatible = "joric,nrfmicro"; + + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; +}; + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&i2c0 { + compatible = "nordic,nrf-twi"; + sda-pin = <15>; + scl-pin = <17>; +}; + +&uart0 { + compatible = "nordic,nrf-uarte"; + tx-pin = <6>; + rx-pin = <8>; +}; + +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x00046000>; + }; + + /* + * The flash starting at 0x0006c000 and ending at + * 0x00073fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@6c000 { + label = "storage"; + reg = <0x0006c000 0x00008000>; + }; + + boot_partition: partition@74000 { + label = "adafruit_boot"; + reg = <0x00074000 0x0000c000>; + }; + }; +}; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833.yaml b/app/boards/arm/nrfmicro/nrfmicro_13_52833.yaml new file mode 100644 index 00000000..768a59c9 --- /dev/null +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833.yaml @@ -0,0 +1,15 @@ +identifier: nrfmicro_13_52833 +name: nrfmicro_13_52833 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833.zmk.yml b/app/boards/arm/nrfmicro/nrfmicro_13_52833.zmk.yml new file mode 100644 index 00000000..757ff860 --- /dev/null +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: nrfmicro_13_52833 +name: nRFMicro 1.3/1.4 (nRF52833) +type: board +arch: arm +outputs: + - usb + - ble +url: https://github.com/joric/nrfmicro/ +exposes: [pro_micro] diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig b/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig new file mode 100644 index 00000000..112e0344 --- /dev/null +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52833_QIAA=y +CONFIG_BOARD_NRFMICRO_13_52833=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y + +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y +CONFIG_CLOCK_CONTROL_NRF=y +CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y diff --git a/app/boards/arm/nrfmicro/pinmux.c b/app/boards/arm/nrfmicro/pinmux.c index dc3bf6c2..ef5b5521 100644 --- a/app/boards/arm/nrfmicro/pinmux.c +++ b/app/boards/arm/nrfmicro/pinmux.c @@ -14,7 +14,7 @@ static int pinmux_nrfmicro_init(const struct device *port) { ARG_UNUSED(port); -#if CONFIG_BOARD_NRFMICRO_13 +#if (CONFIG_BOARD_NRFMICRO_13 || CONFIG_BOARD_NRFMICRO_13_52833) const struct device *p0 = device_get_binding("GPIO_0"); #if CONFIG_BOARD_NRFMICRO_CHARGER gpio_pin_configure(p0, 5, GPIO_OUTPUT); From fd5e9e1403de15d896620ec23f5ef558118f53a2 Mon Sep 17 00:00:00 2001 From: Joe Peterson Date: Sat, 1 Oct 2022 14:36:52 -0700 Subject: [PATCH 082/289] docs(codes): Windows Support: F13-F19 F13-F19 are confirmed to work on Windows 11 in VSCode 1.71.2. Refs: #1476 --- docs/src/data/hid.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/src/data/hid.js b/docs/src/data/hid.js index ac90ea80..2b651ac5 100644 --- a/docs/src/data/hid.js +++ b/docs/src/data/hid.js @@ -2732,7 +2732,7 @@ export default [ ], documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86", os: { - windows: null, + windows: true, linux: true, android: false, macos: true, @@ -2753,7 +2753,7 @@ export default [ ], documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86", os: { - windows: null, + windows: true, linux: true, android: false, macos: true, @@ -2774,7 +2774,7 @@ export default [ ], documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86", os: { - windows: null, + windows: true, linux: true, android: false, macos: true, @@ -2795,7 +2795,7 @@ export default [ ], documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86", os: { - windows: null, + windows: true, linux: true, android: false, macos: true, @@ -2816,7 +2816,7 @@ export default [ ], documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86", os: { - windows: null, + windows: true, linux: true, android: false, macos: true, @@ -2837,7 +2837,7 @@ export default [ ], documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86", os: { - windows: null, + windows: true, linux: true, android: false, macos: true, @@ -2858,7 +2858,7 @@ export default [ ], documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86", os: { - windows: null, + windows: true, linux: true, android: false, macos: true, From a035fe4cc8c62b0483b1775cb9968b650e2c12dc Mon Sep 17 00:00:00 2001 From: Joe Peterson Date: Sat, 1 Oct 2022 22:50:34 -0700 Subject: [PATCH 083/289] docs(codes): Windows Support: F20-F24 F20-24 are confirmed to work on Windows 11 via a web based keyboard tester Refs: #1476 --- docs/src/data/hid.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/src/data/hid.js b/docs/src/data/hid.js index 2b651ac5..dde8bae4 100644 --- a/docs/src/data/hid.js +++ b/docs/src/data/hid.js @@ -2879,7 +2879,7 @@ export default [ ], documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86", os: { - windows: null, + windows: true, linux: true, android: false, macos: true, @@ -2900,7 +2900,7 @@ export default [ ], documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86", os: { - windows: null, + windows: true, linux: true, android: false, macos: true, @@ -2921,7 +2921,7 @@ export default [ ], documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86", os: { - windows: null, + windows: true, linux: true, android: false, macos: true, @@ -2942,7 +2942,7 @@ export default [ ], documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86", os: { - windows: null, + windows: true, linux: true, android: false, macos: true, @@ -2963,7 +2963,7 @@ export default [ ], documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=86", os: { - windows: null, + windows: true, linux: true, android: false, macos: true, From 605d88f26609aa7cb5d92c590ee7f2313d768cfe Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 4 Oct 2022 23:37:45 -0400 Subject: [PATCH 084/289] feat(ble): Default a few configs for DIS GATT svc. Default values for DIS GATT characteristics for: * Vendor ID * Product ID * Manufacturer * Model --- app/Kconfig | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/Kconfig b/app/Kconfig index f89d3279..9902046d 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -25,6 +25,18 @@ config USB_DEVICE_PID config USB_DEVICE_MANUFACTURER default "ZMK Project" +config BT_DIS_PNP_VID + default 0x1D50 + +config BT_DIS_PNP_PID + default 0x615E + +config BT_DIS_MODEL + default ZMK_KEYBOARD_NAME + +config BT_DIS_MANUF + default "ZMK Project" + menu "HID" choice ZMK_HID_REPORT_TYPE From bdc706f88d54697c01d26c5aef270339495931b9 Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Fri, 7 Oct 2022 19:43:12 -0500 Subject: [PATCH 085/289] docs(power profiling): add nice!view --- docs/src/data/power.js | 6 ++++++ docs/src/pages/power-profiler.js | 1 + 2 files changed, 7 insertions(+) diff --git a/docs/src/data/power.js b/docs/src/data/power.js index 28e4b0ed..354f0511 100644 --- a/docs/src/data/power.js +++ b/docs/src/data/power.js @@ -96,4 +96,10 @@ export const displayPower = { active: 10000, // Estimated power draw when about half the pixels are on sleep: 7, // Deep sleep power draw (display off) }, + // Based on the nice!view using Sharp's LS011B7DH01 + NICEVIEW: { + activePercent: 0.01, // Estimated two refreshes per second taking five milliseconds each + active: 1425, // Power draw during refresh (225uA display + 1200uA SPIM) + sleep: 1, // Idle power draw of the display + }, }; diff --git a/docs/src/pages/power-profiler.js b/docs/src/pages/power-profiler.js index c2302570..c909ec02 100644 --- a/docs/src/pages/power-profiler.js +++ b/docs/src/pages/power-profiler.js @@ -308,6 +308,7 @@ function PowerProfiler() { + )} From 18b8b9b3a57226ef84064b1382d846c634dcfd2e Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Fri, 14 Oct 2022 11:39:47 -0500 Subject: [PATCH 086/289] fix(shields): Disable idle blanking on nice!view --- app/boards/shields/nice_view/nice_view.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/app/boards/shields/nice_view/nice_view.conf b/app/boards/shields/nice_view/nice_view.conf index 368e848a..2c1d6c71 100644 --- a/app/boards/shields/nice_view/nice_view.conf +++ b/app/boards/shields/nice_view/nice_view.conf @@ -2,3 +2,4 @@ CONFIG_ZMK_DISPLAY=y CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_26=y CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y +CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE=n From ef2e6e9156806760d9e91c0d635cd809058c3ee7 Mon Sep 17 00:00:00 2001 From: Robert U <978080+urob@users.noreply.github.com> Date: Fri, 14 Oct 2022 21:40:28 -0400 Subject: [PATCH 087/289] feat(behaviors): Add mod-morph `keep-mods` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update docs for mod-morph * Add unit tests for mod-morph * Add keep-mods to DT binding Co-authored-by: Martin Aumüller Co-authored-by: Cem Aksoylar --- .../behaviors/zmk,behavior-mod-morph.yaml | 3 ++ app/include/zmk/hid.h | 2 + app/src/behaviors/behavior_mod_morph.c | 9 +++- app/src/hid.c | 24 ++++++++-- .../mod-morph/1-no-morph/events.patterns | 8 ++++ .../1-no-morph/keycode_events.snapshot | 5 ++ .../1-no-morph/native_posix_64.keymap | 11 +++++ .../mod-morph/2a-masked-morph/events.patterns | 8 ++++ .../2a-masked-morph/keycode_events.snapshot | 12 +++++ .../2a-masked-morph/native_posix_64.keymap | 13 +++++ .../events.patterns | 8 ++++ .../keycode_events.snapshot | 12 +++++ .../native_posix_64.keymap | 37 +++++++++++++++ .../events.patterns | 8 ++++ .../keycode_events.snapshot | 18 +++++++ .../native_posix_64.keymap | 15 ++++++ .../events.patterns | 8 ++++ .../keycode_events.snapshot | 12 +++++ .../native_posix_64.keymap | 45 ++++++++++++++++++ .../events.patterns | 8 ++++ .../keycode_events.snapshot | 12 +++++ .../native_posix_64.keymap | 47 +++++++++++++++++++ .../3-unmasked-morph/events.patterns | 8 ++++ .../3-unmasked-morph/keycode_events.snapshot | 12 +++++ .../3-unmasked-morph/native_posix_64.keymap | 37 +++++++++++++++ app/tests/mod-morph/behavior_keymap.dtsi | 23 +++++++++ .../keycode_events.snapshot | 2 +- docs/docs/behaviors/mod-morph.md | 29 +++++++++--- 28 files changed, 425 insertions(+), 11 deletions(-) create mode 100644 app/tests/mod-morph/1-no-morph/events.patterns create mode 100644 app/tests/mod-morph/1-no-morph/keycode_events.snapshot create mode 100644 app/tests/mod-morph/1-no-morph/native_posix_64.keymap create mode 100644 app/tests/mod-morph/2a-masked-morph/events.patterns create mode 100644 app/tests/mod-morph/2a-masked-morph/keycode_events.snapshot create mode 100644 app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap create mode 100644 app/tests/mod-morph/2b-masked-morph-implicit-overwrite/events.patterns create mode 100644 app/tests/mod-morph/2b-masked-morph-implicit-overwrite/keycode_events.snapshot create mode 100644 app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap create mode 100644 app/tests/mod-morph/2c-masked-morph-and-explicit-mods/events.patterns create mode 100644 app/tests/mod-morph/2c-masked-morph-and-explicit-mods/keycode_events.snapshot create mode 100644 app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap create mode 100644 app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/events.patterns create mode 100644 app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/keycode_events.snapshot create mode 100644 app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap create mode 100644 app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/events.patterns create mode 100644 app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/keycode_events.snapshot create mode 100644 app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap create mode 100644 app/tests/mod-morph/3-unmasked-morph/events.patterns create mode 100644 app/tests/mod-morph/3-unmasked-morph/keycode_events.snapshot create mode 100644 app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap create mode 100644 app/tests/mod-morph/behavior_keymap.dtsi diff --git a/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml b/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml index ed40f936..20235d04 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml @@ -14,3 +14,6 @@ properties: mods: type: int required: true + keep-mods: + type: int + required: false diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index 902b76d1..0f9cfe2e 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -135,6 +135,8 @@ int zmk_hid_register_mods(zmk_mod_flags_t explicit_modifiers); int zmk_hid_unregister_mods(zmk_mod_flags_t explicit_modifiers); int zmk_hid_implicit_modifiers_press(zmk_mod_flags_t implicit_modifiers); int zmk_hid_implicit_modifiers_release(); +int zmk_hid_masked_modifiers_set(zmk_mod_flags_t masked_modifiers); +int zmk_hid_masked_modifiers_clear(); int zmk_hid_keyboard_press(zmk_key_t key); int zmk_hid_keyboard_release(zmk_key_t key); diff --git a/app/src/behaviors/behavior_mod_morph.c b/app/src/behaviors/behavior_mod_morph.c index a40bd365..effbe4ac 100644 --- a/app/src/behaviors/behavior_mod_morph.c +++ b/app/src/behaviors/behavior_mod_morph.c @@ -27,6 +27,7 @@ struct behavior_mod_morph_config { struct zmk_behavior_binding normal_binding; struct zmk_behavior_binding morph_binding; zmk_mod_flags_t mods; + zmk_mod_flags_t masked_mods; }; struct behavior_mod_morph_data { @@ -45,6 +46,7 @@ static int on_mod_morph_binding_pressed(struct zmk_behavior_binding *binding, } if (zmk_hid_get_explicit_mods() & cfg->mods) { + zmk_hid_masked_modifiers_set(cfg->masked_mods); data->pressed_binding = (struct zmk_behavior_binding *)&cfg->morph_binding; } else { data->pressed_binding = (struct zmk_behavior_binding *)&cfg->normal_binding; @@ -64,7 +66,10 @@ static int on_mod_morph_binding_released(struct zmk_behavior_binding *binding, struct zmk_behavior_binding *pressed_binding = data->pressed_binding; data->pressed_binding = NULL; - return behavior_keymap_binding_released(pressed_binding, event); + int err; + err = behavior_keymap_binding_released(pressed_binding, event); + zmk_hid_masked_modifiers_clear(); + return err; } static const struct behavior_driver_api behavior_mod_morph_driver_api = { @@ -88,6 +93,8 @@ static int behavior_mod_morph_init(const struct device *dev) { return 0; } .normal_binding = _TRANSFORM_ENTRY(0, n), \ .morph_binding = _TRANSFORM_ENTRY(1, n), \ .mods = DT_INST_PROP(n, mods), \ + .masked_mods = COND_CODE_0(DT_INST_NODE_HAS_PROP(n, keep_mods), (DT_INST_PROP(n, mods)), \ + (DT_INST_PROP(n, mods) & ~DT_INST_PROP(n, keep_mods))), \ }; \ static struct behavior_mod_morph_data behavior_mod_morph_data_##n = {}; \ DEVICE_DT_INST_DEFINE(n, behavior_mod_morph_init, NULL, &behavior_mod_morph_data_##n, \ diff --git a/app/src/hid.c b/app/src/hid.c index c3462dde..b66a910d 100644 --- a/app/src/hid.c +++ b/app/src/hid.c @@ -20,10 +20,12 @@ static struct zmk_hid_consumer_report consumer_report = {.report_id = 2, .body = // Only release the modifier if the count is 0. static int explicit_modifier_counts[8] = {0, 0, 0, 0, 0, 0, 0, 0}; static zmk_mod_flags_t explicit_modifiers = 0; +static zmk_mod_flags_t implicit_modifiers = 0; +static zmk_mod_flags_t masked_modifiers = 0; #define SET_MODIFIERS(mods) \ { \ - keyboard_report.body.modifiers = mods; \ + keyboard_report.body.modifiers = (mods & ~masked_modifiers) | implicit_modifiers; \ LOG_DBG("Modifiers set to 0x%02X", keyboard_report.body.modifiers); \ } @@ -158,13 +160,29 @@ static inline int check_keyboard_usage(zmk_key_t usage) { } \ } -int zmk_hid_implicit_modifiers_press(zmk_mod_flags_t implicit_modifiers) { +int zmk_hid_implicit_modifiers_press(zmk_mod_flags_t new_implicit_modifiers) { + implicit_modifiers = new_implicit_modifiers; zmk_mod_flags_t current = GET_MODIFIERS; - SET_MODIFIERS(explicit_modifiers | implicit_modifiers); + SET_MODIFIERS(explicit_modifiers); return current == GET_MODIFIERS ? 0 : 1; } int zmk_hid_implicit_modifiers_release() { + implicit_modifiers = 0; + zmk_mod_flags_t current = GET_MODIFIERS; + SET_MODIFIERS(explicit_modifiers); + return current == GET_MODIFIERS ? 0 : 1; +} + +int zmk_hid_masked_modifiers_set(zmk_mod_flags_t new_masked_modifiers) { + masked_modifiers = new_masked_modifiers; + zmk_mod_flags_t current = GET_MODIFIERS; + SET_MODIFIERS(explicit_modifiers); + return current == GET_MODIFIERS ? 0 : 1; +} + +int zmk_hid_masked_modifiers_clear() { + masked_modifiers = 0; zmk_mod_flags_t current = GET_MODIFIERS; SET_MODIFIERS(explicit_modifiers); return current == GET_MODIFIERS ? 0 : 1; diff --git a/app/tests/mod-morph/1-no-morph/events.patterns b/app/tests/mod-morph/1-no-morph/events.patterns new file mode 100644 index 00000000..f1a41fcf --- /dev/null +++ b/app/tests/mod-morph/1-no-morph/events.patterns @@ -0,0 +1,8 @@ +s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p +s/.*hid_listener_keycode_released.*keycode/released: keycode/p +s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p +s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p +s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p +s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p +s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p +s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p diff --git a/app/tests/mod-morph/1-no-morph/keycode_events.snapshot b/app/tests/mod-morph/1-no-morph/keycode_events.snapshot new file mode 100644 index 00000000..3a2d70fe --- /dev/null +++ b/app/tests/mod-morph/1-no-morph/keycode_events.snapshot @@ -0,0 +1,5 @@ +pressed: keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +reg implicit: Modifiers set to 0x00 +released: keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +unreg implicit: Modifiers set to 0x00 +unmask mods: Modifiers set to 0x00 diff --git a/app/tests/mod-morph/1-no-morph/native_posix_64.keymap b/app/tests/mod-morph/1-no-morph/native_posix_64.keymap new file mode 100644 index 00000000..fb939de5 --- /dev/null +++ b/app/tests/mod-morph/1-no-morph/native_posix_64.keymap @@ -0,0 +1,11 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; +}; diff --git a/app/tests/mod-morph/2a-masked-morph/events.patterns b/app/tests/mod-morph/2a-masked-morph/events.patterns new file mode 100644 index 00000000..f1a41fcf --- /dev/null +++ b/app/tests/mod-morph/2a-masked-morph/events.patterns @@ -0,0 +1,8 @@ +s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p +s/.*hid_listener_keycode_released.*keycode/released: keycode/p +s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p +s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p +s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p +s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p +s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p +s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p diff --git a/app/tests/mod-morph/2a-masked-morph/keycode_events.snapshot b/app/tests/mod-morph/2a-masked-morph/keycode_events.snapshot new file mode 100644 index 00000000..dcf2aae6 --- /dev/null +++ b/app/tests/mod-morph/2a-masked-morph/keycode_events.snapshot @@ -0,0 +1,12 @@ +pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +reg explicit: Modifiers set to 0x02 +reg implicit: Modifiers set to 0x02 +mask mods: Modifiers set to 0x00 +pressed: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +reg implicit: Modifiers set to 0x00 +released: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +unreg implicit: Modifiers set to 0x00 +unmask mods: Modifiers set to 0x02 +released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +unreg explicit: Modifiers set to 0x00 +unreg implicit: Modifiers set to 0x00 diff --git a/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap b/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap new file mode 100644 index 00000000..9ad50202 --- /dev/null +++ b/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap @@ -0,0 +1,13 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; +}; diff --git a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/events.patterns b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/events.patterns new file mode 100644 index 00000000..f1a41fcf --- /dev/null +++ b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/events.patterns @@ -0,0 +1,8 @@ +s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p +s/.*hid_listener_keycode_released.*keycode/released: keycode/p +s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p +s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p +s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p +s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p +s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p +s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p diff --git a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/keycode_events.snapshot b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/keycode_events.snapshot new file mode 100644 index 00000000..ce85f25d --- /dev/null +++ b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/keycode_events.snapshot @@ -0,0 +1,12 @@ +pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +reg explicit: Modifiers set to 0x02 +reg implicit: Modifiers set to 0x02 +mask mods: Modifiers set to 0x00 +pressed: keycode 0x05 implicit_mods 0x02 explicit_mods 0x00 +reg implicit: Modifiers set to 0x02 +released: keycode 0x05 implicit_mods 0x02 explicit_mods 0x00 +unreg implicit: Modifiers set to 0x00 +unmask mods: Modifiers set to 0x02 +released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +unreg explicit: Modifiers set to 0x00 +unreg implicit: Modifiers set to 0x00 diff --git a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap new file mode 100644 index 00000000..74de8588 --- /dev/null +++ b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap @@ -0,0 +1,37 @@ +#include +#include +#include + +/ { + behaviors { + mod_morph: mod_morph { + compatible = "zmk,behavior-mod-morph"; + label = "MOD_MORPH_TEST"; + #binding-cells = <0>; + bindings = <&kp A>, <&kp LS(B)>; // implict mod overwrite + mods = <(MOD_LSFT|MOD_RSFT)>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kp LEFT_ALT &mod_morph + &kp LEFT_SHIFT &kp RIGHT_SHIFT + >; + }; + }; +}; + +&kscan { + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; +}; + diff --git a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/events.patterns b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/events.patterns new file mode 100644 index 00000000..f1a41fcf --- /dev/null +++ b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/events.patterns @@ -0,0 +1,8 @@ +s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p +s/.*hid_listener_keycode_released.*keycode/released: keycode/p +s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p +s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p +s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p +s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p +s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p +s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p diff --git a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/keycode_events.snapshot b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/keycode_events.snapshot new file mode 100644 index 00000000..561f88a9 --- /dev/null +++ b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/keycode_events.snapshot @@ -0,0 +1,18 @@ +pressed: keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 +reg explicit: Modifiers set to 0x04 +reg implicit: Modifiers set to 0x04 +pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +reg explicit: Modifiers set to 0x06 +reg implicit: Modifiers set to 0x06 +mask mods: Modifiers set to 0x04 +pressed: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +reg implicit: Modifiers set to 0x04 +released: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +unreg implicit: Modifiers set to 0x04 +unmask mods: Modifiers set to 0x06 +released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +unreg explicit: Modifiers set to 0x04 +unreg implicit: Modifiers set to 0x04 +released: keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 +unreg explicit: Modifiers set to 0x00 +unreg implicit: Modifiers set to 0x00 diff --git a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap new file mode 100644 index 00000000..d5406e19 --- /dev/null +++ b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap @@ -0,0 +1,15 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/events.patterns b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/events.patterns new file mode 100644 index 00000000..f1a41fcf --- /dev/null +++ b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/events.patterns @@ -0,0 +1,8 @@ +s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p +s/.*hid_listener_keycode_released.*keycode/released: keycode/p +s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p +s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p +s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p +s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p +s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p +s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p diff --git a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/keycode_events.snapshot b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/keycode_events.snapshot new file mode 100644 index 00000000..dcf2aae6 --- /dev/null +++ b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/keycode_events.snapshot @@ -0,0 +1,12 @@ +pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +reg explicit: Modifiers set to 0x02 +reg implicit: Modifiers set to 0x02 +mask mods: Modifiers set to 0x00 +pressed: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +reg implicit: Modifiers set to 0x00 +released: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +unreg implicit: Modifiers set to 0x00 +unmask mods: Modifiers set to 0x02 +released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +unreg explicit: Modifiers set to 0x00 +unreg implicit: Modifiers set to 0x00 diff --git a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap new file mode 100644 index 00000000..7071e8cd --- /dev/null +++ b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap @@ -0,0 +1,45 @@ +#include +#include +#include + +&kscan { + events = < + /* Shift + tap &mod_morph --> expect B (but get Shift + B) */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; + +/ { + behaviors { + mod_morph: mod_morph { + compatible = "zmk,behavior-mod-morph"; + label = "MOD_MORPH_TEST"; + #binding-cells = <0>; + bindings = <&kp A>, << 1 B>; + mods = <(MOD_LSFT|MOD_RSFT)>; + }; + + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kp LEFT_SHIFT &mod_morph + &kp C &none + >; + }; + + second_layer { + bindings = < + &trans &trans + &kp D &trans + >; + }; + }; +}; diff --git a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/events.patterns b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/events.patterns new file mode 100644 index 00000000..f1a41fcf --- /dev/null +++ b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/events.patterns @@ -0,0 +1,8 @@ +s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p +s/.*hid_listener_keycode_released.*keycode/released: keycode/p +s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p +s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p +s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p +s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p +s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p +s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p diff --git a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/keycode_events.snapshot b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/keycode_events.snapshot new file mode 100644 index 00000000..ba70ee98 --- /dev/null +++ b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/keycode_events.snapshot @@ -0,0 +1,12 @@ +pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +reg explicit: Modifiers set to 0x02 +reg implicit: Modifiers set to 0x02 +mask mods: Modifiers set to 0x00 +pressed: keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +reg implicit: Modifiers set to 0x00 +released: keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +unreg implicit: Modifiers set to 0x00 +unmask mods: Modifiers set to 0x02 +released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +unreg explicit: Modifiers set to 0x00 +unreg implicit: Modifiers set to 0x00 diff --git a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap new file mode 100644 index 00000000..96c2f270 --- /dev/null +++ b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap @@ -0,0 +1,47 @@ +#include +#include +#include + +&kscan { + events = < + /* Shift + hold &mod_morph --> expect and get D (no shift) */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,200) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; + +/ { + behaviors { + mod_morph: mod_morph { + compatible = "zmk,behavior-mod-morph"; + label = "MOD_MORPH_TEST"; + #binding-cells = <0>; + bindings = <&kp A>, << 1 B>; + mods = <(MOD_LSFT|MOD_RSFT)>; + }; + + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kp LEFT_SHIFT &mod_morph + &kp C &none + >; + }; + + second_layer { + bindings = < + &trans &trans + &kp D &trans + >; + }; + }; +}; diff --git a/app/tests/mod-morph/3-unmasked-morph/events.patterns b/app/tests/mod-morph/3-unmasked-morph/events.patterns new file mode 100644 index 00000000..f1a41fcf --- /dev/null +++ b/app/tests/mod-morph/3-unmasked-morph/events.patterns @@ -0,0 +1,8 @@ +s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p +s/.*hid_listener_keycode_released.*keycode/released: keycode/p +s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p +s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p +s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p +s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p +s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p +s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p diff --git a/app/tests/mod-morph/3-unmasked-morph/keycode_events.snapshot b/app/tests/mod-morph/3-unmasked-morph/keycode_events.snapshot new file mode 100644 index 00000000..424242d5 --- /dev/null +++ b/app/tests/mod-morph/3-unmasked-morph/keycode_events.snapshot @@ -0,0 +1,12 @@ +pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +reg explicit: Modifiers set to 0x02 +reg implicit: Modifiers set to 0x02 +mask mods: Modifiers set to 0x02 +pressed: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +reg implicit: Modifiers set to 0x02 +released: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +unreg implicit: Modifiers set to 0x02 +unmask mods: Modifiers set to 0x02 +released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +unreg explicit: Modifiers set to 0x00 +unreg implicit: Modifiers set to 0x00 diff --git a/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap b/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap new file mode 100644 index 00000000..a82d3ea7 --- /dev/null +++ b/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap @@ -0,0 +1,37 @@ +#include +#include +#include + +/ { + behaviors { + mod_morph: mod_morph { + compatible = "zmk,behavior-mod-morph"; + label = "MOD_MORPH_TEST"; + #binding-cells = <0>; + bindings = <&kp A>, <&kp B>; + mods = <(MOD_LSFT|MOD_RSFT)>; + keep-mods = <(MOD_LSFT|MOD_RSFT)>; // no masking + }; + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kp LEFT_ALT &mod_morph + &kp LEFT_SHIFT &kp RIGHT_SHIFT + >; + }; + }; +}; + +&kscan { + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; +}; diff --git a/app/tests/mod-morph/behavior_keymap.dtsi b/app/tests/mod-morph/behavior_keymap.dtsi new file mode 100644 index 00000000..09720d8d --- /dev/null +++ b/app/tests/mod-morph/behavior_keymap.dtsi @@ -0,0 +1,23 @@ +/ { + behaviors { + mod_morph: mod_morph { + compatible = "zmk,behavior-mod-morph"; + label = "MOD_MORPH_TEST"; + #binding-cells = <0>; + bindings = <&kp A>, <&kp B>; + mods = <(MOD_LSFT|MOD_RSFT)>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kp LEFT_ALT &mod_morph + &kp LEFT_SHIFT &kp RIGHT_SHIFT + >; + }; + }; +}; diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot index 43edb961..45719679 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot @@ -7,7 +7,7 @@ mods: Modifiers set to 0x03 released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 unreg: Modifier 0 count: 0 unreg: Modifier 0 released -unreg: Modifiers set to 0x00 +unreg: Modifiers set to 0x02 mods: Modifiers set to 0x00 released: usage_page 0x07 keycode 0x05 implicit_mods 0x02 explicit_mods 0x00 mods: Modifiers set to 0x00 diff --git a/docs/docs/behaviors/mod-morph.md b/docs/docs/behaviors/mod-morph.md index 2606aaf8..33d18e33 100644 --- a/docs/docs/behaviors/mod-morph.md +++ b/docs/docs/behaviors/mod-morph.md @@ -14,8 +14,6 @@ The Mod-Morph behavior sends a different keypress, depending on whether a specif The Mod-Morph behavior acts as one of two keycodes, depending on if the required modifier is being held during the keypress. -When the modifier is being held it is sent along with the morphed keycode. This can cause problems when the morphed keycode and modifier have an existing relationship (such as `shift-delete` or `ctrl-v` on many operating systems). - ### Configuration An example of how to implement the mod-morph "Grave Escape": @@ -31,10 +29,6 @@ An example of how to implement the mod-morph "Grave Escape": mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; }; }; - - keymap { - ... - }; }; ``` @@ -71,3 +65,26 @@ Example: ``` mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; ``` + +### Advanced configuration + +`keep-mods` + +When a modifier specified in `mods` is being held, it won't be sent along with the morphed keycode unless it is also specified in `keep-mods`. By default `keep-mods` equals `0`, which means no modifier specified in `mods` will be sent along with the morphed keycode. + +For example, the following configuration morphs `LEFT_SHIFT` + `BACKSPACE` into `DELETE`, and morphs `RIGHT_SHIFT` + `BACKSPACE` into `RIGHT_SHIFT` + `DELETE`. + +``` +/ { + behaviors { + bspc_del: backspace_delete { + compatible = "zmk,behavior-mod-morph"; + label = "BACKSPACE_DELETE"; + #binding-cells = <0>; + bindings = <&kp BACKSPACE>, <&kp DELETE>; + mods = <(MOD_LSFT|MOD_RSFT)>; + keep-mods = <(MOD_RSFT)>; + }; + }; +}; +``` From 3f00f14e36d3fda905d7b7be0ecadce23d5c9b97 Mon Sep 17 00:00:00 2001 From: "byran.tech" <61983584+Hello9999901@users.noreply.github.com> Date: Sat, 15 Oct 2022 15:00:09 -0400 Subject: [PATCH 088/289] feat(docs): Added a Spelling Error Caution Notice --- docs/docs/codes/index.mdx | 2 ++ docs/src/components/codes/SpellingCaution.jsx | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 docs/src/components/codes/SpellingCaution.jsx diff --git a/docs/docs/codes/index.mdx b/docs/docs/codes/index.mdx index 6a2fbdc8..a701b4ce 100644 --- a/docs/docs/codes/index.mdx +++ b/docs/docs/codes/index.mdx @@ -5,6 +5,7 @@ hide_title: true slug: ./ --- +import SpellingCaution from "@site/src/components/codes/SpellingCaution"; import OsLegend from "@site/src/components/codes/OsLegend"; import ToastyContainer from "@site/src/components/codes/ToastyContainer"; import Key, { toc as keyToc } from "./_keyboard-keypad.mdx"; @@ -23,6 +24,7 @@ export const toc = [ ...powerToc, ]; + diff --git a/docs/src/components/codes/SpellingCaution.jsx b/docs/src/components/codes/SpellingCaution.jsx new file mode 100644 index 00000000..15ba9488 --- /dev/null +++ b/docs/src/components/codes/SpellingCaution.jsx @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: CC-BY-NC-SA-4.0 + */ + +import React from "react"; +import Admonition from "@theme/Admonition"; + +export default function SpellingCaution() { + return ( + +

+ Take extra notice of the spelling of the keycodes, especially the + shorthand spelling. Otherwise, it will result in an elusive parsing + error! +

+ + ); +} + +SpellingCaution.propTypes = {}; From c9eb63199a2853af2395162ee574f2ed167f0aa0 Mon Sep 17 00:00:00 2001 From: ebastler Date: Tue, 18 Oct 2022 03:48:19 +0200 Subject: [PATCH 089/289] feat(keymaps): add NUHS/NUBS alias for Non-US-Backslash/Non-US-Hash --- app/include/dt-bindings/zmk/keys.h | 2 ++ docs/src/data/hid.js | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/include/dt-bindings/zmk/keys.h b/app/include/dt-bindings/zmk/keys.h index d144ebb3..3e67c402 100644 --- a/app/include/dt-bindings/zmk/keys.h +++ b/app/include/dt-bindings/zmk/keys.h @@ -263,6 +263,7 @@ /* Keyboard Non-US # and ~ (Non-US Hash/Number and Tilde) */ #define NON_US_HASH (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_HASH_AND_TILDE)) +#define NUHS (NON_US_HASH) /* Keyboard ~ (Tilde) */ #define TILDE2 (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_HASH_AND_TILDE))) @@ -499,6 +500,7 @@ #define NON_US_BACKSLASH \ (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_BACKSLASH_AND_PIPE)) #define NON_US_BSLH (NON_US_BACKSLASH) +#define NUBS (NON_US_BACKSLASH) /* Keyboard Pipe */ #define PIPE2 (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_BACKSLASH_AND_PIPE))) diff --git a/docs/src/data/hid.js b/docs/src/data/hid.js index dde8bae4..00d48f3f 100644 --- a/docs/src/data/hid.js +++ b/docs/src/data/hid.js @@ -1356,7 +1356,7 @@ export default [ footnotes: {}, }, { - names: ["NON_US_HASH"], + names: ["NON_US_HASH", "NUHS"], description: "Non-US # [Hash/Pound] and ~ [Tilde]", context: "Keyboard", clarify: false, @@ -2606,7 +2606,7 @@ export default [ footnotes: {}, }, { - names: ["NON_US_BACKSLASH", "NON_US_BSLH"], + names: ["NON_US_BACKSLASH", "NON_US_BSLH", "NUBS"], description: "Non-US \\ [Backslash] and | [Pipe]", context: "Keyboard", clarify: false, From d3d5b8eb8a070bab19a0d053bcd94902b447df34 Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Fri, 21 Oct 2022 22:10:55 -0500 Subject: [PATCH 090/289] fix(displays): Adjust alignment and spacing * Adjust alignment and spacing * Fix char array lengths --- app/src/display/status_screen.c | 2 +- app/src/display/widgets/battery_status.c | 5 +++-- app/src/display/widgets/layer_status.c | 8 ++++---- app/src/display/widgets/output_status.c | 16 ++++++++-------- app/src/display/widgets/wpm_status.c | 3 ++- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/app/src/display/status_screen.c b/app/src/display/status_screen.c index 6ace1925..0fe7212d 100644 --- a/app/src/display/status_screen.c +++ b/app/src/display/status_screen.c @@ -68,7 +68,7 @@ lv_obj_t *zmk_display_status_screen() { #if IS_ENABLED(CONFIG_ZMK_WIDGET_WPM_STATUS) zmk_widget_wpm_status_init(&wpm_status_widget, screen); - lv_obj_align(zmk_widget_wpm_status_obj(&wpm_status_widget), NULL, LV_ALIGN_IN_BOTTOM_RIGHT, -12, + lv_obj_align(zmk_widget_wpm_status_obj(&wpm_status_widget), NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); #endif return screen; diff --git a/app/src/display/widgets/battery_status.c b/app/src/display/widgets/battery_status.c index 3dfcdb47..9179b0d0 100644 --- a/app/src/display/widgets/battery_status.c +++ b/app/src/display/widgets/battery_status.c @@ -27,13 +27,13 @@ struct battery_status_state { }; static void set_battery_symbol(lv_obj_t *label, struct battery_status_state state) { - char text[2] = " "; + char text[8] = {}; uint8_t level = state.level; #if IS_ENABLED(CONFIG_USB_DEVICE_STACK) if (state.usb_present) { - strcpy(text, LV_SYMBOL_CHARGE); + strcpy(text, LV_SYMBOL_CHARGE " "); } #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ @@ -49,6 +49,7 @@ static void set_battery_symbol(lv_obj_t *label, struct battery_status_state stat strcat(text, LV_SYMBOL_BATTERY_EMPTY); } lv_label_set_text(label, text); + lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 0); } void battery_status_update_cb(struct battery_status_state state) { diff --git a/app/src/display/widgets/layer_status.c b/app/src/display/widgets/layer_status.c index 32bdb828..a4a7be58 100644 --- a/app/src/display/widgets/layer_status.c +++ b/app/src/display/widgets/layer_status.c @@ -24,15 +24,15 @@ struct layer_status_state { static void set_layer_symbol(lv_obj_t *label, struct layer_status_state state) { if (state.label == NULL) { - char text[6] = {}; + char text[7] = {}; - sprintf(text, LV_SYMBOL_KEYBOARD "%i", state.index); + sprintf(text, LV_SYMBOL_KEYBOARD " %i", state.index); lv_label_set_text(label, text); } else { - char text[12] = {}; + char text[13] = {}; - snprintf(text, 12, LV_SYMBOL_KEYBOARD "%s", state.label); + snprintf(text, sizeof(text), LV_SYMBOL_KEYBOARD " %s", state.label); lv_label_set_text(label, text); } diff --git a/app/src/display/widgets/output_status.c b/app/src/display/widgets/output_status.c index fe99ac96..8bbe1a7e 100644 --- a/app/src/display/widgets/output_status.c +++ b/app/src/display/widgets/output_status.c @@ -39,24 +39,24 @@ static struct output_status_state get_state(const zmk_event_t *_eh) { } static void set_status_symbol(lv_obj_t *label, struct output_status_state state) { - char text[9] = {}; + char text[10] = {}; switch (state.selected_endpoint) { case ZMK_ENDPOINT_USB: - strcat(text, LV_SYMBOL_USB " "); + strcat(text, LV_SYMBOL_USB); break; case ZMK_ENDPOINT_BLE: if (state.active_profile_bonded) { if (state.active_profile_connected) { - snprintf(text, sizeof(text), LV_SYMBOL_WIFI "%i " LV_SYMBOL_OK, - state.active_profile_index); + snprintf(text, sizeof(text), LV_SYMBOL_WIFI " %i " LV_SYMBOL_OK, + state.active_profile_index + 1); } else { - snprintf(text, sizeof(text), LV_SYMBOL_WIFI "%i " LV_SYMBOL_CLOSE, - state.active_profile_index); + snprintf(text, sizeof(text), LV_SYMBOL_WIFI " %i " LV_SYMBOL_CLOSE, + state.active_profile_index + 1); } } else { - snprintf(text, sizeof(text), LV_SYMBOL_WIFI "%i " LV_SYMBOL_SETTINGS, - state.active_profile_index); + snprintf(text, sizeof(text), LV_SYMBOL_WIFI " %i " LV_SYMBOL_SETTINGS, + state.active_profile_index + 1); } break; } diff --git a/app/src/display/widgets/wpm_status.c b/app/src/display/widgets/wpm_status.c index 7ed047c3..a2c6a287 100644 --- a/app/src/display/widgets/wpm_status.c +++ b/app/src/display/widgets/wpm_status.c @@ -28,9 +28,10 @@ void set_wpm_symbol(lv_obj_t *label, struct wpm_status_state state) { char text[4] = {}; LOG_DBG("WPM changed to %i", state.wpm); - snprintf(text, sizeof(text), "%i ", state.wpm); + snprintf(text, sizeof(text), "%i", state.wpm); lv_label_set_text(label, text); + lv_obj_align(label, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); } void wpm_status_update_cb(struct wpm_status_state state) { From b90e3ae03d9f48a33f7327e9c478aa6fe215d0c6 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Sat, 22 Oct 2022 12:50:44 +0800 Subject: [PATCH 091/289] fix(ci): Replace workflow set-output with environment variables * Needed for deprecation: https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/ --- .github/workflows/build-user-config.yml | 67 +++++++++++-------------- 1 file changed, 30 insertions(+), 37 deletions(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 215ccb63..759dd72a 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -18,8 +18,8 @@ on: default: "bin" required: false type: string - artifact_name: - description: 'Artifact output file name' + archive_name: + description: 'Archive output file name' default: 'firmware' required: false type: string @@ -29,21 +29,18 @@ jobs: runs-on: ubuntu-latest name: Fetch Build Keyboards outputs: - matrix: ${{ steps.set-matrix.outputs.matrix }} + build_matrix: ${{ env.build_matrix }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3.1.0 - name: Install yaml2json run: python3 -m pip install remarshal - name: Fetch Build Matrix - id: set-matrix run: | - set -x - matrix=$(yaml2json ${{ inputs.build_matrix_path }} | jq -c .) - yaml2json ${{ inputs.build_matrix_path }} - echo "::set-output name=matrix::${matrix}" + echo "build_matrix=$(yaml2json ${{ inputs.build_matrix_path }} | jq -c .)" >> $GITHUB_ENV + yaml2json ${{ inputs.build_matrix_path }} | jq build: runs-on: ubuntu-latest @@ -53,35 +50,31 @@ jobs: name: Build strategy: fail-fast: false - matrix: ${{fromJson(needs.matrix.outputs.matrix)}} + matrix: ${{ fromJson(needs.matrix.outputs.build_matrix) }} steps: - name: Prepare variables - id: variables + shell: sh -x {0} run: | - set -x if [ -n "${{ matrix.shield }}" ] then - EXTRA_CMAKE_ARGS="-DSHIELD=\"${{ matrix.shield }}\"" - ARTIFACT_NAME="${{ matrix.shield }}-${{ matrix.board }}-zmk" - DISPLAY_NAME="${{ matrix.shield }} - ${{ matrix.board }}" + echo "extra_cmake_args=-DSHIELD=\"${{ matrix.shield }}\"" >> $GITHUB_ENV + echo "artifact_name=${{ matrix.shield }}-${{ matrix.board }}-zmk" >> $GITHUB_ENV + echo "display_name=${{ matrix.shield }} - ${{ matrix.board }}" >> $GITHUB_ENV else - EXTRA_CMAKE_ARGS= - DISPLAY_NAME="${{ matrix.board }}" - ARTIFACT_NAME="${{ matrix.board }}-zmk" + echo "extra_cmake_args=" >> $GITHUB_ENV + echo "artifact_name=${{ matrix.board }}-zmk" >> $GITHUB_ENV + echo "display_name=${{ matrix.board }}" >> $GITHUB_ENV fi - echo ::set-output name=extra-cmake-args::${EXTRA_CMAKE_ARGS} - echo ::set-output name=artifact-name::${ARTIFACT_NAME} - echo ::set-output name=display-name::${DISPLAY_NAME} - echo ::set-output name=zephyr-version::${ZEPHYR_VERSION} + echo "zephyr_version=${ZEPHYR_VERSION}" >> $GITHUB_ENV - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3.1.0 - name: Cache west modules - uses: actions/cache@v3.0.2 + uses: actions/cache@v3.0.11 continue-on-error: true env: - cache-name: cache-zephyr-${{ steps.variables.outputs.zephyr-version }}-modules + cache_name: cache-zephyr-${{ env.zephyr_version }}-modules with: path: | modules/ @@ -89,9 +82,9 @@ jobs: zephyr/ bootloader/ zmk/ - key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/west.yml', '**/build.yaml') }} + key: ${{ runner.os }}-build-${{ env.cache_name }}-${{ hashFiles('**/west.yml', '**/build.yaml') }} restore-keys: | - ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build-${{ env.cache_name }}- ${{ runner.os }}-build- ${{ runner.os }}- @@ -104,28 +97,28 @@ jobs: - name: West Zephyr export run: west zephyr-export - - name: West Build (${{ steps.variables.outputs.display-name }}) + - name: West Build (${{ env.display_name }}) + shell: sh -x {0} run: | - set -x - west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/${{ inputs.config_path }} ${{ steps.variables.outputs.extra-cmake-args }} ${{ matrix.cmake-args }} + west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/${{ inputs.config_path }} ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} - - name: ${{ steps.variables.outputs.display-name }} Kconfig file + - name: ${{ env.display_name }} Kconfig file run: grep -v -e "^#" -e "^$" build/zephyr/.config | sort - name: Rename artifacts + shell: sh -x {0} run: | - set -x mkdir build/artifacts if [ -f build/zephyr/zmk.uf2 ] then - cp build/zephyr/zmk.uf2 "build/artifacts/${{ steps.variables.outputs.artifact-name }}.uf2" + cp build/zephyr/zmk.uf2 "build/artifacts/${{ env.artifact_name }}.uf2" elif [ -f build/zephyr/zmk.${{ inputs.fallback_binary }} ] then - cp build/zephyr/zmk.${{ inputs.fallback_binary }} "build/artifacts/${{ steps.variables.outputs.artifact-name }}.${{ inputs.fallback_binary }}" + cp build/zephyr/zmk.${{ inputs.fallback_binary }} "build/artifacts/${{ env.artifact_name }}.${{ inputs.fallback_binary }}" fi - - name: Archive (${{ steps.variables.outputs.display-name }}) - uses: actions/upload-artifact@v2 + - name: Archive (${{ env.display_name }}) + uses: actions/upload-artifact@v3 with: - name: ${{ inputs.artifact_name }} + name: ${{ inputs.archive_name }} path: build/artifacts From f59da74a3e714825448b5dcde7794e175dea975a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Oct 2022 04:51:29 +0000 Subject: [PATCH 092/289] chore(deps): bump actions/checkout from 2 to 3.1.0 Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3.1.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v3.1.0) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build-user-config.yml | 4 ++-- .github/workflows/build.yml | 8 ++++---- .github/workflows/clang-format-lint.yml | 2 +- .github/workflows/doc-checks.yml | 6 +++--- .github/workflows/hardware-metadata-validation.yml | 6 +++--- .github/workflows/test.yml | 4 ++-- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 759dd72a..3833abe8 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -32,7 +32,7 @@ jobs: build_matrix: ${{ env.build_matrix }} steps: - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3 - name: Install yaml2json run: python3 -m pip install remarshal @@ -68,7 +68,7 @@ jobs: echo "zephyr_version=${ZEPHYR_VERSION}" >> $GITHUB_ENV - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3 - name: Cache west modules uses: actions/cache@v3.0.11 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 16373673..92df03c3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,7 +24,7 @@ jobs: include: ${{ fromJSON(needs.compile-matrix.outputs.include-list) }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Cache west modules uses: actions/cache@v3.0.2 env: @@ -151,7 +151,7 @@ jobs: core-include: ${{ steps.core-list.outputs.result }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Use Node.js uses: actions/setup-node@v2 with: @@ -180,7 +180,7 @@ jobs: boards-include: ${{ steps.boards-list.outputs.result }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Use Node.js uses: actions/setup-node@v2 with: @@ -307,7 +307,7 @@ jobs: organized-metadata: ${{ steps.organize-metadata.outputs.result }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Use Node.js uses: actions/setup-node@v2 with: diff --git a/.github/workflows/clang-format-lint.yml b/.github/workflows/clang-format-lint.yml index 375bcd4e..8c2cfbcf 100644 --- a/.github/workflows/clang-format-lint.yml +++ b/.github/workflows/clang-format-lint.yml @@ -22,7 +22,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: DoozyX/clang-format-lint-action@v0.13 with: source: "./app" diff --git a/.github/workflows/doc-checks.yml b/.github/workflows/doc-checks.yml index a9b2d5ae..d048a03e 100644 --- a/.github/workflows/doc-checks.yml +++ b/.github/workflows/doc-checks.yml @@ -14,7 +14,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: bahmutov/npm-install@v1 with: working-directory: docs @@ -24,7 +24,7 @@ jobs: prettier: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: bahmutov/npm-install@v1 with: working-directory: docs @@ -34,7 +34,7 @@ jobs: typecheck: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: bahmutov/npm-install@v1 with: working-directory: docs diff --git a/.github/workflows/hardware-metadata-validation.yml b/.github/workflows/hardware-metadata-validation.yml index 7b5ec927..c6566feb 100644 --- a/.github/workflows/hardware-metadata-validation.yml +++ b/.github/workflows/hardware-metadata-validation.yml @@ -18,8 +18,8 @@ jobs: check-metadata-format: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 + - uses: actions/checkout@v3 - uses: bahmutov/npm-install@v1 with: working-directory: app @@ -31,7 +31,7 @@ jobs: container: image: docker.io/zmkfirmware/zmk-dev-arm:3.0 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Install dependencies run: pip install -r app/scripts/requirements.txt - name: West init diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3393d0c4..38c61eea 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Find test directories id: test-dirs run: | @@ -36,7 +36,7 @@ jobs: image: docker.io/zmkfirmware/zmk-build-arm:3.0 steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Cache west modules uses: actions/cache@v3.0.2 env: From 41fdd07315fbd683eba9a9d7f3475bf55ce9dcdb Mon Sep 17 00:00:00 2001 From: Jay Greco Date: Mon, 23 May 2022 08:00:01 +0000 Subject: [PATCH 093/289] feat(boards): Add nullbits SNAP shield --- app/boards/shields/snap/Kconfig.defconfig | 49 +++++++++++ app/boards/shields/snap/Kconfig.shield | 8 ++ .../shields/snap/boards/nice_nano.overlay | 37 ++++++++ .../shields/snap/boards/nice_nano_v2.overlay | 37 ++++++++ app/boards/shields/snap/snap.conf | 17 ++++ app/boards/shields/snap/snap.dtsi | 86 +++++++++++++++++++ app/boards/shields/snap/snap.keymap | 47 ++++++++++ app/boards/shields/snap/snap.zmk.yml | 15 ++++ app/boards/shields/snap/snap_left.overlay | 34 ++++++++ app/boards/shields/snap/snap_right.overlay | 51 +++++++++++ 10 files changed, 381 insertions(+) create mode 100644 app/boards/shields/snap/Kconfig.defconfig create mode 100644 app/boards/shields/snap/Kconfig.shield create mode 100644 app/boards/shields/snap/boards/nice_nano.overlay create mode 100644 app/boards/shields/snap/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/snap/snap.conf create mode 100644 app/boards/shields/snap/snap.dtsi create mode 100644 app/boards/shields/snap/snap.keymap create mode 100644 app/boards/shields/snap/snap.zmk.yml create mode 100644 app/boards/shields/snap/snap_left.overlay create mode 100644 app/boards/shields/snap/snap_right.overlay diff --git a/app/boards/shields/snap/Kconfig.defconfig b/app/boards/shields/snap/Kconfig.defconfig new file mode 100644 index 00000000..24a8e5cc --- /dev/null +++ b/app/boards/shields/snap/Kconfig.defconfig @@ -0,0 +1,49 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_SNAP_LEFT + +config ZMK_KEYBOARD_NAME + default "SNAP" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif + +if SHIELD_SNAP_LEFT || SHIELD_SNAP_RIGHT + +config ZMK_SPLIT + default y + +if ZMK_DISPLAY + +config I2C + default y + +config SSD1306 + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LVGL_VDB_SIZE + default 64 + +config LVGL_DPI + default 148 + +config LVGL_BITS_PER_PIXEL + default 1 + +choice LVGL_COLOR_DEPTH + default LVGL_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif diff --git a/app/boards/shields/snap/Kconfig.shield b/app/boards/shields/snap/Kconfig.shield new file mode 100644 index 00000000..eb02c45f --- /dev/null +++ b/app/boards/shields/snap/Kconfig.shield @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_SNAP_LEFT + def_bool $(shields_list_contains,snap_left) + +config SHIELD_SNAP_RIGHT + def_bool $(shields_list_contains,snap_right) diff --git a/app/boards/shields/snap/boards/nice_nano.overlay b/app/boards/shields/snap/boards/nice_nano.overlay new file mode 100644 index 00000000..f869db5d --- /dev/null +++ b/app/boards/shields/snap/boards/nice_nano.overlay @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <10>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/snap/boards/nice_nano_v2.overlay b/app/boards/shields/snap/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..f869db5d --- /dev/null +++ b/app/boards/shields/snap/boards/nice_nano_v2.overlay @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <10>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/snap/snap.conf b/app/boards/shields/snap/snap.conf new file mode 100644 index 00000000..e76bccb4 --- /dev/null +++ b/app/boards/shields/snap/snap.conf @@ -0,0 +1,17 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +# Uncomment these two lines to add support for encoders to your firmware +# and enable the encoders +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment the following lines to enable the RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=n +# CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y +# CONFIG_ZMK_RGB_UNDERGLOW_HUE_STEP=5 +# CONFIG_ZMK_RGB_UNDERGLOW_SPD_START=1 \ No newline at end of file diff --git a/app/boards/shields/snap/snap.dtsi b/app/boards/shields/snap/snap.dtsi new file mode 100644 index 00000000..0b7f32e5 --- /dev/null +++ b/app/boards/shields/snap/snap.dtsi @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan_composite; + zmk,matrix_transform = &default_transform; + }; + + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; + + right_encoder: encoder_right { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <17>; + rows = <6>; + +// | R0C06L | R0C05L | R0C04L | R0C03L | R0C02L | R0C01L | R0C00L | | R0C15R | R0C14R | R0C13R | R0C12R | R0C11R | R0C10R | R0C09R | R0C08R | +// R1C07L | R1C06L | R1C05L | R1C04L | R1C03L | R1C02L | R1C01L | R1C00L | | R1C15R | R1C14R | R1C13R | R1C12R | R1C11R | R1C10R | R1C09R | R1C08R | R2C0XR | +// R2C07L | R2C06L | R2C05L | R2C04L | R2C03L | R2C02L | R2C00L | | R2C15R | R2C14R | R2C13R | R2C12R | R2C11R | R2C10R | R2C09R | R3C08R | R2C08R | +// R3C07L | R3C06L | R3C05L | R3C04L | R3C03L | R3C02L | R3C00L | | R3C15R | R3C14R | R3C13R | R3C12R | R3C11R | R3C10R | R3C09R | R4C08R | +// R4C07L | R4C06L | R4C05L | R4C04L | R4C03L | R4C02L | R4C01L | R4C00L | | R4C15R | R4C14R | R4C13R | R4C12R | R4C11R | R4C10R | R4C09R | R5C08R | +// R5C07L | R5C06L | R5C05L | R5C04L | R5C02L | R5C00L | | R5C15R | R5C14R | R5C13R | R5C12R | R5C11R | R5C10R | R5C09R | + + map = < + RC(0,6) RC(0,5) RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,15) RC(0,14) RC(0,13) RC(0,12) RC(0,11) RC(0,10) RC(0,9) RC(0,8) +RC(1,7) RC(1,6) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,15) RC(1,14) RC(1,13) RC(1,12) RC(1,11) RC(1,10) RC(1,9) RC(1,8) RC(1,16) +RC(2,7) RC(2,6) RC(2,5) RC(2,4) RC(2,3) RC(2,2) RC(2,0) RC(2,15) RC(2,14) RC(2,13) RC(2,12) RC(2,11) RC(2,10) RC(2,9) RC(3,8) RC(2,8) +RC(3,7) RC(3,6) RC(3,5) RC(3,4) RC(3,3) RC(3,2) RC(3,0) RC(3,15) RC(3,14) RC(3,13) RC(3,12) RC(3,11) RC(3,10) RC(3,9) RC(4,8) +RC(4,7) RC(4,6) RC(4,5) RC(4,4) RC(4,3) RC(4,2) RC(4,1) RC(4,0) RC(4,15) RC(4,14) RC(4,13) RC(4,12) RC(4,11) RC(4,10) RC(4,9) RC(5,8) +RC(5,7) RC(5,6) RC(5,5) RC(5,4) RC(5,2) RC(5,0) RC(5,15) RC(5,14) RC(5,13) RC(5,12) RC(5,11) RC(5,10) RC(5,9) + >; + }; + + kscan_composite: kscan { + compatible = "zmk,kscan-composite"; + label = "KSCAN"; + rows = <6>; + columns = <17>; + + demux { + kscan = <&kscan_demux>; + }; + }; + + kscan_demux: kscan_demux { + compatible = "zmk,kscan-gpio-demux"; + label = "DEMUX"; + polling-interval-msec = <25>; + }; +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + com-sequential; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/snap/snap.keymap b/app/boards/shields/snap/snap.keymap new file mode 100644 index 00000000..db44eb69 --- /dev/null +++ b/app/boards/shields/snap/snap.keymap @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +/ { + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + label = "Default"; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp C_VOL_UP C_VOL_DN>; + bindings = < + &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp KP_NUM &kp PAUSE_BREAK +&kp C_MUTE &kp TILDE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL &kp HOME +&kp F13 &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp END +&kp F14 &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP +&kp F15 &kp LSHFT &kp NUHS &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN +&kp F16 &kp LCTRL &kp LGUI &kp LALT &mo 1 &kp SPACE &kp BSPC &mo 1 &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + }; + + function_layer { + label = "Function"; + sensor-bindings = <&inc_dec_kp C_NEXT C_PREV &inc_dec_kp C_NEXT C_PREV>; + bindings = < + &bootloader &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader +&kp C_PP &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_PP +&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 &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_BRI &rgb_ug RGB_EFF +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_BRD &rgb_ug RGB_HUI + >; + }; + }; +}; diff --git a/app/boards/shields/snap/snap.zmk.yml b/app/boards/shields/snap/snap.zmk.yml new file mode 100644 index 00000000..718c7ba2 --- /dev/null +++ b/app/boards/shields/snap/snap.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: snap +name: SNAP +type: shield +url: https://nullbits.co/snap +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display + - encoder + - underglow +siblings: + - snap_left + - snap_right diff --git a/app/boards/shields/snap/snap_left.overlay b/app/boards/shields/snap/snap_left.overlay new file mode 100644 index 00000000..90fd66d1 --- /dev/null +++ b/app/boards/shields/snap/snap_left.overlay @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "snap.dtsi" + +&kscan_demux { + input-gpios + = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + output-gpios + = <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + ; +}; + +&left_encoder { + a-gpios = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + status = "okay"; +}; + +&oled { + segment-remap; + com-invdir; +}; diff --git a/app/boards/shields/snap/snap_right.overlay b/app/boards/shields/snap/snap_right.overlay new file mode 100644 index 00000000..4243f518 --- /dev/null +++ b/app/boards/shields/snap/snap_right.overlay @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "snap.dtsi" + +/ { +kscan_direct: kscan_direct { + compatible = "zmk,kscan-gpio-direct"; + label = "DIRECT"; + input-gpios + = <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; +}; + +&default_transform { + col-offset = <8>; +}; + +&kscan_composite { + direct { + kscan = <&kscan_direct>; + row-offset = <1>; + column-offset = <8>; + }; +}; + +&kscan_demux { + input-gpios + = <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + output-gpios + = <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + ; +}; + +&right_encoder { + a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + status = "okay"; +}; From 2d7c8f6073c065da695f4974bd8a892bb362f185 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 26 Oct 2022 05:28:18 +0000 Subject: [PATCH 094/289] chore(docs): Bump docusaurus and run audit fix. --- docs/package-lock.json | 15369 +++++++++++++++++++++------------------ docs/package.json | 12 +- 2 files changed, 8427 insertions(+), 6954 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 4297f7ac..61af445c 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,8 +8,8 @@ "name": "docs", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "^2.0.0-beta.21", - "@docusaurus/preset-classic": "^2.0.0-beta.21", + "@docusaurus/core": "^2.1.0", + "@docusaurus/preset-classic": "^2.1.0", "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.1.18", @@ -24,16 +24,16 @@ "web-tree-sitter": "^0.19.4" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.0.0-beta.21", - "@docusaurus/types": "^2.0.0-beta.21", + "@docusaurus/module-type-aliases": "^2.1.0", + "@docusaurus/types": "^2.1.0", "@tsconfig/docusaurus": "^1.0.5", "@types/js-yaml": "^4.0.5", "@types/react": "^17.0.3", "@types/react-helmet": "^6.1.5", "@types/react-router-dom": "^5.1.7", - "eslint": "^7.32.0", + "eslint": "^8.0.0", "eslint-config-prettier": "^8.5.0", - "eslint-plugin-mdx": "^1.17.0", + "eslint-plugin-mdx": "^2.0.5", "eslint-plugin-react": "^7.30.0", "json-schema-to-typescript": "^10.1.5", "mustache": "^4.2.0", @@ -46,87 +46,99 @@ } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.6.3.tgz", - "integrity": "sha512-dqQqRt01fX3YuVFrkceHsoCnzX0bLhrrg8itJI1NM68KjrPYQPYsE+kY8EZTCM4y8VDnhqJErR73xe/ZsV+qAA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz", + "integrity": "sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw==", "dependencies": { - "@algolia/autocomplete-shared": "1.6.3" + "@algolia/autocomplete-shared": "1.7.2" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz", + "integrity": "sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==", + "dependencies": { + "@algolia/autocomplete-shared": "1.7.2" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.6.3.tgz", - "integrity": "sha512-UV46bnkTztyADFaETfzFC5ryIdGVb2zpAoYgu0tfcuYWjhg1KbLXveFffZIrGVoboqmAk1b+jMrl6iCja1i3lg==" + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz", + "integrity": "sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==" }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.1.tgz", - "integrity": "sha512-UAUVG2PEfwd/FfudsZtYnidJ9eSCpS+LW9cQiesePQLz41NAcddKxBak6eP2GErqyFagSlnVXe/w2E9h2m2ttg==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", + "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", "dependencies": { - "@algolia/cache-common": "4.13.1" + "@algolia/cache-common": "4.14.2" } }, "node_modules/@algolia/cache-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.13.1.tgz", - "integrity": "sha512-7Vaf6IM4L0Jkl3sYXbwK+2beQOgVJ0mKFbz/4qSxKd1iy2Sp77uTAazcX+Dlexekg1fqGUOSO7HS4Sx47ZJmjA==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", + "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" }, "node_modules/@algolia/cache-in-memory": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.13.1.tgz", - "integrity": "sha512-pZzybCDGApfA/nutsFK1P0Sbsq6fYJU3DwIvyKg4pURerlJM4qZbB9bfLRef0FkzfQu7W11E4cVLCIOWmyZeuQ==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", + "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", "dependencies": { - "@algolia/cache-common": "4.13.1" + "@algolia/cache-common": "4.14.2" } }, "node_modules/@algolia/client-account": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.13.1.tgz", - "integrity": "sha512-TFLiZ1KqMiir3FNHU+h3b0MArmyaHG+eT8Iojio6TdpeFcAQ1Aiy+2gb3SZk3+pgRJa/BxGmDkRUwE5E/lv3QQ==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", + "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", "dependencies": { - "@algolia/client-common": "4.13.1", - "@algolia/client-search": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "node_modules/@algolia/client-analytics": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.13.1.tgz", - "integrity": "sha512-iOS1JBqh7xaL5x00M5zyluZ9+9Uy9GqtYHv/2SMuzNW1qP7/0doz1lbcsP3S7KBbZANJTFHUOfuqyRLPk91iFA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", + "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", "dependencies": { - "@algolia/client-common": "4.13.1", - "@algolia/client-search": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "node_modules/@algolia/client-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.13.1.tgz", - "integrity": "sha512-LcDoUE0Zz3YwfXJL6lJ2OMY2soClbjrrAKB6auYVMNJcoKZZ2cbhQoFR24AYoxnGUYBER/8B+9sTBj5bj/Gqbg==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", + "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", "dependencies": { - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "node_modules/@algolia/client-personalization": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.13.1.tgz", - "integrity": "sha512-1CqrOW1ypVrB4Lssh02hP//YxluoIYXAQCpg03L+/RiXJlCs+uIqlzC0ctpQPmxSlTK6h07kr50JQoYH/TIM9w==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", + "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", "dependencies": { - "@algolia/client-common": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "node_modules/@algolia/client-search": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.13.1.tgz", - "integrity": "sha512-YQKYA83MNRz3FgTNM+4eRYbSmHi0WWpo019s5SeYcL3HUan/i5R09VO9dk3evELDFJYciiydSjbsmhBzbpPP2A==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", + "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", "dependencies": { - "@algolia/client-common": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "node_modules/@algolia/events": { @@ -135,127 +147,107 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "node_modules/@algolia/logger-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.13.1.tgz", - "integrity": "sha512-L6slbL/OyZaAXNtS/1A8SAbOJeEXD5JcZeDCPYDqSTYScfHu+2ePRTDMgUTY4gQ7HsYZ39N1LujOd8WBTmM2Aw==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", + "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" }, "node_modules/@algolia/logger-console": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.13.1.tgz", - "integrity": "sha512-7jQOTftfeeLlnb3YqF8bNgA2GZht7rdKkJ31OCeSH2/61haO0tWPoNRjZq9XLlgMQZH276pPo0NdiArcYPHjCA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", + "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", "dependencies": { - "@algolia/logger-common": "4.13.1" + "@algolia/logger-common": "4.14.2" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.1.tgz", - "integrity": "sha512-oa0CKr1iH6Nc7CmU6RE7TnXMjHnlyp7S80pP/LvZVABeJHX3p/BcSCKovNYWWltgTxUg0U1o+2uuy8BpMKljwA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", + "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", "dependencies": { - "@algolia/requester-common": "4.13.1" + "@algolia/requester-common": "4.14.2" } }, "node_modules/@algolia/requester-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.13.1.tgz", - "integrity": "sha512-eGVf0ID84apfFEuXsaoSgIxbU3oFsIbz4XiotU3VS8qGCJAaLVUC5BUJEkiFENZIhon7hIB4d0RI13HY4RSA+w==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", + "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" }, "node_modules/@algolia/requester-node-http": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.13.1.tgz", - "integrity": "sha512-7C0skwtLdCz5heKTVe/vjvrqgL/eJxmiEjHqXdtypcE5GCQCYI15cb+wC4ytYioZDMiuDGeVYmCYImPoEgUGPw==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", + "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", "dependencies": { - "@algolia/requester-common": "4.13.1" + "@algolia/requester-common": "4.14.2" } }, "node_modules/@algolia/transporter": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.13.1.tgz", - "integrity": "sha512-pICnNQN7TtrcYJqqPEXByV8rJ8ZRU2hCiIKLTLRyNpghtQG3VAFk6fVtdzlNfdUGZcehSKGarPIZEHlQXnKjgw==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", + "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", "dependencies": { - "@algolia/cache-common": "4.13.1", - "@algolia/logger-common": "4.13.1", - "@algolia/requester-common": "4.13.1" + "@algolia/cache-common": "4.14.2", + "@algolia/logger-common": "4.14.2", + "@algolia/requester-common": "4.14.2" } }, "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", - "integrity": "sha512-QdwOGF1+eeyFh+17v2Tz626WX0nucd1iKOm6JUTUvCZdbolblCOOQCxGrQPY0f7jEhn36PiAWqZnsC2r5vmUWg==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", "dev": true, "dependencies": { "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "js-yaml": "^4.1.0" } }, "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", + "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", - "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", + "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", "dependencies": { "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.2", - "@babel/parser": "^7.18.0", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.6", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helpers": "^7.19.4", + "@babel/parser": "^7.19.6", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -279,49 +271,62 @@ } }, "node_modules/@babel/generator": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", - "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", + "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", "dependencies": { - "@babel/types": "^7.18.2", - "@jridgewell/gen-mapping": "^0.3.0", + "@babel/types": "^7.19.4", + "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dependencies": { - "@babel/types": "^7.16.7" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dependencies": { + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", - "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", + "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.20.2", + "@babel/compat-data": "^7.19.3", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", "semver": "^6.3.0" }, "engines": { @@ -340,17 +345,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", - "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", + "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -360,12 +365,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", - "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" }, "engines": { "node": ">=6.9.0" @@ -375,14 +380,12 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -392,14 +395,6 @@ "@babel/core": "^7.4.0-0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -409,213 +404,228 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", - "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", "dependencies": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", - "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", + "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.19.4", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" - }, + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz", - "integrity": "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", - "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", + "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", "dependencies": { - "@babel/types": "^7.18.2" + "@babel/types": "^7.19.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", "dependencies": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", - "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", + "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.4", + "@babel/types": "^7.19.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -658,20 +668,39 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { "node": ">=0.8.0" } }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/parser": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", - "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", + "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -680,11 +709,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", - "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -693,22 +722,14 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", - "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -717,21 +738,14 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", - "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz", + "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -741,21 +755,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", - "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -764,21 +770,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", - "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -788,20 +786,12 @@ "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -811,20 +801,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-dynamic-import/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", - "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -834,20 +816,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-namespace-from/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", - "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -857,20 +831,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-json-strings/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", - "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -880,20 +846,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", - "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -903,20 +861,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -926,33 +876,30 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz", + "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==", + "dependencies": { + "@babel/compat-data": "^7.19.4", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" + }, "engines": { "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -962,21 +909,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", - "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -986,21 +925,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", - "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1009,22 +940,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", - "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1034,21 +957,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", - "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=4" @@ -1057,14 +972,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -1087,14 +994,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-properties/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", @@ -1109,14 +1008,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -1140,11 +1031,11 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", - "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1153,14 +1044,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-assertions/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -1173,11 +1056,14 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -1263,14 +1149,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", @@ -1285,20 +1163,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", - "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1307,20 +1177,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", - "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1329,22 +1191,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", - "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-remap-async-to-generator": "^7.16.8" + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1353,20 +1207,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1375,20 +1221,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz", - "integrity": "sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz", + "integrity": "sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1397,26 +1235,19 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz", - "integrity": "sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-replace-supers": "^7.18.2", - "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, "engines": { @@ -1426,20 +1257,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", - "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1448,20 +1271,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", - "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz", + "integrity": "sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1470,21 +1285,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1493,20 +1300,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", - "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1515,21 +1314,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1538,20 +1329,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", - "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1560,22 +1343,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dependencies": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1584,20 +1359,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", - "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1606,20 +1373,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1628,22 +1387,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", - "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", + "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", "dependencies": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1652,23 +1402,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", - "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", + "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-simple-access": "^7.18.2", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-simple-access": "^7.19.4" }, "engines": { "node": ">=6.9.0" @@ -1677,24 +1418,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz", - "integrity": "sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", + "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", "dependencies": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-identifier": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-identifier": "^7.19.1" }, "engines": { "node": ">=6.9.0" @@ -1703,21 +1435,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", - "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1726,21 +1450,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", - "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1749,20 +1465,12 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", - "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1771,21 +1479,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1794,20 +1494,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", - "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1816,20 +1508,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1838,20 +1522,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz", - "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==", + "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz", + "integrity": "sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1860,20 +1536,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-constant-elements/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", - "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1882,24 +1550,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-display-name/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", - "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/plugin-syntax-jsx": "^7.17.12", - "@babel/types": "^7.17.12" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1909,33 +1569,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", - "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", - "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/plugin-transform-react-jsx": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1945,12 +1583,12 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1959,20 +1597,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", - "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "regenerator-transform": "^0.15.0" }, "engines": { @@ -1982,20 +1612,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regenerator/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", - "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2004,24 +1626,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz", - "integrity": "sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", + "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", "semver": "^6.3.0" }, "engines": { @@ -2031,14 +1645,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -2048,11 +1654,11 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2061,21 +1667,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-shorthand-properties/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", - "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2084,20 +1682,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-spread/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2106,20 +1696,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-sticky-regex/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", - "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2128,20 +1710,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-template-literals/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", - "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2150,22 +1724,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz", - "integrity": "sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz", + "integrity": "sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/plugin-syntax-typescript": "^7.17.12" + "@babel/helper-create-class-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-typescript": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2174,20 +1740,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2196,21 +1754,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2219,46 +1769,38 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-regex/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/preset-env": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", - "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz", + "integrity": "sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==", "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", - "@babel/plugin-proposal-async-generator-functions": "^7.17.12", - "@babel/plugin-proposal-class-properties": "^7.17.12", - "@babel/plugin-proposal-class-static-block": "^7.18.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.17.12", - "@babel/plugin-proposal-json-strings": "^7.17.12", - "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.18.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.17.12", - "@babel/plugin-proposal-private-methods": "^7.17.12", - "@babel/plugin-proposal-private-property-in-object": "^7.17.12", - "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", + "@babel/compat-data": "^7.19.4", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.19.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.19.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.17.12", + "@babel/plugin-syntax-import-assertions": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -2268,44 +1810,44 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.17.12", - "@babel/plugin-transform-async-to-generator": "^7.17.12", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.17.12", - "@babel/plugin-transform-classes": "^7.17.12", - "@babel/plugin-transform-computed-properties": "^7.17.12", - "@babel/plugin-transform-destructuring": "^7.18.0", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.17.12", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.18.1", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.17.12", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.18.0", - "@babel/plugin-transform-modules-commonjs": "^7.18.2", - "@babel/plugin-transform-modules-systemjs": "^7.18.0", - "@babel/plugin-transform-modules-umd": "^7.18.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", - "@babel/plugin-transform-new-target": "^7.17.12", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.17.12", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.18.0", - "@babel/plugin-transform-reserved-words": "^7.17.12", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.17.12", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.18.2", - "@babel/plugin-transform-typeof-symbol": "^7.17.12", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.19.4", + "@babel/plugin-transform-classes": "^7.19.0", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.19.4", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.0", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.2", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.22.1", + "@babel/types": "^7.19.4", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", "semver": "^6.3.0" }, "engines": { @@ -2315,32 +1857,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", - "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", - "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.17.12" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -2365,16 +1881,16 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz", - "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.17.12", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@babel/plugin-transform-react-pure-annotations": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2383,22 +1899,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-react/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/preset-typescript": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz", - "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2407,18 +1915,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-typescript/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/runtime": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", - "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", + "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -2427,11 +1927,11 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.3.tgz", - "integrity": "sha512-l4ddFwrc9rnR+EJsHsh+TJ4A35YqQz/UqcjtlX2ov53hlJYG5CxtQmNZxyajwDVmCxwy++rtvGU5HazCK4W41Q==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.6.tgz", + "integrity": "sha512-oWNn1ZlGde7b4i/3tnixpH9qI0bOAACiUs+KEES4UUCnsPjVWFlWdLV/iwJuPC2qp3EowbAqsm+0XqNwnwYhxA==", "dependencies": { - "core-js-pure": "^3.20.2", + "core-js-pure": "^3.25.1", "regenerator-runtime": "^0.13.4" }, "engines": { @@ -2439,31 +1939,31 @@ } }, "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", - "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", + "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.2", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.19.6", + "@babel/types": "^7.19.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2472,11 +1972,12 @@ } }, "node_modules/@babel/types": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", - "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", + "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2493,48 +1994,60 @@ } }, "node_modules/@docsearch/css": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.1.0.tgz", - "integrity": "sha512-bh5IskwkkodbvC0FzSg1AxMykfDl95hebEKwxNoq4e5QaGzOXSBgW8+jnMFZ7JU4sTBiB04vZWoUSzNrPboLZA==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.0.tgz", + "integrity": "sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==" }, "node_modules/@docsearch/react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.1.0.tgz", - "integrity": "sha512-bjB6ExnZzf++5B7Tfoi6UXgNwoUnNOfZ1NyvnvPhWgCMy5V/biAtLL4o7owmZSYdAKeFSvZ5Lxm0is4su/dBWg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.0.tgz", + "integrity": "sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A==", "dependencies": { - "@algolia/autocomplete-core": "1.6.3", - "@docsearch/css": "3.1.0", + "@algolia/autocomplete-core": "1.7.2", + "@algolia/autocomplete-preset-algolia": "1.7.2", + "@docsearch/css": "3.3.0", "algoliasearch": "^4.0.0" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 19.0.0", "react": ">= 16.8.0 < 19.0.0", "react-dom": ">= 16.8.0 < 19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } } }, "node_modules/@docusaurus/core": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-beta.21.tgz", - "integrity": "sha512-qysDMVp1M5UozK3u/qOxsEZsHF7jeBvJDS+5ItMPYmNKvMbNKeYZGA0g6S7F9hRDwjIlEbvo7BaX0UMDcmTAWA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", + "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", "dependencies": { - "@babel/core": "^7.18.2", - "@babel/generator": "^7.18.2", + "@babel/core": "^7.18.6", + "@babel/generator": "^7.18.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.18.2", - "@babel/preset-env": "^7.18.2", - "@babel/preset-react": "^7.17.12", - "@babel/preset-typescript": "^7.17.12", - "@babel/runtime": "^7.18.3", - "@babel/runtime-corejs3": "^7.18.3", - "@babel/traverse": "^7.18.2", - "@docusaurus/cssnano-preset": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", + "@babel/plugin-transform-runtime": "^7.18.6", + "@babel/preset-env": "^7.18.6", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@babel/runtime": "^7.18.6", + "@babel/runtime-corejs3": "^7.18.6", + "@babel/traverse": "^7.18.8", + "@docusaurus/cssnano-preset": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", - "@slorber/static-site-generator-webpack-plugin": "^4.0.4", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", "babel-loader": "^8.2.5", @@ -2547,10 +2060,10 @@ "combine-promises": "^1.1.0", "commander": "^5.1.0", "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.22.7", + "core-js": "^3.23.3", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "cssnano": "^5.1.9", + "cssnano": "^5.1.12", "del": "^6.1.1", "detect-port": "^1.3.0", "escape-html": "^1.0.3", @@ -2563,7 +2076,7 @@ "import-fresh": "^3.3.0", "leven": "^3.1.0", "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.6.0", + "mini-css-extract-plugin": "^2.6.1", "postcss": "^8.4.14", "postcss-loader": "^7.0.0", "prompts": "^2.4.2", @@ -2574,19 +2087,18 @@ "react-router": "^5.3.3", "react-router-config": "^5.1.1", "react-router-dom": "^5.3.3", - "remark-admonitions": "^1.2.1", "rtl-detect": "^1.0.4", "semver": "^7.3.7", "serve-handler": "^6.1.3", "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.1", + "terser-webpack-plugin": "^5.3.3", "tslib": "^2.4.0", "update-notifier": "^5.1.0", "url-loader": "^4.1.1", "wait-on": "^6.0.1", - "webpack": "^5.72.1", + "webpack": "^5.73.0", "webpack-bundle-analyzer": "^4.5.0", - "webpack-dev-server": "^4.9.0", + "webpack-dev-server": "^4.9.3", "webpack-merge": "^5.8.0", "webpackbar": "^5.0.2" }, @@ -2601,26 +2113,12 @@ "react-dom": "^16.8.4 || ^17.0.0" } }, - "node_modules/@docusaurus/core/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@docusaurus/cssnano-preset": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.21.tgz", - "integrity": "sha512-fhTZrg1vc6zYYZIIMXpe1TnEVGEjqscBo0s1uomSwKjjtMgu7wkzc1KKJYY7BndsSA+fVVkZ+OmL/kAsmK7xxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", + "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", "dependencies": { - "cssnano-preset-advanced": "^5.3.5", + "cssnano-preset-advanced": "^5.3.8", "postcss": "^8.4.14", "postcss-sort-media-queries": "^4.2.1", "tslib": "^2.4.0" @@ -2630,9 +2128,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.0-beta.21.tgz", - "integrity": "sha512-HTFp8FsSMrAj7Uxl5p72U+P7rjYU/LRRBazEoJbs9RaqoKEdtZuhv8MYPOCh46K9TekaoquRYqag2o23Qt4ggA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", + "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.4.0" @@ -2642,14 +2140,14 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.21.tgz", - "integrity": "sha512-AI+4obJnpOaBOAYV6df2ux5Y1YJCBS+MhXFf0yhED12sVLJi2vffZgdamYd/d/FwvWDw6QLs/VD2jebd7P50yQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", + "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", "dependencies": { - "@babel/parser": "^7.18.3", - "@babel/traverse": "^7.18.2", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", + "@babel/parser": "^7.18.8", + "@babel/traverse": "^7.18.8", + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -2659,9 +2157,10 @@ "remark-emoji": "^2.2.0", "stringify-object": "^3.3.0", "tslib": "^2.4.0", + "unified": "^9.2.2", "unist-util-visit": "^2.0.3", "url-loader": "^4.1.1", - "webpack": "^5.72.1" + "webpack": "^5.73.0" }, "engines": { "node": ">=16.14" @@ -2672,15 +2171,18 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.21.tgz", - "integrity": "sha512-gRkWICgQZiqSJgrwRKWjXm5gAB+9IcfYdUbCG0PRPP/G8sNs9zBIOY4uT4Z5ox2CWFEm44U3RTTxj7BiLVMBXw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", + "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", "dependencies": { - "@docusaurus/types": "2.0.0-beta.21", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "2.1.0", + "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", "@types/react-router-dom": "*", - "react-helmet-async": "*" + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" }, "peerDependencies": { "react": "*", @@ -2688,26 +2190,26 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.21.tgz", - "integrity": "sha512-IP21yJViP3oBmgsWBU5LhrG1MZXV4mYCQSoCAboimESmy1Z11RCNP2tXaqizE3iTmXOwZZL+SNBk06ajKCEzWg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", + "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", - "cheerio": "^1.0.0-rc.11", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", "lodash": "^4.17.21", "reading-time": "^1.5.0", - "remark-admonitions": "^1.2.1", "tslib": "^2.4.0", "unist-util-visit": "^2.0.3", "utility-types": "^3.10.0", - "webpack": "^5.72.1" + "webpack": "^5.73.0" }, "engines": { "node": ">=16.14" @@ -2717,126 +2219,27 @@ "react-dom": "^16.8.4 || ^17.0.0" } }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/cheerio": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz", - "integrity": "sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", - "dependencies": { - "entities": "^4.3.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.21.tgz", - "integrity": "sha512-aa4vrzJy4xRy81wNskyhE3wzRf3AgcESZ1nfKh8xgHUkT7fDTZ1UWlg50Jb3LBCQFFyQG2XQB9N6llskI/KUnw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", + "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", - "remark-admonitions": "^1.2.1", "tslib": "^2.4.0", "utility-types": "^3.10.0", - "webpack": "^5.72.1" + "webpack": "^5.73.0" }, "engines": { "node": ">=16.14" @@ -2847,18 +2250,18 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.21.tgz", - "integrity": "sha512-DmXOXjqNI+7X5hISzCvt54QIK6XBugu2MOxjxzuqI7q92Lk/EVdraEj5mthlH8IaEH/VlpWYJ1O9TzLqX5vH2g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", + "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "fs-extra": "^10.1.0", - "remark-admonitions": "^1.2.1", "tslib": "^2.4.0", - "webpack": "^5.72.1" + "webpack": "^5.73.0" }, "engines": { "node": ">=16.14" @@ -2869,12 +2272,13 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.21.tgz", - "integrity": "sha512-P54J4q4ecsyWW0Jy4zbimSIHna999AfbxpXGmF1IjyHrjoA3PtuakV1Ai51XrGEAaIq9q6qMQkEhbUd3CffGAw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", + "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" @@ -2888,12 +2292,13 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.21.tgz", - "integrity": "sha512-+5MS0PeGaJRgPuNZlbd/WMdQSpOACaxEz7A81HAxm6kE+tIASTW3l8jgj1eWFy/PGPzaLnQrEjxI1McAfnYmQw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", + "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "tslib": "^2.4.0" }, "engines": { @@ -2905,12 +2310,13 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.21.tgz", - "integrity": "sha512-4zxKZOnf0rfh6myXLG7a6YZfQcxYDMBsWqANEjCX77H5gPdK+GHZuDrxK6sjFvRBv4liYCrNjo7HJ4DpPoT0zA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", + "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "tslib": "^2.4.0" }, "engines": { @@ -2922,15 +2328,16 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.21.tgz", - "integrity": "sha512-/ynWbcXZXcYZ6sT2X6vAJbnfqcPxwdGEybd0rcRZi4gBHq6adMofYI25AqELmnbBDxt0If+vlAeUHFRG5ueP7Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", + "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" @@ -2944,21 +2351,22 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.21.tgz", - "integrity": "sha512-KvBnIUu7y69pNTJ9UhX6SdNlK6prR//J3L4rhN897tb8xx04xHHILlPXko2Il+C3Xzgh3OCgyvkoz9K6YlFTDw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", + "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/plugin-content-blog": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/plugin-content-pages": "2.0.0-beta.21", - "@docusaurus/plugin-debug": "2.0.0-beta.21", - "@docusaurus/plugin-google-analytics": "2.0.0-beta.21", - "@docusaurus/plugin-google-gtag": "2.0.0-beta.21", - "@docusaurus/plugin-sitemap": "2.0.0-beta.21", - "@docusaurus/theme-classic": "2.0.0-beta.21", - "@docusaurus/theme-common": "2.0.0-beta.21", - "@docusaurus/theme-search-algolia": "2.0.0-beta.21" + "@docusaurus/core": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/plugin-debug": "2.1.0", + "@docusaurus/plugin-google-analytics": "2.1.0", + "@docusaurus/plugin-google-gtag": "2.1.0", + "@docusaurus/plugin-sitemap": "2.1.0", + "@docusaurus/theme-classic": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-search-algolia": "2.1.0", + "@docusaurus/types": "2.1.0" }, "engines": { "node": ">=16.14" @@ -2981,31 +2389,35 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.21.tgz", - "integrity": "sha512-Ge0WNdTefD0VDQfaIMRRWa8tWMG9+8/OlBRd5MK88/TZfqdBq7b/gnCSaalQlvZwwkj6notkKhHx72+MKwWUJA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", + "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/plugin-content-blog": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/plugin-content-pages": "2.0.0-beta.21", - "@docusaurus/theme-common": "2.0.0-beta.21", - "@docusaurus/theme-translations": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "@mdx-js/react": "^1.6.22", - "clsx": "^1.1.1", + "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.39", + "infima": "0.2.0-alpha.42", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.14", - "prism-react-renderer": "^1.3.3", + "prism-react-renderer": "^1.3.5", "prismjs": "^1.28.0", "react-router-dom": "^5.3.3", "rtlcss": "^3.5.0", - "tslib": "^2.4.0" + "tslib": "^2.4.0", + "utility-types": "^3.10.0" }, "engines": { "node": ">=16.14" @@ -3016,17 +2428,22 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-beta.21.tgz", - "integrity": "sha512-fTKoTLRfjuFG6c3iwnVjIIOensxWMgdBKLfyE5iih3Lq7tQgkE7NyTGG9BKLrnTJ7cAD2UXdXM9xbB7tBf1qzg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", + "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", "dependencies": { - "@docusaurus/module-type-aliases": "2.0.0-beta.21", - "@docusaurus/plugin-content-blog": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/plugin-content-pages": "2.0.0-beta.21", - "clsx": "^1.1.1", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^1.2.1", "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^1.3.3", + "prism-react-renderer": "^1.3.5", "tslib": "^2.4.0", "utility-types": "^3.10.0" }, @@ -3039,21 +2456,21 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.21.tgz", - "integrity": "sha512-T1jKT8MVSSfnztSqeebUOpWHPoHKtwDXtKYE0xC99JWoZ+mMfv8AFhVSoSddn54jLJjV36mxg841eHQIySMCpQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", + "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", "dependencies": { - "@docsearch/react": "^3.1.0", - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/theme-common": "2.0.0-beta.21", - "@docusaurus/theme-translations": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docsearch/react": "^3.1.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "algoliasearch": "^4.13.1", - "algoliasearch-helper": "^3.8.2", - "clsx": "^1.1.1", + "algoliasearch-helper": "^3.10.0", + "clsx": "^1.2.1", "eta": "^1.12.3", "fs-extra": "^10.1.0", "lodash": "^4.17.21", @@ -3069,9 +2486,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.0-beta.21.tgz", - "integrity": "sha512-dLVT9OIIBs6MpzMb1bAy+C0DPJK3e3DNctG+ES0EP45gzEqQxzs4IsghpT+QDaOsuhNnAlosgJpFWX3rqxF9xA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", + "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", "dependencies": { "fs-extra": "^10.1.0", "tslib": "^2.4.0" @@ -3081,16 +2498,17 @@ } }, "node_modules/@docusaurus/types": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-beta.21.tgz", - "integrity": "sha512-/GH6Npmq81eQfMC/ikS00QSv9jNyO1RXEpNSx5GLA3sFX8Iib26g2YI2zqNplM8nyxzZ2jVBuvUoeODTIbTchQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", + "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", "commander": "^5.1.0", - "history": "^4.9.0", "joi": "^17.6.0", "react-helmet-async": "^1.3.0", "utility-types": "^3.10.0", - "webpack": "^5.72.1", + "webpack": "^5.73.0", "webpack-merge": "^5.8.0" }, "peerDependencies": { @@ -3099,11 +2517,11 @@ } }, "node_modules/@docusaurus/utils": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-beta.21.tgz", - "integrity": "sha512-M/BrVCDmmUPZLxtiStBgzpQ4I5hqkggcpnQmEN+LbvbohjbtVnnnZQ0vptIziv1w8jry/woY+ePsyOO7O/yeLQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", + "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", "dependencies": { - "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/logger": "2.1.0", "@svgr/webpack": "^6.2.1", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", @@ -3117,30 +2535,46 @@ "shelljs": "^0.8.5", "tslib": "^2.4.0", "url-loader": "^4.1.1", - "webpack": "^5.72.1" + "webpack": "^5.73.0" }, "engines": { "node": ">=16.14" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } } }, "node_modules/@docusaurus/utils-common": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-beta.21.tgz", - "integrity": "sha512-5w+6KQuJb6pUR2M8xyVuTMvO5NFQm/p8TOTDFTx60wt3p0P1rRX00v6FYsD4PK6pgmuoKjt2+Ls8dtSXc4qFpQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", + "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", "dependencies": { "tslib": "^2.4.0" }, "engines": { "node": ">=16.14" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } } }, "node_modules/@docusaurus/utils-validation": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.21.tgz", - "integrity": "sha512-6NG1FHTRjv1MFzqW//292z7uCs77vntpWEbZBHk3n67aB1HoMn5SOwjLPtRDjbCgn6HCHFmdiJr6euCbjhYolg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", + "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", "dependencies": { - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" @@ -3150,38 +2584,32 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "devOptional": true, "dependencies": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "devOptional": true, - "dependencies": { - "sprintf-js": "~1.0.2" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "devOptional": true, "dependencies": { "type-fest": "^0.20.2" @@ -3193,56 +2621,55 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "devOptional": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "engines": { + "node": ">=10" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "0.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz", - "integrity": "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw==", + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "1.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.35.tgz", - "integrity": "sha512-uLEXifXIL7hnh2sNZQrIJWNol7cTVIzwI+4qcBIq9QWaZqUblm0IDrtSqbNg+3SQf8SMGHkiSigD++rHmCHjBg==", + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.3.tgz", - "integrity": "sha512-XPeeu1IlGYqz4VWGRAT5ukNMd4VHUEEJ7ysZ7pSSgaEtNvSo+FLurybGJVmiqkQdK50OkSja2bfZXOeyMGRD8Q==", + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/react-fontawesome": { - "version": "0.1.18", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.18.tgz", - "integrity": "sha512-RwLIB4TZw0M9gvy5u+TusAA0afbwM4JQIimNH/j3ygd6aIvYPQLqXMhC9ErY26J23rDPyDZldIfPq/HpTTJ/tQ==", + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", + "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", "dependencies": { "prop-types": "^15.8.1" }, @@ -3251,20 +2678,10 @@ "react": ">=16.x" } }, - "node_modules/@fortawesome/react-fontawesome/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, "node_modules/@hapi/hoek": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", - "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, "node_modules/@hapi/topo": { "version": "5.1.0", @@ -3275,12 +2692,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", + "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", "devOptional": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" }, @@ -3288,37 +2705,76 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "devOptional": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "devOptional": true }, + "node_modules/@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.2.1.tgz", + "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dependencies": { "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/sourcemap-codec": "^1.4.10" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "engines": { "node": ">=6.0.0" } @@ -3332,18 +2788,31 @@ "@jridgewell/trace-mapping": "^0.3.9" } }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@jsdevtools/ono": { @@ -3417,6 +2886,17 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@mdx-js/mdx/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -3425,6 +2905,59 @@ "semver": "bin/semver" } }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/@mdx-js/react": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", @@ -3478,6 +3011,26 @@ "node": ">= 8" } }, + "node_modules/@pkgr/utils": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", + "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "is-glob": "^4.0.3", + "open": "^8.4.0", + "picocolors": "^1.0.0", + "tiny-glob": "^0.2.9", + "tslib": "^2.4.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.21", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", @@ -3501,6 +3054,11 @@ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -3510,37 +3068,22 @@ } }, "node_modules/@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.4.tgz", - "integrity": "sha512-FvMavoWEIePps6/JwGCOLYKCRhuwIHhMtmbKpBFgzNkxwpa/569LfTkrbRk1m1I3n+ezJK4on9E1A6cjuZmD9g==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", + "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", "dependencies": { - "bluebird": "^3.7.1", - "cheerio": "^0.22.0", "eval": "^0.1.8", - "webpack-sources": "^1.4.3" - } - }, - "node_modules/@slorber/static-site-generator-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" + }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@slorber/static-site-generator-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "node": ">=14" } }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", - "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-Cp1JR1IPrQNvPRbkfcPmax52iunBC+eQDyBce8feOIIbVH6ZpVhErYoJtPWRBj2rKi4Wi9HvCm1+L1UD6QlBmg==", "engines": { "node": ">=10" }, @@ -3553,9 +3096,9 @@ } }, "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", - "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==", "engines": { "node": ">=10" }, @@ -3568,9 +3111,9 @@ } }, "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", - "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz", + "integrity": "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==", "engines": { "node": ">=10" }, @@ -3583,9 +3126,9 @@ } }, "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", - "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.0.tgz", + "integrity": "sha512-XWm64/rSPUCQ+MFyA9lhMO+w8bOZvkTvovRIU1lpIy63ysPaVAFtxjQiZj+S7QaLaLGUXkSkf8WZsaN+QPo/gA==", "engines": { "node": ">=10" }, @@ -3598,9 +3141,9 @@ } }, "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", - "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.0.tgz", + "integrity": "sha512-JIF2D2ltiWFGlTw2fJ9jJg1fNT9rWjOD2Cf0/xzeW6Z2LIRQTHcRHxpZq359+SRWtEPsCXEWV2Xmd+DMBj6dBw==", "engines": { "node": ">=10" }, @@ -3613,9 +3156,9 @@ } }, "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", - "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.0.tgz", + "integrity": "sha512-uuo0FfLP4Nu2zncOcoUFDzZdXWma2bxkTGk0etRThs4/PghvPIGaW8cPhCg6yJ8zpaauWcKV0wZtzKlJRCtVzg==", "engines": { "node": ">=10" }, @@ -3628,9 +3171,9 @@ } }, "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", - "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.0.tgz", + "integrity": "sha512-VMRWyOmrV+DaEFPgP3hZMsFgs2g87ojs3txw0Rx8iz6Nf/E3UoHUwTqpkSCWd3Hsnc9gMOY9+wl6+/Ycleh1sw==", "engines": { "node": ">=10" }, @@ -3643,9 +3186,9 @@ } }, "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", - "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.0.tgz", + "integrity": "sha512-b67Ul3SelaqvGEEG/1B3VJ03KUtGFgRQjRLCCjdttMQLcYa9l/izQFEclNFx53pNqhijUMNKHPhGMY/CWGVKig==", "engines": { "node": ">=12" }, @@ -3658,18 +3201,18 @@ } }, "node_modules/@svgr/babel-preset": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz", - "integrity": "sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.0.tgz", + "integrity": "sha512-UWM98PKVuMqw2UZo8YO3erI6nF1n7/XBYTXBqR0QhZP7HTjYK6QxFNvPfIshddy1hBdzhVpkf148Vg8xiVOtyg==", "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^6.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "^6.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "^6.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "^6.0.0", - "@svgr/babel-plugin-transform-svg-component": "^6.2.0" + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^6.5.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.5.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.0", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.0", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.0", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.0", + "@svgr/babel-plugin-transform-svg-component": "^6.5.0" }, "engines": { "node": ">=10" @@ -3683,11 +3226,13 @@ } }, "node_modules/@svgr/core": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz", - "integrity": "sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.0.tgz", + "integrity": "sha512-jIbu36GMjfK8HCCQitkfVVeQ2vSXGfq0ef0GO9HUxZGjal6Kvpkk4PwpkFP+OyCzF+skQFT9aWrUqekT3pKF8w==", "dependencies": { - "@svgr/plugin-jsx": "^6.2.1", + "@babel/core": "^7.18.5", + "@svgr/babel-preset": "^6.5.0", + "@svgr/plugin-jsx": "^6.5.0", "camelcase": "^6.2.0", "cosmiconfig": "^7.0.1" }, @@ -3700,12 +3245,12 @@ } }, "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz", - "integrity": "sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.0.tgz", + "integrity": "sha512-PPy94U/EiPQ2dY0b4jEqj4QOdDRq6DG7aTHjpGaL8HlKSHkpU1DpjfywCXTJqtOdCo2FywjWvg0U2FhqMeUJaA==", "dependencies": { - "@babel/types": "^7.15.6", - "entities": "^3.0.1" + "@babel/types": "^7.18.4", + "entities": "^4.3.0" }, "engines": { "node": ">=10" @@ -3715,26 +3260,15 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@svgr/hast-util-to-babel-ast/node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/@svgr/plugin-jsx": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz", - "integrity": "sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.0.tgz", + "integrity": "sha512-1CHMqOBKoNk/ZPU+iGXKcQPC6q9zaD7UOI99J+BaGY5bdCztcf5bZyi0QZSDRJtCQpdofeVv7XfBYov2mtl0Pw==", "dependencies": { - "@babel/core": "^7.15.5", - "@svgr/babel-preset": "^6.2.0", - "@svgr/hast-util-to-babel-ast": "^6.2.1", - "svg-parser": "^2.0.2" + "@babel/core": "^7.18.5", + "@svgr/babel-preset": "^6.5.0", + "@svgr/hast-util-to-babel-ast": "^6.5.0", + "svg-parser": "^2.0.4" }, "engines": { "node": ">=10" @@ -3748,13 +3282,13 @@ } }, "node_modules/@svgr/plugin-svgo": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz", - "integrity": "sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.0.tgz", + "integrity": "sha512-8Zv1Yyv6I7HlIqrqGFM0sDKQrhjbfNZJawR8UjIaVWSb0tKZP1Ra6ymhqIFu6FT6kDRD0Ct5NlQZ10VUujSspw==", "dependencies": { "cosmiconfig": "^7.0.1", "deepmerge": "^4.2.2", - "svgo": "^2.5.0" + "svgo": "^2.8.0" }, "engines": { "node": ">=10" @@ -3768,18 +3302,18 @@ } }, "node_modules/@svgr/webpack": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.2.1.tgz", - "integrity": "sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.0.tgz", + "integrity": "sha512-rM/Z4pwMhqvAXEHoHIlE4SeTb0ToQNmJuBdiHwhP2ZtywyX6XqrgCv2WX7K/UCgNYJgYbekuylgyjnuLUHTcZQ==", "dependencies": { - "@babel/core": "^7.15.5", - "@babel/plugin-transform-react-constant-elements": "^7.14.5", - "@babel/preset-env": "^7.15.6", - "@babel/preset-react": "^7.14.5", - "@babel/preset-typescript": "^7.15.0", - "@svgr/core": "^6.2.1", - "@svgr/plugin-jsx": "^6.2.1", - "@svgr/plugin-svgo": "^6.2.0" + "@babel/core": "^7.18.5", + "@babel/plugin-transform-react-constant-elements": "^7.17.12", + "@babel/preset-env": "^7.18.2", + "@babel/preset-react": "^7.17.12", + "@babel/preset-typescript": "^7.17.12", + "@svgr/core": "^6.5.0", + "@svgr/plugin-jsx": "^6.5.0", + "@svgr/plugin-svgo": "^6.5.0" }, "engines": { "node": ">=10" @@ -3809,11 +3343,20 @@ } }, "node_modules/@tsconfig/docusaurus": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.5.tgz", - "integrity": "sha512-KM/TuJa9fugo67dTGx+ktIqf3fVc077J6jwHu845Hex4EQf7LABlNonP/mohDKT0cmncdtlYVHHF74xR/YpThg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.6.tgz", + "integrity": "sha512-1QxDaP54hpzM6bq9E+yFEo4F9WbWHhsDe4vktZXF/iDlc9FqGr9qlg+3X/nuKQXx8QxHV7ue8NXFazzajsxFBA==", "dev": true }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -3848,33 +3391,51 @@ "@types/node": "*" } }, + "node_modules/@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "version": "8.4.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.8.tgz", + "integrity": "sha512-zUCKQI1bUCTi+0kQs5ZQzQ/XILWRLIlh15FXWNykJ+NG3TMKMVvwwC6GP3DR1Ylga15fB7iAExSzc4PNlR5i3w==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.0.tgz", + "integrity": "sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } }, "node_modules/@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -3883,9 +3444,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3893,9 +3454,9 @@ } }, "node_modules/@types/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.0.0.tgz", + "integrity": "sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==", "dev": true, "dependencies": { "@types/minimatch": "*", @@ -3911,9 +3472,9 @@ } }, "node_modules/@types/history": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", - "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==" + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", @@ -3928,6 +3489,27 @@ "@types/node": "*" } }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, "node_modules/@types/js-yaml": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", @@ -3935,39 +3517,45 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "node_modules/@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", + "version": "4.14.186", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz", + "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==", "dev": true }, "node_modules/@types/mdast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", - "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", "dev": true }, "node_modules/@types/node": { - "version": "17.0.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz", - "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==" + "version": "18.11.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.5.tgz", + "integrity": "sha512-3JRwhbjI+cHLAkUorhf8RnqUbFXajvzX4q6fMn5JwkgtuwfYtRQYI3u4V92vI6NJuTsbBQWWh3RZjFsuevyMGQ==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -3980,15 +3568,15 @@ "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" }, "node_modules/@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/qs": { "version": "6.9.7", @@ -4001,9 +3589,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz", - "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==", + "version": "17.0.51", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.51.tgz", + "integrity": "sha512-YMddzAE+nSH04BiTJ5GydTxk0/3hckqyuOclg0s6zQYj/XzfRVNzHZAFwZb5SCSavkzTYUtcq/gwjLnvt2Y4cg==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4020,11 +3608,11 @@ } }, "node_modules/@types/react-router": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.13.tgz", - "integrity": "sha512-ZIuaO9Yrln54X6elg8q2Ivp6iK6p4syPsefEYAhRDAoqNh48C8VYUmB9RkXjKSQAJSJV0mbIFCX7I4vZDcHrjg==", + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.19.tgz", + "integrity": "sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA==", "dependencies": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*" } }, @@ -4038,17 +3626,12 @@ "@types/react-router": "*" } }, - "node_modules/@types/react-router-config/node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" - }, "node_modules/@types/react-router-dom": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", - "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", "dependencies": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "*" } @@ -4067,9 +3650,9 @@ } }, "node_modules/@types/scheduler": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", - "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "node_modules/@types/serve-index": { "version": "1.9.1", @@ -4080,11 +3663,11 @@ } }, "node_modules/@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", "dependencies": { - "@types/mime": "^1", + "@types/mime": "*", "@types/node": "*" } }, @@ -4097,9 +3680,9 @@ } }, "node_modules/@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, "node_modules/@types/ws": { "version": "8.5.3", @@ -4109,6 +3692,19 @@ "@types/node": "*" } }, + "node_modules/@types/yargs": { + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -4262,10 +3858,29 @@ "node": ">= 0.6" } }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "bin": { "acorn": "bin/acorn" }, @@ -4299,11 +3914,11 @@ } }, "node_modules/address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", "engines": { - "node": ">= 0.12.0" + "node": ">= 10.0.0" } }, "node_modules/aggregate-error": { @@ -4378,35 +3993,35 @@ } }, "node_modules/algoliasearch": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.13.1.tgz", - "integrity": "sha512-dtHUSE0caWTCE7liE1xaL+19AFf6kWEcyn76uhcitWpntqvicFHXKFoZe5JJcv9whQOTRM6+B8qJz6sFj+rDJA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", + "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", "dependencies": { - "@algolia/cache-browser-local-storage": "4.13.1", - "@algolia/cache-common": "4.13.1", - "@algolia/cache-in-memory": "4.13.1", - "@algolia/client-account": "4.13.1", - "@algolia/client-analytics": "4.13.1", - "@algolia/client-common": "4.13.1", - "@algolia/client-personalization": "4.13.1", - "@algolia/client-search": "4.13.1", - "@algolia/logger-common": "4.13.1", - "@algolia/logger-console": "4.13.1", - "@algolia/requester-browser-xhr": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/requester-node-http": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/cache-browser-local-storage": "4.14.2", + "@algolia/cache-common": "4.14.2", + "@algolia/cache-in-memory": "4.14.2", + "@algolia/client-account": "4.14.2", + "@algolia/client-analytics": "4.14.2", + "@algolia/client-common": "4.14.2", + "@algolia/client-personalization": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/logger-common": "4.14.2", + "@algolia/logger-console": "4.14.2", + "@algolia/requester-browser-xhr": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/requester-node-http": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "node_modules/algoliasearch-helper": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.8.2.tgz", - "integrity": "sha512-AXxiF0zT9oYwl8ZBgU/eRXvfYhz7cBA5YrLPlw9inZHdaYF0QEya/f1Zp1mPYMXc1v6VkHwBq4pk6/vayBLICg==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", + "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", "dependencies": { "@algolia/events": "^4.0.1" }, "peerDependencies": { - "algoliasearch": ">= 3.1 < 5" + "algoliasearch": ">= 3.1 < 6" } }, "node_modules/ansi-align": { @@ -4417,13 +4032,22 @@ "string-width": "^4.1.0" } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "devOptional": true, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/ansi-html-community": { @@ -4462,7 +4086,7 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true }, "node_modules/anymatch": { @@ -4478,9 +4102,9 @@ } }, "node_modules/arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", @@ -4511,22 +4135,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-includes/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -4558,15 +4166,6 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "devOptional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -4576,9 +4175,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", - "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", + "version": "10.4.12", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", + "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", "funding": [ { "type": "opencollective", @@ -4590,8 +4189,8 @@ } ], "dependencies": { - "browserslist": "^4.20.3", - "caniuse-lite": "^1.0.30001335", + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001407", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -4633,23 +4232,6 @@ "webpack": ">=2" } }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/babel-plugin-apply-mdx-type-prop": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", @@ -4666,6 +4248,11 @@ "@babel/core": "^7.11.6" } }, + "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, "node_modules/babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", @@ -4686,13 +4273,18 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" }, "peerDependencies": { @@ -4708,23 +4300,23 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "@babel/helper-define-polyfill-provider": "^0.3.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -4770,15 +4362,10 @@ "node": ">=8" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, "node_modules/body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -4788,7 +4375,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -4820,20 +4407,20 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/bonjour-service": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz", - "integrity": "sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", "dependencies": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.4" + "multicast-dns": "^7.2.5" } }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/boxen": { "version": "6.2.1", @@ -4856,58 +4443,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.12.2.tgz", - "integrity": "sha512-qt6ylCGpLjZ7AaODxbpyBZSs9fCI9SkL3Z9q2oxMBQhs/uyY+VD8jHA8ULCGmWQJlBgqvO3EJeAngOHD8zQCrQ==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4929,9 +4464,9 @@ } }, "node_modules/browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "funding": [ { "type": "opencollective", @@ -4943,11 +4478,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" }, "bin": { "browserslist": "cli.js" @@ -4957,14 +4491,14 @@ } }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "engines": { "node": ">= 0.8" } @@ -5031,7 +4565,7 @@ "node_modules/call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", "dev": true }, "node_modules/callsites": { @@ -5082,9 +4616,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001346", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001346.tgz", - "integrity": "sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ==", + "version": "1.0.30001425", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz", + "integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==", "funding": [ { "type": "opencollective", @@ -5120,17 +4654,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/character-entities": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", @@ -5141,9 +4664,9 @@ } }, "node_modules/character-entities-html4": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", - "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "dev": true, "funding": { "type": "github", @@ -5169,29 +4692,23 @@ } }, "node_modules/cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "dependencies": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, "node_modules/cheerio-select": { @@ -5210,127 +4727,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cheerio-select/node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio-select/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dependencies": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "node_modules/cheerio/node_modules/css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "engines": { - "node": "*" - } - }, - "node_modules/cheerio/node_modules/dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dependencies": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "node_modules/cheerio/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/cheerio/node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/cheerio/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "node_modules/cheerio/node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dependencies": { - "boolbase": "~1.0.0" - } - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -5358,35 +4754,27 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dependencies": { - "tslib": "^1.9.0" - }, + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "engines": { "node": ">=6.0" } }, - "node_modules/chrome-trace-event/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==" }, "node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" }, "node_modules/clean-css": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", - "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", + "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", "dependencies": { "source-map": "~0.6.0" }, @@ -5394,14 +4782,6 @@ "node": ">= 10.0" } }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -5422,32 +4802,25 @@ } }, "node_modules/cli-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", - "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", "dev": true, "dependencies": { - "ansi-regex": "^2.1.1", "d": "^1.0.1", - "es5-ext": "^0.10.51", + "es5-ext": "^0.10.61", "es6-iterator": "^2.0.3", - "memoizee": "^0.4.14", + "memoizee": "^0.4.15", "timers-ext": "^0.1.7" - } - }, - "node_modules/cli-color/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, "node_modules/cli-table3": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", - "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dependencies": { "string-width": "^4.2.0" }, @@ -5458,6 +4831,24 @@ "@colors/colors": "1.5.0" } }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -5472,17 +4863,20 @@ } }, "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dependencies": { "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/clsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", - "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", "engines": { "node": ">=6" } @@ -5513,14 +4907,14 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==" + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "node_modules/colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, "node_modules/combine-promises": { "version": "1.1.0", @@ -5563,6 +4957,14 @@ "node": ">= 0.6" } }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/compression": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", @@ -5593,10 +4995,15 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/configstore": { "version": "5.0.1", @@ -5615,9 +5022,9 @@ } }, "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "engines": { "node": ">=0.8" } @@ -5630,7 +5037,7 @@ "node_modules/content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", "engines": { "node": ">= 0.6" } @@ -5644,12 +5051,9 @@ } }, "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { "version": "0.5.0", @@ -5676,9 +5080,9 @@ } }, "node_modules/copy-to-clipboard": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", - "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.2.tgz", + "integrity": "sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg==", "dependencies": { "toggle-selection": "^1.0.6" } @@ -5744,9 +5148,9 @@ } }, "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz", - "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -5761,14 +5165,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/copy-webpack-plugin/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "engines": { - "node": ">= 4" - } - }, "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -5804,9 +5200,9 @@ } }, "node_modules/core-js": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz", - "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.0.tgz", + "integrity": "sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5814,30 +5210,21 @@ } }, "node_modules/core-js-compat": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.8.tgz", - "integrity": "sha512-pQnwg4xtuvc2Bs/5zYQPaEYYSuTxsF7LBWF0SvnVhthZo/Qe+rJpcEekrdNK5DWwDJ0gv0oI9NNX5Mppdy0ctg==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz", + "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==", "dependencies": { - "browserslist": "^4.20.3", - "semver": "7.0.0" + "browserslist": "^4.21.4" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/core-js-pure": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.8.tgz", - "integrity": "sha512-bOxbZIy9S5n4OVH63XaLVXZ49QKicjowDx/UELyJ68vxfCRpYsbyh/WNZNfEfAk+ekA8vSjt+gCDpvh672bc3w==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz", + "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5894,9 +5281,9 @@ } }, "node_modules/css-declaration-sorter": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", "engines": { "node": "^10 || ^12 || >=14" }, @@ -5930,13 +5317,13 @@ } }, "node_modules/css-minimizer-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", "dependencies": { "cssnano": "^5.1.8", - "jest-worker": "^27.5.1", - "postcss": "^8.4.13", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1" @@ -5955,6 +5342,9 @@ "@parcel/css": { "optional": true }, + "@swc/css": { + "optional": true + }, "clean-css": { "optional": true }, @@ -5963,6 +5353,9 @@ }, "esbuild": { "optional": true + }, + "lightningcss": { + "optional": true } } }, @@ -6015,23 +5408,15 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dependencies": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" }, "funding": { @@ -6050,14 +5435,6 @@ "node": ">=8.0.0" } }, - "node_modules/css-tree/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", @@ -6081,11 +5458,11 @@ } }, "node_modules/cssnano": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.10.tgz", - "integrity": "sha512-ACpnRgDg4m6CZD/+8SgnLcGCgy6DDGdkMbOawwdvVxNietTNLe/MtWcenp6qT0PRt5wzhGl6/cjMWCdhKXC9QA==", + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", + "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", "dependencies": { - "cssnano-preset-default": "^5.2.10", + "cssnano-preset-default": "^5.2.12", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, @@ -6101,12 +5478,12 @@ } }, "node_modules/cssnano-preset-advanced": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.6.tgz", - "integrity": "sha512-OZHsytu16eStRVrIY3wmPQqhJMaI0+O3raU4JHoKV3uuQYEeQek/FJVUIvYXD55hWR6OjCMyKYNRDw+k3/xgUw==", + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz", + "integrity": "sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==", "dependencies": { "autoprefixer": "^10.3.7", - "cssnano-preset-default": "^5.2.10", + "cssnano-preset-default": "^5.2.12", "postcss-discard-unused": "^5.1.0", "postcss-merge-idents": "^5.1.1", "postcss-reduce-idents": "^5.2.0", @@ -6120,11 +5497,11 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.10.tgz", - "integrity": "sha512-H8TJRhTjBKVOPltp9vr9El9I+IfYsOMhmXdK0LwdvwJcxYX9oWkY7ctacWusgPWAgQq1vt/WO8v+uqpfLnM7QA==", + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", + "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", "dependencies": { - "css-declaration-sorter": "^6.2.2", + "css-declaration-sorter": "^6.3.0", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", @@ -6133,7 +5510,7 @@ "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.5", + "postcss-merge-longhand": "^5.1.6", "postcss-merge-rules": "^5.1.2", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", @@ -6141,14 +5518,14 @@ "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.0", - "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", "postcss-normalize-unicode": "^5.1.0", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.1", + "postcss-ordered-values": "^5.1.3", "postcss-reduce-initial": "^5.1.0", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", @@ -6184,9 +5561,9 @@ } }, "node_modules/csstype": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", - "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, "node_modules/d": { "version": "1.0.1", @@ -6199,9 +5576,9 @@ } }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -6214,10 +5591,33 @@ } } }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dev": true, + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decode-named-character-reference/node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dependencies": { "mimic-response": "^1.0.0" }, @@ -6234,9 +5634,9 @@ } }, "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "devOptional": true }, "node_modules/deepmerge": { @@ -6272,14 +5672,18 @@ } }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dependencies": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/del": { @@ -6311,6 +5715,15 @@ "node": ">= 0.8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -6338,19 +5751,16 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "node_modules/detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dependencies": { "address": "^1.0.1", - "debug": "^2.6.0" + "debug": "4" }, "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" } }, "node_modules/detect-port-alt": { @@ -6382,19 +5792,15 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/detect-port/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" } }, - "node_modules/detect-port/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -6412,9 +5818,9 @@ "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" }, "node_modules/dns-packet": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", - "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -6443,13 +5849,13 @@ } }, "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" @@ -6467,11 +5873,11 @@ ] }, "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dependencies": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" }, "engines": { "node": ">= 4" @@ -6481,13 +5887,13 @@ } }, "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -6527,9 +5933,9 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" }, "node_modules/eastasianwidth": { "version": "0.2.0", @@ -6542,9 +5948,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.144", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.144.tgz", - "integrity": "sha512-R3RV3rU1xWwFJlSClVWDvARaOk6VUO/FubHLodIASDB3Mc2dzuWvNdfOgH9bwHUTqT79u92qw60NWfwUdzAqdg==" + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -6584,22 +5990,25 @@ "once": "^1.4.0" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "devOptional": true, + "node_modules/enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "dependencies": { - "ansi-colors": "^4.1.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=8.6" + "node": ">=10.13.0" } }, "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "engines": { + "node": ">=0.12" + }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -6613,31 +6022,32 @@ } }, "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" @@ -6649,18 +6059,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-abstract/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", @@ -6693,20 +6091,24 @@ } }, "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", "dev": true, + "hasInstallScript": true, "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dev": true, "dependencies": { "d": "1", @@ -6755,7 +6157,7 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -6769,57 +6171,56 @@ } }, "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", + "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", "devOptional": true, "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.15.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -6838,41 +6239,232 @@ } }, "node_modules/eslint-mdx": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-1.17.0.tgz", - "integrity": "sha512-O8+JRfwCzpoR2P6zUI1GDAAM/bsuzcoBS1ArvpQrgQO/E2Km0vBmM15ukiJxZ+YUh5d+qDlrqha0fZB50MojJQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-2.0.5.tgz", + "integrity": "sha512-1ZzcJwJNfladtuK+uuG/MdC0idc1e3d1vCI2STOq/pLcJBGuao2biWh90vEh2M93zDiNoHJGUIU7UAxupiiHFw==", "dev": true, "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", "cosmiconfig": "^7.0.1", - "remark-mdx": "^1.6.22", - "remark-parse": "^8.0.3", - "remark-stringify": "^8.1.1", - "tslib": "^2.3.1", - "unified": "^9.2.2" + "espree": "^9.4.0", + "estree-util-visit": "^1.2.0", + "remark-mdx": "^2.1.3", + "remark-parse": "^10.0.1", + "remark-stringify": "^10.0.2", + "synckit": "^0.8.4", + "tslib": "^2.4.0", + "unified": "^10.1.2", + "unist-util-visit": "^4.1.1", + "uvu": "^0.5.6", + "vfile": "^5.3.4" }, "engines": { - "node": ">=10.0.0" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" }, "peerDependencies": { - "eslint": ">=5.0.0" + "eslint": ">=8.0.0" + } + }, + "node_modules/eslint-mdx/node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/eslint-mdx/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-mdx/node_modules/mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/eslint-mdx/node_modules/remark-mdx": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.1.5.tgz", + "integrity": "sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==", + "dev": true, + "dependencies": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/eslint-mdx/node_modules/unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", "dev": true, "dependencies": { - "bail": "^1.0.0", + "@types/unist": "^2.0.0", + "bail": "^2.0.0", "extend": "^3.0.0", "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" }, "funding": { "type": "opencollective", @@ -6880,47 +6472,212 @@ } }, "node_modules/eslint-plugin-markdown": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-2.2.1.tgz", - "integrity": "sha512-FgWp4iyYvTFxPwfbxofTvXxgzPsDuSKHQy2S+a8Ve6savbujey+lgrFFbXQA0HPygISpRYWYBjooPzhYSF81iA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-3.0.0.tgz", + "integrity": "sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==", "dev": true, "dependencies": { "mdast-util-from-markdown": "^0.8.5" }, "engines": { - "node": "^8.10.0 || ^10.12.0 || >= 12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "eslint": ">=6.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/eslint-plugin-mdx": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-1.17.0.tgz", - "integrity": "sha512-Kicizy+fbfsB2UxTDXP92qTtFqITApu4v4DRQUfXMoPwBHeQRvZnaEtXu2S9aia51GYRYsMSqUvoPPih/5oB+g==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-2.0.5.tgz", + "integrity": "sha512-j2xN97jSlc5IoH94rJTHqYMztl46+hHzyC8Zqjx+OI1Rvv33isyf8xSSBHN6f0z8IJmgPgGsb/fH90JbvKplXg==", "dev": true, "dependencies": { - "eslint-mdx": "^1.17.0", - "eslint-plugin-markdown": "^2.2.1", - "synckit": "^0.4.1", - "tslib": "^2.3.1", - "vfile": "^4.2.1" + "eslint-mdx": "^2.0.5", + "eslint-plugin-markdown": "^3.0.0", + "remark-mdx": "^2.1.3", + "remark-parse": "^10.0.1", + "remark-stringify": "^10.0.2", + "tslib": "^2.4.0", + "unified": "^10.1.2", + "vfile": "^5.3.4" }, "engines": { - "node": ">=10.0.0" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" }, "peerDependencies": { - "eslint": ">=5.0.0" + "eslint": ">=8.0.0" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/remark-mdx": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.1.5.tgz", + "integrity": "sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==", + "dev": true, + "dependencies": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/eslint-plugin-react": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", - "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==", + "version": "7.31.10", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", + "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", "dev": true, "dependencies": { "array-includes": "^3.1.5", @@ -6957,46 +6714,18 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-react/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-react/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", "dev": true, "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7012,42 +6741,37 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "devOptional": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "devOptional": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=6" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "devOptional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", @@ -7056,28 +6780,31 @@ "node": ">=10" } }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "devOptional": true, - "dependencies": { - "@babel/highlight": "^7.10.4" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "devOptional": true, "dependencies": { - "sprintf-js": "~1.0.2" + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, "node_modules/eslint/node_modules/globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "devOptional": true, "dependencies": { "type-fest": "^0.20.2" @@ -7089,52 +6816,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "devOptional": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "engines": { + "node": ">=10" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "devOptional": true, "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "devOptional": true, - "bin": { - "acorn": "bin/acorn" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "devOptional": true, - "engines": { - "node": ">=4" + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -7161,15 +6869,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "devOptional": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -7181,20 +6880,36 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "engines": { "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" + "node_modules/estree-util-is-identifier-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.0.1.tgz", + "integrity": "sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.0.tgz", + "integrity": "sha512-wdsoqhWueuJKsh5hqLw3j8lwFqNStm92VcwtAOAny8g/KS/l5Y8RISjR4k5W6skCj3Nirag/WUCMS0Nfy3sgsg==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/esutils": { @@ -7239,7 +6954,7 @@ "node_modules/event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", "dev": true, "dependencies": { "d": "1", @@ -7293,13 +7008,13 @@ } }, "node_modules/express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -7318,7 +7033,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -7375,38 +7090,19 @@ "node": ">= 0.6" } }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "dev": true, "dependencies": { - "type": "^2.0.0" + "type": "^2.7.2" } }, "node_modules/ext/node_modules/type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", "dev": true }, "node_modules/extend": { @@ -7431,9 +7127,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -7453,13 +7149,13 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "devOptional": true }, "node_modules/fast-url-parser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", "dependencies": { "punycode": "^1.3.2" } @@ -7552,6 +7248,23 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/filesize": { "version": "8.0.7", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", @@ -7618,15 +7331,18 @@ } }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { @@ -7643,9 +7359,9 @@ } }, "node_modules/flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "devOptional": true }, "node_modules/flux": { @@ -7661,9 +7377,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", @@ -7820,7 +7536,20 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, "node_modules/function-bind": { "version": "1.1.1", @@ -7845,12 +7574,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "devOptional": true - }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -7869,13 +7592,13 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7926,19 +7649,19 @@ } }, "node_modules/github-slugger": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", - "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" }, "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -8045,6 +7768,12 @@ "node": ">=4" } }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -8064,13 +7793,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "engines": { - "node": ">= 4" - } + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true }, "node_modules/got": { "version": "9.6.0", @@ -8094,9 +7821,15 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "devOptional": true }, "node_modules/gray-matter": { "version": "4.0.3", @@ -8183,7 +7916,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -8192,9 +7924,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -8260,6 +7992,34 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-from-parse5/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-parse-selector": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", @@ -8290,6 +8050,39 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/hast-util-raw/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-parse5": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", @@ -8381,6 +8174,11 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -8465,73 +8263,23 @@ } }, "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/htmlparser2/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/htmlparser2/node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", { "type": "github", "url": "https://github.com/sponsors/fb55" } - ] - }, - "node_modules/htmlparser2/node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/htmlparser2/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/htmlparser2/node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + ], "dependencies": { - "domelementtype": "1" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" } }, - "node_modules/htmlparser2/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, "node_modules/http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -8558,9 +8306,9 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" }, "node_modules/http-proxy": { "version": "1.18.1", @@ -8640,18 +8388,17 @@ } }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "devOptional": true, + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "engines": { "node": ">= 4" } }, "node_modules/image-size": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.1.tgz", - "integrity": "sha512-VAwkvNSNGClRw9mDHhc5Efax8PLlsOGcUTh0T/LIriC8vPA3U5PdqXWqkz406MoYHMKW8Uf9gWr05T/rYB44kQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", + "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", "dependencies": { "queue": "6.0.2" }, @@ -8659,13 +8406,13 @@ "image-size": "bin/image-size.js" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/immer": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.14.tgz", - "integrity": "sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw==", + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.16.tgz", + "integrity": "sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -8689,7 +8436,7 @@ "node_modules/import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", "engines": { "node": ">=4" } @@ -8697,7 +8444,7 @@ "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "engines": { "node": ">=0.8.19" } @@ -8711,9 +8458,9 @@ } }, "node_modules/infima": { - "version": "0.2.0-alpha.39", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.39.tgz", - "integrity": "sha512-UyYiwD3nwHakGhuOUfpe3baJ8gkiPpRVx4a4sE/Ag+932+Y6swtLsdPoRR8ezhwqGnduzxmFkjumV9roz6QoLw==", + "version": "0.2.0-alpha.42", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", + "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==", "engines": { "node": ">=12" } @@ -8721,7 +8468,7 @@ "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -8789,15 +8536,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-alphanumeric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-alphanumerical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", @@ -8814,7 +8552,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", @@ -8878,9 +8616,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { "node": ">= 0.4" @@ -8900,10 +8638,15 @@ "is-ci": "bin.js" } }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, "node_modules/is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dependencies": { "has": "^1.0.3" }, @@ -8960,7 +8703,7 @@ "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } @@ -9191,7 +8934,7 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/is-weakref": { "version": "1.0.2", @@ -9242,32 +8985,49 @@ "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "engines": { "node": ">=0.10.0" } }, + "node_modules/jest-util": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", + "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", + "dependencies": { + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", "dependencies": { "@types/node": "*", + "jest-util": "^29.2.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker/node_modules/supports-color": { @@ -9285,9 +9045,9 @@ } }, "node_modules/joi": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", - "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "version": "17.6.4", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.4.tgz", + "integrity": "sha512-tPzkTJHZQjSFCc842QpdVpOZ9LI2txApboNUbW70qgnRB14Lzl+oWQOPdF2N4yqyiY14wBGe8lc7f/2hZxbGmw==", "dependencies": { "@hapi/hoek": "^9.0.0", "@hapi/topo": "^5.0.0", @@ -9296,6 +9056,12 @@ "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "devOptional": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9326,7 +9092,7 @@ "node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -9334,12 +9100,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-ref-parser": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", - "integrity": "sha512-uxU9Ix+MVszvCTvBucQiIcNEny3oAEFg7EQHSZw2bquCCuqUqEPEczIdv/Uqo1Zv4/wDPZqOI+ulrMk1ncMtjQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", "dev": true, "dependencies": { - "@apidevtools/json-schema-ref-parser": "9.0.7" + "@apidevtools/json-schema-ref-parser": "9.0.9" }, "engines": { "node": ">=10" @@ -9374,18 +9140,6 @@ "node": ">=10.0.0" } }, - "node_modules/json-schema-to-typescript/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -9394,13 +9148,13 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "devOptional": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "node_modules/json5": { @@ -9426,13 +9180,13 @@ } }, "node_modules/jsx-ast-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz", - "integrity": "sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", "dev": true, "dependencies": { - "array-includes": "^3.1.4", - "object.assign": "^4.1.2" + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" }, "engines": { "node": ">=4.0" @@ -9503,30 +9257,30 @@ } }, "node_modules/lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", "engines": { "node": ">=10" } }, "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "engines": { "node": ">=6.11.5" } }, "node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz", + "integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -9537,14 +9291,17 @@ } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -9552,22 +9309,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" - }, - "node_modules/lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "devOptional": true - }, "node_modules/lodash.curry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", @@ -9576,38 +9317,13 @@ "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "node_modules/lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "node_modules/lodash.flow": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" }, - "node_modules/lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" - }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -9616,32 +9332,7 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" - }, - "node_modules/lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" - }, - "node_modules/lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" - }, - "node_modules/lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "devOptional": true }, "node_modules/lodash.uniq": { @@ -9650,9 +9341,9 @@ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, "node_modules/longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.0.1.tgz", + "integrity": "sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==", "dev": true, "funding": { "type": "github", @@ -9700,7 +9391,7 @@ "node_modules/lru-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", "dev": true, "dependencies": { "es5-ext": "~0.10.2" @@ -9737,19 +9428,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dev": true, - "dependencies": { - "repeat-string": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/mdast-squeeze-paragraphs": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", @@ -9762,19 +9440,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-compact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", - "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", - "dev": true, - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdast-util-definitions": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", @@ -9804,6 +9469,411 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-mdx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.0.tgz", + "integrity": "sha512-M09lW0CcBT1VrJUaF/PYxemxxHa7SLDHdSn94Q9FhxjCQfuW7nMAWKWimTmA3OyDMSTH981NN1csW1X+HPSluw==", + "dev": true, + "dependencies": { + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdx-jsx": "^2.0.0", + "mdast-util-mdxjs-esm": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.1.tgz", + "integrity": "sha512-TTb6cKyTA1RD+1su1iStZ5PAv3rFfOUKcoU5EstUpv/IZo63uDX03R8+jXjMEhcobXnNOiG6/ccekvVl4eV1zQ==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.0.tgz", + "integrity": "sha512-KzgzfWMhdteDkrY4mQtyvTU5bc/W4ppxhe9SzelO6QUUiwLAM+Et2Dnjjprik74a336kHdo0zKm7Tp+n6FFeRg==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-to-markdown": "^1.3.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^4.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/parse-entities": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.0.tgz", + "integrity": "sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-remove-position": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.1.tgz", + "integrity": "sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.0.tgz", + "integrity": "sha512-7N5ihsOkAEGjFotIX9p/YPdl4TqUoMxL4ajNz7PbT89BqsdWJuBC9rvgt6wpbwTZqWWR0jKWqQbwsOWDBUZv4g==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-to-hast": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", @@ -9823,6 +9893,84 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-to-markdown": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz", + "integrity": "sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/zwitch": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.2.tgz", + "integrity": "sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/mdast-util-to-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", @@ -9851,11 +9999,11 @@ } }, "node_modules/memfs": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz", - "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", "dependencies": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" }, "engines": { "node": ">= 4.0.0" @@ -9877,12 +10025,6 @@ "timers-ext": "^0.1.7" } }, - "node_modules/memoizee/node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -9929,6 +10071,578 @@ "parse-entities": "^2.0.0" } }, + "node_modules/micromark-core-commonmark": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", + "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.3.tgz", + "integrity": "sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.3.tgz", + "integrity": "sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==", + "dev": true, + "dependencies": { + "@types/acorn": "^4.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.0.tgz", + "integrity": "sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==", + "dev": true, + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.0.tgz", + "integrity": "sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==", + "dev": true, + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^1.0.0", + "micromark-extension-mdx-jsx": "^1.0.0", + "micromark-extension-mdx-md": "^1.0.0", + "micromark-extension-mdxjs-esm": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.3.tgz", + "integrity": "sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==", + "dev": true, + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.1.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", + "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", + "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.6.tgz", + "integrity": "sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", + "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", + "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", + "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", + "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", + "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", + "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", + "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", + "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", + "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", + "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.0.tgz", + "integrity": "sha512-WWp3bf7xT9MppNuw3yPjpnOxa8cj5ACivEzXJKu0WwnjBYfzaBvIAT9KfeyI0Qkll+bfQtfftSwdgTH6QhTOKw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "estree-util-visit": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-location": "^4.0.0", + "vfile-message": "^3.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/vfile-location": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.0.1.tgz", + "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", + "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", + "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", + "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", + "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", + "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", + "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", + "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -9953,19 +10667,19 @@ } }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "~1.33.0" }, "engines": { "node": ">= 0.6" @@ -9987,23 +10701,10 @@ "node": ">=4" } }, - "node_modules/mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", - "dependencies": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, "node_modules/mini-css-extract-plugin": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", - "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", "dependencies": { "schema-utils": "^4.0.0" }, @@ -10073,9 +10774,9 @@ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10084,14 +10785,38 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } }, "node_modules/mrmime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz", - "integrity": "sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", "engines": { "node": ">=10" } @@ -10147,7 +10872,7 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "devOptional": true }, "node_modules/negotiator": { @@ -10164,9 +10889,9 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, "node_modules/no-case": { @@ -10214,9 +10939,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -10262,9 +10987,9 @@ "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" }, "node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dependencies": { "boolbase": "^1.0.0" }, @@ -10292,18 +11017,36 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", - "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10317,13 +11060,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -10377,22 +11120,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.hasown/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.values": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", @@ -10437,7 +11164,7 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } @@ -10506,28 +11233,31 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { @@ -10646,9 +11376,15 @@ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.0.0", @@ -10662,42 +11398,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", - "dependencies": { - "entities": "^4.3.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -10726,7 +11426,7 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } @@ -10734,7 +11434,7 @@ "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" }, "node_modules/path-key": { "version": "3.1.1", @@ -10792,6 +11492,54 @@ "node": ">=8" } }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/pkg-up": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", @@ -10826,6 +11574,20 @@ "node": ">=6" } }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -10846,9 +11608,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", + "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", "funding": [ { "type": "opencollective", @@ -10971,9 +11733,9 @@ } }, "node_modules/postcss-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.0.tgz", - "integrity": "sha512-IDyttebFzTSY6DI24KuHUcBjbAev1i+RyICoPEWcAstZsj03r533uMXtDn506l6/wlsRYiS5XBdx7TpccCsyUg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", + "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", @@ -10991,20 +11753,6 @@ "webpack": "^5.0.0" } }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/postcss-merge-idents": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", @@ -11021,9 +11769,9 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz", - "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", + "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.0" @@ -11193,9 +11941,9 @@ } }, "node_modules/postcss-normalize-positions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", - "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11207,9 +11955,9 @@ } }, "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", - "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11293,9 +12041,9 @@ } }, "node_modules/postcss-ordered-values": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", - "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", "dependencies": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" @@ -11363,17 +12111,17 @@ } }, "node_modules/postcss-sort-media-queries": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz", - "integrity": "sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", + "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", "dependencies": { - "sort-css-media-queries": "2.0.4" + "sort-css-media-queries": "2.1.0" }, "engines": { "node": ">=10.0.0" }, "peerDependencies": { - "postcss": "^8.4.4" + "postcss": "^8.4.16" } }, "node_modules/postcss-svgo": { @@ -11447,7 +12195,7 @@ "node_modules/prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", "engines": { "node": ">=4" } @@ -11482,17 +12230,17 @@ } }, "node_modules/prism-react-renderer": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.3.tgz", - "integrity": "sha512-Viur/7tBTCH2HmYzwCHmt2rEFn+rdIWNIINXyg0StiISbDiIhHKhrFuEK8eMkKgvsIYSjgGqy/hNyucHp6FpoQ==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", "peerDependencies": { "react": ">=0.14.9" } }, "node_modules/prismjs": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", - "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", "engines": { "node": ">=6" } @@ -11502,15 +12250,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "devOptional": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -11532,13 +12271,13 @@ } }, "node_modules/prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "react-is": "^16.13.1" } }, "node_modules/property-information": { @@ -11585,7 +12324,7 @@ "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "node_modules/pupa": { "version": "2.1.1", @@ -11604,9 +12343,9 @@ "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" }, "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -11655,7 +12394,7 @@ "node_modules/range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", "engines": { "node": ">= 0.6" } @@ -11699,7 +12438,7 @@ "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "engines": { "node": ">=0.10.0" } @@ -11727,7 +12466,7 @@ "node_modules/react-base16-styling": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", - "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=", + "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", "dependencies": { "base16": "^1.0.0", "lodash.curry": "^4.0.1", @@ -11736,15 +12475,15 @@ } }, "node_modules/react-copy-to-clipboard": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.3.tgz", - "integrity": "sha512-9S3j+m+UxDZOM0Qb8mhnT/rMR0NGSrj9A/073yz2DSxPMYhmYFBMYIdI2X4o8AjOjyFsSNxDRnCX6s/gRxpriw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", + "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", "dependencies": { - "copy-to-clipboard": "^3", - "prop-types": "^15.5.8" + "copy-to-clipboard": "^3.3.1", + "prop-types": "^15.8.1" }, "peerDependencies": { - "react": "^15.3.0 || ^16.0.0 || ^17.0.0" + "react": "^15.3.0 || 16 || 17 || 18" } }, "node_modules/react-dev-utils": { @@ -11781,21 +12520,6 @@ "node": ">=14" } }, - "node_modules/react-dev-utils/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react-dev-utils/node_modules/loader-utils": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", @@ -11804,48 +12528,6 @@ "node": ">= 12.13.0" } }, - "node_modules/react-dev-utils/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react-dom": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", @@ -11918,6 +12600,9 @@ "dependencies": { "@types/react": "*", "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" } }, "node_modules/react-loadable-ssr-addon-v5-slorber": { @@ -11936,15 +12621,14 @@ } }, "node_modules/react-router": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz", - "integrity": "sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", "path-to-regexp": "^1.7.0", "prop-types": "^15.6.2", "react-is": "^16.6.0", @@ -11968,15 +12652,15 @@ } }, "node_modules/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", "loose-envify": "^1.3.1", "prop-types": "^15.6.2", - "react-router": "5.3.3", + "react-router": "5.3.4", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" }, @@ -12044,7 +12728,7 @@ "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dependencies": { "resolve": "^1.1.6" }, @@ -12053,14 +12737,14 @@ } }, "node_modules/recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dependencies": { - "minimatch": "3.0.4" + "minimatch": "^3.0.5" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, "node_modules/regenerate": { @@ -12069,9 +12753,9 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dependencies": { "regenerate": "^1.4.2" }, @@ -12080,9 +12764,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -12122,14 +12806,14 @@ } }, "node_modules/regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", + "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.0.0" }, @@ -12138,11 +12822,11 @@ } }, "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", "dependencies": { - "rc": "^1.2.8" + "rc": "1.2.8" }, "engines": { "node": ">=6.0.0" @@ -12160,14 +12844,14 @@ } }, "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==" }, "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dependencies": { "jsesc": "~0.5.0" }, @@ -12178,95 +12862,19 @@ "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "bin": { "jsesc": "bin/jsesc" } }, - "node_modules/rehype-parse": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", - "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", - "dependencies": { - "hast-util-from-parse5": "^5.0.0", - "parse5": "^5.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/hast-util-from-parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", - "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", - "dependencies": { - "ccount": "^1.0.3", - "hastscript": "^5.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.1.2", - "xtend": "^4.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/hastscript": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", - "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", - "dependencies": { - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" - }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "engines": { "node": ">= 0.10" } }, - "node_modules/remark-admonitions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", - "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", - "dependencies": { - "rehype-parse": "^6.0.2", - "unified": "^8.4.2", - "unist-util-visit": "^2.0.1" - } - }, - "node_modules/remark-admonitions/node_modules/unified": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", - "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-emoji": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", @@ -12335,6 +12943,35 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/remark-mdx/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -12343,6 +12980,59 @@ "semver": "bin/semver" } }, + "node_modules/remark-mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remark-mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-parse": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", @@ -12383,25 +13073,65 @@ } }, "node_modules/remark-stringify": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", - "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.2.tgz", + "integrity": "sha512-6wV3pvbPvHkbNnWB0wdDvVFHOe1hBRAx1Q/5g/EpH4RppAII6J8Gnwe7VbHuXaoKIF6LAg6ExTel/+kNqSQ7lw==", "dev": true, "dependencies": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^2.0.0", - "mdast-util-compact": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^3.0.0", - "unherit": "^1.0.4", - "xtend": "^4.0.1" + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify/node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-stringify/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/remark-stringify/node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-stringify/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" }, "funding": { "type": "opencollective", @@ -12420,6 +13150,69 @@ "strip-ansi": "^6.0.1" } }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/renderkid/node_modules/htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -12441,7 +13234,7 @@ "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "engines": { "node": ">=0.10" } @@ -12457,7 +13250,7 @@ "node_modules/require-like": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", "engines": { "node": "*" } @@ -12465,15 +13258,19 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12495,7 +13292,7 @@ "node_modules/responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "dependencies": { "lowercase-keys": "^1.0.0" } @@ -12550,63 +13347,6 @@ "rtlcss": "bin/rtlcss.js" } }, - "node_modules/rtlcss/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -12630,17 +13370,57 @@ } }, "node_modules/rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", "dependencies": { "tslib": "^2.1.0" } }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -12662,16 +13442,16 @@ } }, "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 8.9.0" }, "funding": { "type": "opencollective", @@ -12693,12 +13473,12 @@ "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" }, "node_modules/selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dependencies": { "node-forge": "^1" }, @@ -12707,9 +13487,9 @@ } }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -12811,23 +13591,15 @@ "range-parser": "1.2.0" } }, - "node_modules/serve-handler/node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "node_modules/serve-handler/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dependencies": { - "mime-db": "~1.33.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.6" + "node": "*" } }, "node_modules/serve-handler/node_modules/path-to-regexp": { @@ -12838,7 +13610,7 @@ "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -12900,7 +13672,7 @@ "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "engines": { "node": ">= 0.6" } @@ -12922,7 +13694,7 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -12965,9 +13737,12 @@ } }, "node_modules/shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", + "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/shelljs": { "version": "0.8.5", @@ -13039,6 +13814,11 @@ "npm": ">=5.6.0" } }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -13047,23 +13827,6 @@ "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "devOptional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -13075,22 +13838,17 @@ } }, "node_modules/sort-css-media-queries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz", - "integrity": "sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", "engines": { "node": ">= 6.3.0" } }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } @@ -13104,22 +13862,14 @@ } }, "node_modules/source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/space-separated-tokens": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", @@ -13160,12 +13910,13 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" }, "node_modules/state-toggle": { "version": "1.0.3", @@ -13185,9 +13936,9 @@ } }, "node_modules/std-env": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.0.1.tgz", - "integrity": "sha512-mC1Ps9l77/97qeOZc+HrOL7TIaOboHqMZ24dGVQrlxFcpPpfCHpH+qfUT7Dz+6mlG8+JPA1KfBQo19iC/+Ngcw==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.0.tgz", + "integrity": "sha512-cNNS+VYsXIs5gI6gJipO4qZ8YYT274JHvNnQ1/R/x8Q8mdP0qj0zoMchRXmBNPqp/0eOEhX+3g7g6Fgb7meLIQ==" }, "node_modules/string_decoder": { "version": "1.3.0", @@ -13197,25 +13948,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/string-replace-loader": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-replace-loader/-/string-replace-loader-3.1.0.tgz", @@ -13229,23 +13961,64 @@ "webpack": "^5" } }, - "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "node_modules/string-replace-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=8" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } }, "node_modules/string.prototype.matchall": { "version": "4.0.7", @@ -13266,18 +14039,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.matchall/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/string.prototype.trimend": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", @@ -13292,22 +14053,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimend/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/string.prototype.trimstart": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", @@ -13322,32 +14067,25 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimstart/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", "dev": true, "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/stringify-entities": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", - "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", + "node_modules/stringify-entities/node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "dev": true, - "dependencies": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "xtend": "^4.0.0" - }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -13380,7 +14118,7 @@ "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", "engines": { "node": ">=0.10.0" } @@ -13428,22 +14166,25 @@ } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/supports-color/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/svg-parser": { @@ -13479,57 +14220,84 @@ "node": ">= 10" } }, - "node_modules/synckit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.4.1.tgz", - "integrity": "sha512-ngUh0+s+DOqEc0sGnrLaeNjbXp0CWHjSGFBqPlQmQ+oN/OfoDoYDBXPh+b4qs1M5QTk5nuQ3AmVz9+2xiY/ldw==", - "dev": true, + "node_modules/svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dependencies": { - "tslib": "^2.3.1", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "devOptional": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", - "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", - "devOptional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "devOptional": true + "node_modules/svgo/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/svgo/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/synckit": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz", + "integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } }, "node_modules/tapable": { "version": "2.2.1", @@ -13540,9 +14308,9 @@ } }, "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", + "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -13557,15 +14325,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.7", + "@jridgewell/trace-mapping": "^0.3.14", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" + "terser": "^5.14.1" }, "engines": { "node": ">= 10.13.0" @@ -13589,6 +14357,50 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -13597,7 +14409,7 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/thenify": { "version": "3.3.1", @@ -13611,7 +14423,7 @@ "node_modules/thenify-all": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, "dependencies": { "thenify": ">= 3.1.0 < 4" @@ -13635,10 +14447,20 @@ "next-tick": "1" } }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, "node_modules/tiny-invariant": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", - "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" }, "node_modules/tiny-warning": { "version": "1.0.3", @@ -13648,7 +14470,7 @@ "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "engines": { "node": ">=4" } @@ -13675,7 +14497,7 @@ "node_modules/toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, "node_modules/toidentifier": { "version": "1.0.1", @@ -13696,12 +14518,12 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" }, "node_modules/trim-trailing-lines": { "version": "1.1.4", @@ -13745,11 +14567,11 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -13767,6 +14589,25 @@ "node": ">= 0.6" } }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -13776,9 +14617,9 @@ } }, "node_modules/typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13788,9 +14629,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "version": "0.7.32", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", + "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==", "funding": [ { "type": "opencollective", @@ -13820,18 +14661,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unbox-primitive/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/unherit": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", @@ -13874,17 +14703,17 @@ } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "engines": { "node": ">=4" } }, "node_modules/unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", "dependencies": { "bail": "^1.0.0", "extend": "^3.0.0", @@ -13898,6 +14727,34 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unified/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -13945,6 +14802,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-position-from-estree": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.1.tgz", + "integrity": "sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-remove": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", @@ -14019,11 +14889,36 @@ "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/update-notifier": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", @@ -14083,6 +14978,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/update-notifier/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/update-notifier/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/update-notifier/node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -14111,9 +15035,9 @@ } }, "node_modules/uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { "punycode": "^2.1.0" } @@ -14152,10 +15076,46 @@ } } }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", "dependencies": { "prepend-http": "^2.0.0" }, @@ -14203,12 +15163,12 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, "node_modules/utility-types": { "version": "3.10.0", @@ -14221,7 +15181,7 @@ "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { "node": ">= 0.4.0" } @@ -14234,11 +15194,32 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "devOptional": true + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dev": true, + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uvu/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } }, "node_modules/value-equal": { "version": "1.0.1", @@ -14248,20 +15229,21 @@ "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "engines": { "node": ">= 0.8" } }, "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.5.tgz", + "integrity": "sha512-U1ho2ga33eZ8y8pkbQLH54uKqGhFJ6GYIHnnG5AhRpAh3OWjkrRHKa/KogbmQn8We+c0KVV3rTOgR9V/WowbXQ==", + "dev": true, "dependencies": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" }, "funding": { "type": "opencollective", @@ -14278,12 +15260,39 @@ } }, "node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.2.tgz", + "integrity": "sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==", + "dev": true, "dependencies": { "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" }, "funding": { "type": "opencollective", @@ -14309,9 +15318,9 @@ } }, "node_modules/watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -14345,23 +15354,23 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.72.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", - "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", + "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", + "enhanced-resolve": "^5.10.0", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -14374,7 +15383,7 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "bin": { @@ -14394,9 +15403,9 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", - "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", "dependencies": { "acorn": "^8.0.4", "acorn-walk": "^8.0.0", @@ -14476,6 +15485,25 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/webpack-dev-middleware/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -14503,14 +15531,15 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", - "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", @@ -14518,7 +15547,7 @@ "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", + "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", "express": "^4.17.3", "graceful-fs": "^4.2.6", @@ -14529,7 +15558,7 @@ "p-retry": "^4.5.0", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", @@ -14542,6 +15571,10 @@ "engines": { "node": ">= 12.13.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, "peerDependencies": { "webpack": "^4.37.0 || ^5.0.0" }, @@ -14601,9 +15634,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", - "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", + "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", "engines": { "node": ">=10.0.0" }, @@ -14645,16 +15678,60 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=10.13.0" + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/webpackbar": { @@ -14698,7 +15775,7 @@ "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -14748,47 +15825,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -14831,9 +15867,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", - "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "engines": { "node": ">=12" }, @@ -14841,22 +15877,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", @@ -14874,7 +15894,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -14888,9 +15908,9 @@ } }, "node_modules/ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "engines": { "node": ">=8.3.0" }, @@ -14970,87 +15990,95 @@ }, "dependencies": { "@algolia/autocomplete-core": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.6.3.tgz", - "integrity": "sha512-dqQqRt01fX3YuVFrkceHsoCnzX0bLhrrg8itJI1NM68KjrPYQPYsE+kY8EZTCM4y8VDnhqJErR73xe/ZsV+qAA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz", + "integrity": "sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw==", "requires": { - "@algolia/autocomplete-shared": "1.6.3" + "@algolia/autocomplete-shared": "1.7.2" + } + }, + "@algolia/autocomplete-preset-algolia": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz", + "integrity": "sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==", + "requires": { + "@algolia/autocomplete-shared": "1.7.2" } }, "@algolia/autocomplete-shared": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.6.3.tgz", - "integrity": "sha512-UV46bnkTztyADFaETfzFC5ryIdGVb2zpAoYgu0tfcuYWjhg1KbLXveFffZIrGVoboqmAk1b+jMrl6iCja1i3lg==" + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz", + "integrity": "sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==" }, "@algolia/cache-browser-local-storage": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.1.tgz", - "integrity": "sha512-UAUVG2PEfwd/FfudsZtYnidJ9eSCpS+LW9cQiesePQLz41NAcddKxBak6eP2GErqyFagSlnVXe/w2E9h2m2ttg==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", + "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", "requires": { - "@algolia/cache-common": "4.13.1" + "@algolia/cache-common": "4.14.2" } }, "@algolia/cache-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.13.1.tgz", - "integrity": "sha512-7Vaf6IM4L0Jkl3sYXbwK+2beQOgVJ0mKFbz/4qSxKd1iy2Sp77uTAazcX+Dlexekg1fqGUOSO7HS4Sx47ZJmjA==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", + "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" }, "@algolia/cache-in-memory": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.13.1.tgz", - "integrity": "sha512-pZzybCDGApfA/nutsFK1P0Sbsq6fYJU3DwIvyKg4pURerlJM4qZbB9bfLRef0FkzfQu7W11E4cVLCIOWmyZeuQ==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", + "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", "requires": { - "@algolia/cache-common": "4.13.1" + "@algolia/cache-common": "4.14.2" } }, "@algolia/client-account": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.13.1.tgz", - "integrity": "sha512-TFLiZ1KqMiir3FNHU+h3b0MArmyaHG+eT8Iojio6TdpeFcAQ1Aiy+2gb3SZk3+pgRJa/BxGmDkRUwE5E/lv3QQ==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", + "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", "requires": { - "@algolia/client-common": "4.13.1", - "@algolia/client-search": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "@algolia/client-analytics": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.13.1.tgz", - "integrity": "sha512-iOS1JBqh7xaL5x00M5zyluZ9+9Uy9GqtYHv/2SMuzNW1qP7/0doz1lbcsP3S7KBbZANJTFHUOfuqyRLPk91iFA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", + "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", "requires": { - "@algolia/client-common": "4.13.1", - "@algolia/client-search": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "@algolia/client-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.13.1.tgz", - "integrity": "sha512-LcDoUE0Zz3YwfXJL6lJ2OMY2soClbjrrAKB6auYVMNJcoKZZ2cbhQoFR24AYoxnGUYBER/8B+9sTBj5bj/Gqbg==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", + "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", "requires": { - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "@algolia/client-personalization": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.13.1.tgz", - "integrity": "sha512-1CqrOW1ypVrB4Lssh02hP//YxluoIYXAQCpg03L+/RiXJlCs+uIqlzC0ctpQPmxSlTK6h07kr50JQoYH/TIM9w==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", + "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", "requires": { - "@algolia/client-common": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "@algolia/client-search": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.13.1.tgz", - "integrity": "sha512-YQKYA83MNRz3FgTNM+4eRYbSmHi0WWpo019s5SeYcL3HUan/i5R09VO9dk3evELDFJYciiydSjbsmhBzbpPP2A==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", + "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", "requires": { - "@algolia/client-common": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "@algolia/events": { @@ -15059,117 +16087,98 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "@algolia/logger-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.13.1.tgz", - "integrity": "sha512-L6slbL/OyZaAXNtS/1A8SAbOJeEXD5JcZeDCPYDqSTYScfHu+2ePRTDMgUTY4gQ7HsYZ39N1LujOd8WBTmM2Aw==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", + "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" }, "@algolia/logger-console": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.13.1.tgz", - "integrity": "sha512-7jQOTftfeeLlnb3YqF8bNgA2GZht7rdKkJ31OCeSH2/61haO0tWPoNRjZq9XLlgMQZH276pPo0NdiArcYPHjCA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", + "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", "requires": { - "@algolia/logger-common": "4.13.1" + "@algolia/logger-common": "4.14.2" } }, "@algolia/requester-browser-xhr": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.1.tgz", - "integrity": "sha512-oa0CKr1iH6Nc7CmU6RE7TnXMjHnlyp7S80pP/LvZVABeJHX3p/BcSCKovNYWWltgTxUg0U1o+2uuy8BpMKljwA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", + "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", "requires": { - "@algolia/requester-common": "4.13.1" + "@algolia/requester-common": "4.14.2" } }, "@algolia/requester-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.13.1.tgz", - "integrity": "sha512-eGVf0ID84apfFEuXsaoSgIxbU3oFsIbz4XiotU3VS8qGCJAaLVUC5BUJEkiFENZIhon7hIB4d0RI13HY4RSA+w==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", + "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" }, "@algolia/requester-node-http": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.13.1.tgz", - "integrity": "sha512-7C0skwtLdCz5heKTVe/vjvrqgL/eJxmiEjHqXdtypcE5GCQCYI15cb+wC4ytYioZDMiuDGeVYmCYImPoEgUGPw==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", + "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", "requires": { - "@algolia/requester-common": "4.13.1" + "@algolia/requester-common": "4.14.2" } }, "@algolia/transporter": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.13.1.tgz", - "integrity": "sha512-pICnNQN7TtrcYJqqPEXByV8rJ8ZRU2hCiIKLTLRyNpghtQG3VAFk6fVtdzlNfdUGZcehSKGarPIZEHlQXnKjgw==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", + "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", "requires": { - "@algolia/cache-common": "4.13.1", - "@algolia/logger-common": "4.13.1", - "@algolia/requester-common": "4.13.1" + "@algolia/cache-common": "4.14.2", + "@algolia/logger-common": "4.14.2", + "@algolia/requester-common": "4.14.2" } }, "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "requires": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@apidevtools/json-schema-ref-parser": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", - "integrity": "sha512-QdwOGF1+eeyFh+17v2Tz626WX0nucd1iKOm6JUTUvCZdbolblCOOQCxGrQPY0f7jEhn36PiAWqZnsC2r5vmUWg==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", "dev": true, "requires": { "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } + "js-yaml": "^4.1.0" } }, "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "requires": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.18.6" } }, "@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==" + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", + "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==" }, "@babel/core": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", - "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", + "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", "requires": { "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.2", - "@babel/parser": "^7.18.0", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.6", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helpers": "^7.19.4", + "@babel/parser": "^7.19.6", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -15185,40 +16194,52 @@ } }, "@babel/generator": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", - "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", + "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", "requires": { - "@babel/types": "^7.18.2", - "@jridgewell/gen-mapping": "^0.3.0", + "@babel/types": "^7.19.4", + "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } } }, "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-compilation-targets": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", - "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", + "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.20.2", + "@babel/compat-data": "^7.19.3", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", "semver": "^6.3.0" }, "dependencies": { @@ -15230,48 +16251,41 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", - "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", + "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", - "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -15280,162 +16294,168 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", - "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, "@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "requires": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" } }, "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", "requires": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.9" } }, "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-transforms": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", - "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", + "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.19.4", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4" } }, "@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-replace-supers": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz", - "integrity": "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", "requires": { - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" } }, "@babel/helper-simple-access": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", - "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", + "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", "requires": { - "@babel/types": "^7.18.2" + "@babel/types": "^7.19.4" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.9" } }, "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + }, "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" }, "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" }, "@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", "requires": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" } }, "@babel/helpers": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", - "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", + "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.4", + "@babel/types": "^7.19.4" } }, "@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -15469,289 +16489,193 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } } } }, "@babel/parser": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", - "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==" + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", + "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", - "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", - "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", - "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz", + "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-class-properties": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", - "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", - "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", - "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-json-strings": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", - "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", - "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", - "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz", + "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" + "@babel/compat-data": "^7.19.4", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", - "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-private-methods": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", - "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", - "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", - "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-async-generators": { @@ -15768,13 +16692,6 @@ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "requires": { "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } } }, "@babel/plugin-syntax-class-static-block": { @@ -15783,13 +16700,6 @@ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-syntax-dynamic-import": { @@ -15809,18 +16719,11 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", - "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-json-strings": { @@ -15832,11 +16735,11 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -15893,13 +16796,6 @@ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-syntax-top-level-await": { @@ -15908,530 +16804,298 @@ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } } }, "@babel/plugin-syntax-typescript": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", - "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", - "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", - "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", "requires": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-remap-async-to-generator": "^7.16.8" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz", - "integrity": "sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz", + "integrity": "sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-classes": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz", - "integrity": "sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-replace-supers": "^7.18.2", - "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", - "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-destructuring": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", - "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz", + "integrity": "sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", - "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-for-of": { - "version": "7.18.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", - "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "requires": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-literals": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", - "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", - "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", + "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", "requires": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", - "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", + "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", "requires": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-simple-access": "^7.18.2", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-simple-access": "^7.19.4" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz", - "integrity": "sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", + "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", "requires": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-identifier": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-identifier": "^7.19.1" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", - "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "requires": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", - "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-new-target": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", - "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" } }, "@babel/plugin-transform-parameters": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", - "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz", - "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==", + "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz", + "integrity": "sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", - "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", - "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/plugin-syntax-jsx": "^7.17.12", - "@babel/types": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - }, - "@babel/plugin-syntax-jsx": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", - "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", - "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - } - } + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.19.0" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", - "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", "requires": { - "@babel/plugin-transform-react-jsx": "^7.16.7" + "@babel/plugin-transform-react-jsx": "^7.18.6" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-regenerator": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", - "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "regenerator-transform": "^0.15.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-transform-reserved-words": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", - "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-runtime": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz", - "integrity": "sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", + "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", "requires": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", "semver": "^6.3.0" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -16440,161 +17104,105 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-spread": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", - "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-template-literals": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", - "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", - "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typescript": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz", - "integrity": "sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz", + "integrity": "sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/plugin-syntax-typescript": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-create-class-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-typescript": "^7.18.6" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/preset-env": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", - "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz", + "integrity": "sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==", "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", - "@babel/plugin-proposal-async-generator-functions": "^7.17.12", - "@babel/plugin-proposal-class-properties": "^7.17.12", - "@babel/plugin-proposal-class-static-block": "^7.18.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.17.12", - "@babel/plugin-proposal-json-strings": "^7.17.12", - "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.18.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.17.12", - "@babel/plugin-proposal-private-methods": "^7.17.12", - "@babel/plugin-proposal-private-property-in-object": "^7.17.12", - "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", + "@babel/compat-data": "^7.19.4", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.19.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.19.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.17.12", + "@babel/plugin-syntax-import-assertions": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -16604,64 +17212,47 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.17.12", - "@babel/plugin-transform-async-to-generator": "^7.17.12", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.17.12", - "@babel/plugin-transform-classes": "^7.17.12", - "@babel/plugin-transform-computed-properties": "^7.17.12", - "@babel/plugin-transform-destructuring": "^7.18.0", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.17.12", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.18.1", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.17.12", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.18.0", - "@babel/plugin-transform-modules-commonjs": "^7.18.2", - "@babel/plugin-transform-modules-systemjs": "^7.18.0", - "@babel/plugin-transform-modules-umd": "^7.18.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", - "@babel/plugin-transform-new-target": "^7.17.12", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.17.12", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.18.0", - "@babel/plugin-transform-reserved-words": "^7.17.12", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.17.12", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.18.2", - "@babel/plugin-transform-typeof-symbol": "^7.17.12", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.19.4", + "@babel/plugin-transform-classes": "^7.19.0", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.19.4", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.0", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.2", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.22.1", + "@babel/types": "^7.19.4", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", "semver": "^6.3.0" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", - "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", - "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.17.12" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -16682,92 +17273,79 @@ } }, "@babel/preset-react": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz", - "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.17.12", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@babel/plugin-transform-react-pure-annotations": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" } }, "@babel/preset-typescript": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz", - "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" } }, "@babel/runtime": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", - "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", + "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.3.tgz", - "integrity": "sha512-l4ddFwrc9rnR+EJsHsh+TJ4A35YqQz/UqcjtlX2ov53hlJYG5CxtQmNZxyajwDVmCxwy++rtvGU5HazCK4W41Q==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.6.tgz", + "integrity": "sha512-oWNn1ZlGde7b4i/3tnixpH9qI0bOAACiUs+KEES4UUCnsPjVWFlWdLV/iwJuPC2qp3EowbAqsm+0XqNwnwYhxA==", "requires": { - "core-js-pure": "^3.20.2", + "core-js-pure": "^3.25.1", "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" } }, "@babel/traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", - "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", + "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.2", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.19.6", + "@babel/types": "^7.19.4", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", - "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", + "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, @@ -16778,43 +17356,44 @@ "optional": true }, "@docsearch/css": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.1.0.tgz", - "integrity": "sha512-bh5IskwkkodbvC0FzSg1AxMykfDl95hebEKwxNoq4e5QaGzOXSBgW8+jnMFZ7JU4sTBiB04vZWoUSzNrPboLZA==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.0.tgz", + "integrity": "sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==" }, "@docsearch/react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.1.0.tgz", - "integrity": "sha512-bjB6ExnZzf++5B7Tfoi6UXgNwoUnNOfZ1NyvnvPhWgCMy5V/biAtLL4o7owmZSYdAKeFSvZ5Lxm0is4su/dBWg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.0.tgz", + "integrity": "sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A==", "requires": { - "@algolia/autocomplete-core": "1.6.3", - "@docsearch/css": "3.1.0", + "@algolia/autocomplete-core": "1.7.2", + "@algolia/autocomplete-preset-algolia": "1.7.2", + "@docsearch/css": "3.3.0", "algoliasearch": "^4.0.0" } }, "@docusaurus/core": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-beta.21.tgz", - "integrity": "sha512-qysDMVp1M5UozK3u/qOxsEZsHF7jeBvJDS+5ItMPYmNKvMbNKeYZGA0g6S7F9hRDwjIlEbvo7BaX0UMDcmTAWA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", + "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", "requires": { - "@babel/core": "^7.18.2", - "@babel/generator": "^7.18.2", + "@babel/core": "^7.18.6", + "@babel/generator": "^7.18.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.18.2", - "@babel/preset-env": "^7.18.2", - "@babel/preset-react": "^7.17.12", - "@babel/preset-typescript": "^7.17.12", - "@babel/runtime": "^7.18.3", - "@babel/runtime-corejs3": "^7.18.3", - "@babel/traverse": "^7.18.2", - "@docusaurus/cssnano-preset": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", + "@babel/plugin-transform-runtime": "^7.18.6", + "@babel/preset-env": "^7.18.6", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@babel/runtime": "^7.18.6", + "@babel/runtime-corejs3": "^7.18.6", + "@babel/traverse": "^7.18.8", + "@docusaurus/cssnano-preset": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", - "@slorber/static-site-generator-webpack-plugin": "^4.0.4", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", "babel-loader": "^8.2.5", @@ -16827,10 +17406,10 @@ "combine-promises": "^1.1.0", "commander": "^5.1.0", "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.22.7", + "core-js": "^3.23.3", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "cssnano": "^5.1.9", + "cssnano": "^5.1.12", "del": "^6.1.1", "detect-port": "^1.3.0", "escape-html": "^1.0.3", @@ -16843,7 +17422,7 @@ "import-fresh": "^3.3.0", "leven": "^3.1.0", "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.6.0", + "mini-css-extract-plugin": "^2.6.1", "postcss": "^8.4.14", "postcss-loader": "^7.0.0", "prompts": "^2.4.2", @@ -16854,62 +17433,51 @@ "react-router": "^5.3.3", "react-router-config": "^5.1.1", "react-router-dom": "^5.3.3", - "remark-admonitions": "^1.2.1", "rtl-detect": "^1.0.4", "semver": "^7.3.7", "serve-handler": "^6.1.3", "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.1", + "terser-webpack-plugin": "^5.3.3", "tslib": "^2.4.0", "update-notifier": "^5.1.0", "url-loader": "^4.1.1", "wait-on": "^6.0.1", - "webpack": "^5.72.1", + "webpack": "^5.73.0", "webpack-bundle-analyzer": "^4.5.0", - "webpack-dev-server": "^4.9.0", + "webpack-dev-server": "^4.9.3", "webpack-merge": "^5.8.0", "webpackbar": "^5.0.2" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "@docusaurus/cssnano-preset": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.21.tgz", - "integrity": "sha512-fhTZrg1vc6zYYZIIMXpe1TnEVGEjqscBo0s1uomSwKjjtMgu7wkzc1KKJYY7BndsSA+fVVkZ+OmL/kAsmK7xxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", + "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", "requires": { - "cssnano-preset-advanced": "^5.3.5", + "cssnano-preset-advanced": "^5.3.8", "postcss": "^8.4.14", "postcss-sort-media-queries": "^4.2.1", "tslib": "^2.4.0" } }, "@docusaurus/logger": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.0-beta.21.tgz", - "integrity": "sha512-HTFp8FsSMrAj7Uxl5p72U+P7rjYU/LRRBazEoJbs9RaqoKEdtZuhv8MYPOCh46K9TekaoquRYqag2o23Qt4ggA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", + "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", "requires": { "chalk": "^4.1.2", "tslib": "^2.4.0" } }, "@docusaurus/mdx-loader": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.21.tgz", - "integrity": "sha512-AI+4obJnpOaBOAYV6df2ux5Y1YJCBS+MhXFf0yhED12sVLJi2vffZgdamYd/d/FwvWDw6QLs/VD2jebd7P50yQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", + "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", "requires": { - "@babel/parser": "^7.18.3", - "@babel/traverse": "^7.18.2", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", + "@babel/parser": "^7.18.8", + "@babel/traverse": "^7.18.8", + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -16919,214 +17487,156 @@ "remark-emoji": "^2.2.0", "stringify-object": "^3.3.0", "tslib": "^2.4.0", + "unified": "^9.2.2", "unist-util-visit": "^2.0.3", "url-loader": "^4.1.1", - "webpack": "^5.72.1" + "webpack": "^5.73.0" } }, "@docusaurus/module-type-aliases": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.21.tgz", - "integrity": "sha512-gRkWICgQZiqSJgrwRKWjXm5gAB+9IcfYdUbCG0PRPP/G8sNs9zBIOY4uT4Z5ox2CWFEm44U3RTTxj7BiLVMBXw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", + "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", "requires": { - "@docusaurus/types": "2.0.0-beta.21", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "2.1.0", + "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", "@types/react-router-dom": "*", - "react-helmet-async": "*" + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" } }, "@docusaurus/plugin-content-blog": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.21.tgz", - "integrity": "sha512-IP21yJViP3oBmgsWBU5LhrG1MZXV4mYCQSoCAboimESmy1Z11RCNP2tXaqizE3iTmXOwZZL+SNBk06ajKCEzWg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", + "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", - "cheerio": "^1.0.0-rc.11", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", "lodash": "^4.17.21", "reading-time": "^1.5.0", - "remark-admonitions": "^1.2.1", "tslib": "^2.4.0", "unist-util-visit": "^2.0.3", "utility-types": "^3.10.0", - "webpack": "^5.72.1" - }, - "dependencies": { - "cheerio": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz", - "integrity": "sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==", - "requires": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0", - "tslib": "^2.4.0" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==" - }, - "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, - "parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", - "requires": { - "entities": "^4.3.0" - } - } + "webpack": "^5.73.0" } }, "@docusaurus/plugin-content-docs": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.21.tgz", - "integrity": "sha512-aa4vrzJy4xRy81wNskyhE3wzRf3AgcESZ1nfKh8xgHUkT7fDTZ1UWlg50Jb3LBCQFFyQG2XQB9N6llskI/KUnw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", + "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", - "remark-admonitions": "^1.2.1", "tslib": "^2.4.0", "utility-types": "^3.10.0", - "webpack": "^5.72.1" + "webpack": "^5.73.0" } }, "@docusaurus/plugin-content-pages": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.21.tgz", - "integrity": "sha512-DmXOXjqNI+7X5hISzCvt54QIK6XBugu2MOxjxzuqI7q92Lk/EVdraEj5mthlH8IaEH/VlpWYJ1O9TzLqX5vH2g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", + "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "fs-extra": "^10.1.0", - "remark-admonitions": "^1.2.1", "tslib": "^2.4.0", - "webpack": "^5.72.1" + "webpack": "^5.73.0" } }, "@docusaurus/plugin-debug": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.21.tgz", - "integrity": "sha512-P54J4q4ecsyWW0Jy4zbimSIHna999AfbxpXGmF1IjyHrjoA3PtuakV1Ai51XrGEAaIq9q6qMQkEhbUd3CffGAw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", + "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-analytics": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.21.tgz", - "integrity": "sha512-+5MS0PeGaJRgPuNZlbd/WMdQSpOACaxEz7A81HAxm6kE+tIASTW3l8jgj1eWFy/PGPzaLnQrEjxI1McAfnYmQw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", + "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-gtag": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.21.tgz", - "integrity": "sha512-4zxKZOnf0rfh6myXLG7a6YZfQcxYDMBsWqANEjCX77H5gPdK+GHZuDrxK6sjFvRBv4liYCrNjo7HJ4DpPoT0zA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", + "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "tslib": "^2.4.0" } }, "@docusaurus/plugin-sitemap": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.21.tgz", - "integrity": "sha512-/ynWbcXZXcYZ6sT2X6vAJbnfqcPxwdGEybd0rcRZi4gBHq6adMofYI25AqELmnbBDxt0If+vlAeUHFRG5ueP7Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", + "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" } }, "@docusaurus/preset-classic": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.21.tgz", - "integrity": "sha512-KvBnIUu7y69pNTJ9UhX6SdNlK6prR//J3L4rhN897tb8xx04xHHILlPXko2Il+C3Xzgh3OCgyvkoz9K6YlFTDw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", + "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/plugin-content-blog": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/plugin-content-pages": "2.0.0-beta.21", - "@docusaurus/plugin-debug": "2.0.0-beta.21", - "@docusaurus/plugin-google-analytics": "2.0.0-beta.21", - "@docusaurus/plugin-google-gtag": "2.0.0-beta.21", - "@docusaurus/plugin-sitemap": "2.0.0-beta.21", - "@docusaurus/theme-classic": "2.0.0-beta.21", - "@docusaurus/theme-common": "2.0.0-beta.21", - "@docusaurus/theme-search-algolia": "2.0.0-beta.21" + "@docusaurus/core": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/plugin-debug": "2.1.0", + "@docusaurus/plugin-google-analytics": "2.1.0", + "@docusaurus/plugin-google-gtag": "2.1.0", + "@docusaurus/plugin-sitemap": "2.1.0", + "@docusaurus/theme-classic": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-search-algolia": "2.1.0", + "@docusaurus/types": "2.1.0" } }, "@docusaurus/react-loadable": { @@ -17139,65 +17649,74 @@ } }, "@docusaurus/theme-classic": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.21.tgz", - "integrity": "sha512-Ge0WNdTefD0VDQfaIMRRWa8tWMG9+8/OlBRd5MK88/TZfqdBq7b/gnCSaalQlvZwwkj6notkKhHx72+MKwWUJA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", + "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/plugin-content-blog": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/plugin-content-pages": "2.0.0-beta.21", - "@docusaurus/theme-common": "2.0.0-beta.21", - "@docusaurus/theme-translations": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "@mdx-js/react": "^1.6.22", - "clsx": "^1.1.1", + "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.39", + "infima": "0.2.0-alpha.42", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.14", - "prism-react-renderer": "^1.3.3", + "prism-react-renderer": "^1.3.5", "prismjs": "^1.28.0", "react-router-dom": "^5.3.3", "rtlcss": "^3.5.0", - "tslib": "^2.4.0" + "tslib": "^2.4.0", + "utility-types": "^3.10.0" } }, "@docusaurus/theme-common": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-beta.21.tgz", - "integrity": "sha512-fTKoTLRfjuFG6c3iwnVjIIOensxWMgdBKLfyE5iih3Lq7tQgkE7NyTGG9BKLrnTJ7cAD2UXdXM9xbB7tBf1qzg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", + "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", "requires": { - "@docusaurus/module-type-aliases": "2.0.0-beta.21", - "@docusaurus/plugin-content-blog": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/plugin-content-pages": "2.0.0-beta.21", - "clsx": "^1.1.1", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^1.2.1", "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^1.3.3", + "prism-react-renderer": "^1.3.5", "tslib": "^2.4.0", "utility-types": "^3.10.0" } }, "@docusaurus/theme-search-algolia": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.21.tgz", - "integrity": "sha512-T1jKT8MVSSfnztSqeebUOpWHPoHKtwDXtKYE0xC99JWoZ+mMfv8AFhVSoSddn54jLJjV36mxg841eHQIySMCpQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", + "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", "requires": { - "@docsearch/react": "^3.1.0", - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/theme-common": "2.0.0-beta.21", - "@docusaurus/theme-translations": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docsearch/react": "^3.1.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "algoliasearch": "^4.13.1", - "algoliasearch-helper": "^3.8.2", - "clsx": "^1.1.1", + "algoliasearch-helper": "^3.10.0", + "clsx": "^1.2.1", "eta": "^1.12.3", "fs-extra": "^10.1.0", "lodash": "^4.17.21", @@ -17206,34 +17725,35 @@ } }, "@docusaurus/theme-translations": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.0-beta.21.tgz", - "integrity": "sha512-dLVT9OIIBs6MpzMb1bAy+C0DPJK3e3DNctG+ES0EP45gzEqQxzs4IsghpT+QDaOsuhNnAlosgJpFWX3rqxF9xA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", + "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", "requires": { "fs-extra": "^10.1.0", "tslib": "^2.4.0" } }, "@docusaurus/types": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-beta.21.tgz", - "integrity": "sha512-/GH6Npmq81eQfMC/ikS00QSv9jNyO1RXEpNSx5GLA3sFX8Iib26g2YI2zqNplM8nyxzZ2jVBuvUoeODTIbTchQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", + "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", "requires": { + "@types/history": "^4.7.11", + "@types/react": "*", "commander": "^5.1.0", - "history": "^4.9.0", "joi": "^17.6.0", "react-helmet-async": "^1.3.0", "utility-types": "^3.10.0", - "webpack": "^5.72.1", + "webpack": "^5.73.0", "webpack-merge": "^5.8.0" } }, "@docusaurus/utils": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-beta.21.tgz", - "integrity": "sha512-M/BrVCDmmUPZLxtiStBgzpQ4I5hqkggcpnQmEN+LbvbohjbtVnnnZQ0vptIziv1w8jry/woY+ePsyOO7O/yeLQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", + "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", "requires": { - "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/logger": "2.1.0", "@svgr/webpack": "^6.2.1", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", @@ -17247,121 +17767,96 @@ "shelljs": "^0.8.5", "tslib": "^2.4.0", "url-loader": "^4.1.1", - "webpack": "^5.72.1" + "webpack": "^5.73.0" } }, "@docusaurus/utils-common": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-beta.21.tgz", - "integrity": "sha512-5w+6KQuJb6pUR2M8xyVuTMvO5NFQm/p8TOTDFTx60wt3p0P1rRX00v6FYsD4PK6pgmuoKjt2+Ls8dtSXc4qFpQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", + "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", "requires": { "tslib": "^2.4.0" } }, "@docusaurus/utils-validation": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.21.tgz", - "integrity": "sha512-6NG1FHTRjv1MFzqW//292z7uCs77vntpWEbZBHk3n67aB1HoMn5SOwjLPtRDjbCgn6HCHFmdiJr6euCbjhYolg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", + "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", "requires": { - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" } }, "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "devOptional": true, "requires": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "devOptional": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, "globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "devOptional": true, "requires": { "type-fest": "^0.20.2" } }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "devOptional": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "devOptional": true } } }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz", - "integrity": "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw==" + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.35.tgz", - "integrity": "sha512-uLEXifXIL7hnh2sNZQrIJWNol7cTVIzwI+4qcBIq9QWaZqUblm0IDrtSqbNg+3SQf8SMGHkiSigD++rHmCHjBg==", + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.3.tgz", - "integrity": "sha512-XPeeu1IlGYqz4VWGRAT5ukNMd4VHUEEJ7ysZ7pSSgaEtNvSo+FLurybGJVmiqkQdK50OkSja2bfZXOeyMGRD8Q==", + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" } }, "@fortawesome/react-fontawesome": { - "version": "0.1.18", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.18.tgz", - "integrity": "sha512-RwLIB4TZw0M9gvy5u+TusAA0afbwM4JQIimNH/j3ygd6aIvYPQLqXMhC9ErY26J23rDPyDZldIfPq/HpTTJ/tQ==", + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", + "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", "requires": { "prop-types": "^15.8.1" - }, - "dependencies": { - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - } } }, "@hapi/hoek": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", - "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, "@hapi/topo": { "version": "5.1.0", @@ -17372,41 +17867,67 @@ } }, "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", + "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", "devOptional": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" } }, - "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "devOptional": true }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "devOptional": true + }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/types": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.2.1.tgz", + "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, "@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "requires": { "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" }, "@jridgewell/source-map": { "version": "0.3.2", @@ -17415,20 +17936,32 @@ "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "@jsdevtools/ono": { @@ -17491,10 +18024,56 @@ "source-map": "^0.5.0" } }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } } } }, @@ -17532,6 +18111,20 @@ "fastq": "^1.6.0" } }, + "@pkgr/utils": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", + "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "is-glob": "^4.0.3", + "open": "^8.4.0", + "picocolors": "^1.0.0", + "tiny-glob": "^0.2.9", + "tslib": "^2.4.0" + } + }, "@polka/url": { "version": "1.0.0-next.21", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", @@ -17555,161 +18148,144 @@ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, "@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.4.tgz", - "integrity": "sha512-FvMavoWEIePps6/JwGCOLYKCRhuwIHhMtmbKpBFgzNkxwpa/569LfTkrbRk1m1I3n+ezJK4on9E1A6cjuZmD9g==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", + "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", "requires": { - "bluebird": "^3.7.1", - "cheerio": "^0.22.0", "eval": "^0.1.8", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" } }, "@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", - "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-Cp1JR1IPrQNvPRbkfcPmax52iunBC+eQDyBce8feOIIbVH6ZpVhErYoJtPWRBj2rKi4Wi9HvCm1+L1UD6QlBmg==", "requires": {} }, "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", - "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==", "requires": {} }, "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", - "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz", + "integrity": "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==", "requires": {} }, "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", - "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.0.tgz", + "integrity": "sha512-XWm64/rSPUCQ+MFyA9lhMO+w8bOZvkTvovRIU1lpIy63ysPaVAFtxjQiZj+S7QaLaLGUXkSkf8WZsaN+QPo/gA==", "requires": {} }, "@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", - "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.0.tgz", + "integrity": "sha512-JIF2D2ltiWFGlTw2fJ9jJg1fNT9rWjOD2Cf0/xzeW6Z2LIRQTHcRHxpZq359+SRWtEPsCXEWV2Xmd+DMBj6dBw==", "requires": {} }, "@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", - "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.0.tgz", + "integrity": "sha512-uuo0FfLP4Nu2zncOcoUFDzZdXWma2bxkTGk0etRThs4/PghvPIGaW8cPhCg6yJ8zpaauWcKV0wZtzKlJRCtVzg==", "requires": {} }, "@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", - "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.0.tgz", + "integrity": "sha512-VMRWyOmrV+DaEFPgP3hZMsFgs2g87ojs3txw0Rx8iz6Nf/E3UoHUwTqpkSCWd3Hsnc9gMOY9+wl6+/Ycleh1sw==", "requires": {} }, "@svgr/babel-plugin-transform-svg-component": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", - "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.0.tgz", + "integrity": "sha512-b67Ul3SelaqvGEEG/1B3VJ03KUtGFgRQjRLCCjdttMQLcYa9l/izQFEclNFx53pNqhijUMNKHPhGMY/CWGVKig==", "requires": {} }, "@svgr/babel-preset": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz", - "integrity": "sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.0.tgz", + "integrity": "sha512-UWM98PKVuMqw2UZo8YO3erI6nF1n7/XBYTXBqR0QhZP7HTjYK6QxFNvPfIshddy1hBdzhVpkf148Vg8xiVOtyg==", "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^6.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "^6.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "^6.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "^6.0.0", - "@svgr/babel-plugin-transform-svg-component": "^6.2.0" + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^6.5.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.5.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.0", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.0", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.0", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.0", + "@svgr/babel-plugin-transform-svg-component": "^6.5.0" } }, "@svgr/core": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz", - "integrity": "sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.0.tgz", + "integrity": "sha512-jIbu36GMjfK8HCCQitkfVVeQ2vSXGfq0ef0GO9HUxZGjal6Kvpkk4PwpkFP+OyCzF+skQFT9aWrUqekT3pKF8w==", "requires": { - "@svgr/plugin-jsx": "^6.2.1", + "@babel/core": "^7.18.5", + "@svgr/babel-preset": "^6.5.0", + "@svgr/plugin-jsx": "^6.5.0", "camelcase": "^6.2.0", "cosmiconfig": "^7.0.1" } }, "@svgr/hast-util-to-babel-ast": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz", - "integrity": "sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.0.tgz", + "integrity": "sha512-PPy94U/EiPQ2dY0b4jEqj4QOdDRq6DG7aTHjpGaL8HlKSHkpU1DpjfywCXTJqtOdCo2FywjWvg0U2FhqMeUJaA==", "requires": { - "@babel/types": "^7.15.6", - "entities": "^3.0.1" - }, - "dependencies": { - "entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" - } + "@babel/types": "^7.18.4", + "entities": "^4.3.0" } }, "@svgr/plugin-jsx": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz", - "integrity": "sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.0.tgz", + "integrity": "sha512-1CHMqOBKoNk/ZPU+iGXKcQPC6q9zaD7UOI99J+BaGY5bdCztcf5bZyi0QZSDRJtCQpdofeVv7XfBYov2mtl0Pw==", "requires": { - "@babel/core": "^7.15.5", - "@svgr/babel-preset": "^6.2.0", - "@svgr/hast-util-to-babel-ast": "^6.2.1", - "svg-parser": "^2.0.2" + "@babel/core": "^7.18.5", + "@svgr/babel-preset": "^6.5.0", + "@svgr/hast-util-to-babel-ast": "^6.5.0", + "svg-parser": "^2.0.4" } }, "@svgr/plugin-svgo": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz", - "integrity": "sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.0.tgz", + "integrity": "sha512-8Zv1Yyv6I7HlIqrqGFM0sDKQrhjbfNZJawR8UjIaVWSb0tKZP1Ra6ymhqIFu6FT6kDRD0Ct5NlQZ10VUujSspw==", "requires": { "cosmiconfig": "^7.0.1", "deepmerge": "^4.2.2", - "svgo": "^2.5.0" + "svgo": "^2.8.0" } }, "@svgr/webpack": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.2.1.tgz", - "integrity": "sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.0.tgz", + "integrity": "sha512-rM/Z4pwMhqvAXEHoHIlE4SeTb0ToQNmJuBdiHwhP2ZtywyX6XqrgCv2WX7K/UCgNYJgYbekuylgyjnuLUHTcZQ==", "requires": { - "@babel/core": "^7.15.5", - "@babel/plugin-transform-react-constant-elements": "^7.14.5", - "@babel/preset-env": "^7.15.6", - "@babel/preset-react": "^7.14.5", - "@babel/preset-typescript": "^7.15.0", - "@svgr/core": "^6.2.1", - "@svgr/plugin-jsx": "^6.2.1", - "@svgr/plugin-svgo": "^6.2.0" + "@babel/core": "^7.18.5", + "@babel/plugin-transform-react-constant-elements": "^7.17.12", + "@babel/preset-env": "^7.18.2", + "@babel/preset-react": "^7.17.12", + "@babel/preset-typescript": "^7.17.12", + "@svgr/core": "^6.5.0", + "@svgr/plugin-jsx": "^6.5.0", + "@svgr/plugin-svgo": "^6.5.0" } }, "@szmarczak/http-timer": { @@ -17726,11 +18302,20 @@ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, "@tsconfig/docusaurus": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.5.tgz", - "integrity": "sha512-KM/TuJa9fugo67dTGx+ktIqf3fVc077J6jwHu845Hex4EQf7LABlNonP/mohDKT0cmncdtlYVHHF74xR/YpThg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.6.tgz", + "integrity": "sha512-1QxDaP54hpzM6bq9E+yFEo4F9WbWHhsDe4vktZXF/iDlc9FqGr9qlg+3X/nuKQXx8QxHV7ue8NXFazzajsxFBA==", "dev": true }, + "@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, "@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -17765,33 +18350,51 @@ "@types/node": "*" } }, + "@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "requires": { + "@types/ms": "*" + } + }, "@types/eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "version": "8.4.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.8.tgz", + "integrity": "sha512-zUCKQI1bUCTi+0kQs5ZQzQ/XILWRLIlh15FXWNykJ+NG3TMKMVvwwC6GP3DR1Ylga15fB7iAExSzc4PNlR5i3w==", "requires": { "@types/estree": "*", "@types/json-schema": "*" } }, "@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "requires": { "@types/eslint": "*", "@types/estree": "*" } }, "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + }, + "@types/estree-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.0.tgz", + "integrity": "sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } }, "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -17800,9 +18403,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", "requires": { "@types/node": "*", "@types/qs": "*", @@ -17810,9 +18413,9 @@ } }, "@types/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.0.0.tgz", + "integrity": "sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -17828,9 +18431,9 @@ } }, "@types/history": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", - "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==" + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" }, "@types/html-minifier-terser": { "version": "6.1.0", @@ -17845,6 +18448,27 @@ "@types/node": "*" } }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, "@types/js-yaml": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", @@ -17852,39 +18476,45 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", + "version": "4.14.186", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz", + "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==", "dev": true }, "@types/mdast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", - "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", "requires": { "@types/unist": "*" } }, "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", "dev": true }, "@types/node": { - "version": "17.0.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz", - "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==" + "version": "18.11.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.5.tgz", + "integrity": "sha512-3JRwhbjI+cHLAkUorhf8RnqUbFXajvzX4q6fMn5JwkgtuwfYtRQYI3u4V92vI6NJuTsbBQWWh3RZjFsuevyMGQ==" }, "@types/parse-json": { "version": "4.0.0", @@ -17897,15 +18527,15 @@ "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" }, "@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", "dev": true }, "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "@types/qs": { "version": "6.9.7", @@ -17918,9 +18548,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz", - "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==", + "version": "17.0.51", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.51.tgz", + "integrity": "sha512-YMddzAE+nSH04BiTJ5GydTxk0/3hckqyuOclg0s6zQYj/XzfRVNzHZAFwZb5SCSavkzTYUtcq/gwjLnvt2Y4cg==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -17937,11 +18567,11 @@ } }, "@types/react-router": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.13.tgz", - "integrity": "sha512-ZIuaO9Yrln54X6elg8q2Ivp6iK6p4syPsefEYAhRDAoqNh48C8VYUmB9RkXjKSQAJSJV0mbIFCX7I4vZDcHrjg==", + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.19.tgz", + "integrity": "sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA==", "requires": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*" } }, @@ -17953,21 +18583,14 @@ "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "*" - }, - "dependencies": { - "@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" - } } }, "@types/react-router-dom": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", - "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", "requires": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "*" } @@ -17986,9 +18609,9 @@ } }, "@types/scheduler": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", - "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "@types/serve-index": { "version": "1.9.1", @@ -17999,11 +18622,11 @@ } }, "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", "requires": { - "@types/mime": "^1", + "@types/mime": "*", "@types/node": "*" } }, @@ -18016,9 +18639,9 @@ } }, "@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, "@types/ws": { "version": "8.5.3", @@ -18028,6 +18651,19 @@ "@types/node": "*" } }, + "@types/yargs": { + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -18176,12 +18812,27 @@ "requires": { "mime-types": "~2.1.34", "negotiator": "0.6.3" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + } } }, "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" }, "acorn-import-assertions": { "version": "1.8.0", @@ -18202,9 +18853,9 @@ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" }, "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==" }, "aggregate-error": { "version": "3.1.0", @@ -18259,30 +18910,30 @@ "requires": {} }, "algoliasearch": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.13.1.tgz", - "integrity": "sha512-dtHUSE0caWTCE7liE1xaL+19AFf6kWEcyn76uhcitWpntqvicFHXKFoZe5JJcv9whQOTRM6+B8qJz6sFj+rDJA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", + "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", "requires": { - "@algolia/cache-browser-local-storage": "4.13.1", - "@algolia/cache-common": "4.13.1", - "@algolia/cache-in-memory": "4.13.1", - "@algolia/client-account": "4.13.1", - "@algolia/client-analytics": "4.13.1", - "@algolia/client-common": "4.13.1", - "@algolia/client-personalization": "4.13.1", - "@algolia/client-search": "4.13.1", - "@algolia/logger-common": "4.13.1", - "@algolia/logger-console": "4.13.1", - "@algolia/requester-browser-xhr": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/requester-node-http": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/cache-browser-local-storage": "4.14.2", + "@algolia/cache-common": "4.14.2", + "@algolia/cache-in-memory": "4.14.2", + "@algolia/client-account": "4.14.2", + "@algolia/client-analytics": "4.14.2", + "@algolia/client-common": "4.14.2", + "@algolia/client-personalization": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/logger-common": "4.14.2", + "@algolia/logger-console": "4.14.2", + "@algolia/requester-browser-xhr": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/requester-node-http": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "algoliasearch-helper": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.8.2.tgz", - "integrity": "sha512-AXxiF0zT9oYwl8ZBgU/eRXvfYhz7cBA5YrLPlw9inZHdaYF0QEya/f1Zp1mPYMXc1v6VkHwBq4pk6/vayBLICg==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", + "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", "requires": { "@algolia/events": "^4.0.1" } @@ -18293,14 +18944,25 @@ "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "requires": { "string-width": "^4.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } } }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "devOptional": true - }, "ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -18322,7 +18984,7 @@ "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true }, "anymatch": { @@ -18335,9 +18997,9 @@ } }, "arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "argparse": { "version": "2.0.1", @@ -18360,18 +19022,6 @@ "es-abstract": "^1.19.5", "get-intrinsic": "^1.1.1", "is-string": "^1.0.7" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } } }, "array-union": { @@ -18396,24 +19046,18 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "devOptional": true - }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "autoprefixer": { - "version": "10.4.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", - "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", + "version": "10.4.12", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", + "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", "requires": { - "browserslist": "^4.20.3", - "caniuse-lite": "^1.0.30001335", + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001407", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -18437,18 +19081,6 @@ "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" - }, - "dependencies": { - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - } } }, "babel-plugin-apply-mdx-type-prop": { @@ -18458,6 +19090,13 @@ "requires": { "@babel/helper-plugin-utils": "7.10.4", "@mdx-js/util": "1.6.22" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "babel-plugin-dynamic-import-node": { @@ -18474,15 +19113,22 @@ "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", "requires": { "@babel/helper-plugin-utils": "7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" }, "dependencies": { @@ -18494,20 +19140,20 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "@babel/helper-define-polyfill-provider": "^0.3.3" } }, "bail": { @@ -18540,15 +19186,10 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -18558,7 +19199,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -18585,20 +19226,20 @@ } }, "bonjour-service": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz", - "integrity": "sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", "requires": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.4" + "multicast-dns": "^7.2.5" } }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "boxen": { "version": "6.2.1", @@ -18613,36 +19254,6 @@ "type-fest": "^2.5.0", "widest-line": "^4.0.1", "wrap-ansi": "^8.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "type-fest": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.12.2.tgz", - "integrity": "sha512-qt6ylCGpLjZ7AaODxbpyBZSs9fCI9SkL3Z9q2oxMBQhs/uyY+VD8jHA8ULCGmWQJlBgqvO3EJeAngOHD8zQCrQ==" - } } }, "brace-expansion": { @@ -18663,26 +19274,25 @@ } }, "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" } }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" }, "cacheable-request": { "version": "6.1.0", @@ -18730,7 +19340,7 @@ "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", "dev": true }, "callsites": { @@ -18769,9 +19379,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001346", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001346.tgz", - "integrity": "sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ==" + "version": "1.0.30001425", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz", + "integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==" }, "ccount": { "version": "1.1.0", @@ -18785,16 +19395,6 @@ "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } } }, "character-entities": { @@ -18803,9 +19403,9 @@ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" }, "character-entities-html4": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", - "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "dev": true }, "character-entities-legacy": { @@ -18819,80 +19419,17 @@ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" }, "cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - } + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" } }, "cheerio-select": { @@ -18906,53 +19443,6 @@ "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" - }, - "dependencies": { - "css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==" - } } }, "chokidar": { @@ -18971,43 +19461,26 @@ } }, "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==" }, "classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" }, "clean-css": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", - "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", + "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", "requires": { "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } }, "clean-stack": { @@ -19021,34 +19494,42 @@ "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==" }, "cli-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", - "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", "dev": true, "requires": { - "ansi-regex": "^2.1.1", "d": "^1.0.1", - "es5-ext": "^0.10.51", + "es5-ext": "^0.10.61", "es6-iterator": "^2.0.3", - "memoizee": "^0.4.14", + "memoizee": "^0.4.15", "timers-ext": "^0.1.7" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } } }, "cli-table3": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", - "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "requires": { "@colors/colors": "1.5.0", "string-width": "^4.2.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } } }, "clone-deep": { @@ -19062,17 +19543,17 @@ } }, "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "requires": { "mimic-response": "^1.0.0" } }, "clsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", - "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" }, "collapse-white-space": { "version": "1.0.6", @@ -19093,14 +19574,14 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==" + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, "combine-promises": { "version": "1.1.0", @@ -19128,6 +19609,13 @@ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "requires": { "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + } } }, "compression": { @@ -19156,13 +19644,18 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "configstore": { "version": "5.0.1", @@ -19178,9 +19671,9 @@ } }, "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" }, "consola": { "version": "2.15.3", @@ -19190,7 +19683,7 @@ "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==" }, "content-type": { "version": "1.0.4", @@ -19198,12 +19691,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "cookie": { "version": "0.5.0", @@ -19221,9 +19711,9 @@ "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==" }, "copy-to-clipboard": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", - "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.2.tgz", + "integrity": "sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg==", "requires": { "toggle-selection": "^1.0.6" } @@ -19269,9 +19759,9 @@ } }, "globby": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz", - "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", "requires": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -19280,11 +19770,6 @@ "slash": "^4.0.0" } }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -19309,30 +19794,22 @@ } }, "core-js": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz", - "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==" + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.0.tgz", + "integrity": "sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw==" }, "core-js-compat": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.8.tgz", - "integrity": "sha512-pQnwg4xtuvc2Bs/5zYQPaEYYSuTxsF7LBWF0SvnVhthZo/Qe+rJpcEekrdNK5DWwDJ0gv0oI9NNX5Mppdy0ctg==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz", + "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==", "requires": { - "browserslist": "^4.20.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } + "browserslist": "^4.21.4" } }, "core-js-pure": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.8.tgz", - "integrity": "sha512-bOxbZIy9S5n4OVH63XaLVXZ49QKicjowDx/UELyJ68vxfCRpYsbyh/WNZNfEfAk+ekA8vSjt+gCDpvh672bc3w==" + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz", + "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==" }, "core-util-is": { "version": "1.0.3", @@ -19375,9 +19852,9 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" }, "css-declaration-sorter": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", "requires": {} }, "css-loader": { @@ -19396,13 +19873,13 @@ } }, "css-minimizer-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", "requires": { "cssnano": "^5.1.8", - "jest-worker": "^27.5.1", - "postcss": "^8.4.13", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1" @@ -19442,23 +19919,18 @@ "ajv-formats": "^2.1.1", "ajv-keywords": "^5.0.0" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "requires": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, @@ -19469,13 +19941,6 @@ "requires": { "mdn-data": "2.0.14", "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } }, "css-what": { @@ -19489,22 +19954,22 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssnano": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.10.tgz", - "integrity": "sha512-ACpnRgDg4m6CZD/+8SgnLcGCgy6DDGdkMbOawwdvVxNietTNLe/MtWcenp6qT0PRt5wzhGl6/cjMWCdhKXC9QA==", + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", + "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", "requires": { - "cssnano-preset-default": "^5.2.10", + "cssnano-preset-default": "^5.2.12", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-advanced": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.6.tgz", - "integrity": "sha512-OZHsytu16eStRVrIY3wmPQqhJMaI0+O3raU4JHoKV3uuQYEeQek/FJVUIvYXD55hWR6OjCMyKYNRDw+k3/xgUw==", + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz", + "integrity": "sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==", "requires": { "autoprefixer": "^10.3.7", - "cssnano-preset-default": "^5.2.10", + "cssnano-preset-default": "^5.2.12", "postcss-discard-unused": "^5.1.0", "postcss-merge-idents": "^5.1.1", "postcss-reduce-idents": "^5.2.0", @@ -19512,11 +19977,11 @@ } }, "cssnano-preset-default": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.10.tgz", - "integrity": "sha512-H8TJRhTjBKVOPltp9vr9El9I+IfYsOMhmXdK0LwdvwJcxYX9oWkY7ctacWusgPWAgQq1vt/WO8v+uqpfLnM7QA==", + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", + "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", "requires": { - "css-declaration-sorter": "^6.2.2", + "css-declaration-sorter": "^6.3.0", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", @@ -19525,7 +19990,7 @@ "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.5", + "postcss-merge-longhand": "^5.1.6", "postcss-merge-rules": "^5.1.2", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", @@ -19533,14 +19998,14 @@ "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.0", - "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", "postcss-normalize-unicode": "^5.1.0", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.1", + "postcss-ordered-values": "^5.1.3", "postcss-reduce-initial": "^5.1.0", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", @@ -19562,9 +20027,9 @@ } }, "csstype": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", - "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, "d": { "version": "1.0.1", @@ -19577,17 +20042,34 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, + "decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dev": true, + "requires": { + "character-entities": "^2.0.0" + }, + "dependencies": { + "character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true + } + } + }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "requires": { "mimic-response": "^1.0.0" } @@ -19598,9 +20080,9 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "devOptional": true }, "deepmerge": { @@ -19627,11 +20109,12 @@ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "del": { @@ -19654,6 +20137,12 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true + }, "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -19673,27 +20162,12 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "requires": { "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } + "debug": "4" } }, "detect-port-alt": { @@ -19720,6 +20194,12 @@ } } }, + "diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -19734,9 +20214,9 @@ "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" }, "dns-packet": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", - "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", "requires": { "@leichtgewicht/ip-codec": "^2.0.1" } @@ -19759,13 +20239,13 @@ } }, "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" } }, "domelementtype": { @@ -19774,21 +20254,21 @@ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" }, "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "requires": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" } }, "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" } }, "dot-case": { @@ -19821,9 +20301,9 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" }, "eastasianwidth": { "version": "0.2.0", @@ -19836,9 +20316,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.4.144", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.144.tgz", - "integrity": "sha512-R3RV3rU1xWwFJlSClVWDvARaOk6VUO/FubHLodIASDB3Mc2dzuWvNdfOgH9bwHUTqT79u92qw60NWfwUdzAqdg==" + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, "emoji-regex": { "version": "9.2.2", @@ -19868,19 +20348,19 @@ "once": "^1.4.0" } }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "devOptional": true, + "enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "requires": { - "ansi-colors": "^4.1.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } }, "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" }, "error-ex": { "version": "1.3.2", @@ -19891,42 +20371,35 @@ } }, "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } } }, "es-module-lexer": { @@ -19955,20 +20428,20 @@ } }, "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", "dev": true, "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" } }, "es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dev": true, "requires": { "d": "1", @@ -20011,7 +20484,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { "version": "4.0.0", @@ -20019,89 +20492,75 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", + "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", "devOptional": true, "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.15.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "devOptional": true, "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "devOptional": true, - "requires": { - "sprintf-js": "~1.0.2" + "is-glob": "^4.0.3" } }, "globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "devOptional": true, "requires": { "type-fest": "^0.20.2" } }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "devOptional": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "devOptional": true } } }, @@ -20113,61 +20572,315 @@ "requires": {} }, "eslint-mdx": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-1.17.0.tgz", - "integrity": "sha512-O8+JRfwCzpoR2P6zUI1GDAAM/bsuzcoBS1ArvpQrgQO/E2Km0vBmM15ukiJxZ+YUh5d+qDlrqha0fZB50MojJQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-2.0.5.tgz", + "integrity": "sha512-1ZzcJwJNfladtuK+uuG/MdC0idc1e3d1vCI2STOq/pLcJBGuao2biWh90vEh2M93zDiNoHJGUIU7UAxupiiHFw==", "dev": true, "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", "cosmiconfig": "^7.0.1", - "remark-mdx": "^1.6.22", - "remark-parse": "^8.0.3", - "remark-stringify": "^8.1.1", - "tslib": "^2.3.1", - "unified": "^9.2.2" + "espree": "^9.4.0", + "estree-util-visit": "^1.2.0", + "remark-mdx": "^2.1.3", + "remark-parse": "^10.0.1", + "remark-stringify": "^10.0.2", + "synckit": "^0.8.4", + "tslib": "^2.4.0", + "unified": "^10.1.2", + "unist-util-visit": "^4.1.1", + "uvu": "^0.5.6", + "vfile": "^5.3.4" }, "dependencies": { - "unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true + }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true + }, + "mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", "dev": true, "requires": { - "bail": "^1.0.0", + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + } + }, + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true + }, + "micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "requires": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "remark-mdx": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.1.5.tgz", + "integrity": "sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==", + "dev": true, + "requires": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + } + }, + "remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + } + }, + "trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true + }, + "unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", "extend": "^3.0.0", "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + } + }, + "unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + } + }, + "unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" } } } }, "eslint-plugin-markdown": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-2.2.1.tgz", - "integrity": "sha512-FgWp4iyYvTFxPwfbxofTvXxgzPsDuSKHQy2S+a8Ve6savbujey+lgrFFbXQA0HPygISpRYWYBjooPzhYSF81iA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-3.0.0.tgz", + "integrity": "sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==", "dev": true, "requires": { "mdast-util-from-markdown": "^0.8.5" } }, "eslint-plugin-mdx": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-1.17.0.tgz", - "integrity": "sha512-Kicizy+fbfsB2UxTDXP92qTtFqITApu4v4DRQUfXMoPwBHeQRvZnaEtXu2S9aia51GYRYsMSqUvoPPih/5oB+g==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-2.0.5.tgz", + "integrity": "sha512-j2xN97jSlc5IoH94rJTHqYMztl46+hHzyC8Zqjx+OI1Rvv33isyf8xSSBHN6f0z8IJmgPgGsb/fH90JbvKplXg==", "dev": true, "requires": { - "eslint-mdx": "^1.17.0", - "eslint-plugin-markdown": "^2.2.1", - "synckit": "^0.4.1", - "tslib": "^2.3.1", - "vfile": "^4.2.1" + "eslint-mdx": "^2.0.5", + "eslint-plugin-markdown": "^3.0.0", + "remark-mdx": "^2.1.3", + "remark-parse": "^10.0.1", + "remark-stringify": "^10.0.2", + "tslib": "^2.4.0", + "unified": "^10.1.2", + "vfile": "^5.3.4" + }, + "dependencies": { + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true + }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true + }, + "mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + } + }, + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true + }, + "micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "requires": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "remark-mdx": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.1.5.tgz", + "integrity": "sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==", + "dev": true, + "requires": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + } + }, + "remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + } + }, + "trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true + }, + "unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + } + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + } } }, "eslint-plugin-react": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", - "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==", + "version": "7.31.10", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", + "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", "dev": true, "requires": { "array-includes": "^3.1.5", @@ -20195,40 +20908,15 @@ "esutils": "^2.0.2" } }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, "resolve": { - "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", "dev": true, "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "semver": { @@ -20240,60 +20928,47 @@ } }, "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "devOptional": true, "requires": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "devOptional": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "devOptional": true } } }, "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "devOptional": true }, "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "devOptional": true, "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "devOptional": true - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "devOptional": true - } + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" } }, "esprima": { @@ -20308,14 +20983,6 @@ "devOptional": true, "requires": { "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "devOptional": true - } } }, "esrecurse": { @@ -20324,19 +20991,28 @@ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "requires": { "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } } }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "estree-util-is-identifier-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.0.1.tgz", + "integrity": "sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ==", + "dev": true + }, + "estree-util-visit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.0.tgz", + "integrity": "sha512-wdsoqhWueuJKsh5hqLw3j8lwFqNStm92VcwtAOAny8g/KS/l5Y8RISjR4k5W6skCj3Nirag/WUCMS0Nfy3sgsg==", + "dev": true, + "requires": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^2.0.0" + } }, "esutils": { "version": "2.0.3", @@ -20365,7 +21041,7 @@ "event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", "dev": true, "requires": { "d": "1", @@ -20406,13 +21082,13 @@ } }, "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -20431,7 +21107,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -20478,27 +21154,22 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "dev": true, "requires": { - "type": "^2.0.0" + "type": "^2.7.2" }, "dependencies": { "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", "dev": true } } @@ -20522,9 +21193,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -20541,13 +21212,13 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "devOptional": true }, "fast-url-parser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", "requires": { "punycode": "^1.3.2" } @@ -20619,6 +21290,18 @@ "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "filesize": { @@ -20674,11 +21357,11 @@ } }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, @@ -20693,9 +21376,9 @@ } }, "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "devOptional": true }, "flux": { @@ -20708,9 +21391,9 @@ } }, "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "fork-ts-checker-webpack-plugin": { "version": "6.5.2", @@ -20805,7 +21488,13 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true }, "function-bind": { "version": "1.1.1", @@ -20824,12 +21513,6 @@ "functions-have-names": "^1.2.2" } }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "devOptional": true - }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -20842,13 +21525,13 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" } }, "get-own-enumerable-property-symbols": { @@ -20881,19 +21564,19 @@ } }, "github-slugger": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", - "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -20968,6 +21651,12 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, + "globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -20979,15 +21668,14 @@ "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" - } } }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -21007,9 +21695,15 @@ } }, "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "devOptional": true }, "gray-matter": { "version": "4.0.3", @@ -21077,15 +21771,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, "requires": { "get-intrinsic": "^1.1.1" } }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { "version": "1.0.0", @@ -21126,6 +21819,28 @@ "vfile": "^4.0.0", "vfile-location": "^3.2.0", "web-namespaces": "^1.0.0" + }, + "dependencies": { + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } } }, "hast-util-parse-selector": { @@ -21148,6 +21863,33 @@ "web-namespaces": "^1.0.0", "xtend": "^4.0.0", "zwitch": "^1.0.0" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } } }, "hast-util-to-parse5": { @@ -21230,6 +21972,11 @@ "util-deprecate": "~1.0.1" } }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -21289,66 +22036,14 @@ } }, "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - } + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" } }, "http-cache-semantics": { @@ -21374,9 +22069,9 @@ } }, "http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" }, "http-proxy": { "version": "1.18.1", @@ -21427,23 +22122,22 @@ "requires": {} }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "devOptional": true + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" }, "image-size": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.1.tgz", - "integrity": "sha512-VAwkvNSNGClRw9mDHhc5Efax8PLlsOGcUTh0T/LIriC8vPA3U5PdqXWqkz406MoYHMKW8Uf9gWr05T/rYB44kQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", + "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", "requires": { "queue": "6.0.2" } }, "immer": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.14.tgz", - "integrity": "sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw==" + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.16.tgz", + "integrity": "sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ==" }, "import-fresh": { "version": "3.3.0", @@ -21457,12 +22151,12 @@ "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==" }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" }, "indent-string": { "version": "4.0.0", @@ -21470,14 +22164,14 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, "infima": { - "version": "0.2.0-alpha.39", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.39.tgz", - "integrity": "sha512-UyYiwD3nwHakGhuOUfpe3baJ8gkiPpRVx4a4sE/Ag+932+Y6swtLsdPoRR8ezhwqGnduzxmFkjumV9roz6QoLw==" + "version": "0.2.0-alpha.42", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", + "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" @@ -21532,12 +22226,6 @@ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" }, - "is-alphanumeric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", - "dev": true - }, "is-alphanumerical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", @@ -21550,7 +22238,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-bigint": { "version": "1.0.4", @@ -21585,9 +22273,9 @@ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-ci": { @@ -21596,12 +22284,19 @@ "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "requires": { "ci-info": "^2.0.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + } } }, "is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "requires": { "has": "^1.0.3" } @@ -21633,7 +22328,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -21776,7 +22471,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "is-weakref": { "version": "1.0.2", @@ -21813,24 +22508,38 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "jest-util": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", + "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", + "requires": { + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } }, "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", "requires": { "@types/node": "*", + "jest-util": "^29.2.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -21846,9 +22555,9 @@ } }, "joi": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", - "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "version": "17.6.4", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.4.tgz", + "integrity": "sha512-tPzkTJHZQjSFCc842QpdVpOZ9LI2txApboNUbW70qgnRB14Lzl+oWQOPdF2N4yqyiY14wBGe8lc7f/2hZxbGmw==", "requires": { "@hapi/hoek": "^9.0.0", "@hapi/topo": "^5.0.0", @@ -21857,6 +22566,12 @@ "@sideway/pinpoint": "^2.0.0" } }, + "js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "devOptional": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -21878,7 +22593,7 @@ "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -21886,12 +22601,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema-ref-parser": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", - "integrity": "sha512-uxU9Ix+MVszvCTvBucQiIcNEny3oAEFg7EQHSZw2bquCCuqUqEPEczIdv/Uqo1Zv4/wDPZqOI+ulrMk1ncMtjQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", "dev": true, "requires": { - "@apidevtools/json-schema-ref-parser": "9.0.7" + "@apidevtools/json-schema-ref-parser": "9.0.9" } }, "json-schema-to-typescript": { @@ -21915,14 +22630,6 @@ "mkdirp": "^1.0.4", "mz": "^2.7.0", "prettier": "^2.2.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } } }, "json-schema-traverse": { @@ -21933,13 +22640,13 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "devOptional": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "json5": { @@ -21957,13 +22664,13 @@ } }, "jsx-ast-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz", - "integrity": "sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", "dev": true, "requires": { - "array-includes": "^3.1.4", - "object.assign": "^4.1.2" + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" } }, "keyv": { @@ -22013,24 +22720,24 @@ } }, "lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" }, "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz", + "integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -22038,11 +22745,11 @@ } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, "lodash": { @@ -22050,22 +22757,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" - }, - "lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "devOptional": true - }, "lodash.curry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", @@ -22074,38 +22765,13 @@ "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "lodash.flow": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" - }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -22114,32 +22780,7 @@ "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" - }, - "lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" - }, - "lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" - }, - "lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "devOptional": true }, "lodash.uniq": { @@ -22148,9 +22789,9 @@ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, "longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.0.1.tgz", + "integrity": "sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==", "dev": true }, "loose-envify": { @@ -22185,7 +22826,7 @@ "lru-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", "dev": true, "requires": { "es5-ext": "~0.10.2" @@ -22211,15 +22852,6 @@ "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" }, - "markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dev": true, - "requires": { - "repeat-string": "^1.0.0" - } - }, "mdast-squeeze-paragraphs": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", @@ -22228,15 +22860,6 @@ "unist-util-remove": "^2.0.0" } }, - "mdast-util-compact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", - "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", - "dev": true, - "requires": { - "unist-util-visit": "^2.0.0" - } - }, "mdast-util-definitions": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", @@ -22258,6 +22881,301 @@ "unist-util-stringify-position": "^2.0.0" } }, + "mdast-util-mdx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.0.tgz", + "integrity": "sha512-M09lW0CcBT1VrJUaF/PYxemxxHa7SLDHdSn94Q9FhxjCQfuW7nMAWKWimTmA3OyDMSTH981NN1csW1X+HPSluw==", + "dev": true, + "requires": { + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdx-jsx": "^2.0.0", + "mdast-util-mdxjs-esm": "^1.0.0" + } + }, + "mdast-util-mdx-expression": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.1.tgz", + "integrity": "sha512-TTb6cKyTA1RD+1su1iStZ5PAv3rFfOUKcoU5EstUpv/IZo63uDX03R8+jXjMEhcobXnNOiG6/ccekvVl4eV1zQ==", + "dev": true, + "requires": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "dependencies": { + "mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + } + }, + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true + }, + "micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "requires": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + } + } + }, + "mdast-util-mdx-jsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.0.tgz", + "integrity": "sha512-KzgzfWMhdteDkrY4mQtyvTU5bc/W4ppxhe9SzelO6QUUiwLAM+Et2Dnjjprik74a336kHdo0zKm7Tp+n6FFeRg==", + "dev": true, + "requires": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-to-markdown": "^1.3.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^4.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "dependencies": { + "ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true + }, + "character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true + }, + "character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true + }, + "character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true + }, + "is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true + }, + "is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "requires": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + } + }, + "is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true + }, + "is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true + }, + "parse-entities": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.0.tgz", + "integrity": "sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + } + }, + "unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true + }, + "unist-util-remove-position": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.1.tgz", + "integrity": "sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + } + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + } + }, + "unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + } + } + } + }, + "mdast-util-mdxjs-esm": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.0.tgz", + "integrity": "sha512-7N5ihsOkAEGjFotIX9p/YPdl4TqUoMxL4ajNz7PbT89BqsdWJuBC9rvgt6wpbwTZqWWR0jKWqQbwsOWDBUZv4g==", + "dev": true, + "requires": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "dependencies": { + "mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + } + }, + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true + }, + "micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "requires": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + } + } + }, "mdast-util-to-hast": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", @@ -22273,6 +23191,62 @@ "unist-util-visit": "^2.0.0" } }, + "mdast-util-to-markdown": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz", + "integrity": "sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "dependencies": { + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true + }, + "unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true + }, + "unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + } + }, + "unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + } + }, + "zwitch": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.2.tgz", + "integrity": "sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==", + "dev": true + } + } + }, "mdast-util-to-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", @@ -22294,11 +23268,11 @@ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "memfs": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz", - "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", "requires": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" } }, "memoizee": { @@ -22315,14 +23289,6 @@ "lru-queue": "^0.1.0", "next-tick": "^1.1.0", "timers-ext": "^0.1.7" - }, - "dependencies": { - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - } } }, "merge-descriptors": { @@ -22355,6 +23321,330 @@ "parse-entities": "^2.0.0" } }, + "micromark-core-commonmark": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", + "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", + "dev": true, + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "micromark-extension-mdx-expression": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.3.tgz", + "integrity": "sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA==", + "dev": true, + "requires": { + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-extension-mdx-jsx": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.3.tgz", + "integrity": "sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==", + "dev": true, + "requires": { + "@types/acorn": "^4.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "micromark-extension-mdx-md": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.0.tgz", + "integrity": "sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==", + "dev": true, + "requires": { + "micromark-util-types": "^1.0.0" + } + }, + "micromark-extension-mdxjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.0.tgz", + "integrity": "sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==", + "dev": true, + "requires": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^1.0.0", + "micromark-extension-mdx-jsx": "^1.0.0", + "micromark-extension-mdx-md": "^1.0.0", + "micromark-extension-mdxjs-esm": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-extension-mdxjs-esm": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.3.tgz", + "integrity": "sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==", + "dev": true, + "requires": { + "micromark-core-commonmark": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.1.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "micromark-factory-destination": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", + "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-label": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", + "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-factory-mdx-expression": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.6.tgz", + "integrity": "sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==", + "dev": true, + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "micromark-factory-space": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", + "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-title": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", + "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", + "dev": true, + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-factory-whitespace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", + "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", + "dev": true, + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", + "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", + "dev": true, + "requires": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-chunked": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", + "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", + "dev": true, + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-classify-character": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", + "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-combine-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", + "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", + "dev": true, + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-decode-numeric-character-reference": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", + "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", + "dev": true, + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-decode-string": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", + "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", + "dev": true, + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-encode": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", + "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", + "dev": true + }, + "micromark-util-events-to-acorn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.0.tgz", + "integrity": "sha512-WWp3bf7xT9MppNuw3yPjpnOxa8cj5ACivEzXJKu0WwnjBYfzaBvIAT9KfeyI0Qkll+bfQtfftSwdgTH6QhTOKw==", + "dev": true, + "requires": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "estree-util-visit": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-location": "^4.0.0", + "vfile-message": "^3.0.0" + }, + "dependencies": { + "vfile-location": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.0.1.tgz", + "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + } + } + } + }, + "micromark-util-html-tag-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", + "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", + "dev": true + }, + "micromark-util-normalize-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", + "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", + "dev": true, + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-resolve-all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", + "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", + "dev": true, + "requires": { + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-sanitize-uri": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", + "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-subtokenize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", + "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", + "dev": true, + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-util-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", + "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", + "dev": true + }, + "micromark-util-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", + "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", + "dev": true + }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -22370,16 +23660,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" }, "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "1.52.0" + "mime-db": "~1.33.0" } }, "mimic-fn": { @@ -22392,19 +23682,10 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" }, - "mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", - "requires": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" - } - }, "mini-css-extract-plugin": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", - "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", "requires": { "schema-utils": "^4.0.0" }, @@ -22452,22 +23733,34 @@ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true }, "mrmime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz", - "integrity": "sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==" }, "ms": { "version": "2.1.2", @@ -22508,7 +23801,7 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "devOptional": true }, "negotiator": { @@ -22522,9 +23815,9 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, "no-case": { @@ -22558,9 +23851,9 @@ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, "node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, "normalize-path": { "version": "3.0.0", @@ -22591,9 +23884,9 @@ "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" }, "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "requires": { "boolbase": "^1.0.0" } @@ -22606,17 +23899,30 @@ "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-inspect": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", - "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==" + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" }, "object-keys": { "version": "1.1.1", @@ -22624,13 +23930,13 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, @@ -22664,18 +23970,6 @@ "requires": { "define-properties": "^1.1.4", "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } } }, "object.values": { @@ -22710,7 +24004,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "requires": { "wrappy": "1" } @@ -22758,19 +24052,19 @@ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } }, "p-map": { @@ -22860,9 +24154,12 @@ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "requires": { + "entities": "^4.4.0" + } }, "parse5-htmlparser2-tree-adapter": { "version": "7.0.0", @@ -22871,29 +24168,6 @@ "requires": { "domhandler": "^5.0.2", "parse5": "^7.0.0" - }, - "dependencies": { - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==" - }, - "parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", - "requires": { - "entities": "^4.3.0" - } - } } }, "parseurl": { @@ -22918,12 +24192,12 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" }, "path-key": { "version": "3.1.1", @@ -22964,6 +24238,41 @@ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "requires": { "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + } } }, "pkg-up": { @@ -22991,6 +24300,14 @@ "path-exists": "^3.0.0" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -23007,9 +24324,9 @@ } }, "postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", + "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", "requires": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -23078,23 +24395,13 @@ } }, "postcss-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.0.tgz", - "integrity": "sha512-IDyttebFzTSY6DI24KuHUcBjbAev1i+RyICoPEWcAstZsj03r533uMXtDn506l6/wlsRYiS5XBdx7TpccCsyUg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", + "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", "requires": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", "semver": "^7.3.7" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "postcss-merge-idents": { @@ -23107,9 +24414,9 @@ } }, "postcss-merge-longhand": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz", - "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", + "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", "requires": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.0" @@ -23209,17 +24516,17 @@ } }, "postcss-normalize-positions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", - "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-repeat-style": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", - "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", "requires": { "postcss-value-parser": "^4.2.0" } @@ -23267,9 +24574,9 @@ } }, "postcss-ordered-values": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", - "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", "requires": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" @@ -23310,11 +24617,11 @@ } }, "postcss-sort-media-queries": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz", - "integrity": "sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", + "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", "requires": { - "sort-css-media-queries": "2.0.4" + "sort-css-media-queries": "2.1.0" } }, "postcss-svgo": { @@ -23365,7 +24672,7 @@ "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" }, "prettier": { "version": "2.3.1", @@ -23388,27 +24695,21 @@ "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" }, "prism-react-renderer": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.3.tgz", - "integrity": "sha512-Viur/7tBTCH2HmYzwCHmt2rEFn+rdIWNIINXyg0StiISbDiIhHKhrFuEK8eMkKgvsIYSjgGqy/hNyucHp6FpoQ==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", "requires": {} }, "prismjs": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", - "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==" + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "devOptional": true - }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -23427,13 +24728,13 @@ } }, "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "react-is": "^16.13.1" } }, "property-information": { @@ -23472,7 +24773,7 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "pupa": { "version": "2.1.1", @@ -23488,9 +24789,9 @@ "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" }, "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "requires": { "side-channel": "^1.0.4" } @@ -23519,7 +24820,7 @@ "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==" }, "raw-body": { "version": "2.5.1", @@ -23553,7 +24854,7 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" } } }, @@ -23575,7 +24876,7 @@ "react-base16-styling": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", - "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=", + "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", "requires": { "base16": "^1.0.0", "lodash.curry": "^4.0.1", @@ -23584,12 +24885,12 @@ } }, "react-copy-to-clipboard": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.3.tgz", - "integrity": "sha512-9S3j+m+UxDZOM0Qb8mhnT/rMR0NGSrj9A/073yz2DSxPMYhmYFBMYIdI2X4o8AjOjyFsSNxDRnCX6s/gRxpriw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", + "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", "requires": { - "copy-to-clipboard": "^3", - "prop-types": "^15.5.8" + "copy-to-clipboard": "^3.3.1", + "prop-types": "^15.8.1" } }, "react-dev-utils": { @@ -23623,43 +24924,10 @@ "text-table": "^0.2.0" }, "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, "loader-utils": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==" - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } } } }, @@ -23734,15 +25002,14 @@ } }, "react-router": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz", - "integrity": "sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "requires": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", "path-to-regexp": "^1.7.0", "prop-types": "^15.6.2", "react-is": "^16.6.0", @@ -23759,15 +25026,15 @@ } }, "react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", "requires": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", "loose-envify": "^1.3.1", "prop-types": "^15.6.2", - "react-router": "5.3.3", + "react-router": "5.3.4", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" } @@ -23816,17 +25083,17 @@ "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "requires": { "resolve": "^1.1.6" } }, "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.5" } }, "regenerate": { @@ -23835,17 +25102,17 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "requires": { "regenerate": "^1.4.2" } }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" }, "regenerator-transform": { "version": "0.15.0", @@ -23873,24 +25140,24 @@ "devOptional": true }, "regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", + "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", "requires": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.0.0" } }, "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", "requires": { - "rc": "^1.2.8" + "rc": "1.2.8" } }, "registry-url": { @@ -23902,14 +25169,14 @@ } }, "regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==" }, "regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "requires": { "jsesc": "~0.5.0" }, @@ -23917,78 +25184,14 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } - }, - "rehype-parse": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", - "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", - "requires": { - "hast-util-from-parse5": "^5.0.0", - "parse5": "^5.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "hast-util-from-parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", - "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", - "requires": { - "ccount": "^1.0.3", - "hastscript": "^5.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.1.2", - "xtend": "^4.0.1" - } - }, - "hastscript": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", - "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", - "requires": { - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - } - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" } } }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" - }, - "remark-admonitions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", - "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", - "requires": { - "rehype-parse": "^6.0.2", - "unified": "^8.4.2", - "unist-util-visit": "^2.0.1" - }, - "dependencies": { - "unified": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", - "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - } - } + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" }, "remark-emoji": { "version": "2.2.0", @@ -24043,10 +25246,71 @@ "source-map": "^0.5.0" } }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } } } }, @@ -24082,25 +25346,49 @@ } }, "remark-stringify": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", - "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.2.tgz", + "integrity": "sha512-6wV3pvbPvHkbNnWB0wdDvVFHOe1hBRAx1Q/5g/EpH4RppAII6J8Gnwe7VbHuXaoKIF6LAg6ExTel/+kNqSQ7lw==", "dev": true, "requires": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^2.0.0", - "mdast-util-compact": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^3.0.0", - "unherit": "^1.0.4", - "xtend": "^4.0.1" + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "dependencies": { + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true + }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true + }, + "trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true + }, + "unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + } + } } }, "renderkid": { @@ -24115,6 +25403,51 @@ "strip-ansi": "^6.0.1" }, "dependencies": { + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, "htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -24131,7 +25464,7 @@ "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" }, "require-from-string": { "version": "2.0.2", @@ -24141,20 +25474,21 @@ "require-like": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=" + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==" }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-from": { @@ -24170,7 +25504,7 @@ "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "requires": { "lowercase-keys": "^1.0.0" } @@ -24207,41 +25541,6 @@ "picocolors": "^1.0.0", "postcss": "^8.3.11", "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - } } }, "run-parallel": { @@ -24253,17 +25552,37 @@ } }, "rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", "requires": { "tslib": "^2.1.0" } }, + "sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "requires": { + "mri": "^1.1.0" + } + }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } }, "safer-buffer": { "version": "2.1.2", @@ -24285,12 +25604,12 @@ } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" } }, @@ -24306,20 +25625,20 @@ "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" }, "selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "requires": { "node-forge": "^1" } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } @@ -24409,17 +25728,12 @@ "range-parser": "1.2.0" }, "dependencies": { - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "mime-db": "~1.33.0" + "brace-expansion": "^1.1.7" } }, "path-to-regexp": { @@ -24432,7 +25746,7 @@ "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "requires": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -24485,7 +25799,7 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" } } }, @@ -24503,7 +25817,7 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "setprototypeof": { "version": "1.2.0", @@ -24537,9 +25851,9 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", + "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==" }, "shelljs": { "version": "0.8.5", @@ -24590,6 +25904,13 @@ "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.2.4" + }, + "dependencies": { + "@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + } } }, "slash": { @@ -24597,17 +25918,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "devOptional": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, "sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -24619,19 +25929,14 @@ } }, "sort-css-media-queries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz", - "integrity": "sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw==" - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==" }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-js": { "version": "1.0.2", @@ -24639,19 +25944,12 @@ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } }, "space-separated-tokens": { @@ -24687,7 +25985,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "stable": { "version": "0.1.8", @@ -24705,9 +26003,9 @@ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "std-env": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.0.1.tgz", - "integrity": "sha512-mC1Ps9l77/97qeOZc+HrOL7TIaOboHqMZ24dGVQrlxFcpPpfCHpH+qfUT7Dz+6mlG8+JPA1KfBQo19iC/+Ngcw==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.0.tgz", + "integrity": "sha512-cNNS+VYsXIs5gI6gJipO4qZ8YYT274JHvNnQ1/R/x8Q8mdP0qj0zoMchRXmBNPqp/0eOEhX+3g7g6Fgb7meLIQ==" }, "string_decoder": { "version": "1.3.0", @@ -24715,13 +26013,6 @@ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } } }, "string-replace-loader": { @@ -24732,22 +26023,43 @@ "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } } } }, @@ -24765,14 +26077,6 @@ "internal-slot": "^1.0.3", "regexp.prototype.flags": "^1.4.1", "side-channel": "^1.0.4" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } } }, "string.prototype.trimend": { @@ -24784,18 +26088,6 @@ "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } } }, "string.prototype.trimstart": { @@ -24807,29 +26099,24 @@ "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } } }, "stringify-entities": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", - "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", "dev": true, "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "xtend": "^4.0.0" + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "dependencies": { + "character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true + } } }, "stringify-object": { @@ -24853,7 +26140,7 @@ "strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==" }, "strip-final-newline": { "version": "2.0.0", @@ -24883,20 +26170,18 @@ } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "has-flag": "^3.0.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - } + "has-flag": "^4.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", @@ -24920,51 +26205,62 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" } } }, "synckit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.4.1.tgz", - "integrity": "sha512-ngUh0+s+DOqEc0sGnrLaeNjbXp0CWHjSGFBqPlQmQ+oN/OfoDoYDBXPh+b4qs1M5QTk5nuQ3AmVz9+2xiY/ldw==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz", + "integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==", "dev": true, "requires": { - "tslib": "^2.3.1", - "uuid": "^8.3.2" - } - }, - "table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "devOptional": true, - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", - "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", - "devOptional": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "devOptional": true - } + "@pkgr/utils": "^2.3.1", + "tslib": "^2.4.0" } }, "tapable": { @@ -24973,9 +26269,9 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", + "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", "requires": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -24991,21 +26287,51 @@ } }, "terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "requires": { - "@jridgewell/trace-mapping": "^0.3.7", + "@jridgewell/trace-mapping": "^0.3.14", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" + "terser": "^5.14.1" + }, + "dependencies": { + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "thenify": { "version": "3.3.1", @@ -25019,7 +26345,7 @@ "thenify-all": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, "requires": { "thenify": ">= 3.1.0 < 4" @@ -25040,10 +26366,20 @@ "next-tick": "1" } }, + "tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "requires": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, "tiny-invariant": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", - "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" }, "tiny-warning": { "version": "1.0.3", @@ -25053,7 +26389,7 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" }, "to-readable-stream": { "version": "1.0.0", @@ -25071,7 +26407,7 @@ "toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, "toidentifier": { "version": "1.0.1", @@ -25086,12 +26422,12 @@ "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" }, "trim-trailing-lines": { "version": "1.1.4", @@ -25124,9 +26460,9 @@ } }, "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" }, "type-is": { "version": "1.6.18", @@ -25135,6 +26471,21 @@ "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + } } }, "typedarray-to-buffer": { @@ -25146,14 +26497,14 @@ } }, "typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==" + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==" }, "ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==" + "version": "0.7.32", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", + "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==" }, "unbox-primitive": { "version": "1.0.2", @@ -25165,14 +26516,6 @@ "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } } }, "unherit": { @@ -25204,14 +26547,14 @@ "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" }, "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" }, "unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", "requires": { "bail": "^1.0.0", "extend": "^3.0.0", @@ -25219,6 +26562,28 @@ "is-plain-obj": "^2.0.0", "trough": "^1.0.0", "vfile": "^4.0.0" + }, + "dependencies": { + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } } }, "unique-string": { @@ -25249,6 +26614,15 @@ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" }, + "unist-util-position-from-estree": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.1.tgz", + "integrity": "sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, "unist-util-remove": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", @@ -25300,7 +26674,16 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } }, "update-notifier": { "version": "5.1.0", @@ -25343,6 +26726,26 @@ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -25364,9 +26767,9 @@ } }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "requires": { "punycode": "^2.1.0" }, @@ -25386,12 +26789,37 @@ "loader-utils": "^2.0.0", "mime-types": "^2.1.27", "schema-utils": "^3.0.0" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", "requires": { "prepend-http": "^2.0.0" } @@ -25419,12 +26847,12 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, "utility-types": { "version": "3.10.0", @@ -25434,18 +26862,32 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "devOptional": true + "uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dev": true, + "requires": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "dependencies": { + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true + } + } }, "value-equal": { "version": "1.0.1", @@ -25455,17 +26897,29 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, "vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.5.tgz", + "integrity": "sha512-U1ho2ga33eZ8y8pkbQLH54uKqGhFJ6GYIHnnG5AhRpAh3OWjkrRHKa/KogbmQn8We+c0KVV3rTOgR9V/WowbXQ==", + "dev": true, "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "dependencies": { + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + } } }, "vfile-location": { @@ -25474,12 +26928,24 @@ "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" }, "vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.2.tgz", + "integrity": "sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==", + "dev": true, "requires": { "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" + "unist-util-stringify-position": "^3.0.0" + }, + "dependencies": { + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + } } }, "wait-on": { @@ -25495,9 +26961,9 @@ } }, "watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -25524,23 +26990,23 @@ "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "webpack": { - "version": "5.72.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", - "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", + "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", + "enhanced-resolve": "^5.10.0", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -25553,7 +27019,7 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { @@ -25562,21 +27028,49 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, - "enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } }, "webpack-bundle-analyzer": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", - "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", "requires": { "acorn": "^8.0.4", "acorn-walk": "^8.0.0", @@ -25632,6 +27126,19 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -25651,14 +27158,15 @@ } }, "webpack-dev-server": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", - "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", @@ -25666,7 +27174,7 @@ "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", + "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", "express": "^4.17.3", "graceful-fs": "^4.2.6", @@ -25677,7 +27185,7 @@ "p-retry": "^4.5.0", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", @@ -25721,9 +27229,9 @@ } }, "ws": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", - "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", + "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", "requires": {} } } @@ -25771,7 +27279,7 @@ "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -25804,31 +27312,6 @@ "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", "requires": { "string-width": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - } - } } }, "wildcard": { @@ -25858,19 +27341,9 @@ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" }, "ansi-styles": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", - "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==" - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" }, "strip-ansi": { "version": "7.0.1", @@ -25885,7 +27358,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "write-file-atomic": { "version": "3.0.3", @@ -25899,9 +27372,9 @@ } }, "ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "requires": {} }, "xdg-basedir": { diff --git a/docs/package.json b/docs/package.json index b2833c30..a6582472 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,8 +15,8 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "^2.0.0-beta.21", - "@docusaurus/preset-classic": "^2.0.0-beta.21", + "@docusaurus/core": "^2.1.0", + "@docusaurus/preset-classic": "^2.1.0", "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.1.18", @@ -43,16 +43,16 @@ ] }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.0.0-beta.21", - "@docusaurus/types": "^2.0.0-beta.21", + "@docusaurus/module-type-aliases": "^2.1.0", + "@docusaurus/types": "^2.1.0", "@tsconfig/docusaurus": "^1.0.5", "@types/js-yaml": "^4.0.5", "@types/react": "^17.0.3", "@types/react-helmet": "^6.1.5", "@types/react-router-dom": "^5.1.7", - "eslint": "^7.32.0", + "eslint": "^8.0.0", "eslint-config-prettier": "^8.5.0", - "eslint-plugin-mdx": "^1.17.0", + "eslint-plugin-mdx": "^2.0.5", "eslint-plugin-react": "^7.30.0", "json-schema-to-typescript": "^10.1.5", "mustache": "^4.2.0", From a02eb282717ccef4dfde175b0a6d74b5ed60a1c8 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 26 Oct 2022 13:55:47 +0000 Subject: [PATCH 095/289] fix(docs): Move to `data-tooltip` for profiler. * Fix ESLint warning by using `data-` prefixed custom attr. --- docs/src/components/custom-board-form.js | 8 ++++---- docs/src/css/power-profiler.css | 12 ++++++------ docs/src/pages/power-profiler.js | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/src/components/custom-board-form.js b/docs/src/components/custom-board-form.js index 0279f6b1..e8ae4294 100644 --- a/docs/src/components/custom-board-form.js +++ b/docs/src/components/custom-board-form.js @@ -34,7 +34,7 @@ function CustomBoardForm({
@@ -45,7 +45,7 @@ function CustomBoardForm({
@@ -64,7 +64,7 @@ function CustomBoardForm({
@@ -74,7 +74,7 @@ function CustomBoardForm({
diff --git a/docs/src/css/power-profiler.css b/docs/src/css/power-profiler.css index 94c4a5dd..a0c18928 100644 --- a/docs/src/css/power-profiler.css +++ b/docs/src/css/power-profiler.css @@ -26,12 +26,12 @@ font-size: 14px; } -span[tooltip] { +span[data-tooltip] { position: relative; } -span[tooltip]::before { - content: attr(tooltip); +span[data-tooltip]::before { + content: attr(data-tooltip); font-size: 13px; padding: 5px 10px; position: absolute; @@ -47,7 +47,7 @@ span[tooltip]::before { left: 50%; } -span[tooltip]::after { +span[data-tooltip]::after { content: ""; position: absolute; border-top: 8px solid var(--ifm-background-surface-color); @@ -62,12 +62,12 @@ span[tooltip]::after { left: 50%; } -span[tooltip]:hover::before { +span[data-tooltip]:hover::before { opacity: 1; visibility: visible; } -span[tooltip]:hover::after { +span[data-tooltip]:hover::after { opacity: 1; visibility: visible; } diff --git a/docs/src/pages/power-profiler.js b/docs/src/pages/power-profiler.js index c909ec02..d28886ef 100644 --- a/docs/src/pages/power-profiler.js +++ b/docs/src/pages/power-profiler.js @@ -155,7 +155,7 @@ function PowerProfiler() {
@@ -167,7 +167,7 @@ function PowerProfiler() {
From 3353712bc1be89e9c239eeacbe51c163135fdeb7 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 27 Oct 2022 03:53:28 +0000 Subject: [PATCH 096/289] fix(docs): `npm start` to work from Docker. * Listen on 0.0.0.0 so testing docs within our container works properly with port forwarding. --- docs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/package.json b/docs/package.json index a6582472..7c933b03 100644 --- a/docs/package.json +++ b/docs/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "docusaurus start", + "start": "docusaurus start --host 0.0.0.0", "build": "docusaurus build", "serve": "docusaurus serve", "swizzle": "docusaurus swizzle", From 4e1191312745597b2312fda3d53e079ace4ea7f3 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Fri, 28 Oct 2022 10:03:16 +0800 Subject: [PATCH 097/289] feat(docs): troubleshooting steps for macOS 13 Finder bug --- docs/docs/troubleshooting.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index 46901d15..91c7d6d7 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -21,6 +21,10 @@ Variations of the warnings shown below occur when flashing the `.uf2` | :--------------------------------------------------------------------------: | | An example of the file transfer error on MacOS | +### MacOS Ventura error + +MacOS 13.0 (Ventura) Finder running on Apple silicon hardware may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. + ### CMake Error An error along the lines of `CMake Error at (zmk directory)/zephyr/cmake/generic_toolchain.cmake:64 (include): include could not find load file:` during firmware compilation indicates that the Zephyr Environment Variables are not properly defined. From d393247e15210a424c3cfcae4cd1eb67195c6595 Mon Sep 17 00:00:00 2001 From: HookyQR Date: Mon, 31 Oct 2022 08:50:21 +0800 Subject: [PATCH 098/289] fix(display): Set bits per pixel and color depth on n!v --- app/boards/shields/nice_view/Kconfig.defconfig | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/boards/shields/nice_view/Kconfig.defconfig b/app/boards/shields/nice_view/Kconfig.defconfig index 622c7498..a699a813 100644 --- a/app/boards/shields/nice_view/Kconfig.defconfig +++ b/app/boards/shields/nice_view/Kconfig.defconfig @@ -17,6 +17,13 @@ config LS0XX config ZMK_WIDGET_WPM_STATUS default y if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL +config LVGL_BITS_PER_PIXEL + default 1 + +choice LVGL_COLOR_DEPTH + default LVGL_COLOR_DEPTH_1 +endchoice + endif # ZMK_DISPLAY endif From a61eac91395a7e8f2695e76c7512fb97e0e13e11 Mon Sep 17 00:00:00 2001 From: Okke Formsma Date: Tue, 1 Nov 2022 21:13:19 +0100 Subject: [PATCH 099/289] fix(behaviors): make tap dances work on a combo * Tap dance event handler goes after combos * Add test --- app/CMakeLists.txt | 2 +- .../tap-dance/6-combo-tap2/events.patterns | 2 ++ .../6-combo-tap2/keycode_events.snapshot | 7 +++++ .../6-combo-tap2/native_posix_64.keymap | 17 +++++++++++ app/tests/tap-dance/behavior_keymap.dtsi | 30 ++++++++++++------- 5 files changed, 47 insertions(+), 11 deletions(-) create mode 100644 app/tests/tap-dance/6-combo-tap2/events.patterns create mode 100644 app/tests/tap-dance/6-combo-tap2/keycode_events.snapshot create mode 100644 app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 4b61fc72..3da50b57 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -47,13 +47,13 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/behaviors/behavior_momentary_layer.c) target_sources(app PRIVATE src/behaviors/behavior_mod_morph.c) target_sources(app PRIVATE src/behaviors/behavior_outputs.c) - target_sources(app PRIVATE src/behaviors/behavior_tap_dance.c) target_sources(app PRIVATE src/behaviors/behavior_toggle_layer.c) target_sources(app PRIVATE src/behaviors/behavior_to_layer.c) target_sources(app PRIVATE src/behaviors/behavior_transparent.c) target_sources(app PRIVATE src/behaviors/behavior_none.c) target_sources(app PRIVATE src/behaviors/behavior_sensor_rotate_key_press.c) target_sources(app PRIVATE src/combo.c) + target_sources(app PRIVATE src/behaviors/behavior_tap_dance.c) target_sources(app PRIVATE src/behavior_queue.c) target_sources(app PRIVATE src/conditional_layer.c) target_sources(app PRIVATE src/endpoints.c) diff --git a/app/tests/tap-dance/6-combo-tap2/events.patterns b/app/tests/tap-dance/6-combo-tap2/events.patterns new file mode 100644 index 00000000..1768fc21 --- /dev/null +++ b/app/tests/tap-dance/6-combo-tap2/events.patterns @@ -0,0 +1,2 @@ +s/.*hid_listener_keycode/kp/p +s/.*on_tap_dance_binding/td_binding/p \ No newline at end of file diff --git a/app/tests/tap-dance/6-combo-tap2/keycode_events.snapshot b/app/tests/tap-dance/6-combo-tap2/keycode_events.snapshot new file mode 100644 index 00000000..227d9cf2 --- /dev/null +++ b/app/tests/tap-dance/6-combo-tap2/keycode_events.snapshot @@ -0,0 +1,7 @@ +td_binding_pressed: 4 created new tap dance +td_binding_pressed: 4 tap dance pressed +td_binding_released: 4 tap dance keybind released +td_binding_pressed: 4 tap dance pressed +td_binding_released: 4 tap dance keybind released +kp_pressed: usage_page 0x07 keycode 0x1F implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x1F implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap b/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap new file mode 100644 index 00000000..72b6744a --- /dev/null +++ b/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,200) + >; +}; \ No newline at end of file diff --git a/app/tests/tap-dance/behavior_keymap.dtsi b/app/tests/tap-dance/behavior_keymap.dtsi index 5e95cd50..ce80e958 100644 --- a/app/tests/tap-dance/behavior_keymap.dtsi +++ b/app/tests/tap-dance/behavior_keymap.dtsi @@ -3,7 +3,7 @@ #include / { - behaviors { + behaviors { ht: hold_tap { compatible = "zmk,behavior-hold-tap"; label = "HOLD_TAP"; @@ -47,14 +47,24 @@ }; }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + combos { + compatible = "zmk,combos"; - default_layer { - bindings = < - &tdm &tds - &tdb &td2>; - }; - }; + td_combo { + bindings = <&tdb>; + key-positions = <0 1>; + timeout-ms = <50>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; + + default_layer { + bindings = < + &tdm &tds + &tdb &td2>; + }; + }; }; From 2364960f842f34d3c552cca358b7be62fbbf9988 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 22 Oct 2022 02:01:20 -0400 Subject: [PATCH 100/289] feat(shields): Add splitkb.com Aurora Sweep. --- .../splitkb_aurora_sweep/Kconfig.defconfig | 55 ++++++++++ .../splitkb_aurora_sweep/Kconfig.shield | 8 ++ .../boards/nice_nano.overlay | 31 ++++++ .../boards/nice_nano_v2.overlay | 31 ++++++ .../splitkb_aurora_sweep.conf | 9 ++ .../splitkb_aurora_sweep.dtsi | 80 ++++++++++++++ .../splitkb_aurora_sweep.keymap | 102 ++++++++++++++++++ .../splitkb_aurora_sweep.zmk.yml | 12 +++ .../splitkb_aurora_sweep_left.overlay | 48 +++++++++ .../splitkb_aurora_sweep_right.overlay | 51 +++++++++ 10 files changed, 427 insertions(+) create mode 100644 app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig create mode 100644 app/boards/shields/splitkb_aurora_sweep/Kconfig.shield create mode 100644 app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay create mode 100644 app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.conf create mode 100644 app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi create mode 100644 app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap create mode 100644 app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.zmk.yml create mode 100644 app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay create mode 100644 app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig new file mode 100644 index 00000000..51fbc28c --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig @@ -0,0 +1,55 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_SPLITKB_AURORA_SWEEP_LEFT + +config ZMK_KEYBOARD_NAME + default "Aurora Sweep" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif # SHIELD_SPLITKB_AURORA_SWEEP_LEFT + +if SHIELD_SPLITKB_AURORA_SWEEP_LEFT || SHIELD_SPLITKB_AURORA_SWEEP_RIGHT + +config ZMK_SPLIT + default y + +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + +config ZMK_DISPLAY + +if ZMK_DISPLAY + +config SSD1306 + default y + +config I2C + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LVGL_VDB_SIZE + default 64 + +config LVGL_DPI + default 148 + +config LVGL_BITS_PER_PIXEL + default 1 + +choice LVGL_COLOR_DEPTH + default LVGL_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif # SHIELD_SPLITKB_AURORA_SWEEP_LEFT || SHIELD_SPLITKB_AURORA_SWEEP_RIGHT diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield b/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield new file mode 100644 index 00000000..abb05282 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_SPLITKB_AURORA_SWEEP_LEFT + def_bool $(shields_list_contains,splitkb_aurora_sweep_left) + +config SHIELD_SPLITKB_AURORA_SWEEP_RIGHT + def_bool $(shields_list_contains,splitkb_aurora_sweep_right) diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay new file mode 100644 index 00000000..0087208c --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..0087208c --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.conf b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.conf new file mode 100644 index 00000000..bb2b843d --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.conf @@ -0,0 +1,9 @@ +# Uncomment these two line to add support for encoders to your firmware +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the Kyria OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment the following lines to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi new file mode 100644 index 00000000..a999df6a --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; + map = < + RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) + RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) + RC(2,4) RC(2,3) RC(2,2) RC(2,1) RC(2,0) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) + RC(3,1) RC(3,0) RC(3,5) RC(3,6) + >; + }; + + left_encoder1: left_encoder1 { + compatible = "alps,ec11"; + label = "L_ENCODER1"; + resolution = <4>; + status = "disabled"; + }; + + left_encoder2: left_encoder2 { + compatible = "alps,ec11"; + label = "L_ENCODER2"; + resolution = <4>; + status = "disabled"; + }; + + right_encoder1: right_encoder1 { + compatible = "alps,ec11"; + label = "R_ENCODER1"; + resolution = <4>; + status = "disabled"; + }; + + right_encoder2: right_encoder2 { + compatible = "alps,ec11"; + label = "R_ENCODER2"; + resolution = <4>; + status = "disabled"; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder1 &right_encoder1>; + }; +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap new file mode 100644 index 00000000..136e6927 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include + + +&mt { + // flavor = "tap-preferred"; + // tapping_term_ms = <200>; +}; + +/ { + + combos { + compatible = "zmk,combos"; + combo_esc { + timeout-ms = <50>; + key-positions = <0 1>; + bindings = <&kp ESC>; + }; + + combo_tab { + timeout-ms = <50>; + key-positions = <10 11>; + bindings = <&kp TAB>; + }; + + combo_ralt { + timeout-ms = <50>; + key-positions = <17 16>; + bindings = <&kp RALT>; + }; + + combo_lalt { + timeout-ms = <50>; + key-positions = <11 12>; + bindings = <&kp LALT>; + }; + + combo_lgui { + timeout-ms = <50>; + key-positions = <12 13>; + bindings = <&kp LGUI>; + }; + + + combo_rgui { + timeout-ms = <50>; + key-positions = <17 18>; + bindings = <&kp RGUI>; + }; + + + + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + bindings = < + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp QUOT + &mt LSFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &mt LSFT RET + &mo 1 &kp LCTL &kp SPC &mo 2 + >; + }; + + left_layer { + bindings = < + &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 + &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL + &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL + &mo 1 &kp LGUI &kp RGUI &mo 2 + >; + }; + + right_layer { + bindings = < + &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN + &kp HASH &kp QMARK &kp FSLH &kp COLN &kp SCLN &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BKSP + &kp LSFT &kp KPLS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT + &mo 3 &kp LCTL &kp SPC &mo 2 + >; + }; + + tri_layer { + bindings = < + &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &trans &trans &trans &trans &trans + &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans + &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans + &trans &trans &trans &trans + >; + }; + + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.zmk.yml b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.zmk.yml new file mode 100644 index 00000000..97d3c53b --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.zmk.yml @@ -0,0 +1,12 @@ +file_format: "1" +id: splitkb_aurora_sweep +name: splitkb.com Aurora Sweep +type: shield +url: https://splitkb.com/products/aurora-sweep-pcb-kit +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys +siblings: + - splitkb_aurora_sweep_left + - splitkb_aurora_sweep_right diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay new file mode 100644 index 00000000..3dc954c3 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_sweep.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "row2col"; + + row-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; + + col-gpios + = <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 4 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; +}; + +&left_encoder1 { + status = "okay"; + a-gpios = <&pro_micro 9 GPIO_PULL_UP>; + b-gpios = <&pro_micro 8 GPIO_PULL_UP>; +}; + +&left_encoder2 { + status = "okay"; + a-gpios = <&pro_micro 14 GPIO_PULL_UP>; + b-gpios = <&pro_micro 16 GPIO_PULL_UP>; +}; + diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay new file mode 100644 index 00000000..3811423e --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_sweep.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "row2col"; + + row-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + ; + + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; +}; + +&right_encoder1 { + status = "okay"; + a-gpios = <&pro_micro 16 GPIO_PULL_UP>; + b-gpios = <&pro_micro 10 GPIO_PULL_UP>; +}; + +&right_encoder2 { + status = "okay"; + a-gpios = <&pro_micro 20 GPIO_PULL_UP>; + b-gpios = <&pro_micro 4 GPIO_PULL_UP>; +}; + +&default_transform { + col-offset = <5>; +}; From 9847a4c5d597cce84f41455d1990c5338d5bac34 Mon Sep 17 00:00:00 2001 From: Terence Stenvold Date: Wed, 9 Nov 2022 21:56:22 +0100 Subject: [PATCH 101/289] fix(docs): copy error not exclusive to Apple silicon --- docs/docs/troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index 91c7d6d7..6944135e 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -23,7 +23,7 @@ Variations of the warnings shown below occur when flashing the `.uf2` ### MacOS Ventura error -MacOS 13.0 (Ventura) Finder running on Apple silicon hardware may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. +MacOS 13.0 (Ventura) Finder may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. ### CMake Error From c7d83fb951528c825a8c3a221b7b9659c60034d8 Mon Sep 17 00:00:00 2001 From: "byran.tech" <61983584+Hello9999901@users.noreply.github.com> Date: Wed, 9 Nov 2022 21:38:08 -0500 Subject: [PATCH 102/289] fix(docs): changed MacOS to macOS as per Apple styling --- docs/docs/development/usb-logging.md | 2 +- docs/docs/troubleshooting.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docs/development/usb-logging.md b/docs/docs/development/usb-logging.md index cd1d834d..9a2980ae 100644 --- a/docs/docs/development/usb-logging.md +++ b/docs/docs/development/usb-logging.md @@ -68,7 +68,7 @@ If you already have the Ardunio IDE installed you can also use its built-in Seri -On MacOS, the device name is something like `/dev/tty.usbmodemXXXXX` where `XXXXX` is some numerical ID. +On macOS, the device name is something like `/dev/tty.usbmodemXXXXX` where `XXXXX` is some numerical ID. You can connect to the device with [tio](https://tio.github.io/) (can be installed via [Homebrew](https://formulae.brew.sh/formula/tio)): ``` diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index 6944135e..a535a4ef 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -19,11 +19,11 @@ Variations of the warnings shown below occur when flashing the `.uf2` | ![Example Error Screen](../docs/assets/troubleshooting/filetransfer/mac.png) | | :--------------------------------------------------------------------------: | -| An example of the file transfer error on MacOS | +| An example of the file transfer error on macOS | -### MacOS Ventura error +### macOS Ventura error -MacOS 13.0 (Ventura) Finder may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. +macOS 13.0 (Ventura) Finder may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. ### CMake Error From a9048956b500e1104bed69038b4a32c2c1e9b7ff Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 3 Nov 2022 16:16:14 -0400 Subject: [PATCH 103/289] feat(shields): Add splitkb.com Aurora Corne. --- .../splitkb_aurora_corne/Kconfig.defconfig | 55 +++++++++++ .../splitkb_aurora_corne/Kconfig.shield | 8 ++ .../boards/nice_nano.overlay | 31 +++++++ .../boards/nice_nano_v2.overlay | 31 +++++++ .../splitkb_aurora_corne.conf | 9 ++ .../splitkb_aurora_corne.dtsi | 92 +++++++++++++++++++ .../splitkb_aurora_corne.keymap | 56 +++++++++++ .../splitkb_aurora_corne.zmk.yml | 12 +++ .../splitkb_aurora_corne_left.overlay | 42 +++++++++ .../splitkb_aurora_corne_right.overlay | 48 ++++++++++ 10 files changed, 384 insertions(+) create mode 100644 app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig create mode 100644 app/boards/shields/splitkb_aurora_corne/Kconfig.shield create mode 100644 app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay create mode 100644 app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.conf create mode 100644 app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi create mode 100644 app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap create mode 100644 app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.zmk.yml create mode 100644 app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay create mode 100644 app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig new file mode 100644 index 00000000..5a1eeb13 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig @@ -0,0 +1,55 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_SPLITKB_AURORA_CORNE_LEFT + +config ZMK_KEYBOARD_NAME + default "Aurora Corne" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif # SHIELD_SPLITKB_AURORA_CORNE_LEFT + +if SHIELD_SPLITKB_AURORA_CORNE_LEFT || SHIELD_SPLITKB_AURORA_CORNE_RIGHT + +config ZMK_SPLIT + default y + +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + +config ZMK_DISPLAY + +if ZMK_DISPLAY + +config SSD1306 + default y + +config I2C + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LVGL_VDB_SIZE + default 64 + +config LVGL_DPI + default 148 + +config LVGL_BITS_PER_PIXEL + default 1 + +choice LVGL_COLOR_DEPTH + default LVGL_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif # SHIELD_SPLITKB_AURORA_CORNE_LEFT || SHIELD_SPLITKB_AURORA_CORNE_RIGHT diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.shield b/app/boards/shields/splitkb_aurora_corne/Kconfig.shield new file mode 100644 index 00000000..3de10105 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.shield @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_SPLITKB_AURORA_CORNE_LEFT + def_bool $(shields_list_contains,splitkb_aurora_corne_left) + +config SHIELD_SPLITKB_AURORA_CORNE_RIGHT + def_bool $(shields_list_contains,splitkb_aurora_corne_right) diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay new file mode 100644 index 00000000..0087208c --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..0087208c --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.conf b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.conf new file mode 100644 index 00000000..bb2b843d --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.conf @@ -0,0 +1,9 @@ +# Uncomment these two line to add support for encoders to your firmware +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the Kyria OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment the following lines to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi new file mode 100644 index 00000000..aa525948 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; +// | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | +// | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | +// | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | +// | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) + >; + }; + + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; +// | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | +// | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | +// | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | +// | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | + map = < +RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) +RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) +RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) + >; + }; + + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "L_ENCODER"; + resolution = <4>; + status = "disabled"; + + a-gpios = <&pro_micro 4 GPIO_PULL_UP>; + b-gpios = <&pro_micro 5 GPIO_PULL_UP>; + }; + + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "R_ENCODER"; + resolution = <4>; + status = "disabled"; + + a-gpios = <&pro_micro 19 GPIO_PULL_UP>; + b-gpios = <&pro_micro 18 GPIO_PULL_UP>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap new file mode 100644 index 00000000..53218a86 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { +// ----------------------------------------------------------------------------------------- +// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | +// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | +// | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC | +// | GUI | LWR | SPC | | ENT | RSE | ALT | + bindings = < + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp ESC + &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT + >; + }; + lower_layer { +// ----------------------------------------------------------------------------------------- +// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSP | +// | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | +// | SHFT | | | | | | | | | | | | | +// | GUI | | SPC | | ENT | | ALT | + bindings = < + &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans + &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + >; + }; + + raise_layer { +// ----------------------------------------------------------------------------------------- +// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BKSP | +// | CTRL | | | | | | | - | = | [ | ] | \ | ` | +// | SHFT | | | | | | | _ | + | { | } | "|" | ~ | +// | GUI | | SPC | | ENT | | ALT | + bindings = < + &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC + &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE + &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + >; + }; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.zmk.yml b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.zmk.yml new file mode 100644 index 00000000..cc141826 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.zmk.yml @@ -0,0 +1,12 @@ +file_format: "1" +id: splitkb_aurora_corne +name: splitkb.com Aurora Corne +type: shield +url: https://splitkb.com/products/aurora-corne-pcb-kit +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys +siblings: + - splitkb_aurora_corne_left + - splitkb_aurora_corne_right diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay new file mode 100644 index 00000000..864321cc --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_corne.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "col2row"; + + row-gpios + = <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; + }; +}; + +&left_encoder { + status = "okay"; +}; + + diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay new file mode 100644 index 00000000..b4c4b438 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_corne.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "col2row"; + + row-gpios + = <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + ; + }; +}; + +&right_encoder { + status = "okay"; +}; + +&default_transform { + col-offset = <5>; +}; + +&five_column_transform { + col-offset = <6>; +}; From 1e98ea0afbbcc9bc8bcb1057a5290e0d4b1d594e Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Fri, 11 Nov 2022 08:48:16 +0800 Subject: [PATCH 104/289] fix(ci): Refactor west build step --- .github/workflows/build-user-config.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 3833abe8..3d89ed7b 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -99,8 +99,7 @@ jobs: - name: West Build (${{ env.display_name }}) shell: sh -x {0} - run: | - west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/${{ inputs.config_path }} ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} + run: west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/${{ inputs.config_path }} ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} - name: ${{ env.display_name }} Kconfig file run: grep -v -e "^#" -e "^$" build/zephyr/.config | sort From 768fc4a5e54fd11229a4f9c3f07eadc4d00da955 Mon Sep 17 00:00:00 2001 From: jhorology Date: Sat, 5 Nov 2022 05:47:16 +0900 Subject: [PATCH 105/289] fix: HID report descriptor --- app/include/zmk/hid.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index 0f9cfe2e..01104d1c 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -52,7 +52,7 @@ static const uint8_t zmk_hid_report_desc[] = { HID_INPUT(0x02), #elif IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_HKRO) HID_LOGICAL_MIN8(0x00), - HID_LOGICAL_MAX8(0xFF), + HID_LOGICAL_MAX16(0xFF, 0x00), HID_USAGE_MIN8(0x00), HID_USAGE_MAX8(0xFF), HID_REPORT_SIZE(0x08), From 6e7c2a08a26d011512edb76d63c6f96ff081e0be Mon Sep 17 00:00:00 2001 From: Michael Anthony <5498095+manthonygfp@users.noreply.github.com> Date: Mon, 14 Nov 2022 15:58:28 -0700 Subject: [PATCH 106/289] fix(docs): Update link to Zephyr led docs * Change Zephyr gpio-leds link to 3.0.0 --- docs/docs/config/backlight.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/config/backlight.md b/docs/docs/config/backlight.md index a3650766..8084be89 100644 --- a/docs/docs/config/backlight.md +++ b/docs/docs/config/backlight.md @@ -34,7 +34,7 @@ Applies to: [`/chosen` node](https://docs.zephyrproject.org/latest/build/dts/int See the Zephyr devicetree bindings for LED drivers: -- [gpio-leds](https://docs.zephyrproject.org/latest/build/dts/api/bindings/gpio/gpio-leds.html) +- [gpio-leds](https://docs.zephyrproject.org/3.0.0/reference/devicetree/bindings/gpio/gpio-leds.html) - [pwm-leds](https://docs.zephyrproject.org/latest/build/dts/api/bindings/led/pwm-leds.html) See the [backlight feature page](../features/backlight.md) for examples of the properties that must be set to enable backlighting. From 9f90dd1fc76feb272a856742b9f110ec352c0c8a Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 17 Nov 2022 23:25:11 -0500 Subject: [PATCH 107/289] fix(boards): Fix XIAO BLE voltage divider config. * Use proper resistor value for the `output-ohms` property. --- app/boards/seeeduino_xiao_ble.overlay | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/seeeduino_xiao_ble.overlay b/app/boards/seeeduino_xiao_ble.overlay index 0f5df999..452786d1 100644 --- a/app/boards/seeeduino_xiao_ble.overlay +++ b/app/boards/seeeduino_xiao_ble.overlay @@ -16,7 +16,7 @@ label = "BATTERY"; io-channels = <&adc 7>; power-gpios = <&gpio0 14 (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW)>; - output-ohms = <1000000>; + output-ohms = <510000>; full-ohms = <(1000000 + 510000)>; }; }; From c7fdce863ac2f03bc70495f9904b127f2d99d85c Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Wed, 16 Nov 2022 17:00:39 -0500 Subject: [PATCH 108/289] fix(usb): add USB_DC_CLEAR_HALT to supported states See https://manpages.debian.org/testing/linux-manual-4.9/usb_clear_halt.9 for information on halted USB endpoints --- app/src/usb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/usb.c b/app/src/usb.c index aa2d3e75..146e7bb7 100644 --- a/app/src/usb.c +++ b/app/src/usb.c @@ -34,6 +34,7 @@ enum zmk_usb_conn_state zmk_usb_get_conn_state() { case USB_DC_SUSPEND: case USB_DC_CONFIGURED: case USB_DC_RESUME: + case USB_DC_CLEAR_HALT: return ZMK_USB_CONN_HID; case USB_DC_DISCONNECTED: From 5cd608cb6016729f115591145a234faec77da3f4 Mon Sep 17 00:00:00 2001 From: Nick Coutsos Date: Thu, 24 Nov 2022 20:02:44 -0500 Subject: [PATCH 109/289] fix(docs): Correct syntax in capsword mods --- docs/docs/behaviors/caps-word.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/behaviors/caps-word.md b/docs/docs/behaviors/caps-word.md index 1b743a59..e85d7eca 100644 --- a/docs/docs/behaviors/caps-word.md +++ b/docs/docs/behaviors/caps-word.md @@ -43,7 +43,7 @@ In addition, if you would like _multiple_ modifiers, instead of just `MOD_LSFT`, ``` &caps_word { - mods = ; + mods = <(MOD_LSFT | MOD_LALT)>; }; / { From 4d0e0fa34b379584dea17a40c5fed4eb1d64e76b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 03:29:20 +0000 Subject: [PATCH 110/289] chore(deps): bump loader-utils from 2.0.3 to 2.0.4 in /docs Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.3 to 2.0.4. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.4/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.3...v2.0.4) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 61af445c..69ee0fc4 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -9278,9 +9278,9 @@ } }, "node_modules/loader-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz", - "integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -12521,9 +12521,9 @@ } }, "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "engines": { "node": ">= 12.13.0" } @@ -22735,9 +22735,9 @@ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" }, "loader-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz", - "integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -24925,9 +24925,9 @@ }, "dependencies": { "loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==" } } }, From 6550c043c49fcd4db9e213c324f016e622f12d54 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Sat, 26 Nov 2022 13:02:28 +0800 Subject: [PATCH 111/289] refactor: Update cradio keymap with better indentation and additional features --- app/boards/shields/cradio/cradio.keymap | 184 ++++++++++++------------ 1 file changed, 93 insertions(+), 91 deletions(-) diff --git a/app/boards/shields/cradio/cradio.keymap b/app/boards/shields/cradio/cradio.keymap index ec5e0e7a..587bc7aa 100644 --- a/app/boards/shields/cradio/cradio.keymap +++ b/app/boards/shields/cradio/cradio.keymap @@ -1,102 +1,104 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ +// Copyright (c) 2022 The ZMK Contributors +// SPDX-License-Identifier: MIT #include #include #include +// Home row mods macro +#define HRML(k1,k2,k3,k4) &ht LSHFT k1 &ht LALT k2 &ht LCTRL k3 &ht LGUI k4 +#define HRMR(k1,k2,k3,k4) &ht RGUI k1 &ht RCTRL k2 &ht RALT k3 &ht RSHFT k4 -&mt { - // flavor = "tap-preferred"; - // tapping_term_ms = <200>; -}; - -/ { - - combos { - compatible = "zmk,combos"; - combo_esc { - timeout-ms = <50>; - key-positions = <0 1>; - bindings = <&kp ESC>; +/ { + behaviors { + ht: hold_tap { + label = "hold_tap"; + compatible = "zmk,behavior-hold-tap"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <220>; + quick-tap-ms = <150>; + global-quick-tap; + bindings = <&kp>, <&kp>; }; - - combo_tab { - timeout-ms = <50>; - key-positions = <10 11>; - bindings = <&kp TAB>; - }; - - combo_ralt { - timeout-ms = <50>; - key-positions = <17 16>; - bindings = <&kp RALT>; - }; - - combo_lalt { - timeout-ms = <50>; - key-positions = <11 12>; - bindings = <&kp LALT>; - }; - - combo_lgui { - timeout-ms = <50>; - key-positions = <12 13>; - bindings = <&kp LGUI>; - }; - - - combo_rgui { - timeout-ms = <50>; - key-positions = <17 18>; - bindings = <&kp RGUI>; - }; - - - }; - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P - &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp QUOT - &mt LSFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &mt LSFT RET - &mo 1 &kp LCTL &kp SPC &mo 2 - >; - }; + conditional_layers { + compatible = "zmk,conditional-layers"; + tri_layer { + if-layers = <1 2>; + then-layer = <3>; + }; + }; - left_layer { - bindings = < - &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 - &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL - &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL - &mo 1 &kp LGUI &kp RGUI &mo 2 - >; - }; - - right_layer { - bindings = < - &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN - &kp HASH &kp QMARK &kp FSLH &kp COLN &kp SCLN &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BKSP - &kp LSFT &kp KPLS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT - &mo 3 &kp LCTL &kp SPC &mo 2 - >; - }; - - tri_layer { - bindings = < - &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &trans &trans &trans &trans &trans - &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans - &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans - &trans &trans &trans &trans - >; - }; - - }; + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ + //│ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │ + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│ A │ S │ D │ F │ G │ │ H │ J │ K │ L │ ' " │ + HRML(A, S, D, F) &kp G &kp H HRMR(J, K, L, SQT) + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│ Z │ X │ C │ V │ B │ │ N │ M │ , < │ . > │ / ? │ + &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH + //╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯ + < 2 TAB &kp ENTER &kp SPACE < 1 BSPC + // ╰──────────┴──────────╯ ╰──────────┴──────────╯ + >; + }; + + right_layer { + bindings = < + //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ + //│ INSERT │ 1 │ 2 │ 3 │ │ │ HOME │ PAGE DN │ PAGE UP │ END │ : │ + &kp INS &kp N1 &kp N2 &kp N3 &trans &kp HOME &kp PG_DN &kp PG_UP &kp END &kp COLON + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│ DELETE │ 4 │ 5 │ 6 │ │ │ LEFT │ DOWN │ UP │ RIGHT │ ; │ + &kp DEL &kp N4 &kp N5 &kp N6 &trans &kp LARW &kp DARW &kp UARW &kp RARW &kp SEMI + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│ CAPS │ 7 │ 8 │ 9 │ 0 │ │ │ │ │ │ │ + &caps_word &kp N7 &kp N8 &kp N9 &kp N0 &trans &trans &trans &trans &trans + //╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯ + &trans &kp ESC &trans &trans + // ╰──────────┴──────────╯ ╰──────────┴──────────╯ + >; + }; + + left_layer { + bindings = < + //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ + //│ │ [ │ { │ } │ │ │ ^ │ ( │ ) │ ] │ ~ │ + &trans &kp LBKT &kp LBRC &kp RBRC &trans &kp CARET &kp LPAR &kp RPAR &kp RBKT &kp TILDE + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│ ! │ @ │ # │ $ │ % │ │ * │ - │ = │ \ │ ` │ + &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp ASTRK &kp MINUS &kp EQUAL &kp BSLH &kp GRAVE + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│ │ │ │ │ │ │ & │ _ │ + │ │ │ │ + &trans &trans &trans &trans &trans &kp AMPS &kp UNDER &kp PLUS &kp PIPE &trans + //╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯ + &trans &trans &trans &trans + // ╰──────────┴──────────╯ ╰──────────┴──────────╯ + >; + }; + + tri_layer { + bindings = < + //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ + //│ RESET │ │ │ │PROFILE 0 │ │ │ │ │ │ RESET │ + &reset &trans &trans &trans &bt BT_SEL 0 &trans &trans &trans &trans &reset + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│BOOTLOADER│ │ │ │PROFILE 1 │ │ │ │ │ │BOOTLOADER│ + &bootloader &trans &trans &trans &bt BT_SEL 1 &trans &trans &trans &trans &bootloader + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│ │ │ │ CLEAR BT │PROFILE 2 │ │ │ │ │ │ │ + &trans &trans &trans &bt BT_CLR &bt BT_SEL 2 &trans &trans &trans &trans &trans + //╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯ + &trans &trans &trans &trans + // ╰──────────┴──────────╯ ╰──────────┴──────────╯ + >; + }; + }; }; From 001105e31844f0f59b82a2e71a4c3ada980b931b Mon Sep 17 00:00:00 2001 From: Kurtis Lew Date: Wed, 30 Nov 2022 17:59:26 -0800 Subject: [PATCH 112/289] fix(docs): Correct typo in hold-tap comparison balanced flavor --- docs/docs/assets/hold-tap/comparison.svg | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/docs/assets/hold-tap/comparison.svg b/docs/docs/assets/hold-tap/comparison.svg index eef79f39..5193d846 100644 --- a/docs/docs/assets/hold-tap/comparison.svg +++ b/docs/docs/assets/hold-tap/comparison.svg @@ -70,8 +70,8 @@ - - + + @@ -83,7 +83,7 @@ - + @@ -124,8 +124,8 @@ - + - + From 593db8537826539eb8ee81f14e635d3ed1cbed0e Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Thu, 1 Dec 2022 12:34:22 -0600 Subject: [PATCH 113/289] feat(boards): Add support for nRF5340 DK Added overlays to support building for the nRF5340 development kit. Also added some documentation on how to build and flash ZMK for dual- chip Bluetooth configurations, with an example for the nRF5340. --- app/boards/nrf5340dk_nrf5340_cpuapp.conf | 15 +++++++++++++++ docs/docs/development/build-flash.md | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 app/boards/nrf5340dk_nrf5340_cpuapp.conf diff --git a/app/boards/nrf5340dk_nrf5340_cpuapp.conf b/app/boards/nrf5340dk_nrf5340_cpuapp.conf new file mode 100644 index 00000000..a40195e3 --- /dev/null +++ b/app/boards/nrf5340dk_nrf5340_cpuapp.conf @@ -0,0 +1,15 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Default main stack size is too small for HCI RPMsg +CONFIG_MAIN_STACK_SIZE=2048 diff --git a/docs/docs/development/build-flash.md b/docs/docs/development/build-flash.md index 15b4acf7..09006646 100644 --- a/docs/docs/development/build-flash.md +++ b/docs/docs/development/build-flash.md @@ -140,3 +140,23 @@ your board and run the following command to flash: ``` west flash ``` + +## Multi-CPU and Dual-Chip Bluetooth Boards + +Zephyr supports running the Bluetooth host and controller on separate processors. In such a configuration, ZMK always runs on the host processor, but you may need to build and flash separate firmware for the controller. Zephyr provides sample code which can be used as the controller firmware for Bluetooth HCI over [RPMsg](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_rpmsg/README.html), [SPI](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_spi/README.html), [UART](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_uart/README.html), and [USB](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_usb/README.html). See [Zephyr's Bluetooth Stack Architecture documentation](https://docs.zephyrproject.org/latest/connectivity/bluetooth/bluetooth-arch.html) for more details. + +The following documentation shows how to build and flash ZMK for boards that use a dual-chip configuration. + +### nRF5340 + +To build and flash the firmware for the nRF5340 development kit's network core, run the following command from the root of the ZMK repo: + +```sh +cd zephyr/samples/bluetooth/hci_rpmsg +west build -b nrf5340dk_nrf5340_cpunet +west flash +``` + +You can then build and flash ZMK firmware using the normal steps described above. The network core's firmware only needs to be updated whenever ZMK upgrades to a new version of Zephyr. + +For a custom nRF5340-based board, you will need to define two Zephyr boards: one for the application core and one for the network core. The [nRF5340 DK's board definition](https://github.com/zephyrproject-rtos/zephyr/tree/main/boards/arm/nrf5340dk_nrf5340) can be used as reference. Replace `nrf5340dk_nrf5340_cpunet` with the name of your network core board. From 6ccb5280c9e2ca23c633e7cd8113687994acd8c5 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Tue, 6 Dec 2022 00:25:00 -0600 Subject: [PATCH 114/289] fix(docs): Pin Zephyr docs links to a version Co-authored-by: Cem Aksoylar --- docs/docs/development/build-flash.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/development/build-flash.md b/docs/docs/development/build-flash.md index 09006646..6f4ba84d 100644 --- a/docs/docs/development/build-flash.md +++ b/docs/docs/development/build-flash.md @@ -143,7 +143,7 @@ west flash ## Multi-CPU and Dual-Chip Bluetooth Boards -Zephyr supports running the Bluetooth host and controller on separate processors. In such a configuration, ZMK always runs on the host processor, but you may need to build and flash separate firmware for the controller. Zephyr provides sample code which can be used as the controller firmware for Bluetooth HCI over [RPMsg](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_rpmsg/README.html), [SPI](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_spi/README.html), [UART](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_uart/README.html), and [USB](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_usb/README.html). See [Zephyr's Bluetooth Stack Architecture documentation](https://docs.zephyrproject.org/latest/connectivity/bluetooth/bluetooth-arch.html) for more details. +Zephyr supports running the Bluetooth host and controller on separate processors. In such a configuration, ZMK always runs on the host processor, but you may need to build and flash separate firmware for the controller. Zephyr provides sample code which can be used as the controller firmware for Bluetooth HCI over [RPMsg](https://docs.zephyrproject.org/3.2.0/samples/bluetooth/hci_rpmsg/README.html), [SPI](https://docs.zephyrproject.org/3.2.0/samples/bluetooth/hci_spi/README.html), [UART](https://docs.zephyrproject.org/3.2.0/samples/bluetooth/hci_uart/README.html), and [USB](https://docs.zephyrproject.org/3.2.0/samples/bluetooth/hci_usb/README.html). See [Zephyr's Bluetooth Stack Architecture documentation](https://docs.zephyrproject.org/3.2.0/connectivity/bluetooth/bluetooth-arch.html) for more details. The following documentation shows how to build and flash ZMK for boards that use a dual-chip configuration. From 58eb7a3305b11e465505e60657479346bec32f53 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Tue, 29 Nov 2022 22:05:04 -0800 Subject: [PATCH 115/289] feat(display): Add config to show battery level in percentage --- app/src/display/widgets/Kconfig | 7 +++++++ app/src/display/widgets/battery_status.c | 8 +++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/display/widgets/Kconfig b/app/src/display/widgets/Kconfig index 96e7e16d..847a47ab 100644 --- a/app/src/display/widgets/Kconfig +++ b/app/src/display/widgets/Kconfig @@ -15,6 +15,13 @@ config ZMK_WIDGET_BATTERY_STATUS default y if BT select LVGL_USE_LABEL +if ZMK_WIDGET_BATTERY_STATUS + +config ZMK_WIDGET_BATTERY_STATUS_SHOW_PERCENTAGE + bool "Show battery level percentage in text" + +endif + config ZMK_WIDGET_OUTPUT_STATUS bool "Widget for keyboard output status icons" depends on BT && (!ZMK_SPLIT_BLE || ZMK_SPLIT_ROLE_CENTRAL) diff --git a/app/src/display/widgets/battery_status.c b/app/src/display/widgets/battery_status.c index 9179b0d0..71b243d3 100644 --- a/app/src/display/widgets/battery_status.c +++ b/app/src/display/widgets/battery_status.c @@ -27,7 +27,7 @@ struct battery_status_state { }; static void set_battery_symbol(lv_obj_t *label, struct battery_status_state state) { - char text[8] = {}; + char text[9] = {}; uint8_t level = state.level; @@ -37,6 +37,11 @@ static void set_battery_symbol(lv_obj_t *label, struct battery_status_state stat } #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ +#if IS_ENABLED(CONFIG_ZMK_WIDGET_BATTERY_STATUS_SHOW_PERCENTAGE) + char perc[5] = {}; + snprintf(perc, sizeof(perc), "%3u%%", level); + strcat(text, perc); +#else if (level > 95) { strcat(text, LV_SYMBOL_BATTERY_FULL); } else if (level > 65) { @@ -48,6 +53,7 @@ static void set_battery_symbol(lv_obj_t *label, struct battery_status_state stat } else { strcat(text, LV_SYMBOL_BATTERY_EMPTY); } +#endif lv_label_set_text(label, text); lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 0); } From 2a42fe658ee713cb93609c743e7bde3242d7aa7f Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Thu, 1 Dec 2022 15:58:31 -0800 Subject: [PATCH 116/289] feat(docs): Document battery widget percentage Kconfig --- docs/docs/config/displays.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/docs/config/displays.md b/docs/docs/config/displays.md index cf6c07ee..d126e38a 100644 --- a/docs/docs/config/displays.md +++ b/docs/docs/config/displays.md @@ -14,13 +14,14 @@ Definition files: - [zmk/app/src/display/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/display/Kconfig) - [zmk/app/src/display/widgets/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/display/widgets/Kconfig) -| Config | Type | Description | Default | -| ---------------------------------- | ---- | ---------------------------------------------------- | ------- | -| `CONFIG_ZMK_DISPLAY` | bool | Enable support for displays | n | -| `CONFIG_ZMK_WIDGET_LAYER_STATUS` | bool | Enable a widget to show the highest, active layer | y | -| `CONFIG_ZMK_WIDGET_BATTERY_STATUS` | bool | Enable a widget to show battery charge information | y | -| `CONFIG_ZMK_WIDGET_OUTPUT_STATUS` | bool | Enable a widget to show the current output (USB/BLE) | y | -| `CONFIG_ZMK_WIDGET_WPM_STATUS` | bool | Enable a widget to show words per minute | n | +| Config | Type | Description | Default | +| -------------------------------------------------- | ---- | -------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_DISPLAY` | bool | Enable support for displays | n | +| `CONFIG_ZMK_WIDGET_LAYER_STATUS` | bool | Enable a widget to show the highest, active layer | y | +| `CONFIG_ZMK_WIDGET_BATTERY_STATUS` | bool | Enable a widget to show battery charge information | y | +| `CONFIG_ZMK_WIDGET_BATTERY_STATUS_SHOW_PERCENTAGE` | bool | If battery widget is enabled, show percentage instead of icons | n | +| `CONFIG_ZMK_WIDGET_OUTPUT_STATUS` | bool | Enable a widget to show the current output (USB/BLE) | y | +| `CONFIG_ZMK_WIDGET_WPM_STATUS` | bool | Enable a widget to show words per minute | n | If `CONFIG_ZMK_DISPLAY` is enabled, exactly zero or one of the following options must be set to `y`. The first option is used if none are set. From 12329b388e5bf7a60c16185d8f714a0596b681a7 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 9 Dec 2022 17:07:45 -0500 Subject: [PATCH 117/289] feat(boards): Add Arduino Uno interconnect, nrf52840dk config. --- .../nrf52840dk_nrf52840.zmk.yml | 10 ++++++++++ .../interconnects/arduino_uno/arduino_uno.zmk.yml | 15 +++++++++++++++ app/boards/nrf52840dk_nrf52840.conf | 12 ++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 app/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml create mode 100644 app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml create mode 100644 app/boards/nrf52840dk_nrf52840.conf diff --git a/app/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml b/app/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml new file mode 100644 index 00000000..2a0d9946 --- /dev/null +++ b/app/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: nrf52840dk_nrf52840 +name: Nordic nRF52840 DK +type: board +arch: arm +outputs: + - usb + - ble +url: https://www.nordicsemi.com/Products/Development-hardware/nrf52840-dk +exposes: [arduino_uno] diff --git a/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml b/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml new file mode 100644 index 00000000..8ec164eb --- /dev/null +++ b/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: arduino_uno +name: Arduino Uno Rev3 +type: interconnect +url: https://store-usa.arduino.cc/products/arduino-uno-rev3?selectedStore=us +manufacturer: Arduino +description: | + The Arduino Uno Rev3 is a board who's popularity lead to countless shields being developed for it. By + natural extension, once there were many shields designed for it, many other *boards* began to be developed + that were compatible to leverage the extensive available shields. Today, many dev kits come with Uno + headers to make it easy to work with them. + + Note: ZMK doesn't support boards with AVR 8-bit processors, such as the ATmega32U4, because Zephyr™ only + supports 32-bit and 64-bit platforms. As a result, boards like the original Arduino Uno Rev3 itself are + *not* supported by ZMK. diff --git a/app/boards/nrf52840dk_nrf52840.conf b/app/boards/nrf52840dk_nrf52840.conf new file mode 100644 index 00000000..6c9bcdf1 --- /dev/null +++ b/app/boards/nrf52840dk_nrf52840.conf @@ -0,0 +1,12 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y From 63b29ccd3256e0f9e253591c560eb104082a920a Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 13 Jun 2022 03:28:56 +0000 Subject: [PATCH 118/289] feat(shields): Add ZMK Uno shield. * Support underglow, backlight, display, encoder, etc. --- app/boards/shields/zmk_uno/Kconfig.defconfig | 23 +++ app/boards/shields/zmk_uno/Kconfig.shield | 5 + app/boards/shields/zmk_uno/zmk_uno.conf | 18 ++ app/boards/shields/zmk_uno/zmk_uno.keymap | 62 +++++++ app/boards/shields/zmk_uno/zmk_uno.overlay | 186 +++++++++++++++++++ app/boards/shields/zmk_uno/zmk_uno.zmk.yml | 10 + 6 files changed, 304 insertions(+) create mode 100644 app/boards/shields/zmk_uno/Kconfig.defconfig create mode 100644 app/boards/shields/zmk_uno/Kconfig.shield create mode 100644 app/boards/shields/zmk_uno/zmk_uno.conf create mode 100644 app/boards/shields/zmk_uno/zmk_uno.keymap create mode 100644 app/boards/shields/zmk_uno/zmk_uno.overlay create mode 100644 app/boards/shields/zmk_uno/zmk_uno.zmk.yml diff --git a/app/boards/shields/zmk_uno/Kconfig.defconfig b/app/boards/shields/zmk_uno/Kconfig.defconfig new file mode 100644 index 00000000..11c63a5a --- /dev/null +++ b/app/boards/shields/zmk_uno/Kconfig.defconfig @@ -0,0 +1,23 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_ZMK_UNO + +config ZMK_KEYBOARD_NAME + default "ZMK Uno" + +config ZMK_BACKLIGHT + select LED + select LED_GPIO + +config SHIELD_SSD1306_128X64 + select ZMK_DISPLAY + +config SHIELD_SSD1306_128X32 + select ZMK_DISPLAY + +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + +endif diff --git a/app/boards/shields/zmk_uno/Kconfig.shield b/app/boards/shields/zmk_uno/Kconfig.shield new file mode 100644 index 00000000..3f7331c3 --- /dev/null +++ b/app/boards/shields/zmk_uno/Kconfig.shield @@ -0,0 +1,5 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_ZMK_UNO + def_bool $(shields_list_contains,zmk_uno) diff --git a/app/boards/shields/zmk_uno/zmk_uno.conf b/app/boards/shields/zmk_uno/zmk_uno.conf new file mode 100644 index 00000000..cf282bac --- /dev/null +++ b/app/boards/shields/zmk_uno/zmk_uno.conf @@ -0,0 +1,18 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_LOG=y +CONFIG_ZMK_LOG_LEVEL_DBG=y + +# Uncomment for Single color backlight +# CONFIG_ZMK_BACKLIGHT=y + +# Uncomment for RGB +# CONFIG_ZMK_RGB_UNDERGLOW=y + +# Uncomment for Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment these two lines to enable encoder support +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y diff --git a/app/boards/shields/zmk_uno/zmk_uno.keymap b/app/boards/shields/zmk_uno/zmk_uno.keymap new file mode 100644 index 00000000..7ab2632a --- /dev/null +++ b/app/boards/shields/zmk_uno/zmk_uno.keymap @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include +#include +#include + +// Uncomment the following block if using the "Direct Wire" jumper to switch the matrix to a direct wire. + +/* :REMOVE ME + +&kscan_direct_comp { status = "okay"; }; +&kscan_direct { status = "okay"; }; +&kscan_matrix_comp { status = "disabled"; }; +&kscan_matrix { status = "disabled"; }; + +/ { + chosen { + zmk,matrix-transform = &direct_matrix_transform; + zmk,kscan = &kscan_direct_comp; + }; +}; + +REMOVE ME: */ + + +/ { + macros { + ZMK_MACRO(ble_zero, + wait-ms = <1>; + tap-ms = <1>; + bindings = <&out OUT_BLE &bt BT_SEL 0>; + ) + ZMK_MACRO(ble_one, + wait-ms = <1>; + tap-ms = <1>; + bindings = <&out OUT_BLE &bt BT_SEL 1>; + ) + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + bindings = < + &kp A &bl BL_TOG + &rgb_ug RGB_EFF &bt BT_CLR + + &out OUT_USB &ble_zero &ble_one + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; +}; diff --git a/app/boards/shields/zmk_uno/zmk_uno.overlay b/app/boards/shields/zmk_uno/zmk_uno.overlay new file mode 100644 index 00000000..f10d18af --- /dev/null +++ b/app/boards/shields/zmk_uno/zmk_uno.overlay @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include + +&arduino_i2c { + status = "okay"; +}; + +&arduino_spi { + status = "okay"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "RGB"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <7>; /* 4 underglow + 3 per-key LEDs */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,kscan = &kscan_matrix_comp; + zmk,backlight = &backlight; + zmk,underglow = &led_strip; + zmk,matrix-transform = &matrix_transform; + }; + + // Commented out until we add more powerful power domain support + // external_power { + // compatible = "zmk,ext-power-generic"; + // label = "EXT_POWER"; + // init-delay-ms = <200>; + // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; + // }; + + rgb_power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + // label = "RGB_POWER"; + init-delay-ms = <200>; + control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; + }; + + backlight: gpioleds { + compatible = "gpio-leds"; + label = "Backlight LEDs"; + gpio_led_0 { + gpios = <&arduino_header 12 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 0"; + }; + }; + + matrix_transform: matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <3>; + columns = <4>; + + map = < + RC(0,0) RC(0,1) + RC(1,0) RC(1,1) + RC(2,0) RC(2,1) RC(2,2) + >; + }; + + direct_matrix_transform: direct_matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <3>; + columns = <4>; + + map = < + RC(0,0) RC(0,1) + RC(0,2) RC(0,3) + RC(1,0) RC(1,1) RC(1,2) + >; + }; + + kscan_matrix_comp: kscan_matrix_comp { + compatible = "zmk,kscan-composite"; + rows = <1>; + columns = <7>; + + label = "KSCAN_MATRIX_COMP"; + + matrix { + kscan = <&kscan_matrix>; + }; + + toggle { + kscan = <&kscan_sp3t_toggle>; + row-offset = <2>; + }; + + }; + + kscan_direct_comp: kscan_direct_comp { + compatible = "zmk,kscan-composite"; + + label = "KSCAN_DIRECT_COMP"; + status = "disabled"; + + matrix { + kscan = <&kscan_direct>; + }; + + toggle { + kscan = <&kscan_sp3t_toggle>; + row-offset = <1>; + }; + + }; + + kscan_matrix: kscan_matrix { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN_MATRIX"; + + diode-direction = "col2row"; + + col-gpios + = <&arduino_header 10 GPIO_ACTIVE_HIGH> + , <&arduino_header 9 GPIO_ACTIVE_HIGH> + ; + + row-gpios + = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + }; + + kscan_direct: kscan_direct { + compatible = "zmk,kscan-gpio-direct"; + status = "disabled"; + + label = "KSCAN_DIRECT"; + + input-gpios + = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + + }; + + kscan_sp3t_toggle: kscan_sp3t_toggle { + compatible = "zmk,kscan-gpio-direct"; + toggle-mode; + + label = "KSCAN_TOGGLE"; + + input-gpios + = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; + + encoder: encoder { + label = "ENCODER"; + resolution = <4>; + compatible = "alps,ec11"; + a-gpios = <&arduino_header 14 GPIO_PULL_UP>; + b-gpios = <&arduino_header 15 GPIO_PULL_UP>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder>; + }; + +}; diff --git a/app/boards/shields/zmk_uno/zmk_uno.zmk.yml b/app/boards/shields/zmk_uno/zmk_uno.zmk.yml new file mode 100644 index 00000000..cee108fa --- /dev/null +++ b/app/boards/shields/zmk_uno/zmk_uno.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: zmk_uno +name: ZMK Uno +type: shield +url: https://github.com/zmkfirmware/zmk-uno +requires: [arduino_uno] +features: + - keys + - encoder + - display From 2b235ae281e886afde8aad968dd768cd9e71718a Mon Sep 17 00:00:00 2001 From: Pavlos Vinieratos Date: Sun, 11 Dec 2022 01:33:50 +0000 Subject: [PATCH 119/289] fix(boards): Add encoder config to bdn9_rev2.conf --- app/boards/arm/bdn9/bdn9_rev2.conf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/boards/arm/bdn9/bdn9_rev2.conf b/app/boards/arm/bdn9/bdn9_rev2.conf index 36910853..f6506a06 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.conf +++ b/app/boards/arm/bdn9/bdn9_rev2.conf @@ -1,5 +1,9 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT +# Uncomment these lines below to enable encoders. +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + # Uncomment the line below to enable RGB. # CONFIG_ZMK_RGB_UNDERGLOW=y From 36ee1f4e0a7f28c9df150dfd731142eb039bb798 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 10 Dec 2022 21:50:57 -0600 Subject: [PATCH 120/289] fix(boards): Fix nRF5340 DK issues - Fixed a stack overflow when enabling Bluetooth. - Increased the I2C buffer size to support displays. --- app/boards/nrf5340dk_nrf5340_cpuapp.conf | 3 ++- app/boards/nrf5340dk_nrf5340_cpuapp.overlay | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 app/boards/nrf5340dk_nrf5340_cpuapp.overlay diff --git a/app/boards/nrf5340dk_nrf5340_cpuapp.conf b/app/boards/nrf5340dk_nrf5340_cpuapp.conf index a40195e3..ccb0ddba 100644 --- a/app/boards/nrf5340dk_nrf5340_cpuapp.conf +++ b/app/boards/nrf5340dk_nrf5340_cpuapp.conf @@ -11,5 +11,6 @@ CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y -# Default main stack size is too small for HCI RPMsg +# Default main and BLE stack sizes are too small for HCI RPMsg CONFIG_MAIN_STACK_SIZE=2048 +CONFIG_ZMK_BLE_THREAD_STACK_SIZE=1024 diff --git a/app/boards/nrf5340dk_nrf5340_cpuapp.overlay b/app/boards/nrf5340dk_nrf5340_cpuapp.overlay new file mode 100644 index 00000000..66d2332f --- /dev/null +++ b/app/boards/nrf5340dk_nrf5340_cpuapp.overlay @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +&arduino_i2c { + // Default buffer size is too small for use with displays. + zephyr,concat-buf-size = <512>; +}; From 70aa4fa82456ab6a739c43aae36815804cb58d51 Mon Sep 17 00:00:00 2001 From: Kyle McCreery Date: Sat, 10 Dec 2022 23:01:37 -0500 Subject: [PATCH 121/289] feat(boards): Add PillBug board, blackpill interconnect. * Add blackbill interconnect metadata. * Add config/overlay for upstream blackpill boards to work with ZMK. * Add pillbug board. * Updated new shield docs. Co-authored-by: Cem Aksoylar --- .../blackpill_f401ce/blackpill_f401ce.zmk.yml | 9 ++ .../blackpill_f411ce/blackpill_f411ce.zmk.yml | 9 ++ app/boards/arm/pillbug/Kconfig | 7 + app/boards/arm/pillbug/Kconfig.board | 6 + app/boards/arm/pillbug/Kconfig.defconfig | 25 ++++ app/boards/arm/pillbug/blackpill_pins.dtsi | 50 +++++++ app/boards/arm/pillbug/board.cmake | 6 + app/boards/arm/pillbug/pillbug.dts | 132 ++++++++++++++++++ app/boards/arm/pillbug/pillbug.yaml | 15 ++ app/boards/arm/pillbug/pillbug.zmk.yml | 10 ++ app/boards/arm/pillbug/pillbug_defconfig | 22 +++ app/boards/blackpill_f401ce.conf | 7 + app/boards/blackpill_f401ce.overlay | 51 +++++++ app/boards/blackpill_f411ce.conf | 7 + app/boards/blackpill_f411ce.overlay | 51 +++++++ .../interconnects/blackpill/blackpill.zmk.yml | 8 ++ .../blackpill/blackpill-pins-labelled.png | Bin 0 -> 924160 bytes docs/docs/development/new-shield.md | 24 ++++ 18 files changed, 439 insertions(+) create mode 100644 app/boards/arm/blackpill_f401ce/blackpill_f401ce.zmk.yml create mode 100644 app/boards/arm/blackpill_f411ce/blackpill_f411ce.zmk.yml create mode 100644 app/boards/arm/pillbug/Kconfig create mode 100644 app/boards/arm/pillbug/Kconfig.board create mode 100644 app/boards/arm/pillbug/Kconfig.defconfig create mode 100644 app/boards/arm/pillbug/blackpill_pins.dtsi create mode 100644 app/boards/arm/pillbug/board.cmake create mode 100644 app/boards/arm/pillbug/pillbug.dts create mode 100644 app/boards/arm/pillbug/pillbug.yaml create mode 100644 app/boards/arm/pillbug/pillbug.zmk.yml create mode 100644 app/boards/arm/pillbug/pillbug_defconfig create mode 100644 app/boards/blackpill_f401ce.conf create mode 100644 app/boards/blackpill_f401ce.overlay create mode 100644 app/boards/blackpill_f411ce.conf create mode 100644 app/boards/blackpill_f411ce.overlay create mode 100644 app/boards/interconnects/blackpill/blackpill.zmk.yml create mode 100644 docs/docs/assets/blackpill/blackpill-pins-labelled.png diff --git a/app/boards/arm/blackpill_f401ce/blackpill_f401ce.zmk.yml b/app/boards/arm/blackpill_f401ce/blackpill_f401ce.zmk.yml new file mode 100644 index 00000000..251d2c27 --- /dev/null +++ b/app/boards/arm/blackpill_f401ce/blackpill_f401ce.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: blackpill_f401ce +name: BlackPill F401CE +type: board +arch: arm +outputs: + - usb +url: https://github.com/WeActStudio/WeActStudio.MiniSTM32F4x1 +exposes: [blackpill] diff --git a/app/boards/arm/blackpill_f411ce/blackpill_f411ce.zmk.yml b/app/boards/arm/blackpill_f411ce/blackpill_f411ce.zmk.yml new file mode 100644 index 00000000..eaa714d6 --- /dev/null +++ b/app/boards/arm/blackpill_f411ce/blackpill_f411ce.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: blackpill_f411ce +name: BlackPill F411CE +type: board +arch: arm +outputs: + - usb +url: https://github.com/WeActStudio/WeActStudio.MiniSTM32F4x1 +exposes: [blackpill] diff --git a/app/boards/arm/pillbug/Kconfig b/app/boards/arm/pillbug/Kconfig new file mode 100644 index 00000000..3d53e324 --- /dev/null +++ b/app/boards/arm/pillbug/Kconfig @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: MIT + +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_PILLBUG) diff --git a/app/boards/arm/pillbug/Kconfig.board b/app/boards/arm/pillbug/Kconfig.board new file mode 100644 index 00000000..70232e18 --- /dev/null +++ b/app/boards/arm/pillbug/Kconfig.board @@ -0,0 +1,6 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_PILLBUG + bool "PillBug" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/pillbug/Kconfig.defconfig b/app/boards/arm/pillbug/Kconfig.defconfig new file mode 100644 index 00000000..8657f8ae --- /dev/null +++ b/app/boards/arm/pillbug/Kconfig.defconfig @@ -0,0 +1,25 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_PILLBUG + +config BOARD + default "PillBug" + +if USB_DEVICE_STACK + +config USB_NRFX + default y + +endif # USB_DEVICE_STACK + +config BT_CTLR + default BT + +config ZMK_BLE + default y + +config ZMK_USB + default y + +endif # BOARD_PILLBUG diff --git a/app/boards/arm/pillbug/blackpill_pins.dtsi b/app/boards/arm/pillbug/blackpill_pins.dtsi new file mode 100644 index 00000000..e7e35140 --- /dev/null +++ b/app/boards/arm/pillbug/blackpill_pins.dtsi @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2022 Kyle McCreery + * + * SPDX-License-Identifier: MIT + */ + +/ { + blackpill: connector { + compatible = "blackpill"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <2 0 &gpio0 9 0> /* PC13 */ + , <3 0 &gpio0 10 0> /* PC14 */ + , <4 0 &gpio1 6 0> /* PC15 */ + , <10 0 &gpio0 25 0> /* PA0 */ + , <11 0 &gpio0 5 0> /* PA1 */ + , <12 0 &gpio1 15 0> /* PA2 */ + , <13 0 &gpio0 2 0> /* PA3 */ + , <14 0 &gpio1 11 0> /* PA4 */ + , <15 0 &gpio1 8 0> /* PA5 */ + , <16 0 &gpio0 26 0> /* PA6 */ + , <17 0 &gpio0 11 0> /* PA7 */ + , <18 0 &gpio1 9 0> /* PB0 */ + , <19 0 &gpio1 14 0> /* PB1 */ + , <20 0 &gpio0 3 0> /* PB2 */ + , <21 0 &gpio0 31 0> /* PB10 */ + , <25 0 &gpio0 12 0> /* PB12 */ + , <26 0 &gpio0 19 0> /* PB13 */ + , <27 0 &gpio1 1 0> /* PB14 */ + , <28 0 &gpio0 29 0> /* PB15 */ + , <29 0 &gpio1 13 0> /* PA8 */ + , <30 0 &gpio0 6 0> /* PA9 */ + , <31 0 &gpio0 8 0> /* PA10 */ + , <38 0 &gpio1 0 0> /* PA15 */ + , <39 0 &gpio1 10 0> /* PB3 */ + , <40 0 &gpio1 2 0> /* PB4 */ + , <41 0 &gpio1 4 0> /* PB5 */ + , <42 0 &gpio0 13 0> /* PB6 */ + , <43 0 &gpio0 15 0> /* PB7 */ + , <45 0 &gpio0 17 0> /* PB8 */ + , <46 0 &gpio0 24 0> /* PB9 */ + ; + }; +}; + +blackpill_i2c: &i2c0 {}; +blackpill_spi: &spi1 {}; +blackpill_serial: &uart0 {}; diff --git a/app/boards/arm/pillbug/board.cmake b/app/boards/arm/pillbug/board.cmake new file mode 100644 index 00000000..992f395d --- /dev/null +++ b/app/boards/arm/pillbug/board.cmake @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: MIT + +set(OPENOCD_NRF5_SUBFAMILY nrf52) +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) +include(${ZEPHYR_BASE}/boards/common/openocd-nrf5.board.cmake) diff --git a/app/boards/arm/pillbug/pillbug.dts b/app/boards/arm/pillbug/pillbug.dts new file mode 100644 index 00000000..85c5cccd --- /dev/null +++ b/app/boards/arm/pillbug/pillbug.dts @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; + +#include +#include "blackpill_pins.dtsi" + +/ { + model = "PillBug"; + compatible = "pillbug"; + + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 20 GPIO_ACTIVE_LOW>; + label = "Blue LED"; + }; + }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 7 GPIO_ACTIVE_LOW>; + init-delay-ms = <50>; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; +}; + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&i2c0 { + compatible = "nordic,nrf-twi"; + sda-pin = <15>; + scl-pin = <13>; +}; + +&spi1{ + status = "disabled"; + compatible = "nordic,nrf-spim"; + sck-pin = <40>; + mosi-pin = <11>; + miso-pin = <26>; +}; + +&uart0 { + compatible = "nordic,nrf-uarte"; + tx-pin = <6>; + rx-pin = <8>; +}; + +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + label = "mbr"; + reg = <0x00000000 0x00001000>; + }; + + code_partition: partition@1000 { + label = "code_partition"; + reg = <0x00001000 0x000d3000>; + }; + + /* + * The flash starting at 0x000d4000 and ending at + * 0x000f3fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@d4000 { + label = "storage"; + reg = <0x000d4000 0x00020000>; + }; + + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; +}; diff --git a/app/boards/arm/pillbug/pillbug.yaml b/app/boards/arm/pillbug/pillbug.yaml new file mode 100644 index 00000000..50aa4486 --- /dev/null +++ b/app/boards/arm/pillbug/pillbug.yaml @@ -0,0 +1,15 @@ +identifier: pillbug +name: PillBug +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/pillbug/pillbug.zmk.yml b/app/boards/arm/pillbug/pillbug.zmk.yml new file mode 100644 index 00000000..5df11b9e --- /dev/null +++ b/app/boards/arm/pillbug/pillbug.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: pillbug +name: PillBug +type: board +arch: arm +outputs: + - usb + - ble +url: https://mechwild.com/product/pillbug +exposes: [blackpill] diff --git a/app/boards/arm/pillbug/pillbug_defconfig b/app/boards/arm/pillbug/pillbug_defconfig new file mode 100644 index 00000000..d71d9f62 --- /dev/null +++ b/app/boards/arm/pillbug/pillbug_defconfig @@ -0,0 +1,22 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_PILLBUG=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y + +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y diff --git a/app/boards/blackpill_f401ce.conf b/app/boards/blackpill_f401ce.conf new file mode 100644 index 00000000..07e304cf --- /dev/null +++ b/app/boards/blackpill_f401ce.conf @@ -0,0 +1,7 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=n +CONFIG_ZMK_KSCAN_MATRIX_POLLING=y diff --git a/app/boards/blackpill_f401ce.overlay b/app/boards/blackpill_f401ce.overlay new file mode 100644 index 00000000..54e360a3 --- /dev/null +++ b/app/boards/blackpill_f401ce.overlay @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + + +/ { + blackpill: connector { + compatible = "blackpill"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <2 0 &gpioc 13 0> /* PC13 */ + , <3 0 &gpioc 14 0> /* PC14 */ + , <4 0 &gpioc 15 0> /* PC15 */ + , <10 0 &gpioa 0 0> /* PA0 */ + , <11 0 &gpioa 1 0> /* PA1 */ + , <12 0 &gpioa 2 0> /* PA2 */ + , <13 0 &gpioa 3 0> /* PA3 */ + , <14 0 &gpioa 4 0> /* PA4 */ + , <15 0 &gpioa 5 0> /* PA5 */ + , <16 0 &gpioa 6 0> /* PA6 */ + , <17 0 &gpioa 7 0> /* PA7 */ + , <18 0 &gpiob 0 0> /* PB0 */ + , <19 0 &gpiob 1 0> /* PB1 */ + , <20 0 &gpiob 2 0> /* PB2 */ + , <21 0 &gpiob 10 0> /* PB10 */ + , <25 0 &gpiob 12 0> /* PB12 */ + , <26 0 &gpiob 13 0> /* PB13 */ + , <27 0 &gpiob 14 0> /* PB14 */ + , <28 0 &gpiob 15 0> /* PB15 */ + , <29 0 &gpioa 8 0> /* PA8 */ + , <30 0 &gpioa 9 0> /* PA9 */ + , <31 0 &gpioa 10 0> /* PA10 */ + , <38 0 &gpioa 15 0> /* PA15 */ + , <39 0 &gpiob 3 0> /* PB3 */ + , <40 0 &gpiob 4 0> /* PB4 */ + , <41 0 &gpiob 5 0> /* PB5 */ + , <42 0 &gpiob 6 0> /* PB6 */ + , <43 0 &gpiob 7 0> /* PB7 */ + , <45 0 &gpiob 8 0> /* PB8 */ + , <46 0 &gpiob 9 0> /* PB9 */ + ; + }; +}; + +blackpill_i2c: &i2c1 {}; +blackpill_spi: &spi1 {}; +blackpill_serial: &usart1 {}; diff --git a/app/boards/blackpill_f411ce.conf b/app/boards/blackpill_f411ce.conf new file mode 100644 index 00000000..07e304cf --- /dev/null +++ b/app/boards/blackpill_f411ce.conf @@ -0,0 +1,7 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=n +CONFIG_ZMK_KSCAN_MATRIX_POLLING=y diff --git a/app/boards/blackpill_f411ce.overlay b/app/boards/blackpill_f411ce.overlay new file mode 100644 index 00000000..54e360a3 --- /dev/null +++ b/app/boards/blackpill_f411ce.overlay @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + + +/ { + blackpill: connector { + compatible = "blackpill"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <2 0 &gpioc 13 0> /* PC13 */ + , <3 0 &gpioc 14 0> /* PC14 */ + , <4 0 &gpioc 15 0> /* PC15 */ + , <10 0 &gpioa 0 0> /* PA0 */ + , <11 0 &gpioa 1 0> /* PA1 */ + , <12 0 &gpioa 2 0> /* PA2 */ + , <13 0 &gpioa 3 0> /* PA3 */ + , <14 0 &gpioa 4 0> /* PA4 */ + , <15 0 &gpioa 5 0> /* PA5 */ + , <16 0 &gpioa 6 0> /* PA6 */ + , <17 0 &gpioa 7 0> /* PA7 */ + , <18 0 &gpiob 0 0> /* PB0 */ + , <19 0 &gpiob 1 0> /* PB1 */ + , <20 0 &gpiob 2 0> /* PB2 */ + , <21 0 &gpiob 10 0> /* PB10 */ + , <25 0 &gpiob 12 0> /* PB12 */ + , <26 0 &gpiob 13 0> /* PB13 */ + , <27 0 &gpiob 14 0> /* PB14 */ + , <28 0 &gpiob 15 0> /* PB15 */ + , <29 0 &gpioa 8 0> /* PA8 */ + , <30 0 &gpioa 9 0> /* PA9 */ + , <31 0 &gpioa 10 0> /* PA10 */ + , <38 0 &gpioa 15 0> /* PA15 */ + , <39 0 &gpiob 3 0> /* PB3 */ + , <40 0 &gpiob 4 0> /* PB4 */ + , <41 0 &gpiob 5 0> /* PB5 */ + , <42 0 &gpiob 6 0> /* PB6 */ + , <43 0 &gpiob 7 0> /* PB7 */ + , <45 0 &gpiob 8 0> /* PB8 */ + , <46 0 &gpiob 9 0> /* PB9 */ + ; + }; +}; + +blackpill_i2c: &i2c1 {}; +blackpill_spi: &spi1 {}; +blackpill_serial: &usart1 {}; diff --git a/app/boards/interconnects/blackpill/blackpill.zmk.yml b/app/boards/interconnects/blackpill/blackpill.zmk.yml new file mode 100644 index 00000000..d3fcdc88 --- /dev/null +++ b/app/boards/interconnects/blackpill/blackpill.zmk.yml @@ -0,0 +1,8 @@ +file_format: "1" +id: blackpill +name: BlackPill +type: interconnect +url: https://github.com/WeActStudio/WeActStudio.MiniSTM32F4x1 +manufacturer: WeAct Studio +description: | + The WeAct Studio BlackPill has grown in popularity due to its low price, availability, and utilization of the powerful STM32F4x1CEU6 microcontroller. The BlackPill features more GPIO than most other boards, but also has a comparatively larger footprint as a result. Many clones and variations of the original BlackPill are available on the market as an affordable and more powerful alternative to many popular boards. The official WeAct variations of the WeAct Studio BlackPill are powered by the STM32F411CEU6 and STM32F401CEU6 microcontrollers. diff --git a/docs/docs/assets/blackpill/blackpill-pins-labelled.png b/docs/docs/assets/blackpill/blackpill-pins-labelled.png new file mode 100644 index 0000000000000000000000000000000000000000..3f15c620d208ef058c5b094a81272aa2d90199df GIT binary patch literal 924160 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�-?M$f@0qbx$xrRIC{--@kgRo!}qItL}@)+UkH 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

<#4Q03z;=HZ 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∨LABwyc0Rs{g-9 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Ðee>^M?pR)WpWZtl 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

uudHOEosX9wVI3IBQuN05Bg>Wrq|F8wV97< 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�JlQdU`^AwjRq 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 + + + +### Pro Micro Shields + ![Labelled Pro Micro pins](../assets/pro-micro/pro-micro-pins-labelled.jpg) ZMK uses the blue color coded pin names to generate devicetree node references. For example, to refer to the node `0` in the devicetree files, use `&pro_micro 0`. + + + + +### BlackPill Shields + +![Labelled BlackPill pins](../assets/blackpill/blackpill-pins-labelled.png) + +ZMK uses the blue color coded pin names to generate devicetree node references. For example, to refer to the node `17` in the devicetree files, use `&blackpill 17`. + + + + Date: Sat, 10 Dec 2022 22:21:54 -0600 Subject: [PATCH 122/289] fix(boards): Add nRF5340 DK metadata file (#1579) --- .../nrf5340dk_nrf5340_cpuapp.zmk.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml diff --git a/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml b/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml new file mode 100644 index 00000000..c8472428 --- /dev/null +++ b/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: nrf5340dk_nrf5340_cpuapp +name: Nordic nRF3840 DK +type: board +arch: arm +outputs: + - usb + - ble +url: https://www.nordicsemi.com/Products/Development-hardware/nrf5340-dk +exposes: [arduino_uno] From 617136b45eac0d2b4cb2bd4f24c8412faacbefba Mon Sep 17 00:00:00 2001 From: JW2586 <70282382+JW2586@users.noreply.github.com> Date: Sun, 11 Dec 2022 04:51:41 +0000 Subject: [PATCH 123/289] feat(shields): Added Waterfowl shield --- .../shields/waterfowl/Kconfig.defconfig | 47 ++++++++ app/boards/shields/waterfowl/Kconfig.shield | 9 ++ app/boards/shields/waterfowl/waterfowl.conf | 6 + app/boards/shields/waterfowl/waterfowl.dtsi | 85 +++++++++++++ app/boards/shields/waterfowl/waterfowl.keymap | 112 ++++++++++++++++++ .../shields/waterfowl/waterfowl.zmk.yml | 14 +++ .../shields/waterfowl/waterfowl_left.conf | 2 + .../shields/waterfowl/waterfowl_left.overlay | 21 ++++ .../shields/waterfowl/waterfowl_right.conf | 2 + .../shields/waterfowl/waterfowl_right.overlay | 26 ++++ 10 files changed, 324 insertions(+) create mode 100644 app/boards/shields/waterfowl/Kconfig.defconfig create mode 100644 app/boards/shields/waterfowl/Kconfig.shield create mode 100644 app/boards/shields/waterfowl/waterfowl.conf create mode 100644 app/boards/shields/waterfowl/waterfowl.dtsi create mode 100644 app/boards/shields/waterfowl/waterfowl.keymap create mode 100644 app/boards/shields/waterfowl/waterfowl.zmk.yml create mode 100644 app/boards/shields/waterfowl/waterfowl_left.conf create mode 100644 app/boards/shields/waterfowl/waterfowl_left.overlay create mode 100644 app/boards/shields/waterfowl/waterfowl_right.conf create mode 100644 app/boards/shields/waterfowl/waterfowl_right.overlay diff --git a/app/boards/shields/waterfowl/Kconfig.defconfig b/app/boards/shields/waterfowl/Kconfig.defconfig new file mode 100644 index 00000000..897184f6 --- /dev/null +++ b/app/boards/shields/waterfowl/Kconfig.defconfig @@ -0,0 +1,47 @@ + +if SHIELD_WATERFOWL_LEFT + +config ZMK_KEYBOARD_NAME + default "Waterfowl" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif + +if SHIELD_WATERFOWL_LEFT || SHIELD_WATERFOWL_RIGHT + +config ZMK_SPLIT + default y + +if ZMK_DISPLAY + +config I2C + default y + +config SSD1306 + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LVGL_VDB_SIZE + default 64 + +config LVGL_DPI + default 148 + +config LVGL_BITS_PER_PIXEL + default 1 + +choice LVGL_COLOR_DEPTH + default LVGL_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif diff --git a/app/boards/shields/waterfowl/Kconfig.shield b/app/boards/shields/waterfowl/Kconfig.shield new file mode 100644 index 00000000..a321b73d --- /dev/null +++ b/app/boards/shields/waterfowl/Kconfig.shield @@ -0,0 +1,9 @@ +#Copyright (c) 2022 The ZMK Contributors +#SPDX-License-Identifier: MIT + + +config SHIELD_WATERFOWL_LEFT + def_bool $(shields_list_contains,waterfowl_left) + +config SHIELD_WATERFOWL_RIGHT + def_bool $(shields_list_contains,waterfowl_right) diff --git a/app/boards/shields/waterfowl/waterfowl.conf b/app/boards/shields/waterfowl/waterfowl.conf new file mode 100644 index 00000000..449e0b1f --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl.conf @@ -0,0 +1,6 @@ +# Uncomment these two line to add support for encoders to your firmware +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the Waterfowl OLED Display +# CONFIG_ZMK_DISPLAY=y diff --git a/app/boards/shields/waterfowl/waterfowl.dtsi b/app/boards/shields/waterfowl/waterfowl.dtsi new file mode 100644 index 00000000..c21dcf07 --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl.dtsi @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; +// | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | +// | MX10 | MX9 | MX8 | MX7 | MX6 | | MX6 | MX7 | MX8 | MX9 | MX10 | +// | MX15 | MX14 | MX13 | MX12 | MX11 | | MX11 | MX12 | MX13 | MX14 | MX15 | +// | MX20 | MX19 | MX18 | MX17 | MX16 | | MX16 | MX17 | MX18 | MX19 | MX20 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + }; + + left_encoder: encoder_left { //roller + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + }; + + right_encoder: encoder_right { //Standard encoder on left half + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + a-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <2>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; + + // TODO: RGB node(s) +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <64>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <63>; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/waterfowl/waterfowl.keymap b/app/boards/shields/waterfowl/waterfowl.keymap new file mode 100644 index 00000000..9a1dabac --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl.keymap @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { +/* 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 | | 2 | | 3 | | N | M | , | . | / | + * `----------------------------------' `-----' `-----' `----------------------------------' + * ,-----. ,--------------------. ,--------------------. ,-----. + * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | + * `-----' `--------------------' `--------------------' `-----' + */ + bindings = < + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &mt LGUI A &mt LALT S &mt LCTRL D &mt LSHFT F &kp G &kp H &mt LSHFT J &mt LCTRL K &mt LALT L &mt LGUI SEMI + &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; + + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; + + navnum_layer { +/* NAVNUM + * + * ,----------------------------------. ,----------------------------------. + * | | PgUp | UP | PgDn | | | / | 7 | 8 | 9 | - | + * |------+------+------+------+------| |------+------+------+------+------| + * | Home | Left | Down | Right| End | | = | 4 | 5 | 6 | + | + * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| + * | | | INS | | | | 2 | | 3 | | 0 | 1 | 2 | 3 | * | + * `----------------------------------' `-----' `-----' `----------------------------------' + * ,-----. ,--------------------. ,--------------------. ,-----. + * | 1 | | DEL | SPACE | MO(3)| | ESC | BS | ENTER | | 4 | + * `-----' `--------------------' `--------------------' `-----' + */ + bindings = < + &trans &kp PG_UP &kp UP &kp PG_DN &trans &kp FSLH &kp N7 &kp N8 &kp N9 &kp MINUS + &kp HOME &kp LEFT &kp DOWN &kp RIGHT &kp END &kp EQUAL &kp N4 &kp N5 &kp N6 &kp PLUS + &trans &trans &kp INS &trans &trans &kp N0 &kp N1 &kp N2 &kp N3 &kp ASTERISK + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; + + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; + + symbol_layer { +/* SYM + * + * ,----------------------------------. ,----------------------------------. + * | % | @ | [ | ] | \ | | | | ^ | | | + * |------+------+------+------+------| |------+------+------+------+------| + * | # | ! | ( | ) | | | | _ | ' | " | ~ | ` | + * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| + * | $ | | { | } | & | | 2 | | 3 | | | | | | | + * `----------------------------------' `-----' `-----' `----------------------------------' + * ,-----. ,--------------------. ,--------------------. ,-----. + * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | + * `-----' `--------------------' `--------------------' `-----' + */ + bindings = < + &kp PRCNT &kp AT &kp LBKT &kp RBKT &kp NON_US_BSLH &trans &trans &kp CARET &trans &trans + &kp HASH &kp EXCL &kp LPAR &kp RPAR &kp PIPE &kp UNDER &kp APOS &kp DOUBLE_QUOTES &kp TILDE &kp GRAVE + &kp DLLR &trans &kp LBRC &kp RBRC &kp AMPS &trans &trans &trans &trans &trans + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; + + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; + + function_layer { +/* FUNC + * + * ,----------------------------------. ,----------------------------------. + * | | | BTCLR| | Reset| | Reset| F7 | F8 | F9 | F11 | + * |------+------+------+------+------| |------+------+------+------+------| + * | BT0 | BT1 | BT2 | BT3 | BT4 | | | F4 | F5 | F6 | F12 | + * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| + * | | | | | | | 2 | | 3 | | F10 | F1 | F2 | F3 | F13 | + * `----------------------------------' `-----' `-----' `----------------------------------' + * ,-----. ,--------------------. ,--------------------. ,-----. + * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | + * `-----' `--------------------' `--------------------' `-----' + */ + bindings = < + &trans &trans &bt BT_CLR &trans &reset &reset &kp F7 &kp F8 &kp F9 &kp F11 + &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &kp F4 &kp F5 &kp F6 &kp F12 + &trans &trans &trans &trans &trans &kp F10 &kp F1 &kp F2 &kp F3 &kp F13 + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; + + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; + + }; +}; \ No newline at end of file diff --git a/app/boards/shields/waterfowl/waterfowl.zmk.yml b/app/boards/shields/waterfowl/waterfowl.zmk.yml new file mode 100644 index 00000000..3cd48686 --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl.zmk.yml @@ -0,0 +1,14 @@ +file_format: "1" +id: waterfowl +name: Waterfowl +type: shield +url: https://waterfowl.bio.link/ +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display + - encoder +siblings: + - waterfowl_left + - waterfowl_right diff --git a/app/boards/shields/waterfowl/waterfowl_left.conf b/app/boards/shields/waterfowl/waterfowl_left.conf new file mode 100644 index 00000000..2f561d0d --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl_left.conf @@ -0,0 +1,2 @@ +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y \ No newline at end of file diff --git a/app/boards/shields/waterfowl/waterfowl_left.overlay b/app/boards/shields/waterfowl/waterfowl_left.overlay new file mode 100644 index 00000000..031936ea --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl_left.overlay @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "waterfowl.dtsi" + +&kscan0 { + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; +}; + +&left_encoder { + status = "okay"; +}; diff --git a/app/boards/shields/waterfowl/waterfowl_right.conf b/app/boards/shields/waterfowl/waterfowl_right.conf new file mode 100644 index 00000000..2f561d0d --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl_right.conf @@ -0,0 +1,2 @@ +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y \ No newline at end of file diff --git a/app/boards/shields/waterfowl/waterfowl_right.overlay b/app/boards/shields/waterfowl/waterfowl_right.overlay new file mode 100644 index 00000000..cff0d53c --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl_right.overlay @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "waterfowl.dtsi" + +&default_transform { + col-offset = <5>; +}; + +&kscan0 { + col-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; +}; + + +&right_encoder { + status = "okay"; +}; From f03e29ca135fb41644cbae40b9233ba7adce4153 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 11 Dec 2022 10:25:09 -0500 Subject: [PATCH 124/289] fix(config): Fix split wired detection in setup.sh. --- docs/src/templates/setup.sh.mustache | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/src/templates/setup.sh.mustache b/docs/src/templates/setup.sh.mustache index a8a2da22..3184aab2 100644 --- a/docs/src/templates/setup.sh.mustache +++ b/docs/src/templates/setup.sh.mustache @@ -136,12 +136,13 @@ if [ "$keyboard_shield" == "y" ]; then continue fi + board_index=$(( $REPLY-1 )) + if [ -n "${!keyboard_sibling_first}" ] && [ "${boards_usb_only[$board_index]}" = "y" ] ; then echo "Wired split is not yet supported by ZMK." exit 1 fi - board_index=$(( $REPLY-1 )) board=${board_ids[$board_index]} board_title=${options[$board_index]} boards=( "${board}" ) From 1425d0f2d9b81c630d8daabef35e3c8489ebb295 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 13 Dec 2022 21:08:54 -0500 Subject: [PATCH 125/289] fix(shields): Fix col-offset for splitkb.com corne Same column offset for both transforms, since we use the same pins for both, just apply a different transform. Fixes: 1570 --- .../splitkb_aurora_corne/splitkb_aurora_corne_right.overlay | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay index b4c4b438..34330400 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay @@ -40,7 +40,7 @@ }; &default_transform { - col-offset = <5>; + col-offset = <6>; }; &five_column_transform { From 408b87ae7b9a5d3bf1040e0e228c4750c4c4e0ca Mon Sep 17 00:00:00 2001 From: Petrus Claviger Date: Wed, 14 Dec 2022 15:51:46 +0100 Subject: [PATCH 126/289] fix(docs): Grammatical fixes (#1587) Co-authored-by: Dom H --- docs/docs/behaviors/bluetooth.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/behaviors/bluetooth.md b/docs/docs/behaviors/bluetooth.md index d21f3832..7c77c4ad 100644 --- a/docs/docs/behaviors/bluetooth.md +++ b/docs/docs/behaviors/bluetooth.md @@ -75,7 +75,7 @@ The bluetooth behavior completes an bluetooth action given on press. ZMK support bluetooth “profiles” which allows connection to multiple devices (5 by default). Each profile stores the bluetooth MAC address of a peer, which can be empty if a profile has not been paired with a device yet. Upon switching to a profile, ZMK does the following: -- If a profile has not been paired with a peer yet, ZMK automatically advertise itself as connectable. You can discover you keyboard from bluetooth scanning on your laptop / tablet. If you try to connect, it will trigger the _pairing_ procedure. After pairing, the bluetooth MAC address of the peer device will be stored in the current profile. Pairing also negotiate a random key for secure communication between the device and the keyboard. +- If a profile has not been paired with a peer yet, ZMK automatically advertises itself as connectable. You can discover your keyboard from bluetooth scanning on your laptop / tablet. If you try to connect, it will trigger the _pairing_ procedure. After pairing, the bluetooth MAC address of the peer device will be stored in the current profile. Pairing also negotiates a random key for secure communication between the device and the keyboard. - If a profile has been paired but the peer is not connected yet, ZMK will also advertise itself as connectable. In the future, the behavior might change to _direct advertising_ which only target the peer with the stored bluetooth MAC address. In this state, if the peer is powered on and moved within the distance of bluetooth signal coverage, it should automatically connect to the keyboard. - If a profile has been paired and is currently connected, ZMK will not advertise it as connectable. From 4faf6eba97d91e8d9ec5fdbfb7b3a637228cc32d Mon Sep 17 00:00:00 2001 From: hyx0329 Date: Wed, 14 Dec 2022 17:02:04 +0800 Subject: [PATCH 127/289] feat(boards): Add battery sensor for Makerdiary M60 keyboard Signed-off-by: hyx0329 --- app/boards/arm/nrf52840_m2/nrf52840_m2.dts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts index 5ea852e9..dc22c40b 100644 --- a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts +++ b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts @@ -16,6 +16,7 @@ zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; }; leds { @@ -34,6 +35,14 @@ }; }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1000000>; + full-ohms = <(1000000 + 1000000)>; + }; + }; &adc { From 984b16e03bfbaf74c61061fc6489aee5b861c1f8 Mon Sep 17 00:00:00 2001 From: Jerome Olivier <33301870+jeromeOlivier@users.noreply.github.com> Date: Fri, 16 Dec 2022 11:52:26 -0500 Subject: [PATCH 128/289] feat(boards): Add preonic_rev3 board. --- app/boards/arm/preonic/CMakeLists.txt | 4 + app/boards/arm/preonic/Kconfig.board | 8 + app/boards/arm/preonic/Kconfig.defconfig | 17 +++ app/boards/arm/preonic/board.cmake | 7 + app/boards/arm/preonic/preonic_rev3.dts | 139 ++++++++++++++++++ app/boards/arm/preonic/preonic_rev3.keymap | 65 ++++++++ app/boards/arm/preonic/preonic_rev3.yaml | 19 +++ app/boards/arm/preonic/preonic_rev3.zmk.yml | 10 ++ app/boards/arm/preonic/preonic_rev3_defconfig | 15 ++ 9 files changed, 284 insertions(+) create mode 100644 app/boards/arm/preonic/CMakeLists.txt create mode 100644 app/boards/arm/preonic/Kconfig.board create mode 100644 app/boards/arm/preonic/Kconfig.defconfig create mode 100644 app/boards/arm/preonic/board.cmake create mode 100644 app/boards/arm/preonic/preonic_rev3.dts create mode 100644 app/boards/arm/preonic/preonic_rev3.keymap create mode 100644 app/boards/arm/preonic/preonic_rev3.yaml create mode 100644 app/boards/arm/preonic/preonic_rev3.zmk.yml create mode 100644 app/boards/arm/preonic/preonic_rev3_defconfig diff --git a/app/boards/arm/preonic/CMakeLists.txt b/app/boards/arm/preonic/CMakeLists.txt new file mode 100644 index 00000000..91bd0988 --- /dev/null +++ b/app/boards/arm/preonic/CMakeLists.txt @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: MIT + +list(APPEND EXTRA_DTC_FLAGS "-qq") + diff --git a/app/boards/arm/preonic/Kconfig.board b/app/boards/arm/preonic/Kconfig.board new file mode 100644 index 00000000..a930b90f --- /dev/null +++ b/app/boards/arm/preonic/Kconfig.board @@ -0,0 +1,8 @@ +# Preonic V3 board configuration + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_PREONIC_REV3 + bool "Preonic V3 Keyboard" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/preonic/Kconfig.defconfig b/app/boards/arm/preonic/Kconfig.defconfig new file mode 100644 index 00000000..186c88bc --- /dev/null +++ b/app/boards/arm/preonic/Kconfig.defconfig @@ -0,0 +1,17 @@ +# Preonic keyboard configuration + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_PREONIC_REV3 + +config ZMK_KEYBOARD_NAME + default "Preonic V3" + +config ZMK_USB + default y + +config ZMK_KSCAN_MATRIX_POLLING + default y + +endif # BOARD_PREONIC_REV3 diff --git a/app/boards/arm/preonic/board.cmake b/app/boards/arm/preonic/board.cmake new file mode 100644 index 00000000..772796da --- /dev/null +++ b/app/boards/arm/preonic/board.cmake @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: MIT + +board_runner_args(dfu-util "--pid=0483:df11" "--alt=0" "--dfuse") +board_runner_args(jlink "--device=STM32F303VC" "--speed=4000") + +include(${ZEPHYR_BASE}/boards/common/dfu-util.board.cmake) +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) diff --git a/app/boards/arm/preonic/preonic_rev3.dts b/app/boards/arm/preonic/preonic_rev3.dts new file mode 100644 index 00000000..c19b1319 --- /dev/null +++ b/app/boards/arm/preonic/preonic_rev3.dts @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; +#include +#include +#include + + +/ { + model = "Preonic PCD, rev3"; + compatible = "preonic,rev3", "st,stm32f303"; + + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zmk,kscan = &kscan0; + zmk,matrix_transform = &layout_grid_transform; + }; + + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; + row-gpios + = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioc 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioc 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioc 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpiob 11 GPIO_ACTIVE_HIGH> + , <&gpiob 10 GPIO_ACTIVE_HIGH> + , <&gpiob 2 GPIO_ACTIVE_HIGH> + , <&gpiob 1 GPIO_ACTIVE_HIGH> + , <&gpioa 7 GPIO_ACTIVE_HIGH> + , <&gpiob 0 GPIO_ACTIVE_HIGH> + ; + }; + + layout_grid_transform: + keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <6>; + rows = <10>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(7,0) RC(7,1) RC(7,2) RC(7,3) RC(7,4) RC(7,5) + RC(8,0) RC(8,1) RC(8,2) RC(9,3) RC(9,4) RC(9,5) RC(9,0) RC(9,1) RC(9,2) RC(8,3) RC(8,4) RC(8,5) + >; + }; + + layout_mit_transform: + keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <6>; + rows = <10>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(7,0) RC(7,1) RC(7,2) RC(7,3) RC(7,4) RC(7,5) + RC(8,0) RC(8,1) RC(8,2) RC(9,3) RC(9,4) RC(9,0) RC(9,1) RC(9,2) RC(8,3) RC(8,4) RC(8,5) + >; + }; + + layout_2x2u_transform: + keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <6>; + rows = <10>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(7,0) RC(7,1) RC(7,2) RC(7,3) RC(7,4) RC(7,5) + RC(8,0) RC(8,1) RC(8,2) RC(9,3) RC(9,5) RC(9,1) RC(9,2) RC(8,3) RC(8,4) RC(8,5) + >; + }; +}; + +&usb { + pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; + pinctrl-names = "default"; + status = "okay"; +cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + +&clk_hse { + status = "okay"; + clock-frequency = ; +}; + +&pll { + prediv = <1>; + mul = <9>; + clocks = <&clk_hse>; + status = "okay"; +}; + +&rcc { + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <2>; + apb2-prescaler = <1>; +}; + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Set 6Kb of storage at the end of the 256Kb of flash */ + storage_partition: partition@3e800 { + label = "storage"; + reg = <0x0003e800 0x00001800>; + }; + }; +}; diff --git a/app/boards/arm/preonic/preonic_rev3.keymap b/app/boards/arm/preonic/preonic_rev3.keymap new file mode 100644 index 00000000..350fe6de --- /dev/null +++ b/app/boards/arm/preonic/preonic_rev3.keymap @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include + +#define DEFAULT 0 +#define LOWER 1 +#define RAISE 2 + +/ { + chosen { zmk,matrix_transform = &layout_grid_transform; }; + keymap { + compatible = "zmk,keymap"; + default_layer { + // ------------------------------------------------------------------------------------------------- + // | GRAV | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | BSPC | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | DEL | + // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | + // | | LGUI | LALT | LCTL | LOWER | SPACE | SPACE | RAISE | LEFT | DOWN | UP | RIGHT | + bindings = < + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp DEL + &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHIFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET + &none &kp LCTRL &kp LALT &kp LGUI &mo LOWER &kp SPACE &kp SPACE &mo RAISE &kp LEFT &kp DOWN &kp UP &kp RIGHT + >; + }; + lower { + // ------------------------------------------------------------------------------------------ + // | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | BSPC | + // | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | DEL | + // | DEL | F1 | F2 | F3 | F4 | F5 | F6 | - | + | [ | ] | | | + // | | F7 | F8 | F9 | F10 | F11 | F12 | | LCTL | HOME | END | | + // | LALT | | | | | | | | NEXT | VOL- | VOL+ | PLAY | + bindings = < + &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp BSPC + &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp PLUS &kp LEFT_BRACKET &kp RIGHT_BRACKET &kp PIPE + &none &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &none &kp LCTRL &kp HOME &kp END &none + &kp LALT &none &none &none &trans &none &none &none &kp C_NEXT &kp C_VOL_UP &kp C_VOL_UP &kp C_PLAY + >; + }; + raise { + // ------------------------------------------------------------------------------------------- + // | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | BSPC | + // | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | DEL | + // | DEL | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + // | | F7 | F8 | F9 | F10 | F11 | F12 | # | \ | PGUP | PGDN | | + // | | | | | | SHIFT | | | NEXT | VOL- | VOL+ | PLAY | + bindings = < + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp KP_EQUAL &kp LEFT_BRACKET &kp RIGHT_BRACKET &kp BSLH + &none &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &none + &none &none &none &none &none &kp LSHIFT &none &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY + >; + }; + }; +}; diff --git a/app/boards/arm/preonic/preonic_rev3.yaml b/app/boards/arm/preonic/preonic_rev3.yaml new file mode 100644 index 00000000..679e1464 --- /dev/null +++ b/app/boards/arm/preonic/preonic_rev3.yaml @@ -0,0 +1,19 @@ +identifier: preonic_rev3 +name: PREONICREV3 +type: keyboard +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +ram: 40 +supported: + - gpio + - i2c + - counter + - spi + - usb_device + - lsm303dlhc + - nvs + - can + - kscan \ No newline at end of file diff --git a/app/boards/arm/preonic/preonic_rev3.zmk.yml b/app/boards/arm/preonic/preonic_rev3.zmk.yml new file mode 100644 index 00000000..bd9d9579 --- /dev/null +++ b/app/boards/arm/preonic/preonic_rev3.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: preonic_rev3 +name: Preonic Rev3 +type: board +arch: arm +features: + - keys +outputs: + - usb +url: https://olkb.com/collections/preonic diff --git a/app/boards/arm/preonic/preonic_rev3_defconfig b/app/boards/arm/preonic/preonic_rev3_defconfig new file mode 100644 index 00000000..ab19d10f --- /dev/null +++ b/app/boards/arm/preonic/preonic_rev3_defconfig @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_STM32F3X=y +CONFIG_SOC_STM32F303XC=y +# 72MHz system clock +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=72000000 + +# enable pinctrl +CONFIG_PINCTRL=y + +# enable GPIO +CONFIG_GPIO=y + +# clock configuration +CONFIG_CLOCK_CONTROL=y From 4a3e783f3212e584e86494db2af8e30f362ecace Mon Sep 17 00:00:00 2001 From: Darryldh Date: Fri, 16 Dec 2022 11:57:25 -0500 Subject: [PATCH 129/289] feat(boards): Add Corne-ish zen v2 Co-authored-by: Pete Johanson --- app/boards/arm/corneish_zen/CMakeLists.txt | 60 ++++++++ app/boards/arm/corneish_zen/Kconfig.board | 12 ++ app/boards/arm/corneish_zen/Kconfig.defconfig | 81 ++++++++++ app/boards/arm/corneish_zen/board.cmake | 5 + app/boards/arm/corneish_zen/corneish_zen.dtsi | 126 ++++++++++++++++ .../arm/corneish_zen/corneish_zen.keymap | 67 +++++++++ app/boards/arm/corneish_zen/corneish_zen.yaml | 20 +++ .../arm/corneish_zen/corneish_zen_v2.yaml | 20 +++ .../arm/corneish_zen/corneish_zen_v2.zmk.yml | 15 ++ .../arm/corneish_zen/corneish_zen_v2_left.dts | 78 ++++++++++ .../corneish_zen_v2_left_defconfig | 91 ++++++++++++ .../corneish_zen/corneish_zen_v2_right.dts | 86 +++++++++++ .../corneish_zen_v2_right_defconfig | 83 +++++++++++ .../arm/corneish_zen/custom_status_screen.c | 85 +++++++++++ .../arm/corneish_zen/custom_status_screen.h | 12 ++ .../arm/corneish_zen/widgets/battery_status.c | 97 ++++++++++++ .../arm/corneish_zen/widgets/battery_status.h | 20 +++ .../corneish_zen/widgets/icons/CMakeLists.txt | 4 + .../widgets/icons/USB_connected.c | 41 ++++++ .../arm/corneish_zen/widgets/icons/batt_0.c | 43 ++++++ .../corneish_zen/widgets/icons/batt_0_chg.c | 43 ++++++ .../arm/corneish_zen/widgets/icons/batt_100.c | 43 ++++++ .../corneish_zen/widgets/icons/batt_100_chg.c | 43 ++++++ .../arm/corneish_zen/widgets/icons/batt_25.c | 43 ++++++ .../corneish_zen/widgets/icons/batt_25_chg.c | 43 ++++++ .../arm/corneish_zen/widgets/icons/batt_5.c | 43 ++++++ .../arm/corneish_zen/widgets/icons/batt_50.c | 43 ++++++ .../corneish_zen/widgets/icons/batt_50_chg.c | 43 ++++++ .../corneish_zen/widgets/icons/batt_5_chg.c | 43 ++++++ .../arm/corneish_zen/widgets/icons/batt_75.c | 43 ++++++ .../corneish_zen/widgets/icons/batt_75_chg.c | 43 ++++++ .../widgets/icons/bluetooth_advertising.c | 42 ++++++ .../widgets/icons/bluetooth_advertising_1.c | 47 ++++++ .../widgets/icons/bluetooth_advertising_2.c | 47 ++++++ .../widgets/icons/bluetooth_advertising_3.c | 47 ++++++ .../widgets/icons/bluetooth_advertising_4.c | 47 ++++++ .../widgets/icons/bluetooth_advertising_5.c | 47 ++++++ .../widgets/icons/bluetooth_connected_1.c | 47 ++++++ .../widgets/icons/bluetooth_connected_2.c | 47 ++++++ .../widgets/icons/bluetooth_connected_3.c | 47 ++++++ .../widgets/icons/bluetooth_connected_4.c | 47 ++++++ .../widgets/icons/bluetooth_connected_5.c | 47 ++++++ .../widgets/icons/bluetooth_connected_right.c | 49 +++++++ .../icons/bluetooth_disconnected_right.c | 49 +++++++ .../arm/corneish_zen/widgets/icons/layers.c | 44 ++++++ .../arm/corneish_zen/widgets/icons/layers2.c | 40 +++++ .../arm/corneish_zen/widgets/icons/zenlogo.c | 58 ++++++++ .../arm/corneish_zen/widgets/layer_status.c | 67 +++++++++ .../arm/corneish_zen/widgets/layer_status.h | 19 +++ .../arm/corneish_zen/widgets/output_status.c | 138 ++++++++++++++++++ .../arm/corneish_zen/widgets/output_status.h | 19 +++ .../corneish_zen/widgets/peripheral_status.c | 61 ++++++++ .../corneish_zen/widgets/peripheral_status.h | 20 +++ app/package-lock.json | 17 ++- app/src/display/Kconfig | 1 - app/src/display/main.c | 8 +- 56 files changed, 2611 insertions(+), 10 deletions(-) create mode 100644 app/boards/arm/corneish_zen/CMakeLists.txt create mode 100644 app/boards/arm/corneish_zen/Kconfig.board create mode 100644 app/boards/arm/corneish_zen/Kconfig.defconfig create mode 100644 app/boards/arm/corneish_zen/board.cmake create mode 100644 app/boards/arm/corneish_zen/corneish_zen.dtsi create mode 100644 app/boards/arm/corneish_zen/corneish_zen.keymap create mode 100644 app/boards/arm/corneish_zen/corneish_zen.yaml create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v2.yaml create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v2.zmk.yml create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v2_left.dts create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v2_right.dts create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig create mode 100644 app/boards/arm/corneish_zen/custom_status_screen.c create mode 100644 app/boards/arm/corneish_zen/custom_status_screen.h create mode 100644 app/boards/arm/corneish_zen/widgets/battery_status.c create mode 100644 app/boards/arm/corneish_zen/widgets/battery_status.h create mode 100644 app/boards/arm/corneish_zen/widgets/icons/CMakeLists.txt create mode 100644 app/boards/arm/corneish_zen/widgets/icons/USB_connected.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_0.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_0_chg.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_100.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_100_chg.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_25.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_25_chg.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_5.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_50.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_50_chg.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_5_chg.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_75.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_75_chg.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_1.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_2.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_3.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_4.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_5.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_1.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_2.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_3.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_4.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_5.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_right.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_disconnected_right.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/layers.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/layers2.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/zenlogo.c create mode 100644 app/boards/arm/corneish_zen/widgets/layer_status.c create mode 100644 app/boards/arm/corneish_zen/widgets/layer_status.h create mode 100644 app/boards/arm/corneish_zen/widgets/output_status.c create mode 100644 app/boards/arm/corneish_zen/widgets/output_status.h create mode 100644 app/boards/arm/corneish_zen/widgets/peripheral_status.c create mode 100644 app/boards/arm/corneish_zen/widgets/peripheral_status.h diff --git a/app/boards/arm/corneish_zen/CMakeLists.txt b/app/boards/arm/corneish_zen/CMakeLists.txt new file mode 100644 index 00000000..09820577 --- /dev/null +++ b/app/boards/arm/corneish_zen/CMakeLists.txt @@ -0,0 +1,60 @@ +if(CONFIG_ZMK_DISPLAY) + target_sources_ifdef(CONFIG_CUSTOM_WIDGET_BATTERY_STATUS app PRIVATE widgets/battery_status.c) + target_sources_ifdef(CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS app PRIVATE widgets/output_status.c) + target_sources_ifdef(CONFIG_CUSTOM_WIDGET_LAYER_STATUS app PRIVATE widgets/layer_status.c) + target_sources_ifdef(CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS app PRIVATE widgets/peripheral_status.c) + + add_subdirectory_ifdef(CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM widgets/icons) +endif() + +zephyr_library() + +if(CONFIG_ZMK_DISPLAY) + if(CONFIG_CUSTOM_WIDGET_BATTERY_STATUS) + zephyr_library_sources(widgets/icons/batt_100.c) + zephyr_library_sources(widgets/icons/batt_100_chg.c) + zephyr_library_sources(widgets/icons/batt_75.c) + zephyr_library_sources(widgets/icons/batt_75_chg.c) + zephyr_library_sources(widgets/icons/batt_50.c) + zephyr_library_sources(widgets/icons/batt_50_chg.c) + zephyr_library_sources(widgets/icons/batt_25.c) + zephyr_library_sources(widgets/icons/batt_25_chg.c) + zephyr_library_sources(widgets/icons/batt_5.c) + zephyr_library_sources(widgets/icons/batt_5_chg.c) + zephyr_library_sources(widgets/icons/batt_0.c) + zephyr_library_sources(widgets/icons/batt_0_chg.c) + endif() + if(CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS) + zephyr_library_sources(widgets/icons/bluetooth_advertising.c) + zephyr_library_sources(widgets/icons/bluetooth_connected_right.c) + zephyr_library_sources(widgets/icons/bluetooth_disconnected_right.c) + endif() + if(CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS) + zephyr_library_sources(widgets/icons/USB_connected.c) + zephyr_library_sources(widgets/icons/bluetooth_connected_1.c) + zephyr_library_sources(widgets/icons/bluetooth_connected_2.c) + zephyr_library_sources(widgets/icons/bluetooth_connected_3.c) + zephyr_library_sources(widgets/icons/bluetooth_connected_4.c) + zephyr_library_sources(widgets/icons/bluetooth_connected_5.c) + zephyr_library_sources(widgets/icons/bluetooth_advertising_1.c) + zephyr_library_sources(widgets/icons/bluetooth_advertising_2.c) + zephyr_library_sources(widgets/icons/bluetooth_advertising_3.c) + zephyr_library_sources(widgets/icons/bluetooth_advertising_4.c) + zephyr_library_sources(widgets/icons/bluetooth_advertising_5.c) + zephyr_library_sources(widgets/icons/bluetooth_disconnected_right.c) + endif() + if(CONFIG_CUSTOM_WIDGET_LAYER_STATUS) + zephyr_library_sources(widgets/icons/layers.c) + zephyr_library_sources(widgets/icons/layers2.c) + endif() + if(CONFIG_BOARD_CORNEISH_ZEN_V2_RIGHT) + zephyr_library_sources(widgets/icons/zenlogo.c) + endif() +endif() + +zephyr_library_include_directories(${ZEPHYR_LVGL_MODULE_DIR}) +zephyr_library_include_directories(${ZEPHYR_BASE}/lib/gui/lvgl/) +zephyr_library_sources_ifdef(CONFIG_ZMK_DISPLAY custom_status_screen.c) +zephyr_library_sources(${ZEPHYR_BASE}/misc/empty_file.c) +zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) +zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/Kconfig.board b/app/boards/arm/corneish_zen/Kconfig.board new file mode 100644 index 00000000..33baa110 --- /dev/null +++ b/app/boards/arm/corneish_zen/Kconfig.board @@ -0,0 +1,12 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +config BOARD_CORNEISH_ZEN_V2_LEFT + bool "corneish zen left v2" + depends on SOC_NRF52840_QIAA + +config BOARD_CORNEISH_ZEN_V2_RIGHT + bool "corneish zen right v2" + depends on SOC_NRF52840_QIAA \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig new file mode 100644 index 00000000..a88cc5ca --- /dev/null +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -0,0 +1,81 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +if BOARD_CORNEISH_ZEN_V2_LEFT + +config ZMK_KEYBOARD_NAME + default "Corne-ish Zen" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif # BOARD_CORNEISH_ZEN_V2_LEFT + + +if BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT + +config BOARD + default "corneish_zen" + +config ZMK_SPLIT + default y + +config BT_CTLR + default BT + +config ZMK_BLE + default y + +config ZMK_USB + default y + +if USB + +config USB_NRFX + default y + +config USB_DEVICE_STACK + default y + +endif # USB + +config ZMK_DISPLAY + select LVGL_USE_CONT + select LVGL_FONT_MONTSERRAT_26 + select LVGL_FONT_MONTSERRAT_20 + select LVGL_FONT_MONTSERRAT_16 + select LVGL_USE_LABEL + select LVGL_USE_IMG + +choice ZMK_DISPLAY_STATUS_SCREEN + default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM +endchoice + +if ZMK_DISPLAY + +config SPI + default y + +config IL0323 + default y + +config ZMK_DISPLAY_BLANK_ON_IDLE + default n + +endif # ZMK_DISPLAY + +menuconfig CUSTOM_WIDGET_BATTERY_STATUS + bool "custom battery status widget" + +menuconfig CUSTOM_WIDGET_OUTPUT_STATUS + bool "custom output status widget" + +menuconfig CUSTOM_WIDGET_LAYER_STATUS + bool "custom layer status widget" + +menuconfig CUSTOM_WIDGET_PERIPHERAL_STATUS + bool "custom peripheral status widget" + +endif # BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT diff --git a/app/boards/arm/corneish_zen/board.cmake b/app/boards/arm/corneish_zen/board.cmake new file mode 100644 index 00000000..fa847d50 --- /dev/null +++ b/app/boards/arm/corneish_zen/board.cmake @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: MIT + +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/arm/corneish_zen/corneish_zen.dtsi b/app/boards/arm/corneish_zen/corneish_zen.dtsi new file mode 100644 index 00000000..f203c9f8 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -0,0 +1,126 @@ +/* +* +* Copyright (c) 2021 Darryl deHaan +* SPDX-License-Identifier: MIT +* +*/ + +/dts-v1/; +#include + +#include + +/ { + model = "corneish_zen_v2"; + compatible = "corneish_zen_v2"; + + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zmk,kscan = &kscan0; + zmk,display = &epd; + zmk,battery = &vbatt; + zephyr,console = &cdc_acm_uart; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; + + // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | + // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | + // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | + // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) + >; + }; + + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; + + // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | + // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | + // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | + // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | + map = < + RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) + RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) + RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) + >; + }; + +}; + + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; + + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; + + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; +}; \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/corneish_zen.keymap b/app/boards/arm/corneish_zen/corneish_zen.keymap new file mode 100644 index 00000000..72d0b8f1 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen.keymap @@ -0,0 +1,67 @@ +/* +* +* Copyright (c) 2021 Darryl deHaan +* SPDX-License-Identifier: MIT +* +*/ + +#include +#include +#include + +/ { + chosen { + zmk,matrix_transform = &default_transform; + //zmk,matrix_transform = &five_column_transform; + }; +}; + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { + label = "QWERTY"; +// ----------------------------------------------------------------------------------------- +// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | +// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | +// | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC | +// | GUI | LWR | SPC | | ENT | RSE | ALT | + bindings = < + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp ESC + &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT + >; + }; + lower_layer { + label = "NUMBER"; +// ----------------------------------------------------------------------------------------- +// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSP | +// | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | +// | SHFT | | | | | | | | | | | | | +// | GUI | | SPC | | ENT | | ALT | + bindings = < + &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans + &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + >; + }; + + raise_layer { + label = "SYMBOL"; +// ----------------------------------------------------------------------------------------- +// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BKSP | +// | CTRL | | | | | | | - | = | [ | ] | \ | ` | +// | SHFT | | | | | | | _ | + | { | } | "|" | ~ | +// | GUI | | SPC | | ENT | | ALT | + bindings = < + &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC + &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE + &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + >; + }; + }; +}; \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/corneish_zen.yaml b/app/boards/arm/corneish_zen/corneish_zen.yaml new file mode 100644 index 00000000..7975b262 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen.yaml @@ -0,0 +1,20 @@ +identifier: corne-ish_zen_v2 +name: Corne-ish Zen v2 +url: https://lowprokb.ca/collections/keyboards/products/corne-ish-zen +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +ram: 40 +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog + - gpio + - i2c + - spi diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2.yaml b/app/boards/arm/corneish_zen/corneish_zen_v2.yaml new file mode 100644 index 00000000..46a213d9 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v2.yaml @@ -0,0 +1,20 @@ +identifier: corneish_zen_v2 +name: Corne-ish Zen v2 +type: keyboard +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - gpio + - i2c + - counter + - spi + - usb_device + - lsm303dlhc + - nvs + - can + - kscan + - ble + - adc diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2.zmk.yml b/app/boards/arm/corneish_zen/corneish_zen_v2.zmk.yml new file mode 100644 index 00000000..37c1cef4 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v2.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: corneish_zen_v2 +name: Corneish Zen v2 +url: https://lowprokb.ca/collections/keyboards/products/corne-ish-zen +type: board +arch: arm +features: + - keys + - display +outputs: + - usb + - ble +siblings: + - corneish_zen_v2_left + - corneish_zen_v2_right diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts new file mode 100644 index 00000000..2d8f0a81 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -0,0 +1,78 @@ +/* +* +* Copyright (c) 2021 Darryl deHaan +* SPDX-License-Identifier: MIT +* +*/ + +#include "corneish_zen.dtsi" + +/{ + chosen { + zephyr,display = &epd; + zmk,battery = &vbatt; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + col-gpios + = <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + ; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1960000>; + full-ohms = <(1960000 + 810000)>; + }; + +}; + +&spi0 { + status = "okay"; + compatible = "nordic,nrf-spim"; + sck-pin = <27>; + mosi-pin = <8>; + miso-pin = <22>; + cs-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>; + + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 24 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + cdi = <0xd2>; + tcon = <0x22>; + }; +}; \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig new file mode 100644 index 00000000..eb1e552a --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -0,0 +1,91 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_CORNEISH_ZEN_V2_LEFT=y +CONFIG_ZMK_SPLIT=y +CONFIG_ZMK_SLEEP=y +CONFIG_ZMK_DISPLAY=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y + +# Enable SPI +CONFIG_SPI=y +CONFIG_SPI_NRFX=y + +# Enable writing to flash +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y +CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y + +# enable display drivers +CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y +CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 +CONFIG_SSD1306=n +CONFIG_IL0323=y +CONFIG_LVGL_BITS_PER_PIXEL=1 +CONFIG_LVGL_COLOR_DEPTH_1=y +CONFIG_LVGL_DPI=145 +CONFIG_LVGL_VDB_SIZE=100 +CONFIG_LVGL_USE_THEME_MONO=y +CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_RED=n +CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_RED=n +CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_BLACK=y +CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_WHITE=y +CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_16=y +CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y + +# custom status screens +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN=n +CONFIG_CUSTOM_WIDGET_BATTERY_STATUS=y +CONFIG_ZMK_WIDGET_BATTERY_STATUS=n +CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS=y +CONFIG_ZMK_WIDGET_OUTPUT_STATUS=n +CONFIG_CUSTOM_WIDGET_LAYER_STATUS=y +CONFIG_ZMK_WIDGET_LAYER_STATUS=n + +# Turn on logging, and set ZMK logging to debug output +#CONFIG_LOG=y +#CONFIG_ZMK_USB_LOGGING=y +#CONFIG_ZMK_LOG_LEVEL_DBG=y +#CONFIG_LOG_BUFFER_SIZE=65536 +#CONFIG_LOG_STRDUP_BUF_COUNT=160 +#CONFIG_I2C_LOG_LEVEL_DBG=y +#CONFIG_SPI_LOG_LEVEL_DBG=y +#CONFIG_DISPLAY_LOG_LEVEL_DBG=y +#CONFIG_LVGL_LOG_LEVEL_DBG=y +#CONFIG_LVGL_USE_DEBUG=y +#CONFIG_SENSOR_LOG_LEVEL_DBG=y + +# Turn on USB CDC ACM device +CONFIG_USB_DEVICE_STACK=y +CONFIG_USB_CDC_ACM=y +CONFIG_USB_CDC_ACM_RINGBUF_SIZE=1024 + +# Enable serial console +CONFIG_SERIAL=y +CONFIG_CONSOLE=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_UART_LINE_CTRL=y + +# Enable USB UART +CONFIG_UART_CONSOLE=y + + diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts new file mode 100644 index 00000000..097872f5 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts @@ -0,0 +1,86 @@ +/* +* +* Copyright (c) 2021 Darryl deHaan +* SPDX-License-Identifier: MIT +* +*/ + +#include "corneish_zen.dtsi" + +/{ + chosen { + zephyr,display = &epd; + zmk,battery = &vbatt; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + col-gpios + = <&gpio0 19 GPIO_ACTIVE_HIGH> + , <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + ; + + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1960000>; + full-ohms = <(1960000 + 810000)>; + }; +}; + +&default_transform { + col-offset = <6>; +}; +&five_column_transform { + col-offset = <6>; +}; + +&spi0 { + status = "okay"; + compatible = "nordic,nrf-spim"; + sck-pin = <20>; + mosi-pin = <24>; + miso-pin = <27>; + cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; + + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + //softstart = [17 17 17 17]; + cdi = <0xd2>; + tcon = <0x22>; + }; +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig new file mode 100644 index 00000000..46b40dee --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -0,0 +1,83 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_CORNEISH_ZEN_V2_RIGHT=y +CONFIG_ZMK_SPLIT=y +CONFIG_ZMK_SLEEP=y +CONFIG_ZMK_DISPLAY=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y + +# Enable SPI +CONFIG_SPI=y +CONFIG_SPI_NRFX=y + +# Enable writing to flash +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y +CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y + +# enable display drivers +CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y +CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 +CONFIG_SSD1306=n +CONFIG_IL0323=y +CONFIG_LVGL_BITS_PER_PIXEL=1 +CONFIG_LVGL_COLOR_DEPTH_1=y +CONFIG_LVGL_DPI=145 +CONFIG_LVGL_VDB_SIZE=100 +CONFIG_LVGL_USE_THEME_MONO=y +CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_RED=n +CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_RED=n +CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_BLACK=y +CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_WHITE=y +CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_16=y +CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y + +# custom status screens +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN=n +CONFIG_CUSTOM_WIDGET_BATTERY_STATUS=y +CONFIG_ZMK_WIDGET_BATTERY_STATUS=n +CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS=y +CONFIG_ZMK_WIDGET_PERIPHERAL_STATUS=n + +# Turn on logging, and set ZMK logging to debug output +#CONFIG_LOG=y +#CONFIG_LOG_PROCESS_THREAD_STARTUP_DELAY_MS=8000 +#CONFIG_ZMK_USB_LOGGING=y +#CONFIG_ZMK_LOG_LEVEL_DBG=y +#CONFIG_LOG_BUFFER_SIZE=20000 +#CONFIG_LOG_STRDUP_BUF_COUNT=60 +#CONFIG_I2C_LOG_LEVEL_DBG=y +#CONFIG_SPI_LOG_LEVEL_DBG=y +#CONFIG_DISPLAY_LOG_LEVEL_DBG=y +#CONFIG_LVGL_LOG_LEVEL_DBG=y +#CONFIG_LVGL_USE_DEBUG=y +#CONFIG_SENSOR_LOG_LEVEL_DBG=y + +# Enable serial console +CONFIG_SERIAL=y +CONFIG_CONSOLE=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_UART_LINE_CTRL=y + +# Enable USB UART +CONFIG_UART_CONSOLE=y diff --git a/app/boards/arm/corneish_zen/custom_status_screen.c b/app/boards/arm/corneish_zen/custom_status_screen.c new file mode 100644 index 00000000..7842925e --- /dev/null +++ b/app/boards/arm/corneish_zen/custom_status_screen.c @@ -0,0 +1,85 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include "widgets/battery_status.h" +#include "widgets/peripheral_status.h" +#include "widgets/output_status.h" +#include "widgets/layer_status.h" +#include "custom_status_screen.h" + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +LV_IMG_DECLARE(zenlogo); +LV_IMG_DECLARE(layers2); + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_BATTERY_STATUS) +static struct zmk_widget_battery_status battery_status_widget; +#endif + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS) +static struct zmk_widget_output_status output_status_widget; +#endif + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS) +static struct zmk_widget_peripheral_status peripheral_status_widget; +#endif + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_LAYER_STATUS) +static struct zmk_widget_layer_status layer_status_widget; +#endif + +lv_obj_t *zmk_display_status_screen() { + + lv_obj_t *screen; + screen = lv_obj_create(NULL, NULL); + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_BATTERY_STATUS) + zmk_widget_battery_status_init(&battery_status_widget, screen); + lv_obj_align(zmk_widget_battery_status_obj(&battery_status_widget), NULL, LV_ALIGN_IN_TOP_MID, + 0, 2); +#endif + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS) + zmk_widget_output_status_init(&output_status_widget, screen); + lv_obj_align(zmk_widget_output_status_obj(&output_status_widget), NULL, LV_ALIGN_IN_TOP_MID, 0, + 41); +#endif + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS) + zmk_widget_peripheral_status_init(&peripheral_status_widget, screen); + lv_obj_align(zmk_widget_peripheral_status_obj(&peripheral_status_widget), NULL, + LV_ALIGN_IN_TOP_MID, 0, 41); +#endif + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_LAYER_STATUS) + zmk_widget_layer_status_init(&layer_status_widget, screen); + lv_obj_set_style_local_text_font(zmk_widget_layer_status_obj(&layer_status_widget), + LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, + lv_theme_get_font_small()); + lv_obj_align(zmk_widget_layer_status_obj(&layer_status_widget), NULL, LV_ALIGN_IN_BOTTOM_MID, 0, + -5); + + lv_obj_t *LayersHeading; + LayersHeading = lv_img_create(screen, NULL); + lv_obj_align(LayersHeading, NULL, LV_ALIGN_IN_BOTTOM_MID, 8, 5); + lv_img_set_src(LayersHeading, &layers2); +#endif + +#if !IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) + lv_obj_t *zenlogo_icon; + zenlogo_icon = lv_img_create(screen, NULL); + lv_img_set_src(zenlogo_icon, &zenlogo); + lv_obj_align(zenlogo_icon, NULL, LV_ALIGN_IN_BOTTOM_MID, 2, -5); +#endif + + // lv_task_handler(); + lv_refr_now(NULL); + // display_blanking_off(display_dev); + + return screen; +} diff --git a/app/boards/arm/corneish_zen/custom_status_screen.h b/app/boards/arm/corneish_zen/custom_status_screen.h new file mode 100644 index 00000000..8da1510d --- /dev/null +++ b/app/boards/arm/corneish_zen/custom_status_screen.h @@ -0,0 +1,12 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include + +lv_obj_t *zmk_display_status_screen(); \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/widgets/battery_status.c b/app/boards/arm/corneish_zen/widgets/battery_status.c new file mode 100644 index 00000000..7dfd51e8 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/battery_status.c @@ -0,0 +1,97 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include +#include + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include "battery_status.h" +#include +#include +#include +#include +#include + +static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); + +struct battery_status_state { + uint8_t level; +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + bool usb_present; +#endif +}; + +LV_IMG_DECLARE(batt_100); +LV_IMG_DECLARE(batt_100_chg); +LV_IMG_DECLARE(batt_75); +LV_IMG_DECLARE(batt_75_chg); +LV_IMG_DECLARE(batt_50); +LV_IMG_DECLARE(batt_50_chg); +LV_IMG_DECLARE(batt_25); +LV_IMG_DECLARE(batt_25_chg); +LV_IMG_DECLARE(batt_5); +LV_IMG_DECLARE(batt_5_chg); +LV_IMG_DECLARE(batt_0); +LV_IMG_DECLARE(batt_0_chg); + +static void set_battery_symbol(lv_obj_t *icon, struct battery_status_state state) { + uint8_t level = state.level; + +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + if (level > 95) { + lv_img_set_src(icon, state.usb_present ? &batt_100_chg : &batt_100); + } else if (level > 74) { + lv_img_set_src(icon, state.usb_present ? &batt_75_chg : &batt_75); + } else if (level > 49) { + lv_img_set_src(icon, state.usb_present ? &batt_50_chg : &batt_50); + } else if (level > 24) { + lv_img_set_src(icon, state.usb_present ? &batt_25_chg : &batt_25); + } else if (level > 5) { + lv_img_set_src(icon, state.usb_present ? &batt_5_chg : &batt_5); + } else { + lv_img_set_src(icon, state.usb_present ? &batt_0_chg : &batt_0); + } +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ +} + +void battery_status_update_cb(struct battery_status_state state) { + struct zmk_widget_battery_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_battery_symbol(widget->obj, state); } +} + +static struct battery_status_state battery_status_get_state(const zmk_event_t *eh) { + return (struct battery_status_state) { + .level = bt_bas_get_battery_level(), +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + .usb_present = zmk_usb_is_powered(), +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + }; +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_battery_status, struct battery_status_state, + battery_status_update_cb, battery_status_get_state) + +ZMK_SUBSCRIPTION(widget_battery_status, zmk_battery_state_changed); +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) +ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + +int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent) { + widget->obj = lv_img_create(parent, NULL); + + sys_slist_append(&widgets, &widget->node); + widget_battery_status_init(); + + return 0; +} + +lv_obj_t *zmk_widget_battery_status_obj(struct zmk_widget_battery_status *widget) { + return widget->obj; +} diff --git a/app/boards/arm/corneish_zen/widgets/battery_status.h b/app/boards/arm/corneish_zen/widgets/battery_status.h new file mode 100644 index 00000000..21a4efb8 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/battery_status.h @@ -0,0 +1,20 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include + +#include + +struct zmk_widget_battery_status { + sys_snode_t node; + lv_obj_t *obj; +}; + +int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent); +lv_obj_t *zmk_widget_battery_status_obj(struct zmk_widget_battery_status *widget); \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/widgets/icons/CMakeLists.txt b/app/boards/arm/corneish_zen/widgets/icons/CMakeLists.txt new file mode 100644 index 00000000..eee750bf --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/CMakeLists.txt @@ -0,0 +1,4 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/widgets/icons/USB_connected.c b/app/boards/arm/corneish_zen/widgets/icons/USB_connected.c new file mode 100644 index 00000000..b3b60422 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/USB_connected.c @@ -0,0 +1,41 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_USB_CONNECTED +#define LV_ATTRIBUTE_IMG_USB_CONNECTED +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_USB_CONNECTED uint8_t USB_connected_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0, 0x00, 0x3f, + 0xff, 0xff, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0x80, 0x03, 0xff, 0xff, + 0xff, 0xfe, 0x07, 0xff, 0xff, 0xff, 0xff, 0x07, 0x1e, 0x30, 0x38, 0x07, 0x0f, 0x1c, 0x20, 0x38, + 0x07, 0x0f, 0x1c, 0x47, 0x10, 0xc3, 0x3e, 0x1c, 0x43, 0xf1, 0xc7, 0x7e, 0x3c, 0x60, 0x70, 0x0e, + 0x7e, 0x3c, 0x70, 0x30, 0x0e, 0x7e, 0x38, 0xfc, 0x33, 0xc7, 0xfe, 0x18, 0x8f, 0x23, 0x87, 0x0e, + 0x00, 0xc6, 0x20, 0x07, 0x0f, 0x01, 0xe0, 0x60, 0x0e, 0x0f, 0x87, 0xf0, 0xe0, 0x3e, 0x07, 0xff, + 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xff, 0xf0, 0x03, 0xff, 0xff, 0xfe, 0x00, 0x01, 0xff, 0xff, + 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t USB_connected = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 164, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = USB_connected_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_0.c b/app/boards/arm/corneish_zen/widgets/icons/batt_0.c new file mode 100644 index 00000000..a6066b95 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_0.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_0 +#define LV_ATTRIBUTE_IMG_BATT_0 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_0 uint8_t + batt_0_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x7f, 0xfd, 0xff, 0x7f, 0xf8, + 0xff, 0xfd, 0xff, 0x7f, 0xfc, 0xff, 0xfd, 0xff, 0x7f, 0xfc, 0xff, 0xfc, 0xfe, 0x7f, 0xfc, + 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, + 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x0f, 0xf0, 0x00, 0x7c, 0x00, 0x0f, + 0xf0, 0x00, 0x7c, 0x00, 0x0f, 0xf0, 0x00, 0x7c, 0x00, 0x0f, 0xf0, 0x00, 0x7c, 0x00, 0x3f, + 0xf0, 0x00, 0x7c, 0x00, 0x3f, 0xf0, 0x00, 0x7c, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, + 0xff, 0xff, 0x01, 0xff, 0xfc, 0xff, 0xff, 0x01, 0xff, 0xfc, 0xff, 0xfe, 0x7c, 0xff, 0xfc, + 0x7f, 0xfc, 0xfe, 0x7f, 0xf8, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, + 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_0 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_0_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_0_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_0_chg.c new file mode 100644 index 00000000..368ba288 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_0_chg.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_0_CHG +#define LV_ATTRIBUTE_IMG_BATT_0_CHG +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_0_CHG uint8_t + batt_0_chg_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x7f, 0xff, 0xf7, 0xbf, 0xf8, + 0xff, 0xff, 0xef, 0xbf, 0xfc, 0xff, 0xff, 0xdf, 0x7f, 0xfc, 0xff, 0xff, 0xbf, 0x7f, 0xfc, + 0xf0, 0x00, 0x7e, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf0, 0x01, 0xfe, 0x00, 0x3f, + 0xf0, 0x03, 0xfc, 0x00, 0x3f, 0xf0, 0x07, 0xfc, 0x00, 0x0f, 0xf0, 0x0f, 0xff, 0xe0, 0x0f, + 0xf0, 0x1f, 0xff, 0xc0, 0x0f, 0xf0, 0x00, 0x7f, 0x80, 0x0f, 0xf0, 0x00, 0x7f, 0x00, 0x3f, + 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0xf0, 0x01, 0xf8, 0x00, 0x3f, + 0xff, 0xfd, 0xf7, 0xff, 0xfc, 0xff, 0xfb, 0xef, 0xff, 0xfc, 0xff, 0xfb, 0xdf, 0xff, 0xfc, + 0x7f, 0xfb, 0xbf, 0xff, 0xf8, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_0_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_0_chg_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_100.c b/app/boards/arm/corneish_zen/widgets/icons/batt_100.c new file mode 100644 index 00000000..e6aa27ba --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_100.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_100 +#define LV_ATTRIBUTE_IMG_BATT_100 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_100 uint8_t + batt_100_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf3, 0xff, 0xff, 0xff, 0x3f, + 0xf3, 0xff, 0xff, 0xff, 0x3f, 0xf3, 0xff, 0xff, 0xff, 0x0f, 0xf3, 0xff, 0xff, 0xff, 0x0f, + 0xf3, 0xff, 0xff, 0xff, 0x0f, 0xf3, 0xff, 0xff, 0xff, 0x0f, 0xf3, 0xff, 0xff, 0xff, 0x3f, + 0xf3, 0xff, 0xff, 0xff, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_100 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_100_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_100_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_100_chg.c new file mode 100644 index 00000000..9b2c18d4 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_100_chg.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_100_CHG +#define LV_ATTRIBUTE_IMG_BATT_100_CHG +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_100_CHG uint8_t + batt_100_chg_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x7f, 0xff, 0xf7, 0xbf, 0xf8, + 0xff, 0xff, 0xef, 0xbf, 0xfc, 0xff, 0xff, 0xdf, 0x7f, 0xfc, 0xff, 0xff, 0xbf, 0x7f, 0xfc, + 0xf0, 0x00, 0x7e, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf3, 0xfd, 0xfe, 0xff, 0x3f, + 0xf3, 0xfb, 0xfd, 0xff, 0x3f, 0xf3, 0xf7, 0xfc, 0x07, 0x0f, 0xf3, 0xef, 0xff, 0xef, 0x0f, + 0xf3, 0xdf, 0xff, 0xdf, 0x0f, 0xf3, 0x80, 0x7f, 0xbf, 0x0f, 0xf3, 0xff, 0x7f, 0x7f, 0x3f, + 0xf3, 0xfe, 0xfe, 0xff, 0x3f, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0xf0, 0x01, 0xf8, 0x00, 0x3f, + 0xff, 0xfd, 0xf7, 0xff, 0xfc, 0xff, 0xfb, 0xef, 0xff, 0xfc, 0xff, 0xfb, 0xdf, 0xff, 0xfc, + 0x7f, 0xfb, 0xbf, 0xff, 0xf8, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_100_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_100_chg_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_25.c b/app/boards/arm/corneish_zen/widgets/icons/batt_25.c new file mode 100644 index 00000000..2445ef39 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_25.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_25 +#define LV_ATTRIBUTE_IMG_BATT_25 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_25 uint8_t + batt_25_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf3, 0xfc, 0x00, 0x00, 0x3f, + 0xf3, 0xfc, 0x00, 0x00, 0x3f, 0xf3, 0xfc, 0x00, 0x00, 0x0f, 0xf3, 0xfc, 0x00, 0x00, 0x0f, + 0xf3, 0xfc, 0x00, 0x00, 0x0f, 0xf3, 0xfc, 0x00, 0x00, 0x0f, 0xf3, 0xfc, 0x00, 0x00, 0x3f, + 0xf3, 0xfc, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_25 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_25_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_25_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_25_chg.c new file mode 100644 index 00000000..37c30812 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_25_chg.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_25_CHG +#define LV_ATTRIBUTE_IMG_BATT_25_CHG +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_25_CHG uint8_t + batt_25_chg_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x7f, 0xff, 0xf7, 0xbf, 0xf8, + 0xff, 0xff, 0xef, 0xbf, 0xfc, 0xff, 0xff, 0xdf, 0x7f, 0xfc, 0xff, 0xff, 0xbf, 0x7f, 0xfc, + 0xf0, 0x00, 0x7e, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf3, 0xf9, 0xfe, 0x00, 0x3f, + 0xf3, 0xfb, 0xfc, 0x00, 0x3f, 0xf3, 0xf7, 0xfc, 0x00, 0x0f, 0xf3, 0xef, 0xff, 0xe0, 0x0f, + 0xf3, 0xdf, 0xff, 0xc0, 0x0f, 0xf3, 0x80, 0x7f, 0x80, 0x0f, 0xf3, 0xf8, 0x7f, 0x00, 0x3f, + 0xf3, 0xf8, 0xfe, 0x00, 0x3f, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0xf0, 0x01, 0xf8, 0x00, 0x3f, + 0xff, 0xfd, 0xf7, 0xff, 0xfc, 0xff, 0xfb, 0xef, 0xff, 0xfc, 0xff, 0xfb, 0xdf, 0xff, 0xfc, + 0x7f, 0xfb, 0xbf, 0xff, 0xf8, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_25_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_25_chg_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_5.c b/app/boards/arm/corneish_zen/widgets/icons/batt_5.c new file mode 100644 index 00000000..e9824572 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_5.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_5 +#define LV_ATTRIBUTE_IMG_BATT_5 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_5 uint8_t + batt_5_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf3, 0x00, 0x00, 0x00, 0x3f, + 0xf3, 0x00, 0x00, 0x00, 0x3f, 0xf3, 0x00, 0x00, 0x00, 0x0f, 0xf3, 0x00, 0x00, 0x00, 0x0f, + 0xf3, 0x00, 0x00, 0x00, 0x0f, 0xf3, 0x00, 0x00, 0x00, 0x0f, 0xf3, 0x00, 0x00, 0x00, 0x3f, + 0xf3, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_5 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_5_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_50.c b/app/boards/arm/corneish_zen/widgets/icons/batt_50.c new file mode 100644 index 00000000..bbb0af48 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_50.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_50 +#define LV_ATTRIBUTE_IMG_BATT_50 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_50 uint8_t + batt_50_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf3, 0xff, 0xf0, 0x00, 0x3f, + 0xf3, 0xff, 0xf0, 0x00, 0x3f, 0xf3, 0xff, 0xf0, 0x00, 0x0f, 0xf3, 0xff, 0xf0, 0x00, 0x0f, + 0xf3, 0xff, 0xf0, 0x00, 0x0f, 0xf3, 0xff, 0xf0, 0x00, 0x0f, 0xf3, 0xff, 0xf0, 0x00, 0x3f, + 0xf3, 0xff, 0xf0, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_50 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_50_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_50_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_50_chg.c new file mode 100644 index 00000000..c2ced92e --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_50_chg.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_50_CHG +#define LV_ATTRIBUTE_IMG_BATT_50_CHG +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_50_CHG uint8_t + batt_50_chg_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x7f, 0xff, 0xf7, 0xbf, 0xf8, + 0xff, 0xff, 0xef, 0xbf, 0xfc, 0xff, 0xff, 0xdf, 0x7f, 0xfc, 0xff, 0xff, 0xbf, 0x7f, 0xfc, + 0xf0, 0x00, 0x7e, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf3, 0xfd, 0xfe, 0x00, 0x3f, + 0xf3, 0xfb, 0xfc, 0x00, 0x3f, 0xf3, 0xf7, 0xfc, 0x00, 0x0f, 0xf3, 0xef, 0xff, 0xe0, 0x0f, + 0xf3, 0xdf, 0xff, 0xc0, 0x0f, 0xf3, 0x80, 0x7f, 0x80, 0x0f, 0xf3, 0xff, 0x7f, 0x00, 0x3f, + 0xf3, 0xfe, 0xfe, 0x00, 0x3f, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0xf0, 0x01, 0xf8, 0x00, 0x3f, + 0xff, 0xfd, 0xf7, 0xff, 0xfc, 0xff, 0xfb, 0xef, 0xff, 0xfc, 0xff, 0xfb, 0xdf, 0xff, 0xfc, + 0x7f, 0xfb, 0xbf, 0xff, 0xf8, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_50_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_50_chg_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_5_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_5_chg.c new file mode 100644 index 00000000..6a6d9d44 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_5_chg.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_5_CHG +#define LV_ATTRIBUTE_IMG_BATT_5_CHG +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_5_CHG uint8_t + batt_5_chg_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x7f, 0xff, 0xf7, 0xbf, 0xf8, + 0xff, 0xff, 0xef, 0xbf, 0xfc, 0xff, 0xff, 0xdf, 0x7f, 0xfc, 0xff, 0xff, 0xbf, 0x7f, 0xfc, + 0xf0, 0x00, 0x7e, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf3, 0x01, 0xfe, 0x00, 0x3f, + 0xf3, 0x03, 0xfc, 0x00, 0x3f, 0xf3, 0x07, 0xfc, 0x00, 0x0f, 0xf3, 0x0f, 0xff, 0xe0, 0x0f, + 0xf3, 0x1f, 0xff, 0xc0, 0x0f, 0xf3, 0x00, 0x7f, 0x80, 0x0f, 0xf3, 0x00, 0x7f, 0x00, 0x3f, + 0xf3, 0x00, 0xfe, 0x00, 0x3f, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0xf0, 0x01, 0xf8, 0x00, 0x3f, + 0xff, 0xfd, 0xf7, 0xff, 0xfc, 0xff, 0xfb, 0xef, 0xff, 0xfc, 0xff, 0xfb, 0xdf, 0xff, 0xfc, + 0x7f, 0xfb, 0xbf, 0xff, 0xf8, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_5_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_5_chg_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_75.c b/app/boards/arm/corneish_zen/widgets/icons/batt_75.c new file mode 100644 index 00000000..9918386d --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_75.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_75 +#define LV_ATTRIBUTE_IMG_BATT_75 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_75 uint8_t + batt_75_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf3, 0xff, 0xff, 0xe0, 0x3f, + 0xf3, 0xff, 0xff, 0xe0, 0x3f, 0xf3, 0xff, 0xff, 0xe0, 0x0f, 0xf3, 0xff, 0xff, 0xe0, 0x0f, + 0xf3, 0xff, 0xff, 0xe0, 0x0f, 0xf3, 0xff, 0xff, 0xe0, 0x0f, 0xf3, 0xff, 0xff, 0xe0, 0x3f, + 0xf3, 0xff, 0xff, 0xe0, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_75 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_75_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_75_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_75_chg.c new file mode 100644 index 00000000..422aaabc --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_75_chg.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_75_CHG +#define LV_ATTRIBUTE_IMG_BATT_75_CHG +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_75_CHG uint8_t + batt_75_chg_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x7f, 0xff, 0xf7, 0xbf, 0xf8, + 0xff, 0xff, 0xef, 0xbf, 0xfc, 0xff, 0xff, 0xdf, 0x7f, 0xfc, 0xff, 0xff, 0xbf, 0x7f, 0xfc, + 0xf0, 0x00, 0x7e, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf3, 0xfd, 0xfe, 0xe0, 0x3f, + 0xf3, 0xfb, 0xfd, 0xe0, 0x3f, 0xf3, 0xf7, 0xfc, 0x00, 0x0f, 0xf3, 0xef, 0xff, 0xe0, 0x0f, + 0xf3, 0xdf, 0xff, 0xc0, 0x0f, 0xf3, 0x80, 0x7f, 0xa0, 0x0f, 0xf3, 0xff, 0x7f, 0x60, 0x3f, + 0xf3, 0xfe, 0xfe, 0xe0, 0x3f, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0xf0, 0x01, 0xf8, 0x00, 0x3f, + 0xff, 0xfd, 0xf7, 0xff, 0xfc, 0xff, 0xfb, 0xef, 0xff, 0xfc, 0xff, 0xfb, 0xdf, 0xff, 0xfc, + 0x7f, 0xfb, 0xbf, 0xff, 0xf8, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_75_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_75_chg_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising.c new file mode 100644 index 00000000..daeee223 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising.c @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING +#define LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING uint8_t + bluetooth_advertising_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x40, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, + 0x20, 0x7f, 0x80, 0x00, 0x70, 0x77, 0xc0, 0x00, 0xf8, 0x73, 0xe0, 0xc0, 0x7c, 0x71, + 0xe0, 0xe0, 0x3e, 0x73, 0xc0, 0x70, 0x1f, 0x77, 0x86, 0x30, 0x0f, 0xff, 0x07, 0x30, + 0x07, 0xfe, 0x07, 0x38, 0x03, 0xfc, 0x23, 0x38, 0x01, 0xf8, 0x63, 0x18, 0x01, 0xf8, + 0x63, 0x18, 0x03, 0xfc, 0x23, 0x38, 0x07, 0xfe, 0x07, 0x38, 0x0f, 0xff, 0x07, 0x30, + 0x1f, 0x77, 0x86, 0x70, 0x3e, 0x73, 0xc0, 0x70, 0x7c, 0x71, 0xe0, 0xe0, 0xf8, 0x73, + 0xe0, 0xc0, 0x70, 0x77, 0xc0, 0x00, 0x20, 0x7f, 0x80, 0x00, 0x00, 0x7f, 0x00, 0x00, + 0x00, 0x7e, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_advertising = { + .header.always_zero = 0, + .header.w = 29, + .header.h = 35, + .data_size = 148, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_advertising_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_1.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_1.c new file mode 100644 index 00000000..cf5b8197 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_1.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_1 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_1 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_1 uint8_t + bluetooth_advertising_1_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0xfe, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x70, 0xf7, 0x80, 0x00, + 0x3f, 0xff, 0xe0, 0xf8, 0xf3, 0xc1, 0xc0, 0x7f, 0xff, 0xe0, 0x7c, 0xf3, 0xe0, 0xc0, 0xff, + 0xff, 0xf0, 0x3e, 0xf7, 0xc0, 0xe0, 0xff, 0x8f, 0xf8, 0x1f, 0xff, 0x84, 0x61, 0xfe, 0x0f, + 0xf8, 0x0f, 0xff, 0x0e, 0x71, 0xfe, 0x0f, 0xf8, 0x07, 0xfe, 0x06, 0x31, 0xff, 0xcf, 0xfc, + 0x03, 0xfc, 0x27, 0x33, 0xff, 0xcf, 0xfc, 0x01, 0xf8, 0x67, 0x33, 0xff, 0xcf, 0xfc, 0x01, + 0xf8, 0x67, 0x33, 0xff, 0xcf, 0xfc, 0x03, 0xfc, 0x27, 0x33, 0xff, 0xcf, 0xfc, 0x07, 0xfe, + 0x06, 0x31, 0xff, 0xcf, 0xfc, 0x0f, 0xff, 0x0e, 0x71, 0xff, 0xcf, 0xf8, 0x1f, 0xff, 0x84, + 0x61, 0xff, 0xcf, 0xf8, 0x3e, 0xf7, 0xc0, 0xe0, 0xff, 0xcf, 0xf8, 0x7c, 0xf3, 0xe1, 0xc0, + 0xff, 0xff, 0xf0, 0xf8, 0xf3, 0xc0, 0xc0, 0x7f, 0xff, 0xe0, 0x70, 0xf7, 0x80, 0x00, 0x3f, + 0xff, 0xe0, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0xfe, 0x00, 0x00, 0x0f, 0xff, + 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_advertising_1 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_advertising_1_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_2.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_2.c new file mode 100644 index 00000000..184a5ce8 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_2.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_2 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_2 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_2 uint8_t + bluetooth_advertising_2_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x60, 0xff, 0x80, 0x00, 0x1f, 0xff, 0xc0, 0xf0, 0xf7, 0xc0, 0x80, + 0x7f, 0xff, 0xe0, 0x78, 0xf3, 0xe1, 0xc0, 0x7f, 0xff, 0xf0, 0x3c, 0xf3, 0xc0, 0xe0, 0xff, + 0x0f, 0xf0, 0x1e, 0xf7, 0x84, 0xe1, 0xfe, 0x07, 0xf8, 0x0f, 0xff, 0x0e, 0x71, 0xfc, 0x63, + 0xf8, 0x07, 0xfe, 0x0e, 0x71, 0xff, 0xf3, 0xfc, 0x03, 0xfc, 0x06, 0x33, 0xff, 0xe3, 0xfc, + 0x01, 0xf8, 0x67, 0x33, 0xff, 0xe7, 0xfc, 0x01, 0xf8, 0xe7, 0x33, 0xff, 0xc7, 0xfc, 0x01, + 0xfc, 0x67, 0x33, 0xff, 0x8f, 0xfc, 0x03, 0xfe, 0x06, 0x33, 0xff, 0x1f, 0xfc, 0x07, 0xff, + 0x0e, 0x71, 0xfe, 0x3f, 0xfc, 0x0f, 0xff, 0x8e, 0x61, 0xfc, 0x03, 0xf8, 0x1e, 0xf7, 0xc0, + 0xe1, 0xfc, 0x03, 0xf8, 0x3c, 0xf3, 0xe0, 0xc0, 0xff, 0xff, 0xf0, 0x78, 0xf3, 0xe1, 0xc0, + 0x7f, 0xff, 0xf0, 0xf0, 0xf7, 0xc0, 0x80, 0x7f, 0xff, 0xe0, 0x60, 0xff, 0x80, 0x00, 0x1f, + 0xff, 0xc0, 0x00, 0xff, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x03, 0xfc, + 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_advertising_2 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_advertising_2_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_3.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_3.c new file mode 100644 index 00000000..e9665ff9 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_3.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_3 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_3 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_3 uint8_t + bluetooth_advertising_3_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0xfe, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x70, 0xf7, 0x80, 0x00, + 0x3f, 0xff, 0xe0, 0xf8, 0xf3, 0xc1, 0xc0, 0x7f, 0xff, 0xf0, 0x7c, 0xf3, 0xe0, 0xc0, 0xff, + 0x9f, 0xf0, 0x3e, 0xf7, 0xc0, 0xe0, 0xfe, 0x07, 0xf8, 0x1f, 0xff, 0x84, 0x61, 0xfe, 0x03, + 0xf8, 0x0f, 0xff, 0x0e, 0x71, 0xfe, 0xe3, 0xfc, 0x07, 0xfe, 0x06, 0x31, 0xff, 0xe3, 0xfc, + 0x03, 0xfc, 0x27, 0x33, 0xff, 0x87, 0xfc, 0x01, 0xf8, 0x67, 0x33, 0xff, 0x87, 0xfc, 0x01, + 0xf8, 0x67, 0x33, 0xff, 0x83, 0xfc, 0x03, 0xfc, 0x27, 0x33, 0xff, 0xf3, 0xfc, 0x07, 0xfe, + 0x06, 0x31, 0xfe, 0xf3, 0xfc, 0x0f, 0xff, 0x0e, 0x71, 0xfc, 0x63, 0xfc, 0x1f, 0xff, 0x84, + 0x61, 0xfe, 0x03, 0xf8, 0x3e, 0xf7, 0xc0, 0xe0, 0xff, 0x0f, 0xf8, 0x7c, 0xf3, 0xe1, 0xc0, + 0xff, 0xff, 0xf0, 0xf8, 0xf3, 0xc0, 0xc0, 0x7f, 0xff, 0xf0, 0x70, 0xf7, 0x80, 0x00, 0x3f, + 0xff, 0xe0, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0xfe, 0x00, 0x00, 0x0f, 0xff, + 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_advertising_3 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_advertising_3_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_4.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_4.c new file mode 100644 index 00000000..d591f17f --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_4.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_4 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_4 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_4 uint8_t + bluetooth_advertising_4_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0xfe, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x70, 0xf7, 0x80, 0x00, + 0x3f, 0xff, 0xe0, 0xf8, 0xf3, 0xc0, 0xc0, 0x7f, 0xff, 0xe0, 0x7c, 0xf3, 0xe0, 0xc0, 0xff, + 0xff, 0xf0, 0x3e, 0xf7, 0xc0, 0xe0, 0xff, 0xcf, 0xf8, 0x1f, 0xff, 0x84, 0x61, 0xff, 0x8f, + 0xf8, 0x0f, 0xff, 0x0e, 0x71, 0xff, 0x0f, 0xf8, 0x07, 0xfe, 0x06, 0x31, 0xff, 0x0f, 0xfc, + 0x03, 0xfc, 0x27, 0x31, 0xfe, 0x4f, 0xfc, 0x01, 0xf8, 0x67, 0x31, 0xfc, 0x4f, 0xfc, 0x01, + 0xf8, 0x67, 0x33, 0xfc, 0xcf, 0xfc, 0x03, 0xfc, 0x27, 0x31, 0xf8, 0x07, 0xfc, 0x07, 0xfe, + 0x06, 0x31, 0xf8, 0x03, 0xfc, 0x0f, 0xff, 0x0e, 0x71, 0xf8, 0x07, 0xf8, 0x1f, 0xff, 0x84, + 0x61, 0xff, 0xcf, 0xf8, 0x3e, 0xf7, 0xc0, 0xe0, 0xff, 0xcf, 0xf8, 0x7c, 0xf3, 0xe1, 0xc0, + 0xff, 0xff, 0xf0, 0xf8, 0xf3, 0xc0, 0xc0, 0x7f, 0xff, 0xe0, 0x70, 0xf7, 0x80, 0x00, 0x3f, + 0xff, 0xc0, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0xfe, 0x00, 0x00, 0x07, 0xff, + 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_advertising_4 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_advertising_4_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_5.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_5.c new file mode 100644 index 00000000..88213158 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_5.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_5 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_5 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_5 uint8_t + bluetooth_advertising_5_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0xfe, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x70, 0xf7, 0x80, 0x00, + 0x3f, 0xff, 0xe0, 0xf8, 0xf3, 0xc0, 0xc0, 0x7f, 0xff, 0xe0, 0x7c, 0xf3, 0xe0, 0xe0, 0xff, + 0xff, 0xf0, 0x3e, 0xf7, 0xc0, 0xe1, 0xfe, 0x07, 0xf8, 0x1f, 0xff, 0x84, 0x61, 0xfe, 0x07, + 0xf8, 0x0f, 0xff, 0x0e, 0x71, 0xfc, 0x7f, 0xf8, 0x07, 0xfe, 0x06, 0x33, 0xfc, 0x7f, 0xfc, + 0x03, 0xfc, 0x27, 0x33, 0xfc, 0x07, 0xfc, 0x01, 0xf8, 0x67, 0x33, 0xfc, 0x03, 0xfc, 0x01, + 0xf8, 0x67, 0x33, 0xff, 0x63, 0xfc, 0x03, 0xfc, 0x27, 0x33, 0xff, 0xf3, 0xfc, 0x07, 0xfe, + 0x06, 0x33, 0xfe, 0xf3, 0xfc, 0x0f, 0xff, 0x0e, 0x71, 0xfc, 0x63, 0xf8, 0x1f, 0xff, 0x84, + 0x61, 0xfe, 0x07, 0xf8, 0x3e, 0xf7, 0xc0, 0xe0, 0xff, 0x0f, 0xf8, 0x7c, 0xf3, 0xe1, 0xc0, + 0xff, 0xff, 0xf0, 0xf8, 0xf3, 0xc0, 0xc0, 0x7f, 0xff, 0xe0, 0x70, 0xf7, 0x80, 0x00, 0x3f, + 0xff, 0xc0, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0xfe, 0x00, 0x00, 0x0f, 0xff, + 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_advertising_5 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_advertising_5_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_1.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_1.c new file mode 100644 index 00000000..a3cb5a2c --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_1.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_1 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_1 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_1 uint8_t + bluetooth_connected_1_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0xc0, 0x78, 0x77, 0xc0, 0x00, + 0x3f, 0xff, 0xe0, 0x7c, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xe0, 0x3e, 0x71, 0xe0, 0x00, 0xff, + 0xff, 0xf0, 0x1f, 0x73, 0xc0, 0x00, 0xff, 0x8f, 0xf8, 0x0f, 0xff, 0x80, 0x01, 0xfe, 0x0f, + 0xf8, 0x87, 0xff, 0x08, 0x01, 0xfe, 0x0f, 0xf8, 0xc3, 0xfe, 0x18, 0x01, 0xff, 0xcf, 0xfc, + 0xe1, 0xfc, 0x38, 0x03, 0xff, 0xcf, 0xfc, 0xf0, 0xf8, 0x78, 0x03, 0xff, 0xcf, 0xfc, 0xf0, + 0xfc, 0x78, 0x03, 0xff, 0xcf, 0xfc, 0xe1, 0xfc, 0x38, 0x03, 0xff, 0xcf, 0xfc, 0xc3, 0xfe, + 0x18, 0x01, 0xff, 0xcf, 0xfc, 0x87, 0xff, 0x08, 0x01, 0xff, 0xcf, 0xf8, 0x0f, 0xff, 0x80, + 0x01, 0xff, 0xcf, 0xf8, 0x1e, 0x73, 0xc0, 0x00, 0xff, 0xcf, 0xf8, 0x3c, 0x71, 0xe0, 0x00, + 0xff, 0xff, 0xf0, 0x78, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xe0, 0x78, 0x77, 0xc0, 0x00, 0x3f, + 0xff, 0xe0, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x7f, 0x00, 0x00, 0x0f, 0xff, + 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_connected_1 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_connected_1_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_2.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_2.c new file mode 100644 index 00000000..2ce5b939 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_2.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_2 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_2 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_2 uint8_t + bluetooth_connected_2_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0xc0, 0x78, 0x73, 0xc0, 0x00, + 0x7f, 0xff, 0xe0, 0x7c, 0x71, 0xe0, 0x00, 0x7f, 0xff, 0xf0, 0x3e, 0x73, 0xe0, 0x00, 0xff, + 0x0f, 0xf0, 0x1f, 0x77, 0xc0, 0x01, 0xfe, 0x07, 0xf8, 0x0f, 0xff, 0x80, 0x01, 0xfc, 0x63, + 0xf8, 0x87, 0xff, 0x08, 0x01, 0xff, 0xf3, 0xfc, 0xc3, 0xfe, 0x18, 0x03, 0xff, 0xe3, 0xfc, + 0xe1, 0xfc, 0x38, 0x03, 0xff, 0xe7, 0xfc, 0xf0, 0xf8, 0x78, 0x03, 0xff, 0xc7, 0xfc, 0xe1, + 0xfc, 0x38, 0x03, 0xff, 0x8f, 0xfc, 0xc3, 0xfe, 0x18, 0x03, 0xff, 0x1f, 0xfc, 0x87, 0xff, + 0x08, 0x01, 0xfe, 0x3f, 0xfc, 0x0f, 0xff, 0x80, 0x01, 0xfc, 0x03, 0xf8, 0x1f, 0x77, 0xc0, + 0x01, 0xfc, 0x03, 0xf8, 0x3e, 0x73, 0xe0, 0x00, 0xff, 0xff, 0xf0, 0x7c, 0x71, 0xe0, 0x00, + 0x7f, 0xff, 0xf0, 0x78, 0x73, 0xc0, 0x00, 0x7f, 0xff, 0xe0, 0x30, 0x7f, 0x80, 0x00, 0x1f, + 0xff, 0xc0, 0x00, 0x7f, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x03, 0xfc, + 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_connected_2 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_connected_2_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_3.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_3.c new file mode 100644 index 00000000..edac091f --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_3.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_3 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_3 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_3 uint8_t + bluetooth_connected_3_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0xc0, 0x78, 0x77, 0xc0, 0x00, + 0x7f, 0xff, 0xe0, 0x7c, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xf0, 0x3e, 0x71, 0xe0, 0x00, 0xff, + 0x9f, 0xf0, 0x1f, 0x73, 0xc0, 0x01, 0xfe, 0x07, 0xf8, 0x0f, 0xff, 0x80, 0x01, 0xfc, 0x03, + 0xf8, 0x87, 0xff, 0x08, 0x01, 0xfe, 0xe3, 0xfc, 0xc3, 0xfe, 0x18, 0x03, 0xff, 0xe3, 0xfc, + 0xe1, 0xfc, 0x38, 0x03, 0xff, 0x87, 0xfc, 0xf0, 0xf8, 0x78, 0x03, 0xff, 0x87, 0xfc, 0xf0, + 0xfc, 0x78, 0x03, 0xff, 0x83, 0xfc, 0xe1, 0xfe, 0x38, 0x03, 0xff, 0xf3, 0xfc, 0xc3, 0xff, + 0x18, 0x03, 0xfe, 0xf3, 0xfc, 0x87, 0xff, 0x88, 0x01, 0xfc, 0x63, 0xf8, 0x0f, 0xf7, 0xc0, + 0x01, 0xfe, 0x03, 0xf8, 0x1f, 0x73, 0xe0, 0x01, 0xff, 0x0f, 0xf8, 0x3e, 0x71, 0xe0, 0x00, + 0xff, 0xff, 0xf0, 0x7c, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xe0, 0x78, 0x77, 0xc0, 0x00, 0x3f, + 0xff, 0xe0, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x7f, 0x00, 0x00, 0x0f, 0xff, + 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_connected_3 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_connected_3_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_4.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_4.c new file mode 100644 index 00000000..e79d6cb6 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_4.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_4 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_4 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_4 uint8_t + bluetooth_connected_4_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x07, 0xff, 0x00, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x78, 0x77, 0xc0, 0x00, + 0x3f, 0xff, 0xe0, 0x7c, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xe0, 0x3e, 0x71, 0xe0, 0x00, 0xff, + 0xff, 0xf0, 0x1f, 0x73, 0xc0, 0x00, 0xff, 0xcf, 0xf8, 0x0f, 0xff, 0x80, 0x01, 0xff, 0x8f, + 0xf8, 0x87, 0xff, 0x08, 0x01, 0xff, 0x0f, 0xf8, 0xc3, 0xfe, 0x18, 0x01, 0xff, 0x0f, 0xfc, + 0xe1, 0xfc, 0x38, 0x03, 0xfe, 0x4f, 0xfc, 0xf0, 0xf8, 0x78, 0x03, 0xfc, 0x4f, 0xfc, 0xf0, + 0xfc, 0x78, 0x03, 0xfc, 0xcf, 0xfc, 0xe1, 0xfe, 0x38, 0x03, 0xf8, 0xc7, 0xfc, 0xc3, 0xff, + 0x18, 0x01, 0xf8, 0x03, 0xfc, 0x87, 0xff, 0x88, 0x01, 0xf8, 0x03, 0xf8, 0x0f, 0xf7, 0xc0, + 0x01, 0xff, 0xcf, 0xf8, 0x1f, 0x73, 0xe0, 0x00, 0xff, 0xcf, 0xf8, 0x3e, 0x71, 0xe0, 0x00, + 0xff, 0xff, 0xf0, 0x7c, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xe0, 0x78, 0x77, 0xc0, 0x00, 0x3f, + 0xff, 0xe0, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x7f, 0x00, 0x00, 0x0f, 0xff, + 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_connected_4 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_connected_4_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_5.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_5.c new file mode 100644 index 00000000..b567aa2d --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_5.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_5 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_5 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_5 uint8_t + bluetooth_connected_5_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x78, 0x77, 0xc0, 0x00, + 0x3f, 0xff, 0xe0, 0x7c, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xe0, 0x3e, 0x71, 0xe0, 0x00, 0xff, + 0xff, 0xf0, 0x1f, 0x73, 0xc0, 0x01, 0xfe, 0x07, 0xf8, 0x0f, 0xff, 0x80, 0x01, 0xfe, 0x07, + 0xf8, 0x87, 0xff, 0x08, 0x01, 0xfc, 0x7f, 0xf8, 0xc3, 0xfe, 0x18, 0x03, 0xfc, 0x7f, 0xfc, + 0xe1, 0xfc, 0x38, 0x03, 0xfc, 0x07, 0xfc, 0xf0, 0xf8, 0x78, 0x03, 0xfc, 0x03, 0xfc, 0xf0, + 0xfc, 0x78, 0x03, 0xff, 0x63, 0xfc, 0xe1, 0xfe, 0x38, 0x03, 0xff, 0xf3, 0xfc, 0xc3, 0xff, + 0x18, 0x03, 0xfe, 0xf3, 0xfc, 0x87, 0xff, 0x88, 0x01, 0xfc, 0x63, 0xf8, 0x0f, 0xf7, 0xc0, + 0x01, 0xfe, 0x07, 0xf8, 0x1e, 0x73, 0xc0, 0x00, 0xff, 0x0f, 0xf8, 0x3c, 0x71, 0xe0, 0x00, + 0xff, 0xff, 0xf0, 0x7c, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xe0, 0x78, 0x77, 0xc0, 0x00, 0x3f, + 0xff, 0xc0, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x7f, 0x00, 0x00, 0x0f, 0xff, + 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_connected_5 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_connected_5_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_right.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_right.c new file mode 100644 index 00000000..2a28a903 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_right.c @@ -0,0 +1,49 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_RIGHT +#define LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_RIGHT +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_RIGHT + uint8_t bluetooth_connected_right_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x3f, 0x80, + 0x00, 0x0f, 0xfe, 0x00, 0x10, 0x3f, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x38, 0x3b, 0xe0, 0x00, + 0x7f, 0xff, 0xc0, 0x7c, 0x39, 0xf0, 0x00, 0xff, 0xff, 0xe0, 0x3e, 0x38, 0xf0, 0x01, 0xff, + 0xff, 0xf0, 0x1f, 0x39, 0xe0, 0x01, 0xff, 0xfe, 0x30, 0x0f, 0xbb, 0xc0, 0x03, 0xff, 0xfc, + 0x38, 0x87, 0xff, 0x84, 0x03, 0xff, 0xf8, 0x38, 0xc3, 0xff, 0x0c, 0x07, 0xff, 0xf0, 0x3c, + 0xe1, 0xfe, 0x1c, 0x07, 0xcf, 0xe0, 0x7c, 0xf0, 0xfc, 0x3c, 0x07, 0x87, 0xc0, 0xfc, 0xf0, + 0xfc, 0x3c, 0x07, 0x83, 0x81, 0xfc, 0xe1, 0xfe, 0x1c, 0x07, 0x81, 0x03, 0xfc, 0xc3, 0xff, + 0x0c, 0x07, 0xc0, 0x07, 0xfc, 0x87, 0xff, 0x84, 0x07, 0xe0, 0x0f, 0xfc, 0x0f, 0xbb, 0xc0, + 0x03, 0xf0, 0x1f, 0xf8, 0x1f, 0x39, 0xe0, 0x03, 0xf8, 0x3f, 0xf8, 0x3e, 0x38, 0xf0, 0x01, + 0xfc, 0xff, 0xf0, 0x7c, 0x39, 0xf0, 0x01, 0xff, 0xff, 0xf0, 0x38, 0x3b, 0xe0, 0x00, 0xff, + 0xff, 0xe0, 0x10, 0x3f, 0xc0, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x3f, 0x80, 0x00, 0x3f, 0xff, + 0x80, 0x00, 0x3f, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x03, 0xf8, 0x00, + 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_connected_right = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 253, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_connected_right_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_disconnected_right.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_disconnected_right.c new file mode 100644 index 00000000..37974d69 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_disconnected_right.c @@ -0,0 +1,49 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_DISCONNECTED_RIGHT +#define LV_ATTRIBUTE_IMG_BLUETOOTH_DISCONNECTED_RIGHT +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BLUETOOTH_DISCONNECTED_RIGHT + uint8_t bluetooth_disconnected_right_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x3f, 0x80, + 0x00, 0x0f, 0xfe, 0x00, 0x10, 0x3f, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x38, 0x3b, 0xe0, 0x00, + 0x7f, 0xff, 0xc0, 0x7c, 0x39, 0xf0, 0x00, 0xff, 0xff, 0xe0, 0x3e, 0x38, 0xf0, 0x01, 0xff, + 0xff, 0xf0, 0x1f, 0x39, 0xe0, 0x01, 0xe3, 0xf8, 0xf0, 0x0f, 0xbb, 0xc0, 0x03, 0xe1, 0xf0, + 0xf8, 0x07, 0xff, 0x80, 0x03, 0xe0, 0xe0, 0xf8, 0x03, 0xff, 0x00, 0x07, 0xf0, 0x01, 0xfc, + 0x01, 0xfe, 0x00, 0x07, 0xf8, 0x03, 0xfc, 0x00, 0xfc, 0x00, 0x07, 0xfc, 0x07, 0xfc, 0x00, + 0xfc, 0x00, 0x07, 0xfc, 0x07, 0xfc, 0x01, 0xfe, 0x00, 0x07, 0xfc, 0x07, 0xfc, 0x03, 0xff, + 0x00, 0x07, 0xf8, 0x03, 0xfc, 0x07, 0xff, 0x80, 0x07, 0xf0, 0x01, 0xfc, 0x0f, 0xbb, 0xc0, + 0x03, 0xe0, 0xe0, 0xf8, 0x1f, 0x39, 0xe0, 0x03, 0xe1, 0xf0, 0xf8, 0x3e, 0x38, 0xf0, 0x01, + 0xe3, 0xf8, 0xf0, 0x7c, 0x39, 0xf0, 0x01, 0xff, 0xff, 0xf0, 0x38, 0x3b, 0xe0, 0x00, 0xff, + 0xff, 0xe0, 0x10, 0x3f, 0xc0, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x3f, 0x80, 0x00, 0x3f, 0xff, + 0x80, 0x00, 0x3f, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x03, 0xf8, 0x00, + 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_disconnected_right = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 253, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_disconnected_right_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/layers.c b/app/boards/arm/corneish_zen/widgets/icons/layers.c new file mode 100644 index 00000000..86bc8dfc --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/layers.c @@ -0,0 +1,44 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_LAYERS +#define LV_ATTRIBUTE_IMG_LAYERS +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_LAYERS uint8_t + layers_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, + 0x01, 0xff, 0xff, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, + 0x3f, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xfe, 0x00, + 0x01, 0xff, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xe0, 0x00, 0x07, 0x9f, 0xff, 0x3c, 0x00, + 0x1e, 0x07, 0xfc, 0x0f, 0x00, 0x38, 0x01, 0xe0, 0x03, 0x80, 0x30, 0x00, 0x00, 0x01, 0x80, + 0x38, 0x00, 0x00, 0x03, 0x80, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x03, 0xc0, 0x00, 0x78, 0x00, + 0x01, 0xf0, 0x01, 0xf0, 0x00, 0x07, 0xfc, 0x07, 0xfc, 0x00, 0x1f, 0xff, 0x1f, 0xff, 0x00, + 0x3f, 0xff, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, 0x00, + 0x07, 0xff, 0xff, 0xfc, 0x00, 0x00, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, + 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t layers = { + .header.always_zero = 0, + .header.w = 35, + .header.h = 35, + .data_size = 183, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = layers_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/layers2.c b/app/boards/arm/corneish_zen/widgets/icons/layers2.c new file mode 100644 index 00000000..068b0757 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/layers2.c @@ -0,0 +1,40 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_LAYERS2 +#define LV_ATTRIBUTE_IMG_LAYERS2 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_LAYERS2 uint8_t + layers2_map[] = { + 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ + 0xff, 0xff, 0xff, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x30, 0x0f, 0x18, 0xdf, 0xdf, 0xc0, 0x04, 0x00, + 0x00, 0x80, 0x30, 0x19, 0x98, 0xd8, 0x18, 0xe0, 0x0e, 0x00, 0x00, 0x80, 0x30, 0x30, 0xd8, + 0xd8, 0x18, 0xe0, 0x1f, 0x00, 0x00, 0x80, 0x30, 0x30, 0xcf, 0x9f, 0xd9, 0xc0, 0x04, 0x00, + 0x00, 0x80, 0x30, 0x3f, 0xc7, 0x18, 0x1f, 0x80, 0x04, 0x00, 0x03, 0xe0, 0x30, 0x39, 0xc6, + 0x18, 0x1b, 0x80, 0x04, 0x00, 0x01, 0xc0, 0x3f, 0xb0, 0xc6, 0x1f, 0xd9, 0xc0, 0x04, 0x00, + 0x00, 0x80, 0x3f, 0xb0, 0xc6, 0x1f, 0xd8, 0xe0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t layers2 = { + .header.always_zero = 0, + .header.w = 78, + .header.h = 12, + .data_size = 128, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = layers2_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/zenlogo.c b/app/boards/arm/corneish_zen/widgets/icons/zenlogo.c new file mode 100644 index 00000000..cc424041 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/zenlogo.c @@ -0,0 +1,58 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_ZENLOGO +#define LV_ATTRIBUTE_IMG_ZENLOGO +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_ZENLOGO uint8_t + zenlogo_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0xe3, 0xe3, 0x9e, + 0x3e, 0x02, 0x72, 0xe0, 0x00, 0x00, 0x06, 0x36, 0x36, 0x33, 0x63, 0x02, 0x8b, 0x10, 0x00, + 0x00, 0x04, 0x14, 0x14, 0x21, 0x41, 0x02, 0x82, 0x10, 0x00, 0x00, 0x04, 0x04, 0x14, 0x21, + 0x7f, 0x7a, 0x72, 0x10, 0x00, 0x00, 0x04, 0x04, 0x14, 0x21, 0x40, 0x02, 0x0a, 0x10, 0x00, + 0x00, 0x04, 0x14, 0x14, 0x21, 0x41, 0x02, 0x0a, 0x10, 0x00, 0x00, 0x06, 0x36, 0x34, 0x21, + 0x63, 0x02, 0x8a, 0x10, 0x00, 0x00, 0x03, 0xe3, 0xe4, 0x21, 0x3e, 0x02, 0x72, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x03, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xf1, + 0xf8, 0x00, 0x60, 0x0f, 0xc0, 0x00, 0x00, 0x0f, 0xff, 0xfb, 0xff, 0xe0, 0xf8, 0x1f, 0x80, + 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xfc, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0xfc, 0x1f, 0x00, 0x7f, 0xc0, 0x1f, 0xff, 0xff, 0xe0, 0x01, 0xfc, 0x3e, 0x00, + 0x40, 0x1f, 0xff, 0xe0, 0xff, 0xc0, 0x07, 0xfc, 0xfc, 0x00, 0xdf, 0xff, 0x80, 0x01, 0xff, + 0xc0, 0x0f, 0xdc, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x8f, 0x1f, 0x9f, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x1f, 0xef, 0xff, 0x1f, 0x9f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x8f, + 0xff, 0x3f, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1f, 0xfe, 0x3f, 0x0f, 0xf0, 0x00, + 0x00, 0x00, 0x03, 0xf8, 0x1f, 0x80, 0x7e, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x3e, + 0x00, 0x7e, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x3c, 0x00, 0x7e, 0x0f, 0xc0, 0x00, + 0x00, 0x00, 0x1f, 0xf8, 0x3c, 0x00, 0x78, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xbc, + 0x00, 0x78, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x00, 0xf8, 0x0f, 0xc0, 0x00, + 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, + 0xff, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0xff, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t zenlogo = { + .header.always_zero = 0, + .header.w = 80, + .header.h = 38, + .data_size = 388, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = zenlogo_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/layer_status.c b/app/boards/arm/corneish_zen/widgets/layer_status.c new file mode 100644 index 00000000..a309a787 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/layer_status.c @@ -0,0 +1,67 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include "layer_status.h" +#include +#include +#include +#include + +static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); + +struct layer_status_state { + uint8_t index; + const char *label; +}; + +static void set_layer_symbol(lv_obj_t *label, struct layer_status_state state) { + const char *layer_label = state.label; + uint8_t active_layer_index = state.index; + + if (layer_label == NULL) { + char text[6] = {}; + + sprintf(text, " %i", active_layer_index); + + lv_label_set_text(label, text); + } else { + lv_label_set_text(label, layer_label); + } +} + +static void layer_status_update_cb(struct layer_status_state state) { + struct zmk_widget_layer_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_layer_symbol(widget->obj, state); } +} + +static struct layer_status_state layer_status_get_state(const zmk_event_t *eh) { + uint8_t index = zmk_keymap_highest_layer_active(); + return (struct layer_status_state){.index = index, .label = zmk_keymap_layer_label(index)}; +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_layer_status, struct layer_status_state, layer_status_update_cb, + layer_status_get_state) + +ZMK_SUBSCRIPTION(widget_layer_status, zmk_layer_state_changed); + +int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_t *parent) { + widget->obj = lv_label_create(parent, NULL); + + sys_slist_append(&widgets, &widget->node); + + widget_layer_status_init(); + return 0; +} + +lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget) { + return widget->obj; +} \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/widgets/layer_status.h b/app/boards/arm/corneish_zen/widgets/layer_status.h new file mode 100644 index 00000000..04f32faa --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/layer_status.h @@ -0,0 +1,19 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include +#include + +struct zmk_widget_layer_status { + sys_snode_t node; + lv_obj_t *obj; +}; + +int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_t *parent); +lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget); \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/widgets/output_status.c b/app/boards/arm/corneish_zen/widgets/output_status.c new file mode 100644 index 00000000..bd69bbb1 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/output_status.c @@ -0,0 +1,138 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include +#include + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include "output_status.h" +#include +#include +#include +#include +#include +#include +#include + +LV_IMG_DECLARE(bluetooth_advertising); +LV_IMG_DECLARE(bluetooth_connected_right); +LV_IMG_DECLARE(bluetooth_disconnected_right); +LV_IMG_DECLARE(bluetooth_connected_1); +LV_IMG_DECLARE(bluetooth_connected_2); +LV_IMG_DECLARE(bluetooth_connected_3); +LV_IMG_DECLARE(bluetooth_connected_4); +LV_IMG_DECLARE(bluetooth_connected_5); +LV_IMG_DECLARE(bluetooth_advertising_1); +LV_IMG_DECLARE(bluetooth_advertising_2); +LV_IMG_DECLARE(bluetooth_advertising_3); +LV_IMG_DECLARE(bluetooth_advertising_4); +LV_IMG_DECLARE(bluetooth_advertising_5); +LV_IMG_DECLARE(USB_connected); + +static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); + +struct output_status_state { + enum zmk_endpoint selected_endpoint; + bool active_profile_connected; + bool active_profile_bonded; + uint8_t active_profile_index; +}; + +static struct output_status_state get_state(const zmk_event_t *_eh) { + return (struct output_status_state){.selected_endpoint = zmk_endpoints_selected(), + .active_profile_connected = + zmk_ble_active_profile_is_connected(), + .active_profile_bonded = !zmk_ble_active_profile_is_open(), + .active_profile_index = zmk_ble_active_profile_index()}; + ; +} + +static void set_status_symbol(lv_obj_t *icon, struct output_status_state state) { + switch (state.selected_endpoint) { + case ZMK_ENDPOINT_USB: + lv_img_set_src(icon, &USB_connected); + break; + case ZMK_ENDPOINT_BLE: + if (state.active_profile_bonded) { + if (state.active_profile_connected) { + // sprintf(text, LV_SYMBOL_BLUETOOTH "%i " LV_SYMBOL_OK, active_profile_index); + switch (state.active_profile_index) { + case 0: + lv_img_set_src(icon, &bluetooth_connected_1); + break; + case 1: + lv_img_set_src(icon, &bluetooth_connected_2); + break; + case 2: + lv_img_set_src(icon, &bluetooth_connected_3); + break; + case 3: + lv_img_set_src(icon, &bluetooth_connected_4); + break; + case 4: + lv_img_set_src(icon, &bluetooth_connected_5); + break; + } + } else { + lv_img_set_src(icon, &bluetooth_disconnected_right); + } + } else { + switch (state.active_profile_index) { + case 0: + lv_img_set_src(icon, &bluetooth_advertising_1); + break; + case 1: + lv_img_set_src(icon, &bluetooth_advertising_2); + break; + case 2: + lv_img_set_src(icon, &bluetooth_advertising_3); + break; + case 3: + lv_img_set_src(icon, &bluetooth_advertising_4); + break; + case 4: + lv_img_set_src(icon, &bluetooth_advertising_5); + break; + } + } + break; + } +} + +static void output_status_update_cb(struct output_status_state state) { + struct zmk_widget_output_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_status_symbol(widget->obj, state); } +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_output_status, struct output_status_state, + output_status_update_cb, get_state) +ZMK_SUBSCRIPTION(widget_output_status, zmk_endpoint_selection_changed); + +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) +ZMK_SUBSCRIPTION(widget_output_status, zmk_usb_conn_state_changed); +#endif +#if defined(CONFIG_ZMK_BLE) +ZMK_SUBSCRIPTION(widget_output_status, zmk_ble_active_profile_changed); +#endif + +int zmk_widget_output_status_init(struct zmk_widget_output_status *widget, lv_obj_t *parent) { + widget->obj = lv_img_create(parent, NULL); + + lv_obj_set_size(widget->obj, 40, 15); + + sys_slist_append(&widgets, &widget->node); + + widget_output_status_init(); + return 0; +} + +lv_obj_t *zmk_widget_output_status_obj(struct zmk_widget_output_status *widget) { + return widget->obj; +} diff --git a/app/boards/arm/corneish_zen/widgets/output_status.h b/app/boards/arm/corneish_zen/widgets/output_status.h new file mode 100644 index 00000000..c171e2bb --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/output_status.h @@ -0,0 +1,19 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include +#include + +struct zmk_widget_output_status { + sys_snode_t node; + lv_obj_t *obj; +}; + +int zmk_widget_output_status_init(struct zmk_widget_output_status *widget, lv_obj_t *parent); +lv_obj_t *zmk_widget_output_status_obj(struct zmk_widget_output_status *widget); \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/widgets/peripheral_status.c b/app/boards/arm/corneish_zen/widgets/peripheral_status.c new file mode 100644 index 00000000..e18414be --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/peripheral_status.c @@ -0,0 +1,61 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include +#include + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include "peripheral_status.h" +#include +#include +#include + +LV_IMG_DECLARE(bluetooth_connected_right); +LV_IMG_DECLARE(bluetooth_disconnected_right); + +static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); + +struct peripheral_status_state { + bool connected; +}; + +static struct peripheral_status_state get_state(const zmk_event_t *_eh) { + return (struct peripheral_status_state){.connected = zmk_split_bt_peripheral_is_connected()}; +} + +static void set_status_symbol(lv_obj_t *icon, struct peripheral_status_state state) { + LOG_DBG("halves connected? %s", state.connected ? "true" : "false"); + + lv_img_set_src(icon, + state.connected ? &bluetooth_connected_right : &bluetooth_disconnected_right); +} + +static void output_status_update_cb(struct peripheral_status_state state) { + struct zmk_widget_peripheral_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_status_symbol(widget->obj, state); } +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_peripheral_status, struct peripheral_status_state, + output_status_update_cb, get_state) +ZMK_SUBSCRIPTION(widget_peripheral_status, zmk_split_peripheral_status_changed); + +int zmk_widget_peripheral_status_init(struct zmk_widget_peripheral_status *widget, + lv_obj_t *parent) { + widget->obj = lv_img_create(parent, NULL); + + sys_slist_append(&widgets, &widget->node); + + widget_peripheral_status_init(); + return 0; +} + +lv_obj_t *zmk_widget_peripheral_status_obj(struct zmk_widget_peripheral_status *widget) { + return widget->obj; +} diff --git a/app/boards/arm/corneish_zen/widgets/peripheral_status.h b/app/boards/arm/corneish_zen/widgets/peripheral_status.h new file mode 100644 index 00000000..59675763 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/peripheral_status.h @@ -0,0 +1,20 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include +#include + +struct zmk_widget_peripheral_status { + sys_snode_t node; + lv_obj_t *obj; +}; + +int zmk_widget_peripheral_status_init(struct zmk_widget_peripheral_status *widget, + lv_obj_t *parent); +lv_obj_t *zmk_widget_peripheral_status_obj(struct zmk_widget_peripheral_status *widget); \ No newline at end of file diff --git a/app/package-lock.json b/app/package-lock.json index afd730a5..ed8765f3 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -9,27 +9,30 @@ "version": "1.0.0", "license": "MIT", "devDependencies": { - "prettier": "^2.4.0" + "prettier": "^2.7.1" } }, "node_modules/prettier": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.0.tgz", - "integrity": "sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } } }, "dependencies": { "prettier": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.0.tgz", - "integrity": "sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true } } diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index ee977556..a503cc46 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -13,7 +13,6 @@ if ZMK_DISPLAY config ZMK_DISPLAY_BLANK_ON_IDLE bool "Blank display on idle" - default y choice LVGL_TXT_ENC default LVGL_TXT_ENC_UTF8 diff --git a/app/src/display/main.c b/app/src/display/main.c index 9de0ad7f..8a70cef2 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -73,6 +73,8 @@ static void start_display_updates() { k_timer_start(&display_timer, K_MSEC(TICK_MS), K_MSEC(TICK_MS)); } +#if IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) + static void stop_display_updates() { if (display == NULL) { return; @@ -83,6 +85,8 @@ static void stop_display_updates() { k_timer_stop(&display_timer); } +#endif + int zmk_display_is_initialized() { return initialized; } void initialize_display(struct k_work *work) { @@ -94,6 +98,8 @@ void initialize_display(struct k_work *work) { return; } + initialized = true; + screen = zmk_display_status_screen(); if (screen == NULL) { @@ -104,8 +110,6 @@ void initialize_display(struct k_work *work) { lv_scr_load(screen); start_display_updates(); - - initialized = true; } K_WORK_DEFINE(init_work, initialize_display); From ebb4cb76d364a704aa05a62ef322875d86795585 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 4 Nov 2022 17:02:23 -0700 Subject: [PATCH 130/289] fix(boards): Add Zen .conf file for setup script --- app/boards/arm/corneish_zen/corneish_zen.conf | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 app/boards/arm/corneish_zen/corneish_zen.conf diff --git a/app/boards/arm/corneish_zen/corneish_zen.conf b/app/boards/arm/corneish_zen/corneish_zen.conf new file mode 100644 index 00000000..a2e1fbe6 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen.conf @@ -0,0 +1,5 @@ +# Go to sleep after one hour (1*60*60*1000ms) +CONFIG_ZMK_IDLE_SLEEP_TIMEOUT=3600000 + +# Turn on logging, and set ZMK logging to debug output +# CONFIG_ZMK_USB_LOGGING=y From b8fb218a0195974a3df8367670051acf864d395e Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 16 Dec 2022 14:43:47 -0800 Subject: [PATCH 131/289] fix(setup): Make keymap/conf fall back to using dirname --- docs/src/templates/setup.ps1.mustache | 35 +++++++++++++++++---------- docs/src/templates/setup.sh.mustache | 24 ++++++++++-------- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/docs/src/templates/setup.ps1.mustache b/docs/src/templates/setup.ps1.mustache index 54c5ae82..a2bf0c58 100644 --- a/docs/src/templates/setup.ps1.mustache +++ b/docs/src/templates/setup.ps1.mustache @@ -209,27 +209,36 @@ Set-Location "$repo_name" Push-Location config -$config_file = "${keyboard}.conf" -$keymap_file = "${keyboard}.keymap" - if ($keyboard_type -eq "shield") { - $config_url = "https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/shields/${basedir}/${keyboard}.conf" - $keymap_url = "https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/shields/${basedir}/${keyboard}.keymap" + $url_base = "https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/shields/${basedir}" } else { - $config_url = "https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/${keyboard_arch}/${basedir}/${keyboard}.conf" - $keymap_url = "https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/${keyboard_arch}/${basedir}/${keyboard}.keymap" + $url_base = "https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/${keyboard_arch}/${basedir}" } -Write-Host "Downloading config file (${config_url})" +Write-Host "Downloading config file (${url_base}/${keyboard}.conf)" Try { - Invoke-RestMethod -Uri "${config_url}" -OutFile "${config_file}" + Invoke-RestMethod -Uri "${config_url}" -OutFile "${keyboard}.conf" } Catch { - Set-Content -Path $config_file "# Place configuration items here" + Try { + Write-Host "Could not find it, falling back to ${url_base}/${basedir}.conf" + Invoke-RestMethod -Uri "${url_base}/${basedir}.conf" -OutFile "${basedir}.conf" + } Catch { + Set-Content -Path "${keyboard}.conf" "# Put configuration options here" + } } if ($copy_keymap -eq "yes") { - Write-Host "Downloading keymap file (${keymap_url})" - Invoke-RestMethod -Uri "${keymap_url}" -OutFile "${keymap_file}" + Write-Host "Downloading keymap file (${url_base}/${keyboard}.keymap)" + Try { + Invoke-RestMethod -Uri "${url_base}/${keyboard}.keymap" -OutFile "${keyboard}.keymap" + } Catch { + Write-Host "Could not find it, falling back to ${url_base}/${basedir}.keymap" + Try { + Invoke-RestMethod -Uri "${url_base}/${basedir}.keymap" -OutFile "${basedir}.keymap" + } Catch { + Write-Host "Warning: Could not find a keymap file to download!" + } + } } Pop-Location @@ -264,7 +273,7 @@ if ($github_repo -ne "") { Write-Host " git remote rm origin" Write-Host " git remote add origin FIXED_URL" Write-Host " git push --set-upstream origin $(git symbolic-ref --short HEAD)" - Write-Host "Once pushed, your firmware should be availalbe from GitHub Actions at: $actions" + Write-Host "Once pushed, your firmware should be available from GitHub Actions at: $actions" exit 1 } diff --git a/docs/src/templates/setup.sh.mustache b/docs/src/templates/setup.sh.mustache index 3184aab2..4c3868ec 100644 --- a/docs/src/templates/setup.sh.mustache +++ b/docs/src/templates/setup.sh.mustache @@ -205,19 +205,23 @@ cd ${repo_name} pushd config if [ "$keyboard_shield" == "y" ]; then - config_file="https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/shields/${keyboard_basedir}/${shield}.conf" - - keymap_file="https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/shields/${keyboard_basedir}/${shield}.keymap" + url_base="https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/shields/${keyboard_basedir}" else - config_file="https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/${keyboard_arch}/${keyboard_basedir}/${board}.conf" - keymap_file="https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/${keyboard_arch}/${keyboard_basedir}/${board}.keymap" + url_base="https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/${keyboard_arch}/${keyboard_basedir}" +fi + +echo "Downloading config file (${url_base}/${keyboard}.conf)" +if ! $download_command "${url_base}/${keyboard}.conf"; then + echo "Could not find it, falling back to ${url_base}/${keyboard_basedir}.conf" + $download_command "${url_base}/${keyboard_basedir}.conf" || echo "# Put configuration options here" > "${keyboard}.conf" fi -echo "Downloading config file (${config_file})" -$download_command "${config_file}" || echo "# Put configuration options here" > "${keyboard}.conf" if [ "$copy_keymap" == "yes" ]; then - echo "Downloading keymap file (${keymap_file})" - $download_command "${keymap_file}" + echo "Downloading keymap file (${url_base}/${keyboard}.keymap)" + if ! $download_command "${url_base}/${keyboard}.keymap"; then + echo "Could not find it, falling back to ${url_base}/${keyboard_basedir}.keymap" + $download_command "${url_base}/${keyboard_basedir}.keymap" || echo "Warning: Could not find a keymap file to download!" + fi fi popd @@ -254,7 +258,7 @@ if [ -n "$github_repo" ]; then echo " git remote rm origin" echo " git remote add origin FIXED_URL" echo " git push --set-upstream origin $(git symbolic-ref --short HEAD)" - echo "Once pushed, your firmware should be availalbe from GitHub Actions at: ${github_repo%.git}/actions" + echo "Once pushed, your firmware should be available from GitHub Actions at: ${github_repo%.git}/actions" exit 1 fi From 781df31ec482039cf1ca75564853126157aa094f Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 17 Dec 2022 15:34:24 -0800 Subject: [PATCH 132/289] fix(setup): Fix conf download path in PS script --- docs/src/templates/setup.ps1.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/templates/setup.ps1.mustache b/docs/src/templates/setup.ps1.mustache index a2bf0c58..f90c7488 100644 --- a/docs/src/templates/setup.ps1.mustache +++ b/docs/src/templates/setup.ps1.mustache @@ -217,7 +217,7 @@ if ($keyboard_type -eq "shield") { Write-Host "Downloading config file (${url_base}/${keyboard}.conf)" Try { - Invoke-RestMethod -Uri "${config_url}" -OutFile "${keyboard}.conf" + Invoke-RestMethod -Uri "${url_base}/${keyboard}.conf" -OutFile "${keyboard}.conf" } Catch { Try { Write-Host "Could not find it, falling back to ${url_base}/${basedir}.conf" From 5cbe572f7df46ea01d9f0d16ac0c120c7ae3d017 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 18 Dec 2022 12:54:58 -0800 Subject: [PATCH 133/289] fix(display): Re-default to blank on idle for OLEDs --- app/src/display/Kconfig | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index a503cc46..c0753358 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -6,13 +6,14 @@ menuconfig ZMK_DISPLAY default n select DISPLAY select LVGL - select LVGL_THEMES - select LVGL_THEME_MONO + select LVGL_THEMES + select LVGL_THEME_MONO if ZMK_DISPLAY config ZMK_DISPLAY_BLANK_ON_IDLE bool "Blank display on idle" + default y if SSD1306 choice LVGL_TXT_ENC default LVGL_TXT_ENC_UTF8 From 11ca0098a5920aaa59738af9ccca3dca725d43f7 Mon Sep 17 00:00:00 2001 From: as29 Date: Tue, 20 Dec 2022 15:24:32 -0500 Subject: [PATCH 134/289] fix(docs): Disable encoders in dtsi (#1600) --- docs/docs/development/new-shield.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/development/new-shield.md b/docs/docs/development/new-shield.md index ea26f6eb..2e468fe0 100644 --- a/docs/docs/development/new-shield.md +++ b/docs/docs/development/new-shield.md @@ -461,6 +461,7 @@ left_encoder: encoder_left { a-gpios = ; b-gpios = ; resolution = <4>; + status = "disabled"; }; ``` From 3eb06f137bac1f8ae8ccabb3464dd5c1943b784c Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 11 Dec 2022 12:20:56 -0600 Subject: [PATCH 135/289] feat: Add global macro timing configs Added ZMK_MACRO_DEFAULT_WAIT_MS and ZMK_MACRO_DEFAULT_TAP_MS to set global defaults for the wait-ms and tap-ms properties of macros. Also reduced the default timings for macros, since it's been reported many times that 100 ms is too slow. --- app/Kconfig | 8 +++++++ .../behaviors/zmk,behavior-macro.yaml | 2 -- app/src/behaviors/behavior_macro.c | 4 ++-- .../timing-override/keycode_events.snapshot | 2 +- docs/docs/config/behaviors.md | 21 ++++++++++++------- 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 9902046d..358d5d14 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -355,6 +355,14 @@ config ZMK_BEHAVIOR_KEY_TOGGLE bool default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_KEY_TOGGLE)) +config ZMK_MACRO_DEFAULT_WAIT_MS + int "Default time to wait (in milliseconds) before triggering the next behavior in macros" + default 15 + +config ZMK_MACRO_DEFAULT_TAP_MS + int "Default time to wait (in milliseconds) between the press and release events of a tapped behavior in macros" + default 30 + endmenu menu "Advanced" diff --git a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml index ba5bcb07..00947685 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml @@ -13,9 +13,7 @@ properties: required: true wait-ms: type: int - default: 100 description: The default time to wait (in milliseconds) before triggering the next behavior in the macro bindings list. tap-ms: type: int - default: 100 description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding \ No newline at end of file diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index a6430a53..46fdde3c 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -174,8 +174,8 @@ static const struct behavior_driver_api behavior_macro_driver_api = { #define MACRO_INST(n) \ static struct behavior_macro_state behavior_macro_state_##n = {}; \ static struct behavior_macro_config behavior_macro_config_##n = { \ - .default_wait_ms = DT_INST_PROP_OR(n, wait_ms, 100), \ - .default_tap_ms = DT_INST_PROP_OR(n, tap_ms, 100), \ + .default_wait_ms = DT_INST_PROP_OR(n, wait_ms, CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS), \ + .default_tap_ms = DT_INST_PROP_OR(n, tap_ms, CONFIG_ZMK_MACRO_DEFAULT_TAP_MS), \ .count = DT_INST_PROP_LEN(n, bindings), \ .bindings = TRANSFORMED_BEHAVIORS(n)}; \ DEVICE_DT_INST_DEFINE(n, behavior_macro_init, NULL, &behavior_macro_state_##n, \ diff --git a/app/tests/macros/timing-override/keycode_events.snapshot b/app/tests/macros/timing-override/keycode_events.snapshot index 650d6747..0ff45904 100644 --- a/app/tests/macros/timing-override/keycode_events.snapshot +++ b/app/tests/macros/timing-override/keycode_events.snapshot @@ -1,6 +1,6 @@ queue_process_next: Invoking KEY_PRESS: 0x70004 0x00 kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -queue_process_next: Processing next queued behavior in 100ms +queue_process_next: Processing next queued behavior in 30ms queue_process_next: Invoking KEY_PRESS: 0x70004 0x00 kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 50ms diff --git a/docs/docs/config/behaviors.md b/docs/docs/config/behaviors.md index 67f5ce74..2ff99d58 100644 --- a/docs/docs/config/behaviors.md +++ b/docs/docs/config/behaviors.md @@ -120,19 +120,26 @@ Creates a custom behavior which triggers a sequence of other behaviors. See the [macro behavior](../behaviors/macros.md) documentation for more details and examples. +### Kconfig + +| Config | Type | Description | Default | +| ---------------------------------- | ---- | -------------------------------------- | ------- | +| `CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS` | int | Default value for `wait-ms` in macros. | 15 | +| `CONFIG_ZMK_MACRO_DEFAULT_TAP_MS` | int | Default value for `tap-ms` in macros. | 30 | + ### Devicetree Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-macro.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-macro.yaml) Applies to: `compatible = "zmk,behavior-macro"` -| Property | Type | Description | Default | -| ---------------- | ------------- | ----------------------------------------------------------------------------------------------------- | ------- | -| `label` | string | Unique label for the node | | -| `#binding-cells` | int | Must be `<0>` | | -| `bindings` | phandle array | List of behaviors to trigger | | -| `wait-ms` | int | The default time to wait (in milliseconds) before triggering the next behavior. | 100 | -| `tap-ms` | int | The default time to wait (in milliseconds) between the press and release events of a tapped behavior. | 100 | +| Property | Type | Description | Default | +| ---------------- | ------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------- | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must be `<0>` | | +| `bindings` | phandle array | List of behaviors to trigger | | +| `wait-ms` | int | The default time to wait (in milliseconds) before triggering the next behavior. | `CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS` | +| `tap-ms` | int | The default time to wait (in milliseconds) between the press and release events of a tapped behavior. | `CONFIG_ZMK_MACRO_DEFAULT_TAP_MS` | The following macro-specific behaviors can be added at any point in the `bindings` list to change how the macro triggers subsequent behaviors. From 6e99a4869677b809e3f4a77c87705beb0012f24a Mon Sep 17 00:00:00 2001 From: Nick Coutsos Date: Fri, 2 Dec 2022 00:03:13 -0500 Subject: [PATCH 136/289] fix(behaviors): Mark sticky key release-after-ms required --- app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml b/app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml index c04883c0..172f20a2 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml @@ -13,6 +13,7 @@ properties: required: true release-after-ms: type: int + required: true quick-release: type: boolean ignore-modifiers: From 58f8c97d3cd37a0da335bed84fc457aa85b17bfe Mon Sep 17 00:00:00 2001 From: Ladislav Benc Date: Wed, 21 Dec 2022 03:49:17 +0100 Subject: [PATCH 137/289] feat(shields): Add a Reviung5 shield Co-authored-by: Pete Johanson --- app/boards/shields/reviung5/Kconfig.defconfig | 9 ++++ app/boards/shields/reviung5/Kconfig.shield | 4 ++ app/boards/shields/reviung5/reviung5.conf | 3 ++ app/boards/shields/reviung5/reviung5.keymap | 38 +++++++++++++ app/boards/shields/reviung5/reviung5.overlay | 54 +++++++++++++++++++ app/boards/shields/reviung5/reviung5.zmk.yml | 9 ++++ 6 files changed, 117 insertions(+) create mode 100644 app/boards/shields/reviung5/Kconfig.defconfig create mode 100644 app/boards/shields/reviung5/Kconfig.shield create mode 100644 app/boards/shields/reviung5/reviung5.conf create mode 100644 app/boards/shields/reviung5/reviung5.keymap create mode 100644 app/boards/shields/reviung5/reviung5.overlay create mode 100644 app/boards/shields/reviung5/reviung5.zmk.yml diff --git a/app/boards/shields/reviung5/Kconfig.defconfig b/app/boards/shields/reviung5/Kconfig.defconfig new file mode 100644 index 00000000..9477db39 --- /dev/null +++ b/app/boards/shields/reviung5/Kconfig.defconfig @@ -0,0 +1,9 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_REVIUNG5 + +config ZMK_KEYBOARD_NAME + default "Reviung5" + +endif \ No newline at end of file diff --git a/app/boards/shields/reviung5/Kconfig.shield b/app/boards/shields/reviung5/Kconfig.shield new file mode 100644 index 00000000..2ecf47b2 --- /dev/null +++ b/app/boards/shields/reviung5/Kconfig.shield @@ -0,0 +1,4 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT +config SHIELD_REVIUNG5 + def_bool $(shields_list_contains,reviung5) \ No newline at end of file diff --git a/app/boards/shields/reviung5/reviung5.conf b/app/boards/shields/reviung5/reviung5.conf new file mode 100644 index 00000000..a8b4a868 --- /dev/null +++ b/app/boards/shields/reviung5/reviung5.conf @@ -0,0 +1,3 @@ +# Encoder support. Uncomment to enable. +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y diff --git a/app/boards/shields/reviung5/reviung5.keymap b/app/boards/shields/reviung5/reviung5.keymap new file mode 100644 index 00000000..93669479 --- /dev/null +++ b/app/boards/shields/reviung5/reviung5.keymap @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +#define BASE 0 +#define BLE 1 + +/ { + keymap { + compatible = "zmk,keymap"; + + base_layer { + label = "BASE"; + bindings = < + // ╭─────────────┬──────────────┬──────────────────┬─────────────┬─────────────╮ + &mo BLE &kp C_PREVIOUS &kp C_PLAY_PAUSE &kp C_NEXT &kp C_MUTE + // ╰─────────────┴──────────────┴──────────────────┴─────────────┴─────────────╯ + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + ble_layer { + label = "BLE"; + bindings = < + // ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ + &trans &out OUT_TOG &bt BT_PRV &bt BT_NXT &bt BT_CLR + // ╰─────────────┴─────────────┴─────────────┴─────────────┴─────────────╯ + >; + }; + }; +}; diff --git a/app/boards/shields/reviung5/reviung5.overlay b/app/boards/shields/reviung5/reviung5.overlay new file mode 100644 index 00000000..24b0f582 --- /dev/null +++ b/app/boards/shields/reviung5/reviung5.overlay @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <5>; + rows = <1>; + + map = ; + }; + + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; + + col-gpios + = <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + ; + + row-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; + + encoder: encoder { + compatible = "alps,ec11"; + label = "encoder"; + a-gpios = <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder>; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/reviung5/reviung5.zmk.yml b/app/boards/shields/reviung5/reviung5.zmk.yml new file mode 100644 index 00000000..9be3811f --- /dev/null +++ b/app/boards/shields/reviung5/reviung5.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: reviung5 +name: REVIUNG5 +type: shield +url: https://github.com/gtips/reviung/tree/master/reviung5 +requires: [pro_micro] +features: + - keys + - encoder From 14324390e8df33df232cca20556b39c0ae4e1c1f Mon Sep 17 00:00:00 2001 From: "byran.tech" <61983584+Hello9999901@users.noreply.github.com> Date: Thu, 22 Dec 2022 21:42:57 -0500 Subject: [PATCH 138/289] fix(boards): replace nRF3840 with nRF5340 --- .../nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml b/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml index c8472428..444de996 100644 --- a/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml +++ b/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" id: nrf5340dk_nrf5340_cpuapp -name: Nordic nRF3840 DK +name: Nordic nRF5340 DK type: board arch: arm outputs: From 77d60182bf1b4704601ccb9c1207f108cbf08b90 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 12 Aug 2022 14:21:42 -0700 Subject: [PATCH 139/289] feat(docs): Recommend USB testing and warn about BT pairing in user setup --- docs/docs/user-setup.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index 06c168b3..3becf5fd 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -193,13 +193,14 @@ To flash the firmware, first put your board into bootloader mode by double click or the one that is part of your keyboard). The controller should appear in your OS as a new USB storage device. Once this happens, copy the correct UF2 file (e.g. left or right if working on a split), and paste it onto the root of that USB mass -storage device. Once the flash is complete, the controller should automatically restart, and load your newly flashed firmware. +storage device. Once the flash is complete, the controller should automatically restart, and load your newly flashed firmware. It is +recommended that you test your keyboard works over USB first to rule out hardware issues, before trying to connect to it wirelessly. ## Wirelessly Connecting Your Keyboard -ZMK will automatically advertise itself as connectable if it is not currently connected to a device. You should be able to see your keyboard from the bluetooth scanning view of your laptop or phone / tablet. It is reported by some users that the connections with Android / iOS devices are generally smoother than with laptops, so if you have trouble connecting, you could try to connect from your phone or tablet first to eliminate any potential hardware issues. +ZMK will automatically advertise itself as connectable if it is not currently connected to a device. You should be able to see your keyboard from the bluetooth scanning view of your computer or phone / tablet. It is reported by some users that the connections with Android / iOS devices are generally smoother than with laptops, so if you have trouble connecting, you could try to connect from your phone or tablet first to eliminate any potential hardware issues with bluetooth receivers. -ZMK supports multiple BLE “profiles”, which allows you to connect to and switch among multiple devices. Please refer to the [Bluetooth behavior](behaviors/bluetooth.md) section for detailed explanations on how to use them. +ZMK supports multiple BLE “profiles”, which allows you to connect to and switch among multiple devices. Please refer to the [Bluetooth behavior](behaviors/bluetooth.md) section for detailed explanations on how to use them. If you don't make use of the mentioned behaviors you will have issues pairing your keyboard to other devices. ### Connecting Split Keyboard Halves From 080c47825f9985c6cbddad501a3af1b4e721736b Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 12 Aug 2022 14:22:18 -0700 Subject: [PATCH 140/289] feat(docs): Add caution note about split peripheral sides to user setup --- docs/docs/user-setup.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index 3becf5fd..961d1079 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -196,6 +196,14 @@ Once this happens, copy the correct UF2 file (e.g. left or right if working on a storage device. Once the flash is complete, the controller should automatically restart, and load your newly flashed firmware. It is recommended that you test your keyboard works over USB first to rule out hardware issues, before trying to connect to it wirelessly. +:::caution Split keyboards + +For split keyboards, only the central half (typically the left side) will send keyboard outputs over USB or advertise to other devices +over bluetooth. Peripheral half will only send keystrokes to the central once they are paired and connected. For this reason it is +recommended to test the left half of a split keyboard first. + +::: + ## Wirelessly Connecting Your Keyboard ZMK will automatically advertise itself as connectable if it is not currently connected to a device. You should be able to see your keyboard from the bluetooth scanning view of your computer or phone / tablet. It is reported by some users that the connections with Android / iOS devices are generally smoother than with laptops, so if you have trouble connecting, you could try to connect from your phone or tablet first to eliminate any potential hardware issues with bluetooth receivers. From d993b0343304c1d7f67837e1d5a42e70bf05a8f2 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 12 Aug 2022 14:53:55 -0700 Subject: [PATCH 141/289] feat(docs): Refer to troubleshooting in connecting split halves --- docs/docs/user-setup.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index 961d1079..a2e491b8 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -213,3 +213,11 @@ ZMK supports multiple BLE “profiles”, which allows you to connect to and swi ### Connecting Split Keyboard Halves For split keyboards, after flashing each half individually you can connect them together by resetting them at the same time. Within a few seconds of resetting, both halves should automatically connect to each other. + +:::note + +If you have issues connecting the halves, make sure that both sides are getting powered properly through USB or batteries, then follow the +[recommended troubleshooting procedure](troubleshooting.md#split-keyboard-halves-unable-to-pair). This is typically necessary if you +swapped firmware sides between controllers, like flashing left side firmware to the same controller after flashing the right, or vice versa. + +::: From c23443a086b62833ba0b88dd3a271993d3bc9cea Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 23 Dec 2022 05:02:18 +0000 Subject: [PATCH 142/289] feat(docs): Generate new shield interconnect docs. * Add to metadata schema for interconnects. * New conventional location for pinout diagrams/pics. * New component to generate the tabs for the new shield doc section on interconnects. * Add XIAO and arduino uno pinout diagram. Co-authored-by: Cem Aksoylar --- .../arduino_uno/arduino_uno.zmk.yml | 10 +++ .../interconnects/blackpill/blackpill.zmk.yml | 7 ++ .../interconnects/pro_micro/pro_micro.zmk.yml | 7 ++ .../seeed_xiao/seeed_xiao.zmk.yml | 7 ++ .../interconnects/arduino_uno/pinout.png | Bin 0 -> 118303 bytes .../blackpill/pinout.png} | Bin .../assets/interconnects/pro_micro/pinout.png | Bin 0 -> 492581 bytes .../interconnects/seeed_xiao/pinout.png | Bin 0 -> 495415 bytes .../pro-micro/pro-micro-pins-labelled.jpg | Bin 490463 -> 0 bytes .../development/boards-shields-keymaps.md | 2 +- docs/docs/development/new-shield.md | 31 +------- docs/src/components/interconnect-tabs.tsx | 74 ++++++++++++++++++ docs/src/data/interconnects/.gitignore | 1 + .../index.js | 16 ++++ schema/hardware-metadata.schema.json | 22 ++++++ 15 files changed, 149 insertions(+), 28 deletions(-) create mode 100644 docs/docs/assets/interconnects/arduino_uno/pinout.png rename docs/docs/assets/{blackpill/blackpill-pins-labelled.png => interconnects/blackpill/pinout.png} (100%) create mode 100644 docs/docs/assets/interconnects/pro_micro/pinout.png create mode 100644 docs/docs/assets/interconnects/seeed_xiao/pinout.png delete mode 100644 docs/docs/assets/pro-micro/pro-micro-pins-labelled.jpg create mode 100644 docs/src/components/interconnect-tabs.tsx create mode 100644 docs/src/data/interconnects/.gitignore diff --git a/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml b/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml index 8ec164eb..d6eb89a3 100644 --- a/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml +++ b/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml @@ -13,3 +13,13 @@ description: | Note: ZMK doesn't support boards with AVR 8-bit processors, such as the ATmega32U4, because Zephyr™ only supports 32-bit and 64-bit platforms. As a result, boards like the original Arduino Uno Rev3 itself are *not* supported by ZMK. +node_labels: + gpio: arduino_header + i2c: arduino_i2c + spi: arduino_spi + uart: arduino_serial + adc: arduino_adc +design_guideline: | + The GPIO pin references for the Uno format are a bit odd. The `&arduino_header` label is used, but the numbering + starts at the `A0` pin and increments as you go counter clockwise around the board. That means the `D6` pin + can be referenced by `&arduino_header 12` in your overlay files. diff --git a/app/boards/interconnects/blackpill/blackpill.zmk.yml b/app/boards/interconnects/blackpill/blackpill.zmk.yml index d3fcdc88..0d91e96c 100644 --- a/app/boards/interconnects/blackpill/blackpill.zmk.yml +++ b/app/boards/interconnects/blackpill/blackpill.zmk.yml @@ -6,3 +6,10 @@ url: https://github.com/WeActStudio/WeActStudio.MiniSTM32F4x1 manufacturer: WeAct Studio description: | The WeAct Studio BlackPill has grown in popularity due to its low price, availability, and utilization of the powerful STM32F4x1CEU6 microcontroller. The BlackPill features more GPIO than most other boards, but also has a comparatively larger footprint as a result. Many clones and variations of the original BlackPill are available on the market as an affordable and more powerful alternative to many popular boards. The official WeAct variations of the WeAct Studio BlackPill are powered by the STM32F411CEU6 and STM32F401CEU6 microcontrollers. +node_labels: + gpio: blackpill + i2c: blackpill_i2c + spi: blackpill_spi + uart: blackpill_serial +design_guideline: | + ZMK uses the blue color coded pin names to generate devicetree node references. For example, to refer to the pin labeled `17` in the diagram, use `&blackpill 17` in the devicetree files. diff --git a/app/boards/interconnects/pro_micro/pro_micro.zmk.yml b/app/boards/interconnects/pro_micro/pro_micro.zmk.yml index 78aa14a1..83aa31c7 100644 --- a/app/boards/interconnects/pro_micro/pro_micro.zmk.yml +++ b/app/boards/interconnects/pro_micro/pro_micro.zmk.yml @@ -12,3 +12,10 @@ description: | Note: ZMK doesn't support boards with AVR 8-bit processors, such as the ATmega32U4, because Zephyr™ only supports 32-bit and 64-bit platforms. As a result, controllers like the SparkFun Pro Micro and the Elite-C are *not* supported by ZMK. +node_labels: + gpio: pro_micro + i2c: pro_micro_i2c + spi: pro_micro_spi + uart: pro_micro_serial +design_guideline: | + ZMK uses the blue color coded "Arduino" pin names to generate devicetree node references. For example, to refer to the pin labeled `0` in the diagram, use `&pro_micro 0` in the devicetree files. diff --git a/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml b/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml index cb9f6b56..48080c7f 100644 --- a/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml +++ b/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml @@ -8,3 +8,10 @@ description: | The Seeed(uino) XIAO is a popular smaller format micro-controller, that has gained popularity as an alterative to the SparkFun Pro Micro. Since its creation, several pin compatible controllers, such as the Seeeduino XIAO BLE, Adafruit QT Py and Adafruit QT Py RP2040, have become available. +node_labels: + gpio: xiao_d + i2c: xiao_i2c + spi: xiao_spi + uart: xiao_serial +design_guideline: | + ZMK uses the "D"-prefixed, green color coded pin names, e.g. `D2`, to generate devicetree node references. For example, to refer to the pin labeled `D0` in the diagram, use `&xiao_d 0` in the devicetree files. diff --git a/docs/docs/assets/interconnects/arduino_uno/pinout.png b/docs/docs/assets/interconnects/arduino_uno/pinout.png new file mode 100644 index 0000000000000000000000000000000000000000..b796070063248fba51053a609c1e73e16584efff GIT binary patch literal 118303 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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/blackpill/blackpill-pins-labelled.png b/docs/docs/assets/interconnects/blackpill/pinout.png similarity index 100% rename from docs/docs/assets/blackpill/blackpill-pins-labelled.png rename to docs/docs/assets/interconnects/blackpill/pinout.png diff --git a/docs/docs/assets/interconnects/pro_micro/pinout.png b/docs/docs/assets/interconnects/pro_micro/pinout.png new file mode 100644 index 0000000000000000000000000000000000000000..7e548da515416d061b3ee1ee2908280d4a094204 GIT binary patch literal 492581 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

o%}v_VN+$)tSdSj}^R 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%0A;xo;n=gy`dVyk?opfT51O=sxp5_ow>_PxN6P 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 xt?Vun71*z#umCY=b< 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�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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/interconnects/seeed_xiao/pinout.png b/docs/docs/assets/interconnects/seeed_xiao/pinout.png new file mode 100644 index 0000000000000000000000000000000000000000..74a1005335a7a01a36fd611a318ad69afacab9d5 GIT binary patch literal 495415 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 z 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

j?PE6oU6*SKejimJVuO^b#Wm}W?T@Jz}FXo)3 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

MVl_QC@oa^&2;C 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

P0e|P#no3X|HJ=gvOV0h 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%0D@RdDvbN6 zsM|Hxi2y{guBxVKY$xl0%bLj+3$AW%aX)7#k->SfscFn0bFX$1<)*<@%K;E^AaR7=DC-myAOj#FdB{=%=a&kUb&93-e&H;WK*(sz`iMg;GDQ`dRFH*RXw{|Yp$ zcVjnxbYiyv_;(~;W21tRps{tFnWiZ`7sez_Q}?o7Qz$2ix5&yXjg_rTti`BFF?QbN zkzucm-gENE!|%N3=QS)L#RB7v@k?KL^w$e}*+ZFh^TyTc^$QmLZ*@cvK!BwN15Fg$ zbP@L60nvh>Mr%)>JKHE6s{|qxU!Q&U=@ak!c}ffz4e?;l+aB6@Y%`y1FOUM|Swmg> zG)pTF+a{0h`)L2?{u96)7{QO={F4`d~3B z0EIJy9s~za0_a`@laa6&5%j8?cZ;IX)Bp=t&Zx*}MOKU}6R4tYXRx@uHQ7c*(D*Fw z9=-F(XFm4_18bG;q@6fQl8cwFTwmYnbbHs=CwJU=w^4NU!dX|j?ct=Xt31z{-TL|} zFh{XUqWJK^L+^d>d(WP}JRB8;D=%EXu~kcJdF#a5MpGoVIdWkCPyYCi?^#?pf92Ao zZkCt!dXTJ>*Us10MW~4o1f26)69|*AA;Vz;gaGJ37*I>Vv$vC#sa{Dt8VK@07+Av% zlOiJI(2p0OaO{3S4bVzv-g5BUs^CXT2INO-V_x_61QjB8XNJf z1N)Xon`=)z_DvxD_x|qx_pSHezqL`v>0qmxbO-%w7cTS{I^AAxGOqjSk}=X4t94|z zo6F;k*k>w=H>J~1T05r@z%wG(Tq=bIBIkH)N4-QMua|oR%@Ap_jhGnQZ;-Ti7yxLE zZ(myz91%f80oG-iMX6$tx;~I*kN>~_yEnc6o$F1(ky{|q3SWLk|_v7#T z*aN3N{eS%18!um3$n(NA%DH9KkNoEEeDtT@2R#z5u@m3<&bR;Z`TsSGqC4O578vxv z2mrv==1brD?vmv!ikqe~S>kO2jlKNsr}qE-UxPt6qG-(S(0zBpeYe9>2f8WL7EbOz z`FH-)rWalQ%vY1b)#6EOro?Juj~ekuo03n#T(D}XZ`6#F!Q_?t_=y=b)5BF}r zJ&h6&v32bi4}-_XI%TwKc<|tRU;O$bhjmri!Uz)Tq!SH2uAB7aM}Hpw%zq5&GWZ6# zfJ@Jx`OGKOm6vm_CS}oE>W!N%Wi&fb0w@H~;@tlP+5gV2K$z8d00i*CZSC%pw|(`> zbxoErHc3*IO_pW8p6D2@698_k*I@H{IJ$89oHpavZ)5MT`?AQd135P|}U02r_gB>@0o@V($bk7lq4(Mn`G zKA;$;fGgQCIHm7*h;O-&yqBhFME=c8wEk@kk(MD~j0plkA%ZX|BIJ3lwH}Q|RaJF+ z9Ve`{{>5MXMRBt4(4kqcdN>)|rs^9VGeFsZtyH2wLf@KR^Av#5dk~Llri}^uL#W6D z5Q53$&F!rl!!c-sjT;ve7RWoj+wbTmX}`a;WV-!5%Zof7*7YO+$B_^e0S9CkB1v78 z&Z(7^6-2ak-89X3Tn{Hj+V6Pbg9r9*mlrBm9X`14(4j+z-uB?5kA8K0@$$mLpst&k zqLU|2K6c|;pbu>hx8g*1x@p~%WtkjX*?08N%IbK{d+QRrd39@ln!Ix3dYz7>zxGSeOF$EJ2#ze@|C1kj_J90@E1Wh|*L4JXbZs48 zcp2VyCz=>+bL0c>{^Do9Fsa>#-t`Xf3>iTU+mAnOx5ng9N7^ZD%E~&MMzN{t(|_>j z>h`uRYl)*_M9Xiv>wSOyFAd&&3XG~<8E4VGf92;d|M7S0VhvabyeJ$NlSpf}PSGyr zXE*-siQNL=-_bzC9m(-I3`0>ANhdApN~x-P3&4?5AlELmnTpj@PyReJ?>t%$}& zwJ=zmY&S719o_ei54__Sy)5S@cQC%Z{q0A;{fQSYeo-f-F-g@lTC<4%k-Fprk=fLe zUa6uJ_rD96m_cjfA>aFOiy}oV$5Y$Op zm^U(r#4Jln-?e8svqhTd%E>%ECHVL|eXF)mJq!|Ufi{GPWT*th4Y zbI(kgrci#ey)}HiSlF|8U}^8(rM(~j*pHn)^Gd(hyXS$oKlt{K?mv9;i6@`_!XJKi zd$@Mu#Icn@YMn1iyRbB9n$e;CgA<4LE_6HH4DYz@j@a}L9zA}2b8T%r*&NqIQ5>hv zxu$7ENd$aw@17`%u3x)SR!x${P2)SA!PfT3L=;836~qLnK)(BpKkVN4`a!)O*)ej1 zrsITJ%GfA&9zctv0IZ<|aGtB1OX0PCadvF2 z>bef%Jl_jk*_8*G#_PsM1r{|?&<34nH~=#*EiK$}$B94sqd)r1-~7b8-~I0U?z=}T zJa*(DkPeCcq^QoEJ^jCY@?UPQU4HwA-d8{Qomc+g%X^a85nHyTNv7V1KlCRGaxD|1 zR~~xX;yWIM$cTb4Z(@Lg`PsE=&)v9ky{>Fi_p3V3yZwcQeFqNRcH+*(<&e`?&piH( zNUK6TB9bCR<_aFkWiG`swGt-SC7JXx*tsDyDr0m+t%NpZE_G-0!UNW-@HfKKiZS ze(vm7R9Z;Qv` zq<{u3j@?*Tfr=sDcl3dGZ9aN>Pi#nZ$*`f~t{dqq4C<;^RJwVP4x1WSE|uC+A{v-x}SFU zF7G|Mf2l5q3!Prp?H%f5MLj%lXz73dH~+(K8n0iwJleQ1-deqO`HU4PtF3;2Veg(n z602e|yl~;dcxW$OyTJxlj@+h=nUu|yYiri}G>vUJHX08fJOBWfE?-^W-ac}4(9}HK z98StA5pJqNMMjyJ0WHAe7tR+iJ@M9+>Q1$qOx6P3Rlqs)N|-@=NJ&Ub3D`ISAMBez z5f~A))^6Gb(><6SzYlaipS$ev8h^kyMsA%TeSc!Wt~SV@FapDJrWy%z@~NSTPDDTR zGe5JwzW(dK{_D>^`}BYIpZ}+~pST@}#9E9E06g)XZ~y9l|En8Y>mUE%`#=2NcU}4N z*Ux?Rt29`2XhDe=e(m2f6lzBGIL)%72N&T%008lfva0PEKk96Gu~QXz2R)>y$!n{0A2)8NZ5JnoU+1O|a^(-1Numd4yeLQQaYX&{^3usFYSn$Xslz$@O;}IrQ(n|Di10 zGYvMjN_56kW!*Up%&V|pP^K~uEWt=&YPYsy1>l@RMA0OKNd&1r{Pwr3zH$MM z?S}}!I=FQ8>QgT)lQ?k*Y;8@zMNuddB}t-?taX!d0kvOAyLMQN<1xH&2Htv#dZv^n zkJQmqcU<|(x40}brP#SFipSfdG>Kq$0up2ueg2Dz>)bGSaQBB57ymV;q z+ur)X#}J~rDRl%6>T9bP%4VdrisL0Hv;7Nq{oGIftsWj>P?4!Ns^`D()!%sj{2w){ z=yy8fV#I<(8rW;3A1S~D|Nq(h&tS{4>^u?a?bFO(leP(%IUEO87(H>|57&HK) z;YkpLhDMYWF_a<{;z$aGCKQU82>sB+L@+o5X+&~3z<^-)fFl5eYZ$gcqlrcvG}@KV zvgs<#v)7$-_TFph$3FMImu1kE0LZQq--?Wr_g!=R*?XC9eILOwfW&jp22yxPGl*Lcq zeap_dyFdHV;5l zi-L=CsH53<`^uR!r|-Vy^wEuVjHfDCI(l+xxq=XcPw@JQTaLrx_~p}2JpI(^lSiC$ zx8HGQWp#*}dS!Kavb(afwl&+kc=452w%WE)fcAFB(X>~{uvc!Zt~E{5grFu>f2k^m zy=s_@%Cab30mlYy!DHZ3Z|&dF&6}z_`=^#Kyr9pyZ4Q zwU`)Nq_*cBTo33alnxOv&a-;HHUB(GhAw2t#Qe;7mGs=9)Bk#QL(#s9NJ@do=FGOp zlrlt!v31Ug&^`Cu_4oeX-&tK<7Vmt25aAqw9K#TUHIrsg^dJ5HhyTV;{utI)VlzFq zu{v}zLv)3M-oQ0tLjY?fu3%V%60>-~!Kq=bT0+p-s2-Msm9p=BSya8!Y-x3ExV$7H zgVI;DvAi@;jfP~FppIPbCk8V+agKg)pMUAmcYObe_1?`V)~{}Fd57tCSx>e; z@}c*wtRMUGH=caw1NT1gz+(IYmvt)scp+IIZH1w8k%eAiu3lVf}A2mji+$IrqV7$Cg! zM_+KeBaIdidfqiLkdS%j)|R)ncU+U!SJtVjV$@)X$dD440X0h{d9*VQiIWlF*^A?X z{7m>SCB1oQhxXR9!vNszX{2+xBPc1LU0v4Z{A^h^3c!K9@^y1xb~i19N3z%Bpgl=z zlH9fPuaxET#_;5=XCC{&qd(zr45&zEz~rfOU%7DknPAgle{F9k9Ia0L$PfJeq1*xt zo9T9>olkx0_ntWWlcDMW4*tH?IY@*mDEV8R0>u2Q#r9Y{ux% zcc5P*S(;x-Z7i!N@Q&|-3?Pj0*3K6``PJX~l}d~?sK!BWc{FdaLxdg9o|dmnx0vExUU zs{YeYK5=wywLe_BvbA0GmnO5=UteqEY&liYd|4%}iLBQvx3{-<7bX-4EwmcnNkStl-!_Sxh4ijF3Ui_DHb47 zO^svUi7+q&OfWTN@MJvR+nG$KwN9oLNJOftYC?!HhR~Frov-4|1Z2@jNmW&hpilz? z!k+vnG|6!3^0m#~@sOuiH<7enUtXDQ#~5b)p1=E!(w|4L9XnU)y zJQ+4GojbL0^xcoX(`n;fTs^XJ{HD{ZCpHvz_2QMK9Mst9(@p%N9nW)o=f}I6P2;X z1m?0gU=u`LquvX@`5kufN6}kCRiH@NnmqAGUl_J(DHTN#+ThEgQRB7Y z(Z?Pby?k!xrB@ngN-0rd02@n3?m2@8?nT9IGwW47D8KN{#|uT#>xDLwYTLFeD=T$9 zT|CvCWyR+&fH@`E{)qtarU6oic4*%TI}8BcPL?a<5s{gNkd)ZDpfho#DT_1~)X6{{ zOtlkmKq`zBfJS8l5e1ll89v75?pq#4Os)vbcJ%16jg8ZVJKEz@hDu?OcqKgfsXzYZ zt?3Iz73$fza_b*_&tF?FPYU{bqv_JHr)J;v@JHYO?*Bvzo;IVRD3V!>Xu{Sky!gpa z{Y#X4#?6f#Hc4Uzi-BW|B0|IoNmv0jqo@Fr2IINM{CX<^4*GZ*SugJgB*r3748CT)K2= zWo2b;ZLQxQD(1=P%Ab=Q% zz(iC>ebEBc>2mKm+R2( zj`r&5Y^gtZ|NGv1+ub)k)IKyC?FzNc?p9frC9Acy^ajgItE*0ySJy(sg)2Lg=fCxi zyB@r)SM8;A_QKhw?0@L7?^#{B|E`;lZFo5<=mFj%sghX?(XlYgb$2{vDkZ1^Mhayn zr~;j6bQX06K?np(gs95N$WTdDS27*CTYu(9@!;L}J^RcvU;O$vKL5pLtG}gb?WVgv z@;86<=nuRfJx(bIdyJc}|JLtUQ7M`g5OBSQZ8JHB4;}T|b4goeozEQ4AC>+KB zhxS&r!vNszWJWMkPmwO3;)XoIw+) zbo~<>x1HR$Nq}GtlMsA_5WJ!e7zbSZm0$lSlX%WojTA*Q)5`VN*G?LWsA)JHI%*SD zH=THgmm*nW5=9D@9C^b?aqFktZ`U>j>NnYhX9Q-%wym5?DFNo42UxRaY67AOIWLt( z5-%DP&As6_Grn)j-A5VD(DV`h}+g+hB!r$fLV3y`0O*ET;>t1 z$rEVKH!2pAz?fezut7WNG;Yz(Ja{@!RZ zp4REwWtQ~FL-(z(_rLIkFMRWrms1@!>+$mP@Zk@B=!bsjhfW+n_W0MoHW}@nIC`u< zm@cgyYfVtbtJ}NNM)#&+JZ-OC-I`1$Wx3?pg?7e$H=a$aa!EuqrqHzB%jL_jD6>>P zsj6Ad)e9i(4Q^NZPtr;XvXpkv)4RlDd=)}T0~rDUGGX>`)+!58GPvBlYi)`vWdSA_ zv^6e?JZCws6oZJvTuc|}M1Pq1wOIc{`}b*lU^#zlu1&VPyZZ~j@C(D?@Uh1pJ9FmD z$>S#mgMlHbYF27Xrb6tbKnzG$^?ON!afQShBM!)tecNT1Paq>(Xg+i(c<)F&E7;7~ zv1#1h*=nXUO(BKGOjC+MRdX`~gcoATOisv*%?zM^H5l)Wi-Bxy?cDr`aUisoC4z+1}nx?eyB_m9x)2f9d?Ca~DUxKm_(i7%YPn-~BxwJaTNqC>m0~ z^8J40ebGC*KCR>0`bMkNHu3zWozu79vo(8idD@=)(=Xq5|D)e^&t3QIPG`=4^pQKg zU;vPzP%s$?#$5@L=+&w1j<+C>QH({*4B`+%{zu&Nd%>V7QP#Bar4K32!~X8RIxsLF+M&JG?Jxj% zn;8*Bq^4=izyc*x%e({;#9&1yaLO=-5zNig%$-h>nX!REDQVl*5iKDSlEKJ4(Le!9 z2@ZrLXbsm!?fGY4`qMx8)8E;v&zj$3i7{HQTAz*D(5k=(i^N{R3UN{?h)L8U6FbT< zQC3i>mHHsO=?t7{tfK|)^+5>9nvOctIL20t0q@Ltb#bb0=#5flWv84X|8`4-%=#;M z_z`%Lb_DFc@EiZ*$@Lzt#htzAfWja_l~kEMOP}KS)4w_V-oMHHo6y_9(k-jEK793s zr!i{*&&Ex1=7%XlNMJLR9#)uwJYY?1r*5!Tt0{LC8Y9dpXw)eHB!&XcAPO<$8bKm5 zDpc7eD&P?#G(nYomx_C>8D#-i6yj|@EtP}_luQKdrts`D&n!_`T3ssrk=^kQd)A;; zRW)rpolc2$V`aG>k0zt>v17-+_SLV{bv;;GV&-?JhV8XU1X=Xg%QuYg(P3Wn~SELQO`)iG&b33QmF($xX(8c~f9C z8f|WFP9~F8=e!XSt*@@VaQ?;VbQ)t!DRBm3T5bTaEMvS7HA^Xhz_A$=uANTKKK;z+ zS9=dXaL3MOy6fHtuUxtE@{2E=IB}vM+qOw5*@xc$p`ZSVpZ?OHeEI9&_$Jt0-P{sa zJoa7h`M?K0uyysyZ~fM9^~&P(>C^43uBzVB(uymJYn!_pCvIxZ?@i)O?>K3oM+PUK zd-Cbeo&Te?rKOFfUZYWq>bO7^et~?N$GQjQpWny~P}5dZ&lF%$B)|v}Mnqyppe~_9 z1j2AQyt21@*Bv*FzW&70J8s8DZ`O``OBD(r)F6gukbxMRlTyE6T}e z*6SB-XiD!*Rlq~`U;Q_~^T<8_89A6nU-dDnvE6+77k;I3-i%YQb~;{PS=}7(wFOm8 z#At?+;SHE#;IQHlL!uNIl@Ue(TeBB_@qfPf2VY!HP%%M{Zz35?NLWk}V^pTdP*`J$ zyvrpKJ0KD;mv=mj1P<*jZHEEC+sssB;zT5-lq`u*8;yh)JBO8|4%=?XK22?%DH z8r_N#N!u%?v4iKX2OJFmQW#G$CjK_rSL zO-T)!!h~kRm%fGFM_f+YPq$V$*4kj}9IiZt!B**qCV-y8HDu~k($D2r*?JF<3Eyu*0xoO9mq?(Tl+PrgV*MNx>O zot>StPd#mBbv@hJ8EsvgoH%)t^E{f4HrCe1b!egJ%029;1#3CZ%Up{x?fB5B3O%nh0pZ?+RdjETSTu^Q;VG!}wwX2`_ z#3#P_&2RqP&;8tYfA@EL@3REep?zm9LP#lfjy_XNX*Qe17*$nOqb4$PELmEZ*_wJ*4*CX6X5q-OGmpIQBO5DA zOorZ(St^UFNR!E#+XknO9l7PUQ11;E z-FGf8tzMp9e(vl`m#$o1TidwhwmY|Wr^R5y57)OR)awltwsG`yf3S4!+_@`TJEJz8 zx$Sms;%o2lH(&A!$w=7RNHLXCOx1{pm=%y5b!U(a$bdSAg5}av&!*q?4-CuI_q?-r z`zg#Kj6n`eIOA zwrZ(|y$Kq_(--Xg)n;eZ^o%(}-sive>%Z4Lb?#Uqc23n;RTO#FgqlIcyU@1codRtLRuH>9KxHYCeapkM z9L4~L_7=9oiS6xWno=mZD0~lamKs$E7p4ZH%mF|Drp#3v11NzMMoPRW+ty*i7RR%# zkN?{LBZZQQVmtBPCv!=enMEw5vD%D$(==0ZRING^j!{|qZQJ(xy;*bhb6@$D&wueZ z+g6EEN)um@=PHE6EJSdH%w{uUM{FUE;TxuOL&PA=zNo5poFEx=npA|Cq7ul#ks`*} zIH3@ecZF(v^J_1)rB|Li|9|_3byJpQrC}mEK3Y0XF+__N1<|p15kWFeL+oDu!ml-7 z`rSy&?W{e%Tv9W-o%sAO{#Smm(z3M9ji#-4eKGYmo6II|xI*kWYDy_G4GNUomwJUF zDF9KRQvz0HC;)RXGFT!tQY9!sDKa&NrYHt=3Ltu7<@`W=b!}(sl`A`YqgfNxdvVT@A%(V4xw5$# zQrbAWzH{Zuc(QY*JY9G;ZP_X_BkRRYddG{T+-+J5Kciwesd8vXHMbYc^M7V8Rk{cL#zO9)VsfmblPV07QX=$`K zsj8|d3L;j`lH#GRYaAdmUG$SMoUl;gq9G>Q*=v654?e#&4exs3oyU(KU0z<^xaFPN zHf}K4ymanc&z}4G<4FUJB={xUOSy@?KS{`lh zymJ2H`0Cc?x$~3Dn?1vZlzk`B;<%X>&JR|Xnx^5>Iq#19-q}z8$>{kDQ&_9!6qvOu zzR>NRTaF%^?v8vRZQHnBapl^TV<(OWO;*SHr8ON?JAQimK<@^b}v$FgZipWAaa}l ztzuFtii%RmsCNa}NXg#B5_M=RSrYC!sam8Gk-%iWAj&;xQb>pmGt88_CWtp{UK3CE zmR&6YPOAnQIB@DZD2PGi%n&m6)1h)ovF;T~;v`bCF=9*wxdEeWXCZ{fu%=*QFRqjr zOm(&;?3{Aj#u=m>^rYuwJ6l{J0GvC3vl#(M47RSIoLMGfs-1{B*R~8-!kE~lH)gMY zbvx=jHgpU%5Se4?l|9lLK-11*j48Ck(vw+i+qP+%>4d#Ysw^&~IGfFaCRLqI>y*-T zJU({p*y&S8j~+cbolaAXFFgO!&hBV+V|{yfXL)(}-uHiaXK&&LNB5@or{8$y<#SiJ zcgJl~0~1M6h)@bmV}xhVzIgJ~^Y`6#dp+9Tymq-)Jxpwas#la{*+`|cSOcqTQM6M{xm6eqb-}R0cFJJt` zFMWJ+W$!0{{3nhcKc3M>>+9=3`?EiL-+lLe{No@0^#~yp^=9_PRqsHGu`wwH8 zMLvUh0I2GbBS(%LIfD1TZ#tPgbN1=8XV0EHcj=jDp83?LKJ_QP{_66|``-D$hwr<` z%<8(9#B-6|tn?Eve zO3C|TG#)K44U)zu&%RtIiRl0BN8Z1(vXa`SU|wJCjjz3O?!~A7>?{9nXXnC^VL92| z3TkRp^!nR7JEO^XV`F1^d3iD!U%R^HoZH>oGlO^^Qk-q=$Y8?#{{u6m{M|&t{Z0R6s{xZ{`A)+x8gsdxZlqX`4xG2g3oYrZ!kip=nE! zeo-DP2K{kJTRY3X>Os6XG$Bf5ZDavErl=a?(r~zQ<(fC^Cn_}V&PJn4dtdwda}81w z^4{xc7AKPxU!7Q94_l))1bE~Q4kl6{X%eEUszz-BV2J1L|pNfMka5-SJ!?Su}S z0S@i0ZifND+sl}Vf>KqiYU`YXFSrS{bKYJpZ=+q}A24E_!%GZI#Ab+B{VTugouZE1IL)0bEJr=EecP>&9o7TZ5!1ZamjfJDYBQWyX2fR z2URpWYeVSw`zb|`sbfn_D|tmw2pAeI#Iow4R?NcE(%MYe3HzXRt^P)s zzPo9Pv}K)zJzouChy(ANwkgCVMKA>^3z&$h(g@+Uo(8mV0$&y>B7)60wv8H$u(H&P zvjiXnWrrA$QWQbYJ2u_h*%R-b^9&fp4#h(`Fw65uQbJ-)0IL%tPRvkPVDI*ti2f=D z8;Hz)UUa^Gp0NW3mX6m3^VFvT1~!DGRnZeJLp`m?w~Y?^gMM$N@3|_=vE z!Em@c9s%et4Q8|1Xfz_$yYIZCX=Zg@Z|`0suVxmTc2e)Kcl}|xxjmbaRZg?6WuD zeDinu!T*olh)6_22;O_l;XpYm>kkGGJn+Cn4?Q%QG@ts^r#}7JPwj5+T)uqySDt*L zdH;KV;O@HygMpc;Y1H&r)zqQDa5!9DU0qsQ@=Yq2mhzf2`ad^`0`T4sheKwj+%3yY z%oaP2m<$T4`u(~I8yg!FDW?s#M$L=oH;*>l)>AJ6=X|kz`u6+D`SWKV_i3*vIVCH5 zy=mPTDG6e1kDWL+tNV&nx1l$v%m}a;V*@2$Oqy27$i?wwvmRfq*TmsP6wGaLCPgN)&=$_clm>%AFi_H!vTU2!Z0`-qLY!;2c2}x?kP?O$&z~Fi`mXXK zWHBNci6|_o5=-GdLgSRIMOpD)2WwZQD10ux6GSB2)IK>EwL58^kfHGjY{g*(-&KQ6%%9)dks5Mkl}JGh$1c>VhQ1b};P67_VHp zGMvqft@OUXv}7qXh4Vs1;nXClh)_ylFj%UIszI;n_eS-Ui*j$$wl814x;1<9xl7N! zaDI2%jwVyEuy-QTwzV0|T!;v>;EVp{YuBDV`~17^z5_=#I_Jrlh?w>VD4Gjdm>I|^ z3@N~|db-^Dx;mo`25Bc1b~7#xb<4qENh5rLq)<}>*gG`}QB#|mN%Pnv?>T<-#Q*2N z`)8m1?5D48Ui-P9`?-f7e$Y9W`G36k-uq1a_nm(9|6{l8?q{g_LMK>NL(?`*bK%nY z=bn4+rI#+8KYxBUn|be#A3y%k2j2fZ?|cU?UTE9a$|7ITzp5r+0J*8RZQC#&_sDj3 zcBa#5+qQX>%eyKfWm)DPfMm+dBBEwymSY$&#TWrhr_&hI=GM;V{_u~Ve)fe&9)0(R zKKTB%mBDx#cduSNy0O$BZZwHv9ZK&)+gcm;_V%{6wm`J8v2pa+#%NU3bbr#RR{M$fya_&?CfKuiyZf318h(JJSTZV+709cGcAQmPvHZYl_R#R-*aZvy; z)eu76Fb6B2)_^5Q$P&1~n1|3lzo%1I3&rB#qG4$u^VRcI&D4z90PoiUOuU ze4|G=ljn5P&^&)1;Ofu29kS^&@6B7%maZvEwJ!j~pFM+i9!UUcB`9bI)(@v`@cq{^I4$ zs=uu4iHwLsXpD)#t(vhTSlg&`diJ@ORtLS)$B#8l!@h`d#O%;vYP(b#C6IbT5ptcw z6s90e1?_10v~3{WGqSZG628YJANHVuJOw~uNN|kUG%BXd5uBpfEZubG)_?SW{68G~ zsZ*yG$>u}*PT9fp-!x4I_FTAd z;hCqNe*E#rpMCC`(P$JS*4Nh`eE41W-E;2)_rK$&lP6G5U;LHl+qR{ubk4<;Zj{b7 z=f5*_2WCW^DQy6xd4q2y5}KKFPDBRPz`M@lClLcOGiFK&b08By9j7Eg+hAr4YMWUh zg_2J8wx8bKOl?D2KlHA5EmdwZnN*%F#yjr0|JqBBBTUL_NJMQDZIy_vZJOzLM#lZB zSC-{qFxb3$jhQE--C|hnTst=~WoFWv(~R56Y;Sw8aeLWcDqOj-auf=*v8Zm$88GYA zNJ6xh5*4Vb^2DR>xcSis;@6%lcbnAIF{y|LBZL5h^8z3?Q9YTHL>xtCZQJvOS29gy z!NxqAO&GM)tJ*daiK@b^kWvXvjA}{P)ooK&WmWas7^})_h_!}dP$a;Tim`JP$U=&v z*~~Fh2%1vgSFsH~lA47SObAR(id6Z*?iiUS`~;P zk}*I8hOv=?5EFb6ZrEpBFJM98E(Y7_~X|E`lCKFIaW05Ll=vrcVY03vcEn%sT&eCXcW z-pyFHR+!neorVUbCt;HzoxbbH`#yT@+O_9id}h@prPn9=c%wcx;W8@0mkl*7TX5pU zB_tve0;mO`U{>$hu|ZuV?`lupml_j83BfESC52OR3K&HQq@(?2RTU``Lg_VGBT}kF zj~1jYl}emg$xtLFs96LckO(9Z0Fo>a)m8r*6?Z)Jy=&j|F>p1RP6xvhmO2HnH*F+Y ziPRK{*g0QDaaS*2g9}T8YHfLGI9!60Ch5-h?%v+sq@MM9y=fg|jCEbBYK*b2+p2U? z*^KHYlrxQ19Xok@Oy)|vdg&tC& zzMNjN2o?x4dqpxLQfq^?Ei{oRL;}{deXayyrc4 z-+ll6_uqf|%&9Cw3r(2K7O0`Rt_L?*gv`dThkr4k*XymUta$GcNW2#jGxOdPk;Rl! zV(-O!2rono@^3REkP!$3B29sa9gAtyl)Nv8!{JLWKEJoSb?(LIoA3K;u(0vy!za$% zy#2~cTvRLuAhvZf%TWh2w{1&A!{M+fT;crs`ntw87zeF)uDl$=Y<+#*k;Z1qpt7I?Z*cQt7iRwiYtq17#?-u-hw{_$u2pR4539#qIVr3mRc6W4^A znUi4REHWhrb}0f=*1{+N<_V?MP6#?9KuCmCiA{_x5u3p)gt&H66o^1zh^RRW1$%+B zTy|w~l!zjjj710lF+tA0N{DEjk1d?A5+cahQX)VF0;rOJl$8leN&qyI=n>mo_kdz- zU06DH^p$pe$NS%P-{1N%lN8{jo3jqwHixeNp}pnpFaUU)83BX-x?%b5)8Bji$L@Uk z`L90r{8K?^a~DNm3|gQO)r`puq;rXT?qqGc8Aw4y#tXSHGA1%m$|AdJ#Bd<7q!}kZ1~`|p1DnWOhq zatg5rh6q4zSaL80Q4OyADn0T;_ulkS{q*C{fBj3|CW7$V^}huvjLd)&oo&EvQ>LecOExy&ETP$I1zFE54*?Q%A4TH}39` z*STrtUsH`ygEl7Cm1M0BS>O+qk*8eQkI2JHPk)FTQx`%GTbr(MEaFm@&k28_l~+bp!y+U{NDY zhPH|Q!BA6c(C40ic{G|l`0!(GNFkYKoisWCthK~Qxg>+RIuj+A_0$Y*Oztcl`z@4v zarH;2d7$4)GbRmL*}_b`_e`xX#P%SVqMJ#*&FL+^Ujpgya&Uork246IY7m(=Vmw@IS%cuYKH;9+sr};B4SpUtgIGyKX&g; z58wMyLgLO%$|FzGIh2!MrziH{5WkOz&CK}RWq}f)35ITHTM$ap9F?Jl2C$U**&);^ zpr<*eJx3f4S)8nc^Sq%kIA^A1K6nO%7-%R*K?6jW4D68UgYbgsg0eEe7d3ANUX`1urFOEhd z=Nub{q|9zQYn&^Rkr{UP#=E0}#|M`_cpJIJ%)!lmf$X$2b zzT{U6ZyWuM(a!EwRrO=^mR|#AqUW*z2)sN0C;sGO8!{Z6=MAob=FIPM z!0kRTh~i+acRmIhKnw@K5HWX74P;P8Cb`M5Mn_o!5)0CO=~A>=r0W0?DX_p#=&Kp# z4jvdZwUY*rOgGVC8(~K?c(KWFtTV1pv?r=0LGKTRHH^u~jbJ zC_xGUC}!Y@WJm-af{J8NLs{gl_5gH0{PstfjhUbZLdjBWZpY93(bqR$dJ1VQB?~gI zIVrW^5F)oRneM1+;eAoKl!~TlNR2W>wlNcoEXD}#ORw0TCP=R+izaE^HelcD_43@@ z5&x$cHIYIUP!i_s9#vHp>j{hu+_X`_yL)4zR*)2HYmYwq zC=LKNGJ5+^68Jl7xi%;wD=RDi@E`ue<>lqM;xAYv!)l1c3Xun<$f-(Oo>tEx)JBVU&Ne&2haQEj=5>7C2M1(_EprDVC8!Ma4X0_=Q z2`hpc5&)X_djZ7Ic?^Kews0T_=|&lyqhA*XN%QZc+eE)Gm^yOhAZc>U8SR><)%_mo z8-`OI+M)f2w!;A6ZDphuTXIEKC~+hqN*iNU6+i(Xqx=C;C{O|bQtqq;h&sVS0J&9` zvy-2hwdXnStW%?NI*6Qvi9qUHM+kMmp2gPyb2!j++l`qtA4+Y1|KDg#d~M;`%-WC& z_C#Ru*1=;0;Mg|KmmrT2loNR$03z~E-b{w?dMAL4EKPL2ZFL1DZs*ReKuN)H;h$%TEW2QHaPB)l=>S-)0=LDMQ^0nQ~otgAkV@tEt0-9#QEJ7e& z#8pPpA~vD%NhBh+YQ`d>v(z+G78wqUrU~M`MQZ|!cp_?5lPN%|vGkR5u4!gjF9|4k z#+oTnqOv0q$xJ)q3Koo~v%T>|ji%FSubze2lyF$wmpVrS9ZVTgj-*Io$<$yF*`ejf zV=u<$2%6NDK;gWX7QEv4c55H7g2`yii{$`GIgQc`DPghZqO8Ih?)VomK;3?C(OfU>2`x(S1kBp5U@ z0s~|@SI-FsBqmB0JvgE@kU^4)u{UA`7%E0$5kRtJq%ac|QqEF1$_ZvhAuLi_Mq)^$ zfkT7>o=H4;vV`0<3nn5V>s87Wk|w|k_F~=SVhg9@wXqLn(#)<%0i>$u%n+kVK}A&r zQe%!xi9ItDJgX|lRue_EF@O>kAVJiSIEo0&+NLQgZ)P#Iy+Lm_YbKLPZ?H6(O?$nv zNx`#JRoS*7%%&=mDfyfeA|heOUSrY(fW%Q<&z6QmQV>~DR814sHr9jjaAnzhZ!oAS zGXaG-mmH^z`pFcxAX6Bkz{~-F5R^=9g5u@k%qM2FRjmC);ciW5(_~C3bnGQ2A|3`+ zka!|v?m)@8Z8ZCu&bh-F;4Nag6q7r8UwGk#Pk;K;PdxDi)b79k{-63AKk2>y_{V?g zbD#TM8=GEPJ@l>z|I?rN@wK%T03ie_i%x#)M#cxG*Y5yEmkU-SR8_@VRYHToV3F@P zGmB}~Ms3?nB1A;YYygRnA;W=~sF_VlU%0}nCDO!9#2jH|S*Rv5U0WJzOq5z8b3(J2 zq9&%~9TS^#lGwwzcCIl4Sc#RmHRGf~fuy~D8B&a?7U#rxmV#1Q^!h}^u#Dn#VhPGb zH^e9aqfj5|}+X0vU3Ll6RiEuCF=qKOplt?yrn-_RtRP-;W(mY;P}PfV88BK};Q8k8@6h zaw8-lIah5$^YlZ9RG|f^Jy%zau}Ii=8UtcxOq_2FGlmg5p~Di0^L^m?54zdH_ScL9 zn4d0Bo4c^OG4>56VBv0OSvaRn3>Mnp#i?opGqbQKN+}<*h+|2ODxoZU5h+>_aW~}t z8;HOPav(#@$#uYS)~$ze$I0naZkW!8BupU6&CehaQE&tZEKnhc2pJ+N0YbUx&tMoi zA0t*unqCfy)c%od>Ccqd>BvBJ(G!{jn0*crqSKdH^iMtG+5mRiUC0CS8 zf~Jkh5KSFmAm_x1Pcaaj7i-&@!4x3zNU3fcAujs8X4(`*(W=F!ZeuL_y%3vzzls*c zcYPz7oFqkar3-DyB(EWa()Yv_=7<>~HHG)HXcoO6dwz~6DpQCYqsPd)Y2&;R_-zx2{etE;OirRRS8`Bz?fWiS~0+1I~ORn;xW zZ@GH)@~1!hsb**M|Md6&{*m>K^U(@&1Om0TvNWD3K8xC>b)Tr5dD=R#gq2n4sz$LuN5WQ;;ZijYr8+3Ybo(bzL{j zET!liLnE_)-Mf6hf(tClaD;gel_b*SxGRz5$EVSRFC8VKUq=HMqV!)*Q{ff&ky zBw4VqOA!%F=g1lcVUh6YoO>8dp&d~GBjrhrO$!i#h;vOG%tTOuC<2j}+`*Mg!9*Y; zQUGFeI4D6#00ni>e^LUGWYm#!h=GYR)>UKVq5ufy0H13BG;cTn@Ve3pe`$N8b-wv+ z{l)g`bswMCtY`lgfpzod^(m@3d&Pf5qv~7oXb%H`x04Z(nz3^rs6vRlEQo1l+nhg& z4%gjmbl|x?@M1p9;=uoNKWENcM+YC~>+hC1+1`A$d|(p?Nj@{%-C_%Gb^<2A7i>r* zb1)M)QEJgZjZp}d3>HBIG+NJ9FjL$>l|RpCL?APQ%%9Ng*(;26F6u~to1aE82dGDd z`P3k$oF^0z8|D;9T}y@nlqn_*u$)q4HwUkFtl%IAr^Kv|_fah%5;cO7g9pJZSC zQ9(x2SxU+pEv4ifXABRBf`()<#t1OO!=$MC&J{7XM5Hl^2-KQpS`?*JGjC@3iH_e`cQf{onunS6+GL!yo?ekNoJzhO0}z z^&7waXJ7c@WITJ|;Rk>0$AA2mGdG>P@bZ8EKmPM?J@t)0{`_YiCr61C*Tr4+t> z$IJm^h~%4%4I02cnTjzKESOA2mp3o(j7R-m&m#8rrp^_vbgp#Hxq>8GWFlX>r~v{C zn&qffjafvXDa1rB+!O26fpA1rs0|i8Cahpiwx2 zC%^<0GE6iJQD)hhIc`ef^8-a)%#fj>1Y~#Lb)U|K%MT=pBn#JY$8OhMmDo*o9YqDt z+lcdO8P|cVx*Jrre1OiCLcgU<(ZJLV1Q%yL~o>90buRB?IwaeQ5L_(5#aLx$dc1 zd2q0!H0H{OfWEw2K5#i4pzjM&|HKU2X`nROr zLy!xt9h(BbN^^iryYF;MoxgwG5^VW3l#G-iHb)In&czZ%NC6Ml%mJChA6673Fc6X4 z@GY$ZT(9Fek6vEqS><`)#MgbB7XKfFryr<_WP-Zu<09Zy(N`f0FVu3>!~|l9fl>l9 zz(xc!i(T|3f*W&Ai=v1LVkiq&6@{5j>o%jfR27;4Q{@<=!bn6d#n@`rh+|UKpqi30 zyJRMXcizVojKCsIJ+1mZGcqG4VL0cU_u^b7oq!(&jMt2rIo z+s1PG|LWDNPd@qN?YH0lQ$O`nr*Ap~p&$9!4}bOZU)b5+{_uys=dQc%WZ1ya z>zDnV?cK>_a+Hs;A*EyqA%qxXRTZPj%*;Bxo@JV}l*_IAt;y8sNhMeoz6~LeI%Z-K zc2e~Q&g#0*m+VkF`g;hIffp6#BS?ry?rUqD1OanPj9Y!EX-u3gT%%aC#la6ZAD z^ZS^O^pwjB2SNfUz@&nGPd6h}^F5JA`%G=E1}Jqs)(oT0Tiv$<{6mbKO2~gfLE7zu zIRHk`4w0m!M8=W?;K%?ar_q=K3Q&eXp%|?7S8k={dkVh_IA#X`nk58spO|s(b66zE zuDcQ6Fdu)Q2l?QS`1()x@7eunx;sUG&NpAR1L#W5Z)iH7plCj0vK?3}(e+#E0*}m_ zF%JOdd!q;976NA=>vw!PKY?#*Nko|*-S*G95@b;&%OWC+4BT7L4g-Lk-wB#=T9N$QZe}23-U?n*rp@o-YeCOU*Q; z6k{YJ7RMq6DY=|Xru|+orPQ=-Q551RgaDQlnW@ZZU^7h?If00(vdAqc%8qgjs|Gb+ zm8JkeI5RoMrkzcuqZngHr2=>_3baTznGR;P8Sz}HGdqQEl%Z#XB@#2!X5=SXot?Yxx@&!X-H9`#qpRyb@B=?^@#4iZ zH=QDaDw4({8^_pH<0kAT+XJQ{QsLV4?Jw|k_Yz?Sn>aoJzzoJh3`0t)j)qJ9@!n`Q zo%ReNwHb_)8He(%Ta~3+$P_?W08X%|5-x@bHpBiH2e3hy3vo&!30ZD5Fi=DXvSEg&oSug=q5@_vOL&12=iKuFkG30)jXT5+sZwGn8Cbgm zG@^M$AQLrdPV2A;fL<=cG7`aa0YFkDXd3&be%aOA?)byNaZqnjQG^-Pa>E7Y8as4- z83F(h4$Ps~tJds)ljr+?@B_WhYhN^cTbbChB%F)04b~m!?W=uX=5yO1e<^usH(T=9C+Y zGf24ZD!z5>FaUU)nHgE<6X(=|<;-_ic(a8B*c)}PeVf&Hw4VTwu1^LWfYuyvYN<=% z;Cgaq%tsBo9)N^>;jQ8kRSc-kKFUnBX#KsLTsj# zwGnnP+CRISpahPbaQESzF8BW7YERn35Q5h$53JI9(* zW+62rGIp+DPz0K$k-DBvr!k~xCZNn1%?HNu&bqxzFzedxL7;%W7p6N;740QQBbLlB z7nGIME#UefBhrq|Uo!$E0?Z`NxO4OoK?!q4X*-yNHl(g{DjBG0q&fXB#vo>s4x8C| z{PT9*4iKB|HD&O;iSCZduq74|Pb({>=wMEW+fkK`C?0U`&GP`b4HW($4QqHh15Uh{`VxS%D z#wcZ?KciQzl(5K!bO*ce9n$<1(cCd0Q=PX68o`JZ#;QtCejQmF7C=q2wz6rYjy5D$ z^(~oofA0qv-^t~iPwur#hGmRHTD&GUkj#A`%2B;_K_Bfi^pVXgB5yVS|1bb}n;8)a zOgfM{Y*D8*sQabwR=#IZtw6H(r08L<NZ z&xo3t!l1_HGIU>^BN8+7aPwWeQ6G*D{QEX1hX6qA4WjvZA^ZAuL*C^23FI?*br*$2 zGEOif^GZSt^O+f=BtuMKol|AMDKkqzQYB*F>$_fGV2xudm#WHZifwFDO2I6tQPi3f z52{{O^qb&w5x~r1j2Z(mns#O|7S1h<%)GZZhI!$F*d?8rnK(1jkXma25R5WaXi7$ zqwh=Z=CbqWUitJNedd#&`UCUjiF@ys+i%4!w;;ACNLUbMK0MmDUs^(F223b>;0yr= z%+#n(q3~7DRXdwogMNRxa67x3RnL`WncK%zHN`+gP6~iC>A!VAyPQ7kTz?{-XNnB~ zQ&-(eAu^6k(2@z%+dkkNm!Tw@`Z2PCPP)k5fMS7GMhNhy%-d1W(Ea8h}e?$ z%l@!GD2k#ey$EG-cgX1R10Vw5OTo4BZ>Wq??z z%f%9ml{$AnOR`w5LI?;(3)qGsYuk78m1Hl_I>j*q5}Co^7%(y1>Nw8d2X40s{64f9~ zFoiN18JXR{Miv`8u>5x4v{&OwUw!PaeuwAb(wkYoF&r%-C1VIFWqfXCX+p}<0XCOn zd($3k9%*9?U>0~LBh#wzyE`MH*0hVE82MSQ%t^;DhPqirPhk(LYy5Q(IaDTp@Z1$nOC2TtMSMZ47oL5amB+haVFu+VMMHo@X&}k_L z@NJBdup-{fNR2ERsSt$t!0uc(T=N3K&<##8OfU6h9AhJtk@$?9q-Vk$tz)lBg%IXV zYx5AE(DBbvb_%%*&&WE@yAz@z%)=zHO#F#CpemoP>~}3z%X4+b#RxIyc%wXq3rInP zl!e=)F)1l>o7I9A)D}mt-6paRHxCX#MsQt&94pc&%`S?B`~@OXBS48FkwD413zm;C zgNqheM8S2rwb#2(U;SR5UuALpuMQBdPdw57m84g%aNccq@aJ=uyaiNO7S}_qXeC?-i^1atL>u@R3O`oiZC?Oar zTjRL2%xu@qbOO5JqM|Qc&UB?VR7LgfhaP?WTi+b*ZS|`nG)-(;OOc41$u!29Go=`l zQLJY%MwA6eH3fkbOm!PW9h@uL*<{x2EcFK~>l^*S(j9jUN8{}mUwnRdcc&DzxYVy7_>ox(ELjY} z1S}xO zf8t|5^3Hd@^N~j$8TOYD5=b2PVQ>rK!Z)#{?tdm^0D9+#8XOtaj3#@dX4V$2oX)nJ z(e9a3H_c|V$z)R3brvmd+h#l&ZSU>o9{Qa0J?09 zK$sG9PM&<;b5CuS_EM&DU_qXKqjDrS*#-!(67 zFJk@qUfkHtucSuI=ow0+0Z3FSagL-DxiU1VEQDf|ICI*Rvt5)0RNpv1|L@;kyXpN2 z^-Zt}0P{(qD>^!7juTYTHYk_KuLxC2MFR8nshl@^R_E;7BC@``{Cyw!$UV2;+^Y)2 zHilWKn^`>(Vee%+8#l3u0Wrqubed9dg-z72#^GV!kN^0g@Mw`urOBeU09lHK+UCX$dEUJ}KT3=uP z;0He#V-%rWCQ2z0fr%e_=%EMR@s8eb(0M^wGlgJ5Nw{nF{Pysl?tY43%W59T%8Cgf zg$cRk;mX?DhWCC@u9b+sD9V1%dv8f+vsq|swbV4Zt3I!i%+$@ei~*Gv@cLJS!|y6ec=Nbn?>>_2VjhO<0~^U&vU&Uc-}f{ zpe_z^-JUCf8Dfx#+&i4*&q81iS2&#$CIPBp;wx$~HjD|;z{+HB+)9_M4F$VS5a?wY3ba{WL?VrU;vPlgSo|S(Ho$z3L#!o4(J$}Udx+huq18% zjS>i@ps%P%onz0?9K`VaNs6Q@DN<=%8Z$s)RxOGjr$ z=JpBZ<_M65bvSI1yaW(q^xmt+>$ivn&0_9sGwY;Y@(&gEnoz zsO1}x0{C;z_Ts4XAuPBiI})4uq2~E}vGa@Ryvyh1>DtIFF}qwl{c|8y$rwL8K7Q(sTi^ZN?xFYM2yjYW+FuyLz+%15kHwsPaeB@cQoGI-W`o+ zZQYc;rQ^p>6h(F6!i6@3jPMahzVvM~iyF$R%3S7fWExq7nR~rn3bC2B&U;!gr!4wM z%rXnzes0pP4>_-2S|^l|RYjQ@u-tSg9Z+G8LFkA9-*P#cL+ivlxf}ohfB;EEK~yY1 zUqGkSMnvBGd5a@hx(ny~g|}jne(N&O019T{hMK$=PRx7{797Bw%t8p`(Il!hDQarT zc~h8DN~vjQv)Ode?=SUx8>?&R0vG_%Oo=$FgSAa$frw=9n8~G-04j>2*Q;`<)3h^R zNLiM%+3e);V{D-;%U-WX1ZJ=|1~s8&a?TZXXv?xBA|?ljuqQSn9V`um7%>&jXL?@W zTjQc%4GQC!EPxV|5}4q+3^MH>^}-?&L5LuQ*Jyxa2+Tl|8Sh1el+Y%7>V+4-^7YZB zt+mouB$kqjB~!3B%B-LBn8!Fr0h*yX-f2t@Y^|2;K-#821t%mW5Lt}o7)+uHs1XT3 zro==nk}QJEF@+F>nb?^@6H-cL<;`>sW#pvB%+N;FTqPkTRS1_9$rGCfFV?0A1{}9Z z45g!@9Zzf3r8{rF`91gJuH&XNbudao6k`luzs&LM!MnIW4roaplYMLhFJVP`QAz0JQhD((x z#TLuMlMmnjkvndE_sP}!g-a-tu@}|_(~%%atWkgI`9J=pU;Cv${K9AQ!@IY)S5}q% zg)qBs9aB{yp~xbBWo6|Df8YoI?$7+45tIE|@i&2?Hgksc=bYcP8%W(S3miO zPj5eX^*#5}ne~TTV<929fHok&;=mEYPV>dzfA*6fuP&awSsFnDx`6=T&l!Mnz_X~! z=Nx4IGn0TV&g#MFXhECPRohJ$nY_H(yv{d{g>o>UtmaGX z+UayU81#$6fhbQxDJc`PcdWTX z$C9&~F-0#6K+e49YM;}Qa3DmsjD5E*F>Pw(3$zhheEDDg>-CBG(d<_44Yf$qsfNI% zKqP3G&qv0#Uw>1iXekn$OBT%%2CkplU`$}vn38EC#3nh(BQ2Skl95_M$m6iU zoQP^nni7baopbfp)H8X6)0<)Ov$meJ?UxX zE}y^lColfayMFM){fFIh_Wi-%b*(#9BJR#Zh>x158rc#mLE-OFo2)B zT~2Ls)nF9HpZvp@@4NW?M?Uy7CztOnXbp*}tGZFr1SUoL_0Rw6&;P6c_8ZTC%@0IG z>Za+fm*ceec2Br?FMH$JaIln8J(}$O;;;P=pZTMI`>+1Hj}N5}E^>WDRhdM1|FL@O z*kJ(hwlN|yBoPJ1FKqqEr#}A+aAOqX)@rsylv(t(IW#o1C(aQa7H3hquImPKKsIN|I*Uc=Z4$}B3ZnllHwaZ zj48q9I`fvfhd7xbbB)+RzY!qDqI(rU(3Jo5-rKYxvc+k%TsCBT<3S*Glpus;1hXegm-P&8JAOGWLXS2Kh;s1SQc&3gi-8gHFseqvhive1jO+6CQRKVlCDXFDUU%hf= zeP!7fa&m30tpgltu^i4dZC#c9lP8b9`0`6;-0+#_U)s913#b<-!e&XNj4@88b-&-I7+BbegQ`&=A|Z}V%Pjf!+gI%3-0dQ7 zg1u$2>~ttI^|T<&@j%INwh5qN!xQvk0D0N?ED55C&(Xi`H_ z6e3cVWm``RjYZW{)zG%F4bMLF)HlC2E{bC7+UA7|7g9={7J3c(d}&Kms-9n#vIvCQEJd#Rp8vd4zz3iw=onE1 z1ZV;~5+OLa>TCb(Uv7+If0imGL8{|aEuml&Qw_OORlt-n zG}Ou@z63PENb(oqjTpWZRs~eyGE-VIheD*D1?RjaHE>MEo*kfwMw*dMAW=&MbFfI3 zAVds}A_h>5F_}whg}9_j#%#vPycsyDg=sV9AnRqn;@-8-eXTfu@x+gQ4^YD?Ytp8L zC8VIdvlGAd2VeZ4u^?*%A3 zug*1X1F~dIjFH$fwF7`WiL#LpHz9gqu&G%allRiJfjFy5#2Cl@6}z(YjeqldoB!aa z|1SlViAw_#f&;Qj-TA!>|Ky+llV>kKEq$kyyf3Y7T1_Fgr7OPEBgkLENT;*9H!R!f zwBH|&r&B{bf9?E#{(t>P|Lni~@4YX@K+H)El&7G#miLdt0N`zBYN|B5y!qrLyxcED zsc}L|NNTW5#|5?wt((j9&Y=?4K^qCMq-qQ^D3ritNnr#Oy*`lnA~RXFX{R-S1QTWm ztEm#0g&83wmJXqtS>c&kM1)*2ZR=T%G@NrFRaJU}=~puniAl{&6A_Ux5ki{8`s&u` zg@`>utH~2QgOX5eg9|fUyHM?2J|Rt}SxB|a|Lj)a9GD#Dho-7Tq8jZ0zG#7Q z0zfRP8bUB85ieq@Xqu)A`{$BX0GPo{Z&Z26Z`+(jg9&0PWWq9??o?4nS6;?sn}#PV z*Kd;+a$}GN=Q{La4pxLL#p%xGg%@`(*VEmls(<|G#%#28VZ1pVk8V1BnxYo2G|Kgm zxV5<%V{As-L9ME)IBU+Izc`)N%gf7as~hV}#kJ|=){|?q8aq4ntd(f)UH9MhttX#3 zcWK(TanS2Gp`OiVRn^ZLWKGjT6$0^&DOFW991i?q+AEmF1;?T0-N+sp=yS zJ^cOO|Gl61SHJYcx4t&o-7CwI$?Y>7(5vu+-D72@L}YVi>lm64f@51-Uc2M=n{K=H z%&=dU1#@b2GH!NvrrXmdhQjx!vsSoQ^om~J*P2o}J8{R+n~xoZI74{pxhE%aoZ4}k zjq5gfDXWd+t{9X~S-e_w45)&crF=Ern~o}SF6s2*7A6rTKrPCGNQn#%t&Ly2@byW&z`fRy8EMkk zb$Ky?iH)148BeEbkv-R;B{k=K2%+!-%3Ppa&n85)v9U24jq18yUq8|t_|e`JM80$& zn~s~Z5N0N}1fyikO3ayHHib553e3y|QWkMV5!FoC*e2~*EmcL)wry|F0}$KLwk@+% zW#8D^w)LfNr!y8N680i6ab<{2>0DO8WgqL=Zm2az+iK1g<#FaB=kky#LXrOP-+gXp zylsVv=O%^{EaI7|?3EhrFQ!=Z7BOE*j8S|so=%n3Ip54?&p!X`3opO0cH1gvO00Qa zmR`+s{++kO0O0LqEL2WX{nE?Nh;K+7ESO2%G`=i=+{=GJleQx+GuVQ3%uE5&JR+p1 z;>gt0qAEmWIvo?qJpFIko6l&}#ZC}OexHbtB7u>EiOgXS$K)o{QB_s_USCyXj43LS z5c9lI;nhZLSzS+4S}>Opap4i$W@qP>YgaA|j@;t81b~EO=$9*qqjP7UZ$^7mwkZ*b zDCrI5Z#(MV18?MtwyGLuaDSJ-Co)wK@too<*SH6o6dH2 zc9cbm-grEk?Cl&qa%AcgCGAJKe09%~JHD~(y_~;rsTvH*SWYIB<>B&RFqq9|rL+o* zrj+AMz_U2c*nkW+n>Uj)I(e@*M*P3-a$hwASypWSoD1fCgoHHjD13_z(TDcu+5s$B zt_J9Vlz*Oi<+_>x@3;7VyCr~ql_&#I*OzL5nS~S!$0;d~(>N6(eigOzLCA1TsxxaG6q-2#_uVLJbfiBBqEj^~yeg%`2PB%gcko zQrouU?d{%RSQIoG@0Mk6X=%yKQj94^2T$B_38fUh_fFV(Qi5t!q_z!Zxss9rt;Plj zg(nd!OSH`-M)h1S4_7r|I;{azy&{E)FJNe!CYCH&)eg{cNL8<3M%yGX6H^=G#f#@p z-1aCF1L{o305cW+;+MW~b>|wda?vltI5o3ISj;SjDCFMO)XPq}saq+;`yyByHTA3N zl`EH@d+xbMZ+|31ftk&qNJ8?L-risN{(q-;;LvWwjFMqVR_c1{9h{@4O-*R3UZqC! zt~Vo6bi9hJHs|l6PK!SC5QCUFC$S`}tmHg*RaF3xn+G%#R*-5+Npl{2k<3mBMCQdM zQ%lJRjs+x4lu}w=T8b$(vsRIW95a)#nKG#nk+QKKT(XH-mdhZ4Gg6CCO(I6*fhYpU zJ|#mUac}@ai@I%Q^`Ixvd?5ChiLej;He)CkpP<9(TCR;OY|-!g|6}jJqb%DDXzb1eWJHTKi=pwu!s_mRWLw^Jnq~l&QUBA z3J3yWm5SV(etv~O3}@jBN6I41WSwnV){V6y6gkvQPtEx%-y95@X=>9HhFzK_jV#Tw zR_GK}2;$4aUtL<%D8}*Z>};#kw$4n?OlGNRce|m>mN)vtK+?IixW034a&mIgdtX*E zIWg7Dnsq(tjBPiYKE^yoArWW@USbTDuL?<9QDs~+))!&y?z=5y_XA&nnublZt!oI3 z^TKUkn{f@Wg>ZNq|MQlOTDKgp6FM1R_ibsGHy1J%qr65pAKxd&AW1Ee7NeobN135k zyRq3@?{r%$D@!}(X47ovJ$K&ey}xkjYISvqRO6V%f-$_ZMhx;8bv^!?L9>~4TIs=k zI}ab&mr$YA;L5pI)|?h=7bZK+EF~4+ZM1zEQ%l8EEONiPv^+UEJv}v<7k+hR@y6pb zjaGK`>eZdQrmd{6u9YE#EN!M~i(tdBXfztVUe7dVk|Y6>4*{&g&X5s^fowa;ybiIf zTx-JDvNxch6g0vZrxn4a$o=} zMN*Y&G;7$FL@tUEC#qBkk6P_Cs^r7U+N6F$tW84|h7}sF>$EwUO|@H7jjZLp@9SDo z4$9F$D8dwJ<_JMUG{!iWdS5mg*`rv_aSPd_gMQbj)h`s*OYqHrdt4W zfMHa9-Fr1;l?AACQ{C=!)jd~*Ff$udfAbiZG3NdQ865jZGfYI)R(ysQtP^%7NSI{@?kYGF`>?KsG=7W3r0M! zcXoPi_L&!6m6&uIS&E>{{ds{$$cFQm;giD;)2&f$mqH%;D?(X)dXVH zZbe)2-*s+WO3aI**V`yYgQi61Tr2dadqWm%S^vIrq*PEK^E4LEvn zCW+!%&2>D7t+~f|mRt*Zj{i;Li9jUvWLlvN77j%PPM{{ns6<1roWMD23@8c|#B$wL zf)Jo;l$9i>#uaIu_~_5!=10(+nyX4Q7=tSdzxQi&;YAnoL^&vlYVF8oh#G{{7*@Mh z=(1_KqbCmiS2~71lY7Q9FCf-lQUhE9%NCD zz?Kstwm=k6lDI~i4SfL<39t;+00omH1rdiLN+826M*HT&4^Du>43oS2F2x#Q_sHi zjkA}Zxw>{re33SiDukL&9b?S%qS0s~N@9$X1fM(CsC-XRDFxK>uB^-&5jcg~F!Vz* zlsZ@Cm9;i$xrnf>KU$kG{;9u0>pAle^(rJnLdI5A8C3$qGM;2m)B<0AVux zX281t&f@I?;H?w{kRY-!S?_~KWs+JqGtwB&aD8i8K((q5t8Ve%6k~{xinW$vV!{MV zl5!R`#OSv=++26R1VOY?4K5*OjvBW7S+}r6q6P`6Gm;`25-U(AXf~UpvZ(yfSYaoL zAwb4t*}D9A{i~`PVkISo)Fzj;bVE_82&;lMAQ*^-K-R_(j3J1G5Hd?4!i9>pHcERF zF&;$M((3~cuow?#Z~ zefo>qG@fkI1f>1)<}{hflyUdc~Oi; zBV$ZrIL26P_5e&wbeL_L7?yN67|rjTpO~5)l_6u)peySGW=@i% z7!8K~NJN=w#~4HOhP?Nos){_%L#$#9h}XF~d@uUQ54^;0K1azV*s!Q1#u2MZNL)HS(b_#fJwMazG2nt-U+; z&CShiY-|)o;mfMb`x5+UR5sF>Wm#GHa+Cwa%ES=ehCh9m(ffAsw9N@t0U%XnO$N1) zh@e@P4MxMJv5C_nMy-OqW=mh2#%>vKD3ORNluX5$pWK7H--DYUhM7PN2t$OmxrK$L zrAuKWXJto;*ys_;+}AmN+vR`tzxGZ&nUE)mBr#YM zMMI3%C;(?%e>hBSYFUe->?RH(V1hBBD!lQ4t#6;A%1vT~VqNKN$;3fby}*Eztf4+h z?9@$1?mxQo9S-x{VFJgR_dH&@JfXV(M7~j6dFAxer%pe)wE2oJ*C>g`xELcd8DmC+ zLi5)A)PWn1J$(ONADn0$F=$1I!Z}P?YQc_tj6@VGAEIxj-B@xb+4+t;fBv@PKjARP zXnBb$qDDZne{y>E!NW5r_dfm77cVV6r%7;*%23A9z!;Mxi7E*wls-vpnkA!t)o3(m z%hi%prJ&B}J`WzGd+)0F-LG=b9^0cNoWCAKy&6y=Y(4 zlihw`x0KL%>wW$ELCP}5?q2^r*lLe%c}i?UbH`%=fW|;L==d{8jk6#P(K}a5Ke4JR ztB+Mc6bJ;)j#Y1oq4G8d;O+R61u+Q0$0|T=;;O1}&Y3z7q`1|$w{)$+31|&t2LMC$ zjV~anDr0o&mV@t|NDnyMF5)1`$gv@1VmllTH;1e1y(=4o%Tas7a=j{tS;MMI2x<%y z8IZ|Gm8IrvbKk)oH{X2Zz8$msrdu-}62X^OF1&W>`O8;dTv|W1)<56unh-}y?u`dw zgb29?<~1xp={*bsq`od6NTD!R70ecaK};|bIZbdqOW_S;oa@u;zrsdBObh^20wn5* zR^aCD{}4|fFk~Bz=3rR5-s18%f2&*O85=|u78NBT??WTiei3@Ma+YuO0g_WoT zViN>o`xI3oQxhf(1X?S|fx)Op%@S+ZQV-#=d=VH%B7v=gEsDxA!xUGRm&45dx#_t< ze|Y}FW#_6^)4+dQ+@%k)R3y}pWXTff+()3GX0pX&u_=~ zi|a-@TLS&SmKRdpy^gir6o9d2<(s>}JT^O**Odfy+mfC2(HGG-GE^}-%lT-KI#Ub> z)hI4py1cZs#0Hz2>uIYi0;#-+fQ)KX5-_R4Iu|PitFe)#nwy?Iuy^+GzMUovjQYIa zyHX6&1bH)=pJ;7v_9UXLMw^>MiD-3`jX}TJo$;Q|oImHB+qHAD-EI%p2gPVGIXO{P zRX!RFhWWz6Rp*?E(O1J}CtWE9N>auW1`!GZ8KY6yuxbR=I?5stJGKQFKQi9dt4)38 z4b(9^XoM6X2ar|6iLI&-BP_x2c2+m`-eZCW7&1^zBC)eW?_;~wJ$f96ZbZ@*Z7>*~ z(01;&`|!=r<^6Rl4it$BHqn5UxflG?clL_$E8}m~;SgAOCfi^?Qmmc${(V39Cq>`Z?!NXYm~jdUNl`-8XK@RJ#KSC9%l@X#}+idt&xmjMG-X;F~|fW@uBHb@fCx??6m?J zc*D%F>SJMGj4{!RF$MvS=lq_v|@7b9=RMxUlc<-Gv1|(70 z8le~w0hOQ)lOl$IAchnwB1UUdBw;{;8h~Iz2uUaNkcQ15Y{-lyJ%0Q&Cf+Up-da)b zU_xUFwHgy`fk<_(UyCfL+2R1p_SUEbBed1>6l?8pD6`ql_dNWwQ}#Hc<9F&D^awKK#&aAKKME%G$Kl%*))R4OMe+ zcJIE~6C34)uRrnI{!A##tL*HX_2}A`*){HH~Hl6h%=LK1fBK?qm>DA;v1Ng4(ou=*X_YXgC^;Hu}AW%WT3~D{Hr# zYa6|0qc!Q0tBY4gd69crUEf$<*{A?=DRb3mHm9ejE-qX!2F|(6B?X{F2+@#r%+9$q zO;=V{@>u)YTvHvdrDkhCMcRgBY}Wv>+(g=7Dnht_Sn81|1RS7 zDLS@lM7?%1Y(xBhXcZs^zwQUOUPZ*`#c-n^DjzI&8XaR3RSF?kYiDO>mRA--s8&{1 z+U+(cX$TT()C?g;*}@TOj4?@Ftjg5!&fPnX-*oU@58Zput;bJ2|HRtrQju4?_Uz0W zJlI%E(utYrZ1$!_@*x==6um4< zjvhW%4F@Y5n?A`#Sv9aTSJifAc9uK$T_rdofEc0HU!s6w`3|aCR zDu#+y*KRKrVL*(G`5`i6(}cD1sQY}pYK196L7Fg7T#F-tfzNB}3|OFtUO z+Inx1NGH1!?X;8Ht|A$ZwB49Iy6gVwsYd*=KfU;Pq*1Hg8up6JO&&k;jt6f2bGuu& zC=4S3vcy_Y1(3v&*vIHAEsZ*pnyL20>gDpl?7>@ae57r5<{ogx>fp?CFMVlc^~#}r zx7>2{!I|vF;V?E@b2lHp|MdAM&Rl&wmP4{JNz&1hISjOlv zA!rQ(u9KJXo*pGK86tJo=7Tab&ernz;3%3TSy2wzh-=uY6jd=c(V(P2WHzP>B_%dU z%&ZL|h(?z=DMXc$tWoBL0aBO77^}i}vrZMGAt{QY;fUB|F3roLRv&R-qXr_0Nhkse ztE5U^t4P5RJ7x+H4={{jiP2i8@fzm9TpL+HSrua&N+JV9{;_N>y4PKTA8& zx++poA{U!`Cr|wBLw_BZP0$Sp0WnLH2v}+W&PsD8?SAZ$9sgppe}4I!RaiCVjRf|7 zr~`l9k!!u!Y|&~}Yjim2_xNZbo`#f&yjlP*5ObPKckd04V8;nGrlEvbz-8#_ z&U@eU()p9S5^Re&$&e z8(C_qVq{UHeOL&Q1zY4g^F2QP7WaDWBryI%+p0ATC~YBv6avL?IFNSB!wi5|*233c zy>M=I%_OE84USGv-ZVRtwx(uU$$TR}yRmZlwU^f}oG#bbr(3Bevb;8&)Q(2eZg&LX z;E|(6K8gY7UcGqc!usP+Jh!^B>746ttXmFQLamm$=iU=P`JQ*q&(5EI_2laEVyiQi zC5?v3nvLmK&Ysz~cV|DxQm@x+C3AB#8Z=1U=nWeaZ62GWsfuV6f>~N!3FIb5!%Cx7 z+47iRfNGy=1DI>Loq$@Ok?QrgzS4-O&#K+hF%;l+bA$0MF@AkJ`+sZ3*v8@d3(CM& zDNJ_zt9qT{)(@!yq+2;o-B{6DG7}8I2sceOm9*zu)4tgBB%?~yW;V%~c~p#yv%}%g zTI)**RYl`efVS*FYP2J`o>GWrE}iPMo2lz>Tz&K#3xn0AjkTqAck=A%&1Nf|nV8(% z7?J4nr_SW1zj$G(*=kv*lQWZd-F460j{O(UUA%hf;zX17?A@`vxI{$L)6?e{E>G>8 zp4mCqTiRG%S>dS6SwBbNCN|siXNLU5*~R9%SPl)N#}4dxG1m2rjc;Dq~EH zYM5$Jg!v9CHEpSM)qFG67~^${$KM$>oP`Zh^lDKVlp0+EaSe0(JE7f#NCvBZw4Th& z5SsASo(JCh?H3+v^T^r|I2EFd>}Idf_KwDpdvW-7m=xt|yu3v7N1K!LsJ&Xq8W@NI z0h|+HoykkhcHe;gw*ZN87UjmP|NH;spZ&so><>@s(@%Zr&j0)$@QxcL&)Ifbcl~7k z#N)$wz6B(JbBQ7k@pa1t{ju;I^*vAnz+{UahFYmZ#IRZ2cc6RI!KJX2mOXy& zJOAvBN8Z(G9AcuV*+h2JN8kU~|KI=HGi)__fi}uv`{3UD=UX=ha1|FXUD@2f^BzW` z0K-P9tcjjRs#Vr#ZEogeHE^zV?9c<#%^QMH;{0a3@Tt%Iqm_*pyOZwhH@6Y+H>0^PnHnBq63y7Oh5mxHg>ZOypGwGRCXMv4<*Z74>ZukRPjfy8w7gMxDrB|K@uK zk6)FqYb>*<8cq;xiUvSc6*z$)3I+j%0}F__ZO|!$%j_;-aMS*Gc0S(z?LYXHVR@-N znf8bM1g(S|WU<+A zAcjCSJC2B4+HBA5K+=SeR$hMUv8iTb_TXO2SRSrUO?P(h+*6i$(#n(q zX|-qH?nfW{_BWn<>hULE70L#AQB|91VjHI6^I~JrTmJl`R~E1S;$QglyLRnL9j&bO zvaC^tYO`OG^5qMcCnu)ob9-sIKQ%RV<v46*e-C=n?~iBY{TOBG36W?jbCuyMo; z8P|36`c^Eq_?il>WxM&i^7v~LlDbhxHUreX%&j{I)$H#_ZSD?5GW%+mRlq71K`KXYZZ zXf?Aah*EYs%};;!EAM{SJ9f>^f9L~0b@BY^7oUATNwQI1E-h~i%Y1FrZ)TZ|CNs^V zpt8|fPC6H;xscORI&pOrDfVMAf*(DxxboP`r+?XX^aWMTZIV70!*9Ab2r|CqyyVP91Sj?TDWxTrgy#vwhg4%cRbl~ zFs!|l7#L%qrYwtYdumM>Fp!8dFRVWM=-G=`j=ldECMTwVF?xiQ05$}oU>HRiY;%6^ z9S>q^cT{6yg~hX@SH88oT%3r*O3lKmi6@^i(|frwi;!aHA#G2^!9`M)swgAajn|7e zyWMU$pfi<}*zkS1;_p`G{K z_U^}@`@Pba)}^USXXiSK-ua~q7tTNV^0R0E)-Rp_5ZW#bwTac7(SrtCZn&Ja$_XUbT z0w^ffy_oO$km@)OuIKuI5~)Zr4j5k)f-2LGFX_}Jq*;mhg>s#L{ zxLl2ExgTxz2XpPITld~#)T)thJpB#(gDlMSkJae>cN}jQ0B^leToaW1K{X|ho5H${ zrI2lfpD0z7G9b4olceEMeEFNd`ON9xFJ;M>)$HW11G{d$bRo4HSf45v-I=cXOA zciz1G)GNQ650@t==E`C0bfVz$3+JDD^4X_Pz4olhs_ta+?Ngt6--CbUmLu;5kR+*( z=^Z!T|LMnK6$eE2IuQ1o3mOlbajp6LCQIt;wK(fN%cNBL=r{>v)R`Uwdk*8q8_^=D z*M3D%NtvBNdw%DMdj?-W-6ar>HG&Y?8giQ(xcVy2U%vcD|7QL4OLNW1_2KZ;@8JHw z{I~JmUnJY|Qn?s#;?6p;~r&{?6au?4pNTvNB)N{7po_NxHVY5@Oi9XD^|wO8wGT9=+ql zjd$FB;y_s{ESct|%j=+X8-rm{cxRFe`JlPSLi^1M13(Yv{iK1`HCY#TFE5Tgz<=&mgt)!rSo{4BkQ- z;97ZC!+2PL2$lS`-8&!AY;@XYDW-eLj+&t&}fpR;Y_#D$gGKF(Qafh->iyZ;_S|yJ2p2rpMCa) zb1yGOMUPMtMmgt&H`dyAdvk5@o4@txcRz6Ndmegl*PZt~_SmCm&YmAt+UX=&XJXi2 z8*Z+)(@x(|N$sJVc%?CQD!5@f*`szLNtSkEH0l}`e0l!-(nhFOtNa&kJ=#?yCM!ek zY>MqVx!z6cqo^?*W9`*?AgNoDrdvIV>z8^3NGu~S;S#982H3Q@ZaVuOd=Hc$CCZHp z&pqna^s5bHHbB)oe_?#>!Vp65WvuAfd7(fChblU0sj0`J= zT8k=-QTf~b?OMO|PjuHZV@p(8RqIS$P$ns0BAC*w6+}QoB7OeU=fU)|Kk>KO%_yA3 z#GNPJ|Llw3uCTy75Q@*d^2rzQ3Ja+`4C{+aq{@7-i*K2{)UKCbj?eU;X8eJ^YarsYOEI$4@`;%m3Xkulv=F&5dTq zib|FxI;d{mb>si@Kl=v{-28wlIdTEj|K)%DFFyIzf5X7^#Psr|wcY8ieN+2>`9Jos2m!;Nz@!p^O$VdMivhKOdS2jk2%a&6vf8a=(aoU$*Cuvd1(}qMv{=mPNyS9Xk^nq29QAnd$pE`s3?kNvzb#F z6){Fp;jM~itO~l_s^1zTqdpIKT^GMDj<#fB-*}zgG6#??c<$TrRtw#xb4cxKYhE`e zs%@aJjmq9^Y^@a6>WexmMANj{M4J-Uh!}m8Ql%my=Ny3P>FLSI?v*Qx-+1)NS_B4q z?HABEzzimunQrgiH9Ipsv1iwgCZif|?mKqFVAyMRCoWyRniu}gyYG#|Z<{nby?ix= z-ROs%yLUth7cO7jHIwbzw|8}Q^?&}y|DT`x*$*E$a^&>+%Vjl8Bv?%wNu#Q0W4+(= z!}gvX%jmqAb8mWgp^d^@GA_nQCN-RTvCTc*=hrV+&%SWu^v-wgX(#{K8vbNlvs>37loU!Di+r2dAGeF21<7zPvM$#^hdSYru~Jar?4ueL_+)>N4y< zinLStn8qqzJ(tO_k#g`}N@OXoUAeSdJc0)-T8+-!+~`#SU{d1{jdBdae4SvxpCF}E zRi?3DFJI^97>T_3CPw$_ZuByr<&AIGoC*8ANEQ3a+ zUp;yH@v`8mC~Z=-+OrWOLRk|rBtjywGK3QAAVeW+X445ZM8TvCSzf(BNia4k%7U$B z)s@u+JrV#IBu#3yno~ohF%BA8QWljlV=)ian*0G8^YOmVrLWVK+7gFFg<0DTK)r|! zA?%yo*Fh&imLdxh?mv3(!?!&6`6oY}CB&BUyh;RJ+kW`2cRX_QJDX@SaYQVHZrXKI zKCGH^&9#*c8{D0@-t+hW>%YIdyTie4N$-$DQXp0u9=h@2U-|nt{=HxQ`~T+izqx<^ zj@8AbL$k;J@!$Jj?mPG}2@xYf0%#=_vAOBSn^$%V7X2sDcwqm2<9DM9It zbqB9))7wO~w;@1p$DcgvTj+HVAo)J-S28xRr)}*Nsqw7+e!t-w00crH%Qiqm2(4D9 zih~kDl6xI3tUObUHfQHLM|Qo>@-!%|Fg$eNaDL(JuqwRotF@c)vSj^HIY^vy30GBU zPqf$8H~ZyiBAq27AADjPshcdSMgC)P0Ip%_zW2}86V)H4iMw^`poBca7?>C=Xyjcw zxpU{OcY_jef?{pq>%Z*|9h}^ zP#SCY)!*V_BJkA0@Y`3HSK%_r(#VU0C7S9;EE9I*oe`s1H%ENASU&&t$ENk@t#dOo zd-5xnFGH%xGCSF=iW2H9Wf#s|c>Kw4-F(wMjn>Si^Cv+(-AQkJ$AgVD8LstENiixG zFE1>vtXx^zeBp)XRrOu(xPQ=Fzp}V8(cQD>z>&1sJ$P{c#pQfuP&OLr?w#`+t9@gv zk(7vvVFAOcv6fIEqBKpDG_^?r;w{4aSRWO1ohBoVyR+9c;I=Aax=vx~S^=P_sp9Us z@7a1MZ}WiPVsTBIpBWM%fCN~>^_7+DC8BB{E;GLVKa|lALBb#a^5w@49y$6;fAg3A{Kx;|H@@+WS1+E+x>GxL?o;5o=fAza zzT>Cf`<~r%J6?SLrQi5h|JrpMKmF4mo;$ePY^BAv7n?q6?f;%Zw(k#+1>vb7?i zt_8m9TGc&cuWB*`5I8L)4$z)E@eo=&6qann!pjGAtkzKGc|k zso9+Bt(6g#F(Q#+T=2|nNkuiXfrvWW%+g6wN+=B)mBRYQLX?5`EoMvP^U+{={VGFL zL#@6rH8mCUX1`n}Qey!Xz(5UwscxO9(bo@V-|&#PH}HBC-~(b5p|YW^$)syxQ%!p- zn^O~$Nz(q=_x$wdzV!RHV~fIDYh6rim3`zVf0mK-M@0x#x7#IVGA7M31zOqEWH$W| z|NDQugQf*#4;!ER#%I6$jjvu^TrY4nWQ?voikr#Qi?W~~O zeD8$h8VBGFpNAihc)I}j_dRG!?_3#l4WQX>xBUnqz#^4eR1&7hy+m?ZR+f2^xU@;6 zzF(gC@}s|b?C0NIhUl!ZXxw_sT~EF6SxSfvf>djRB_*`Gtw_EsLMTnI)LV8P>ZWsm zjT)TOGi#?-R#qC*8MOSjcWCrRZ+}2+i-8i6VTQyS9H49l5v}=s*mD$|!AJDg2CqD^ z+`BmS;Xg-FBq&esm^gTR>C%ghFiI#GL}fOhwjn>~c^)R+Fe9JG!m^qt~++-{4qji}P^pfVciy|I8Kxm=qWRFJHR!T5p{v=7Sdo zO-@dDDIpT3lS-arnlmiOJUFjGBa)*OwO0o_dw4IPCYAt}YfqE?!+*?ZuO)FWz*+jkB}e z$q4~-ueZ5+@j|0LMYLIrHmu>z&CS)-jfsgVHJl_#6d2VgU}oo>O_HiNvLZypKy3o+*@;iy5FH@oA?3X`#==F zchtEKw$n5w5V)$U;cytd=c@7{hN4WY+hW1$*|TS#c;fMM7cO18bO|+B8l3{N*c4f*D3x`h=Z|fLXWoT>xOK@kv{f zFZDQMJlyzRk0+~-X)CSr%DPOg(`;h*&3A)Zlr&MT7SBAMu3ehOVD;3~GboruTm#+t z9XH=~Y2kSr*O}o=f~cVyu?8a$2?D?gxB8c(u`qQoFW>-8bFcM&>I#vZ}yfN6Mwf_IW=NL0fji{sw&u4 zTKSlyiAa@~qgH0hYH;Q1xp3>yp_!&B(43r@HJ6Q7Z8RE6+wzq6%l0Y zF2i-TM?|XheZalj9dX(oeklM>ER!{5FjZbj&;&^&ee$`de)65~4I#e!-gobu+I0mN zhn084M%=FM&fAWi0Azizc4hJEiCbb^Rs{Xzxc)f$^iSCd;XKZ@}Kv8IzvM!o?kfk z5B~Aruac_Q+xX&hUsjU&ee-sT5!JCxZOWjk3P>n*Sw#N*YrnSy1nBLK*IOy-=_-R` zjAPe{A3Rsu76Q8FZ2{%r6)@JM0?TL+GDe!Ywxx!zVv-tSA5g+nNb`l&SNrj*wY~}k z!_G7gQ0%I2Fr_ZZgpA{a}@=U52+4NMe@efN;X1Ix0aT!mesI7>|b48FNJzTdGVFks)}c3 zcW!L-mRDD-i^7Ap?r`0zfoj`41W4GnVILDYRe%7Mt&tMz_|Mz%;~OI1mAhZ_ z^&Q)um>TbY4Ju{@He$?J6^%5OL%Rszx)ZjUsR^UPQqt=U zB%=1YTVG#4bLPy#!otkVjH-&pdVyl*T1MGW?F?nSC^NB9Xq8x9UcR!jytHS}o^E&I z_urp_?AL_Z@fKdiVZahxSkH>Rnm?_E(-f`^tsqUpO1I zeQ`N_^@*1*Tv}dT*<8K2xVo@#W$DV|+S2OsqIKz7qMHe^OPBx%IV)M(C+aaawc7Cg z&O|ed)|9s5HtR5iwN_8&qGZv2j`wB@I+mTaQddFx<( zS(4$|-Mex4MsOx7D2w$|CpXWXW;ZC~63#x2V$=8%;Pj6BVrSlH(gJvdFbonwsTFH0 zZ~*zp&XOB5C@e=9EmweRgfeZz}8qOkdK_9G)-fa7)3RvscAGF#6ts|MHQJW zN8%V-jvWGPZj9ej3r za8s#GG`RWMBX`{Nj@kB66|Q`lr1`?iOJDrTCt5p$r$F+j|0G<4=cziIcpsH`5Urou ziQ{)eYu)R3>FIB_O=Lf~^7NCtj@}6^V1S$Ml<7S@xSC)%f{sR^lWL(pr_9alYwSD} znyrnzxA*9+Cm#41cHXGLl2jNiW8tN9-~3X0W0jkYpkiQwP^bI#5WtRw3*X$a2v|}3 zk3b+>ZAu0q_aSXIhK7qgwi-4u?NOdLR2`8^Qe*9?suF0{XdBmJ+cSYBPv^PGr?xE62FF$GwOLBs;gOwY7hZC2SaKRwfJ zp)4&LN$OTt*9ZN=2ULN4q$i$vp})SibalDYn!M}wI}RN<*xy+B#y7q;Io-9UH5{%7 zO4*i|7FJ7-ebaMm=g+JxE>V`v&CRSXuawhQuden7^E0lK4XP@2jl!29f>T$-NLCxE z9gaqcbSz91xv+3qW)2e!3=kD#6QjBTah*T6jyvw(5!ZuM$KMEO6laoRRDvSX#>h5z z9Xf{QBt+Q?7B5m&SwKd@IIE}qcLn< zLe_v83Kb!;Fp0#m16Q=>Y9QGAXXxdf{y@#ct!M4 z5rRW%IAt~g;zM2(!>GYB2la`uQb~-lo;j4hWM@=J1VrSl8IFn+-6Tl_sw$RPA%GB# z4Xh<@TdT;mC*}GkFHU1dJ@k&j!rfa)_}{Op|%-7~X|FH{ZUywFe-A`MuBoo}}oN{pNIg zROB1QMmCkLj8;GY_0Jyv`D4+CBYO|DO|r4Ewz|HW+9V?Gn4bS%|EGWU-~12%&FM=o zH#?1fHQ~F4PO?GPLhwJ3sdj8@6R6Fc`u`xprc@d z4Uxbh=*H*1@Eeam|A~oN6tW3h;ZL9f^lv=`R0JeR%a;MJ)7*O-cHIQEkP5xUrB|Ms zpkYxCR$q8**H3>O$uvv~N%!CNp7pb@RMF>BwOY+kjnGI2G=2Eve+~D27}S_{06B0Q zlv2uZ@yz+p{%=>l_=%&jH`Po=u>vs(lbWca>?1=6P|LclSpTMCZ1c=o|04kR1Tisr zFK_SOxjGzG;M@o6(&)W4Tm=bLnYpaZhh*>67)%3hX{kL-J8UIZlyhLyGU#EF}O z&~q<5KR3B6X}9#^+R1b0v!t=Qx@j$|`t{Yds;V@Ctx-sTmSwrVzV13x4cBJgB9;*= zDIr+(06?h{3qciTtj;G2*+Qdk-TQT4pRY+@)epmU%_^zESASwjkGJDT8`rl>0a#lb zX#hYZs=)`O1Y*dRGLLh38sk`gNFRV&Y*>k*N)&5#nJ6HGpvJHz*3Hf3 z(XelZ&4Dlb!$EhV2_Va|Znv9d&4JI8BoP6LD(Uv1vaST$&58Am!7VrJK6vn8(O+0w zU9hHXxW>xj)zyuBZGFQyUfbwhy1Fzs*`P-wWs$EcA2 zL>7fm@V6d241gIvs!hh3-L}cb>-rQwNIq-37!X8bEejI1tHc*M-S@~(fE(fiW4Q3b zH!BHh(^e-rbNV%xyg2pl5t4SOO6#Uhyyv3}|NJ>fe!Gm2F@u_9%54<0$&DW$R^exCKg5k<3JKL*cg?G9V=@IPnN+Z z`e=USI1Y+Y4L7{7QcxA|O9Pj%@g-T)vS=7*6-B@h2-dX7lt6IK0?L*s)UpP(YJymb zNlMm%0>|i`Ga90b#2A5KEMlmgG))K;)ihl*k`+mPg#fskVFmKu(^ylDiMG+E0aWK0 z`2I4Ws@Egnbj!QP5E)fbjgYaz9Rup(@BiNK{jIFDQk3?|5+6 z#J&ph)amC=oqsh}v4c)PFg5`hW8F>1@2E5;5o+n#=U=QO2&%G*iU8xRbNOKS*mGb0 zrJw(+sY_Fsn~&bGIqLnZ-}?3U-TzZu*|-Q|bIy}FeAh$Z7GR+zp8Hl-tWKs}0k&MhndfohUEldsEXvRqwW$|gIam30g-!3{?vAL4KR=I;y!)w9pN6s5ehaOJ?B z`JKCGrn;>Vs;S9!?_cZp2XmQeHM9A-nH!EBB9~20cULx6*82I}+z!s>CzkTdSH2m7 zw+Y1Kt@Q7Nk9zsAfcM^i7m4W1t=1j zR6ve35D^dsB+5aJQZlaOB$cLsUS@U}aQ5+Gui;ZVdV^mQyoRt;u#j&zsHW z#KcsR*x;q#@8@~$W2oJ$w+=W2r^Ecgi^MemQ*h)vEwZ)}NS6fL|6#kj# zPx%-?3^v`#>F(6z#S052ZH=lpy=(T|)s_C{=B^#{uU@>|8|6g^%+?Z@MYX!V*`Mol zy6uy%yqrx<#-KJ$S65g4`bIKYy3|{%Vwo(Z#(}8vC235O%%+sMq*`6@aeX)ZjEoCH+C)g9-&NmD2QMcUb49p_hDuq(l$q6upW~(_TSpvxv%mYdnRVD z$}|GB^0wVY@Oz zAOy8G37}55n`3h@DtrARv&Py)#WYNX}%ZScJ~Y(%u( zeH<465y2Qks!Ym6q{Ow)wCJ!JJbUJaM~*z$Li@g(?|bQ`mze0o@B1J?3j5iwd^%8G z|9>rvF-8Q;iDTEI4klp+)ubkXpr@=?Loe*2ZD|K30S zfBawn#(&wRPTO^&`j5T)V;_C@&;0M7`4|82SN@0TCU5pPQ)Q5B+0kgk)-|ff$Zy$r zy8!t2JL(;BOB+XJ`-{Z9ZH=jjWBJG!^C}P4XQ>nTP1k=-}kj?ewe^I!QLKUkP_tQr8+svtH(2~xLD z-i%1n82_xgg?$){AzINkCkHwcJKEi~L2fyXWtli9!D~@=o1Om3dYUzw?MA+QahDB) zE9Z|i?C#mwTzsoD;X^4trcJ9T^L}iaq>(1Rs#H18y-S-mNx$^9ug*?)6YJ7ut2;5b zy0Qo%!;NNUmzH|nx!p5Uol6(b{^93`{ZZ8$tyEXQS(3L+IguN0t664g@T76P-Jz?)1Y<) zw&;H2X8k6jQ^2*DV$&7LG8CTvNHN78!WgQ#^?AO?ZJ2sz9;H~_sZTJRhF z58n8p6KF(WB$Gr<1xHXVBBVfXGz^xgk%$s9)9$w1%6isrH=E5Q0W*(^q6S`v7*$Dh z{Jhs{n05J?q*f%ncJ9ol|KRtg+j7(4-Knz|&Yv%e;@r8jwRQW-+S<~}sxN$!wyJW| z+UA}E2b0#y#%KWLKpMZWGFqGJrDZJ2sz|Nd992`(6P!A4(3g>&XcVeT>+9Wib9R3B z?j$>T{^Hccfwk4O?$k_V6j5Rnn>vbA_J>58qc`W|*7==#nxs*PbX52>bK?r;TB;{< zJ>hCh0KKL+y~S3NZIC<}A~r=8E#NZaD>`!9BWUlAMP-^DH0Jlc`_CZ;ScVZ)evfrX zS{^nAZE%X+hug<)8oYRwgHNFnH3oqguS%JwHU$`wU~8rV2T+t?H5!2d(kxl(t<51i zg*ppOV$v8?G9gM5$T=^j(V7Rh5e->FV%8Qfr=hZJNMM91dJEu3(3|mR^zo zc!?q+u7SK51PFPx&I0h>2MV3eRDakbE<+p{V>*^?e0&#>wN^% zi|e2N+NaS7h9giBsPZF-N{E?FP3?vgeb5qCx~4s>Mw$nwlxWH$*b#Lx5j?{+CZ~6f z&OBGf(XamAuU_3a{~!PP|LBhWcXp|3!DTFe;e-FdZMWa@=YHwWHci7u8Xq(Os1YXR zEsg27aJ*dr{2w5c-vFGaytQQ0*2Bv+;f<{-OYjv)tW7C$HNwuhy%tFog0-;V_06@B zlxaIFN2Af^x!?c8Uqkq9)@D8`CnqNl?mzL!y+1e8INWM?eMH+FeD8yQc6IZ$vse4D zIp~jL2K;aNl#EGNfN0W8R!iM|=N)KuVH}hZ^@YWiOtQJw0aaZefi5oJD;DfR43^Wq zcRq0H(y3wZl0|@;nThUFf9342|I=mpm0`q0r;|-icaPk(@4Y{RUAOq)Tw@N(c;sX4 zm1REp#jw6;n3Y&aSV799f-w;2k99mW_Oq>t9Y&=E+Ft#qor(OYje zGHN$M3=Ow#FeT8+KC zrq7>0Khd4qyZ_*kn||VV|KLlnyn1pp>ZPfJbt7L!;vn88Bw8NWH)GVFxao!)j?TY! z;SAX{%d$qhm3uyYcKyPYrH!11quf|KKQl8Lg>zq!Z&xgyyHu%O0Wu(Cqv*QvK0Zv$PySrFwp`Cq|Ojmo-{_1p0*|q+&{VRZcgUE z8@ap%^?ths_;HLH_9G%9Qop}WmWDt)me(XGP@*z03SGE(rdWS&!t@(enO@6Te<&GH zRxuh%?lkt?ZFk*7XklCcsDWv8q|u(pi(+MY4WPlGKNt*BZCWk3zJ$U^PPFlc=6oQ)cpZ#);3U@ zh)B?w=&Wz{?fectbPK3$8cux4Ndj+R5&$S8I6(q%gh!UNB}Psfvv=Nq{_4rW@}&ua zf`bptme~+QBT#q%V1p1Kfs747*aLtgjE2JzZJ-?4Bm@B9?yfznX;X(eD-+ua$>g5> zFb+(J9&t2Ux@3GADYB{|7KM(95I?G@1>s`!qtQTRl(@{0X{POHc(@sNP4Ata+QqQM z)+1l9t`3X!0zEcGlwgpklBzO65rCjjQesM+Z4%oEja8K-S(;La#p>FEg|ah2RmdDY za{Q^6FDg~ek#m+~vUkq`Mn*6ZaiD9JACgld8#RiEsp0#KEeo0&OKHE?;`ut{&owDo zfd+*bkbsp8z!q$Xy@_9W^6RT%W5!M%+;Ql}ea8vC+BAtuP%K4 ziO>DvS3dLp`#$iopZvL>e&oZ1Gfw z!P}Mw%By6fifbyR?U*uaJ#+Tlg@sE$`+>i)ck;w==qI~VtdsZM^}frWd)4cb{1_Af zbr@k8A)B1N9C-J;KLSm2GS(P&&G-Cw{|G5i38Es&;2G%zfLMx6I&}N}OTY7L6OD{x zh@}rz;bMP+V@E`pc(~kKd6||^zI^hzAn3??mEfp((>NvWVo`j zyOr)@TzTq=2lws%sfX{^SZuCc9S-_emKXNy-nn>gvD29%b)oDh`5CR>bD=; zy!ho4-Ova)btLdsUQW!)*j-j9N8c%{cx%|*=bC! zF055mEv4YgvMkHed+&paT)a&~w-RbEGCjaUyueEHeDn=8N&AFNB zEK7>AY&Is7tl`Cv20d=jbYnu5w2(L)-gIQ&FaDX2|IY9HHbpsk@?6qt+<3#0qX+l2 zY#6SuIY{EQ-E`z*|KjDt$9C+{>iH+WHhJH>TzhV!JLQoPnfd81;;28^z;OMBZuch+ zA9?uTTniBR2yWOEe$1Y^j(pDmE7cQ~AMnInE4!j(X|moMm9E`6bQ|^_^Kgz7RSzma zgfHO?m_dTk5dA!vItXt`6WAthz5B}Ne`{|#Sr(h7p^A_s#(N(WLiuEOH(TSu=G{KP9NF_1XzVuSUjzpmmGpdu#%`m z>r~Z_XN&(9;tkYNm6gcAbsEz?iN;D%l>L6c93*?^?!Nc-54Y`%KuEz9aedkwEq0Z|KcBh=?@j8uz&%q!bCEWj1mjp+Tw9<7XWX)7~@lG>8)DOa0^UQ zKak&%L~cWUWNUu)9m*%VJqJ+rv8t!&)*5GQHP9qBcg!7|Z12;U`dFDHF0Gvjx@H~7 z81HlE7{)7CNi$Zyw^l4OO{|UD-}u(2KmJoky4{&5Q z8ngbe<$(o|z8N$g!2lpO31Ky_{M0cVy$jj2p@d1qk#W<|2;;y`1|x1Zed(P`6PqF` zX7)_qcw+d%<&JnY1dUyXa$~ib0ugDNv@IcD9*nBfkA42=(ObaH(gUuU-g37$4JAYZ zskoY>x&@}a<}q2LT3%-~&SM707)Qz5r(=6C$y*{F0Mu8^$$=(*@qG_!+kWHK*UGia ziE;Tx*w=EjcKME-Gdq|rJ@(BT+wTALmp`_Dck=2>PeIDvyXG5-PESuan$4mprY0xX zm#*G<+cEhIA3c8SZ95MghHY!L+-|n>Q8782g>vW;Gtptod78MC^84;M_R;shKXvBm zr=Q)ke~}zMwkkG4>yo?| zMuLfkcCvOT%66-3to8?+&ZW#8V--bJNkOWj5E=_#FfZ7~|Gg*E7)0y}Pbn zzMSW|ARa!vcRjDN_T16Kdu}|s@7?csWN!a~wX0XX_j$k9FlM;1a{lBCqxCDs5BAKu z?vCBnaAWbZ?wW4haP-Djn%MNx^6FY6O>)We{>m+f<~No%o_pajxBK|?!Q&gnXy{`z zwIq2fjXP#1KYrf>4^?Gm!=1&W zf7m7tN(0!OT0>OEx}rI&u1%@{BX|h+(#cp(8?G`DOTju~U+8Nu)2?GSZ6ir>_(VRj zXQe6<6MLLu_p#{{_rkS67QT-QuO#Ja%PG7h85_vxywT1K?3MEBS04XrlBIDJ zMAg7~1VqmB!Z?2A+$#h02~MFO{>h(t{Fdq{??!Q@L#(1&}|VRF;+q(!^*m~y)u+lD4Mz;yq28s z)B{%>sE? zS9l1yh-e@zFe-7YLaTAi+n+yfEf`h}lZi1n21Nl3K;!nqbqzMwv9}l~QKv-UhIeBKOH#mLu^4#pMsoj%zAH88BR9`;xt-tb%e|2A%UOV-z*Uq1voSv~P ztyY$g`aYD$jvmeoUAc5|xY~KoL-(s;#2oOW<#l7zVmN9{O*sZee&3Ay_y-?ZxODlo z=jQIa?}6J++|X%H=-qc-TD&~HcVBmMV&Tf_;!3X=EQ=Rk77$N{@_cBlZFJhB;ZQ=w zmYqpj-HE&`*(Pj^5LC6^A3U(x+I4E;?zLjow9;ou-|`^~0>S5WGGx76+24#!*BNatUs||)=l4G3xhTd-;Z2@BZmq56-`I_LVc=PWx-~JNKtk(@D#9 zlH|eTH{WyPo*fn`kcb!pV7aDOj%_t+?r&W)TS8>59RNr}plHAj5k|+~UV|HyDXbdl3oxAmBOdJeBY&Lo1 z_D8Nf^JqHC`<0s6gM8$UAOtI|*1T`dC6uTkN*kEm)wtyyS#@h1tKDj$`a zX{bVmz%h`qBEp2I5k>_7TLgl25crK*-~2>yVoRtNaiVr(--*LNk%twrz0LB{YnNV}>RKO%r_Q}FeanpoVvy~c zy6J|!59XUgUySBw58iXfhZ4*x5+E)O7EZqU6x%#%PHe`Ob_8okL^MQZhN?&at3V7W zLM=$4HN2;udx?OzIRmW3qCkvdj8z|*l;9asfr47C)H-?msmDebOwvSqqE%D{EWZ5c zS66!LRi;K0I1}I<(o`B5w=~gnS1&w&_JwyGewRV^;YU99YrpnuRLZc|Pm@L%=&|XW ze&Hwng9B5C04U)LkAHyzOiu5)?;TG+{dCk&aS~%FMl#=;ZKqv;6ye;tQ^t5ODT;_9 z!YIg6A|gx{szRa!Aytl~lqi$3A#29T21u3JVhp|b@u~veE&$$oVaRBV&N)>Pun?F@ zMF0bmt=__RFOz9Y&2B6Os-%bz7%0>OQ6Lr+p;{UnC-U`SmZS~WhUeWo4n1(k`)}HN zzmG^P2zic`)90RMn+Nq2GvhmrWQM2+Lm!H0YzGpox<-30F|7zVa1iepYsHc=+g`-q zx7&KHAI?J2C>fiC5FDHV2Z@GVL@blYL zM0a@@x~j*H?CdPSD@)7WPV?ngPww2c_vIH~nrOJ`sfnfKt26U6Nu&Av*S~V=^y!tg zRU&fEg~}^pJ4>y#nRCOz;KM)llV#->E}lDj!KsF;>A78xhfMH$^~zk!dc_WUtZsVi`TE4|b33&Ck$az2Q(I zh;bl|QEc3DLogCzRLcRXOem}9D`N=~pnfbDq+p7GA`n{xW3UA{`5|2P-j08FQ446s z7(e&9&kY8HpZ@8e{)zXzw~@LSH3*ZD82dI&Ja?~LzVfNx_?J(9^IJ2=Zy9CT)nsR$ zO?|N}i0#8olEJx_Y?|@ak9w{DFJn+UMG$Rq9D~x9GVeHtr+RKz`bt!tbDN_PG4Z6N zY05kt3Kg zCJCWJP&a?zo}c@xXg45zY@U1Nzx_{>vez(v;pHdyuU$YonIv7HIscBInZNB$T)BX~ z2Vo|_2~{OfV)?br)6aJ|*SG;|Q7Oe3RVt_OLD^b1!3SXjGK^5GJV8me)ilIJYi*3t zCLCiRn5Y3H*0>mBj1h`ZRf$bh5&*;sXw<;Q?U_IH(f9wAX5ti;KrC7j#(N1mbV(HS zPAxq8_|uwS1ocH}jO&-1QQfcp z#;@N0Up>Gov&qyae)YFM`Ptw2{Fgr8YPWYy?|uJ0KlR@G-^aiRqbDyu{u{sduba)L zjrcH(GxQh{kS1a-!1^&dO@I~D2y?_o_MMi4IqHLjIDOB znf{uXj{i==W5SlQfQg*7S_u$TJyCZS2hLwySYFxa^+!HP+GwV&dRm3Lvul|Q!5C9pDTOHC?Vd=aifVkZKKTQz7pOmRSNUITK^5ny^ADkQfNXvAiTym=g#D zQtwsR5}mZxzFh|VsYfj%C?di+%vKm6ej@7c2l5LFd23K)0*mGZt_J4YKU z|NLM7+Ub+8#A7$8#iHqc6SoYiX%+i$EA9`HjCy2X2tlI57@rXtz?N6A04nl5)+ho* zq$rB2s#>kqY^&L5H2VEvQI7IFckMJy)2XSc<>h51Qgb9HmG)#)Z=q{zSW+24Qs@yA|#;pF;KU&(q!5MPZ3bJOkL zpZ(%3$8UP@!3R5YJHGYIOIf>p;P8RTP6K|pdv3?VrDbDXG{ngblr01$_ ze-IlJn3@AMV5eaw(YA;Q0B0PGMGTnkfFeeM_RiJlW|B-soAVj3{q{ed{=i?Qn;#5? zax%ly)0n;$mH>}fAokF|{QUp&cXx(CgP{Q;0Qr>2A+eTx9s(j8iUtCSEHDZy;6O?d zQLP0<4}pPb(C8J>8XKcg1(DTQ#>%%^jWRE-O}&@0EQiCsPL__Ef=J*-GF|V2Ar!Dq zb(FfHU~MSNpZm&hpFa2P$eXQzD7YL?_>=!=pAO58e{2~K_kRcTmL*y@AdiihtXMdwT)#z{ZL**i{ zi}rr#jt~9$d;d&831t#%O|pr>C%*W}r_Y{5vsDg)u`PnD5F>)vP=yht!b&8yv7bg! z2GN$=0Ry4|8ZB5fsK6RmKQMpVtLe3Py8w8LMHEjQRXrfYC_^yT5Lm~S-QVHFQO^UI zYwyM_;a(*&u*I%GnlQafEiK&8hw@3s2Ni;(sVpO*h128Gp$4cQ6*v` zkn!FROVRG^q1zvTYgD2MJk}RRXP(|$tu&~NqZkZA?fqyt_oLoRk4+UT&Cb3!492zF zH{aKP>A5Nb=_GD>_f5CH6Iae+@jO<}hp2Y$Fz$XA+=R&{8ZjVW!P2RV-~56sEp(Y! zYvDrFE@0m=4H-i##|=paV4SVIC&Y*dOW=qYVC);{1`z>Z8aG#%V743|f}qV{sQ2Z@ z%GzruPY#=IV|j6HWwqHRmsuz?bCM*(VV+o56;*qpF*`fE(eEuUt&NI2gmC20;Tvzf zanK)a_SOM3(qv|Oy3^_G-L?C<=bv6!xI8gERSbiwCeAEey0HK7p|##Han1GqU~zT5 z2r&JmtE1bBBmCpgc4xto8~&~?)OT3L)1p2ktE4*ICL?NMx&}(rD-Z6)*3*X&BkrF z-_mNe&Rw{imuIU|B!=3-fNF0QG6Ic0SjRB-l~+&Se&hZt%S&-M>~uQ$u%GAUo;?%u z(^G@~#?=ew=B6fZyy56GgOf|k8$t=QNz#cudk;T+&n*u>bl>{=>Z`AwEXt8MK7Hzy z{rh(ApPxw+*Ur+c(H>QvNk{p>drvX0tq%9?K6Z5X?uh~uinfM2Q?Gk6+lv3FEmQFQ zl7BJ=s!_$Vz?w*aVcj}~*AD^eCCIYrqzS4Xs&#HMu3o~cPtRhQp#(*#b!#9bq6`bq z{gw9MDpt+{0X9Rij)`VI+5i;AD*PsV2en&5S;4y601n0>28e)56dRp1k-nd5q*Z@q z{l!PAJvmkM?1_g!29Xg1f*@Z<7Vy+p&wl1#&-<$_%~OY3Fvw{%hGONTr^F_Msvyg3 zIaWd@Ztto@q%e_C4+OjfW+W~NQH?PsYVe{Yme{6g2%#(sRdv+Nn&jhpiAxp(16Clw z2{c6tTSiEv{!8b-efGlhXD&Rqx_QYpqM+>cb87)hY1(#K<}&pd7#LWuaA6ExH2{=+ z4O~+UMDrxELX@=9-umU2PJXSwR{qR~{=*jU7GxfkgYg&{sG8wdzx@a27QcRR`Ke}G z8;xwEH%zmpO^mT5LIA0#SG5f1oQWn#+*U~?X2d8K7S>u@mSx&-0dX{{+U+(eSHn@3 zG(@E4XQj=oh`C2O!l+mE8r`fI4ma}kS1+GFv-;}3nf*=M{H@P?LJ}EPL-Dj@a#uh0 z0)hgPhTIP~M)~}%nS6Eh4}Rqzym<1(zxmhy_MYw@hEpKGr?3O`FJ8U$`16nd%CG;* zPzSw@{?x=&?CY<8>eoN?j*lFjK2&MN5}Yy7V4+<4=fC~``{$qd7fa;|8BBMkywx0) z0an6tXEGaj#1Ih;feon$3#q7TP}#ycsA`O2E%Wz%i2fAg?OpAy6(U*!rOjA+LKH)+ zjA=1Zl>lqUwJP;-)uHCZ4>WGYlC*d__UOs!7ZiHHt!qEIpx5RN5Q zHjA^*y!`o>&wOQZ{Z&r2=!rE6v97JIADZk4T*vLWY41($pfgY(Vyu89^Exobug9}b zzVMmT3r{qsRATl2XYWsgEXl6(K=3=~-0RDGFCsE>tsS)x0I?DaSAi6%1}U+%u%(v7 z?zWN1M%HH2>am{rIW|A$pUh_e*P3aWNz+o3Qn#ixRCiNcM1mkhfCRXJ1PdEc3u?`( z%00HXxcj~5ocVG6y@<%l0xLllk!7lrW^NH4p8lS@U%&S(-}yejo$2OeBybA7L++$$ zT2HL+7*?3t1!RyITMRt{Lp$+-kdz$&E0>&;!PvPVYHS0qA43On5IZT!vf9DNeh_t~ zeUEBbJ@aH*>=Eaj3PhL-Sy|2&rQ3V$xp!TC4wGG}w$K|s{C)iEzcjq|GKi5n%r4+v zAI9S!f%hRq_|%sJHM7;>jY%z-zt;WAzp5@jQ>g|fa&{mybWPDjURt_0H-hD4ixv_V!$k|w&lA4J0eGj-05y8y>6zl|ZKGsXxfTzKR z02bA}&yy!7?;G-V-{Z%&nnwZg9{qaXcfDFS?_U;K9rDWw?W zrAwF2oH_ILuYdispZ)B|zW3u*GfAlzkT7@Ma?-R-^jBWG{OM2q#`T-?4?pz8UOVI5 zM^wGZf$aQV_1$~(*n|K4Z1PZkTDk)l$z)6b9Cj z`%YDJ&N0etHXFLb-1q0s@18w(=F0W!F-FaqieFF?hDFQFJqi<1&ieJIo_+p%-n-NA z*3Qm-4?fh}7k$004jhNklg32nidArTvmBaAhn1|3c9*X-mbK4k>)52DYrpmLhtGXw=aFAN z^VoZF{sC<7U^U>WuiSk4Oa1j1WbZ}hewn}#&Kw}*4%b9Z!Rrt!GBp*Y)~HW}VSp)& ziI`<(sIcr0r)Q&@x!KOnbk!|Mc(B#Y!*722H~&S2&%o*sG9wYYDd5q4Y-w?K zMc@0u^@FE&&kC|kW_8xRtMf1ZH$U^_cfIQ)@A!Q*5OMl zf34l_)HHiLnbs+%SV>mP*_&!ggp_*Kp}LRn;&3(UYB| zc5B-8>GJi<|Cj&f|NhS}{c}(0cfa&IDfrn7J2&_C+h)>P`fvZu&-~jj{Mv^<@Zqy( z&p!CzgIjI8x3~A=D=+@x*PeXg+RG+7Jv$Mh{eEA~{%`;6|MAcM=bwG(+ykHdksl$X zP9+^#qF?*3xMe%tzw&d#RlK&cgO~GAD@00B5RJ%c0#0m9UvETGb=;L9$y9}!sE2m-3{M?%2h}_skOfr_jT8<23iB=>edQa!`P}8-ef8>Bm-)(M zD-bu!ZY6>G#lfPx`pUsm_w76uXyzd@LZA9N#uy0b4TqPHp8oAG{o>Ove}SjNGA(0a zdOm$w-(rawhGDDP?Yfwg0pp6y1PTIU5RAz!i@O6Q@MdSg__!Ir$mO~afu#UDh%Cl9 zt)?`cViK{s-XdcE*5dgmC)}A2$x%h>)!orVSO#&L`Qp}Zf9mYT`@uV~jQ;4tq-vse zU;K^c+$GdCT;LUAgJhsgH6a~M@;+XC`sfdS@VQn;EkJCH)ln=;06yu%VpQZ=GT7X^MCh0 z{p-71^-8^}st51CIBT1JwP@<#?z!t9yzkO(D{QEQSym zBUgM-W>cHr;MZ)p{$jsUXgdV9KEMB!&m9e_E-l6F$aZwSrEXgW0+c}#-JohrPHeFPOX&J8RACr0 z5rt4OJKVtmo5IszFokIEEOb!98nIQ%iLdb54~oD!aP>+|lwnGn=Nu zJ)j0*cECJ)pujXwT{VrXVXpA1s*FGqoQNwlQ@(caP3^7%T*Z{qQ3$N+jJ6a(iQQcx z;DE^vNu;jp19A2~ujX|%`=b|s{TnZQJ|{AG-GmUePy5Tf*UVt%RXbTOR#h_vFytQ2 z?!ni3&>~{lTuZAfp(y?mARJM5Sj~?XP179Y1B%o%^?d(mtC__nBu#}isjjQ7U3&JF zXP$rUh3x39L+z`s_lXZW{NW2vR#bQ0QrS>bw;GtjbbIp6*PeRn#jggTX4S`iWhGcWRLKyEL!Ms{>~w7a{#SS%(NwxRya)o<)~*T3>J zzpuHEmGr4oHg%UACzCqcFgw#89NhZK3ttjYw_14%BZLsN@O#14&EZ5~F6>LOPiYpJ zh22X7&^_1#{7wMyb~8oIw z#{cJ$2Y&mJhu-(tyWW3(_kmg1s^esVVZJn`O@6ND*L}Oidvf9Gc$p8m z{r_Te9#yS3FE76GJ7IZ~11umjBRQ9-ixSk&S84GFp9T%6XXus)UO)fjEbU+Wjh~x* z^N*&FzrX$H$ME=j(Qbhv)N$oCy!1S-Jpc6Pe>L5F>5*v&btYDI7&mfM z0&7CcJ0lpzsl~vY-2&V8h21?(4k?)zr7^C;nh8E-n>EpLo<_>UVV?%6tHg+a6#h_! zQ_-klhrpL-c6Yk88q&%KW1@v)` z1RNZ#nwBe~Z35|%lb$yy(`qnXX@~$xRu(K!!$sRjQ}NAZ*G{OJw9Dl(NUUQZ$LjEq7|nFLSS;!@ zZ3N{$G1CCokR^I=T@~W2st>OnHj}D5S`0a#xwzf;UD7mZ+GXDlgP%FGyX?EX%G2qj zTkIw6BSiTW+Tr{Q)|wpz+~V;!@S{=-&mo{cQ_oYzH92B+&}fgACNuCUghK=1a*ZV z3JuzWS1GSVh#P`;Ra*~zHbXablez&?GYdU0U%vW#S8hD>d`3ia-$nMRbwRk#76_I-un3VR6=5}-cv`&n z!gIg$nn#I&Cs}2AI0?gqM6W&f+RM*&Pkv^Ou;`pQY)z)RT+C9xMg4Yn>r5jJX<{5L zEY@&`6U4@DXgG{?l%gePm;pvsXo3jDL9$^#5%1iG*+o!YSk~xUtj`f3N)hRM_=CrJdS2_cZWC}oy!$D!_A|=dbs47 z&Z>OLUo!1#asrtHp*Cppt}2w=Mr!m&-*^^eKk$Pe|EZt)%L>Z?3@=}Pty`@gdE}wG ztsZ;qvA_Fw|L!mhpZUyZzVel?eDaf@{7%34@7Tx!ROqMv=HL9AANtUTUVi0rm%2dQ za7ZZ)0%i^=?`~~B@%XzZ_uuyo&xeaca6qh=-7-`y8TPs)@w^Z|wK&RC|B-3K%U3F$ z1LiQL5&u#ab$x>`qYiiP`(8wLw|6^t)hr@a72Vy;=8O5&t5=6%h%v?(lX_(F?Cw4W z03|CqUo~}{OtuaWZr1hWmp=8mn>XM8gWvo9>CSGAF4px!4?I8!SFc{LoYk$G%`$w* zDMs0vZr4WIC#@$#e;5M0B_`XNRdtMeIg9XYdu!*+?A+GQw4Ivr{=s~eNkoi2RHEdI zZjsYa#o$Uo?l#J01aZv(K{Ghgh24%Uk;JvL!)x`D0tCuA_k(X$A*CEdq^edr#HR9L zAmWlmH9(!Hp3tyK*=5wGrTT)3|%mlu{0yMZ`gU*Hulc zs>`&LKuujOmPd6RI252H4>^Sp>N+mFl?baPXAa^d#(@-t1Q z=Eyn2d$Yc&Td8Qs3yDI^1gL67L8R$cD}rzph`8_jX**4tU7bULZdz4S6Qe8UN5d?% z_uuy@Kq>bz)XWU?>^VsIfsg&rzxwr`>pjIYY`w=FST1vd(G|Jx z5(k-0X3OOgfO@8ysHW9wX=dln?^>Uhi=(Cj$d8uGs*0;s&(1rOCJLHY_B}$+9CK&6kt9UJR?PogMD`8;AR|*>)Af&Aq+pR#Q-0 zN;yVO*^~{;#-yd-5_Fx z$PpY!1BKv$xSh5A3PEVO(#3qfwcXTBJ#<}SIBD`#43u+6B(B8FvDTEbA`>%-kdHa< zy^iV_kiHq*zx??2j)E- zOm^oN&5uK&@dIqgz17lMzibI^0{{~4m4st3C72ihR$?^=*)Zg(R4omZ4A}s1G?>FO z;&85JU+%fPIjfWQtnkUC&8vAsxgvS>+WgGUY-c*nsaH#&%xl7IBN!RzSPa2z|G5_eiMgdL;){RShdmtL4sC)ih|D z`o8jtKl58(dhO<7|7h4bcVV`5uC1G+#XNOM1tA0w z@tSHW##p@nVHiY?xpxX3rvc95s9b8G^mGe|%+n37p4@uRa#4BfKhjnYEx%dyb7ExX z0hZtrf@Y0QP>SHid>@n^d;B3_Ab7Bl`uwv$^UrSGy7gcFm;c2R@BS_#noK4SKKP)B ztX8Y<^n3q~t%)_5-MygB-t(UKyyrddDLDj;D02f$#$UMu0-*}zglvSkmDPeLAp>YX zPQO4OIOw;sKKo-WJ>;)Q-y4I3+{j&n6B89?!`B-ThGAglbLY;j4zIzzuIpjwONdgn z&GP2ey}iAZ(v4dOec!8^>iB9F{uDUnoP%&msbYlKGPf_hcs0iO=(`?y;=!Gv%eVIC z%jNTzF5W+x&8DF;%affc$1tDIx3{;?pSy4Mz-qC7lv0wKSN;5`JLprlHSx1&ws+eW z9HfmBXd0_&)gJ9H#IC=5?N-4Asw!Lq&_uF41PdTpxBb5P2V=}Ub^<`LHF@AYk9W_# zg5Jcz%y2`35J#5m7OILOEIC0`$=D>soHH@pji{t8oB&YD@XUY+Gjk(@8&}e6pJ9do za;}iwDJzk=p^!KkDcmIxo0;awh%MAo6-imN^kBmS+{w&IQ)(?ok>TjDCUC`x%mH;P zN+NKUNNSmYDFGZ;#*3slxBb2!{(c}sOvrLhTo@+QAk)Vl|M-*7{NCdFd^JCqO{aZc zrL+uEd)C>c2B(~pu%x8$&{TCw2_S;RC~gCjIYG_ct*XS#hyn~m6xab@F7_Q7Y7D~w zi&hFONrQ+goCqEi0K|Q;>_lviwvI#$<0dqq1kQ$)xj85mkS(0pjRt_LT09xM1tubp zdC^5q{Qyfbl3I4-q*cV$dmjJTrP*VQ2qr+83Fqq4>I*sB{P4gAo3<@13&(l4Ty|+| ztIavjS96##L$is<_V%<}bR-s=8kE%rFB*}oy$&FT0%|d$Uo9t%0A^x)-JUaHCoE_| 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 z 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

-A*d}}yJKXn#nj^?Qc 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

#7( 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�=(t@JQ$kQH!69+kR+vhoQ*KQ_s!uDE|kpuU`p`&;yD6}KeQFXHj6%-0E zAVY8t7uT5kwf}|Lw3$__*FLQGw;NJ;clY6=H*L|C3)A|qbP+06kC zFwZ>p+Z@$RGRa0Zat`NkHfOV%)#%eR?$euy$09Dg@IrR%*zo{;L=XgQ*s$RdKetxv z+xMXhg5XpZM6=oC!V52aOkKCH7W==u_@CcMDB$-V;Rd2Q563Xg$n%`0(BLIFQSr51 zwGG2sy!Hs2qkTZB1**v4{zGhExq=gW?&RJ*J2|lB940P#0;3z&({8OGNJ46{#yO3m zL}VGub92lcJ;2dBZ{*MoUuGoq{M3p`T5~6$J4;V^wAQHQ;~47*oWLoC#Zjt=&?$=k zB674-g^%?IpgoxqlnA2EDAG#Ue=9^|K!ma>$w~W6qyyK2&LI1fOaK5N07*naR3cF_ z#f%$}96W$sT4FeawP&s6(n~L4>A*gA9=(yU(_(b(dQ5)+t%z`JEv4_XsW#3$-PC$m|xT(!^MpC7hJ*As-GgzmLf~p|Ha$cd-t7OaLL829vx+M zr_Ga}a5bO1`R+^6Z!V0-w9_77pBhoRQHn zEFK{hCe83tprRUH2}(*bH>748xRXBl)>hXnj6#%DCuwZZYBV@DGsg|b=UKn;Y;L;w z2L9~LZ((|VnH3v1vXtjs@%ZgL@4x;A+qRw0m)5MJx#LEHonPW89%~If5fHQ+L_vd| z&rwRCOia`WC<_bL5ek7*9$l2kFu|`FV|Zv9CmbqF&@>p&QvT+RuV->BW^1#~_^J-A zMvTk5^b3P81;hJxA?yiOtX>apz`&&>MFK-d;R-a0e2^i$V5#3{(YA4`H_=HVW)B@= zWbGP+mW-}jM<;AEy?a*`+`O=i?z9Pr2xH06Sr7srJA?&F3!@Xz8Lg~QkIq0?qc*k< z^S(bKx@9~5$6iJGu}>3S)*}oxeEg#@KEZOHL7vlp=MweK811t+L1w`PkYpeevOyQ& z3~3I@^c)*&EjG5=+;i|acklZL_9b<~_6Q?u#)w*VgqM`Vlx(?AIe&trESac{aJ7yY zUz~?Md!SchY68lF(8u`HBSKX*LJkN{a(JAnHi$x?gNHw=`H4yO_}BnGI{fZYoGu8f zAi3{{9Ek5+;iy@E^5ZEy<@7J)bQ5tJ-zuUg;?hemW#`VF-?r`R_cA)24i{c{AyE`P z=3d*AYgH)RA1{C7{D^Oc?O{b>Iy-#iUyo9Xq}?G10<=EaM4&4_dnLeCdI(`9cmvuJ zSb-BYoEoAJ&oVjEV{)v+{N4lX-F-VJ>Z9244#8LxRj(sUk258`g=J3Mdw^t+vRWkk z@W=$6VHc*4;1;_SIzfpNoWj}?8HJQiRGjxbMVAE%L7+9Zy9Bk-iZA6I@x)5p@*?DY ze4`0j1V(_)tJfkTFauc3VcU9O1#>8ZW~5xwAJ*b zAP$;@?EpuY?ui53cEbtUjT#HP_p!RuAvAMn588T!iV%UrrUj*z=tN=q1Ed)xOlr9P zEG*5St-}-Gq{C(d5*e^Kb3Z|*IJW6*mVWpdJZ^M?GuCfn+t#g2Y&n}hedAj=x_1xV za3z2L@oN#H$=Y?BC|ycASVrgo9VQI&0%af$0t%a>rNos6V=aN!l%^n#63U{a$P1Lx z1j?~gmPGX$m0u>Vwdfu_#=WFvC}n}S;DeZS zagicuP#VdhWAk+TCC7JsnH3YOsn_Z(FWk<}@4K7nZkOeHjov~JTlWx$)N~CD2pd4? zVe=M{5&OP!gs>K~Zslq?ehdoGYd1pPgTMMif*-yHjvs}4@4%e1joxsMIBZiiOB&54 ztt5dSplT2=0ZoctjxTb&)<`SJOONO-6J{yrwmO`vHL3F~r8&#H4^nuCMG!{;v2;x7 zkjN?I(RrBfLE58Cs2b+7q~=4A5*L(}$lYl~3|Lt?Pg##EElMez4j!@l+%xLc<6sH5 zybf-H3bxD6^Nx} z6~x9@Hxi zRuhIjIKGG<^eLUi1sWy8iWVXas2aiw0^!NCF0qUemdf!ZC=fn^tP6yoG$va@c}G!{ zMBxy83~m7m2c`yD2?-D-aBx591}Kk^l>?CWnnAzI!og{J?R$v#9c1j%i*Z4dnb~7# zUf@RC$T|1#Y&V1Nl`q(0kS{+pmP`-M;897-shwOHp6Qek^JA~BeTq{tm2 zh>$~zu@)=qCkw_mHAe2S8} z=~=qN9(5%!B0!gdP(mpzP>@-RP$AiJPFc<|F)>M=XUv^gV03JZMx#NRW>{-Tl_x-= zrDfP(q?;SYY7u8#eKpg2_w%Y3KAV^P(ysy%YfF|Ej?-|!I?z-=ENkcx`#Po zQv#h}vIQa$QHG$3ATzoZH|2150f!ANpB!toWwo`~8dgDak3d ziPD-x31m@#Epe1cPeq9Ua0aVAQV2v|LQ=65}$I3b3w*a}gdxn2bSQ zR3gsB0ZJ>B5LJU=%c`JK4ltkvlm=8COc%-?=!C=?e2_!wn0W3B*mS~ByZKgDBpNe5 zfoKM_h5;w$`;^&$Vwf-zH;B|EnGr;?Mp;-=H$*8(pz9DSA{)``b!n{INNr?{e5uRf zql_uhIRlRq#?@Cf81J$F4(2Er?=CU^PAIiIpY}BDxMr5h9Hv(9kb>Y(8^6ljCjL?GYM{1`7*a zZocVO=4NMU)EbzqsOV>jAQp}?H8gb0+#q9d&td+{_H+4}SG)p`WVkrX(XZ?VZTQNU zcOeFjd)JQf=W{c>FdxzhI^<(xh~ozkYuC`!G3nt01aZ}ghgyM8al#Qs3S%8{T*nGY z5DW=iNVIxA+o#sCC0nH7AXPPxf>tYHXe5bHXzK}37^lg+C2;|{^axSufV@pW1mu(` zmlNhOxwj}=;Du*yW}2|sq2VprT%Sa0E?hammY;q(nJj2;+``7su7x+gmT2SI5P2vg z81#Ajb-VbOfvd-AbW6+c>{()K?GDaA<1831LX<)$0vm!dWD9+qQ20WF>CqUUtaKGV zfS|yoIqA@&R0*Pn_Yz?orFRJDNJN68i|dDYA5i)Nl@GAlB7q1{MF66t3{;hxu0o8E zC|5NsP~w!vl|!_Zc(3q;cx_OwsG1&UKn36(LQ5zO;y*O+KaIyaPHQ4g<8%}89m3Sq z6jM`E9654?BS(%rswhsKPKPyX);y|nApWzsEdJhX5WW?JBTcl{r0EHwd_WR}NE3hv zK;>XnrHyb3M`f*QeTnb}D-ELAA{_K!IL%-&MU);R!5d2%NW#J~EP!oi_jmMFrqlhDYN|O>vL0KO`X9INFCrg@y2!zc*34+|KisEBi@rLB`dV!;Vw~Qehy{)FNO|FtTYY=bxJp-mYjKo@T~6WNC4= z7UNbS>rDo>BuXMkBAhdLDM@{S4q~K~6iVSsi;`W8m5Am9-ow5lM>zBRvk2=oruWTp z&ieH<-GF%MICtHCD_5^w!-~!neIXG-V4NYej=*{{C6N+*V39#YK#7;0Vqnnq9B(Yv z!nDg-=t)*4DMJ_X#={F7UAdl(s{%g$@sIL^pLiA{?U47s`z_QW$rrzLFT3tJOuaKf zVRIxJT@Q#eOX>y$QAk6`s?anA{j|sU_y|Arq$_D8g5h#Os}pecS(CI!Vm|gSpCUB{ zalL^z1qg*CKr4y&j&{99e>mXg`|jtuk9>rcE60(Arq*e&ch}wg%g3%~e8nikH08E3 zVDj9@@q)1lCU)HjjTU-rj9_UQ+m3K5BETaWA;NmJ2oN&CxgOp-G)-(PCOAIFi;4`KvR^^^dQ3k zSyUxdwwyswKw_$`nysi%!}&QxIYjC@fk|o9I}iXW1q){AvBnYLv1o7x?Ho>38wOv9 zDv8`dnx{lTjKX21Ly9`yLmpa$lqXG*4S0|uKnSqDM4^$wBSfWpaKfT|UTrK-mWL36 zcOX1c29(wzi}Lgz`_uTYxig(O`SGA7>;YFo`P<3F4R1z2BUa{DY6jj!xpECL}dnt5$KbYZ0p6B=rJS78Ewa9a$p%$lsxE z`xJ@0pZd%QQL}xrFlnHi!rB5Fb-YQ@B4DTl%Jr})M6(5p-HKvW8z=K!w6q8*(78S7 zdQ+!;Dl!> za3FHL2P*_o6yd!<>j;gYbR}6SKpI9zC%EU%dpW)|%l325V>&ucZDoWQ6l6=wOoW01 zCS&iu`#82RtZX%P18Zj~afB+S?!XyKS3nRL=qZY*jZJo{Ogn|BfPx-6MKANYem=IO6`AvfQ0D|g)6r{0cfubjeKi!UYCdP-m5F<3Ol zIl=(EbC}YxcI{d&yX1UKIb>)gQKC6?|6$srV{G2MmLGiL{2&| z+zM)8M3D~3dObSL7Dh_~QGyhB8ITEs@}PZ$6Ap7yuY*nSVu?T$1Ue>ZHkdUT&KGDc zF{vZYG-Z@izW)>Og9T=N2YYm`N_^HQ^H^K}ts1|4#kt&j^F4g=_%a^&uN}puXKy&U z(ri{1%R-XP%~IrjlxpMilvX`}Mjdhks)Z{IKJVj{f=E}QZNLQ{CmcA55)$RBO{35e z-g~SBWQaJKG#%Q4T!e();ibn(UD?n&htv}1EY1L0pphtRPc{syqB}}az2}swXpw;; zYBed^DrF3L%Gk^>o7J3Yu3P)EwFt%tX%nszm$5te!4h6 zjfZCw5hu8Q59L7wVKuQ=0$&y<3;M9yNMP|Is%T4;h~7L4vpw=3dN%H-ev#Vw=hK!| zksvGCL^a7g8HOmJDk!7?99$ylKJzIIZ{Nw{{(W?>zn1z+GVgLWL_vZ0-RrUG*d#$y{Gu(6M+?$(`kc1=83G{*kmM#ecOK5X zhc$fv*jFeOFty--eD3SKUiX}R&R*-Bz4qSgS)b?mJaxL|9#pqW62z3Irh)Lz_VFmL z1zA=&IjabaUuY(bf*ev6(7a&>V$V&qY9+c_aKyk0bbArwEDMb#$~`>R+8lzMhQX{p%<1A11kvp7&Ez-dZotXVuO0F=?{D&9rLeN@$3(NmPelS zaK3x-#eC)i|3pJOF1hjt{N&&i>rQwCeZv7l26FW_*unR%_)iYbc33;q%c)N~lNY`Iuh_KtXsk)O`imFfKkY0c zqtRDfM7=j93Lr)lm8g^<&ow0#;Hezp8H@^%!bgb|otMZ0&B9HrQAjz8qL4ZQBqHh?bB%L&;CkPR- zBwsT|bIn!)=P|VQ7~Ixzxb+&4t3Vhq8k%)Vn^y6u(IIZ!e~4;rko8B5!rXpnPlG>< z!za@Yl^Z++GBw1d5D^++8ThA7k|f8d0{94F!5M^-XkQ_;PhbO_vRDj;6ekS6bs!a1 zIIt-O9}&a^SU}-~LCB(Lvqd7DKuCk6@RV^@7lx-&Ef-=~Rw>Knq72%A=cB3>{OC7# zPdljL^DVfr{lDMWgee~1PVRc`S!H-`1y((@q!Yl}NsF}(&nUF8 z1$dAinJ|QSRF$IV#1r6z6KFl_kD2+_cUXGMtLdNKOV8?~acT28Qq?U6>B!J zFjGf}4na@?8{u+;_A;WXPbahF*5Rq5vW};G8jS{FAQ&8~p`=AwM^_u#4MSyR4_=bd zu4~GJG1Xd(l8R`#GMimCq;sYaefRYAkY_o*ACOA;(s!@qv{N5NZ*7Rx>xTK8559-6 z)DKu1twpLe!8gBhIa9aq;n}4!QM=0>T2XC#l$}7AG$=*rJYtujy$t0?NY_T7k*OvA z!KG}h&v8gqIXFAVT(zI7l%O18pq4c)AcQ0GEXs8NNy$07E+Np4$axqqKnO(}jr1KV zYvG)rl_j)i57E;%Ku;;a7a8+8nBEoiZ9Wz^Kh4Txx1nzS5iGP|K!FJh3X%j4&B9=X z?Wb-pvVXIa(9I#PfN*q88x|X+LZGZ5>XS%6UVcxA$y+2z2egmWUcr>oK2`{X&QOK| zOsf;sO+*#+{a~`+=YuiW_;pSV+hyCR5IgjcSo=m04 zFOYRpq%&w=;R^+MMy3?PDwOchQsX2D5h9$#w+>-45^ae^nN($zy_h4O@Mz|byOR3( z=TraE2N)jhBl3OHAi%d4lVybgUe-bO3>2koIxSE!URRK=SWVbn!b>d#F^II7Jb4PV zTV53vp#5cygogfAaKu*l@%Qj|?x3@2Jy9i~duWl;={+ni%~J6qyr6{E8DSVR*KM*e zKVF!OS%dFYkoZMqTq*HYi6mV_+K5AY_pyIE=dmw1gB8OoSUENdS%doc0mdihC~w-p zs@1Cr`l@tHf>cH3G#3`3^TO!Q7__y>un;(#q(iqMn8VO+H(BL{sB%C5+-xzmWgRct zems*C`xqTuNx8S5ts9Qw=`Z|KKKbEK(atq-oF+9;ih2;zBkl>2sUgoDON(_%<(P^VEG;&$RuhB)Qb~+1vJk>Lth0DZ;V*jy zBswKly^O9(xnu7XwG|`0;8icD9QWg#Vb@JJU}g_6wRe(leDe|xxsYslj2Cwn8SS>% zF9ljCWVcJG1RdKT^(|o@qxC#imvFX4t=z-(p$3!f8*op45|gK#Nw_dcYq3ry49&@X z^ao{1r3y>gJYjbZPg^{#Fw#&m2~NaFmm<2e7!?o-iPBBd#aX(Gvv@uIL{UJs9HNaO z&obt{3jNZfuN-mx&4>8nbDzg6^CkLL4UuOlepm*PLoN#%(A+%COoLVsL=Y+vWtvF` z*=~>-ftM=6-Vo*c%OzAxxOSUP(!~=IdDX|$DI(3lmk1@0CRm=#IkeLVD^RkGCc_sN zj3tyQqFe#W;JLy}#S_Hc5_B?1THp+MpfH|C=zPr2xl+rCe&-y*I^>;{CRqSpEgo;}gD01MzweJ0%Ln+tua&-ZIB_|bQ>V@=dF4Yu;`bIr zeEj2Z#T5^18{^~fzW2cyXTVEe`p{8+DDI3~vtP|8VxNY0)#0-4Z;wyJ@YqVG_ciFY zlI2x;g;j+h7Ne_0sTpe0F#Ycr^0Q-3 zXLDbTym^pXw~ZI9q1jIH$cUnl2uYr5oOTE+@uVu|U7kQ&i$kDPKpgecZY<%eDkp3^ zhLKe(=?P<`Cy?3_ijbwTRqUxRvAx+r4`~{WCWA)etR+VxB85%BOEp?ajLmRaimuey z*Up&jSjM6%skMBh+vdhN7Gvu)c(X6ELoR;$Eug?fD+Kk(5u zCv(v4rnFiuq*Rp4C8UFP(!p9oxl|@?cR@*1=HdG-6cuJoi$i-Sx$WkgId02F?$|fZ zfqnbgvTXz3{kN|$H{Id5Q?_x%feD;-yk=mCBN`3nvjoo%F{VY??;-aD#%fA=NLy$; zJbFXNb&H0JkKVuwPd$Z|2gW(DGiRmH4EK$YmwPFD0oEqWE=Fxru(5*wG1-7dZb zONjA6dJ>arJXPp;oKQ$V#Fz}{GGdoNsRnV4ZYNj0M~F0pXSrNm=`}Zq4~W65lc&O{`tQeb?H}LTDYRnSiJhx zuSZ%CD9W27HookSV|u|prYmAR9ifcKt{GFpnrb(ai* zqNo;Rm4~t#f2j_$vvj8JV5!w0oth+CC41MoxXA(BSVA8 zz@weE=;nsXG25u+hBViVtXaeQ4V&oh+CyG-c%6u>k)u2h?KCz6BPBK{v8P^VwlmNA z${0w&$GS`0R377$6SuPas-N(0pZ^lCedlr9bkk3{?S@;~IdO;`x9*_Fi*e-;r&Aiu zHckiv8DjhsqPyu35!R1O0fR zM$bV@So+I8%rAnS02f0jpe6WJZzd#5&|j%IM1+iX^Go>M}E>N^lUha($FZP z98-}VsfNYoA_pc9pl`X3c<&t?wPFP;REV0JN9A2o3`+WimkAWYZ0kU|f)?pHFb1V_ zNE57l;O}47!J8Hzc>2=e#D#5GwD69;-#;L66;~Y=g=zMxS$_JepWgX={}=Z2^zo-7 z4&w*Y9nFrn?qJV{_F&q-ct@W2$^<*k*})0#KY=c&0TD|}aPGPH zKYi(NV%M&s?Ki&h0RPAWolb{Nr^D3L)Sa)bS+j<9>(>2V2*JPE zDQ-~r%jBKA_Vt?t5=u&()`%#;>!}rDNGp+129bvypI~Y8X>i_07>XlwQpd@dSX+of zz(bJHy6ht6zVLBo`pVF^mTYVdgM*`pBe&oykEBtjS)XNm-_6uN`!R<4M%Z%3>GU4^ zNWyJfA*#`e1?426nYHnRVW8SebpAha;5C|cS6xmpI*8RFHqA(7hF`80RFI^NkPFz{ zLwTUJCdfKPnOad)s=?T09fS{a(?xb9%AwYWod?mHB^+5tdGk63jyZ;!wXEKL0>i^& z}u(nI)dz6f1Avf&LHO*F+BTEA` zbcajj3LgEYH}JHcn2X;3N!p>MwdWB3_`27!+~XvNS{Z9>^5kk;GvQDGj1rA`Kj0`_4}=ryC}w z4)LjXy$@IM7#yha#6Nu@FaFDyF*|*T*Szj;IcLvJym|FX*3CAVkOI|M0w6^aU@_Li z(7~B9jigR*$>)rxoW<;IHxu>lW3ij?jjvq5%2jI#WI%Ojh=)Dx1vqE<$m?IhPrvqc z&K?NSQZ{^5!TTlv+ z5nf3V=P8;PPg>~I$!it-Gyb5UF4gCuT7uD0++v&Y9XF!i_HHT$B^ZDEOE zdJ?3-gdW0*yQoag6+RKBaFcgQimx5jFn++VXYZ;1b^wSw*C4ylC*gIy{NBU@3x_SD z-gm*iyFKqtbeaCnG$UvHa=)qTUwb{bedM+~pI0|miN|7+sf5NYjbi+E4L|;~ALIA> ztab2mcJADHx5@eMN{o+> zGd@1f$jAs=wrnAaq6g(5zcni|5chYSvsj3)e^b<^*@bzmC+O{4L#e+8OBoDWkV7yt z$^6JV#Ctx>Xk4b7xA2JYY>p|F!5X}MyV&=Me`c~X&%mF(g06QR6TIVHJmyJHWZ>*qQa@=LNLJzV($YjRSZBdjEf%KYGm zH!?mk$JV1aP-!NFLBQnXB)8nUk5%jk2l$5Wa_Xjvy+G1Hs|)6q8y60!K>H z%`w(dtMy>3RlfbBn+d{@_^55PZ`;k94QqJa+y8+eD$&zF%Ddn4x4iD%=kZTFckzlI zpOLO)Mmv0AkV;`l5xK%Cg|jJr)lm-Iyp!G6U5TEV;kLbp$TH22dKc$kj}VIO$DPPY zX`6|O1AO8~*E2YqVWlHzmS~WmqZ~y@m|AM9%1pIeeDAv#F@P4&m9a<*X+^h5nv?tjSc_ z>3{g6*?iKY+5OY+bJ>?Z!4_-SUar9S0hI18S9S|Pbe7L|QJi}Y^0oF?!E<3cXKwI`SUwe;2mlnBezEBk>tNb9f7BsbTy}<97mp=B~nQcmHSi9~Ow{ zPIeKV;E0zV!RFU&re{;no!h3qHN_8~|3lL0^iIIB`kAZmF~jj0KEtbd^+PlH-(U#$ zK=W*V9U2JW!UG5R*V}LBXN!w0<~c`ItK9J9C*S=|_p?S~Vq$_DZ@lqAGZ?mS-_F?B z*n@76pFR6O*FYR@92>yLhJG{OYkJRaOxhr*1yp}{Dd9&yk1NNBPR4vHXn*ocjBQwp z$?`&zkQ>rcl`@vjzr2rKxBQUs$_lH~~pZ~Q4)t4Xi)$vn%36(ek@^)hb{;m>r@D@O2YF%`dt z8d=573ky`%ZQ`^u&I0EZ)*CM4o1geNAN~9DV6cy}FECk7SH(PTMK6CccZdTE2QlFQ zBPyY06pK=D%iImS{NA0!dMR_vDT8ODPa(jW+}C5 zg(wQimd5$(x1YpBWG-ON|7lEfEk6S2=mGk2Af5W}`tSBC;$) zDMc*|=&SW}St9xJjl1agVe_hCyf`MwB*J#^5oCEz6iHkhQ|lY$q`n>=(VZr%cgX`E zl_zu-rtyT2SLwyJmYAp;%3uEu8;(Dbj_KkOjgS_MBQDp_La^_$Z=wG3PZ&NTqCE}z zwQpzm1usSd8q4ArKaP6a>!_^R1Zfu+Yf9yQnhn7PBV``;`ge2E)?+c`G#2KIjFS>5 zK%r4m0uiY%5UmcD3@IX%C-BM@qM%HxImwUy_5D$DDAF+rK{Y;IG;=&GcbU$PfI-0e9o1Ampa?35hwbZ3wHEz7| zMwXVA*t&J=vat4dKfc_$Zvc_c&9L;%i)mha75UV}U8`KjKZ1d0zJOr#zCqOuS<%LC zqH0s7JLq~7sw+stG9eD(GU}}<(sz8GH5=ApodgVC4mvJT&JA;)`7qb-xSB0*K98}X zbs#m3R-Fim_A){nVN9_SZEy%Du})(<8JWp3#u8WhIOXKWu=<~m;F}+KFB9)Sk3YQQ zcI+Gep3sj;(`@ zsxqNg1Qkn22^U$yz~Oi5OgCmgE3^|RZBc{$NE4BHmZaV#e&>f+cl-%xogs4Y!!k~R za+0(?k5{R&@yy4w=hGK6`?43oq1y>YMvzt@bek|Ji7!E?ZJbaDBAgIpP9sD{XaiE;qOGIH3$QqHonVrbO3w-&|EhOz z&A)$)>#n+jhi}{pyMBf-5h_q1mZt=!028fti>#Y4(*M9wM&4V$mx=1zUd!wSAGz~+ zbi`)-(J}IwDUv<66!+q!%f8qD8LHMx|5KlRkNY`v{@a;&&pFGeL(=o8Glj+n^y~jSD`ygk{T*4)X{obEbnS#N9kuyhF^CxTA{l4Ak zre@-z3D*AU+WY+c$P?~6TQT;GF=QmM%euJs-uAtMh)cNSA(8ci7DRmc%MbV$xORS? zxBfQ(vAJ619ox6xd!POnAi_Dv_19njJ4s(UoERS;C(AO9JMOp#1(5i+dr6U-PMd@O z@HfnU_Fr&W`U~5azVTHi-g6GC|Moqsc*!e&X&b)@5MgtRc7`zO!MX}4pKM~1^v~bK z(BmG1a|V;OQ5tMi!WWvw_q~jF` zm<}4NJ8TvnbeHIU?dvp^#PbDJ?Lb=|6-jao(flk`p-9>Z^|>aUP3!QZQSxtJf*tVj zOoW=6X1dkni+-Dlp`+N?U*)1teT6MYpF}=9%qQRZc23;7m0dgbb7+1B&-d_!B=4pq zNkZsiqBz7k(9R;YD;%XMs#bM79fXhs%EP1@YaL-ZCh2yI(yvm{?Q~I6;ROzI$L!J) zzNaXcBZPuZE1^=Up*%&N=NN6U*5Z3U;0gh{bL2Wl=bAV!085r-_`Z*)6iJ#A1_51_ z;TywEyYJv%|K(qqpO|LbhC!bCyyx<>AN`ac{_rZ+Z#bT@z;SyV@sEow-VhBklx0jh zaJ2E$5;l}9COPf#31Ux?Q^IA743MK`Ox{$4a~<;7BlTkPB*p9PCm0N|GnQaB$Lr}5 zw9^W;Jis*t6{oN2p{k{=Lx9*Hm{(okte*r0?j4M`yBI7dlJyr6<}8lu9< z*;YJi(qk?i!#m{>%g8=Ol*;7I4&Lk}a(D${xu0$)#YK*dk35+}pZo&*|N7;uj>;$j zsgnfGVDlWWQbGo0VqxjbH~8A{N=|>*yBMnu(5){3ijwEi)nEc2?JORSvR_8aqM{NA zd=Y@~(Vi&$P>hdI5uIk8Qnimq{PF+KHA#o-Z@Yox+8a@a#=(XZrW1u}B~BujL4JL4 zky3pBYv&H?d)GnaGn1e^hMx0MM*i$IL`Q78b6frU-{Ou}JRdzbeJ9}Pd&)Br|E*X^ z>-rxvao*n*lb!w{HhuO|%G*!8TejnlmpzB2Z~iA{X`b=FeI*+|dC@PfKX!}0K3EOu zH2SdpAku}D$x9{ySpCe^NKdlvx$D^dzTI~Mj9&&Kepv`9h=wCN;~fB0>E6>omvcEU z;01U*0`xOo8Zn@=_!vYX_ zp7Vnr{NPT&p|z&Bx0g+uHgW2yr?P6*s>5!xUaxb_HP>+Kt+%qUuz@L=_`?soy{V}wZn@PhU0P1{Xd1oGS5)Ll9kH@PSCpKE8M*IXKa7>1@y#yG+GN(y%>kWi7pBc z1BDrtr|`Y7&}!?#-PV&H#u~Ji;4DH&S_{*}{r&v$>)*x&*75BxU&I+vFWzfjPac&~ zX@fkM)O8U?A}GzOp#+N zkk+D`Ev#Q=Lf6SU8F3I{v?K_sC=|ZeBKFI4GM|0zCJsZ;0*6m1Jo0>+M6@Zn_0;#> zM*jH6)BnPka?+t`zI(yH(V5y^2Dd{*{@#4 zIXC@?xAgb1qBYA*DzQS4DT8$x9T~8w6xGGFsN`fj__-qR0y4kwOb7=;(#aNMQej(~ zu#%C=7~xy|SRh;vncv1w`!PX=6B4NvzF#e>L8X$BI7F+Qk{2VS!w+Kc&9byX71fSi zK;g-t3#y$?8R@H1k0UGsSt_9pO%Z+ML$tno5shQE6Tj<&lq&tCSqtTbjGpi?;;(%d z>A)l{a!;XzLh1x-1fgv}*vo&IE?fWRTvk;E$Quou5_kldJjHj8(5v8A`U=5!mXK?M zCp7pTwlaj@ZIYx3o(xHr7Kke~R9vCmnxj$~WZScz&($A0$aF`sVty9Liti}|ECW=f zJd80sP@Lz_x9)x0@QYr?*k8Y$(oskM!nWFJk7wPvAK|vM|ERd%9U7;z<7amR2mq5G zcn7#*hOqvU1B-3}0{++kn!jAggbD^)_vV}(s4E*xG{R$vrVq)U3C`{L1e?8}&cOLWe^S`j|>Z`Bj zQ=j@2r=4~huY29=Q0m?hcB|FmbD#Sh7hinwo&5B>A@IvDM+m`br=7-2Uh)!#hVCNg z&&|#8+0TCV&g{bf1VsG&GrhgNztb9ttJC`cdDDkbz5T3w^*Idv>Hk4hs&}o*EG@G8 z`A?#K{k6q$f8X2g6GZ&HtzWyVwJ*{035y5D>C>;8kLR1G3szTCkAYF!Vl3YM2 z6sgKtSeR$1e}q4H`K$T-#0+bG{2ex4x{>l9z5pXbFhxeAf5S>{oy zafv>c<8;nY6rsE_Q%Q?VD3le{Z{LftmM9uvX5S%t9(Ni8?|BcK)*Q`=4%UyY;=ONt zBO!e&OGx`Y}>YtPHUbxtYDBl0td?rU&QgMWnzXwaSdTDPNa+!V2|>9;rP52G50-2AqiaoREd#c?*ha?`KepT+AIv8i1K zdWzb%+Ar<@Lm=We6Az40z~tlu?gw#mz0SEici!!_?X?oO8}OcLIpv;b9*4xX1CtCq9v5jydK|Z-(!G|NBf#+&lW8o}T7auX+_1U3Af% z0HRzjvvK1_wr<^eCtz^S@xAYTkJrBTwHRaW*WdWY8*d~@lHb|Eee->2Ax2;EH*Ej@ zZbn}Es=EOQ0I#=?b?^Gq#{FTi^WG8OH}Q_k3CFtp8CWc96EH6$@w~m78aSF zIYg^5M=1>ON)?nWRx2}Mkyc`ry{7;GAOJ~3K~&-i%iQcF{k2g}eeQGlq1JT1_AQv7 zAn^+tj>!y>6__VImHF`lFuM=3E_6GE0J!8~Wq|P=2m`4pG7!EiM4xE}xrV+9I`?Q? zdlhEp0LoeNmL<(%Ox8i5(R68ON5dp&XEAXzg%cT}7I-;?riGU-qRkQ_ z=#r8nvPD8;Nlh2+OPupCS;|Cvfq5N~8A;Y^Qu91U<0_#wq!_%Y2T?22<6EY>UA`Oj zu+VHUH?tdu;mot1!TT@#I;$S@IQox2hJ0)t2ktn4*H^+*72=+dW|EK^O%#S`XAu%S z&%+ZEWgQY9ojcmCE=!9`%rDH7CJEKJ#Hv-JtX;E$lTSL1CqMo%JoPDO@Wdya$|E0n zJlnQyrnlNd7bmobCLmUg9@{~uj@yInyO-~|Kah>u!k01yTLg1WRb~m<^ z!T@V6))q7;rBrd8jX|e|hHlca7EecLE16!H=Cmg~h5ijkFtVYaSDgDUhDO&gvSvLi zhlhCHnU5pbvW>Sk>NKR!Kq#@!At~WiBC1}7Jurz*r!bWYx>BLzN7QY^Vx^avN0qVhwsl8v+>_1%B)Z+jN*`k~jLivZHA35A zde;riF17J$W2{)eg_RpO)4TEr{QeQzMlp48mc_+6tS_k!j1Z~_n;UZL$aKom`~)LM z9!+q}(d-+jK)4E-nF2VW5JG~IgmF~R3-9OHtN(YO7gFL6+%<`n@!d-(HGc5zB6A7U z9{<$)+*i+|&bVvw?#EX>V152=jh*Z~toOC{wwSwmuE;|C@tV6;Oj`TgwZ8x~e$}|` zqj!~mUH$CUs8HQ6{eLKaS27Vd-0*;R{4cM&j_kjz&ig`e!6~N@D0TRK934IUlWgbV z4bl&P_`_&jTxp*5tY`7U7rqehzfh|d78dx=|NKuby6B>NEvedWw|V{RU(d|U%$-2w z?6c427~rh&eCW!=h&oq zwG!o089&J|LgJ()Kw_n(*;?Sp<4@woM?Hp{F8ekof9W&CfBr_&FoZNk1ra@udjd1h z`b*}&_YM4Y8<4uq{2jaTmfF;YYlK3>T$5&{k32~Tre~@2#n4{?YcQFj+g(Hk5ysEa zU4aWCB9{^5Wf~$!nu;GX67;gqwlR6eK*Q1U+gw)diOn0=^YYienwP!euj$nZ3!vNpno@IQG~r9I;_7-?-#*tdShO`ADRc zq-mEhERi&u9Dl;mI6Q8>bq|$l4XGr~LYkz7csmFREso9zqOj;!mSc=TN<}3qA(g<_ z|Bt=*4zS}Y@4r9iOuu!jwAz(cvehhM*>aU}#~ou#GX@OAroIU#B$R|;0wD|e!m$YB_^hzCABzZ(~dq`+!p@olYdToM+X`h-m!_=&=Ap{5!^LcgS;3zs z9>sWshIYtFjhcT1+UbVMHU`TLN)=7&I@l(dVL)9)2&IV}ji)@6Spwh2CdME^L>aVO z#*Pi5G{V&>rmw)YQM!TAh;U^LMuMqRjIxDo*`#UI{5=-JiZKm|2t67iCAG>}zD0RU zKgA$M7A>NrLFeoafwBGD(i5f(aB-?7xvg9}hp4-TR1+!t}o@UvWAt3;e~wr+utUi z&%fw%-QV9&y#rJ*s z`ud3SKJCR8{1}iRv_!fYlDJN>rGsP6xQK@ye2k-h@nhOw^>)m8b5SxS^6RvDS>(t5 zmipVT!kXQKFCrX2M6G*-o!|NoJU<}&51+z#*-BKSPJOUK^o46^TYo>gr;FNXfHn$TvRDVA`-OvnWi>Bnrh6XLp0;6+&ENPUSm1StVZH3{ZO70MC_rBPaghzYa- zgb3jfst}oi778UfjYVt&v{-|$v;W?OiC(F$tCA{~!D z#jefU86NJVT8>zDyr8pl5x4!~m(+(#Hh!a+qLhG|f%Rk2+UQ%a)1$22U$Mof}~ z%<69E*ttEl7jt;7i{nWgD@U59*sei7>p~i#w2f^fR7M*}!@+>Kg%PF@fF_JI0@ZXt5Jawrk)|ZR&#(LXs5MHA3~b^48*iewx0l&R_Hg@cKV`$O zpJKuCWjwy6pKJUfKGM6Gm-X!=92&$u{$(_FmDn>{qFV9MMC6kKiFSx&6>0$uvgp7k z)-LD-AyOJbU<(tWBdCF42rMlKM2a>Vh*V<3GU@@icZpyU=MN@!C(I^BFnh1#^3}1W} zxJO=~6Vcf4@B}D^a6P;wQ>zfd?VI;H7##`|h>qr1|bW>LW){II8fX z>HkOheQ_do?tIAInnxnrp6^)`6HTixw^7Q!fFL-sJQDeQdIRA;n$QwfCZGP3BB@;Zay^ z9WU9jp09``L<>!+JVbtU2ye+!Xm26WF|K7%9o>VuFLTQ+S$P-Rv}2c=p}tP^Zi1!Fw?1-XnUbJYJ)H z%`NE5--!}n3X?GO$-5rKrArVRwD1r`39r5g=Yn(4^@w6y0SnN@JYvo)hW_h%cE0~| zoLhfM=7?^5tucf_q0ok@C4O}T%TFL{;n*&7i&?Ck#g08yRA~gmNJ)~A)P^+5qi7(p zNu&6FNPp{pjs@tO09 zk71m2CXfHme0pTB}1e{T~HZrH%Ob&oK2?mV1~N4Z=hKg$FfX>wDF`d#wU_uTNZ&Ij+HZMf+R*OK_=%CM-fSqV4BugV|SLGo^Jm7uRp`l zE05-=wl)f`Vt9BPH{I|vx;i=-+`gNaEnUFrul`GN$G?o=e{UeX?mFZnPt&Jj{4_+{ zDIT)P*zE+g#3`;@Bo%%$OM*sffzSe_5-d}rtrUgE5Q2hmF-%D)1R~McDY(K!cv+-j z;#e+-7(;>-&5V>H0#Xd=U^pg8>R=fHX@z)p3+Z>hNp#H7SZ)FBS15Qn;(z=c;>t&` zf>8=iD|+4{M!x%Hf{qOF2mTJz$rJlkBngQhV(tlud*|`;Pk))NC5s5kBUn;`RL!zQ zpnv;w%v!wikPgJ;AV7OZ8-sn@G0YOV)(#>+C7a73bczz-wRTYK>7}}93&l(x8dbD# z5Zb~tUE(-Is24v{F{hp;#Viby`r4iC< zw@bFM{WV7^t`38nR@J?8B3!B!N4v1@Ys?`QM ziOJ`)#F0b@u%toY2MEi+vs{Ew_>F)#j*+H7>y$8ox$}Ft_ntL4mcjYwpNH0pH~~Xg zAT)-hv138x8eH<~3t4mDI__V)j*iYwl-8JIFuzflP7uz;Nj#CcOA}2d*F={}(-gxn zFwCZd;WvD;g*>*CW#g6sgypdATR&yZUH5QAPY0tTbmB*m0EF#fJ>0vKhOwv1>g~y#rC9D#mFol69 zEF9AysSaX#tz`0fN~IE`qocI8w$jqlLZwn+baa$_K2J+a%amue-)N9ZntV9!#9n=P>^* z(>F0^=4R+Tqm#kA2dQtVGj!h&ou|)?jdknwTY2&`P5uwJ%jJw8pMkVyw$|EdKcM|q zDwU{KtF*SZP6^0Po)0PIl>4Vvs~zxuI@onR)G-fqeSrP0&2;zl_;1F8Hq+^MsCBUK zxZ|G>w2po|PDG>ek_=mmz=H^9-w3ujZU{ z&N(c#)~#DN@&9?}o%cIqu-0m|LuN#NFCB(G{iO98Xhl4*C;A9GP%snKjy zHZpm9$Hb^N2*U0gTg5!Mfs2 zJooSu2tP;bWmjNs*g*b{JIH$}i{J1X`X79l`i@EHKr6a@q7fiOom1}ic#`;diDZ-?a$`V26r>Nvxg%W z9>t%3@n87j2mg|cn<4C8$|Jk>pq0t&&Th1VYNIyBC~Y8xfnz%)X^LYxgmFxzKERS? z^GKtZn{K?B%U^#f`9ce+vaqDUacpecA_e?fLX@W1hS4N~^Xz8!D4PKkkxt09wD6Og ze#!8j0bYISMdaHugykBk6tvH3BaR~CC?<*mTsMPh3r;`#L=r-t*sz66K1Y-U7%4cm zO_C%eNrGcLq-i=9anvMnLYyRco`a4RBGr^CWwO~UT4`)kB3p`V+fzbY1(uz561yH- z&*`tYn2%rk6>Q4|p-@2`yCS)9q|UrrouwTXN#GNB60;QGI03U9jb$YSsm4?uspaFv zU`P{;Cj6`v0#krA1V*e#Z4*Q{)bd=~Ftze=h=M|E5~PZ|eAMv8;Y@Zcc-@s0oGnJrtUb?&v+6OLP&rg)x59LFR{ z!cj*p=iP6ABZe`Guv~TpCW#nz9!dkp#+y8iSdc#DqO zf4^jJ+CZ3x4l)Wc$q-A^CO6GKk|YUNUG?sXwLf|OlO&lk=lcd2rIf^Ry!ZSk0ijI( zJb9iht4aKrrs>4okBjTN1VMmp+eA?l*&~>I3eZ)RQTW$4s1v-M8-M!FN0e8qA!@89zCL%-qb( zvr-T4;mu!q^OUt_S=N+u9$$~+^S1AtYpthTqsepcy6(g?PD(ieIAd8Bxm*t4_X&bv zV(iJ+)Nve?QWN7&cg-j7E2YHu{fTVjWl zFbuB0{`%hlD?!x0j1zI~wb$Z#9@T1f47;7H&r zC!FxSNYRwm{Oe~wJ4N>-N$`E2p`jrPg#w0Q(ACw&qD6~lG-f`Z=c0=);^#kaGCzLd z3twQ%mMvUy#T9s-cgWw5jEqc_M46_^(xpp(XAIWwfB*Xo4Gm3r+FEN|*PTFY8Nc~_ z-)GOBJ#=?>Q!Ey#R4QYJXNGFE%AP%Ym^Et_xm=FMm?M|TWF{8(c<;r~&=8}eqxAIj z(9_d1fp#^H2-AGdrxSWumPIC$q0wlNrYT_BT=N~O|%NLb@9o-hm%LJ$N2 zBO@bpb#-A`7Vmh=TZsJ*hO19F1F?hb07I*uc<=1PjA4C=Kr5 z=DXLkZPyPbj^+D4wr$hV(LqZ~3;q55G#ZVGhpBDbxUNf~Smf-JjwKF#OgoRznnWn9 zG{G=z3av$UMj>%MKsFjkATk7o(kRm)P6df!5m;k zQp8zsBz@0rMIX^cmn9>|oO93NiH!qzJqsA_>nDsG zn8IvwK1dTK#tj&O>Do<0Hr9l`&v7R#)#rB)_e$PkAK!qCJ) z!f>Td-p!KB7f`9fuh+=6+<)6lWWhF?ELwvcO*4W{Wt1|px&5eAwd46rSmFbc6P z8?DBgU*ni!E)S+83PZfCg=ikf0C(OtX1mq%=s<1gTO43PYM$8Y0KUG;Op{ARJ^{7a}PUe&t`0 z&c1)M=3mCx+<*euv11#F5+q>*H&Z}rP-raOq++og59OF(8$jH2 zp0vg=4U|e)zI-XGSKl#V#Eu`Mx=&TWzB)|SZC@SD(hx~U*I~bl`u_D369`I~V@{;| z!+$@$Q(*5cZ<>x!bU&M53@R2Okp}=hF-t?!A{LIH+vGXlcRnW1$-YR6)6Ew!#qgZ$ zKmZeZM3Zcy@t|j8Qjj!F(l21&kT-m$N%o&_a>h+((0)?;;W?I1>iyQ*boa#Md7Ey|Cx172?hk}g8OJfB zqodRAH$GMvhKIaIrrUR4M|AS`$@?8>E$#dJ>2#a?|MNxnd|pn(J@?!*k-i>Jsg3^y zXaKnvne8}AQ@;50R4n7SFId0{ZO@O3zA?r;y|3<*4SL|PNZ|n9^{#iZVZ#P??%avi znjik~hpb+`n%BSn^}O&o}h{eh3~S8qF= zY}l}2${ZX>ugTw!J7xz~QB3 zIn+=M8N|dwBXtwS$y5-U8Yi}q-}(mi6PJ*=>^;P0ieWi~yZX@A{}1LPH$|k(3QV|jdsU1?OP^37viPD!BIqvwQS-4;>aU-DElH)a(T*wb^x`o?se}GFaI-UOEU8GX8Y0FOTzWZT< zMuqdwISZu{gk>U33!xNN#-m>G`T0-pq*kx+idURW&U5gCfIYhh$$1VUNhpO8DgkL( zNMX_ls{}!W8mVGh7Ux`WDz<0y@I#MdwOS~pF%5G9+SPWf38%s`Ey6LQElHbYPnMKK zLDZ~04+Ql_15*i<@3X5Bu;`?t=v^|0kzcRl##?{RyzWlgJ^01y+i7nrP;1HY?Gyg2@OzhMz(*ie*ZaAuz)+SX?PEghV2cNrEsGQX1HfgD^CN z2~sqp(b5o%qn{gwMgV971CU09DI=$m_p*n3Ju%BT{4&O=I@{e8VnUZ(jyn) ztvVlbRu8e0MM{Zbr5O1PUe^M2rJtQY_!jmJKjer7^Vspt?@(T_jB{Rp1xhq91z4s) zBms&hcgVhx=<$fCX`1-HKP9p_ZX773kZ3H+#LeVL{D4#?2x*ei%pf#JR%02L1f)Qv zibfc)WZCllqL$-}F_CBh03ZNKL_t*1&dKnANP(kwIJVM=Q zG$<4bL{UT#1P9DSOg^UPc_c}K)_RJuxUXK0<4iG-J7U-mogpuxnuF> z96Tuc^cSC|^k|7_Bx3i?yP5mC>FubIM@G2&RdU7889%;d zSu`4r30rSp{XEZ`2*ghQK91vwVB}0P5w7b_jGd$YxX*Q5(<2*KaJfM(yBbVLXtXm39}kJ$4(zWBv2^7+qyp0#V&PSm=6 z{p(-n```aQmtA%lmtK15wD7KzqdK|V?-m3^+YFtx=?u}|q#Vw%jckr%AKHnk*FbC1 zdW~Sy)0A%e3Bxyjm$Wp@?l1o%)irmr^gFj9XOK;LDP`Ze9T~0S85Sy1s3=7d5dlI9 z5}|NP14t!6OVAoynjo?uP13kZk|-Jnh_D>$9`}8JBDEVuAu3KVwIUr$!J0xhaonYW z5$uhEX<-l;HinAPx7>_-*R2dZ_yfW-FC;g69sB(v*Tg5A3jiNbem zv`Vmp2D2;!9clW)8i)*$ZaPC24q6&$q0y)&r-fnBAuY-(AtYQns@E$7n zKgeTlft~lRMjII(*fz-S&AYHoNX!&Zn?zEel)^A91Wm`!4;o~=3{o1X6c!!XOG`e- z(4N6&y?(~wl^31QkAHj{KfdvHF1q9#yxA^y-1c1_TDP7*d;gVm&FNxfxP%tT*o(;k zJl5Rz5L>rw=XIC8lFs%5LB07>G);+Z+XR6kC851@Hjh5`Fj8w)9e*62>r!t7D5c0* zCTE_piqX+wcI@bsZ8iBMY{y2|o0*ARHcJ#m#BqcgTZ82=B1mI0 zwu6~X$$MGuShI$%uevNQp18{r#A2M-aXHeA2#t8sGmm zUQ31`-%hDfV~W3K=IyQi~8$5ebcu3e#xbGeQe2;b27yWI`N8D5(%qBQdek zW(GsZ=F3-`8Kf{U%oHUADz&KD0d^Xpk_M(JK{)tkf=VPh(WHX`19NB7^6xj&vT`{& zL=){u?-Q^P3A%d@vp#+tThDn7@n61;mRX(bstn;%$HOH}ViF<@(X&Z8>C~IF9cep&0dipKqM)IVkm+!ijEgyOZpplszi@)&`?Ct{x`K*pvQ_5BkYKK%Ss7BMMa^@bG zwCu_gS8(Q0pP9CP{9t`4FGQxRu^&IycvZl-F4bxkAq1sTX-W|EVAriwDls@Z$S3*a z^wIWeOy5mSPOIz@S(g3PvP0?|S7RQ2-@_9Q$aGFb`KdB@U3eEsB>@SieESr7E`5IF zw%7ghb(mx3>`eP0_Pu`7ZQFM&rPO}?1>3i8CrJ{D#U>%%bUi0C={Go3uf-8!P9}pQ3x3rerc1ip3(s!^3!<_q>exTrS6_ zKJ_Ucc;ErP^{sDBpgYxSHNN@HZ*u$Xw{y)k*KouUN9<>qO^zV^E=ewz!Yu)kJi>!+S=Nt z5L`{xqg*aeluEU>wi1RRn`dxdR$B*5LSD)&TS40;Z)Db0@8_AfT|`?fpy1FQr z%Z!YS@Vy`XkoR2iCPYOdk=S8GjKV}>m>HCgFe+74n2-vA=@bwuK&LUvbPxY>P&{fmQ~$-hL;qyX1U2XLnGq zHgG%(%SpK6%2)B=nhpH&mU~!w)I!oI;Jxp?oR!BeAxT19&t!Ns012*_;nrW=Mx&;< z;!Ur^up^{0sn;tMTRlh>VHi><=CBJMxBcP{?!E6}&OY;acI@86{CRV5(-_|mDVOR9 z+u)*Cp27WVe$8W#J&xsgWHY&mD43K@rtK(fMmlZFp5T_yNwc@awQW+z#;({Tx=Pw` z$Y&km7L%`k@8`^IEAXMK-_Bh>yOD2Q_Y>wUY-ihGKj*yWa;|>&JIVGQ$>uFjGrDUB znJ1rOciE?rrdTSW7Szeu4vC1#IM8P2uxK)#o0dhICYY&#;h7jJLDQr|unYs+v`7#b z!oo0<31?jzlZt1xL`aRJohAa5V<1znSw3hOV23nzR;jfj5LB;9T_DMHZu@t1xbo&yTn>isg;@CF?&idsjaPT z#=)iOWaVMJ;;L)!<+*pi9-YJp+hOs4-$ZWZNeBIn-Mtr-B;0Xu9)Zblu+D-5moLA( zCBqS&N6cu>Uo4SQ?l;#5I@b6;`vS5Y?7FqIw9wMh!UbHwZQQnhNzxB@kowJgy!Y~% z0loCTv6n|a@CZ85?7DduQ7OW1+3Wn)w$!-m{JV&TA`o!$*G^{so1P!z^aWfn;XoW{ zzV14WX(~UKGpF*L)(FZ{WJ=pOMci+Pq>o>JFpSKh7=}&+9;5*!M3tV^IA;l40s}Lx#gDUo#r{^ zlv7x>Y87kOuH}2*`yLy|SiJlC`uNa?KE&rf_c<0XUOXi|J)J}GyC8;P@Uf45jNd2u zQQr%2nvP$^+>iYW+dkGrX&UdU&m1sy4sgvi*ZfA$FAM`lcWh~98YDz%(xg8? zgCh{_U6_5(B1X5ObhAo-gsJ-ca*6s~9BJ2p89Ns?mXprepXp@q^ruEP85KOu)laEEt-I)S?HlmFgzB*PgYJcR0gVQkcya4X)tX()5203Gfin}by*q+o=YN(&_}nm5o4k%BRGytUK)gU zhU<2g=(=Pj@A}I>=f~gu4!2x?1MT@%ime6A&Lxbr<=MJtgpO<;GfJ>Bc`8YSY6NIA zBu+GjNGX?nayiLG7oW{z>vynm@JTZH9F@_S+izdX2`4Y7V^$mGdX=K*(B7Ko>@!c` z7q{HS=Rf~du6Wz!9KY&B%0nY0@mR#$fMTJIb!#7{T&{D`h3Dbs9UP}Xy&lum)sB{$ zQl&~1rX*#byY9S?M;_Y1JFa>&M=b1R%hp{y{`4~}Uc3NPK%-hg*EO@-J2>mq<4`JL z-9x{|K;k+sVysb9YE2r)%?yhW=tL3g1Uc3NQm;2Kavq7DqC$g$=ioO2TqDc;`7Vt{ zz>j{phG!mr95Zh*I#TEAPkf4Zeek0=N>dxyjQ{KgHlKVvl|8#DZrM(faWTUTscDjs zP)rl%I(b|Nq*S=lfmD-tCT0qzsGtFc$-@701BKHM4Oo(S*~-0RtY3TZ z=h=OG8-?>HpZP7hrnkw0i$hetYuL+!DtgJF^tjs#RQa z&ppJGjPx&V+{luAp8sc3GxN3kkk`Grx0fX^)T^4Ij-KaDX;OMVB`B*_t>Wa9Pv(w0 z?%>*MuWe$ohaq43(wF$^SHC(X+CMInn{|E{#QQCm^87ZW^_8!ia3a!bnP}Gz-1$fT z&gd7%5u}PZ@yUy3q}xCO8ew}haxJt(0^L7KSQ#Q$?7$a-#IP{6CST|v7~J-}oQUes z9*TuLme)oQl$vm#sYH4%el$w|vzzI$nk>TFZbxen*hEBFaY}4K=aNN~PCFC1`a9?w ze?&ddsPA7#^3;R)SN{dM4}A(pKwPbWlP5%Amv)iLfDsi@z`(v|6GxwQ5=X!J6_C{7 zu3y39ePHD%M-e&>@JvM#D?%~^wuK56m=>O)NaC1K$J7lM+b}RyN}FS{pft)>KfzeO zjBEgYX@EA%VKkO}&9C7eyO0asa3Qws@y55jog?SZc3mmHzDFwUwhFG|;hYK%0gVEtKLqh{(vsr``n@?Q ztAoZ!nZ7N9m|2qxE;yekPN`IfkkV{sezYb?742;u{Oaxp*tTN}7r*jC3axnpzk%Nf zn^`8qLMekqlhR?a2=Om40Ir=HxL>!wu?$8 z_Y5`bm^VDJnPPVjM=6Km{5ib&%J<-CNTgt7=VlsDJ;j6fKFD+1`uR{>C-dS8{jNep z4O}BbyX9iZlqA$Ru8SH2V9?4%3P`kqRDsca0ZL0C5TJB3qo9~@%!vWgF=s+FjcdaI z(d2KyG{MxceULrx`&*p1Ux`8!G%5%oP=Mg&NOUR@sc!ZOL?K!C#U~rJ1YDMdAJh-LkN@mbJaff` zP0k)6Ir1ytruBkLXEc8P)U#>AYH3Qh{}dGj(>6?Ntr@=YyAz*_XHOqoye!+)`43fQ zGn-Yc;z1sq_^#2{V9#AmzK#6SJgqBdzV7B7Y~8w*O`A4N?9<)dJ@NnU-Me3q z^YUWL?<2gc@j`D7cdFwg4^oS4{1(oyTpDR+$qb7$jIfdjounkBWVM9jPeoU%w5AEA z`e5^Qsx=~wNs|btWj?8)39Cbgb=-QrPBgNEOnb8_(hw%Lw3_5?N>bmwo4#$^S%5`q zr*PzAQqerNs|AT|;|2*rY0T5lf^*)Cz2QNs?|CE6wr3Hu786|f7P5e9_|$bsWNXYF z+t9b(N~WU)9RySoMPM0l$NlKP`V4&NOK{)Qq*;&MDq=M7F)b4nO9Ho*mXl7UW92G3 zyV}W!CL#}xOQto8iqKCn?PgDb->6}`9)3OH&buGLuZ1WCu~G;HpaF zKlP5f(SD9M7?bgh9CtQ zFGCbZq$so)FMW)t1r7W-Y8u;05e3c0&yHdXpf&_L9NoqmIv=*v{c2M z)5W&U{RFvAzHU0~PEFcIYZR12i(}%@WWLp{?eyhx^qG=DVKbmD1~4g0n?Y$Xq)djC zU_?5U43|+XMwLZLOR9#2k3}7WnrRbcvxK&buLXXj@GXbL$rIZ)Q6*;gaiozmN*zBNfMMPP>qP# zuQ0UrNmRW`VRRHCAB2N23{V=wu<^VsaU8xR&#)^FQY{>A-@?YXoKG@31PB&<{%f>f z`lgvXDQz7T&wW*M9x5ev{o6lHyWh}vzD8riL(TWxnHS(KS$^2M{-Ma9@F!E}=Dwkc zq}-A3JiGwf+}F&-Zfm|XN7jy@;^shhn~mG;9-jSV2)rKekox{n{!lUz0IzrjjFs;k z^dYif0Rv&khaP=&;=4p^u2{2%^%q^le{R~uN**0M-yJ)4uyEl*0A|gaMO$0j1Txekk37QZr=R{iu~1$}?dxw#iV{X% z0MTmg(Y+BFnJZw;>N@DLe$yi2m>>wSyds8EM3+iU7FyM0U`>uWmZY@{Z|xdJ7QYPU zEJM3CX`_s(Oti8nEI5(TE$irXPQT%Vu_6%~X&Ll-Hksi*qI#7$ zj>tL&BbG(UkciQUB#GIRghXbZq66mOPC6)J^(eqds3knI{s{^hmkZB5k6Kv4bzMBuLYNxYvT`b7r67Td%5G6_wxStzmNI7 zUF_bmmDctaI(z3*8mZIpeNI@ll1CqXoV5?F=jdaWH_@Ns1QkOh>Rf!ug|xPHu==hC zkirC!U^*U25|O0M9;q}{BwAvS5+@O^r2CG17+VlrL zeA8m&@DHKt=>)|-e$QVX}hAv**hCOS|-Wl5NVZK?2ykEv4}~d^q}`_*r-z(*-UF| z2MyCh`T?=2Fl006U=)gkrG5qRGtGVo(Tt2FhJo-L5*589&#<{Boa@0I z{{Gp4XW#W&;{LIQ-s4xH8g&M~@$UzI9-1Z{mt8pp0HgbZpQL=(Es!Sc{nY=kMW zi}qoSWoAuYv+Fg)-iLpTi8;o6#f9e0fJCXCCU&XBX=fYRIB)NO_`&L;R`%4Ec+eY@mOKKW#B zx#boBZoc{E-x(+3rI?48TIQKB5=|fB8u-RnnDf4mVs%cR3Qhe6J3q6x2c-3)*CGx= zj5P1J@PhFyhkBAAy&Ohs5xI4MC<<}2E-?akP7k${j-_?Yodgfu!stn7)6&*OUBsA3 zB0oa9CdGNjQXO~_uXR37?!ahdeyz&L=8bf8&BDmfBK7@dlcrE;6d9|Ppw`F3Kfj4H zih1PLKB5!OrX7zUts{j+YAFI~;*=Zcf})Ir z-fh3Y{>n!oQ>3jkM^G`S#to7r#z__05L8Lfh9dPNv{o3x08?T~lYA~qRwsnJx1%f@ zl!a+Z3Tc80V-jr;yB;Fd42A(grWJ4N4qB2;WHX%vr=N~$%ku2achlZT@d~Z%+PRDF zD5RKo`S4%9pJ$%j#9&#_K4%tMHt>TO%QBIPY97xp$mcSY>s2~B3Y>k;X*~0EADcF9 zXXSCn@bjOoM&mPo-a^89jn1w)jEt5kmn+Pk)5FlnAUFN=7GC}8S5eGZ#Brku2dO0& zU33<=-@b-#eEs{ZSa~!TUT_XiKm7!=X3rw)niv9-KsVXUZIdvO+;QiftiJsL-tv|= zF>hWQ)zJ~8&{RfCNILO~MQXJwRX^lqD_8Kyx<}c(X&Wn7EJX{KdZhueVqnJ(PC0Qo zVc1~x-D~l@*+3Kgz;iunwHl^jVUS`;6VTMd0LwJ7Evs4Hq&0pL@qgKS?RmIV>8I@W{eJHsd#ungj*W59qopOSGiRN%&zXJpd7t-vpXYH_l4LQy zuRwbg3y$k=zl&|pJkDv07SVe`jhnuF4PX1(x9IDi&bCckIQRVXSbqK`OgrpQ;v28U z{`2RNJ(j&mMBK_KT7^@&&1Ol)NE`_kg+hB8Uy0TKo=22=mbciVJ#Mka*E6vG%&V#JGBp^Y^yw861M|2cFevH2@* zAOHBrKmO{qf@|>Tqc7>M=T4u_-TU^j>xTrz&yJ7N{2~9_{$i1Td70sI2k^VU3wFGHTRyQy(z>FC)e!|7+r(x^XtyHVk1Egef za*~^Gz8Qe&)2IK^$=N@S!w*0FHM4Dfx!97yGe3nyG@f{j9sm0e8TiV-(Aw}EAdtlp zI7o-~F?RR&+4`Zk9rzNHR`*?O{Oop-T};W6}sKa_iSHC=*ntku)bs>-+MRC+Q)C z#F~t#KEddoZKSO+N_{htVT~+ppbVHS#t0~c6_nJhy!kpt)~w+?J4ro_iQfMwRI6=d zNrtaH5(McN|Bdv8r;#HG;a5Hb6Z^m`A%#Hs8dWSIHg6@k|7N^xG?!es(!6~bBquYg}JQz;awI6>x8Tp_?X4~ZbLDWT1%xLhwgVI5W~ z$Wlg30>vtsb*%9#xd40Z{b{A=GeMv6HBsb8EX>SeM@`6 zr|1pp-9n_RHRQ> z(Ns!;Vg%6zm*V*$DsEx4#p~*!c>1Xn3MH&?_|l^_xQBh8{S;&h+e*j=x1obhywu=) zNoG^L#M0juuxkA})DcUVbI74Io2@*vLWM}7aMlnf5ojMzTGGaTlC*(~8u&utm#c)8 z9@5mIvKZ-7gj5J6FbHaGT{O3?=egUy$sFZTd+HfTV@%*9tBiFQ~L@Ee6CEMfQ5pIlnHDx}VLm+d4Spi#HO?n)3^v>sQ|bkjN}0H3r{F3S$$rq6krKLu3ig3kXiXfU#?@ zqirNbKX^A=`et*;(lZzp;HL?~_edLKNI#(1-b;ofi(8mhoz&%GU6mQion6REm9&{6 zt-}b5)tc0TbP~@C7~cFOYwo_63)12Rzxhk1{my0B zavyBl2<0L~hRDQ}WeG|ed<{D`p*&#m$*@g99Dzze7g5I0UTY&}oXlAQX-Pbdj6g`A zqF=(v4DGUf6+;+YD?vF$ta3m9dXgY*Mw<$mFfn_RW}a4?W{5_@z?^<|TyzQde)C%# z+1JO6`HNX}>~Y-sjc?F9eH!ia=dqs(S(Z|3D?p-cXRd`Z(!%HaoTI`v`=rx^L>i# zHSW20C3ih=AOGX6SF>o*0>+1i3B8a~SRzUjN|iRAUi}Pr-E|jNU49WhHCmGmyh6sY zCmhYAKUl+>$JcVyv5V0nqb$3Kf}aVY8UWRy|7?galK;nnFM`Y2isl7zS7+ zX-?L2J7AlOoQr+|F=c!Nzli2$Fvt0fAALbAL;zLwQ z1ze-S{*j#wKle1(?A*=;wN92=$FOYBN>YRe(|wPwFhp33uk$q~>EfKYYMqBp$|>t$ zslbZdiAez>00BzMDN%KT@-!%kGC)Tsg{M~GeeZhARd1&m`shZJuv(&2n@=lhAk&ms zD=Phm(e{78OQw99iw;K@OEf0OY5&?6DE#0ykb*c%DQ23BL%}tl{R};S^LNageJJ~e zcHv7&;QJ&|11&vTQAEoV__~7j^YE-z+{BDeqTK}e0x1g~m4E0`Fcz1A$OJY`Ue!z4dBwcp^Pd9wt_{}Rx z2KEx~+=`hP$Ls7Sm^~l;bI8$^rTo}_(;$(2kPq@zzWP%gn_erN!#TX2wUS6l9RAT$~?Z5DT z-}=_Kc=XXnx#gBy7#J8hkY?CuG}yRtBVYdVm-+U$zkT5TAO7%%f5OihV9AmtJo@OP zjE|3Ft>uwN9%0q0Rn+Ts#>U1N7#QH0XP)7^-~BG1``qUaSjS#+$t4E_&_6thkWvyw z5zjsM+)w>GFfj0QryWa{EW!8v*WJn8r{V4vjQyA{LRV^ZUiucCbEHE9n2E8UJm1>8 z=zi;anD@DFQe1S@&wZXb8a~|itABly<6}f4!|0AKJ^V1)g_q&CwUJp12uj5g zW7SS7U->fKebd>nV*{?MkB(V$ur?(%7HmptGGrR#ianA1`$YcxfndZSh~*kQTFbb-m-#QZoZGD$1LTtE8fVQIeqlan8Btk z+YnMvk0SQ$+{4nvM^P#HOioOI5Gd(bu<#IeY~9PojaxbK#N&z678XmfSmC~VALh2( z@8!aa&*9K{hcG!ZLg4urlOd!a45~b|@=@-;cO@5HbT-E>Jsi_)pl~!>DNZU5KWY)X zcI{)^maTMjbz@wH@0W;^gvn-;C5sm#Re^OIHljU!APrS(P3Q+CX-b@=m^8!le8M0g zP7;(oBfiBx15*B0LFGA&E#2Qk%Ol`5K%9 zqw)ef$R7g(s1S4+I!cJ!ZX}zzfYQPv$+W~YCU9v2!eO067=teOv>kRh)dh!8snsZy zifkVX^KbVz%WaQ&*sn7QOAX7w#V$()dhI3hJI@H`TeV64G2 zibktRb8(5%lY|HC{PTmnEjhs{k1QU)W=vpGz43AgP$OT2O1_{KNB@sg$+?|Rp}xa_jaes+O4ImxF! z^(mfy`stVScvoC;1@C<4I}hBpckf=_^{#ilv~iTy2MEWHqqn!0qkk;7hS4b zkcyh@+e5N@2ie#NGA!UvpGi1x!ApLQKdr$PuYq&NuAN(nhK8BG^a%7lx8i^3Jxu(~ zKT^ExZ3tt)Sd?F+X$;K|{vO>=t;C#gEGs${3odv!vzDGpD``=m947PwqzmzUL1w{` z;T!}=q|{UHN*SPtk~%7h5#<6S()zP^Q&{%|#cBZ>8B~1Y$tFo_0;2_?E)yyrY$NYdI{|)>cZxGJmA*YyWeAZM za?WAX6d?u9I?xVhB`$Sj!au*kN}1KjZKTe$er(>Uq)qiMD# zm>h2b0>2nCIx~&+M~GUJw70iWuNz8bpJ&%^;*L8XAgr`e z2n%RWW8xTN614WH*PAG<@jag?j?h}u*49SUYGKoSh4sad!#q^dlGuc()#8jZ&*YCj z_+BRV53%m?RUCHcG`2mpj!*yXztFK@4qNw(QykmO`@?n?M?*~Om_eirffKa+5_Q?c zMjjp#B~l2$PkbnNc-kPcj4TZCqYNb!Hq?kLMi_%sl1yg=qCkQ{NgsuW@-@^^Qm`o=0uvM&SDKDb{|V~)Z$MukX|qLa>Xa*8 z>?Gj&Qpg)W{KqUg@pPQ?NE>w~>J#X|M+k`&5~UPL8k0s1lwU+jLDU?hRIE~NpN=47 z?D@x7b=|+?>yXpOCt%G}AOligqHPmlHBLx`@5AH-cJVO`eBfi$B`i4f@K^nsW?i0Q z{qt;Je-*g01bL`vl;s_dz z217$b2a;S5yxB^zY}qnC`q7X6Lcw$p1e|^L+033jn~8}DhKGj_q#ytAF`aqlnSA6U zAK~=VPydmh`M%GJ6)ULM>%Z`|O`A52OD?(Or~d5t;i{f0JoX5?FTR}VZ~GuhWH@6%2m+;BW=CqGJY&U7>ZR10}R zZd@mI3XMc7i4s%6UU<1n3?3K>7|;UT6oC)|njz!;0Q22zWVIS0v{KxP7s zB6BIydSvkgt`#vkk+NaOR_d+Y%qUf9dF^~*w8>tl>F(}j`<9IyI)4s@dYyUGX0UZ& zm{0!0XJ{n})B9#2gdj~)91i0w#c}~pX^gR$%;1FqS^DD1C&|)`&<`=zlBSmN@nL@Z zEf=!<#1pyu?uWVW-uqd${Ak{A=E*$&+zZ@$&tpu~C)hu%+2WRtq z0vtGp)*5Rq($i?2pATC%Y-Qd0^=wtv!ZD^lTA#kL0TWfOpelw^N=>(XfS%`jreC=NU^JfEGQs6P3q~KockeKDwOA; zya4Hi2>QD1mdTmK!FoEkyAMpi)AyL zU-joahjaJb$^ntPvD(H zdDHq8W#GVnbi-k<(WaL*h8>%pr|3IMPu@f6JGaBuoz&lWG5QmKpV!&R1WI@)U0~O~ z9RzQ`itcP2jysa)tjGR^hq3St7t(#`(MSZsLF^3DInFYg%Nx0%&9 zUC;A(Jizj6%ftbB;|3m4J#rJLv~x6`mOVQP_uBCRwd`p~=a*W8Kj?j}?rgg%T- z;F5?Yjx4d1+smlbf;Bl=uv1=>ikwi`7|^+Qxe$;h7z{Sck1TTn?JU|tf+3ExeCIuh zNSwt9Ni^0(Xh~8lv#k*^S#K~+!brK3uhk_BFFT*cz5$+o^f9W_y4bU4CxP&ov-}kH zjW*ajGERF(2SG8wWOl0f5g22LjiKoK2q{S7gdhxvqyO~Sj~Y$1rx03^Wf`ZRb`ndL zE@0(DtGMm9hgrPz5U#xXBF09?xao%b7#gnA)*j#mFgcM@2ufsWiy$l$h9P_Q?qcq& zUY0IdgmZ>+wG9(D=2Oi?O>u=)Hi!b8hi%w>EV31O!ov0NN6g7UK!sBb! zaqF$Oa`|QFv-qe5j1G-5*&L@-s1k-{%AEyPJ+hYJy@Qw zaEkb3j?wV}L?$U$3MADUs@g>s6p+4$Y9&Nk;x;@(GTEf->o-w4<2+i!gUCprdun+1 z--|RUle6cd{1T?SiX5wBSFb>P|_?6 zawc7U^YCR6;d^+M5>jfMO-Pc2bbOR(|2}ppCOC_&x6J!=8%O9edrUIt`7QU&iR#I--Zl)X8b3en_jhYp^&>Ubt?|y7a${J zH@jKSde*Uyt!!nOVa&_?mhGX3xy)q|i#UwK=%WvfKKMo-BoRLYt5(4cH@xKare7NU z{cyz(@K_`};ZKzZ&ZIYlOR-@V{Q+5b#g6!y8{i(cQ@K5cR#= zkY%5?d%s8d*89P8q}#R<|It4n-+UF?r1(*c@qLsI*fX#V_xry`-{#eD<|*tJWwz0T zBNsFCxO1q@nNO+IhE~CW)}V74q%pSHU})ENcC3Dgbq_p1)fvv{s?ol4gvl*Wv+GS) z(EF#KqODpZjbel}XfFV%8T|TJ@c;LFsUC3@X%rKd6lfos5%EM5QINEZAy6S<7=TIg zopk3w$z0^>EF>-`6)&1E2#d3ZRuti+MhOpGhR7^q62z>IEhhG;d_ckD<(@C%$zxsE3dkgl@G7t#_!z5g%_X6 zDW{&msz+8cW7aI9W|MnYJcM!uf=UT3EJ>VUO+u0gk|d#24v88~+G-`vJnIy?ySs5& zl6Sj9C{^0H{gwyVyk!IDo_j8pVn7gh7?;u6)6G*)ZQ@H`{047%%VnH)>M;!N8N?41 zCWCqsQ|oAB^~z_s?Uq|O?aUK7^VE}=9FNhVBhVhZ2gdo%jkj{iMdvbSULURT5gZv_ zP@>*SDHkiOed-zRyLTn!a)okRm8j9e3Wrv?UcxztANU9%h@%K0B$>&lVM=N|&m)cV zERSNL$YeT+Oa(!qNU;=^^Q8=gEn2Hl_(`Mi1Wf9tu4(=2PKcleV z5Td>z{+_>P4y$=L9xx(A>9|#=hOSy}RkvA%~YcsisZX^c4GsMoB;R8G5dKC%!Wz zX$zG(To~d>#l(Xvaew(%3aW@gkqAMdsB(fJeA3ZT65$XSTqe-vG64dz7=!{(f@wi2 z^Ww%SoG}Oo*5nRSX`0}K&b|7r$qOV0k!fNr;1x)s7?rk2yJoVZkutbvC%xJ+S!(Bw zS^@viBYDdQKg2@+(qZ~63b3F zmQ7oBvgw6glxyu2v>;9*!jeZZC=x{xtyV&oI*f6YD?X>4ass_GIw%JPM#cv5b%k16 zg}d*4i09XBF`dsGDok??~NimSL(iR<^ofxTjV8tV> zeBg1;yXXuSFI|XdHDlwW#8Hz%xrj50&;Q@A6Q`ET&O3|47tf&w!LD>2mR=0K5!qQe><^2XNTpT%)sZ?|;VBM=eOxe1cH$pldo50@A(P7+<>< z+olO@0oNL*)-xS3a~7m!7}<-h?;<9|^FlJ2Vwx>vu}UGxb54j2IE}*+r72#Vpu;j$ zJ!mU3stXKR%eb;M)0j~Bc&dX?HR%$9E}@Xk28;~D=p-nCl?9LvfyD`fG!hUv3BoE6 z20{<&b+X>s?E3IuQCYN*&h}}q>Gdvkx#)Ur3{S+cA-m^fxR@_qk{>BlZbJ4qBL_)d_7;0aB0-BzNv zoJOf2QEk(3&2gOaD3r>1$J3^eSz3*VByJH1M;Zha^;9qx4oLGUgmWN$5IPrK3xP{o zxtJQr?35NejmZQUli;jCIEU~(Ok#K53v_eRM ziPNduB!1B+i4#Ug#%ZgT_}zEEnGG*&=DXj%kD2|`sn^GG&QY$_aL!^fOO~W8ICM5M z`lnG03ItlSZ~qWaKe>@sl#*mELf_-OH=fF@`O|2Qwn)?55vW?};O3ieW!?HsTzAa&(xunNTcw_=OTdsldvI)^OiFk8tUg=d<9DIn+l+FxC8iEi`R!iRZ2;041rQOXUUQT-}A|gMXP+W6!?BlD5NA6il{kBM_Y-{|JpE;Yo zTQ{=)zB`yXyPrqzxPyQD<~7LPemc{HceVDhV7!jsQKi<=4%QJy37*mjFDEHd1RzqR z2oTnSmw+FFF%VCJC_;NN@93i;P*baScB=4?b62ra6^CSEbPtXgW!sQmNFzeM<85&Y(Wu<<(zCQ2R`{KU{gS= z0j3F220A42KskeO8Z8Va%}~0SzXsXL9nqYhf7Y}Itro7gpPe81IN^dr>FMk_STP;M zK^(-dA&GdM;+N4#ydLo1MFa6ta6=ugZ@{*f*v6Wp;p)%BXS$qKT;j3>p)YSQ8<=e6_;&1Rg$QQC{H4sR9QH zSqf5O(=69+SU2V5lNV8`$;c47$9t{^X6kl#^^tM zA*Wt`869)y<0@qe&T-?l*Yni+Efm87V`)SgO(Urjcm)!ZVIBBWw$nmDD{4?G6qz=y zhi0?M(BLpaX@W37n0##~i4%s$MyOV+II9Um#|0O>0b@MAb^T2!r3nL{By(h0Mx|Dy zG10=)l2cASn#82++&)N_wK!_=5j5%<_uls))oO)_W|Q_p$k8V(V!`}F@U>%jv`(p1 zqEan!*KH5-gGV2uciK!&d&3Fz_xE7qjA}JR$b>@JhVp&xyz^n6eri1zUT_9o)4MUP z7S0;C^69HT>z z-TMZ(`hp8tcH(08KE9eICmlt#t%nc2@4ZY8#q>_=V@GR*KCj6~W*^Q``*xE~?m?8R z6q<&nZwQgd#A1C(zM$r?S|Wv)yMh(V`I?;!Arz3cz(x6aIhlZ80?!8#OVfUts0rpUyhe2o=(Qn=DOAJK{eh&U$^%_doQAHyH} zM^t}5UG3cmzw{5{AP(XniFif3!BNDzb?aW&>rK7Ay)0U^h%gL)<9>guB3K#2a|!Is zV0@}MT9YtK!x4TSBzMBE;aiiYDfNLpj16w3rjm^yJ9{wA2&X}n%ee7LG83c2kRWV>=J-?xHz6_( z6Gx4e^sfMp!TxSxX0x(%_={nWvx7LuRDb5L;0A~^;1tOc0nI@htFo9%yGosOm zm|jrSU6ET0J|lf|h<1+Rdy3xvUJk$TOj@GE6OTN@lP^4v2qe|E9+GCAiFh1s0|GB! z!^tf8UV!I&Q{rhyW)iftOq({1S+i!cZ{HAGw(Y?8LW*I5Rx6_3taH-IOBo++v31LC ztWBv@L*8`mnfS`%u6rIJY8qNegcO!mrtvXce9;+5;I0SmXM8wgbZmqxuR4!ft;S8? zyA7)Y{4gYmB7CPf`>bX3&gjObFFL+`5PTHq; zBU>5o`0)EV^0c#AaO5$Jf8i6PAN^~X*-0~yR6Ic$fkdEvKi6qEgH=8PjgTp}=!5Z* zG{J@t_|U3D_cWL@8wLkpU~fK=P&JTEz=J{o*BE1ey-7$4nZo&sYFL0EgrrWh(L`nf z7g~hNSL7TZwZ;$2`E)@`$Rs2wiH&m(;v|R^N1A7`IGwc^y@-_M*mb10Qc2Y-RDLyQd#Le^q%-$uIcyPfu%Zw6h)1{qS9raTHQ?Ayu2 zqT}IHpQqY4lN5)E8{i~9g2X0xo{#c^yfbPYsT6qD;iSOgP)^`*Q-s43X9knDkU}G+ zMo5jPBu>ECZ8sx6`$-DpLx|~pq|G6GFC;TQI?dIQCP_%JlxtO_^dU>Y&;M+QOw4<19{Qm{^jz6elz-3xSP@{0e(o34^Ve>1`d@ ziG+XNvzI@9el;_@dU?D#vQEvI^2OdI5f?|Or zGh|7UJ244CVhovc1X|OWm_&JS%+e#7F|&t_n>Mn2+kRTjj3jMv((3Za3mbN@V#O-7Qbcit$uh3E>U<74bPnIX?iRLg-i7u<+B<5T zvU~|ou6=^-yY^EIYb0@lVzETM-a=`^`4^nUp$q1*d*?o)W`mjiJ*3X##_!yOi!&~{ z_)XNhLxxA|goSnH%X<8X{dK@cu^#ydtGi zg)~b@OoB`u&X@R}LI_Qo8Jsg@SwgK;BZ@Pm&c*8a6v`o`#PdC(B%#@CvSi6(2A_SJ zr`P;|+0%RIp3%eq{M%2n?9_7rm~2e&=->YxosX;_SpO8m)=;dJndw8DE-V3gr7yMq77vxf4ChA132AR-k z45hFQ!W5E(q#(*8r1n8d!lKS?kBtu^gT!DGjWHt_ZBSHk!k`?WN(fuW zIg6DNA$){&SQ4yr_)Z{YfFS`KQiO;s1)YJ^fCk|~9ATFn&91lnA!^o4`eybYyy*Uh zV}Jo}D? z)dSYB<#HJ*4@Sqoo-wp*J4s`biSga^t-PP=cW;2O2wnxN>PVwN*T9UC4eg*gZ!!9` zix8JyO`*4!46sRZ;M`Ou!}uB@6jI8m+=Un=1Og93ipUJwfmIS@h!r-U6d)Pfxr5{j z|A1ZhEakY4_B~`0<613f>%e9XJG35M=)hTfV3oz!1$1{uP9nx8Ac}~alSG+A3IU!& z=ptoZ1|l#q7!71NAuw@*O;e0@WWK;8f~;OgC_}S6i`|VDlcRg7g&u190=_pXm^kZH zKJj;dO|4MjTVMGm_kR6LL|Zm7Rw~o#nTcO0=Gk@*gmuJ8Lg0I7Uy`KmKnR*Y(MUp5Mshk3UJNTEh2zObp`_ z4XV|EFbo+S*iWfgWn^T8Wy_Cc+47~_edqmb+O(Ult_tH54Z6CzDVGAaY~F^{no_w$ zYa(N8Vu(VaM4BXYc2~LJyt62jJQ@>Y2(3vcEVa%eYo2_TjW2BH9q;*VDwP^{-m-$# zs~_cUZ@-$}867mnnuMW8mgbhB?cE(b_v}t?`~LU2`YjjHH@lzu$OOJL`MHv{a6ptQ zg0Ren7d8MHbLY(>%N(I!pguVYen7R>#*yIxRqkb zH4=8Juok|;rYTZNLf^+(hryw=B1%$P<8^B7A#GX8u04DCr!Rhq<4-<`6o*J+p8n3) zc<4LVux95res?tG5Yb|5BcZeGGqa)zghz%!qtIb66-gqI3AjKY!Xm^G^vz{R75VTD zck^_!&Rh+DbKY?rSqxypp@}lYleeia|dydL>$CH{5QkszTJp8 zVrXD9y^lUf54hg6_V zK-O%aeLg|L8hB2QfQ^CCC~g?>FL7vLw4*M;Gz3}fFBk}69X=zR1Qg-Fwq#JR;$vAS}Z(lKFgOc1TeQK^=wH#4^H*ueuU z9^&lNPG!llhcY?YL}G}VhDymJ2m&^3UXRRtx~F$jsMJ{d)Ow<*#bJx)6E$O8k_)|^ z7HI9WY0FL?TCo!C6$uLk8jU)h_VcvmI3`Ohg<`<}WA9Dl?K;Xc-+xuDX^&?fbR-=e zN!Bb`mTY;zGY|}zFbC2kkU%EVq&w*wLXw+b5|U0r(&?LUO~~y|LxLfIgK?N`BjZV) zWZAMUTl1_lADwZ}YpSaLuny+ZVGv+r$LRgE_u1>WtM;z5YrRjs@AEvq<1VUjX;9#} z4soiVm50@-&a6bFAZ#>9l^`!&uDj}D-v4_azzYhDpE$(CGf$%GO>X_fE!=zjBrDoH ze%nbHh+2%#g|rnEON#}xO0dR|cT2=xil7{Y1hiNkjZn0oQSmu8URzTpy(r zj&hN%hl519E>b$g!jOFBcA9tJj{U1YfStDytQbUjMNBM6R0HA`PMjbThtvrXSTH_9 z>dax+7#u5*2}F%1N(!X!KpcbXqNG8`3C4H`3_5Os^l<$Eh_Q*mnv6JYagZ+P$Rd?b zSPD4VvV`NKbefd7)Wz4DF2i02bCahL)w3*Lxtj5#$0)Yt=;-R>lXpGDd=%np2!eoG zqfU|}th!(s zU%%r%hF0`3J~qq#eTUE(k|ajC3S0%k;s-w3S{jWC+b`Zgt+v2J_w6A{Q#Nm2$wk{Q zW_)ah(XlZ)Iy+I)XJMv-A9!rpKE%2;s|n+nGpC0sluM+cX8*zCEbU)HS6>I(gjAa$ zQCMg5mJKY-*17HTpXXJtxt@zJyO`6*4pVGzr_|Pgm6leR@Whjcd0^LWUj5qZxbWf) zjGh>$(ORIZvy+8d!qKBg@e6s%r49;(fM!_5@dSNKmoqUr!_3*Uth`_ajb=oxQp5Kl zZ~~Sr?ZXNf9iBuhi|=@g6&-K!`%O_w5l118$_(j*lvtCwt4kqJQeySDda+$H0{(p1 zpcv#>w|syzN1x%D-4C*Q(?%+-kWb$HDf;`CFdnAddv=CvdIsoWo|!~rka!8moCi24 zXssL$08*p^S{l;W%fdVpVSE;iBtp$@Hik-|}ehv900~CwpA8(~q!=Ej{ zUoODGbKF))P^Km|2 zsJN{TADoBJG~k&yD~q>mCKP1J9#84)wcA^8S1SV(8@(6LXQ;R8=th-9wEigJl+7w5p2n*JF7!zTe8iB>i z5K@a&3aJ!YNR$8@$E0zL5(1gaLzsY6xIvCI6(mWFXQ8PhQXvR*gh;Z})zk>ARakA1 z#uB?Jry42sg(^!r6-`^uXrGdXUe3 z?hACZbs!y=2Oi$V>Xk!m+_Z*{&OBSUY$R%=)E8t5XlqH*7QH>)_<_U96@y%H z`K3H_@Bq6X+KcoItyV&ugsffP$Bv6HqNk^aV!n-o&m3o=+Muma!VPlhC}whciq6gw z{XIPxkz$QtZo100tsCfH+Rv{0A7M#QwH znz^ZIO2s^mbZAr-D7N)mQ

{L^l#3^Pv~J;e0U%H^GfHgFD<(##xxHbSNJ36Vn%8^qi_k3xVkXl;>>04or9SfMi0N1Nb8Ddb(~>LtGT8oXcpb!OMD z;po0S%iZL0g&9j}b)N(S%=_$=a8GTybi#;<3zuHST!;aT7POi(N0Od7a<{V~lYrm!1a_ zFOoQ4z4xrAad*uKo~Fpgncr=LMi&S&isE?^Wg)>#{bNHBP$+$YUTjGtM{ty!nKgRwq-ouim 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≶?EJ>wO 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�`3f&?T=_v(0=$}(rBxvQDM>X=kWyi_PcJx6eO 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 IZ}RVd03%F@hyVZp diff --git a/docs/docs/development/boards-shields-keymaps.md b/docs/docs/development/boards-shields-keymaps.md index 4444537e..4644ee79 100644 --- a/docs/docs/development/boards-shields-keymaps.md +++ b/docs/docs/development/boards-shields-keymaps.md @@ -34,7 +34,7 @@ in the `app/boards/${arch}/${board_name}` directory, e.g. `app/boards/arm/planck ## Pro Micro Compatible Keyboard -![Labelled Pro Micro pins](../assets/pro-micro/pro-micro-pins-labelled.jpg) +![Labelled Pro Micro pins](../assets/interconnects/pro_micro/pinout.png) For keyboards that require a (usually Pro Micro compatible) add-on board to operate, the ZMK integration pieces are places in the _shield_ definition for that keyboard, allowing users to diff --git a/docs/docs/development/new-shield.md b/docs/docs/development/new-shield.md index 2e468fe0..62d71f03 100644 --- a/docs/docs/development/new-shield.md +++ b/docs/docs/development/new-shield.md @@ -6,6 +6,9 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import KeymapExampleFile from '../keymap-example-file.md'; +import InterconnectTabs from "@site/src/components/interconnect-tabs"; +import Metadata from "@site/src/data/hardware-metadata.json"; + ## Overview This guide will walk through the steps necessary to add ZMK support for a keyboard the uses a (Pro Micro compatible) addon MCU board to provide the microprocessor. @@ -115,33 +118,7 @@ endif ## Shield Overlays - - - - -### Pro Micro Shields - -![Labelled Pro Micro pins](../assets/pro-micro/pro-micro-pins-labelled.jpg) - -ZMK uses the blue color coded pin names to generate devicetree node references. For example, to refer to the node `0` in the devicetree files, use `&pro_micro 0`. - - - - - -### BlackPill Shields - -![Labelled BlackPill pins](../assets/blackpill/blackpill-pins-labelled.png) - -ZMK uses the blue color coded pin names to generate devicetree node references. For example, to refer to the node `17` in the devicetree files, use `&blackpill 17`. - - - + + + + + + {interconnect.node_labels && ( + <> + The following node labels are available: +

+ + )} +
+ ); +} + +function mapInterconnectValue(interconnect: Interconnect) { + return { label: `${interconnect.name} Shields`, value: interconnect.id }; +} + +function InterconnectTabs({ items }: InterconnectTabsProps) { + let grouped = Object.values(groupedMetadata(items).interconnects) + .map((i) => i?.interconnect as Interconnect) + .filter((i) => i?.design_guideline) + .sort((a, b) => a.id.localeCompare(b.id)); + + return ( + + {grouped.map(mapInterconnect)} + + ); +} + +export default InterconnectTabs; diff --git a/docs/src/data/interconnects/.gitignore b/docs/src/data/interconnects/.gitignore new file mode 100644 index 00000000..0a00d701 --- /dev/null +++ b/docs/src/data/interconnects/.gitignore @@ -0,0 +1 @@ +*/ \ No newline at end of file diff --git a/docs/src/hardware-metadata-collection-plugin/index.js b/docs/src/hardware-metadata-collection-plugin/index.js index 89f057a8..f118c0ba 100644 --- a/docs/src/hardware-metadata-collection-plugin/index.js +++ b/docs/src/hardware-metadata-collection-plugin/index.js @@ -14,6 +14,22 @@ function generateHardwareMetadataAggregate() { const aggregated = files.flatMap((f) => yaml.loadAll(fs.readFileSync(f, "utf8")) ); + + aggregated + .filter((agg) => agg.type === "interconnect") + .forEach((agg) => { + let baseDir = `src/data/interconnects/${agg.id}`; + if (!fs.existsSync(baseDir)) { + fs.mkdirSync(baseDir); + } + + if (agg.design_guideline) { + fs.writeFileSync( + `${baseDir}/design_guideline.md`, + agg.design_guideline + ); + } + }); fs.writeFileSync( "src/data/hardware-metadata.json", JSON.stringify(aggregated) diff --git a/schema/hardware-metadata.schema.json b/schema/hardware-metadata.schema.json index 49755749..8ca382c5 100644 --- a/schema/hardware-metadata.schema.json +++ b/schema/hardware-metadata.schema.json @@ -85,6 +85,21 @@ } } }, + "interconnect_node_labels": { + "title": "InterconnectNodeLabels", + "type": "object", + "additionalProperties": false, + "required": [ + "gpio" + ], + "properties": { + "gpio": { "type": "string" }, + "i2c": { "type": "string" }, + "spi": { "type": "string" }, + "uart": { "type": "string" }, + "adc": { "type": "string" } + } + }, "interconnect": { "title": "Interconnect", "type": "object", @@ -93,6 +108,7 @@ "file_format", "id", "name", + "description", "url", "type" ], @@ -117,6 +133,12 @@ "description": { "type": "string" }, + "node_labels": { + "$ref": "#/$defs/interconnect_node_labels" + }, + "design_guideline": { + "type": "string" + }, "manufacturer": { "type": "string" }, From 5b9b507de3ef6e7a3bcb1ef61fe6d12ba46b8447 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 5 Jan 2023 03:18:27 +0000 Subject: [PATCH 143/289] fix(ci): Escape ` from JSON metadata files. --- .github/workflows/build.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 92df03c3..c266cf60 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,7 +10,7 @@ on: - ".github/workflows/build.yml" - "app/**" schedule: - - cron: '22 4 * * *' + - cron: "22 4 * * *" jobs: build: @@ -51,7 +51,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: "14.x" - name: Install @actions/artifact run: npm install @actions/artifact - name: Build and upload artifacts @@ -64,7 +64,7 @@ jobs: const artifactClient = artifact.create(); const execSync = require('child_process').execSync; - + const buildShieldArgs = JSON.parse(`${{ matrix.shieldArgs }}`); let error = false; @@ -118,7 +118,7 @@ jobs: const coreCoverage = `${{ needs.core-coverage.outputs.core-include }}` || "[]"; const boardChanges = `${{ needs.board-changes.outputs.boards-include }}` || "[]"; const nightly = `${{ needs.nightly.outputs.nightly-include }}` || "[]"; - + const combined = [ ...JSON.parse(coreCoverage), ...JSON.parse(boardChanges), @@ -148,14 +148,14 @@ jobs: runs-on: ubuntu-latest needs: get-changed-files outputs: - core-include: ${{ steps.core-list.outputs.result }} + core-include: ${{ steps.core-list.outputs.result }} steps: - name: Checkout uses: actions/checkout@v3 - name: Use Node.js uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: "14.x" - name: Install js-yaml run: npm install js-yaml - uses: actions/github-script@v4 @@ -166,7 +166,7 @@ jobs: const yaml = require('js-yaml'); const coreCoverage = yaml.load(fs.readFileSync('app/core-coverage.yml', 'utf8')); - + let include = coreCoverage.board.flatMap(board => coreCoverage.shield.map(shield => ({ board, shield })) ); @@ -184,7 +184,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: "14.x" - name: Install js-yaml run: npm install js-yaml - uses: actions/github-script@v4 @@ -269,7 +269,7 @@ jobs: with: script: | const metadata = JSON.parse(`${{ needs.get-grouped-hardware.outputs.organized-metadata }}`); - + let includeOnboard = metadata.onboard.flatMap(b => { if (b.siblings) { return b.siblings.map(board => ({ @@ -311,7 +311,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: "14.x" - name: Install js-yaml run: npm install js-yaml - name: Aggregate Metadata @@ -329,7 +329,7 @@ jobs: yaml.loadAll(fs.readFileSync(f, "utf8")) ); - return JSON.stringify(aggregated).replace(/\\/g,"\\\\"); + return JSON.stringify(aggregated).replace(/\\/g,"\\\\").replace(/`/g,"\\`"); result-encoding: string - name: Organize Metadata @@ -389,7 +389,7 @@ jobs: - uses: Ana06/get-changed-files@v2.0.0 id: changed-files with: - format: 'json' + format: "json" - uses: actions/github-script@v4 id: board-changes with: From b7b563a4c3c19ddba7b5b300a08c690f149e7d32 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 5 Jan 2023 16:45:00 +0000 Subject: [PATCH 144/289] fix(ci): Fix another spot where ` needs escaping. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c266cf60..6305b741 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -376,7 +376,7 @@ jobs: }, { onboard: [], interconnects: {} }); - return JSON.stringify(grouped).replace(/\\/g,"\\\\"); + return JSON.stringify(grouped).replace(/\\/g,"\\\\").replace(/`/g,"\\`"); result-encoding: string get-changed-files: if: ${{ github.event_name != 'schedule' }} From a82a0ec4969487a0f15cd417b215360465d746d5 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 25 Nov 2022 00:20:53 -0500 Subject: [PATCH 145/289] feat(shields): Add splitkb.com Aurora Lily58. --- .../splitkb_aurora_lily58/Kconfig.defconfig | 55 +++++++++++++ .../splitkb_aurora_lily58/Kconfig.shield | 8 ++ .../boards/nice_nano.overlay | 31 ++++++++ .../boards/nice_nano_v2.overlay | 31 ++++++++ .../splitkb_aurora_lily58.conf | 9 +++ .../splitkb_aurora_lily58.dtsi | 78 +++++++++++++++++++ .../splitkb_aurora_lily58.keymap | 70 +++++++++++++++++ .../splitkb_aurora_lily58.zmk.yml | 12 +++ .../splitkb_aurora_lily58_left.overlay | 43 ++++++++++ .../splitkb_aurora_lily58_right.overlay | 45 +++++++++++ 10 files changed, 382 insertions(+) create mode 100644 app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig create mode 100644 app/boards/shields/splitkb_aurora_lily58/Kconfig.shield create mode 100644 app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay create mode 100644 app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.conf create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig new file mode 100644 index 00000000..bbaef0ff --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig @@ -0,0 +1,55 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_SPLITKB_AURORA_LILY58_LEFT + +config ZMK_KEYBOARD_NAME + default "Aurora Lily58" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif # SHIELD_SPLITKB_AURORA_LILY58_LEFT + +if SHIELD_SPLITKB_AURORA_LILY58_LEFT || SHIELD_SPLITKB_AURORA_LILY58_RIGHT + +config ZMK_SPLIT + default y + +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + +config ZMK_DISPLAY + +if ZMK_DISPLAY + +config SSD1306 + default y + +config I2C + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LVGL_VDB_SIZE + default 64 + +config LVGL_DPI + default 148 + +config LVGL_BITS_PER_PIXEL + default 1 + +choice LVGL_COLOR_DEPTH + default LVGL_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif # SHIELD_SPLITKB_AURORA_LILY58_LEFT || SHIELD_SPLITKB_AURORA_LILY58_RIGHT diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield b/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield new file mode 100644 index 00000000..35f8b2d1 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_SPLITKB_AURORA_LILY58_LEFT + def_bool $(shields_list_contains,splitkb_aurora_lily58_left) + +config SHIELD_SPLITKB_AURORA_LILY58_RIGHT + def_bool $(shields_list_contains,splitkb_aurora_lily58_right) diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay new file mode 100644 index 00000000..eb838b24 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..eb838b24 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.conf b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.conf new file mode 100644 index 00000000..d456100a --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.conf @@ -0,0 +1,9 @@ +# Uncomment these two line to add support for encoders to your firmware +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment the following lines to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi new file mode 100644 index 00000000..08e2ac9e --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; +// | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | +// | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | +// | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | +// | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | +// | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,1) RC(4,10) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) + RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) + >; + }; + + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "L_ENCODER"; + resolution = <4>; + status = "disabled"; + + a-gpios = <&pro_micro 5 GPIO_PULL_UP>; + b-gpios = <&pro_micro 4 GPIO_PULL_UP>; + }; + + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "R_ENCODER"; + resolution = <4>; + status = "disabled"; + + a-gpios = <&pro_micro 18 GPIO_PULL_UP>; + b-gpios = <&pro_micro 19 GPIO_PULL_UP>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap new file mode 100644 index 00000000..376bcf26 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { +// ------------------------------------------------------------------------------------------------------------ +// | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | +// | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | +// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | +// | SHIFT | Z | X | C | V | B | "[" | | "]" | N | M | , | . | / | SHIFT | +// | ALT | GUI | LOWER| SPACE | | ENTER | RAISE| BSPC | GUI | + bindings = < +&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp GRAVE +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS +&kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LALT &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp BSPC &kp RGUI + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + lower_layer { +// ------------------------------------------------------------------------------------------------------------ +// | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | +// | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | +// | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | ~ | +// | | | | | | | | | | | _ | + | { | } | "|" | +// | | | | | | | | | | + bindings = < +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans +&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 +&kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &kp TILDE +&trans &ext_power EP_ON &ext_power EP_OFF &ext_power EP_TOG &trans &trans &trans &trans &trans &kp MINUS &kp PLUS &kp LBRC &kp RBRC &kp PIPE + &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + raise_layer { +// ------------------------------------------------------------------------------------------------------------ +// | | | | | | | | | | | | | | +// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | +// | F1 | F2 | F3 | F4 | F5 | F6 | | | <- | v | ^ | -> | | +// | F7 | F8 | F9 | F10 | F11 | F12 | | | | + | - | = | [ | ] | \ | +// | | | | | | | | | | + bindings = < +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans +&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans +&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans +&kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &kp KP_PLUS &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH + &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml new file mode 100644 index 00000000..47d49a4c --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml @@ -0,0 +1,12 @@ +file_format: "1" +id: splitkb_aurora_lily58 +name: splitkb.com Aurora Lily58 +type: shield +url: https://splitkb.com/products/aurora-lily58-pcb-kit +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys +siblings: + - splitkb_aurora_lily58_left + - splitkb_aurora_lily58_right diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay new file mode 100644 index 00000000..1fa61286 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_lily58.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "row2col"; + + row-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + ; + + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; +}; + +&left_encoder { + status = "okay"; +}; + + diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay new file mode 100644 index 00000000..7f281db9 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_lily58.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "row2col"; + + row-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; + + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; +}; + +&right_encoder { + status = "okay"; +}; + +&default_transform { + col-offset = <6>; +}; From 82ff6d8e857bf581714f2a2e23af3aa6bf4cf4e2 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 8 Jan 2023 16:21:16 -0600 Subject: [PATCH 146/289] docs: update dev env setup guide Renamed the "Basic Setup" page to "Toolchain Setup" to make it clearer that this is for setting up a development environment for local builds. Linked to the relevant Zephyr setup documentation instead of duplicating that information in our guide. This also switches Windows and macOS setup to using the Zephyr SDK, which is much easier to install. Updated the command for installing Zephyr's Python dependencies to be OS specific, as Windows and macOS don't need the --user flag. Updated the IDE integration page with instructions for determining the compiler path that work with the latest version of the Zephyr SDK. --- docs/docs/assets/env-var/env_var.png | Bin 17317 -> 0 bytes docs/docs/assets/env-var/gnuarmemb.png | Bin 7914 -> 0 bytes docs/docs/assets/env-var/new_variable.png | Bin 60899 -> 0 bytes docs/docs/assets/env-var/start_menu.png | Bin 51108 -> 0 bytes docs/docs/assets/env-var/zephyr_toolchain.png | Bin 7282 -> 0 bytes docs/docs/development/ide-integration.md | 85 +-- docs/docs/development/setup.md | 530 +++++------------- 7 files changed, 168 insertions(+), 447 deletions(-) delete mode 100644 docs/docs/assets/env-var/env_var.png delete mode 100644 docs/docs/assets/env-var/gnuarmemb.png delete mode 100644 docs/docs/assets/env-var/new_variable.png delete mode 100644 docs/docs/assets/env-var/start_menu.png delete mode 100644 docs/docs/assets/env-var/zephyr_toolchain.png diff --git a/docs/docs/assets/env-var/env_var.png b/docs/docs/assets/env-var/env_var.png deleted file mode 100644 index 77ebbc5b82a55ad02d4de83a3bcc6e233c4fc3e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17317 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 diff --git a/docs/docs/assets/env-var/gnuarmemb.png b/docs/docs/assets/env-var/gnuarmemb.png deleted file mode 100644 index 42e38ec14bd510665141cc70f5e3d54d434e9ad7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7914 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 cbot+4SZ;auyKYQ*HQUCw| diff --git a/docs/docs/assets/env-var/start_menu.png b/docs/docs/assets/env-var/start_menu.png deleted file mode 100644 index fc7d9b5eac705df2d48502f51ae45a05f143ac76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51108 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 diff --git a/docs/docs/development/ide-integration.md b/docs/docs/development/ide-integration.md index 6ca43321..bfcd5def 100644 --- a/docs/docs/development/ide-integration.md +++ b/docs/docs/development/ide-integration.md @@ -59,86 +59,41 @@ click **Add Configuration**, enter a name, and click **OK**. Change these options: -| Option | Value | -| ------------------------------------- | ---------------------------------------------------- | -| Compiler path | Path to your toolchain's GCC binary (see below) | -| IntelliSense mode | gcc-arm | -| Advanced Settings > Compiler commands | `${workspaceFolder}/app/build/compile_commands.json` | +| Option | Value | +| ------------------------------------- | ------------------------------------------------------ | +| Compiler path | Path to your toolchain's GCC binary (see below) | +| IntelliSense mode | `linux-gcc-arm`, `windows-gcc-arm`, or `macos-gcc-arm` | +| Advanced Settings > Compiler commands | `${workspaceFolder}/app/build/compile_commands.json` | + +If you are developing inside a Docker container, set the IntelliSense mode to `linux-gcc-arm` regardless of the host operating system. #### Compiler Path - - - -Open VS Code's integrated terminal and run the following commands. It will print -your compiler path. - -```sh -source zephyr/zephyr-env.sh -echo ${ZEPHYR_SDK_INSTALL_DIR}/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc -``` - -:::note -You will need to update this path any time you switch to a new version of the Zephyr SDK. -::: - - - - -Your compiler path is +Open VS Code's integrated terminal and run the following command: ``` -${env:GNUARMEMB_TOOLCHAIN_PATH}/bin/arm-none-eabi-gcc.exe +cmake -P zephyr/cmake/verify-toolchain.cmake ``` -This assumes `GNUARMEMB_TOOLCHAIN_PATH` is set in your system or user environment variables. -If not, you will need to list the full path instead of using the `${env}` placeholder. - - - - -Open VS Code's integrated terminal and run the following command. It will print -your compiler path. - -```sh -echo ${GNUARMEMB_TOOLCHAIN_PATH}/bin/arm-none-eabi-gcc -``` - - - - -Your compiler path is +This should print something like ``` -/usr/bin/arm-none-eabi-gcc +-- ZEPHYR_TOOLCHAIN_VARIANT: zephyr +-- SDK_VERSION: 0.15.2 +-- ZEPHYR_SDK_INSTALL_DIR : /home/marvin/.local/zephyr-sdk-0.15.2 ``` - - - -Open VS Code's integrated terminal and run the following commands. It will print -your compiler path. - -```sh -source zephyr/zephyr-env.sh -echo ${ZEPHYR_SDK_INSTALL_DIR}/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc -``` - -:::note -You will need to update this path any time you switch to a new version of the Zephyr SDK. -::: - - - - -Your compiler path is +Your compiler path is the value of `ZEPHYR_SDK_INSTALL_DIR` plus `/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc`, for example: ``` -${env:ZEPHYR_SDK_INSTALL_DIR}/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc +/home/marvin/.local/zephyr-sdk-0.15.2/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc ``` - - +If you are building for an platform other than ARM, replace `/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc` with the path to the compiler for the appropriate architecture, for example: + +``` +/home/marvin/.local/zephyr-sdk-0.15.2/riscv64-zephyr-elf/bin/riscv64-zephyr-elf-gcc +``` #### Compiler Commands Path diff --git a/docs/docs/development/setup.md b/docs/docs/development/setup.md index bf1bd122..8ce5ffde 100644 --- a/docs/docs/development/setup.md +++ b/docs/docs/development/setup.md @@ -1,6 +1,6 @@ --- -title: Basic Setup -sidebar_label: Basic Setup +title: Toolchain Setup +sidebar_label: Toolchain Setup --- import Tabs from '@theme/Tabs'; @@ -10,287 +10,84 @@ export const OsTabs = (props) => ({props.children}); -## Prerequisites +This guide will show you how to set up a development environment for building ZMK locally. -ZMK requires the following base packages to first be installed: +## Install Dependencies -- Git -- Python 3 -- `pip` -- `wget` -- devicetree compiler -- CMake -- `dfu-util` -- Various build essentials, e.g. gcc, automake, autoconf +Click the operating system you are using. (The VS Code & Docker option can be used on any OS.) + + +This option use the same [Docker image which is used by the GitHub action](https://github.com/zmkfirmware/zmk-docker) for local development. Beyond the benefits of [dev/prod parity](https://12factor.net/dev-prod-parity), this approach is also the easiest to set up. No toolchain or dependencies are necessary when using Docker; the container image you'll be using already has the toolchain installed and set up to use. + +1. Install [Docker Desktop](https://www.docker.com/products/docker-desktop) for your operating system. +2. Install [Visual Studio Code](https://code.visualstudio.com/) +3. Install the [Remote - Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) + +:::info +The docker container already includes `west`. Skip past the following section to [Get Source Code](#get-source-code). +::: + + -On Debian and Ubuntu, we'll use `apt` to install our base dependencies: +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions under these sections: -First, if you haven't updated recently, or if this is a new install, -you should update to get the latest package information: +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) +- [Install Zephyr SDK](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-zephyr-sdk) -```sh -sudo apt update -``` - -With the latest package information, you can now install the base dependencies: - -```sh -sudo apt install -y \ - git \ - wget \ - autoconf \ - automake \ - build-essential \ - bzip2 \ - ccache \ - device-tree-compiler \ - dfu-util \ - g++ \ - gcc \ - libtool \ - make \ - ninja-build \ - cmake \ - python3-dev \ - python3-pip \ - python3-setuptools \ - xz-utils -``` - -:::note -Recent LTS releases of Debian and Ubuntu may include outdated CMake versions. If the output of `cmake --version` is older than 3.20, upgrade your distribution (e.g., from Ubuntu 20.04 LTS to Ubuntu 22.04 LTS), or else install CMake version 3.20 or newer manually (e.g, from Debian backports or from PyPI with `pip install --user cmake`). -::: - - - -On Raspberry OS, we'll use `apt` to install our base dependencies: - -First, if you haven't updated recently, or if this is a new install, -you should update to get the latest package information: - -```sh -sudo apt update -``` - -With the latest package information, you can now install the base dependencies: - -```sh -sudo apt install -y \ - git \ - wget \ - autoconf \ - automake \ - build-essential \ - bzip2 \ - ccache \ - device-tree-compiler \ - dfu-util \ - g++ \ - gcc \ - libtool \ - make \ - ninja-build \ - cmake \ - python3-dev \ - python3-pip \ - python3-setuptools \ - xz-utils -``` - - - - -On Fedora, we'll use `dnf` to install our base dependencies: - -#### DNF Update - -First, if you haven't updated recently, or if this is a new install, -you should update to get the latest package information: - -```sh -sudo dnf update -``` - -#### Install Dependencies - -With the latest package information, you can now install the base dependencies: - -```sh -sudo dnf install -y \ - git \ - wget \ - autoconf \ - automake \ - bzip2 \ - ccache \ - dtc \ - dfu-util \ - g++ \ - gcc \ - libtool \ - make \ - ninja-build \ - cmake \ - python3-devel \ - python3-pip \ - python3-setuptools \ - xz -``` +Return to this guide once you are finished with each section. -:::note -Use `cmd.exe` with these instructions rather than PowerShell. -::: +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions under these sections: -Chocolatey is recommended and used for the following instructions. You can manually install each of these applications and add them to your `PATH` if you don't want to use Chocolatey. +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) +- [Install Zephyr SDK](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-zephyr-sdk) -1. [Install Chocolatey](https://chocolatey.org/install) -2. Open `cmd.exe` as **Administrator** -3. Run the following `choco` commands: - ```shell - choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System' - choco install ninja gperf python git - ``` +Return to this guide once you are finished with each section. -It is recommended to install `dfu-util` to avoid any later confusion while flashing devices. You can do this by running this command with chocolatey: - -```shell -choco install dfu-util -``` +`dfu-util` is required to flash devices that use DFU, but there is currently no maintained package for it on Chocolatey. [QMK Toolbox](https://github.com/qmk/qmk_toolbox) contains a working version of it though. -#### Homebrew +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions under these sections: -Homebrew is required to install the system dependencies. If you haven't done so, visit [Homebrew](https://brew.sh/) for instructions. Once installed, use it to install the base dependencies: +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) +- [Install Zephyr SDK](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-zephyr-sdk) -``` -brew install cmake ninja python3 ccache dtc git wget dfu-util -``` - - - - -This setup leverages the same [image which is used by the GitHub action](https://github.com/zmkfirmware/zmk-docker) for local development. Beyond the benefits of [dev/prod parity](https://12factor.net/dev-prod-parity), this approach is also the easiest to set up. No toolchain or dependencies are necessary when using Docker; the container image you'll be using already has the toolchain installed and set up to use. - -1. Install [Docker Desktop](https://www.docker.com/products/docker-desktop) for your operating system. -2. Install [VS Code](https://code.visualstudio.com/) -3. Install the [Remote - Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) - -:::info -The docker container includes `west` and the compilation toolchain. If you're using docker and VS Code, you can skip right to [Source Code](#source-code). -::: - - - - -## Setup - -### West Installation - -`west` is the [Zephyr™ meta-tool](https://docs.zephyrproject.org/2.5.0/guides/west/index.html) used to configure and build Zephyr™ applications. - -West can be installed by using the `pip` python package manager. The [Zephyr™ instructions](https://docs.zephyrproject.org/2.5.0/guides/west/install.html#installing-west) are summarized here: - - - - -```sh -pip3 install --user -U west -``` - - - - -In `cmd.exe` as **Administrator**: - -```sh -pip3 install -U west -``` - -:::note -**For Windows, do not use the `--user` argument** that Linux uses otherwise `west` will be installed in a different location and the below instructions for adding Python `pip` will no longer apply. -::: - -Once `west` is installed, close Command Prompt and open a new session as a **user** for the remainder of the instructions. - - - - -:::danger `pip` user packages -If you haven't done so yet, you may need to add the Python `pip` package directory to your `PATH` otherwise your computer will not be able to find the `west` command. -::: - - - -Run the following commands: - -```sh -echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc -source ~/.bashrc -``` - - - - -1. See the [Environment Variables](#environment-variables) section on how to get to the Environment Variables page. -2. Under "System variables" select the "Path" variable. Click "Edit..." and then "New" to add the directory where your `west.exe` is located. By default this should be `C:\Python##\Scripts` where ## is your Python version number. -3. Close Command Prompt and open a new session for the changes to take effect, or run `refreshenv`. - - - - -### Toolchain Installation - -The toolchain provides the compiler, linker, etc., necessary to build for the target -platform. - - - - -#### Zephyr™ ARM SDK - -To build firmwares for the ARM architecture (all supported MCUs/keyboards at this point), you'll need to install the Zephyr™ ARM SDK to your system: - -``` -export ZSDK_VERSION=0.13.2 -wget -q "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZSDK_VERSION}/zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" && \ - sh "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" --quiet -- -d ~/.local/zephyr-sdk-${ZSDK_VERSION} && \ - rm "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" -``` - -The installation will prompt with several questions about installation location, and creating a default `~/.zephyrrc` for you with various variables. The defaults should normally work as expected. +Return to this guide once you are finished with each section. -Because Raspberry OS (Raspbian) runs on the same architecture (but different ABI) as the keyboard MCUs, -the operating system's installed [cross compilers](https://docs.zephyrproject.org/2.5.0/getting_started/toolchain_other_x_compilers.html) can be used to target the different ABI. +#### Install Base Dependencies + +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions for Ubuntu under these sections: + +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) + +Return to this guide once you are finished with each section. + +#### Install Cross-Compile Toolchain + +Because Raspberry OS runs on the same architecture (but different ABI) as ARM keyboard MCUs, the operating system's installed [cross compilers](https://docs.zephyrproject.org/3.2.0/develop/toolchains/other_x_compilers.html) can be used to target the different ABI. Building for non-ARM MCUs has not been tested. First, the cross compiler should be installed: @@ -298,7 +95,7 @@ First, the cross compiler should be installed: sudo apt install gcc-arm-none-eabi ``` -Next, we'll configure Zephyr™ with some extra environment variables needed to find the cross compiler by adding the following to `~/.zephyrrc`: +Next, we'll configure Zephyr with some [environment variables](https://docs.zephyrproject.org/3.2.0/develop/env_vars.html#env-vars) needed to find the cross compiler. Create a file named `~/.zephyrrc` if it doesn't exist, and add these lines to it: ```sh export ZEPHYR_TOOLCHAIN_VARIANT=cross-compile @@ -308,50 +105,83 @@ export CROSS_COMPILE=/usr/bin/arm-none-eabi- -#### Zephyr™ ARM SDK - -To build firmwares for the ARM architecture (all supported MCUs/keyboards at this point), you'll need to install the Zephyr™ ARM SDK to your system: - -``` -export ZSDK_VERSION=0.13.2 -wget -q "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZSDK_VERSION}/zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" && \ - sh "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" --quiet -- -d ~/.local/zephyr-sdk-${ZSDK_VERSION} && \ - rm "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" -``` - -The installation will prompt with several questions about installation location, and creating a default `~/.zephyrrc` for you with various variables. The defaults should normally work as expected. - - - - -#### GNU ARM Embedded - -Since the Zephyr™ SDK is not available for Windows, we recommending following the [Zephyr documentation](https://docs.zephyrproject.org/2.5.0/getting_started/toolchain_3rd_party_x_compilers.html#gnu-arm-embedded) to install a GNU ARM Embedded build. Note the warnings regarding installing the toolchain into a path with spaces, and make sure to follow the steps to add the environment variables which are also summarized with screenshots in the [Environment Variables](#environment-variables) section below. - - - - -#### GNU ARM Embedded - -Since the Zephyr™ SDK is not available for macOS, we recommending following the steps to install the GNU ARM Embedded toolchain: - -``` -brew install --cask gcc-arm-embedded -``` +Follow Zephyr's [Install Linux Host Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/installation_linux.html) documentation for Fedora. -:::note -If you intend to build firmware straight away, make sure to correctly setup the current shell. +### Install West -Notes on setting this up can be found in the [Environment Variables](#environment-variables) section. -The transient instructions can be used to setup the current shell, and the automatic instructions can setup any newly made shells automatically. +`west` is the [Zephyr® Project's meta-tool](https://docs.zephyrproject.org/3.2.0/develop/west/index.html) used to configure and build Zephyr OS applications. -The transient instructions must be run to build firmware using the current shell. -::: +West can be installed by using the `pip` python package manager. The [Zephyr™ instructions](https://docs.zephyrproject.org/3.2.0/develop/west/install.html) are summarized here: -### Source Code + + + +Install west: + +```sh +pip3 install --user -U west +``` + +Verify that west is installed: + +```sh +west --version +``` + +This should print a message like "West version: v0.14.0". If it prints an error instead, make sure `~/.local/bin` is on your `PATH` environment variable. You can add it with these commands: + +```sh +echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc +source ~/.bashrc +``` + + + + +Install west: + +```sh +pip3 install -U west +``` + +Verify that west is installed: + +```sh +west --version +``` + +This should print a message like "West version: v0.14.0". If it prints an error instead, make sure that the Python scripts directory is on your `PATH` environment variable. You can add it by opening a PowerShell window and running the following commands: + +```powershell +$Scripts = python -c "import sysconfig; print(sysconfig.get_path('scripts'))" +$Path = [Environment]::GetEnvironmentVariable('PATH', 'User') +[Environment]::SetEnvironmentVariable('PATH', "$Path;$Scripts", 'User') +$env:PATH += ";$Scripts" +``` + + + + +Install west: + +```sh +pip3 install -U west +``` + + + + +## Get Source Code Next, you'll need to clone the ZMK source repository if you haven't already. Navigate to the folder you would like to place your `zmk` directory in and run the following command: @@ -359,13 +189,13 @@ Next, you'll need to clone the ZMK source repository if you haven't already. Nav git clone https://github.com/zmkfirmware/zmk.git ``` -### Initialize & Update Zephyr Workspace +## Initialize & Update Zephyr Workspace Since ZMK is built as a Zephyr™ application, the next step is to use `west` to initialize and update your workspace. The ZMK Zephyr™ application is in the `app/` source directory: -#### Step into the repository +### Step into the repository @@ -421,19 +251,13 @@ All subsequent steps must be performed from the VS Code terminal _inside_ the co -#### Initialize West +### Initialize the Application ```sh west init -l app/ ``` -:::caution Command Not Found? -If you encounter errors like `command not found: west` then your `PATH` environment variable is likely -missing the Python 3 user packages directory. See the [West Build Command](#west-build-command) -section again for links to how to do this -::: - -#### Update To Fetch Modules +### Update to Fetch Modules ```sh west update @@ -449,103 +273,45 @@ If you're using Docker, you're done with setup! You must restart the container a Once your container is restarted, proceed to [Building and Flashing](development/build-flash.md). ::: -#### Export Zephyr™ Core +### Export Zephyr CMake package + +This allows CMake to load the code needed to build ZMK. ```sh west zephyr-export ``` -#### Install Zephyr Python Dependencies +### Install Zephyr Python Dependencies + +Some additional Python dependencies are listed in Zephyr's `scripts/requirements.txt` file. + + + ```sh -pip3 install --user -r zephyr/scripts/requirements-base.txt -``` - -### Environment Variables - - - - -#### For GNU ARM Embedded on Windows - -On Windows, only two environment variables need to be set for ZMK to build properly: `ZEPHYR_TOOLCHAIN_VARIANT` and `GNUARMEMB_TOOLCHAIN_PATH`. - -1. Open Start Menu and type 'env' to find the 'Edit the system environment variables' option. Open it. - -![Environment variables in Start Menu](../assets/env-var/start_menu.png) - -2. Click 'Environment Variables...'. - -![Environment variables button](../assets/env-var/env_var.png) - -3. Click "New..." under System variables to create a new system variable. - -![Environment variables menu](../assets/env-var/new_variable.png) - -4. Set the variable name to 'ZEPHYR_TOOLCHAIN_VARIANT' and value to 'gnuarmemb'. Click OK to save. - -![Adding Zephyr toolchain variable](../assets/env-var/zephyr_toolchain.png) - -5. Create another variable with variable name 'GNUARMEMB_TOOLCHAIN_PATH' and value set to wherever you installed your toolchain. **Make sure this path does not contain any spaces.** If it does, rename the folder and update here. Click OK to save. - -![Adding GNUARMEMB variable](../assets/env-var/gnuarmemb.png) - -6. Close Command Prompt and reopen, or run `refreshenv` to apply the changes. - - - - - -#### For Zephyr - -By default, the Zephyr™ SDK will create a file named `~/.zephyrrc` with the correct environment variables to build ZMK. -We suggest two main [options](https://docs.zephyrproject.org/2.5.0/guides/env_vars.html#option-3-using-zephyrrc-files) for how to load those settings. - -##### Per Shell - -To load the Zephyr environment properly for just one transient shell, run the following from your ZMK checkout directory: - -``` -source zephyr/zephyr-env.sh -``` - -##### All Shells - -To load the environment variables for your shell every time, -append the existing `~/.zephyrrc` file to your shell's RC file and then start a new shell. - - - - - -``` -cat ~/.zephyrrc >> ~/.bashrc +pip3 install --user -r zephyr/scripts/requirements.txt ``` + - - -``` -cat ~/.zephyrrc >> ~/.zshrc +```sh +pip3 install -r zephyr/scripts/requirements.txt ``` + - - - - +```sh +pip3 install -r zephyr/scripts/requirements.txt +``` + + From fbdb24c6fe56a576e288db3acfd91dd67a6ff192 Mon Sep 17 00:00:00 2001 From: zhiayang Date: Wed, 21 Dec 2022 17:45:01 +0800 Subject: [PATCH 147/289] fix(driver): Fix potentially buggy read/write routines for max7318 driver --- app/drivers/gpio/gpio_max7318.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/app/drivers/gpio/gpio_max7318.c b/app/drivers/gpio/gpio_max7318.c index 3dcc710c..ac9c5341 100644 --- a/app/drivers/gpio/gpio_max7318.c +++ b/app/drivers/gpio/gpio_max7318.c @@ -72,17 +72,19 @@ struct max7318_drv_data { static int read_registers(const struct device *dev, uint8_t reg, uint16_t *buf) { const struct max7318_config *config = dev->config; - uint16_t data = 0; - int ret = i2c_burst_read_dt(&config->i2c_bus, reg, (uint8_t *)&data, sizeof(data)); + uint8_t data[2] = { 0 }; + int ret = i2c_burst_read_dt(&config->i2c_bus, reg, &data[0], sizeof(data)); if (ret) { - LOG_DBG("i2c_write_read FAIL %d\n", ret); + LOG_DBG("i2c_burst_read FAIL %d\n", ret); return ret; } - *buf = sys_le16_to_cpu(data); + // the first register is data[0], the second one is data[1] + // since we only ever read the PORTA registers here, it's effectively little endian. + *buf = sys_get_le16(data); - LOG_DBG("max7318: read: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, (*buf & 0xFF), (reg + 1), - (*buf >> 8)); + LOG_DBG("max7318: read: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, data[0], (reg + 1), + data[1]); return 0; } @@ -105,9 +107,13 @@ static int write_registers(const struct device *dev, uint8_t reg, uint16_t value LOG_DBG("max7318: write: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, (value & 0xFF), (reg + 1), (value >> 8)); - uint16_t data = sys_cpu_to_le16(value); + uint8_t data[2] = { 0 }; - return i2c_burst_write_dt(&config->i2c_bus, reg, (uint8_t *)&data, sizeof(data)); + // bits 0..7 are port A, 8..15 are port B, so we should write bits 0..7 first + // -- ie. this is little endian also. + sys_put_le16(value, &data[0]); + + return i2c_burst_write_dt(&config->i2c_bus, reg, &data[0], sizeof(data)); } /** From 41830ce19a71ac94a2e620d59c4d0a03ca6d093c Mon Sep 17 00:00:00 2001 From: zhiayang Date: Sun, 8 Jan 2023 16:52:38 +0800 Subject: [PATCH 148/289] fix formatting --- app/drivers/gpio/gpio_max7318.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/drivers/gpio/gpio_max7318.c b/app/drivers/gpio/gpio_max7318.c index ac9c5341..04424b48 100644 --- a/app/drivers/gpio/gpio_max7318.c +++ b/app/drivers/gpio/gpio_max7318.c @@ -72,7 +72,7 @@ struct max7318_drv_data { static int read_registers(const struct device *dev, uint8_t reg, uint16_t *buf) { const struct max7318_config *config = dev->config; - uint8_t data[2] = { 0 }; + uint8_t data[2] = {0}; int ret = i2c_burst_read_dt(&config->i2c_bus, reg, &data[0], sizeof(data)); if (ret) { LOG_DBG("i2c_burst_read FAIL %d\n", ret); @@ -83,8 +83,7 @@ static int read_registers(const struct device *dev, uint8_t reg, uint16_t *buf) // since we only ever read the PORTA registers here, it's effectively little endian. *buf = sys_get_le16(data); - LOG_DBG("max7318: read: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, data[0], (reg + 1), - data[1]); + LOG_DBG("max7318: read: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, data[0], (reg + 1), data[1]); return 0; } @@ -107,7 +106,7 @@ static int write_registers(const struct device *dev, uint8_t reg, uint16_t value LOG_DBG("max7318: write: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, (value & 0xFF), (reg + 1), (value >> 8)); - uint8_t data[2] = { 0 }; + uint8_t data[2] = {0}; // bits 0..7 are port A, 8..15 are port B, so we should write bits 0..7 first // -- ie. this is little endian also. From 2a5e914a777e4569bfbf08921750b928323d155b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 03:40:37 +0000 Subject: [PATCH 149/289] chore(deps): bump json5 from 2.2.1 to 2.2.3 in /docs Bumps [json5](https://github.com/json5/json5) from 2.2.1 to 2.2.3. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v2.2.1...v2.2.3) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 69ee0fc4..c4cad7c0 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -9158,9 +9158,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -22650,9 +22650,9 @@ "dev": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonfile": { "version": "6.1.0", From 9d1070a140942f2e48dfbb811b07d3ad8a71d594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Bol=C3=ADvar?= Date: Wed, 1 Feb 2023 08:17:23 -0800 Subject: [PATCH 150/289] chore(build): update west.yml syntax MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit West has supported a 'name-blocklist' replacement for 'name-blacklist' since v0.9. Signed-off-by: Martí Bolívar --- app/west.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/west.yml b/app/west.yml index a0c56501..b0f05aed 100644 --- a/app/west.yml +++ b/app/west.yml @@ -10,8 +10,7 @@ manifest: revision: v3.0.0+zmk-fixes clone-depth: 1 import: - # TODO: Rename once upstream offers option like `exclude` or `denylist` - name-blacklist: + name-blocklist: - ci-tools - hal_altera - hal_cypress From b7d5865e40eeaf7999a73fdaff1d7043babbc73e Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Thu, 2 Feb 2023 17:07:33 +0800 Subject: [PATCH 151/289] feat(docs): additional note on bug fixed in macOS v13.1 --- docs/docs/troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index a535a4ef..96f729b9 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -23,7 +23,7 @@ Variations of the warnings shown below occur when flashing the `.uf2` ### macOS Ventura error -macOS 13.0 (Ventura) Finder may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. +macOS 13.0 (Ventura) Finder may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. Issue is fixed in macOS version 13.1. ### CMake Error From c065d451cb82e2dceda4efdb2991aeeeef1cdbbf Mon Sep 17 00:00:00 2001 From: Omri Kaplan Date: Wed, 8 Feb 2023 03:29:38 +0200 Subject: [PATCH 152/289] fix(shields): Fix keycodes that differ from the default keymap (#1590) - Asterisk in layer 1 was mapped to 8 - Underscore in layer 1 was mapped to minus - Right GUI in layer 0 was mapped to right Alt - Space in layer 1 was mapped to Return - Plus was mapped with KP_PLUS --- app/boards/shields/reviung41/reviung41.keymap | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/boards/shields/reviung41/reviung41.keymap b/app/boards/shields/reviung41/reviung41.keymap index f0450b19..d291ca8b 100644 --- a/app/boards/shields/reviung41/reviung41.keymap +++ b/app/boards/shields/reviung41/reviung41.keymap @@ -23,26 +23,26 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &mt RSHFT RET - &kp LALT &mo 1 &kp SPACE &mo 2 &kp RALT + &kp LALT &mo 1 &kp SPACE &mo 2 &kp RGUI >; }; lower_layer { -// ---------------------------------------------------------------------------------- -// | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | DEL | -// | | _ | + | { | } | "|" | | LFT | DWN | UP | RGT | ` | ~ | -// | | ESC | GUI | ALT | CAPS| " | | HOME| END | PGUP| PGDN| PRSC| SHFT(RET) | +// ------------------------------------------------------------------------------------ +// | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | DEL | +// | | _ | + | { | } | "|" | | LFT | DWN | UP | RGT | ` | ~ | +// | | ESC | GUI | ALT | CAPS| " | | HOME| END | PGUP| PGDN| PRSC| SHFT(SPACE) | // | | | RET | ADJ | | bindings = < - &trans &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp N8 &kp LPAR &kp RPAR &kp DEL - &trans &kp MINUS &kp KP_PLUS &kp LBRC &kp RBRC &kp PIPE &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp GRAVE &kp TILDE - &trans &kp ESC &kp LGUI &kp LALT &kp CLCK &kp DQT &kp HOME &kp END &kp PG_UP &kp PG_DN &kp PSCRN &mt RSHFT RET + &trans &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp DEL + &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp GRAVE &kp TILDE + &trans &kp ESC &kp LGUI &kp LALT &kp CLCK &kp DQT &kp HOME &kp END &kp PG_UP &kp PG_DN &kp PSCRN &mt RSHFT SPACE &trans &trans &kp RET &mo 3 &trans >; }; raise_layer { -// ----------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- // | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | // | | - | = | [ | ] | \ | | F1 | F2 | F3 | F4 | F5 | F6 | // | | ESC | GUI | ALT | CAPS| " | | F7 | F8 | F9 | F10 | F11 | F12 | From 72624a41fa627b143124f68ac38af72d18722015 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 18 Feb 2023 22:29:03 -0800 Subject: [PATCH 153/289] fix(shields): Add missing col-offsets for extra transforms --- app/boards/shields/corne/corne_right.overlay | 4 ++++ app/boards/shields/jian/jian_right.overlay | 8 ++++++++ app/boards/shields/jiran/jiran_right.overlay | 8 ++++++++ app/boards/shields/jorne/jorne_right.overlay | 8 ++++++++ app/boards/shields/kyria/kyria_rev2_right.overlay | 4 ++++ app/boards/shields/kyria/kyria_right.overlay | 4 ++++ 6 files changed, 36 insertions(+) diff --git a/app/boards/shields/corne/corne_right.overlay b/app/boards/shields/corne/corne_right.overlay index 6e79a858..1d7ed9ec 100644 --- a/app/boards/shields/corne/corne_right.overlay +++ b/app/boards/shields/corne/corne_right.overlay @@ -10,6 +10,10 @@ col-offset = <6>; }; +&five_column_transform { + col-offset = <6>; +}; + &kscan0 { col-gpios = <&pro_micro 14 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/jian/jian_right.overlay b/app/boards/shields/jian/jian_right.overlay index f3b0da3d..cac83fd3 100644 --- a/app/boards/shields/jian/jian_right.overlay +++ b/app/boards/shields/jian/jian_right.overlay @@ -10,6 +10,14 @@ col-offset = <6>; }; +&crkbd_transform { + col-offset = <6>; +}; + +&five_column_transform { + col-offset = <6>; +}; + &kscan0 { col-gpios = <&pro_micro 16 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/jiran/jiran_right.overlay b/app/boards/shields/jiran/jiran_right.overlay index 75b9fb5a..c3648797 100644 --- a/app/boards/shields/jiran/jiran_right.overlay +++ b/app/boards/shields/jiran/jiran_right.overlay @@ -10,6 +10,14 @@ col-offset = <6>; }; +&jian_transform { + col-offset = <6>; +}; + +&crkbd_transform { + col-offset = <6>; +}; + &kscan0 { col-gpios = <&pro_micro 7 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/jorne/jorne_right.overlay b/app/boards/shields/jorne/jorne_right.overlay index 4f138b0b..698bf9dd 100644 --- a/app/boards/shields/jorne/jorne_right.overlay +++ b/app/boards/shields/jorne/jorne_right.overlay @@ -10,6 +10,14 @@ col-offset = <6>; }; +&crkbd_transform { + col-offset = <6>; +}; + +&five_column_transform { + col-offset = <6>; +}; + &kscan0 { col-gpios = <&pro_micro 14 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/kyria/kyria_rev2_right.overlay b/app/boards/shields/kyria/kyria_rev2_right.overlay index 7476bcba..08dc59d1 100644 --- a/app/boards/shields/kyria/kyria_rev2_right.overlay +++ b/app/boards/shields/kyria/kyria_rev2_right.overlay @@ -10,6 +10,10 @@ col-offset = <8>; }; +&five_column_transform { + col-offset = <7>; +}; + &kscan0 { row-gpios = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> diff --git a/app/boards/shields/kyria/kyria_right.overlay b/app/boards/shields/kyria/kyria_right.overlay index eefd76bf..b3b3420e 100644 --- a/app/boards/shields/kyria/kyria_right.overlay +++ b/app/boards/shields/kyria/kyria_right.overlay @@ -10,6 +10,10 @@ col-offset = <8>; }; +&five_column_transform { + col-offset = <7>; +}; + &kscan0 { col-gpios = <&pro_micro 10 GPIO_ACTIVE_HIGH> From 5d22d76d726afbe67ba0e8dc908c342641ab8f58 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 18 Feb 2023 22:31:23 -0800 Subject: [PATCH 154/289] fix(shields): Fix Kyria five column transforms --- app/boards/shields/kyria/kyria.dtsi | 8 ++++---- app/boards/shields/kyria/kyria_rev2.dtsi | 10 +++++----- app/boards/shields/kyria/kyria_rev2_right.overlay | 2 +- app/boards/shields/kyria/kyria_right.overlay | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/boards/shields/kyria/kyria.dtsi b/app/boards/shields/kyria/kyria.dtsi index 1b0ca940..cffe23b0 100644 --- a/app/boards/shields/kyria/kyria.dtsi +++ b/app/boards/shields/kyria/kyria.dtsi @@ -36,10 +36,10 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) columns = <14>; rows = <4>; map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) -RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) - RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) +RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) +RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) +RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) >; }; }; diff --git a/app/boards/shields/kyria/kyria_rev2.dtsi b/app/boards/shields/kyria/kyria_rev2.dtsi index 7c7d9efe..b40af365 100644 --- a/app/boards/shields/kyria/kyria_rev2.dtsi +++ b/app/boards/shields/kyria/kyria_rev2.dtsi @@ -36,10 +36,10 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) columns = <14>; rows = <4>; map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) -RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) - RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) +RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) +RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) +RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) + RC(3,2) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) >; }; }; @@ -52,4 +52,4 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) &right_encoder { a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/kyria/kyria_rev2_right.overlay b/app/boards/shields/kyria/kyria_rev2_right.overlay index 08dc59d1..9e29c6f7 100644 --- a/app/boards/shields/kyria/kyria_rev2_right.overlay +++ b/app/boards/shields/kyria/kyria_rev2_right.overlay @@ -11,7 +11,7 @@ }; &five_column_transform { - col-offset = <7>; + col-offset = <8>; }; &kscan0 { diff --git a/app/boards/shields/kyria/kyria_right.overlay b/app/boards/shields/kyria/kyria_right.overlay index b3b3420e..00ba5b2f 100644 --- a/app/boards/shields/kyria/kyria_right.overlay +++ b/app/boards/shields/kyria/kyria_right.overlay @@ -11,7 +11,7 @@ }; &five_column_transform { - col-offset = <7>; + col-offset = <8>; }; &kscan0 { From 0c0ebda65b6f384b8bd827365cd5d23702bc04b3 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 20 Feb 2023 22:17:12 -0800 Subject: [PATCH 155/289] fix(keymap): Fix default Ergodash keymap --- app/boards/shields/ergodash/ergodash.keymap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/shields/ergodash/ergodash.keymap b/app/boards/shields/ergodash/ergodash.keymap index 65cc1178..a85c58a6 100644 --- a/app/boards/shields/ergodash/ergodash.keymap +++ b/app/boards/shields/ergodash/ergodash.keymap @@ -53,7 +53,7 @@ * .----------------------------------------------------------------------------------------------------------------------. */ /* FIXME boot and reset are not yet locale aware */ bindings = < -&kp F11 &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp &none &kp &none &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F12 +&kp F11 &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &none &none &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F12 &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &trans &bootloader &reset &none &none &none &none &none &none &none &none &none &none &trans From 3eee53676f793fb352d6cabe9e471106b7878fbb Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 20 Feb 2023 22:06:56 -0800 Subject: [PATCH 156/289] fix(shields): Fix missing binding in eek keymap --- app/boards/shields/eek/eek.keymap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/boards/shields/eek/eek.keymap b/app/boards/shields/eek/eek.keymap index f54dc013..439c90aa 100644 --- a/app/boards/shields/eek/eek.keymap +++ b/app/boards/shields/eek/eek.keymap @@ -48,9 +48,9 @@ bindings = < &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &out OUT_USB &out OUT_BLE &none &kp EQUAL &kp MINUS &kp CAPS &kp F5 &kp F6 &kp F7 &kp F8 &kp LBKT &kp RBKT &none &kp GRAVE &kp BSLH - &kp LSHFT &kp F9 &kp F10 &kp F11 &kp F12 &none &none &none &kp RSHFT + &kp LSHFT &kp F9 &kp F10 &kp F11 &kp F12 &none &none &none &none &kp RSHFT &kp LCTRL &kp LGUI &kp LALT &reset &none &trans >; }; }; -}; \ No newline at end of file +}; From 1d65661efa3e19db59d453df6eb1139fb97df836 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 20 Feb 2023 23:24:11 -0800 Subject: [PATCH 157/289] fix(keymap): Fix tidbit keymap --- app/boards/shields/tidbit/tidbit.keymap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/shields/tidbit/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index 646a5db7..7fa98af2 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -26,7 +26,7 @@ bindings = < &kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_PLUS - &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &kp &none + &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &none &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 < 1 KP_ENTER &none &kp KP_NUMBER_0 &kp KP_DOT &none >; From 719de801e7b39bf9a7e89e468cc9f46f824146f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 01:29:24 +0000 Subject: [PATCH 158/289] chore(deps): bump @sideway/formula from 3.0.0 to 3.0.1 in /docs Bumps [@sideway/formula](https://github.com/sideway/formula) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/sideway/formula/releases) - [Commits](https://github.com/sideway/formula/compare/v3.0.0...v3.0.1) --- updated-dependencies: - dependency-name: "@sideway/formula" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index c4cad7c0..93a980c2 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -3045,9 +3045,9 @@ } }, "node_modules/@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", @@ -18139,9 +18139,9 @@ } }, "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" }, "@sideway/pinpoint": { "version": "2.0.0", From 5ef6f2f2b7fc059f4992b70752be5f79b1bca129 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 Feb 2023 05:50:58 +0000 Subject: [PATCH 159/289] chore(deps): bump http-cache-semantics from 4.1.0 to 4.1.1 in /docs Bumps [http-cache-semantics](https://github.com/kornelski/http-cache-semantics) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/kornelski/http-cache-semantics/releases) - [Commits](https://github.com/kornelski/http-cache-semantics/compare/v4.1.0...v4.1.1) --- updated-dependencies: - dependency-name: http-cache-semantics dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 93a980c2..fbc859e5 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8281,9 +8281,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-deceiver": { "version": "1.2.7", @@ -22047,9 +22047,9 @@ } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http-deceiver": { "version": "1.2.7", From 89044079839b156eeb4a3da497d1dab904290f31 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Sat, 28 Jan 2023 17:15:49 -0500 Subject: [PATCH 160/289] feat(underglow): use float for HSB to RGB calculation --- app/src/rgb_underglow.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 25d4466e..18614a4e 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -75,15 +75,15 @@ static struct zmk_led_hsb hsb_scale_zero_max(struct zmk_led_hsb hsb) { } static struct led_rgb hsb_to_rgb(struct zmk_led_hsb hsb) { - double r, g, b; + float r, g, b; uint8_t i = hsb.h / 60; - double v = hsb.b / ((float)BRT_MAX); - double s = hsb.s / ((float)SAT_MAX); - double f = hsb.h / ((float)HUE_MAX) * 6 - i; - double p = v * (1 - s); - double q = v * (1 - f * s); - double t = v * (1 - (1 - f) * s); + float v = hsb.b / ((float)BRT_MAX); + float s = hsb.s / ((float)SAT_MAX); + float f = hsb.h / ((float)HUE_MAX) * 6 - i; + float p = v * (1 - s); + float q = v * (1 - f * s); + float t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: From 6cb42a80607c8bf8a493ac2c781568462aa8ce13 Mon Sep 17 00:00:00 2001 From: Robert U <978080+urob@users.noreply.github.com> Date: Sun, 12 Mar 2023 12:24:00 -0400 Subject: [PATCH 161/289] feat(behaviors): On-release option for positional-hold-taps --- .../behaviors/zmk,behavior-hold-tap.yaml | 2 ++ app/src/behaviors/behavior_hold_tap.c | 8 ++++++-- .../on-release-no-trigger/events.patterns | 4 ++++ .../keycode_events.snapshot | 12 ++++++++++++ .../native_posix_64.keymap | 17 +++++++++++++++++ .../on-release-trigger/events.patterns | 4 ++++ .../on-release-trigger/keycode_events.snapshot | 12 ++++++++++++ .../on-release-trigger/native_posix_64.keymap | 17 +++++++++++++++++ .../on-release-no-trigger/events.patterns | 4 ++++ .../keycode_events.snapshot | 12 ++++++++++++ .../native_posix_64.keymap | 17 +++++++++++++++++ .../on-release-trigger/events.patterns | 4 ++++ .../on-release-trigger/keycode_events.snapshot | 12 ++++++++++++ .../on-release-trigger/native_posix_64.keymap | 17 +++++++++++++++++ .../on-release-no-trigger/events.patterns | 4 ++++ .../keycode_events.snapshot | 12 ++++++++++++ .../native_posix_64.keymap | 17 +++++++++++++++++ .../on-release-trigger/events.patterns | 4 ++++ .../on-release-trigger/keycode_events.snapshot | 12 ++++++++++++ .../on-release-trigger/native_posix_64.keymap | 17 +++++++++++++++++ docs/docs/behaviors/hold-tap.md | 3 +++ 21 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/events.patterns create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-trigger/events.patterns create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/events.patterns create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/events.patterns create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/events.patterns create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/events.patterns create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap diff --git a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml index e4cfaeab..a2affbf2 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml @@ -37,3 +37,5 @@ properties: type: array required: false default: [] + hold-trigger-on-release: + type: boolean diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index f09006ed..a9e4d642 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -60,6 +60,7 @@ struct behavior_hold_tap_config { bool global_quick_tap; enum flavor flavor; bool retro_tap; + bool hold_trigger_on_release; int32_t hold_trigger_key_positions_len; int32_t hold_trigger_key_positions[]; }; @@ -587,9 +588,11 @@ static int position_state_changed_listener(const zmk_event_t *eh) { } // Store the position of pressed key for positional hold-tap purposes. - if ((ev->state) // i.e. key pressed (not released) + if ((undecided_hold_tap->config->hold_trigger_on_release != + ev->state) // key has been pressed and hold_trigger_on_release is not set, or key + // has been released and hold_trigger_on_release is set && (undecided_hold_tap->position_of_first_other_key_pressed == - -1) // i.e. no other key has been pressed yet + -1) // no other key has been pressed yet ) { undecided_hold_tap->position_of_first_other_key_pressed = ev->position; } @@ -703,6 +706,7 @@ static int behavior_hold_tap_init(const struct device *dev) { .global_quick_tap = DT_INST_PROP(n, global_quick_tap), \ .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ .retro_tap = DT_INST_PROP(n, retro_tap), \ + .hold_trigger_on_release = DT_INST_PROP(n, hold_trigger_on_release), \ .hold_trigger_key_positions = DT_INST_PROP(n, hold_trigger_key_positions), \ .hold_trigger_key_positions_len = DT_INST_PROP_LEN(n, hold_trigger_key_positions), \ }; \ diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/events.patterns b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/keycode_events.snapshot b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/keycode_events.snapshot new file mode 100644 index 00000000..24a8b033 --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +ht_decide: 0 decided hold-interrupt (balanced decision moment other-key-up) +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided tap (balanced decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap new file mode 100644 index 00000000..942d5ae4 --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&ht_bal { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/events.patterns b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/keycode_events.snapshot b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/keycode_events.snapshot new file mode 100644 index 00000000..fb5587b1 --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided hold-interrupt (balanced decision moment other-key-up) +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided hold-interrupt (balanced decision moment other-key-up) +kp_pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap new file mode 100644 index 00000000..677a2534 --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&ht_bal { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/events.patterns b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot new file mode 100644 index 00000000..1df24b0c --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided hold-interrupt (hold-preferred decision moment other-key-down) +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided hold-interrupt (hold-preferred decision moment other-key-down) +kp_pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap new file mode 100644 index 00000000..b48332ff --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&ht_hold { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/events.patterns b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/keycode_events.snapshot new file mode 100644 index 00000000..e35848cd --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided hold-interrupt (hold-preferred decision moment other-key-down) +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided hold-interrupt (hold-preferred decision moment other-key-down) +kp_pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap new file mode 100644 index 00000000..77398582 --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&ht_hold { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/events.patterns b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot new file mode 100644 index 00000000..d72f20d6 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +ht_decide: 0 decided tap (tap-preferred decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided tap (tap-preferred decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap new file mode 100644 index 00000000..504318f7 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&tp { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/events.patterns b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/keycode_events.snapshot new file mode 100644 index 00000000..a330a93c --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (tap-preferred decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided tap (tap-preferred decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap new file mode 100644 index 00000000..7061eee7 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&tp { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index 793e350d..1dfb8e5d 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -132,6 +132,9 @@ See the following example, which uses a hold-tap behavior definition, configured - The sequence `(pht_down, W_down, W_up, pht_up)` produces `W`. The normal hold behavior (LEFT_SHIFT) **is NOT** modified into a tap behavior (Q) by positional hold-tap because the first key pressed after the hold-tap key is the `W key`, which is in position 1, which **IS** included in `hold-trigger-key-positions`. - If the `LEFT_SHIFT / Q key` is held by itself for longer than `tapping-term-ms`, a hold behavior is produced. This is because positional hold-tap only modifies the behavior of a hold-tap if another key is pressed before the `tapping-term-ms` period expires. +By default, `hold-trigger-key-positions` are evaluated upon the first _key press_ after +the hold-tap. For homerow mods, this is not always ideal, because it prevents combining multiple modifiers unless they are included in `hold-trigger-key-positions`. To overwrite this behavior, one can set `hold-trigger-on-release`. If set to true, the evaluation of `hold-trigger-key-positions` gets delayed until _key release_. This allows combining multiple modifiers when the next key is _held_, while still deciding the hold-tap in favor of a tap when the next key is _tapped_. + ### Example Use-Cases Date: Wed, 22 Mar 2023 01:42:11 +0100 Subject: [PATCH 162/289] fix(boards): Disable CDC by default for CiZ The default configuration for corneish-zen enables a USB CDC endpoint by default. This is most probably a debugging left-over. Disable that endpoint. CONFIG_ZMK_USB_LOGGING depends on it anyway, so it will be enabled again with that config option set. --- .../corneish_zen/corneish_zen_v2_left_defconfig | 16 ---------------- .../corneish_zen/corneish_zen_v2_right_defconfig | 9 --------- 2 files changed, 25 deletions(-) diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig index eb1e552a..4e676147 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -73,19 +73,3 @@ CONFIG_ZMK_WIDGET_LAYER_STATUS=n #CONFIG_LVGL_LOG_LEVEL_DBG=y #CONFIG_LVGL_USE_DEBUG=y #CONFIG_SENSOR_LOG_LEVEL_DBG=y - -# Turn on USB CDC ACM device -CONFIG_USB_DEVICE_STACK=y -CONFIG_USB_CDC_ACM=y -CONFIG_USB_CDC_ACM_RINGBUF_SIZE=1024 - -# Enable serial console -CONFIG_SERIAL=y -CONFIG_CONSOLE=y -CONFIG_UART_INTERRUPT_DRIVEN=y -CONFIG_UART_LINE_CTRL=y - -# Enable USB UART -CONFIG_UART_CONSOLE=y - - diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig index 46b40dee..02039b8d 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -72,12 +72,3 @@ CONFIG_ZMK_WIDGET_PERIPHERAL_STATUS=n #CONFIG_LVGL_LOG_LEVEL_DBG=y #CONFIG_LVGL_USE_DEBUG=y #CONFIG_SENSOR_LOG_LEVEL_DBG=y - -# Enable serial console -CONFIG_SERIAL=y -CONFIG_CONSOLE=y -CONFIG_UART_INTERRUPT_DRIVEN=y -CONFIG_UART_LINE_CTRL=y - -# Enable USB UART -CONFIG_UART_CONSOLE=y From cd64c59b39754477533e6dd7ad1055f07de92bb0 Mon Sep 17 00:00:00 2001 From: prdktntwcklr <61001903+prdktntwcklr@users.noreply.github.com> Date: Wed, 8 Mar 2023 01:12:11 +0000 Subject: [PATCH 163/289] fix(tests): ignore line endings --- app/run-test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/run-test.sh b/app/run-test.sh index 068fdbb4..94438f34 100755 --- a/app/run-test.sh +++ b/app/run-test.sh @@ -33,7 +33,7 @@ if [ $? -gt 0 ]; then fi ./build/$testcase/zephyr/zmk.exe | sed -e "s/.*> //" | tee build/$testcase/keycode_events_full.log | sed -n -f $testcase/events.patterns > build/$testcase/keycode_events.log -diff -au $testcase/keycode_events.snapshot build/$testcase/keycode_events.log +diff -auZ $testcase/keycode_events.snapshot build/$testcase/keycode_events.log if [ $? -gt 0 ]; then if [ -f $testcase/pending ]; then echo "PENDING: $testcase" | tee -a ./build/tests/pass-fail.log From ae8299edb3d638f1332475b1da0fdf40afa43fe4 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 25 Mar 2023 13:17:16 -0400 Subject: [PATCH 164/289] fix(boards): Move the CDC ACM node under the USBD. * Ferris board's CDC ACM node was accidentally nested under the wrong node, causing USB logging builds to fail with cryptic error. --- app/boards/arm/ferris/ferris_rev02.dts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/boards/arm/ferris/ferris_rev02.dts b/app/boards/arm/ferris/ferris_rev02.dts index dbf3f6e2..50de9526 100644 --- a/app/boards/arm/ferris/ferris_rev02.dts +++ b/app/boards/arm/ferris/ferris_rev02.dts @@ -116,6 +116,10 @@ &usb { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &clk_hsi { @@ -139,10 +143,6 @@ &rtc { status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; }; &flash0 { From 168b32b8288ba36831f262f82bfa166240506676 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 16 Jan 2023 00:40:53 -0500 Subject: [PATCH 165/289] refactor: Move to Zephyr 3.2 branch. --- app/west.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/west.yml b/app/west.yml index b0f05aed..ffa36ca3 100644 --- a/app/west.yml +++ b/app/west.yml @@ -7,7 +7,7 @@ manifest: projects: - name: zephyr remote: zmkfirmware - revision: v3.0.0+zmk-fixes + revision: v3.2.0+zmk-fixes clone-depth: 1 import: name-blocklist: From 69a4c3200d8c9c92e3e3c68bbd4969f19df70133 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 17 Jan 2023 23:33:42 -0500 Subject: [PATCH 166/289] refactor(display): Updates for LVGL v8.x changes. * LV_ prefix from new LVGL official Kconfig now used. * API changes for themes, container object removal, etc. * Add our own Kconfig and code for theme default small font. * Remove some hardcoded sizes. --- app/boards/arm/corneish_zen/Kconfig.defconfig | 12 +- .../corneish_zen_v2_left_defconfig | 20 ++- .../corneish_zen_v2_right_defconfig | 20 ++- .../arm/corneish_zen/custom_status_screen.c | 38 +++--- .../arm/corneish_zen/widgets/battery_status.c | 9 +- .../arm/corneish_zen/widgets/battery_status.h | 4 +- .../arm/corneish_zen/widgets/layer_status.c | 8 +- .../arm/corneish_zen/widgets/layer_status.h | 4 +- .../arm/corneish_zen/widgets/output_status.c | 10 +- .../arm/corneish_zen/widgets/output_status.h | 4 +- .../corneish_zen/widgets/peripheral_status.c | 8 +- .../corneish_zen/widgets/peripheral_status.h | 4 +- app/boards/shields/corne/Kconfig.defconfig | 10 +- .../shields/elephant42/Kconfig.defconfig | 10 +- app/boards/shields/jorne/Kconfig.defconfig | 10 +- .../shields/knob_goblin/Kconfig.defconfig | 10 +- app/boards/shields/kyria/Kconfig.defconfig | 10 +- app/boards/shields/leeloo/Kconfig.defconfig | 10 +- app/boards/shields/lily58/Kconfig.defconfig | 10 +- app/boards/shields/lotus58/Kconfig.defconfig | 10 +- app/boards/shields/microdox/Kconfig.defconfig | 10 +- app/boards/shields/murphpad/Kconfig.defconfig | 10 +- app/boards/shields/nibble/Kconfig.defconfig | 10 +- .../shields/nice_view/Kconfig.defconfig | 8 +- app/boards/shields/nice_view/nice_view.conf | 4 +- app/boards/shields/snap/Kconfig.defconfig | 10 +- app/boards/shields/sofle/Kconfig.defconfig | 10 +- .../splitkb_aurora_corne/Kconfig.defconfig | 10 +- .../splitkb_aurora_lily58/Kconfig.defconfig | 10 +- .../splitkb_aurora_sweep/Kconfig.defconfig | 10 +- app/boards/shields/tidbit/Kconfig.defconfig | 10 +- .../shields/waterfowl/Kconfig.defconfig | 10 +- app/boards/shields/zodiark/Kconfig.defconfig | 10 +- app/src/display/Kconfig | 119 +++++++++++++++--- app/src/display/main.c | 45 ++++--- app/src/display/status_screen.c | 29 ++--- app/src/display/theme.c | 73 +++++++++++ app/src/display/theme.h | 65 ++++++++++ app/src/display/widgets/Kconfig | 10 +- app/src/display/widgets/battery_status.c | 5 +- app/src/display/widgets/layer_status.c | 4 +- app/src/display/widgets/output_status.c | 4 +- app/src/display/widgets/peripheral_status.c | 4 +- app/src/display/widgets/wpm_status.c | 8 +- 44 files changed, 463 insertions(+), 246 deletions(-) create mode 100644 app/src/display/theme.c create mode 100644 app/src/display/theme.h diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig index a88cc5ca..33ce1256 100644 --- a/app/boards/arm/corneish_zen/Kconfig.defconfig +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -42,12 +42,12 @@ config USB_DEVICE_STACK endif # USB config ZMK_DISPLAY - select LVGL_USE_CONT - select LVGL_FONT_MONTSERRAT_26 - select LVGL_FONT_MONTSERRAT_20 - select LVGL_FONT_MONTSERRAT_16 - select LVGL_USE_LABEL - select LVGL_USE_IMG + select LV_USE_CONT + select LV_FONT_MONTSERRAT_26 + select LV_FONT_MONTSERRAT_20 + select LV_FONT_MONTSERRAT_16 + select LV_USE_LABEL + select LV_USE_IMG choice ZMK_DISPLAY_STATUS_SCREEN default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig index 4e676147..42e27037 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -39,17 +39,15 @@ CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 CONFIG_SSD1306=n CONFIG_IL0323=y -CONFIG_LVGL_BITS_PER_PIXEL=1 -CONFIG_LVGL_COLOR_DEPTH_1=y -CONFIG_LVGL_DPI=145 -CONFIG_LVGL_VDB_SIZE=100 -CONFIG_LVGL_USE_THEME_MONO=y -CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_RED=n -CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_RED=n -CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_BLACK=y -CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_WHITE=y -CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_16=y -CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y +CONFIG_LV_Z_BITS_PER_PIXEL=1 +CONFIG_LV_COLOR_DEPTH_1=y +CONFIG_LV_DPI_DEF=145 +CONFIG_LV_Z_VDB_SIZE=100 +CONFIG_LV_USE_THEME_MONO=y +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y +CONFIG_LV_FONT_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y # custom status screens CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig index 02039b8d..e9b36f2e 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -39,17 +39,15 @@ CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 CONFIG_SSD1306=n CONFIG_IL0323=y -CONFIG_LVGL_BITS_PER_PIXEL=1 -CONFIG_LVGL_COLOR_DEPTH_1=y -CONFIG_LVGL_DPI=145 -CONFIG_LVGL_VDB_SIZE=100 -CONFIG_LVGL_USE_THEME_MONO=y -CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_RED=n -CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_RED=n -CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_BLACK=y -CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_WHITE=y -CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_16=y -CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y +CONFIG_LV_Z_BITS_PER_PIXEL=1 +CONFIG_LV_COLOR_DEPTH_1=y +CONFIG_LV_DPI_DEF=145 +CONFIG_LV_Z_VDB_SIZE=100 +CONFIG_LV_USE_THEME_MONO=y +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y +CONFIG_LV_FONT_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y # custom status screens CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y diff --git a/app/boards/arm/corneish_zen/custom_status_screen.c b/app/boards/arm/corneish_zen/custom_status_screen.c index 7842925e..c45a6243 100644 --- a/app/boards/arm/corneish_zen/custom_status_screen.c +++ b/app/boards/arm/corneish_zen/custom_status_screen.c @@ -11,7 +11,7 @@ #include "widgets/layer_status.h" #include "custom_status_screen.h" -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); LV_IMG_DECLARE(zenlogo); @@ -36,50 +36,42 @@ static struct zmk_widget_layer_status layer_status_widget; lv_obj_t *zmk_display_status_screen() { lv_obj_t *screen; - screen = lv_obj_create(NULL, NULL); + screen = lv_obj_create(NULL); #if IS_ENABLED(CONFIG_CUSTOM_WIDGET_BATTERY_STATUS) zmk_widget_battery_status_init(&battery_status_widget, screen); - lv_obj_align(zmk_widget_battery_status_obj(&battery_status_widget), NULL, LV_ALIGN_IN_TOP_MID, - 0, 2); + lv_obj_align(zmk_widget_battery_status_obj(&battery_status_widget), LV_ALIGN_TOP_MID, 0, 2); #endif #if IS_ENABLED(CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS) zmk_widget_output_status_init(&output_status_widget, screen); - lv_obj_align(zmk_widget_output_status_obj(&output_status_widget), NULL, LV_ALIGN_IN_TOP_MID, 0, - 41); + lv_obj_align(zmk_widget_output_status_obj(&output_status_widget), LV_ALIGN_TOP_MID, 0, 41); #endif #if IS_ENABLED(CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS) zmk_widget_peripheral_status_init(&peripheral_status_widget, screen); - lv_obj_align(zmk_widget_peripheral_status_obj(&peripheral_status_widget), NULL, - LV_ALIGN_IN_TOP_MID, 0, 41); + lv_obj_align(zmk_widget_peripheral_status_obj(&peripheral_status_widget), LV_ALIGN_TOP_MID, 0, + 41); #endif #if IS_ENABLED(CONFIG_CUSTOM_WIDGET_LAYER_STATUS) - zmk_widget_layer_status_init(&layer_status_widget, screen); - lv_obj_set_style_local_text_font(zmk_widget_layer_status_obj(&layer_status_widget), - LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, - lv_theme_get_font_small()); - lv_obj_align(zmk_widget_layer_status_obj(&layer_status_widget), NULL, LV_ALIGN_IN_BOTTOM_MID, 0, - -5); - lv_obj_t *LayersHeading; - LayersHeading = lv_img_create(screen, NULL); - lv_obj_align(LayersHeading, NULL, LV_ALIGN_IN_BOTTOM_MID, 8, 5); + LayersHeading = lv_img_create(screen); + lv_obj_align(LayersHeading, LV_ALIGN_BOTTOM_MID, 0, -30); lv_img_set_src(LayersHeading, &layers2); + + zmk_widget_layer_status_init(&layer_status_widget, screen); + lv_obj_set_style_text_font(zmk_widget_layer_status_obj(&layer_status_widget), + &lv_font_montserrat_16, LV_PART_MAIN); + lv_obj_align(zmk_widget_layer_status_obj(&layer_status_widget), LV_ALIGN_BOTTOM_MID, 0, -5); #endif #if !IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) lv_obj_t *zenlogo_icon; - zenlogo_icon = lv_img_create(screen, NULL); + zenlogo_icon = lv_img_create(screen); lv_img_set_src(zenlogo_icon, &zenlogo); - lv_obj_align(zenlogo_icon, NULL, LV_ALIGN_IN_BOTTOM_MID, 2, -5); + lv_obj_align(zenlogo_icon, LV_ALIGN_BOTTOM_MID, 2, -5); #endif - // lv_task_handler(); - lv_refr_now(NULL); - // display_blanking_off(display_dev); - return screen; } diff --git a/app/boards/arm/corneish_zen/widgets/battery_status.c b/app/boards/arm/corneish_zen/widgets/battery_status.c index 7dfd51e8..9a2189d1 100644 --- a/app/boards/arm/corneish_zen/widgets/battery_status.c +++ b/app/boards/arm/corneish_zen/widgets/battery_status.c @@ -5,15 +5,14 @@ * */ -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include "battery_status.h" -#include #include #include #include @@ -84,7 +83,7 @@ ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent) { - widget->obj = lv_img_create(parent, NULL); + widget->obj = lv_img_create(parent); sys_slist_append(&widgets, &widget->node); widget_battery_status_init(); diff --git a/app/boards/arm/corneish_zen/widgets/battery_status.h b/app/boards/arm/corneish_zen/widgets/battery_status.h index 21a4efb8..d493c582 100644 --- a/app/boards/arm/corneish_zen/widgets/battery_status.h +++ b/app/boards/arm/corneish_zen/widgets/battery_status.h @@ -9,7 +9,7 @@ #include -#include +#include struct zmk_widget_battery_status { sys_snode_t node; @@ -17,4 +17,4 @@ struct zmk_widget_battery_status { }; int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent); -lv_obj_t *zmk_widget_battery_status_obj(struct zmk_widget_battery_status *widget); \ No newline at end of file +lv_obj_t *zmk_widget_battery_status_obj(struct zmk_widget_battery_status *widget); diff --git a/app/boards/arm/corneish_zen/widgets/layer_status.c b/app/boards/arm/corneish_zen/widgets/layer_status.c index a309a787..3dc33613 100644 --- a/app/boards/arm/corneish_zen/widgets/layer_status.c +++ b/app/boards/arm/corneish_zen/widgets/layer_status.c @@ -5,8 +5,8 @@ * */ -#include -#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include @@ -54,7 +54,7 @@ ZMK_DISPLAY_WIDGET_LISTENER(widget_layer_status, struct layer_status_state, laye ZMK_SUBSCRIPTION(widget_layer_status, zmk_layer_state_changed); int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); + widget->obj = lv_label_create(parent); sys_slist_append(&widgets, &widget->node); @@ -64,4 +64,4 @@ int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_ lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget) { return widget->obj; -} \ No newline at end of file +} diff --git a/app/boards/arm/corneish_zen/widgets/layer_status.h b/app/boards/arm/corneish_zen/widgets/layer_status.h index 04f32faa..c03433c5 100644 --- a/app/boards/arm/corneish_zen/widgets/layer_status.h +++ b/app/boards/arm/corneish_zen/widgets/layer_status.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include struct zmk_widget_layer_status { sys_snode_t node; @@ -16,4 +16,4 @@ struct zmk_widget_layer_status { }; int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_t *parent); -lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget); \ No newline at end of file +lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget); diff --git a/app/boards/arm/corneish_zen/widgets/output_status.c b/app/boards/arm/corneish_zen/widgets/output_status.c index bd69bbb1..ad0c2b1a 100644 --- a/app/boards/arm/corneish_zen/widgets/output_status.c +++ b/app/boards/arm/corneish_zen/widgets/output_status.c @@ -5,10 +5,10 @@ * */ -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include @@ -123,9 +123,7 @@ ZMK_SUBSCRIPTION(widget_output_status, zmk_ble_active_profile_changed); #endif int zmk_widget_output_status_init(struct zmk_widget_output_status *widget, lv_obj_t *parent) { - widget->obj = lv_img_create(parent, NULL); - - lv_obj_set_size(widget->obj, 40, 15); + widget->obj = lv_img_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/boards/arm/corneish_zen/widgets/output_status.h b/app/boards/arm/corneish_zen/widgets/output_status.h index c171e2bb..ba92f893 100644 --- a/app/boards/arm/corneish_zen/widgets/output_status.h +++ b/app/boards/arm/corneish_zen/widgets/output_status.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include struct zmk_widget_output_status { sys_snode_t node; @@ -16,4 +16,4 @@ struct zmk_widget_output_status { }; int zmk_widget_output_status_init(struct zmk_widget_output_status *widget, lv_obj_t *parent); -lv_obj_t *zmk_widget_output_status_obj(struct zmk_widget_output_status *widget); \ No newline at end of file +lv_obj_t *zmk_widget_output_status_obj(struct zmk_widget_output_status *widget); diff --git a/app/boards/arm/corneish_zen/widgets/peripheral_status.c b/app/boards/arm/corneish_zen/widgets/peripheral_status.c index e18414be..39b62fde 100644 --- a/app/boards/arm/corneish_zen/widgets/peripheral_status.c +++ b/app/boards/arm/corneish_zen/widgets/peripheral_status.c @@ -5,10 +5,10 @@ * */ -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include @@ -48,7 +48,7 @@ ZMK_SUBSCRIPTION(widget_peripheral_status, zmk_split_peripheral_status_changed); int zmk_widget_peripheral_status_init(struct zmk_widget_peripheral_status *widget, lv_obj_t *parent) { - widget->obj = lv_img_create(parent, NULL); + widget->obj = lv_img_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/boards/arm/corneish_zen/widgets/peripheral_status.h b/app/boards/arm/corneish_zen/widgets/peripheral_status.h index 59675763..82fe2105 100644 --- a/app/boards/arm/corneish_zen/widgets/peripheral_status.h +++ b/app/boards/arm/corneish_zen/widgets/peripheral_status.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include struct zmk_widget_peripheral_status { sys_snode_t node; @@ -17,4 +17,4 @@ struct zmk_widget_peripheral_status { int zmk_widget_peripheral_status_init(struct zmk_widget_peripheral_status *widget, lv_obj_t *parent); -lv_obj_t *zmk_widget_peripheral_status_obj(struct zmk_widget_peripheral_status *widget); \ No newline at end of file +lv_obj_t *zmk_widget_peripheral_status_obj(struct zmk_widget_peripheral_status *widget); diff --git a/app/boards/shields/corne/Kconfig.defconfig b/app/boards/shields/corne/Kconfig.defconfig index 9160555c..acf542d7 100644 --- a/app/boards/shields/corne/Kconfig.defconfig +++ b/app/boards/shields/corne/Kconfig.defconfig @@ -28,17 +28,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/elephant42/Kconfig.defconfig b/app/boards/shields/elephant42/Kconfig.defconfig index 1e93762c..e507f2c6 100644 --- a/app/boards/shields/elephant42/Kconfig.defconfig +++ b/app/boards/shields/elephant42/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/jorne/Kconfig.defconfig b/app/boards/shields/jorne/Kconfig.defconfig index 64eb32b8..4664debf 100644 --- a/app/boards/shields/jorne/Kconfig.defconfig +++ b/app/boards/shields/jorne/Kconfig.defconfig @@ -29,17 +29,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/knob_goblin/Kconfig.defconfig b/app/boards/shields/knob_goblin/Kconfig.defconfig index 300fb4eb..d8d468ed 100644 --- a/app/boards/shields/knob_goblin/Kconfig.defconfig +++ b/app/boards/shields/knob_goblin/Kconfig.defconfig @@ -21,17 +21,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/kyria/Kconfig.defconfig b/app/boards/shields/kyria/Kconfig.defconfig index 0da8a18d..cdb57b6b 100644 --- a/app/boards/shields/kyria/Kconfig.defconfig +++ b/app/boards/shields/kyria/Kconfig.defconfig @@ -29,17 +29,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/leeloo/Kconfig.defconfig b/app/boards/shields/leeloo/Kconfig.defconfig index a4295d1e..36306757 100644 --- a/app/boards/shields/leeloo/Kconfig.defconfig +++ b/app/boards/shields/leeloo/Kconfig.defconfig @@ -32,17 +32,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/lily58/Kconfig.defconfig b/app/boards/shields/lily58/Kconfig.defconfig index a5e6fbe8..97cecce1 100644 --- a/app/boards/shields/lily58/Kconfig.defconfig +++ b/app/boards/shields/lily58/Kconfig.defconfig @@ -29,17 +29,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/lotus58/Kconfig.defconfig b/app/boards/shields/lotus58/Kconfig.defconfig index 57ae5ef6..56eef359 100644 --- a/app/boards/shields/lotus58/Kconfig.defconfig +++ b/app/boards/shields/lotus58/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/microdox/Kconfig.defconfig b/app/boards/shields/microdox/Kconfig.defconfig index 7bf40b8b..28f8c811 100644 --- a/app/boards/shields/microdox/Kconfig.defconfig +++ b/app/boards/shields/microdox/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/murphpad/Kconfig.defconfig b/app/boards/shields/murphpad/Kconfig.defconfig index 9f491564..07e71826 100644 --- a/app/boards/shields/murphpad/Kconfig.defconfig +++ b/app/boards/shields/murphpad/Kconfig.defconfig @@ -21,17 +21,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/nibble/Kconfig.defconfig b/app/boards/shields/nibble/Kconfig.defconfig index a1683f3a..d5e8cbeb 100644 --- a/app/boards/shields/nibble/Kconfig.defconfig +++ b/app/boards/shields/nibble/Kconfig.defconfig @@ -25,17 +25,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/nice_view/Kconfig.defconfig b/app/boards/shields/nice_view/Kconfig.defconfig index a699a813..22c5f647 100644 --- a/app/boards/shields/nice_view/Kconfig.defconfig +++ b/app/boards/shields/nice_view/Kconfig.defconfig @@ -4,7 +4,7 @@ if SHIELD_NICE_VIEW config ZMK_DISPLAY - select LVGL_FONT_MONTSERRAT_26 + select LV_FONT_MONTSERRAT_26 if ZMK_DISPLAY @@ -17,11 +17,11 @@ config LS0XX config ZMK_WIDGET_WPM_STATUS default y if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # ZMK_DISPLAY diff --git a/app/boards/shields/nice_view/nice_view.conf b/app/boards/shields/nice_view/nice_view.conf index 2c1d6c71..ff57c07c 100644 --- a/app/boards/shields/nice_view/nice_view.conf +++ b/app/boards/shields/nice_view/nice_view.conf @@ -1,5 +1,5 @@ # Enable nice!view CONFIG_ZMK_DISPLAY=y -CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_26=y -CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE=n diff --git a/app/boards/shields/snap/Kconfig.defconfig b/app/boards/shields/snap/Kconfig.defconfig index 24a8e5cc..fa02421a 100644 --- a/app/boards/shields/snap/Kconfig.defconfig +++ b/app/boards/shields/snap/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/sofle/Kconfig.defconfig b/app/boards/shields/sofle/Kconfig.defconfig index 69dac3f2..1c1c5604 100644 --- a/app/boards/shields/sofle/Kconfig.defconfig +++ b/app/boards/shields/sofle/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig index 5a1eeb13..29de8d7e 100644 --- a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig @@ -37,17 +37,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig index bbaef0ff..3c8d5f58 100644 --- a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig @@ -37,17 +37,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig index 51fbc28c..4a2b8973 100644 --- a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig @@ -37,17 +37,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/tidbit/Kconfig.defconfig b/app/boards/shields/tidbit/Kconfig.defconfig index 013a0a7c..e3655a9e 100644 --- a/app/boards/shields/tidbit/Kconfig.defconfig +++ b/app/boards/shields/tidbit/Kconfig.defconfig @@ -22,17 +22,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/waterfowl/Kconfig.defconfig b/app/boards/shields/waterfowl/Kconfig.defconfig index 897184f6..70029f0b 100644 --- a/app/boards/shields/waterfowl/Kconfig.defconfig +++ b/app/boards/shields/waterfowl/Kconfig.defconfig @@ -29,17 +29,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/zodiark/Kconfig.defconfig b/app/boards/shields/zodiark/Kconfig.defconfig index 76bfcbd4..77648afd 100644 --- a/app/boards/shields/zodiark/Kconfig.defconfig +++ b/app/boards/shields/zodiark/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index c0753358..32be2a27 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -6,8 +6,9 @@ menuconfig ZMK_DISPLAY default n select DISPLAY select LVGL - select LVGL_THEMES - select LVGL_THEME_MONO + select LV_THEMES + select LV_THEME_MONO + select LV_CONF_MINIMAL if ZMK_DISPLAY @@ -15,17 +16,26 @@ config ZMK_DISPLAY_BLANK_ON_IDLE bool "Blank display on idle" default y if SSD1306 -choice LVGL_TXT_ENC - default LVGL_TXT_ENC_UTF8 +choice LV_TXT_ENC + default LV_TXT_ENC_UTF8 endchoice +config LV_MEM_CUSTOM + default y + +config LV_Z_MEM_POOL_MIN_SIZE + default 32 + +config LV_Z_MEM_POOL_MAX_SIZE + default 8192 + choice ZMK_DISPLAY_STATUS_SCREEN prompt "Default status screen for displays" config ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN bool "Built in status screen" - select LVGL_OBJ_LABEL + select LV_OBJ_LABEL config ZMK_DISPLAY_STATUS_SCREEN_CUSTOM bool "Custom status screen" @@ -57,24 +67,105 @@ endif # ZMK_DISPLAY_WORK_QUEUE_DEDICATED if ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN -config LVGL_FONT_MONTSERRAT_16 +config LV_FONT_MONTSERRAT_16 default y -choice LVGL_THEME_DEFAULT_FONT_NORMAL - default LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_16 +choice LV_FONT_DEFAULT + default LV_FONT_DEFAULT_MONTSERRAT_16 endchoice -config LVGL_FONT_MONTSERRAT_12 +config LV_FONT_MONTSERRAT_12 default y - -choice LVGL_THEME_DEFAULT_FONT_SMALL - default LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_12 - -endchoice endif # ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN +choice ZMK_LV_FONT_DEFAULT_SMALL + prompt "Select theme default small font" + default ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12 + help + Select theme default small font + + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_8 + bool "Montserrat 8" + select LV_FONT_MONTSERRAT_8 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12 + bool "Montserrat 12" + select LV_FONT_MONTSERRAT_12 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_14 + bool "Montserrat 14" + select LV_FONT_MONTSERRAT_14 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16 + bool "Montserrat 16" + select LV_FONT_MONTSERRAT_16 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_18 + bool "Montserrat 18" + select LV_FONT_MONTSERRAT_18 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_20 + bool "Montserrat 20" + select LV_FONT_MONTSERRAT_20 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_22 + bool "Montserrat 22" + select LV_FONT_MONTSERRAT_22 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_24 + bool "Montserrat 24" + select LV_FONT_MONTSERRAT_24 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26 + bool "Montserrat 26" + select LV_FONT_MONTSERRAT_26 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28 + bool "Montserrat 28" + select LV_FONT_MONTSERRAT_28 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_30 + bool "Montserrat 30" + select LV_FONT_MONTSERRAT_30 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_32 + bool "Montserrat 32" + select LV_FONT_MONTSERRAT_32 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_34 + bool "Montserrat 34" + select LV_FONT_MONTSERRAT_34 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_36 + bool "Montserrat 36" + select LV_FONT_MONTSERRAT_36 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_38 + bool "Montserrat 38" + select LV_FONT_MONTSERRAT_38 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_40 + bool "Montserrat 40" + select LV_FONT_MONTSERRAT_40 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_42 + bool "Montserrat 42" + select LV_FONT_MONTSERRAT_42 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_44 + bool "Montserrat 44" + select LV_FONT_MONTSERRAT_44 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_46 + bool "Montserrat 46" + select LV_FONT_MONTSERRAT_46 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_48 + bool "Montserrat 48" + select LV_FONT_MONTSERRAT_48 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12_SUBPX + bool "Montserrat 12 sub-pixel" + select LV_FONT_MONTSERRAT_12_SUBPX + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28_COMPRESSED + bool "Montserrat 28 compressed" + select LV_FONT_MONTSERRAT_28_COMPRESSED + config ZMK_LV_FONT_DEFAULT_SMALL_DEJAVU_16_PERSIAN_HEBREW + bool "Dejavu 16 Persian, Hebrew, Arabic letters" + select LV_FONT_DEJAVU_16_PERSIAN_HEBREW + config ZMK_LV_FONT_DEFAULT_SMALL_SIMSUN_16_CJK + bool "Simsun 16 CJK" + select LV_FONT_SIMSUN_16_CJK + config ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_8 + bool "UNSCII 8 (Perfect monospace font)" + select LV_FONT_UNSCII_8 + config ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_16 + bool "UNSCII 16 (Perfect monospace font)" + select LV_FONT_UNSCII_16 +endchoice + rsource "widgets/Kconfig" endif diff --git a/app/src/display/main.c b/app/src/display/main.c index 8a70cef2..3fb4e8f6 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -15,11 +15,13 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include +#include "theme.h" + #include #include #include -#define ZMK_DISPLAY_NAME CONFIG_LVGL_DISPLAY_DEV_NAME +#define ZMK_DISPLAY_NAME CONFIG_LV_Z_DISPLAY_DEV_NAME static const struct device *display; static bool initialized = false; @@ -50,16 +52,21 @@ struct k_work_q *zmk_display_work_q() { #endif } -void display_timer_cb() { - lv_tick_inc(TICK_MS); - k_work_submit_to_queue(zmk_display_work_q(), &display_tick_work); -} - -void blank_display_cb(struct k_work *work) { display_blanking_on(display); } - -void unblank_display_cb(struct k_work *work) { display_blanking_off(display); } +void display_timer_cb() { k_work_submit_to_queue(zmk_display_work_q(), &display_tick_work); } K_TIMER_DEFINE(display_timer, display_timer_cb, NULL); + +void unblank_display_cb(struct k_work *work) { + display_blanking_off(display); + k_timer_start(&display_timer, K_MSEC(TICK_MS), K_MSEC(TICK_MS)); +} + +#if IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) + +void blank_display_cb(struct k_work *work) { + k_timer_stop(&display_timer); + display_blanking_on(display); +} K_WORK_DEFINE(blank_display_work, blank_display_cb); K_WORK_DEFINE(unblank_display_work, unblank_display_cb); @@ -69,26 +76,30 @@ static void start_display_updates() { } k_work_submit_to_queue(zmk_display_work_q(), &unblank_display_work); - - k_timer_start(&display_timer, K_MSEC(TICK_MS), K_MSEC(TICK_MS)); } -#if IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) - static void stop_display_updates() { if (display == NULL) { return; } k_work_submit_to_queue(zmk_display_work_q(), &blank_display_work); - - k_timer_stop(&display_timer); } #endif int zmk_display_is_initialized() { return initialized; } +static void initialize_theme() { +#if IS_ENABLED(CONFIG_LV_USE_THEME_MONO) + lv_disp_t *disp = lv_disp_get_default(); + lv_theme_t *theme = lv_theme_mono_init(disp, false, CONFIG_LV_FONT_DEFAULT); + theme->font_small = CONFIG_ZMK_LV_FONT_DEFAULT_SMALL; + + disp->theme = theme; +#endif // CONFIG_LV_USE_THEME_MONO +} + void initialize_display(struct k_work *work) { LOG_DBG(""); @@ -100,6 +111,8 @@ void initialize_display(struct k_work *work) { initialized = true; + initialize_theme(); + screen = zmk_display_status_screen(); if (screen == NULL) { @@ -109,7 +122,7 @@ void initialize_display(struct k_work *work) { lv_scr_load(screen); - start_display_updates(); + unblank_display_cb(work); } K_WORK_DEFINE(init_work, initialize_display); diff --git a/app/src/display/status_screen.c b/app/src/display/status_screen.c index 0fe7212d..6b58c301 100644 --- a/app/src/display/status_screen.c +++ b/app/src/display/status_screen.c @@ -34,42 +34,43 @@ static struct zmk_widget_layer_status layer_status_widget; static struct zmk_widget_wpm_status wpm_status_widget; #endif +lv_style_t global_style; + lv_obj_t *zmk_display_status_screen() { lv_obj_t *screen; - screen = lv_obj_create(NULL, NULL); + lv_style_init(&global_style); + lv_style_set_text_font(&global_style, &lv_font_montserrat_12); + + screen = lv_obj_create(NULL); + lv_obj_add_style(screen, &global_style, LV_PART_MAIN); #if IS_ENABLED(CONFIG_ZMK_WIDGET_BATTERY_STATUS) zmk_widget_battery_status_init(&battery_status_widget, screen); - lv_obj_align(zmk_widget_battery_status_obj(&battery_status_widget), NULL, LV_ALIGN_IN_TOP_RIGHT, - 0, 0); + lv_obj_align(zmk_widget_battery_status_obj(&battery_status_widget), LV_ALIGN_TOP_RIGHT, 0, 0); #endif #if IS_ENABLED(CONFIG_ZMK_WIDGET_OUTPUT_STATUS) zmk_widget_output_status_init(&output_status_widget, screen); - lv_obj_align(zmk_widget_output_status_obj(&output_status_widget), NULL, LV_ALIGN_IN_TOP_LEFT, 0, - 0); + lv_obj_align(zmk_widget_output_status_obj(&output_status_widget), LV_ALIGN_TOP_LEFT, 0, 0); #endif #if IS_ENABLED(CONFIG_ZMK_WIDGET_PERIPHERAL_STATUS) zmk_widget_peripheral_status_init(&peripheral_status_widget, screen); - lv_obj_align(zmk_widget_peripheral_status_obj(&peripheral_status_widget), NULL, - LV_ALIGN_IN_TOP_LEFT, 0, 0); + lv_obj_align(zmk_widget_peripheral_status_obj(&peripheral_status_widget), LV_ALIGN_TOP_LEFT, 0, + 0); #endif #if IS_ENABLED(CONFIG_ZMK_WIDGET_LAYER_STATUS) zmk_widget_layer_status_init(&layer_status_widget, screen); - lv_obj_set_style_local_text_font(zmk_widget_layer_status_obj(&layer_status_widget), - LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, - lv_theme_get_font_small()); - lv_obj_align(zmk_widget_layer_status_obj(&layer_status_widget), NULL, LV_ALIGN_IN_BOTTOM_LEFT, - 0, 0); + lv_obj_set_style_text_font(zmk_widget_layer_status_obj(&layer_status_widget), + lv_theme_get_font_small(screen), LV_PART_MAIN); + lv_obj_align(zmk_widget_layer_status_obj(&layer_status_widget), LV_ALIGN_BOTTOM_LEFT, 0, 0); #endif #if IS_ENABLED(CONFIG_ZMK_WIDGET_WPM_STATUS) zmk_widget_wpm_status_init(&wpm_status_widget, screen); - lv_obj_align(zmk_widget_wpm_status_obj(&wpm_status_widget), NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, - 0); + lv_obj_align(zmk_widget_wpm_status_obj(&wpm_status_widget), LV_ALIGN_BOTTOM_RIGHT, 0, 0); #endif return screen; } diff --git a/app/src/display/theme.c b/app/src/display/theme.c new file mode 100644 index 00000000..3ad41dac --- /dev/null +++ b/app/src/display/theme.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +#if defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_8) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_8 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_10) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_10 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_12 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_14) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_14 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_16 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_18) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_18 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_20) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_20 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_22) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_22 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_24) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_24 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_26 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_28 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_30) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_30 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_32) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_32 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_34) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_34 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_36) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_36 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_38) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_38 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_40) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_40 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_42) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_42 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_44) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_44 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_46) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_46 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_48) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_48 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12_SUBPX) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_12_subpx +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28_COMPRESSED) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_28_compressed +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_DEJAVU_16_PERSIAN_HEBREW) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_dejavu_16_persian_hebrew +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_SIMSUN_16_CJK) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_simsun_16_cjk +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_8) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_unscii_8 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_16) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_unscii_16 +#endif + +void zmk_display_theme_init(lv_obj_t *obj) { + lv_theme_t *theme = lv_theme_get_from_obj(obj); + + if (theme == NULL) { + return; + } + + theme->font_small = CONFIG_ZMK_LV_FONT_DEFAULT_SMALL; +} \ No newline at end of file diff --git a/app/src/display/theme.h b/app/src/display/theme.h new file mode 100644 index 00000000..94bf7f39 --- /dev/null +++ b/app/src/display/theme.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include + +#if defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_8) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_8 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_10) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_10 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_12 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_14) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_14 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_16 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_18) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_18 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_20) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_20 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_22) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_22 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_24) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_24 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_26 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_28 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_30) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_30 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_32) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_32 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_34) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_34 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_36) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_36 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_38) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_38 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_40) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_40 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_42) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_42 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_44) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_44 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_46) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_46 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_48) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_48 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12_SUBPX) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_12_subpx +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28_COMPRESSED) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_28_compressed +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_DEJAVU_16_PERSIAN_HEBREW) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_dejavu_16_persian_hebrew +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_SIMSUN_16_CJK) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_simsun_16_cjk +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_8) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_unscii_8 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_16) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_unscii_16 +#endif diff --git a/app/src/display/widgets/Kconfig b/app/src/display/widgets/Kconfig index 847a47ab..5ef32d20 100644 --- a/app/src/display/widgets/Kconfig +++ b/app/src/display/widgets/Kconfig @@ -7,13 +7,13 @@ config ZMK_WIDGET_LAYER_STATUS bool "Widget for highest, active layer using small icons" default y depends on !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL - select LVGL_USE_LABEL + select LV_USE_LABEL config ZMK_WIDGET_BATTERY_STATUS bool "Widget for battery charge information, using small icons" depends on BT default y if BT - select LVGL_USE_LABEL + select LV_USE_LABEL if ZMK_WIDGET_BATTERY_STATUS @@ -26,18 +26,18 @@ config ZMK_WIDGET_OUTPUT_STATUS bool "Widget for keyboard output status icons" depends on BT && (!ZMK_SPLIT_BLE || ZMK_SPLIT_ROLE_CENTRAL) default y if BT && (!ZMK_SPLIT_BLE || ZMK_SPLIT_ROLE_CENTRAL) - select LVGL_USE_LABEL + select LV_USE_LABEL config ZMK_WIDGET_PERIPHERAL_STATUS bool "Widget for split peripheral status icons" depends on BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL default y if BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL - select LVGL_USE_LABEL + select LV_USE_LABEL config ZMK_WIDGET_WPM_STATUS bool "Widget for displaying typed words per minute" depends on !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL - select LVGL_USE_LABEL + select LV_USE_LABEL select ZMK_WPM endmenu diff --git a/app/src/display/widgets/battery_status.c b/app/src/display/widgets/battery_status.c index 71b243d3..3480101d 100644 --- a/app/src/display/widgets/battery_status.c +++ b/app/src/display/widgets/battery_status.c @@ -55,7 +55,6 @@ static void set_battery_symbol(lv_obj_t *label, struct battery_status_state stat } #endif lv_label_set_text(label, text); - lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 0); } void battery_status_update_cb(struct battery_status_state state) { @@ -81,9 +80,7 @@ ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); - - lv_obj_set_size(widget->obj, 43, 15); + widget->obj = lv_label_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/src/display/widgets/layer_status.c b/app/src/display/widgets/layer_status.c index a4a7be58..8dc0061c 100644 --- a/app/src/display/widgets/layer_status.c +++ b/app/src/display/widgets/layer_status.c @@ -54,9 +54,7 @@ ZMK_DISPLAY_WIDGET_LISTENER(widget_layer_status, struct layer_status_state, laye ZMK_SUBSCRIPTION(widget_layer_status, zmk_layer_state_changed); int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); - - lv_obj_set_size(widget->obj, 40, 15); + widget->obj = lv_label_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/src/display/widgets/output_status.c b/app/src/display/widgets/output_status.c index 8bbe1a7e..135770a6 100644 --- a/app/src/display/widgets/output_status.c +++ b/app/src/display/widgets/output_status.c @@ -81,9 +81,7 @@ ZMK_SUBSCRIPTION(widget_output_status, zmk_ble_active_profile_changed); #endif int zmk_widget_output_status_init(struct zmk_widget_output_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); - - lv_obj_set_size(widget->obj, 40, 15); + widget->obj = lv_label_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/src/display/widgets/peripheral_status.c b/app/src/display/widgets/peripheral_status.c index baf48f58..d0c33f20 100644 --- a/app/src/display/widgets/peripheral_status.c +++ b/app/src/display/widgets/peripheral_status.c @@ -45,9 +45,7 @@ ZMK_SUBSCRIPTION(widget_peripheral_status, zmk_split_peripheral_status_changed); int zmk_widget_peripheral_status_init(struct zmk_widget_peripheral_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); - - lv_obj_set_size(widget->obj, 40, 15); + widget->obj = lv_label_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/src/display/widgets/wpm_status.c b/app/src/display/widgets/wpm_status.c index a2c6a287..f3d06d65 100644 --- a/app/src/display/widgets/wpm_status.c +++ b/app/src/display/widgets/wpm_status.c @@ -31,7 +31,7 @@ void set_wpm_symbol(lv_obj_t *label, struct wpm_status_state state) { snprintf(text, sizeof(text), "%i", state.wpm); lv_label_set_text(label, text); - lv_obj_align(label, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); + lv_obj_align(label, LV_ALIGN_BOTTOM_RIGHT, 0, 0); } void wpm_status_update_cb(struct wpm_status_state state) { @@ -44,10 +44,8 @@ ZMK_DISPLAY_WIDGET_LISTENER(widget_wpm_status, struct wpm_status_state, wpm_stat ZMK_SUBSCRIPTION(widget_wpm_status, zmk_wpm_state_changed); int zmk_widget_wpm_status_init(struct zmk_widget_wpm_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); - lv_label_set_align(widget->obj, LV_LABEL_ALIGN_RIGHT); - - lv_obj_set_size(widget->obj, 40, 15); + widget->obj = lv_label_create(parent); + lv_obj_align(widget->obj, LV_ALIGN_RIGHT_MID, 0, 0); sys_slist_append(&widgets, &widget->node); From 243a227ff96e0cc25d4ae362efb30c769b4bc329 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 20 Sep 2022 21:35:40 -0400 Subject: [PATCH 167/289] refactor: Move to LISTIFY/DT_FOREACH_PROP_ELEM macros. --- app/drivers/kscan/kscan_gpio_demux.c | 6 +++--- app/drivers/kscan/kscan_gpio_direct.c | 4 ++-- app/drivers/kscan/kscan_gpio_matrix.c | 8 ++++---- app/src/behaviors/behavior_caps_word.c | 4 ++-- app/src/behaviors/behavior_macro.c | 4 ++-- app/src/behaviors/behavior_tap_dance.c | 4 ++-- app/src/conditional_layer.c | 5 ++--- app/src/keymap.c | 8 ++++---- app/src/matrix_transform.c | 4 ++-- app/src/sensors.c | 17 ++++++++++------- 10 files changed, 33 insertions(+), 31 deletions(-) diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/drivers/kscan/kscan_gpio_demux.c index 6e3d9e79..ff2c6c69 100644 --- a/app/drivers/kscan/kscan_gpio_demux.c +++ b/app/drivers/kscan/kscan_gpio_demux.c @@ -28,7 +28,7 @@ struct kscan_gpio_item_config { .label = DT_INST_GPIO_LABEL_BY_IDX(n, prop, idx), \ .pin = DT_INST_GPIO_PIN_BY_IDX(n, prop, idx), \ .flags = DT_INST_GPIO_FLAGS_BY_IDX(n, prop, idx), \ - }, + } // Define row and col cfg #define _KSCAN_GPIO_INPUT_CFG_INIT(idx, n) _KSCAN_GPIO_ITEM_CFG_INIT(n, input_gpios, idx) @@ -240,8 +240,8 @@ struct kscan_gpio_item_config { }; \ \ static const struct kscan_gpio_config_##n kscan_gpio_config_##n = { \ - .rows = {UTIL_LISTIFY(INST_MATRIX_INPUTS(n), _KSCAN_GPIO_INPUT_CFG_INIT, n)}, \ - .cols = {UTIL_LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, n)}, \ + .rows = {LISTIFY(INST_MATRIX_INPUTS(n), _KSCAN_GPIO_INPUT_CFG_INIT, (,), n)}, \ + .cols = {LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, (,), n)}, \ }; \ \ DEVICE_DT_INST_DEFINE(n, kscan_gpio_init_##n, NULL, &kscan_gpio_data_##n, \ diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/drivers/kscan/kscan_gpio_direct.c index ee7b13f6..1e0576c5 100644 --- a/app/drivers/kscan/kscan_gpio_direct.c +++ b/app/drivers/kscan/kscan_gpio_direct.c @@ -41,7 +41,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define INST_INPUTS_LEN(n) DT_INST_PROP_LEN(n, input_gpios) #define KSCAN_DIRECT_INPUT_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), input_gpios, idx), + GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), input_gpios, idx) struct kscan_direct_irq_callback { const struct device *dev; @@ -327,7 +327,7 @@ static const struct kscan_driver_api kscan_direct_api = { "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ static const struct gpio_dt_spec kscan_direct_inputs_##n[] = { \ - UTIL_LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, n)}; \ + LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, (,), n)}; \ \ static struct debounce_state kscan_direct_state_##n[INST_INPUTS_LEN(n)]; \ \ diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index 71fcad29..de65fd49 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -50,9 +50,9 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); COND_CODE_1(CONFIG_ZMK_KSCAN_MATRIX_POLLING, pollcode, intcode) #define KSCAN_GPIO_ROW_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), row_gpios, idx), + GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), row_gpios, idx) #define KSCAN_GPIO_COL_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), col_gpios, idx), + GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), col_gpios, idx) enum kscan_diode_direction { KSCAN_ROW2COL, @@ -433,10 +433,10 @@ static const struct kscan_driver_api kscan_matrix_api = { "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ static const struct gpio_dt_spec kscan_matrix_rows_##n[] = { \ - UTIL_LISTIFY(INST_ROWS_LEN(n), KSCAN_GPIO_ROW_CFG_INIT, n)}; \ + LISTIFY(INST_ROWS_LEN(n), KSCAN_GPIO_ROW_CFG_INIT, (,), n)}; \ \ static const struct gpio_dt_spec kscan_matrix_cols_##n[] = { \ - UTIL_LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, n)}; \ + LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, (,), n)}; \ \ static struct debounce_state kscan_matrix_state_##n[INST_MATRIX_LEN(n)]; \ \ diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 3842a31f..7a9612b3 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -168,7 +168,7 @@ static int behavior_caps_word_init(const struct device *dev) { #define PARSE_BREAK(i) \ {.page = ZMK_HID_USAGE_PAGE(i), \ .id = ZMK_HID_USAGE_ID(i), \ - .implicit_modifiers = SELECT_MODS(i)}, + .implicit_modifiers = SELECT_MODS(i)} #define BREAK_ITEM(i, n) PARSE_BREAK(DT_INST_PROP_BY_IDX(n, continue_list, i)) @@ -177,7 +177,7 @@ static int behavior_caps_word_init(const struct device *dev) { static struct behavior_caps_word_config behavior_caps_word_config_##n = { \ .index = n, \ .mods = DT_INST_PROP_OR(n, mods, MOD_LSFT), \ - .continuations = {UTIL_LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, n)}, \ + .continuations = {LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, (,), n)}, \ .continuations_count = DT_INST_PROP_LEN(n, continue_list), \ }; \ DEVICE_DT_INST_DEFINE(n, behavior_caps_word_init, NULL, &behavior_caps_word_data_##n, \ diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index 46fdde3c..5b215b93 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -166,10 +166,10 @@ static const struct behavior_driver_api behavior_macro_driver_api = { .binding_released = on_macro_binding_released, }; -#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, DT_DRV_INST(drv_inst)), +#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, DT_DRV_INST(drv_inst)) #define TRANSFORMED_BEHAVIORS(n) \ - {UTIL_LISTIFY(DT_PROP_LEN(DT_DRV_INST(n), bindings), BINDING_WITH_COMMA, n)}, + {LISTIFY(DT_PROP_LEN(DT_DRV_INST(n), bindings), BINDING_WITH_COMMA, (,), n)}, #define MACRO_INST(n) \ static struct behavior_macro_state behavior_macro_state_##n = {}; \ diff --git a/app/src/behaviors/behavior_tap_dance.c b/app/src/behaviors/behavior_tap_dance.c index 3bad2901..6d78cb3e 100644 --- a/app/src/behaviors/behavior_tap_dance.c +++ b/app/src/behaviors/behavior_tap_dance.c @@ -237,10 +237,10 @@ static int behavior_tap_dance_init(const struct device *dev) { return 0; } -#define _TRANSFORM_ENTRY(idx, node) ZMK_KEYMAP_EXTRACT_BINDING(idx, node), +#define _TRANSFORM_ENTRY(idx, node) ZMK_KEYMAP_EXTRACT_BINDING(idx, node) #define TRANSFORMED_BINDINGS(node) \ - { UTIL_LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, DT_DRV_INST(node)) } + { LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, (,), DT_DRV_INST(node)) } #define KP_INST(n) \ static struct zmk_behavior_binding \ diff --git a/app/src/conditional_layer.c b/app/src/conditional_layer.c index 1728a7f4..572652ff 100644 --- a/app/src/conditional_layer.c +++ b/app/src/conditional_layer.c @@ -33,13 +33,12 @@ struct conditional_layer_cfg { int8_t then_layer; }; -#define IF_LAYER_BIT(i, n) BIT(DT_PROP_BY_IDX(n, if_layers, i)) | +#define IF_LAYER_BIT(node_id, prop, idx) BIT(DT_PROP_BY_IDX(node_id, prop, idx)) | // Evaluates to conditional_layer_cfg struct initializer. #define CONDITIONAL_LAYER_DECL(n) \ { \ - /* TODO: Replace UTIL_LISTIFY with DT_FOREACH_PROP_ELEM after Zepyhr 2.6.0 upgrade. */ \ - .if_layers_state_mask = UTIL_LISTIFY(DT_PROP_LEN(n, if_layers), IF_LAYER_BIT, n) 0, \ + .if_layers_state_mask = DT_FOREACH_PROP_ELEM(n, if_layers, IF_LAYER_BIT) 0, \ .then_layer = DT_PROP(n, then_layer), \ }, diff --git a/app/src/keymap.c b/app/src/keymap.c index e586316f..b00d0fba 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -34,10 +34,10 @@ static uint8_t _zmk_keymap_layer_default = 0; #define ZMK_KEYMAP_NODE DT_DRV_INST(0) #define ZMK_KEYMAP_LAYERS_LEN (DT_INST_FOREACH_CHILD(0, LAYER_CHILD_LEN) 0) -#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst), +#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst) #define TRANSFORMED_LAYER(node) \ - {UTIL_LISTIFY(DT_PROP_LEN(node, bindings), BINDING_WITH_COMMA, node)}, + {LISTIFY(DT_PROP_LEN(node, bindings), BINDING_WITH_COMMA, (,), node)}, #if ZMK_KEYMAP_HAS_SENSORS #define _TRANSFORM_SENSOR_ENTRY(idx, layer) \ @@ -47,12 +47,12 @@ static uint8_t _zmk_keymap_layer_default = 0; (DT_PHA_BY_IDX(layer, sensor_bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(layer, sensor_bindings, idx, param2), (0), \ (DT_PHA_BY_IDX(layer, sensor_bindings, idx, param2))), \ - }, + } #define SENSOR_LAYER(node) \ COND_CODE_1( \ DT_NODE_HAS_PROP(node, sensor_bindings), \ - ({UTIL_LISTIFY(DT_PROP_LEN(node, sensor_bindings), _TRANSFORM_SENSOR_ENTRY, node)}), \ + ({LISTIFY(DT_PROP_LEN(node, sensor_bindings), _TRANSFORM_SENSOR_ENTRY, (,), node)}), \ ({})), #endif /* ZMK_KEYMAP_HAS_SENSORS */ diff --git a/app/src/matrix_transform.c b/app/src/matrix_transform.c index 8f54f312..e7c6e95f 100644 --- a/app/src/matrix_transform.c +++ b/app/src/matrix_transform.c @@ -13,9 +13,9 @@ #define _TRANSFORM_ENTRY(i, _) \ [(KT_ROW(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i)) * ZMK_MATRIX_COLS) + \ - KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i, + KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i -static uint32_t transform[] = {UTIL_LISTIFY(ZMK_KEYMAP_LEN, _TRANSFORM_ENTRY, 0)}; +static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, _TRANSFORM_ENTRY, (,), 0)}; #endif diff --git a/app/src/sensors.c b/app/src/sensors.c index dd5f4267..184061ac 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -25,12 +25,15 @@ struct sensors_data_item { }; #define _SENSOR_ITEM(node) \ - {.dev = NULL, .trigger = {.type = SENSOR_TRIG_DELTA, .chan = SENSOR_CHAN_ROTATION}}, -#define SENSOR_ITEM(idx, _) \ - COND_CODE_1(DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_BY_IDX(idx), okay), \ - (_SENSOR_ITEM(ZMK_KEYMAP_SENSORS_BY_IDX(idx))), ()) + { \ + .dev = NULL, .trigger = {.type = SENSOR_TRIG_DELTA, .chan = SENSOR_CHAN_ROTATION } \ + } -static struct sensors_data_item sensors[] = {UTIL_LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_ITEM, 0)}; +#define SENSOR_ITEM(idx, _node) \ + COND_CODE_1(DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_BY_IDX(idx), okay), \ + (_SENSOR_ITEM(ZMK_KEYMAP_SENSORS_BY_IDX(idx))), ({})) + +static struct sensors_data_item sensors[] = {LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_ITEM, (, ), 0)}; static void zmk_sensors_trigger_handler(const struct device *dev, struct sensor_trigger *trigger) { int err; @@ -71,10 +74,10 @@ static int zmk_sensors_init(const struct device *_arg) { int local_index = 0; int absolute_index = 0; - UTIL_LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_INIT, 0) + LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_INIT, (), 0) return 0; } SYS_INIT(zmk_sensors_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); -#endif /* ZMK_KEYMAP_HAS_SENSORS */ \ No newline at end of file +#endif /* ZMK_KEYMAP_HAS_SENSORS */ From d513dc1766edf52a22d78da0e73d5a09670059e9 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 20 Sep 2022 21:36:13 -0400 Subject: [PATCH 168/289] refactor: Move to new PM API. --- app/src/activity.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/activity.c b/app/src/activity.c index 5a1e2385..029908c0 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -70,7 +70,7 @@ void activity_work_handler(struct k_work *work) { if (inactive_time > MAX_SLEEP_MS && !is_usb_power_present()) { // Put devices in suspend power mode before sleeping set_state(ZMK_ACTIVITY_SLEEP); - pm_power_state_force(0U, (struct pm_state_info){PM_STATE_SOFT_OFF, 0, 0}); + pm_state_force(0U, &(struct pm_state_info){PM_STATE_SOFT_OFF, 0, 0}); } else #endif /* IS_ENABLED(CONFIG_ZMK_SLEEP) */ if (inactive_time > MAX_IDLE_MS) { From 4f2f9db1d474dc8754780b27243b1a61acbdad42 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 20 Sep 2022 21:36:53 -0400 Subject: [PATCH 169/289] refactor(ble): New callback API for pairing complete. --- app/src/ble.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/ble.c b/app/src/ble.c index b10aa20b..4d2e4603 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -528,7 +528,6 @@ static void auth_pairing_complete(struct bt_conn *conn, bool bonded) { static struct bt_conn_auth_cb zmk_ble_auth_cb_display = { .pairing_accept = auth_pairing_accept, - .pairing_complete = auth_pairing_complete, // .passkey_display = auth_passkey_display, #if IS_ENABLED(CONFIG_ZMK_BLE_PASSKEY_ENTRY) @@ -537,6 +536,10 @@ static struct bt_conn_auth_cb zmk_ble_auth_cb_display = { .cancel = auth_cancel, }; +static struct bt_conn_auth_info_cb zmk_ble_auth_info_cb_display = { + .pairing_complete = auth_pairing_complete, +}; + static void zmk_ble_ready(int err) { LOG_DBG("ready? %d", err); if (err) { @@ -589,6 +592,7 @@ static int zmk_ble_init(const struct device *_arg) { bt_conn_cb_register(&conn_callbacks); bt_conn_auth_cb_register(&zmk_ble_auth_cb_display); + bt_conn_auth_info_cb_register(&zmk_ble_auth_info_cb_display); zmk_ble_ready(0); From 35a1c5a3d44b92c050d28c0aca3d1cb9c7e53695 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 20 Sep 2022 21:37:16 -0400 Subject: [PATCH 170/289] refactor(behaviors): Rename `reset` behavior. * Upstream now has a node w/ label `reset` on many boards, so renaming our reset behavior node label to `sys_reset`. --- app/boards/arm/bt60/bt60_v1.keymap | 10 +++++----- app/boards/arm/bt60/bt60_v1_hs.keymap | 2 +- app/boards/arm/planck/planck_rev6.keymap | 2 +- app/boards/arm/s40nc/s40nc.keymap | 2 +- app/boards/shields/bfo9000/bfo9000.keymap | 2 +- .../shields/boardsource3x4/boardsource3x4.keymap | 2 +- app/boards/shields/contra/contra.keymap | 2 +- app/boards/shields/cradio/cradio.keymap | 2 +- app/boards/shields/crbn/crbn.keymap | 2 +- app/boards/shields/eek/eek.keymap | 2 +- app/boards/shields/ergodash/ergodash.keymap | 4 ++-- .../shields/eternal_keypad/eternal_keypad.keymap | 4 ++-- .../shields/eternal_keypad/eternal_keypad_lefty.keymap | 4 ++-- app/boards/shields/jian/jian.keymap | 2 +- app/boards/shields/jiran/jiran.keymap | 2 +- app/boards/shields/jorne/jorne.keymap | 2 +- app/boards/shields/leeloo/leeloo.keymap | 2 +- app/boards/shields/lotus58/lotus58.keymap | 6 +++--- app/boards/shields/m60/m60.keymap | 2 +- app/boards/shields/murphpad/murphpad.keymap | 2 +- app/boards/shields/qaz/qaz.keymap | 2 +- app/boards/shields/redox/redox.keymap | 2 +- app/boards/shields/reviung41/reviung41.keymap | 2 +- .../shields/settings_reset/settings_reset.keymap | 2 +- app/boards/shields/tg4x/tg4x.keymap | 2 +- app/boards/shields/tidbit/tidbit.keymap | 2 +- app/boards/shields/tidbit/tidbit_19key.keymap | 2 +- app/boards/shields/waterfowl/waterfowl.keymap | 8 ++++---- app/boards/shields/zodiark/zodiark.keymap | 2 +- app/dts/behaviors/reset.dtsi | 4 ++-- docs/blog/2021-01-27-zmk-sotf-4.md | 2 +- docs/docs/behaviors/reset.md | 6 +++--- docs/src/data/keymap-upgrade.js | 1 + 33 files changed, 48 insertions(+), 47 deletions(-) diff --git a/app/boards/arm/bt60/bt60_v1.keymap b/app/boards/arm/bt60/bt60_v1.keymap index 0985a605..b42f3f3d 100644 --- a/app/boards/arm/bt60/bt60_v1.keymap +++ b/app/boards/arm/bt60/bt60_v1.keymap @@ -56,7 +56,7 @@ // ------------------------------------------------------------------------------------------ bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &reset + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR &trans @@ -84,7 +84,7 @@ raise { bindings = < &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp INS &kp DEL - &kp CLCK &bt BT_PRV &bt BT_NXT &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &kp UP &trans &reset + &kp CLCK &bt BT_PRV &bt BT_NXT &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &kp UP &trans &sys_reset &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp LEFT &kp RIGHT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp DOWN &trans &trans &trans &trans &trans &bootloader &trans &trans &trans @@ -112,7 +112,7 @@ raise { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL - &reset &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK + &sys_reset &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &trans &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR @@ -140,7 +140,7 @@ raise { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp F1 - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &reset + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &bt BT_CLR @@ -168,7 +168,7 @@ raise { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &reset + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &trans &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR diff --git a/app/boards/arm/bt60/bt60_v1_hs.keymap b/app/boards/arm/bt60/bt60_v1_hs.keymap index 6e62e1bb..167460c6 100644 --- a/app/boards/arm/bt60/bt60_v1_hs.keymap +++ b/app/boards/arm/bt60/bt60_v1_hs.keymap @@ -26,7 +26,7 @@ raise { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &reset + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR diff --git a/app/boards/arm/planck/planck_rev6.keymap b/app/boards/arm/planck/planck_rev6.keymap index bbfb770e..7e4f6732 100644 --- a/app/boards/arm/planck/planck_rev6.keymap +++ b/app/boards/arm/planck/planck_rev6.keymap @@ -39,7 +39,7 @@ &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans - &reset &bootloader &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP >; }; }; diff --git a/app/boards/arm/s40nc/s40nc.keymap b/app/boards/arm/s40nc/s40nc.keymap index d7f349d9..c43bc671 100644 --- a/app/boards/arm/s40nc/s40nc.keymap +++ b/app/boards/arm/s40nc/s40nc.keymap @@ -50,7 +50,7 @@ &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp C_PP &bt BT_SEL 0 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &kp K_LOCK &bt BT_SEL 1 &out OUT_USB &kp CAPS &kp KP_NUM &kp SLCK &trans &trans &kp COMMA &kp DOT &kp K_VOL_UP &kp K_MUTE - &bt BT_SEL 2 &out OUT_BLE &kp PAUSE_BREAK &reset &trans &bootloader &kp C_BRI_DN &kp K_VOL_DN &kp C_BRI_UP + &bt BT_SEL 2 &out OUT_BLE &kp PAUSE_BREAK &sys_reset &trans &bootloader &kp C_BRI_DN &kp K_VOL_DN &kp C_BRI_UP >; }; }; diff --git a/app/boards/shields/bfo9000/bfo9000.keymap b/app/boards/shields/bfo9000/bfo9000.keymap index fe904931..22186a1d 100644 --- a/app/boards/shields/bfo9000/bfo9000.keymap +++ b/app/boards/shields/bfo9000/bfo9000.keymap @@ -46,7 +46,7 @@ &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans - &reset &bootloader &trans &trans &trans &trans &trans &trans &trans &reset &bootloader &trans &trans &trans &trans &trans &trans &trans + &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans >; diff --git a/app/boards/shields/boardsource3x4/boardsource3x4.keymap b/app/boards/shields/boardsource3x4/boardsource3x4.keymap index add7efa0..c47126ab 100644 --- a/app/boards/shields/boardsource3x4/boardsource3x4.keymap +++ b/app/boards/shields/boardsource3x4/boardsource3x4.keymap @@ -32,7 +32,7 @@ lower_layer { bindings = < - &bt BT_CLR &none &reset &bootloader + &bt BT_CLR &none &sys_reset &bootloader &trans &bt BT_SEL 3 &bt BT_SEL 4 &none &none &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 >; diff --git a/app/boards/shields/contra/contra.keymap b/app/boards/shields/contra/contra.keymap index e24b5028..77b431b6 100644 --- a/app/boards/shields/contra/contra.keymap +++ b/app/boards/shields/contra/contra.keymap @@ -30,7 +30,7 @@ &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL &kp TAB &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp PG_UP &kp LBKT &kp RBKT &kp BSLH &kp LSHFT &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp EQUAL &kp PG_DN &kp HOME &kp END &kp ENTER - &kp LCTRL &kp LGUI &kp LALT &reset &to DEFAULT &kp SPACE &trans &mo BT_CTRL &kp LEFT &kp RIGHT &kp UP &kp DOWN + &kp LCTRL &kp LGUI &kp LALT &sys_reset &to DEFAULT &kp SPACE &trans &mo BT_CTRL &kp LEFT &kp RIGHT &kp UP &kp DOWN >; }; diff --git a/app/boards/shields/cradio/cradio.keymap b/app/boards/shields/cradio/cradio.keymap index 587bc7aa..3f6670da 100644 --- a/app/boards/shields/cradio/cradio.keymap +++ b/app/boards/shields/cradio/cradio.keymap @@ -88,7 +88,7 @@ bindings = < //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ //│ RESET │ │ │ │PROFILE 0 │ │ │ │ │ │ RESET │ - &reset &trans &trans &trans &bt BT_SEL 0 &trans &trans &trans &trans &reset + &sys_reset &trans &trans &trans &bt BT_SEL 0 &trans &trans &trans &trans &sys_reset //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ //│BOOTLOADER│ │ │ │PROFILE 1 │ │ │ │ │ │BOOTLOADER│ &bootloader &trans &trans &trans &bt BT_SEL 1 &trans &trans &trans &trans &bootloader diff --git a/app/boards/shields/crbn/crbn.keymap b/app/boards/shields/crbn/crbn.keymap index 9423e1af..b967e5e2 100644 --- a/app/boards/shields/crbn/crbn.keymap +++ b/app/boards/shields/crbn/crbn.keymap @@ -52,7 +52,7 @@ control { bindings = < - &reset &bootloader &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans + &sys_reset &bootloader &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &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 &trans &trans &trans diff --git a/app/boards/shields/eek/eek.keymap b/app/boards/shields/eek/eek.keymap index 439c90aa..d250cb01 100644 --- a/app/boards/shields/eek/eek.keymap +++ b/app/boards/shields/eek/eek.keymap @@ -49,7 +49,7 @@ &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &out OUT_USB &out OUT_BLE &none &kp EQUAL &kp MINUS &kp CAPS &kp F5 &kp F6 &kp F7 &kp F8 &kp LBKT &kp RBKT &none &kp GRAVE &kp BSLH &kp LSHFT &kp F9 &kp F10 &kp F11 &kp F12 &none &none &none &none &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &reset &none &trans + &kp LCTRL &kp LGUI &kp LALT &sys_reset &none &trans >; }; }; diff --git a/app/boards/shields/ergodash/ergodash.keymap b/app/boards/shields/ergodash/ergodash.keymap index a85c58a6..e384e504 100644 --- a/app/boards/shields/ergodash/ergodash.keymap +++ b/app/boards/shields/ergodash/ergodash.keymap @@ -56,7 +56,7 @@ &kp F11 &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &none &none &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F12 &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none -&trans &bootloader &reset &none &none &none &none &none &none &none &none &none &none &trans +&trans &bootloader &sys_reset &none &none &none &none &none &none &none &none &none &none &trans &trans &none &none &trans &trans &none &trans &trans &none &trans &none &none &none &trans >; }; @@ -77,7 +77,7 @@ &none &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none -&trans &none &none &none &none &none &none &none &none &none &none &bootloader &reset &trans +&trans &none &none &none &none &none &none &none &none &none &none &bootloader &sys_reset &trans &trans &none &none &trans &trans &none &trans &trans &none &trans &none &none &none &trans >; }; diff --git a/app/boards/shields/eternal_keypad/eternal_keypad.keymap b/app/boards/shields/eternal_keypad/eternal_keypad.keymap index 0f3eda7b..da06d274 100644 --- a/app/boards/shields/eternal_keypad/eternal_keypad.keymap +++ b/app/boards/shields/eternal_keypad/eternal_keypad.keymap @@ -38,7 +38,7 @@ &bt BT_SEL 0 &bt BT_SEL 1 &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &kp UP &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_HUD &bt BT_CLR &trans &kp LEFT &kp DOWN &kp RIGHT &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD - &reset &trans &trans &trans &trans &trans &rgb_ug RGB_EFF &rgb_ug RGB_EFR + &sys_reset &trans &trans &trans &trans &trans &rgb_ug RGB_EFF &rgb_ug RGB_EFR &bootloader &trans &trans &trans &trans &trans >; }; @@ -48,7 +48,7 @@ &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp P &kp O &kp I &kp U &kp Y &kp F7 &bt BT_CLR &kp BSPC &kp SEMI &kp L &kp K &kp J &kp H &kp F8 - &reset &trans &kp LGUI &kp M &kp N &kp F12 &kp F11 &kp F9 + &sys_reset &trans &kp LGUI &kp M &kp N &kp F12 &kp F11 &kp F9 &bootloader &trans &trans &trans &trans &kp F10 >; }; diff --git a/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap index e1bddbad..81710032 100644 --- a/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap +++ b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap @@ -38,7 +38,7 @@ &bt BT_SEL 0 &bt BT_SEL 1 &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &kp UP &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_HUD &bt BT_CLR &trans &kp RIGHT &kp DOWN &kp RIGHT &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD - &reset &trans &trans &trans &trans &trans &rgb_ug RGB_EFF &rgb_ug RGB_EFR + &sys_reset &trans &trans &trans &trans &trans &rgb_ug RGB_EFF &rgb_ug RGB_EFR &bootloader &trans &trans &trans &trans &trans >; }; @@ -48,7 +48,7 @@ &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp P &kp O &kp I &kp U &kp Y &kp F7 &bt BT_CLR &kp BSPC &kp SEMI &kp L &kp K &kp J &kp H &kp F8 - &reset &trans &kp LGUI &kp M &kp N &kp F12 &kp F11 &kp F9 + &sys_reset &trans &kp LGUI &kp M &kp N &kp F12 &kp F11 &kp F9 &bootloader &trans &trans &trans &trans &kp F10 >; }; diff --git a/app/boards/shields/jian/jian.keymap b/app/boards/shields/jian/jian.keymap index 7b8dd676..e8f7dcc8 100644 --- a/app/boards/shields/jian/jian.keymap +++ b/app/boards/shields/jian/jian.keymap @@ -67,7 +67,7 @@ // | | | | | | | | | | | | | | // | | | | | | | | bindings = < - &reset &bootloader &none &none &none &none &none &none &none &none &none &none &bootloader &reset + &sys_reset &bootloader &none &none &none &none &none &none &none &none &none &none &bootloader &sys_reset &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 4 &bt BT_SEL 3 &bt BT_SEL 2 &bt BT_SEL 1 &bt BT_SEL 0 &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &none &trans &none &trans &trans &none &trans diff --git a/app/boards/shields/jiran/jiran.keymap b/app/boards/shields/jiran/jiran.keymap index e6c073cc..6dcd733c 100644 --- a/app/boards/shields/jiran/jiran.keymap +++ b/app/boards/shields/jiran/jiran.keymap @@ -25,7 +25,7 @@ lower_layer { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp EQUAL - &kp F11 &kp TAB &bt BT_CLR &kp HOME &reset &kp PG_UP &kp C_VOL_UP &kp C_VOL_UP &kp PG_UP &reset &kp HOME &kp INS &kp DEL &kp F12 + &kp F11 &kp TAB &bt BT_CLR &kp HOME &sys_reset &kp PG_UP &kp C_VOL_UP &kp C_VOL_UP &kp PG_UP &sys_reset &kp HOME &kp INS &kp DEL &kp F12 &kp LSHIFT &bt BT_NXT &kp LEFT &kp UP &kp RIGHT &kp C_MUTE &kp C_MUTE &kp LEFT &kp UP &kp RIGHT &kp PSCRN &mt RSHIFT SLCK &kp LCTRL &bt BT_PRV &kp END &kp DOWN &kp PG_DN &kp C_VOL_DN &kp C_VOL_DN &kp PG_DN &kp DOWN &kp END &kp PAUSE_BREAK &mt RCTRL KP_NUM &trans &kp SPACE &kp LALT &mt RALT RET &kp BSPC &trans diff --git a/app/boards/shields/jorne/jorne.keymap b/app/boards/shields/jorne/jorne.keymap index 93c7691a..2a109fe8 100644 --- a/app/boards/shields/jorne/jorne.keymap +++ b/app/boards/shields/jorne/jorne.keymap @@ -64,7 +64,7 @@ // | | | | | | | | | | | | | | // | | | | | | | | bindings = < - &reset &bootloader &none &none &none &none &none &none &none &none &none &none &bootloader &reset + &sys_reset &bootloader &none &none &none &none &none &none &none &none &none &none &bootloader &sys_reset &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 4 &bt BT_SEL 3 &bt BT_SEL 2 &bt BT_SEL 1 &bt BT_SEL 0 &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &none &trans &none &trans &trans &none &trans diff --git a/app/boards/shields/leeloo/leeloo.keymap b/app/boards/shields/leeloo/leeloo.keymap index 4104cc3a..fc3b25e0 100644 --- a/app/boards/shields/leeloo/leeloo.keymap +++ b/app/boards/shields/leeloo/leeloo.keymap @@ -45,7 +45,7 @@ raise_layer { bindings = < &trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans -&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &reset &bootloader +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &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 &trans &trans &bt BT_CLR &trans diff --git a/app/boards/shields/lotus58/lotus58.keymap b/app/boards/shields/lotus58/lotus58.keymap index cfe4342c..50249146 100644 --- a/app/boards/shields/lotus58/lotus58.keymap +++ b/app/boards/shields/lotus58/lotus58.keymap @@ -57,7 +57,7 @@ bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &fofunc &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp EQUAL &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT -&kp LSHFT &kp A &sleft &kp D &fright &kp G &reset &reset &kp H &kp J &kp K &kp L &kp SEMI &mt RSHFT SQT +&kp LSHFT &kp A &sleft &kp D &fright &kp G &sys_reset &sys_reset &kp H &kp J &kp K &kp L &kp SEMI &mt RSHFT SQT &kp LCTRL &kp Z &kp X &kp C &kp V &kp B &kp C_MUTE &kp C_PP &kp N &kp M &kp COMMA &kp DOT &kp FSLH &mt RCTRL BSLH < 2 RET &kp LALT &kp SPACE < 1 DEL < 2 RET &kp BSPC < 1 RBKT &kp LGUI >; @@ -91,8 +91,8 @@ // | | UNDO | CUT | COPY | PASTE | | | | | | |> | <|<| | |>|> | | | // | | | | | | | | | | bindings = < -&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &out OUT_TOG &out OUT_USB &out OUT_BLE &trans &reset &bootloader -&trans &kp INS &kp PSCRN &kp K_CMENU &reset &trans &kp PG_UP &trans &kp UP &trans &trans &trans +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &out OUT_TOG &out OUT_USB &out OUT_BLE &trans &sys_reset &bootloader +&trans &kp INS &kp PSCRN &kp K_CMENU &sys_reset &trans &kp PG_UP &trans &kp UP &trans &trans &trans &trans &kp LALT &kp LCTRL &kp LSHFT &bootloader &kp CLCK &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp DEL &kp BSPC &trans &kp K_UNDO &kp K_CUT &kp K_COPY &kp K_PASTE &trans &trans &trans &trans &kp C_PP &kp C_PREV &kp C_NEXT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/boards/shields/m60/m60.keymap b/app/boards/shields/m60/m60.keymap index 6caa6370..aa656929 100644 --- a/app/boards/shields/m60/m60.keymap +++ b/app/boards/shields/m60/m60.keymap @@ -32,7 +32,7 @@ fn_layer { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bootloader -&trans &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &reset +&trans &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &sys_reset &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &none &none &trans &trans &none &none &none &none &none &none &none &none &none &none &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/boards/shields/murphpad/murphpad.keymap b/app/boards/shields/murphpad/murphpad.keymap index aec58878..2e8c6f6e 100644 --- a/app/boards/shields/murphpad/murphpad.keymap +++ b/app/boards/shields/murphpad/murphpad.keymap @@ -31,7 +31,7 @@ combo_reset { timeout-ms = ; key-positions = <1 3>; - bindings = <&reset>; + bindings = <&sys_reset>; }; combo_bootloader { timeout-ms = ; diff --git a/app/boards/shields/qaz/qaz.keymap b/app/boards/shields/qaz/qaz.keymap index a832860e..e6794e7b 100644 --- a/app/boards/shields/qaz/qaz.keymap +++ b/app/boards/shields/qaz/qaz.keymap @@ -42,7 +42,7 @@ &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans &trans &trans &trans &trans &trans &trans &trans &kp EQUAL &kp MINUS &kp DEL &none &none &none &none &none &none &none &kp DOT - &bootloader &reset &none &trans &trans &kp RET &trans &kp FSLH + &bootloader &sys_reset &none &trans &trans &kp RET &trans &kp FSLH >; }; diff --git a/app/boards/shields/redox/redox.keymap b/app/boards/shields/redox/redox.keymap index aed22c42..a45595ff 100644 --- a/app/boards/shields/redox/redox.keymap +++ b/app/boards/shields/redox/redox.keymap @@ -73,7 +73,7 @@ bindings = < &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &none &none &none &none &none &bootloader &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &out OUT_TOG - &trans &kp K_MUTE &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE &none &reset &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 + &trans &kp K_MUTE &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE &none &sys_reset &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp PSCRN &kp PSCRN &kp CLCK &none &none &trans &trans &trans &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans >; diff --git a/app/boards/shields/reviung41/reviung41.keymap b/app/boards/shields/reviung41/reviung41.keymap index d291ca8b..12f15ad4 100644 --- a/app/boards/shields/reviung41/reviung41.keymap +++ b/app/boards/shields/reviung41/reviung41.keymap @@ -64,7 +64,7 @@ bindings = < &rgb_ug RGB_BRI &rgb_ug RGB_SAI &rgb_ug RGB_HUI &rgb_ug RGB_EFF &none &rgb_ug RGB_TOG &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_CLR &rgb_ug RGB_BRD &rgb_ug RGB_SAD &rgb_ug RGB_HUD &rgb_ug RGB_EFR &none &none &none &none &none &none &none &none - &none &none &none &none &none &none &reset &none &none &none &none &none + &none &none &none &none &none &none &sys_reset &none &none &none &none &none &trans &trans &tog 3 &trans &trans >; }; diff --git a/app/boards/shields/settings_reset/settings_reset.keymap b/app/boards/shields/settings_reset/settings_reset.keymap index 05236445..0afdcc2b 100644 --- a/app/boards/shields/settings_reset/settings_reset.keymap +++ b/app/boards/shields/settings_reset/settings_reset.keymap @@ -13,7 +13,7 @@ default_layer { bindings = < - &reset + &sys_reset >; }; }; diff --git a/app/boards/shields/tg4x/tg4x.keymap b/app/boards/shields/tg4x/tg4x.keymap index 84ca3273..e68d0f92 100644 --- a/app/boards/shields/tg4x/tg4x.keymap +++ b/app/boards/shields/tg4x/tg4x.keymap @@ -45,7 +45,7 @@ bindings = < &kp PRINTSCREEN &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans -&trans &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &bootloader &reset &trans +&trans &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &bootloader &sys_reset &trans &trans &trans &trans &trans &trans &kp C_VOL_UP &kp C_VOL_DN &kp C_PP >; }; diff --git a/app/boards/shields/tidbit/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index 7fa98af2..e8cb3789 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -36,7 +36,7 @@ func_layer { bindings = < - &none &reset &bootloader + &none &sys_reset &bootloader &out OUT_TOG &out OUT_USB &out OUT_BLE &none &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &tog 0 diff --git a/app/boards/shields/tidbit/tidbit_19key.keymap b/app/boards/shields/tidbit/tidbit_19key.keymap index 6e158b03..8414a012 100644 --- a/app/boards/shields/tidbit/tidbit_19key.keymap +++ b/app/boards/shields/tidbit/tidbit_19key.keymap @@ -37,7 +37,7 @@ func_layer { bindings = < - &tog 0 &reset &bootloader + &tog 0 &sys_reset &bootloader &out OUT_TOG &out OUT_USB &out OUT_BLE &none &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none diff --git a/app/boards/shields/waterfowl/waterfowl.keymap b/app/boards/shields/waterfowl/waterfowl.keymap index 9a1dabac..d208fe49 100644 --- a/app/boards/shields/waterfowl/waterfowl.keymap +++ b/app/boards/shields/waterfowl/waterfowl.keymap @@ -99,10 +99,10 @@ * `-----' `--------------------' `--------------------' `-----' */ bindings = < - &trans &trans &bt BT_CLR &trans &reset &reset &kp F7 &kp F8 &kp F9 &kp F11 - &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &kp F4 &kp F5 &kp F6 &kp F12 - &trans &trans &trans &trans &trans &kp F10 &kp F1 &kp F2 &kp F3 &kp F13 - &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + &trans &trans &bt BT_CLR &trans &sys_reset &sys_reset &kp F7 &kp F8 &kp F9 &kp F11 + &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &kp F4 &kp F5 &kp F6 &kp F12 + &trans &trans &trans &trans &trans &kp F10 &kp F1 &kp F2 &kp F3 &kp F13 + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 >; sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; diff --git a/app/boards/shields/zodiark/zodiark.keymap b/app/boards/shields/zodiark/zodiark.keymap index 21fdef10..0211f818 100644 --- a/app/boards/shields/zodiark/zodiark.keymap +++ b/app/boards/shields/zodiark/zodiark.keymap @@ -56,7 +56,7 @@ // | | | | | | | | | | | | | | | | | | // | | | | | | | | | | | | | | | | bindings = < -&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &reset +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &sys_reset &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader &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 diff --git a/app/dts/behaviors/reset.dtsi b/app/dts/behaviors/reset.dtsi index cb246814..74a7163b 100644 --- a/app/dts/behaviors/reset.dtsi +++ b/app/dts/behaviors/reset.dtsi @@ -8,9 +8,9 @@ / { behaviors { - reset: behavior_reset { + sys_reset: behavior_reset { compatible = "zmk,behavior-reset"; - label = "RESET"; + label = "SYSRESET"; #binding-cells = <0>; }; diff --git a/docs/blog/2021-01-27-zmk-sotf-4.md b/docs/blog/2021-01-27-zmk-sotf-4.md index cd84da88..e7ff3232 100644 --- a/docs/blog/2021-01-27-zmk-sotf-4.md +++ b/docs/blog/2021-01-27-zmk-sotf-4.md @@ -164,7 +164,7 @@ For anyone looking to contribute, you can find the [ZMK Firmware project](https: Some items listed in the last coming soon section are still under active development. - A power profiler page for the website, to help users estimate their battery life for a given keyboard - [Nicell] -- Behavior "locality", allowing improved split usage for things like `&reset`, and controlling external power and RGB underglow for both sides - [petejohanson] +- Behavior "locality", allowing improved split usage for things like `&sys_reset`, and controlling external power and RGB underglow for both sides - [petejohanson] - More modular approach to external boards/shields, custom code, user keymaps, etc. - More shields and boards diff --git a/docs/docs/behaviors/reset.md b/docs/docs/behaviors/reset.md index c06a13b7..0fc62b2f 100644 --- a/docs/docs/behaviors/reset.md +++ b/docs/docs/behaviors/reset.md @@ -17,13 +17,13 @@ to the device ### Behavior Binding -- Reference: `&reset` +- Reference: `&sys_reset` - Parameters: None Example: ``` -&reset +&sys_reset ``` ## Bootloader Reset @@ -44,7 +44,7 @@ Example: ## Split Keyboards -Both basic and bootloader reset behaviors are source-specific: This means that it affects the side of the keyboard that contains the behavior binding for split keyboards. For example if you press a key with the `&reset` binding on the left half of the keyboard, the left half will be reset. If you want to be able to reset both sides you can put the bindings on both sides of the keyboard and activate it on the side you would like to reset. +Both basic and bootloader reset behaviors are source-specific: This means that it affects the side of the keyboard that contains the behavior binding for split keyboards. For example if you press a key with the `&sys_reset` binding on the left half of the keyboard, the left half will be reset. If you want to be able to reset both sides you can put the bindings on both sides of the keyboard and activate it on the side you would like to reset. :::note Peripheral invocation The peripheral side of the keyboard has to be paired and connected to the central side in order to be able to activate these behaviors, even if it is possible to trigger the behavior using only keys on that side. This is because the key bindings are processed on the central side which would then instruct the peripheral side to reset. diff --git a/docs/src/data/keymap-upgrade.js b/docs/src/data/keymap-upgrade.js index 7936ca16..8e153828 100644 --- a/docs/src/data/keymap-upgrade.js +++ b/docs/src/data/keymap-upgrade.js @@ -81,4 +81,5 @@ export const Codes = { export const Behaviors = { cp: "kp", inc_dec_cp: "inc_dec_kp", + reset: "sys_reset", }; From 3a958c667fcbdf9940d115bbdf3f7fe61d821402 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 8 Oct 2022 00:46:08 -0400 Subject: [PATCH 171/289] refactor: Move to `zephyr/` include paths. * Zephyr moved to properly namespaced headers, so major "rip the bandaid" commit to move us to those everywhere. --- app/boards/arm/mikoto/pinmux.c | 12 +++++----- app/boards/arm/nrfmicro/pinmux.c | 12 +++++----- app/boards/arm/puchi_ble/pinmux.c | 12 +++++----- app/drivers/display/il0323.c | 14 ++++++------ app/drivers/gpio/gpio_595.c | 14 ++++++------ app/drivers/gpio/gpio_mcp23017.c | 8 +++---- app/drivers/gpio/gpio_mcp23017.h | 2 +- app/drivers/kscan/debounce.h | 2 +- app/drivers/kscan/kscan_composite.c | 4 ++-- app/drivers/kscan/kscan_gpio_demux.c | 8 +++---- app/drivers/kscan/kscan_gpio_direct.c | 14 ++++++------ app/drivers/kscan/kscan_gpio_matrix.c | 16 +++++++------- app/drivers/kscan/kscan_mock.c | 6 ++--- app/drivers/sensor/battery/battery_common.c | 2 +- app/drivers/sensor/battery/battery_common.h | 2 +- app/drivers/sensor/battery/battery_nrf_vddh.c | 10 ++++----- .../sensor/battery/battery_voltage_divider.c | 6 ++--- app/drivers/sensor/ec11/ec11.c | 14 ++++++------ app/drivers/sensor/ec11/ec11.h | 6 ++--- app/drivers/sensor/ec11/ec11_trigger.c | 12 +++++----- app/include/drivers/behavior.h | 4 ++-- app/include/drivers/ext_power.h | 2 +- app/include/linker/zmk-events.ld | 2 +- app/include/zmk/behavior_queue.h | 2 +- app/include/zmk/ble/profile.h | 2 +- .../zmk/display/widgets/battery_status.h | 2 +- .../zmk/display/widgets/layer_status.h | 2 +- .../zmk/display/widgets/output_status.h | 2 +- .../zmk/display/widgets/peripheral_status.h | 2 +- app/include/zmk/display/widgets/wpm_status.h | 2 +- app/include/zmk/event_manager.h | 2 +- .../zmk/events/activity_state_changed.h | 2 +- .../zmk/events/battery_state_changed.h | 2 +- .../zmk/events/ble_active_profile_changed.h | 4 ++-- .../zmk/events/endpoint_selection_changed.h | 2 +- .../zmk/events/keycode_state_changed.h | 2 +- app/include/zmk/events/layer_state_changed.h | 2 +- .../zmk/events/modifiers_state_changed.h | 2 +- .../zmk/events/position_state_changed.h | 2 +- app/include/zmk/events/sensor_event.h | 4 ++-- .../events/split_peripheral_status_changed.h | 2 +- .../zmk/events/usb_conn_state_changed.h | 4 ++-- app/include/zmk/events/wpm_state_changed.h | 2 +- app/include/zmk/hid.h | 4 ++-- app/include/zmk/keys.h | 2 +- app/include/zmk/matrix.h | 2 +- app/include/zmk/split/bluetooth/central.h | 2 +- app/include/zmk/split/bluetooth/uuid.h | 2 +- app/include/zmk/usb.h | 4 ++-- app/src/activity.c | 14 ++++++------ app/src/backlight.c | 14 ++++++------ app/src/battery.c | 14 ++++++------ app/src/behavior_queue.c | 4 ++-- app/src/behaviors/behavior_backlight.c | 4 ++-- app/src/behaviors/behavior_bt.c | 10 +++++---- app/src/behaviors/behavior_caps_word.c | 4 ++-- app/src/behaviors/behavior_ext_power.c | 6 ++--- app/src/behaviors/behavior_hold_tap.c | 4 ++-- app/src/behaviors/behavior_key_press.c | 4 ++-- app/src/behaviors/behavior_key_repeat.c | 4 ++-- app/src/behaviors/behavior_key_toggle.c | 4 ++-- app/src/behaviors/behavior_macro.c | 4 ++-- app/src/behaviors/behavior_mod_morph.c | 4 ++-- app/src/behaviors/behavior_momentary_layer.c | 4 ++-- app/src/behaviors/behavior_none.c | 4 ++-- app/src/behaviors/behavior_outputs.c | 6 ++--- app/src/behaviors/behavior_reset.c | 7 +++--- app/src/behaviors/behavior_rgb_underglow.c | 4 ++-- .../behavior_sensor_rotate_key_press.c | 8 +++---- app/src/behaviors/behavior_sticky_key.c | 4 ++-- app/src/behaviors/behavior_tap_dance.c | 4 ++-- app/src/behaviors/behavior_to_layer.c | 4 ++-- app/src/behaviors/behavior_toggle_layer.c | 4 ++-- app/src/behaviors/behavior_transparent.c | 4 ++-- app/src/ble.c | 22 +++++++++---------- app/src/combo.c | 9 ++++---- app/src/conditional_layer.c | 6 ++--- app/src/display/main.c | 10 ++++----- app/src/display/status_screen.c | 2 +- app/src/display/widgets/battery_status.c | 6 ++--- app/src/display/widgets/layer_status.c | 4 ++-- app/src/display/widgets/output_status.c | 5 ++--- app/src/display/widgets/peripheral_status.c | 5 ++--- app/src/display/widgets/wpm_status.c | 2 +- app/src/endpoints.c | 6 ++--- app/src/event_manager.c | 4 ++-- app/src/events/activity_state_changed.c | 2 +- app/src/events/battery_state_changed.c | 2 +- app/src/events/ble_active_profile_changed.c | 2 +- app/src/events/endpoint_selection_changed.c | 2 +- app/src/events/keycode_state_changed.c | 2 +- app/src/events/layer_state_changed.c | 2 +- app/src/events/modifiers_state_changed.c | 2 +- app/src/events/position_state_changed.c | 2 +- app/src/events/sensor_event.c | 2 +- .../events/split_peripheral_status_changed.c | 2 +- app/src/events/usb_conn_state_changed.c | 2 +- app/src/events/wpm_state_changed.c | 2 +- app/src/ext_power_generic.c | 15 +++++++------ app/src/hid.c | 2 +- app/src/hid_listener.c | 2 +- app/src/hog.c | 10 ++++----- app/src/keymap.c | 10 ++++----- app/src/kscan.c | 10 ++++----- app/src/main.c | 10 ++++----- app/src/matrix_transform.c | 4 ++-- app/src/rgb_underglow.c | 12 +++++----- app/src/sensors.c | 8 +++---- app/src/split/bluetooth/central.c | 16 +++++++------- app/src/split/bluetooth/peripheral.c | 22 +++++++++---------- app/src/split/bluetooth/service.c | 10 ++++----- app/src/split/bluetooth/split_listener.c | 4 ++-- app/src/usb.c | 8 +++---- app/src/usb_hid.c | 8 +++---- app/src/wpm.c | 8 +++---- docs/docs/development/new-behavior.md | 4 ++-- 116 files changed, 332 insertions(+), 329 deletions(-) diff --git a/app/boards/arm/mikoto/pinmux.c b/app/boards/arm/mikoto/pinmux.c index 59a38fbf..6d7f46d1 100644 --- a/app/boards/arm/mikoto/pinmux.c +++ b/app/boards/arm/mikoto/pinmux.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include static int pinmux_mikoto_init(const struct device *port) { ARG_UNUSED(port); diff --git a/app/boards/arm/nrfmicro/pinmux.c b/app/boards/arm/nrfmicro/pinmux.c index ef5b5521..129530d4 100644 --- a/app/boards/arm/nrfmicro/pinmux.c +++ b/app/boards/arm/nrfmicro/pinmux.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include static int pinmux_nrfmicro_init(const struct device *port) { ARG_UNUSED(port); diff --git a/app/boards/arm/puchi_ble/pinmux.c b/app/boards/arm/puchi_ble/pinmux.c index 78cea314..0817b6e0 100644 --- a/app/boards/arm/puchi_ble/pinmux.c +++ b/app/boards/arm/puchi_ble/pinmux.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include static int pinmux_puchi_ble_init(const struct device *port) { ARG_UNUSED(port); diff --git a/app/drivers/display/il0323.c b/app/drivers/display/il0323.c index f6c9037e..ec6da159 100644 --- a/app/drivers/display/il0323.c +++ b/app/drivers/display/il0323.c @@ -7,16 +7,16 @@ #define DT_DRV_COMPAT gooddisplay_il0323 #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include "il0323_regs.h" -#include +#include LOG_MODULE_REGISTER(il0323, CONFIG_DISPLAY_LOG_LEVEL); /** diff --git a/app/drivers/gpio/gpio_595.c b/app/drivers/gpio/gpio_595.c index 32016702..3d385844 100644 --- a/app/drivers/gpio/gpio_595.c +++ b/app/drivers/gpio/gpio_595.c @@ -12,15 +12,15 @@ #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #define LOG_LEVEL CONFIG_GPIO_LOG_LEVEL -#include +#include LOG_MODULE_REGISTER(gpio_595); /** Configuration data */ diff --git a/app/drivers/gpio/gpio_mcp23017.c b/app/drivers/gpio/gpio_mcp23017.c index 1df14e6b..feafbd0a 100644 --- a/app/drivers/gpio/gpio_mcp23017.c +++ b/app/drivers/gpio/gpio_mcp23017.c @@ -12,9 +12,9 @@ #include -#include -#include -#include +#include +#include +#include #include #include #include @@ -22,7 +22,7 @@ #include "gpio_mcp23017.h" #define LOG_LEVEL CONFIG_GPIO_LOG_LEVEL -#include +#include LOG_MODULE_REGISTER(gpio_mcp23017); /** diff --git a/app/drivers/gpio/gpio_mcp23017.h b/app/drivers/gpio/gpio_mcp23017.h index 026565cd..01908c0c 100644 --- a/app/drivers/gpio/gpio_mcp23017.h +++ b/app/drivers/gpio/gpio_mcp23017.h @@ -11,7 +11,7 @@ #ifndef ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ #define ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ -#include +#include #include #include diff --git a/app/drivers/kscan/debounce.h b/app/drivers/kscan/debounce.h index 9fa4531b..6e9faa66 100644 --- a/app/drivers/kscan/debounce.h +++ b/app/drivers/kscan/debounce.h @@ -8,7 +8,7 @@ #include #include -#include +#include #define DEBOUNCE_COUNTER_BITS 14 #define DEBOUNCE_COUNTER_MAX BIT_MASK(DEBOUNCE_COUNTER_BITS) diff --git a/app/drivers/kscan/kscan_composite.c b/app/drivers/kscan/kscan_composite.c index 35584d9c..e0cf47f9 100644 --- a/app/drivers/kscan/kscan_composite.c +++ b/app/drivers/kscan/kscan_composite.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_kscan_composite -#include +#include #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define MATRIX_NODE_ID DT_DRV_INST(0) diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/drivers/kscan/kscan_gpio_demux.c index ff2c6c69..5fdd3a7e 100644 --- a/app/drivers/kscan/kscan_gpio_demux.c +++ b/app/drivers/kscan/kscan_gpio_demux.c @@ -6,10 +6,10 @@ #define DT_DRV_COMPAT zmk_kscan_gpio_demux -#include -#include -#include -#include +#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/drivers/kscan/kscan_gpio_direct.c index 1e0576c5..18a9348d 100644 --- a/app/drivers/kscan/kscan_gpio_direct.c +++ b/app/drivers/kscan/kscan_gpio_direct.c @@ -6,13 +6,13 @@ #include "debounce.h" -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index de65fd49..70502148 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -6,14 +6,14 @@ #include "debounce.h" -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/drivers/kscan/kscan_mock.c b/app/drivers/kscan/kscan_mock.c index 4ccce69f..57862b0d 100644 --- a/app/drivers/kscan/kscan_mock.c +++ b/app/drivers/kscan/kscan_mock.c @@ -7,9 +7,9 @@ #define DT_DRV_COMPAT zmk_kscan_mock #include -#include -#include -#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/drivers/sensor/battery/battery_common.c b/app/drivers/sensor/battery/battery_common.c index 36e98aff..9afe2d5b 100644 --- a/app/drivers/sensor/battery/battery_common.c +++ b/app/drivers/sensor/battery/battery_common.c @@ -5,7 +5,7 @@ */ #include -#include +#include #include "battery_common.h" diff --git a/app/drivers/sensor/battery/battery_common.h b/app/drivers/sensor/battery/battery_common.h index d81c39e2..3e16ceed 100644 --- a/app/drivers/sensor/battery/battery_common.h +++ b/app/drivers/sensor/battery/battery_common.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include struct battery_value { diff --git a/app/drivers/sensor/battery/battery_nrf_vddh.c b/app/drivers/sensor/battery/battery_nrf_vddh.c index 60104a69..3f230812 100644 --- a/app/drivers/sensor/battery/battery_nrf_vddh.c +++ b/app/drivers/sensor/battery/battery_nrf_vddh.c @@ -9,11 +9,11 @@ #define DT_DRV_COMPAT zmk_battery_nrf_vddh -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include "battery_common.h" diff --git a/app/drivers/sensor/battery/battery_voltage_divider.c b/app/drivers/sensor/battery/battery_voltage_divider.c index 09e5525e..bc35d002 100644 --- a/app/drivers/sensor/battery/battery_voltage_divider.c +++ b/app/drivers/sensor/battery/battery_voltage_divider.c @@ -6,12 +6,12 @@ #define DT_DRV_COMPAT zmk_battery_voltage_divider -#include -#include +#include +#include #include #include #include -#include +#include #include "battery_common.h" diff --git a/app/drivers/sensor/ec11/ec11.c b/app/drivers/sensor/ec11/ec11.c index 2fe641fa..5f26ebc3 100644 --- a/app/drivers/sensor/ec11/ec11.c +++ b/app/drivers/sensor/ec11/ec11.c @@ -6,13 +6,13 @@ #define DT_DRV_COMPAT alps_ec11 -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include "ec11.h" diff --git a/app/drivers/sensor/ec11/ec11.h b/app/drivers/sensor/ec11/ec11.h index 1cb9c5f7..04750df5 100644 --- a/app/drivers/sensor/ec11/ec11.h +++ b/app/drivers/sensor/ec11/ec11.h @@ -6,9 +6,9 @@ #pragma once -#include -#include -#include +#include +#include +#include struct ec11_config { const char *a_label; diff --git a/app/drivers/sensor/ec11/ec11_trigger.c b/app/drivers/sensor/ec11/ec11_trigger.c index 555e1f4a..804a21d9 100644 --- a/app/drivers/sensor/ec11/ec11_trigger.c +++ b/app/drivers/sensor/ec11/ec11_trigger.c @@ -6,17 +6,17 @@ #define DT_DRV_COMPAT alps_ec11 -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include "ec11.h" extern struct ec11_data ec11_driver; -#include +#include LOG_MODULE_DECLARE(EC11, CONFIG_SENSOR_LOG_LEVEL); static inline void setup_int(const struct device *dev, bool enable) { diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index fcb24f6f..71df7344 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -8,9 +8,9 @@ #include #include -#include +#include #include -#include +#include #include #include diff --git a/app/include/drivers/ext_power.h b/app/include/drivers/ext_power.h index b422750c..287679e1 100644 --- a/app/include/drivers/ext_power.h +++ b/app/include/drivers/ext_power.h @@ -8,7 +8,7 @@ #include #include -#include +#include #ifdef __cplusplus extern "C" { diff --git a/app/include/linker/zmk-events.ld b/app/include/linker/zmk-events.ld index 78d00bb7..66c1264a 100644 --- a/app/include/linker/zmk-events.ld +++ b/app/include/linker/zmk-events.ld @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include __event_type_start = .; \ KEEP(*(".event_type")); \ diff --git a/app/include/zmk/behavior_queue.h b/app/include/zmk/behavior_queue.h index 8a184e4a..307482e7 100644 --- a/app/include/zmk/behavior_queue.h +++ b/app/include/zmk/behavior_queue.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/ble/profile.h b/app/include/zmk/ble/profile.h index 1df27436..0a57f16f 100644 --- a/app/include/zmk/ble/profile.h +++ b/app/include/zmk/ble/profile.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #define ZMK_BLE_PROFILE_NAME_MAX 15 diff --git a/app/include/zmk/display/widgets/battery_status.h b/app/include/zmk/display/widgets/battery_status.h index b87e87ee..ce22da4d 100644 --- a/app/include/zmk/display/widgets/battery_status.h +++ b/app/include/zmk/display/widgets/battery_status.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include struct zmk_widget_battery_status { sys_snode_t node; diff --git a/app/include/zmk/display/widgets/layer_status.h b/app/include/zmk/display/widgets/layer_status.h index 3779351a..a11c4039 100644 --- a/app/include/zmk/display/widgets/layer_status.h +++ b/app/include/zmk/display/widgets/layer_status.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include struct zmk_widget_layer_status { sys_snode_t node; diff --git a/app/include/zmk/display/widgets/output_status.h b/app/include/zmk/display/widgets/output_status.h index 66f09271..ed8ee813 100644 --- a/app/include/zmk/display/widgets/output_status.h +++ b/app/include/zmk/display/widgets/output_status.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include struct zmk_widget_output_status { sys_snode_t node; diff --git a/app/include/zmk/display/widgets/peripheral_status.h b/app/include/zmk/display/widgets/peripheral_status.h index e3b41355..07caeaa7 100644 --- a/app/include/zmk/display/widgets/peripheral_status.h +++ b/app/include/zmk/display/widgets/peripheral_status.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include struct zmk_widget_peripheral_status { sys_snode_t node; diff --git a/app/include/zmk/display/widgets/wpm_status.h b/app/include/zmk/display/widgets/wpm_status.h index 0592299e..fbe96cc2 100644 --- a/app/include/zmk/display/widgets/wpm_status.h +++ b/app/include/zmk/display/widgets/wpm_status.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include struct zmk_widget_wpm_status { sys_snode_t node; diff --git a/app/include/zmk/event_manager.h b/app/include/zmk/event_manager.h index 5acb26eb..aa9942ea 100644 --- a/app/include/zmk/event_manager.h +++ b/app/include/zmk/event_manager.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include struct zmk_event_type { diff --git a/app/include/zmk/events/activity_state_changed.h b/app/include/zmk/events/activity_state_changed.h index 998fa2d4..6a3481f3 100644 --- a/app/include/zmk/events/activity_state_changed.h +++ b/app/include/zmk/events/activity_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/events/battery_state_changed.h b/app/include/zmk/events/battery_state_changed.h index 6a003d8d..5a8c625e 100644 --- a/app/include/zmk/events/battery_state_changed.h +++ b/app/include/zmk/events/battery_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include struct zmk_battery_state_changed { diff --git a/app/include/zmk/events/ble_active_profile_changed.h b/app/include/zmk/events/ble_active_profile_changed.h index 4d3bb7ae..620e19b4 100644 --- a/app/include/zmk/events/ble_active_profile_changed.h +++ b/app/include/zmk/events/ble_active_profile_changed.h @@ -6,9 +6,9 @@ #pragma once -#include +#include #include -#include +#include #include diff --git a/app/include/zmk/events/endpoint_selection_changed.h b/app/include/zmk/events/endpoint_selection_changed.h index 38a6a8e5..198fe5a1 100644 --- a/app/include/zmk/events/endpoint_selection_changed.h +++ b/app/include/zmk/events/endpoint_selection_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/events/keycode_state_changed.h b/app/include/zmk/events/keycode_state_changed.h index 233ec62f..c3a3ed30 100644 --- a/app/include/zmk/events/keycode_state_changed.h +++ b/app/include/zmk/events/keycode_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/events/layer_state_changed.h b/app/include/zmk/events/layer_state_changed.h index 33183546..405d1365 100644 --- a/app/include/zmk/events/layer_state_changed.h +++ b/app/include/zmk/events/layer_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include struct zmk_layer_state_changed { diff --git a/app/include/zmk/events/modifiers_state_changed.h b/app/include/zmk/events/modifiers_state_changed.h index 504c2c9c..3f772cdb 100644 --- a/app/include/zmk/events/modifiers_state_changed.h +++ b/app/include/zmk/events/modifiers_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/events/position_state_changed.h b/app/include/zmk/events/position_state_changed.h index 5323e943..3e4e9238 100644 --- a/app/include/zmk/events/position_state_changed.h +++ b/app/include/zmk/events/position_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #define ZMK_POSITION_STATE_CHANGE_SOURCE_LOCAL UINT8_MAX diff --git a/app/include/zmk/events/sensor_event.h b/app/include/zmk/events/sensor_event.h index f579bc39..9398bcbb 100644 --- a/app/include/zmk/events/sensor_event.h +++ b/app/include/zmk/events/sensor_event.h @@ -6,9 +6,9 @@ #pragma once -#include +#include #include -#include +#include struct zmk_sensor_event { uint8_t sensor_number; const struct device *sensor; diff --git a/app/include/zmk/events/split_peripheral_status_changed.h b/app/include/zmk/events/split_peripheral_status_changed.h index c75a879f..6ea59f60 100644 --- a/app/include/zmk/events/split_peripheral_status_changed.h +++ b/app/include/zmk/events/split_peripheral_status_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include struct zmk_split_peripheral_status_changed { diff --git a/app/include/zmk/events/usb_conn_state_changed.h b/app/include/zmk/events/usb_conn_state_changed.h index b40158c3..5f4ac5d2 100644 --- a/app/include/zmk/events/usb_conn_state_changed.h +++ b/app/include/zmk/events/usb_conn_state_changed.h @@ -6,8 +6,8 @@ #pragma once -#include -#include +#include +#include #include #include diff --git a/app/include/zmk/events/wpm_state_changed.h b/app/include/zmk/events/wpm_state_changed.h index 3d1a3695..76253e20 100644 --- a/app/include/zmk/events/wpm_state_changed.h +++ b/app/include/zmk/events/wpm_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index 01104d1c..ab42adaa 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -6,8 +6,8 @@ #pragma once -#include -#include +#include +#include #include #include diff --git a/app/include/zmk/keys.h b/app/include/zmk/keys.h index 38777ec8..fa6e7cfe 100644 --- a/app/include/zmk/keys.h +++ b/app/include/zmk/keys.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include typedef uint32_t zmk_key_t; diff --git a/app/include/zmk/matrix.h b/app/include/zmk/matrix.h index b3e2323b..5f8cd7d7 100644 --- a/app/include/zmk/matrix.h +++ b/app/include/zmk/matrix.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #define ZMK_MATRIX_NODE_ID DT_CHOSEN(zmk_kscan) diff --git a/app/include/zmk/split/bluetooth/central.h b/app/include/zmk/split/bluetooth/central.h index 07240860..443d9b1b 100644 --- a/app/include/zmk/split/bluetooth/central.h +++ b/app/include/zmk/split/bluetooth/central.h @@ -1,7 +1,7 @@ #pragma once -#include +#include #include int zmk_split_bt_invoke_behavior(uint8_t source, struct zmk_behavior_binding *binding, diff --git a/app/include/zmk/split/bluetooth/uuid.h b/app/include/zmk/split/bluetooth/uuid.h index 735f5751..cbdb1772 100644 --- a/app/include/zmk/split/bluetooth/uuid.h +++ b/app/include/zmk/split/bluetooth/uuid.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #ifndef BT_UUID_NUM_OF_DIGITALS #define BT_UUID_NUM_OF_DIGITALS BT_UUID_DECLARE_16(0x2909) diff --git a/app/include/zmk/usb.h b/app/include/zmk/usb.h index 786d9c73..9e92a836 100644 --- a/app/include/zmk/usb.h +++ b/app/include/zmk/usb.h @@ -6,8 +6,8 @@ #pragma once -#include -#include +#include +#include #include #include diff --git a/app/src/activity.c b/app/src/activity.c index 029908c0..41fe2e15 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include +#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -74,8 +74,8 @@ void activity_work_handler(struct k_work *work) { } else #endif /* IS_ENABLED(CONFIG_ZMK_SLEEP) */ if (inactive_time > MAX_IDLE_MS) { - set_state(ZMK_ACTIVITY_IDLE); - } + set_state(ZMK_ACTIVITY_IDLE); + } } K_WORK_DEFINE(activity_work, activity_work_handler); diff --git a/app/src/backlight.c b/app/src/backlight.c index 159c6fb2..f633ddb7 100644 --- a/app/src/backlight.c +++ b/app/src/backlight.c @@ -4,14 +4,14 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include +#include +#include +#include +#include +#include -#include -#include -#include +#include +#include #include #include diff --git a/app/src/battery.c b/app/src/battery.c index 3f662241..540f7c3e 100644 --- a/app/src/battery.c +++ b/app/src/battery.c @@ -4,14 +4,14 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/behavior_queue.c b/app/src/behavior_queue.c index 617d5aad..529e5782 100644 --- a/app/src/behavior_queue.c +++ b/app/src/behavior_queue.c @@ -6,8 +6,8 @@ #include -#include -#include +#include +#include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/behaviors/behavior_backlight.c b/app/src/behaviors/behavior_backlight.c index a1eaaf86..fe2155b7 100644 --- a/app/src/behaviors/behavior_backlight.c +++ b/app/src/behaviors/behavior_backlight.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_backlight -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_bt.c b/app/src/behaviors/behavior_bt.c index 79b805b6..71cf2322 100644 --- a/app/src/behaviors/behavior_bt.c +++ b/app/src/behaviors/behavior_bt.c @@ -6,14 +6,16 @@ #define DT_DRV_COMPAT zmk_behavior_bluetooth -#include +#include +#include + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + #include #include -#include -#include #include -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 7a9612b3..8ee5bb5c 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_caps_word -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_ext_power.c b/app/src/behaviors/behavior_ext_power.c index 5db8aac2..690ac971 100644 --- a/app/src/behaviors/behavior_ext_power.c +++ b/app/src/behaviors/behavior_ext_power.c @@ -6,14 +6,14 @@ #define DT_DRV_COMPAT zmk_behavior_ext_power -#include -#include +#include +#include #include #include #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index a9e4d642..6ea2fe97 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -6,11 +6,11 @@ #define DT_DRV_COMPAT zmk_behavior_hold_tap -#include +#include #include #include #include -#include +#include #include #include #include diff --git a/app/src/behaviors/behavior_key_press.c b/app/src/behaviors/behavior_key_press.c index 215da41d..2765db9f 100644 --- a/app/src/behaviors/behavior_key_press.c +++ b/app/src/behaviors/behavior_key_press.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_key_press -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_key_repeat.c b/app/src/behaviors/behavior_key_repeat.c index ad29cb0a..033f498b 100644 --- a/app/src/behaviors/behavior_key_repeat.c +++ b/app/src/behaviors/behavior_key_repeat.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_key_repeat -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_key_toggle.c b/app/src/behaviors/behavior_key_toggle.c index cd2a5dcd..cbbdd0d9 100644 --- a/app/src/behaviors/behavior_key_toggle.c +++ b/app/src/behaviors/behavior_key_toggle.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_key_toggle -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index 5b215b93..c86d732a 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_macro -#include +#include #include -#include +#include #include #include #include diff --git a/app/src/behaviors/behavior_mod_morph.c b/app/src/behaviors/behavior_mod_morph.c index effbe4ac..e5ba346e 100644 --- a/app/src/behaviors/behavior_mod_morph.c +++ b/app/src/behaviors/behavior_mod_morph.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_mod_morph -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_momentary_layer.c b/app/src/behaviors/behavior_momentary_layer.c index 46e49fcc..c2bd0ffc 100644 --- a/app/src/behaviors/behavior_momentary_layer.c +++ b/app/src/behaviors/behavior_momentary_layer.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_momentary_layer -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_none.c b/app/src/behaviors/behavior_none.c index 1e7eb2b0..613ecbad 100644 --- a/app/src/behaviors/behavior_none.c +++ b/app/src/behaviors/behavior_none.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_none -#include +#include #include -#include +#include #include diff --git a/app/src/behaviors/behavior_outputs.c b/app/src/behaviors/behavior_outputs.c index 366abd8f..7aab8ee3 100644 --- a/app/src/behaviors/behavior_outputs.c +++ b/app/src/behaviors/behavior_outputs.c @@ -6,8 +6,8 @@ #define DT_DRV_COMPAT zmk_behavior_outputs -#include -#include +#include +#include #include #include @@ -15,7 +15,7 @@ #include #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) diff --git a/app/src/behaviors/behavior_reset.c b/app/src/behaviors/behavior_reset.c index 47b11fa4..0b983c84 100644 --- a/app/src/behaviors/behavior_reset.c +++ b/app/src/behaviors/behavior_reset.c @@ -6,10 +6,11 @@ #define DT_DRV_COMPAT zmk_behavior_reset -#include -#include +#include +#include +#include + #include -#include #include diff --git a/app/src/behaviors/behavior_rgb_underglow.c b/app/src/behaviors/behavior_rgb_underglow.c index 3459cd22..0af07f81 100644 --- a/app/src/behaviors/behavior_rgb_underglow.c +++ b/app/src/behaviors/behavior_rgb_underglow.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_rgb_underglow -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_sensor_rotate_key_press.c b/app/src/behaviors/behavior_sensor_rotate_key_press.c index c4a34a94..ed6eedae 100644 --- a/app/src/behaviors/behavior_sensor_rotate_key_press.c +++ b/app/src/behaviors/behavior_sensor_rotate_key_press.c @@ -6,11 +6,11 @@ #define DT_DRV_COMPAT zmk_behavior_sensor_rotate_key_press -#include -#include -#include +#include +#include +#include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_sticky_key.c b/app/src/behaviors/behavior_sticky_key.c index 267b81ab..22936086 100644 --- a/app/src/behaviors/behavior_sticky_key.c +++ b/app/src/behaviors/behavior_sticky_key.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_sticky_key -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_tap_dance.c b/app/src/behaviors/behavior_tap_dance.c index 6d78cb3e..ddb4aeab 100644 --- a/app/src/behaviors/behavior_tap_dance.c +++ b/app/src/behaviors/behavior_tap_dance.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_tap_dance -#include +#include #include -#include +#include #include #include #include diff --git a/app/src/behaviors/behavior_to_layer.c b/app/src/behaviors/behavior_to_layer.c index cce39d5d..c05b83ea 100644 --- a/app/src/behaviors/behavior_to_layer.c +++ b/app/src/behaviors/behavior_to_layer.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_to_layer -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_toggle_layer.c b/app/src/behaviors/behavior_toggle_layer.c index a682c6fe..73a700ed 100644 --- a/app/src/behaviors/behavior_toggle_layer.c +++ b/app/src/behaviors/behavior_toggle_layer.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_toggle_layer -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_transparent.c b/app/src/behaviors/behavior_transparent.c index 2ba05747..eeb2242d 100644 --- a/app/src/behaviors/behavior_transparent.c +++ b/app/src/behaviors/behavior_transparent.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_transparent -#include +#include #include -#include +#include #include diff --git a/app/src/ble.c b/app/src/ble.c index 4d2e4603..aee90d5d 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -4,29 +4,29 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include #include #include #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #if IS_ENABLED(CONFIG_SETTINGS) -#include +#include #endif -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/combo.c b/app/src/combo.c index e434ae17..2e237330 100644 --- a/app/src/combo.c +++ b/app/src/combo.c @@ -6,11 +6,12 @@ #define DT_DRV_COMPAT zmk_combos -#include +#include +#include +#include +#include + #include -#include -#include -#include #include #include diff --git a/app/src/conditional_layer.c b/app/src/conditional_layer.c index 572652ff..9ba02a5c 100644 --- a/app/src/conditional_layer.c +++ b/app/src/conditional_layer.c @@ -7,10 +7,10 @@ #define DT_DRV_COMPAT zmk_conditional_layers #include -#include +#include -#include -#include +#include +#include #include #include diff --git a/app/src/display/main.c b/app/src/display/main.c index 3fb4e8f6..52fa3c69 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include +#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/display/status_screen.c b/app/src/display/status_screen.c index 6b58c301..7c3870a8 100644 --- a/app/src/display/status_screen.c +++ b/app/src/display/status_screen.c @@ -11,7 +11,7 @@ #include #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if IS_ENABLED(CONFIG_ZMK_WIDGET_BATTERY_STATUS) diff --git a/app/src/display/widgets/battery_status.c b/app/src/display/widgets/battery_status.c index 3480101d..e35f890a 100644 --- a/app/src/display/widgets/battery_status.c +++ b/app/src/display/widgets/battery_status.c @@ -4,10 +4,10 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/display/widgets/layer_status.c b/app/src/display/widgets/layer_status.c index 8dc0061c..c3ddd07c 100644 --- a/app/src/display/widgets/layer_status.c +++ b/app/src/display/widgets/layer_status.c @@ -4,8 +4,8 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/display/widgets/output_status.c b/app/src/display/widgets/output_status.c index 135770a6..1c6da4b9 100644 --- a/app/src/display/widgets/output_status.c +++ b/app/src/display/widgets/output_status.c @@ -4,10 +4,9 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/display/widgets/peripheral_status.c b/app/src/display/widgets/peripheral_status.c index d0c33f20..fdfe4d9c 100644 --- a/app/src/display/widgets/peripheral_status.c +++ b/app/src/display/widgets/peripheral_status.c @@ -4,10 +4,9 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/display/widgets/wpm_status.c b/app/src/display/widgets/wpm_status.c index f3d06d65..9ae8b540 100644 --- a/app/src/display/widgets/wpm_status.c +++ b/app/src/display/widgets/wpm_status.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/endpoints.c b/app/src/endpoints.c index 33760010..9c824f44 100644 --- a/app/src/endpoints.c +++ b/app/src/endpoints.c @@ -4,8 +4,8 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include #include #include @@ -18,7 +18,7 @@ #include #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define DEFAULT_ENDPOINT \ diff --git a/app/src/event_manager.c b/app/src/event_manager.c index 471432a8..0f4a5547 100644 --- a/app/src/event_manager.c +++ b/app/src/event_manager.c @@ -4,8 +4,8 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/events/activity_state_changed.c b/app/src/events/activity_state_changed.c index 2c27ce74..95be678e 100644 --- a/app/src/events/activity_state_changed.c +++ b/app/src/events/activity_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_activity_state_changed); \ No newline at end of file diff --git a/app/src/events/battery_state_changed.c b/app/src/events/battery_state_changed.c index 435fb24d..508ee971 100644 --- a/app/src/events/battery_state_changed.c +++ b/app/src/events/battery_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_battery_state_changed); \ No newline at end of file diff --git a/app/src/events/ble_active_profile_changed.c b/app/src/events/ble_active_profile_changed.c index c4887f73..dccbc7e0 100644 --- a/app/src/events/ble_active_profile_changed.c +++ b/app/src/events/ble_active_profile_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_ble_active_profile_changed); \ No newline at end of file diff --git a/app/src/events/endpoint_selection_changed.c b/app/src/events/endpoint_selection_changed.c index 7f9014da..34bc39dd 100644 --- a/app/src/events/endpoint_selection_changed.c +++ b/app/src/events/endpoint_selection_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_endpoint_selection_changed); diff --git a/app/src/events/keycode_state_changed.c b/app/src/events/keycode_state_changed.c index c9ef6aa7..a134f341 100644 --- a/app/src/events/keycode_state_changed.c +++ b/app/src/events/keycode_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_keycode_state_changed); diff --git a/app/src/events/layer_state_changed.c b/app/src/events/layer_state_changed.c index bd6234c9..79326ccc 100644 --- a/app/src/events/layer_state_changed.c +++ b/app/src/events/layer_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_layer_state_changed); \ No newline at end of file diff --git a/app/src/events/modifiers_state_changed.c b/app/src/events/modifiers_state_changed.c index 3dfea25f..f44d90dd 100644 --- a/app/src/events/modifiers_state_changed.c +++ b/app/src/events/modifiers_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_modifiers_state_changed); \ No newline at end of file diff --git a/app/src/events/position_state_changed.c b/app/src/events/position_state_changed.c index bb40584e..7b9be89f 100644 --- a/app/src/events/position_state_changed.c +++ b/app/src/events/position_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_position_state_changed); \ No newline at end of file diff --git a/app/src/events/sensor_event.c b/app/src/events/sensor_event.c index 94ade947..bec1e6e7 100644 --- a/app/src/events/sensor_event.c +++ b/app/src/events/sensor_event.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_sensor_event); \ No newline at end of file diff --git a/app/src/events/split_peripheral_status_changed.c b/app/src/events/split_peripheral_status_changed.c index 1d70b2ff..3f4c967d 100644 --- a/app/src/events/split_peripheral_status_changed.c +++ b/app/src/events/split_peripheral_status_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_split_peripheral_status_changed); \ No newline at end of file diff --git a/app/src/events/usb_conn_state_changed.c b/app/src/events/usb_conn_state_changed.c index b3555569..ae1f0503 100644 --- a/app/src/events/usb_conn_state_changed.c +++ b/app/src/events/usb_conn_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_usb_conn_state_changed); \ No newline at end of file diff --git a/app/src/events/wpm_state_changed.c b/app/src/events/wpm_state_changed.c index 3d9830bf..f16f54d2 100644 --- a/app/src/events/wpm_state_changed.c +++ b/app/src/events/wpm_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_wpm_state_changed); \ No newline at end of file diff --git a/app/src/ext_power_generic.c b/app/src/ext_power_generic.c index aab09cec..654f683f 100644 --- a/app/src/ext_power_generic.c +++ b/app/src/ext_power_generic.c @@ -7,17 +7,18 @@ #define DT_DRV_COMPAT zmk_ext_power_generic #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include + #include #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); struct ext_power_generic_config { diff --git a/app/src/hid.c b/app/src/hid.c index b66a910d..2a6b5d39 100644 --- a/app/src/hid.c +++ b/app/src/hid.c @@ -5,7 +5,7 @@ */ #include "zmk/keys.h" -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/hid_listener.c b/app/src/hid_listener.c index e233b0b8..3a11101d 100644 --- a/app/src/hid_listener.c +++ b/app/src/hid_listener.c @@ -5,7 +5,7 @@ */ #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/hog.c b/app/src/hog.c index 3dd3e874..930714b0 100644 --- a/app/src/hog.c +++ b/app/src/hog.c @@ -4,15 +4,15 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#include -#include +#include +#include #include #include diff --git a/app/src/keymap.c b/app/src/keymap.c index b00d0fba..0f06a39a 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -4,9 +4,9 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include @@ -37,7 +37,7 @@ static uint8_t _zmk_keymap_layer_default = 0; #define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst) #define TRANSFORMED_LAYER(node) \ - {LISTIFY(DT_PROP_LEN(node, bindings), BINDING_WITH_COMMA, (,), node)}, + {LISTIFY(DT_PROP_LEN(node, bindings), BINDING_WITH_COMMA, (, ), node)}, #if ZMK_KEYMAP_HAS_SENSORS #define _TRANSFORM_SENSOR_ENTRY(idx, layer) \ @@ -52,7 +52,7 @@ static uint8_t _zmk_keymap_layer_default = 0; #define SENSOR_LAYER(node) \ COND_CODE_1( \ DT_NODE_HAS_PROP(node, sensor_bindings), \ - ({LISTIFY(DT_PROP_LEN(node, sensor_bindings), _TRANSFORM_SENSOR_ENTRY, (,), node)}), \ + ({LISTIFY(DT_PROP_LEN(node, sensor_bindings), _TRANSFORM_SENSOR_ENTRY, (, ), node)}), \ ({})), #endif /* ZMK_KEYMAP_HAS_SENSORS */ diff --git a/app/src/kscan.c b/app/src/kscan.c index c7cf2881..f9db8b1c 100644 --- a/app/src/kscan.c +++ b/app/src/kscan.c @@ -4,11 +4,11 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/main.c b/app/src/main.c index ae604a7b..8ea67057 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include +#include +#include +#include +#include -#include +#include LOG_MODULE_REGISTER(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/matrix_transform.c b/app/src/matrix_transform.c index e7c6e95f..47256608 100644 --- a/app/src/matrix_transform.c +++ b/app/src/matrix_transform.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include #include #include @@ -15,7 +15,7 @@ [(KT_ROW(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i)) * ZMK_MATRIX_COLS) + \ KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i -static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, _TRANSFORM_ENTRY, (,), 0)}; +static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, _TRANSFORM_ENTRY, (, ), 0)}; #endif diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 18614a4e..47c3658e 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -4,17 +4,17 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include +#include +#include +#include +#include #include #include -#include +#include -#include +#include #include #include diff --git a/app/src/sensors.c b/app/src/sensors.c index 184061ac..9873de4f 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -4,11 +4,11 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index e94a59ae..82cf7e01 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -5,15 +5,16 @@ */ #include +#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -24,7 +25,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include -#include static int start_scan(void); diff --git a/app/src/split/bluetooth/peripheral.c b/app/src/split/bluetooth/peripheral.c index aa690ab2..07d3ee3f 100644 --- a/app/src/split/bluetooth/peripheral.c +++ b/app/src/split/bluetooth/peripheral.c @@ -4,29 +4,29 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include #include #include #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #if IS_ENABLED(CONFIG_SETTINGS) -#include +#include #endif -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/split/bluetooth/service.c b/app/src/split/bluetooth/service.c index 5da5401d..cc20c72f 100644 --- a/app/src/split/bluetooth/service.c +++ b/app/src/split/bluetooth/service.c @@ -5,15 +5,15 @@ */ #include -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#include -#include +#include +#include #include #include diff --git a/app/src/split/bluetooth/split_listener.c b/app/src/split/bluetooth/split_listener.c index 3f3763ae..eb5398c4 100644 --- a/app/src/split/bluetooth/split_listener.c +++ b/app/src/split/bluetooth/split_listener.c @@ -4,8 +4,8 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include #include diff --git a/app/src/usb.c b/app/src/usb.c index 146e7bb7..cf04ef46 100644 --- a/app/src/usb.c +++ b/app/src/usb.c @@ -4,11 +4,11 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include -#include -#include +#include +#include #include #include diff --git a/app/src/usb_hid.c b/app/src/usb_hid.c index 4b90cf96..f46c70a0 100644 --- a/app/src/usb_hid.c +++ b/app/src/usb_hid.c @@ -4,11 +4,11 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include -#include -#include +#include +#include #include #include diff --git a/app/src/wpm.c b/app/src/wpm.c index bcabf377..00a5942e 100644 --- a/app/src/wpm.c +++ b/app/src/wpm.c @@ -4,11 +4,11 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/docs/docs/development/new-behavior.md b/docs/docs/development/new-behavior.md index af98613e..e65bb296 100644 --- a/docs/docs/development/new-behavior.md +++ b/docs/docs/development/new-behavior.md @@ -137,9 +137,9 @@ The code snippet below shows the essential components of a new driver. #define DT_DRV_COMPAT zmk_ // Dependencies -#include +#include #include -#include +#include #include From e84b4299b5ee15a922397c3485de83468b7036fd Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 8 Oct 2022 00:47:36 -0400 Subject: [PATCH 172/289] refactor: Remove deprecated Kconfig override. --- app/Kconfig | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 358d5d14..cf2cc6b3 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -429,9 +429,6 @@ config USB_CDC_ACM_RINGBUF_SIZE config LOG_BUFFER_SIZE default 8192 -config LOG_STRDUP_BUF_COUNT - default 16 - config LOG_PROCESS_THREAD_STARTUP_DELAY_MS default 1000 From 062f94d0144530fa699e5158b87293e7ebb526fc Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 17 Jan 2023 20:36:34 -0500 Subject: [PATCH 173/289] refactor: Remove v1 logging vestiges. --- app/drivers/kscan/kscan_composite.c | 4 ++-- app/drivers/kscan/kscan_gpio_demux.c | 4 ++-- app/drivers/kscan/kscan_gpio_direct.c | 2 +- app/drivers/kscan/kscan_gpio_matrix.c | 4 ++-- app/src/behavior_queue.c | 2 +- app/src/ble.c | 30 +++++++++++++-------------- app/src/endpoints.c | 2 +- app/src/keymap.c | 5 ++--- app/src/split/bluetooth/central.c | 14 ++++++------- app/src/split/bluetooth/peripheral.c | 8 +++---- app/src/split/bluetooth/service.c | 4 ++-- 11 files changed, 39 insertions(+), 40 deletions(-) diff --git a/app/drivers/kscan/kscan_composite.c b/app/drivers/kscan/kscan_composite.c index e0cf47f9..b452a9d2 100644 --- a/app/drivers/kscan/kscan_composite.c +++ b/app/drivers/kscan/kscan_composite.c @@ -43,7 +43,7 @@ static int kscan_composite_enable_callback(const struct device *dev) { const struct device *dev = device_get_binding(cfg->label); if (!dev) { - LOG_WRN("Failed to load child kscan device %s", log_strdup(cfg->label)); + LOG_WRN("Failed to load child kscan device %s", cfg->label); continue; } kscan_enable_callback(dev); @@ -57,7 +57,7 @@ static int kscan_composite_disable_callback(const struct device *dev) { const struct device *dev = device_get_binding(cfg->label); if (!dev) { - LOG_WRN("Failed to load child kscan device %s", log_strdup(cfg->label)); + LOG_WRN("Failed to load child kscan device %s", cfg->label); continue; } kscan_disable_callback(dev); diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/drivers/kscan/kscan_gpio_demux.c index 5fdd3a7e..3ca300a3 100644 --- a/app/drivers/kscan/kscan_gpio_demux.c +++ b/app/drivers/kscan/kscan_gpio_demux.c @@ -240,8 +240,8 @@ struct kscan_gpio_item_config { }; \ \ static const struct kscan_gpio_config_##n kscan_gpio_config_##n = { \ - .rows = {LISTIFY(INST_MATRIX_INPUTS(n), _KSCAN_GPIO_INPUT_CFG_INIT, (,), n)}, \ - .cols = {LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, (,), n)}, \ + .rows = {LISTIFY(INST_MATRIX_INPUTS(n), _KSCAN_GPIO_INPUT_CFG_INIT, (, ), n)}, \ + .cols = {LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, (, ), n)}, \ }; \ \ DEVICE_DT_INST_DEFINE(n, kscan_gpio_init_##n, NULL, &kscan_gpio_data_##n, \ diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/drivers/kscan/kscan_gpio_direct.c index 18a9348d..586e0d95 100644 --- a/app/drivers/kscan/kscan_gpio_direct.c +++ b/app/drivers/kscan/kscan_gpio_direct.c @@ -327,7 +327,7 @@ static const struct kscan_driver_api kscan_direct_api = { "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ static const struct gpio_dt_spec kscan_direct_inputs_##n[] = { \ - LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, (,), n)}; \ + LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, (, ), n)}; \ \ static struct debounce_state kscan_direct_state_##n[INST_INPUTS_LEN(n)]; \ \ diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index 70502148..d2121273 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -433,10 +433,10 @@ static const struct kscan_driver_api kscan_matrix_api = { "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ static const struct gpio_dt_spec kscan_matrix_rows_##n[] = { \ - LISTIFY(INST_ROWS_LEN(n), KSCAN_GPIO_ROW_CFG_INIT, (,), n)}; \ + LISTIFY(INST_ROWS_LEN(n), KSCAN_GPIO_ROW_CFG_INIT, (, ), n)}; \ \ static const struct gpio_dt_spec kscan_matrix_cols_##n[] = { \ - LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, (,), n)}; \ + LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, (, ), n)}; \ \ static struct debounce_state kscan_matrix_state_##n[INST_MATRIX_LEN(n)]; \ \ diff --git a/app/src/behavior_queue.c b/app/src/behavior_queue.c index 529e5782..971816f2 100644 --- a/app/src/behavior_queue.c +++ b/app/src/behavior_queue.c @@ -28,7 +28,7 @@ static void behavior_queue_process_next(struct k_work *work) { struct q_item item = {.wait = 0}; while (k_msgq_get(&zmk_behavior_queue_msgq, &item, K_NO_WAIT) == 0) { - LOG_DBG("Invoking %s: 0x%02x 0x%02x", log_strdup(item.binding.behavior_dev), + LOG_DBG("Invoking %s: 0x%02x 0x%02x", item.binding.behavior_dev, item.binding.param1, item.binding.param2); struct zmk_behavior_binding_event event = {.position = item.position, diff --git a/app/src/ble.c b/app/src/ble.c index aee90d5d..a7037d0c 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -111,7 +111,7 @@ void set_profile_address(uint8_t index, const bt_addr_le_t *addr) { memcpy(&profiles[index].peer, addr, sizeof(bt_addr_le_t)); sprintf(setting_name, "ble/profiles/%d", index); - LOG_DBG("Setting profile addr for %s to %s", log_strdup(setting_name), log_strdup(addr_str)); + LOG_DBG("Setting profile addr for %s to %s", setting_name, addr_str); settings_save_one(setting_name, &profiles[index], sizeof(struct zmk_ble_profile)); k_work_submit(&raise_profile_changed_event_work); } @@ -177,7 +177,7 @@ int update_advertising() { // addr_str[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(zmk_ble_active_profile_addr(), addr_str, // sizeof(addr_str)); - // LOG_DBG("Directed advertising to %s", log_strdup(addr_str)); + // LOG_DBG("Directed advertising to %s", addr_str); // desired_adv = ZMK_ADV_DIR; } LOG_DBG("advertising from %d to %d", advertising_status, desired_adv); @@ -293,13 +293,13 @@ static int ble_profiles_handle_set(const char *name, size_t len, settings_read_c void *cb_arg) { const char *next; - LOG_DBG("Setting BLE value %s", log_strdup(name)); + LOG_DBG("Setting BLE value %s", name); if (settings_name_steq(name, "profiles", &next) && next) { char *endptr; uint8_t idx = strtoul(next, &endptr, 10); if (*endptr != '\0') { - LOG_WRN("Invalid profile index: %s", log_strdup(next)); + LOG_WRN("Invalid profile index: %s", next); return -EINVAL; } @@ -324,7 +324,7 @@ static int ble_profiles_handle_set(const char *name, size_t len, settings_read_c char addr_str[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(&profiles[idx].peer, addr_str, sizeof(addr_str)); - LOG_DBG("Loaded %s address for profile %d", log_strdup(addr_str), idx); + LOG_DBG("Loaded %s address for profile %d", addr_str, idx); } else if (settings_name_steq(name, "active_profile", &next) && !next) { if (len != sizeof(active_profile)) { return -EINVAL; @@ -376,12 +376,12 @@ static void connected(struct bt_conn *conn, uint8_t err) { advertising_status = ZMK_ADV_NONE; if (err) { - LOG_WRN("Failed to connect to %s (%u)", log_strdup(addr), err); + LOG_WRN("Failed to connect to %s (%u)", addr, err); update_advertising(); return; } - LOG_DBG("Connected %s", log_strdup(addr)); + LOG_DBG("Connected %s", addr); if (bt_conn_set_security(conn, BT_SECURITY_L2)) { LOG_ERR("Failed to set security"); @@ -401,7 +401,7 @@ static void disconnected(struct bt_conn *conn, uint8_t reason) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("Disconnected from %s (reason 0x%02x)", log_strdup(addr), reason); + LOG_DBG("Disconnected from %s (reason 0x%02x)", addr, reason); bt_conn_get_info(conn, &info); @@ -426,9 +426,9 @@ static void security_changed(struct bt_conn *conn, bt_security_t level, enum bt_ bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); if (!err) { - LOG_DBG("Security changed: %s level %u", log_strdup(addr), level); + LOG_DBG("Security changed: %s level %u", addr, level); } else { - LOG_ERR("Security failed: %s level %u err %d", log_strdup(addr), level, err); + LOG_ERR("Security failed: %s level %u err %d", addr, level, err); } } @@ -438,7 +438,7 @@ static void le_param_updated(struct bt_conn *conn, uint16_t interval, uint16_t l bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("%s: interval %d latency %d timeout %d", log_strdup(addr), interval, latency, timeout); + LOG_DBG("%s: interval %d latency %d timeout %d", addr, interval, latency, timeout); } static struct bt_conn_cb conn_callbacks = { @@ -454,7 +454,7 @@ static void auth_passkey_display(struct bt_conn *conn, unsigned int passkey) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("Passkey for %s: %06u", log_strdup(addr), passkey); + LOG_DBG("Passkey for %s: %06u", addr, passkey); } */ @@ -465,7 +465,7 @@ static void auth_passkey_entry(struct bt_conn *conn) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("Passkey entry requested for %s", log_strdup(addr)); + LOG_DBG("Passkey entry requested for %s", addr); passkey_digit = 0; auth_passkey_entry_conn = bt_conn_ref(conn); } @@ -486,7 +486,7 @@ static void auth_cancel(struct bt_conn *conn) { passkey_digit = 0; #endif - LOG_DBG("Pairing cancelled: %s", log_strdup(addr)); + LOG_DBG("Pairing cancelled: %s", addr); } static enum bt_security_err auth_pairing_accept(struct bt_conn *conn, @@ -517,7 +517,7 @@ static void auth_pairing_complete(struct bt_conn *conn, bool bonded) { } if (!zmk_ble_active_profile_is_open()) { - LOG_ERR("Pairing completed but current profile is not open: %s", log_strdup(addr)); + LOG_ERR("Pairing completed but current profile is not open: %s", addr); bt_unpair(BT_ID_DEFAULT, dst); return; } diff --git a/app/src/endpoints.c b/app/src/endpoints.c index 9c824f44..dbd1a3e6 100644 --- a/app/src/endpoints.c +++ b/app/src/endpoints.c @@ -148,7 +148,7 @@ int zmk_endpoints_send_report(uint16_t usage_page) { static int endpoints_handle_set(const char *name, size_t len, settings_read_cb read_cb, void *cb_arg) { - LOG_DBG("Setting endpoint value %s", log_strdup(name)); + LOG_DBG("Setting endpoint value %s", name); if (settings_name_steq(name, "preferred", NULL)) { if (len != sizeof(enum zmk_endpoint)) { diff --git a/app/src/keymap.c b/app/src/keymap.c index 0f06a39a..99483592 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -179,8 +179,7 @@ int zmk_keymap_apply_position_state(uint8_t source, int layer, uint32_t position .timestamp = timestamp, }; - LOG_DBG("layer: %d position: %d, binding name: %s", layer, position, - log_strdup(binding.behavior_dev)); + LOG_DBG("layer: %d position: %d, binding name: %s", layer, position, binding.behavior_dev); behavior = device_get_binding(binding.behavior_dev); @@ -260,7 +259,7 @@ int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sens int ret; LOG_DBG("layer: %d sensor_number: %d, binding name: %s", layer, sensor_number, - log_strdup(binding->behavior_dev)); + binding->behavior_dev); behavior = device_get_binding(binding->behavior_dev); diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 82cf7e01..5b952dfc 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -377,8 +377,8 @@ static bool split_central_eir_found(struct bt_data *data, void *user_data) { bt_uuid_to_str(&uuid.uuid, uuid_str, sizeof(uuid_str)); bt_uuid_to_str(BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SERVICE_UUID), service_uuid_str, sizeof(service_uuid_str)); - LOG_DBG("UUID %s does not match split UUID: %s", log_strdup(uuid_str), - log_strdup(service_uuid_str)); + LOG_DBG("UUID %s does not match split UUID: %s", uuid_str, + service_uuid_str); continue; } @@ -433,7 +433,7 @@ static void split_central_device_found(const bt_addr_le_t *addr, int8_t rssi, ui char dev[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(addr, dev, sizeof(dev)); - LOG_DBG("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i", log_strdup(dev), type, ad->len, + LOG_DBG("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i", dev, type, ad->len, rssi); /* We're only interested in connectable events */ @@ -469,7 +469,7 @@ static void split_central_connected(struct bt_conn *conn, uint8_t conn_err) { } if (conn_err) { - LOG_ERR("Failed to connect to %s (%u)", log_strdup(addr), conn_err); + LOG_ERR("Failed to connect to %s (%u)", addr, conn_err); release_peripheral_slot_for_conn(conn); @@ -477,7 +477,7 @@ static void split_central_connected(struct bt_conn *conn, uint8_t conn_err) { return; } - LOG_DBG("Connected: %s", log_strdup(addr)); + LOG_DBG("Connected: %s", addr); confirm_peripheral_slot_conn(conn); split_central_process_connection(conn); @@ -489,7 +489,7 @@ static void split_central_disconnected(struct bt_conn *conn, uint8_t reason) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("Disconnected: %s (reason %d)", log_strdup(addr), reason); + LOG_DBG("Disconnected: %s (reason %d)", addr, reason); err = release_peripheral_slot_for_conn(conn); @@ -579,7 +579,7 @@ int zmk_split_bt_invoke_behavior(uint8_t source, struct zmk_behavior_binding *bi if (strlcpy(payload.behavior_dev, binding->behavior_dev, payload_dev_size) >= payload_dev_size) { LOG_ERR("Truncated behavior label %s to %s before invoking peripheral behavior", - log_strdup(binding->behavior_dev), log_strdup(payload.behavior_dev)); + binding->behavior_dev, payload.behavior_dev); } struct zmk_split_run_behavior_payload_wrapper wrapper = {.source = source, .payload = payload}; diff --git a/app/src/split/bluetooth/peripheral.c b/app/src/split/bluetooth/peripheral.c index 07d3ee3f..6b767baa 100644 --- a/app/src/split/bluetooth/peripheral.c +++ b/app/src/split/bluetooth/peripheral.c @@ -59,7 +59,7 @@ static void disconnected(struct bt_conn *conn, uint8_t reason) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("Disconnected from %s (reason 0x%02x)", log_strdup(addr), reason); + LOG_DBG("Disconnected from %s (reason 0x%02x)", addr, reason); is_connected = false; @@ -73,9 +73,9 @@ static void security_changed(struct bt_conn *conn, bt_security_t level, enum bt_ bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); if (!err) { - LOG_DBG("Security changed: %s level %u", log_strdup(addr), level); + LOG_DBG("Security changed: %s level %u", addr, level); } else { - LOG_ERR("Security failed: %s level %u err %d", log_strdup(addr), level, err); + LOG_ERR("Security failed: %s level %u err %d", addr, level, err); } } @@ -85,7 +85,7 @@ static void le_param_updated(struct bt_conn *conn, uint16_t interval, uint16_t l bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("%s: interval %d latency %d timeout %d", log_strdup(addr), interval, latency, timeout); + LOG_DBG("%s: interval %d latency %d timeout %d", addr, interval, latency, timeout); } static struct bt_conn_cb conn_callbacks = { diff --git a/app/src/split/bluetooth/service.c b/app/src/split/bluetooth/service.c index cc20c72f..fa4b7718 100644 --- a/app/src/split/bluetooth/service.c +++ b/app/src/split/bluetooth/service.c @@ -60,7 +60,7 @@ static ssize_t split_svc_run_behavior(struct bt_conn *conn, const struct bt_gatt .param2 = payload->data.param2, .behavior_dev = payload->behavior_dev, }; - LOG_DBG("%s with params %d %d: pressed? %d", log_strdup(binding.behavior_dev), + LOG_DBG("%s with params %d %d: pressed? %d", binding.behavior_dev, binding.param1, binding.param2, payload->data.state); struct zmk_behavior_binding_event event = {.position = payload->data.position, .timestamp = k_uptime_get()}; @@ -72,7 +72,7 @@ static ssize_t split_svc_run_behavior(struct bt_conn *conn, const struct bt_gatt } if (err) { - LOG_ERR("Failed to invoke behavior %s: %d", log_strdup(binding.behavior_dev), err); + LOG_ERR("Failed to invoke behavior %s: %d", binding.behavior_dev, err); } } From 09ed79a867b9d360270d505ff361a65ed66735e3 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 17 Jan 2023 20:40:44 -0500 Subject: [PATCH 174/289] refactor: Move away from deprecated label usages. * Move away from DT_LABEL. * Move to DEVICE_DT_GET for non-behavior device access. * Move various drivers to `gpio_spec_dt` and `DT` related macros. * Remove mcp23017 while at it, since better upstream driver is available. --- app/boards/arm/ferris/ferris_rev02.dts | 3 +- app/boards/arm/ferris/ferris_rev02_defconfig | 3 - app/boards/arm/mikoto/pinmux.c | 4 +- app/boards/arm/nrfmicro/pinmux.c | 2 +- app/boards/arm/puchi_ble/pinmux.c | 2 +- app/drivers/display/il0323.c | 146 +++----- app/drivers/gpio/CMakeLists.txt | 1 - app/drivers/gpio/Kconfig | 1 - app/drivers/gpio/Kconfig.mcp23017 | 22 -- app/drivers/gpio/gpio_mcp23017.c | 332 ------------------ app/drivers/gpio/gpio_mcp23017.h | 86 ----- app/drivers/kscan/kscan_composite.c | 26 +- app/drivers/kscan/kscan_gpio_demux.c | 90 ++--- .../sensor/battery/battery_voltage_divider.c | 77 ++-- app/drivers/sensor/ec11/ec11.c | 30 +- app/drivers/sensor/ec11/ec11.h | 11 +- app/drivers/sensor/ec11/ec11_trigger.c | 15 +- .../dts/bindings/gpio/microchip,mcp23017.yaml | 29 -- .../dts/bindings/gpio/zmk,gpio-595.yaml | 3 - .../bindings/sensor/zmk,battery-nrf-vddh.yaml | 5 - .../sensor/zmk,battery-voltage-divider.yaml | 5 - app/include/zmk/keymap.h | 2 +- app/include/zmk/kscan.h | 4 +- app/src/activity.c | 4 +- app/src/behavior_queue.c | 4 +- app/src/behaviors/behavior_bt.c | 1 - app/src/behaviors/behavior_caps_word.c | 9 +- app/src/behaviors/behavior_hold_tap.c | 4 +- app/src/behaviors/behavior_macro.c | 14 +- app/src/behaviors/behavior_mod_morph.c | 2 +- app/src/behaviors/behavior_tap_dance.c | 2 +- app/src/display/main.c | 11 +- app/src/ext_power_generic.c | 30 +- app/src/keymap.c | 5 +- app/src/kscan.c | 3 +- app/src/main.c | 4 +- app/src/rgb_underglow.c | 18 +- app/src/sensors.c | 3 +- app/src/split/bluetooth/central.c | 6 +- app/src/split/bluetooth/service.c | 4 +- docs/docs/development/new-behavior.md | 4 +- 41 files changed, 199 insertions(+), 828 deletions(-) delete mode 100644 app/drivers/gpio/Kconfig.mcp23017 delete mode 100644 app/drivers/gpio/gpio_mcp23017.c delete mode 100644 app/drivers/gpio/gpio_mcp23017.h delete mode 100644 app/drivers/zephyr/dts/bindings/gpio/microchip,mcp23017.yaml diff --git a/app/boards/arm/ferris/ferris_rev02.dts b/app/boards/arm/ferris/ferris_rev02.dts index 50de9526..55055e9a 100644 --- a/app/boards/arm/ferris/ferris_rev02.dts +++ b/app/boards/arm/ferris/ferris_rev02.dts @@ -104,11 +104,10 @@ clock-frequency = ; right_io: mcp23017@20 { - compatible = "microchip,mcp23017"; + compatible = "microchip,mcp230xx"; status = "okay"; gpio-controller; reg = <0x20>; - label = "RIGHT_IO"; #gpio-cells = <2>; ngpios = <16>; }; diff --git a/app/boards/arm/ferris/ferris_rev02_defconfig b/app/boards/arm/ferris/ferris_rev02_defconfig index 934dc4a0..267035c9 100644 --- a/app/boards/arm/ferris/ferris_rev02_defconfig +++ b/app/boards/arm/ferris/ferris_rev02_defconfig @@ -20,9 +20,6 @@ CONFIG_ZMK_USB=y CONFIG_ZMK_KSCAN_MATRIX_POLLING=y CONFIG_USB_SELF_POWERED=n -# Enable IO multiplexer -CONFIG_GPIO_MCP23017=y - # Needed to reduce this to size that will fit on F072 CONFIG_HEAP_MEM_POOL_SIZE=1024 diff --git a/app/boards/arm/mikoto/pinmux.c b/app/boards/arm/mikoto/pinmux.c index 6d7f46d1..524aa17e 100644 --- a/app/boards/arm/mikoto/pinmux.c +++ b/app/boards/arm/mikoto/pinmux.c @@ -15,8 +15,8 @@ static int pinmux_mikoto_init(const struct device *port) { ARG_UNUSED(port); #if CONFIG_BOARD_MIKOTO_520 - const struct device *p0 = device_get_binding("GPIO_0"); - const struct device *p1 = device_get_binding("GPIO_1"); + const struct device *p0 = DEVICE_DT_GET(DT_NODELABEL(gpio0)); + const struct device *p1 = DEVICE_DT_GET(DT_NODELABEL(gpio1)); #if CONFIG_BOARD_MIKOTO_CHARGER_CURRENT_40MA gpio_pin_configure(p0, 26, GPIO_INPUT | GPIO_PULL_DOWN); gpio_pin_configure(p1, 15, GPIO_INPUT); diff --git a/app/boards/arm/nrfmicro/pinmux.c b/app/boards/arm/nrfmicro/pinmux.c index 129530d4..6362b392 100644 --- a/app/boards/arm/nrfmicro/pinmux.c +++ b/app/boards/arm/nrfmicro/pinmux.c @@ -15,7 +15,7 @@ static int pinmux_nrfmicro_init(const struct device *port) { ARG_UNUSED(port); #if (CONFIG_BOARD_NRFMICRO_13 || CONFIG_BOARD_NRFMICRO_13_52833) - const struct device *p0 = device_get_binding("GPIO_0"); + const struct device *p0 = DEVICE_DT_GET(DT_NODELABEL(gpio0)); #if CONFIG_BOARD_NRFMICRO_CHARGER gpio_pin_configure(p0, 5, GPIO_OUTPUT); gpio_pin_set(p0, 5, 0); diff --git a/app/boards/arm/puchi_ble/pinmux.c b/app/boards/arm/puchi_ble/pinmux.c index 0817b6e0..28178274 100644 --- a/app/boards/arm/puchi_ble/pinmux.c +++ b/app/boards/arm/puchi_ble/pinmux.c @@ -15,7 +15,7 @@ static int pinmux_puchi_ble_init(const struct device *port) { ARG_UNUSED(port); #if CONFIG_BOARD_PUCHI_BLE_v1 - const struct device *p0 = device_get_binding("GPIO_0"); + const struct device *p0 = DEVICE_DT_GET(DT_NODELABEL(gpio0)); #if CONFIG_BOARD_PUCHI_BLE_CHARGER gpio_pin_configure(p0, 5, GPIO_OUTPUT); gpio_pin_set(p0, 5, 0); diff --git a/app/drivers/display/il0323.c b/app/drivers/display/il0323.c index ec6da159..94e38481 100644 --- a/app/drivers/display/il0323.c +++ b/app/drivers/display/il0323.c @@ -24,23 +24,6 @@ LOG_MODULE_REGISTER(il0323, CONFIG_DISPLAY_LOG_LEVEL); * */ -#define IL0323_SPI_FREQ DT_INST_PROP(0, spi_max_frequency) -#define IL0323_BUS_NAME DT_INST_BUS_LABEL(0) -#define IL0323_DC_PIN DT_INST_GPIO_PIN(0, dc_gpios) -#define IL0323_DC_FLAGS DT_INST_GPIO_FLAGS(0, dc_gpios) -#define IL0323_DC_CNTRL DT_INST_GPIO_LABEL(0, dc_gpios) -#define IL0323_CS_PIN DT_INST_SPI_DEV_CS_GPIOS_PIN(0) -#define IL0323_CS_FLAGS DT_INST_SPI_DEV_CS_GPIOS_FLAGS(0) -#if DT_INST_SPI_DEV_HAS_CS_GPIOS(0) -#define IL0323_CS_CNTRL DT_INST_SPI_DEV_CS_GPIOS_LABEL(0) -#endif -#define IL0323_BUSY_PIN DT_INST_GPIO_PIN(0, busy_gpios) -#define IL0323_BUSY_CNTRL DT_INST_GPIO_LABEL(0, busy_gpios) -#define IL0323_BUSY_FLAGS DT_INST_GPIO_FLAGS(0, busy_gpios) -#define IL0323_RESET_PIN DT_INST_GPIO_PIN(0, reset_gpios) -#define IL0323_RESET_CNTRL DT_INST_GPIO_LABEL(0, reset_gpios) -#define IL0323_RESET_FLAGS DT_INST_GPIO_FLAGS(0, reset_gpios) - #define EPD_PANEL_WIDTH DT_INST_PROP(0, width) #define EPD_PANEL_HEIGHT DT_INST_PROP(0, height) #define IL0323_PIXELS_PER_BYTE 8U @@ -53,15 +36,11 @@ LOG_MODULE_REGISTER(il0323, CONFIG_DISPLAY_LOG_LEVEL); #define IL0323_PANEL_LAST_PAGE (IL0323_NUMOF_PAGES - 1) #define IL0323_BUFFER_SIZE 1280 -struct il0323_data { - const struct device *reset; - const struct device *dc; - const struct device *busy; - const struct device *spi_dev; - struct spi_config spi_config; -#if defined(IL0323_CS_CNTRL) - struct spi_cs_control cs_ctrl; -#endif +struct il0323_cfg { + struct gpio_dt_spec reset; + struct gpio_dt_spec dc; + struct gpio_dt_spec busy; + struct spi_dt_spec spi; }; static uint8_t il0323_pwr[] = DT_INST_PROP(0, pwr); @@ -69,21 +48,21 @@ static uint8_t il0323_pwr[] = DT_INST_PROP(0, pwr); static uint8_t last_buffer[IL0323_BUFFER_SIZE]; static bool blanking_on = true; -static inline int il0323_write_cmd(struct il0323_data *driver, uint8_t cmd, uint8_t *data, +static inline int il0323_write_cmd(const struct il0323_cfg *cfg, uint8_t cmd, uint8_t *data, size_t len) { struct spi_buf buf = {.buf = &cmd, .len = sizeof(cmd)}; struct spi_buf_set buf_set = {.buffers = &buf, .count = 1}; - gpio_pin_set(driver->dc, IL0323_DC_PIN, 1); - if (spi_write(driver->spi_dev, &driver->spi_config, &buf_set)) { + gpio_pin_set_dt(&cfg->dc, 1); + if (spi_write_dt(&cfg->spi, &buf_set)) { return -EIO; } if (data != NULL) { buf.buf = data; buf.len = len; - gpio_pin_set(driver->dc, IL0323_DC_PIN, 0); - if (spi_write(driver->spi_dev, &driver->spi_config, &buf_set)) { + gpio_pin_set_dt(&cfg->dc, 0); + if (spi_write_dt(&cfg->spi, &buf_set)) { return -EIO; } } @@ -91,22 +70,22 @@ static inline int il0323_write_cmd(struct il0323_data *driver, uint8_t cmd, uint return 0; } -static inline void il0323_busy_wait(struct il0323_data *driver) { - int pin = gpio_pin_get(driver->busy, IL0323_BUSY_PIN); +static inline void il0323_busy_wait(const struct il0323_cfg *cfg) { + int pin = gpio_pin_get_dt(&cfg->busy); while (pin > 0) { __ASSERT(pin >= 0, "Failed to get pin level"); // LOG_DBG("wait %u", pin); k_msleep(IL0323_BUSY_DELAY); - pin = gpio_pin_get(driver->busy, IL0323_BUSY_PIN); + pin = gpio_pin_get_dt(&cfg->busy); } } static int il0323_update_display(const struct device *dev) { - struct il0323_data *driver = dev->data; + const struct il0323_cfg *cfg = dev->config; LOG_DBG("Trigger update sequence"); - if (il0323_write_cmd(driver, IL0323_CMD_DRF, NULL, 0)) { + if (il0323_write_cmd(cfg, IL0323_CMD_DRF, NULL, 0)) { return -EIO; } @@ -117,7 +96,7 @@ static int il0323_update_display(const struct device *dev) { static int il0323_write(const struct device *dev, const uint16_t x, const uint16_t y, const struct display_buffer_descriptor *desc, const void *buf) { - struct il0323_data *driver = dev->data; + const struct il0323_cfg *cfg = dev->config; uint16_t x_end_idx = x + desc->width - 1; uint16_t y_end_idx = y + desc->height - 1; uint8_t ptl[IL0323_PTL_REG_LENGTH] = {0}; @@ -147,20 +126,20 @@ static int il0323_write(const struct device *dev, const uint16_t x, const uint16 ptl[sizeof(ptl) - 1] = IL0323_PTL_PT_SCAN; LOG_HEXDUMP_DBG(ptl, sizeof(ptl), "ptl"); - il0323_busy_wait(driver); - if (il0323_write_cmd(driver, IL0323_CMD_PIN, NULL, 0)) { + il0323_busy_wait(cfg); + if (il0323_write_cmd(cfg, IL0323_CMD_PIN, NULL, 0)) { return -EIO; } - if (il0323_write_cmd(driver, IL0323_CMD_PTL, ptl, sizeof(ptl))) { + if (il0323_write_cmd(cfg, IL0323_CMD_PTL, ptl, sizeof(ptl))) { return -EIO; } - if (il0323_write_cmd(driver, IL0323_CMD_DTM1, last_buffer, IL0323_BUFFER_SIZE)) { + if (il0323_write_cmd(cfg, IL0323_CMD_DTM1, last_buffer, IL0323_BUFFER_SIZE)) { return -EIO; } - if (il0323_write_cmd(driver, IL0323_CMD_DTM2, (uint8_t *)buf, buf_len)) { + if (il0323_write_cmd(cfg, IL0323_CMD_DTM2, (uint8_t *)buf, buf_len)) { return -EIO; } @@ -173,7 +152,7 @@ static int il0323_write(const struct device *dev, const uint16_t x, const uint16 } } - if (il0323_write_cmd(driver, IL0323_CMD_POUT, NULL, 0)) { + if (il0323_write_cmd(cfg, IL0323_CMD_POUT, NULL, 0)) { return -EIO; } @@ -217,11 +196,11 @@ static int il0323_clear_and_write_buffer(const struct device *dev, uint8_t patte } static int il0323_blanking_off(const struct device *dev) { - struct il0323_data *driver = dev->data; + const struct il0323_cfg *cfg = dev->config; if (blanking_on) { - /* Update EPD pannel in normal mode */ - il0323_busy_wait(driver); + /* Update EPD panel in normal mode */ + il0323_busy_wait(cfg); if (il0323_clear_and_write_buffer(dev, 0xff, true)) { return -EIO; } @@ -278,30 +257,30 @@ static int il0323_set_pixel_format(const struct device *dev, const enum display_ } static int il0323_controller_init(const struct device *dev) { - struct il0323_data *driver = dev->data; + const struct il0323_cfg *cfg = dev->config; uint8_t tmp[IL0323_TRES_REG_LENGTH]; LOG_DBG(""); - gpio_pin_set(driver->reset, IL0323_RESET_PIN, 1); + gpio_pin_set_dt(&cfg->reset, 1); k_msleep(IL0323_RESET_DELAY); - gpio_pin_set(driver->reset, IL0323_RESET_PIN, 0); + gpio_pin_set_dt(&cfg->reset, 0); k_msleep(IL0323_RESET_DELAY); - il0323_busy_wait(driver); + il0323_busy_wait(cfg); LOG_DBG("Initialize IL0323 controller"); - if (il0323_write_cmd(driver, IL0323_CMD_PWR, il0323_pwr, sizeof(il0323_pwr))) { + if (il0323_write_cmd(cfg, IL0323_CMD_PWR, il0323_pwr, sizeof(il0323_pwr))) { return -EIO; } /* Turn on: booster, controller, regulators, and sensor. */ - if (il0323_write_cmd(driver, IL0323_CMD_PON, NULL, 0)) { + if (il0323_write_cmd(cfg, IL0323_CMD_PON, NULL, 0)) { return -EIO; } k_msleep(IL0323_PON_DELAY); - il0323_busy_wait(driver); + il0323_busy_wait(cfg); /* Pannel settings, KW mode */ tmp[0] = IL0323_PSR_UD | IL0323_PSR_SHL | IL0323_PSR_SHD | IL0323_PSR_RST; @@ -321,7 +300,7 @@ static int il0323_controller_init(const struct device *dev) { #endif /* panel width */ LOG_HEXDUMP_DBG(tmp, 1, "PSR"); - if (il0323_write_cmd(driver, IL0323_CMD_PSR, tmp, 1)) { + if (il0323_write_cmd(cfg, IL0323_CMD_PSR, tmp, 1)) { return -EIO; } @@ -329,24 +308,24 @@ static int il0323_controller_init(const struct device *dev) { tmp[IL0323_TRES_HRES_IDX] = EPD_PANEL_WIDTH; tmp[IL0323_TRES_VRES_IDX] = EPD_PANEL_HEIGHT; LOG_HEXDUMP_DBG(tmp, IL0323_TRES_REG_LENGTH, "TRES"); - if (il0323_write_cmd(driver, IL0323_CMD_TRES, tmp, IL0323_TRES_REG_LENGTH)) { + if (il0323_write_cmd(cfg, IL0323_CMD_TRES, tmp, IL0323_TRES_REG_LENGTH)) { return -EIO; } tmp[IL0323_CDI_CDI_IDX] = DT_INST_PROP(0, cdi); LOG_HEXDUMP_DBG(tmp, IL0323_CDI_REG_LENGTH, "CDI"); - if (il0323_write_cmd(driver, IL0323_CMD_CDI, tmp, IL0323_CDI_REG_LENGTH)) { + if (il0323_write_cmd(cfg, IL0323_CMD_CDI, tmp, IL0323_CDI_REG_LENGTH)) { return -EIO; } tmp[0] = DT_INST_PROP(0, tcon); - if (il0323_write_cmd(driver, IL0323_CMD_TCON, tmp, 1)) { + if (il0323_write_cmd(cfg, IL0323_CMD_TCON, tmp, 1)) { return -EIO; } /* Enable Auto Sequence */ tmp[0] = IL0323_AUTO_PON_DRF_POF; - if (il0323_write_cmd(driver, IL0323_CMD_AUTO, tmp, 1)) { + if (il0323_write_cmd(cfg, IL0323_CMD_AUTO, tmp, 1)) { return -EIO; } @@ -354,62 +333,43 @@ static int il0323_controller_init(const struct device *dev) { } static int il0323_init(const struct device *dev) { - struct il0323_data *driver = dev->data; + const struct il0323_cfg *cfg = dev->config; - LOG_DBG(""); - - driver->spi_dev = device_get_binding(IL0323_BUS_NAME); - if (driver->spi_dev == NULL) { - LOG_ERR("Could not get SPI device for IL0323"); + if (!spi_is_ready(&cfg->spi)) { + LOG_ERR("SPI device not ready for IL0323"); return -EIO; } - driver->spi_config.frequency = IL0323_SPI_FREQ; - driver->spi_config.operation = SPI_OP_MODE_MASTER | SPI_WORD_SET(8); - driver->spi_config.slave = DT_INST_REG_ADDR(0); - driver->spi_config.cs = NULL; - - driver->reset = device_get_binding(IL0323_RESET_CNTRL); - if (driver->reset == NULL) { + if (!device_is_ready(cfg->reset.port)) { LOG_ERR("Could not get GPIO port for IL0323 reset"); return -EIO; } - gpio_pin_configure(driver->reset, IL0323_RESET_PIN, GPIO_OUTPUT_INACTIVE | IL0323_RESET_FLAGS); + gpio_pin_configure_dt(&cfg->reset, GPIO_OUTPUT_INACTIVE); - driver->dc = device_get_binding(IL0323_DC_CNTRL); - if (driver->dc == NULL) { + if (!device_is_ready(cfg->dc.port)) { LOG_ERR("Could not get GPIO port for IL0323 DC signal"); return -EIO; } - gpio_pin_configure(driver->dc, IL0323_DC_PIN, GPIO_OUTPUT_INACTIVE | IL0323_DC_FLAGS); + gpio_pin_configure_dt(&cfg->dc, GPIO_OUTPUT_INACTIVE); - driver->busy = device_get_binding(IL0323_BUSY_CNTRL); - if (driver->busy == NULL) { + if (!device_is_ready(cfg->busy.port)) { LOG_ERR("Could not get GPIO port for IL0323 busy signal"); return -EIO; } - gpio_pin_configure(driver->busy, IL0323_BUSY_PIN, GPIO_INPUT | IL0323_BUSY_FLAGS); - -#if defined(IL0323_CS_CNTRL) - driver->cs_ctrl.gpio_dev = device_get_binding(IL0323_CS_CNTRL); - if (!driver->cs_ctrl.gpio_dev) { - LOG_ERR("Unable to get SPI GPIO CS device"); - return -EIO; - } - - driver->cs_ctrl.gpio_pin = IL0323_CS_PIN; - driver->cs_ctrl.gpio_dt_flags = IL0323_CS_FLAGS; - driver->cs_ctrl.delay = 0U; - driver->spi_config.cs = &driver->cs_ctrl; -#endif + gpio_pin_configure_dt(&cfg->busy, GPIO_INPUT); return il0323_controller_init(dev); } -static struct il0323_data il0323_driver; +static struct il0323_cfg il0323_config = { + .spi = SPI_DT_SPEC_INST_GET(0, SPI_OP_MODE_MASTER | SPI_WORD_SET(8), 0), + .reset = GPIO_DT_SPEC_INST_GET(0, reset_gpios), + .busy = GPIO_DT_SPEC_INST_GET(0, busy_gpios), + .dc = GPIO_DT_SPEC_INST_GET(0, dc_gpios), +}; static struct display_driver_api il0323_driver_api = { .blanking_on = il0323_blanking_on, @@ -424,5 +384,5 @@ static struct display_driver_api il0323_driver_api = { .set_orientation = il0323_set_orientation, }; -DEVICE_DT_INST_DEFINE(0, il0323_init, NULL, &il0323_driver, NULL, POST_KERNEL, +DEVICE_DT_INST_DEFINE(0, il0323_init, NULL, NULL, &il0323_config, POST_KERNEL, CONFIG_APPLICATION_INIT_PRIORITY, &il0323_driver_api); diff --git a/app/drivers/gpio/CMakeLists.txt b/app/drivers/gpio/CMakeLists.txt index f4378151..0756ed38 100644 --- a/app/drivers/gpio/CMakeLists.txt +++ b/app/drivers/gpio/CMakeLists.txt @@ -5,5 +5,4 @@ zephyr_library_named(zmk__drivers__gpio) zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) zephyr_library_sources_ifdef(CONFIG_GPIO_595 gpio_595.c) -zephyr_library_sources_ifdef(CONFIG_GPIO_MCP23017 gpio_mcp23017.c) zephyr_library_sources_ifdef(CONFIG_GPIO_MAX7318 gpio_max7318.c) diff --git a/app/drivers/gpio/Kconfig b/app/drivers/gpio/Kconfig index 43c7c24e..54b30590 100644 --- a/app/drivers/gpio/Kconfig +++ b/app/drivers/gpio/Kconfig @@ -1,6 +1,5 @@ menuconfig ZMK_DRIVERS_GPIO bool "GPIO" -rsource "Kconfig.mcp23017" rsource "Kconfig.max7318" rsource "Kconfig.595" diff --git a/app/drivers/gpio/Kconfig.mcp23017 b/app/drivers/gpio/Kconfig.mcp23017 deleted file mode 100644 index 049ca82e..00000000 --- a/app/drivers/gpio/Kconfig.mcp23017 +++ /dev/null @@ -1,22 +0,0 @@ -# MCP23017 GPIO configuration options - -# Copyright (c) 2021 Pete Johanson -# SPDX-License-Identifier: Apache-2.0 - -menuconfig GPIO_MCP23017 - bool "MCP23017 I2C-based GPIO chip" - depends on I2C - select HAS_DTS_GPIO - select ZMK_DRIVERS_GPIO - help - Enable driver for MCP23017 I2C-based GPIO chip. - -if GPIO_MCP23017 - -config GPIO_MCP23017_INIT_PRIORITY - int "Init priority" - default 75 - help - Device driver initialization priority. - -endif #GPIO_MCP23017 diff --git a/app/drivers/gpio/gpio_mcp23017.c b/app/drivers/gpio/gpio_mcp23017.c deleted file mode 100644 index feafbd0a..00000000 --- a/app/drivers/gpio/gpio_mcp23017.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - * Copyright (c) 2020 Geanix ApS - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#define DT_DRV_COMPAT microchip_mcp23017 - -/** - * @file Driver for MCP23017 SPI-based GPIO driver. - */ - -#include - -#include -#include -#include -#include -#include -#include - -#include "gpio_mcp23017.h" - -#define LOG_LEVEL CONFIG_GPIO_LOG_LEVEL -#include -LOG_MODULE_REGISTER(gpio_mcp23017); - -/** - * @brief Read both port 0 and port 1 registers of certain register function. - * - * Given the register in reg, read the pair of port 0 and port 1. - * - * @param dev Device struct of the MCP23017. - * @param reg Register to read (the PORTA of the pair of registers). - * @param buf Buffer to read data into. - * - * @return 0 if successful, failed otherwise. - */ -static int read_port_regs(const struct device *dev, uint8_t reg, uint16_t *buf) { - const struct mcp23017_config *const config = dev->config; - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - int ret; - uint16_t port_data; - - uint8_t addr = config->slave; - - ret = i2c_burst_read(drv_data->i2c, addr, reg, (uint8_t *)&port_data, sizeof(port_data)); - if (ret) { - LOG_DBG("i2c_write_read FAIL %d\n", ret); - return ret; - } - - *buf = sys_le16_to_cpu(port_data); - - LOG_DBG("MCP23017: Read: REG[0x%X] = 0x%X, REG[0x%X] = 0x%X", reg, (*buf & 0xFF), (reg + 1), - (*buf >> 8)); - - return 0; -} - -/** - * @brief Write both port 0 and port 1 registers of certain register function. - * - * Given the register in reg, write the pair of port 0 and port 1. - * - * @param dev Device struct of the MCP23017. - * @param reg Register to write into (the PORTA of the pair of registers). - * @param buf Buffer to write data from. - * - * @return 0 if successful, failed otherwise. - */ -static int write_port_regs(const struct device *dev, uint8_t reg, uint16_t value) { - const struct mcp23017_config *const config = dev->config; - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - int ret; - uint16_t port_data; - - LOG_DBG("MCP23017: Write: REG[0x%X] = 0x%X, REG[0x%X] = 0x%X", reg, (value & 0xFF), (reg + 1), - (value >> 8)); - - port_data = sys_cpu_to_le16(value); - - ret = i2c_burst_write(drv_data->i2c, config->slave, reg, (uint8_t *)&port_data, - sizeof(port_data)); - if (ret) { - LOG_DBG("i2c_write FAIL %d\n", ret); - return ret; - } - - return 0; -} - -/** - * @brief Setup the pin direction (input or output) - * - * @param dev Device struct of the MCP23017 - * @param pin The pin number - * @param flags Flags of pin or port - * - * @return 0 if successful, failed otherwise - */ -static int setup_pin_dir(const struct device *dev, uint32_t pin, int flags) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - uint16_t *dir = &drv_data->reg_cache.iodir; - uint16_t *output = &drv_data->reg_cache.gpio; - int ret; - - if ((flags & GPIO_OUTPUT) != 0U) { - if ((flags & GPIO_OUTPUT_INIT_HIGH) != 0U) { - *output |= BIT(pin); - } else if ((flags & GPIO_OUTPUT_INIT_LOW) != 0U) { - *output &= ~BIT(pin); - } - *dir &= ~BIT(pin); - } else { - *dir |= BIT(pin); - } - - ret = write_port_regs(dev, REG_GPIO_PORTA, *output); - if (ret != 0) { - return ret; - } - - ret = write_port_regs(dev, REG_IODIR_PORTA, *dir); - - return ret; -} - -/** - * @brief Setup the pin pull up/pull down status - * - * @param dev Device struct of the MCP23017 - * @param pin The pin number - * @param flags Flags of pin or port - * - * @return 0 if successful, failed otherwise - */ -static int setup_pin_pullupdown(const struct device *dev, uint32_t pin, int flags) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - uint16_t port; - int ret; - - /* Setup pin pull up or pull down */ - port = drv_data->reg_cache.gppu; - - /* pull down == 0, pull up == 1 */ - if ((flags & GPIO_PULL_DOWN) != 0U) { - return -ENOTSUP; - } - - WRITE_BIT(port, pin, (flags & GPIO_PULL_UP) != 0U); - - ret = write_port_regs(dev, REG_GPPU_PORTA, port); - if (ret == 0) { - drv_data->reg_cache.gppu = port; - } - - return ret; -} - -static int mcp23017_config(const struct device *dev, gpio_pin_t pin, gpio_flags_t flags) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - int ret; - - /* Can't do SPI bus operations from an ISR */ - if (k_is_in_isr()) { - return -EWOULDBLOCK; - } - - k_sem_take(&drv_data->lock, K_FOREVER); - - if ((flags & GPIO_OPEN_DRAIN) != 0U) { - ret = -ENOTSUP; - goto done; - }; - - ret = setup_pin_dir(dev, pin, flags); - if (ret) { - LOG_ERR("MCP23017: error setting pin direction (%d)", ret); - goto done; - } - - ret = setup_pin_pullupdown(dev, pin, flags); - if (ret) { - LOG_ERR("MCP23017: error setting pin pull up/down (%d)", ret); - goto done; - } - -done: - k_sem_give(&drv_data->lock); - return ret; -} - -static int mcp23017_port_get_raw(const struct device *dev, uint32_t *value) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - uint16_t buf; - int ret; - - /* Can't do SPI bus operations from an ISR */ - if (k_is_in_isr()) { - return -EWOULDBLOCK; - } - - k_sem_take(&drv_data->lock, K_FOREVER); - - ret = read_port_regs(dev, REG_GPIO_PORTA, &buf); - if (ret != 0) { - goto done; - } - - *value = buf; - -done: - k_sem_give(&drv_data->lock); - return ret; -} - -static int mcp23017_port_set_masked_raw(const struct device *dev, uint32_t mask, uint32_t value) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - uint16_t buf; - int ret; - - /* Can't do SPI bus operations from an ISR */ - if (k_is_in_isr()) { - return -EWOULDBLOCK; - } - - k_sem_take(&drv_data->lock, K_FOREVER); - - buf = drv_data->reg_cache.gpio; - buf = (buf & ~mask) | (mask & value); - - ret = write_port_regs(dev, REG_GPIO_PORTA, buf); - if (ret == 0) { - drv_data->reg_cache.gpio = buf; - } - - k_sem_give(&drv_data->lock); - - return ret; -} - -static int mcp23017_port_set_bits_raw(const struct device *dev, uint32_t mask) { - return mcp23017_port_set_masked_raw(dev, mask, mask); -} - -static int mcp23017_port_clear_bits_raw(const struct device *dev, uint32_t mask) { - return mcp23017_port_set_masked_raw(dev, mask, 0); -} - -static int mcp23017_port_toggle_bits(const struct device *dev, uint32_t mask) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - uint16_t buf; - int ret; - - /* Can't do SPI bus operations from an ISR */ - if (k_is_in_isr()) { - return -EWOULDBLOCK; - } - - k_sem_take(&drv_data->lock, K_FOREVER); - - buf = drv_data->reg_cache.gpio; - buf ^= mask; - - ret = write_port_regs(dev, REG_GPIO_PORTA, buf); - if (ret == 0) { - drv_data->reg_cache.gpio = buf; - } - - k_sem_give(&drv_data->lock); - - return ret; -} - -static int mcp23017_pin_interrupt_configure(const struct device *dev, gpio_pin_t pin, - enum gpio_int_mode mode, enum gpio_int_trig trig) { - return -ENOTSUP; -} - -static const struct gpio_driver_api api_table = { - .pin_configure = mcp23017_config, - .port_get_raw = mcp23017_port_get_raw, - .port_set_masked_raw = mcp23017_port_set_masked_raw, - .port_set_bits_raw = mcp23017_port_set_bits_raw, - .port_clear_bits_raw = mcp23017_port_clear_bits_raw, - .port_toggle_bits = mcp23017_port_toggle_bits, - .pin_interrupt_configure = mcp23017_pin_interrupt_configure, -}; - -/** - * @brief Initialization function of MCP23017 - * - * @param dev Device struct - * @return 0 if successful, failed otherwise. - */ -static int mcp23017_init(const struct device *dev) { - const struct mcp23017_config *const config = dev->config; - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - - drv_data->i2c = device_get_binding((char *)config->i2c_dev_name); - if (!drv_data->i2c) { - LOG_DBG("Unable to get i2c device"); - return -ENODEV; - } - - k_sem_init(&drv_data->lock, 1, 1); - - return 0; -} - -#define MCP23017_INIT(inst) \ - static struct mcp23017_config mcp23017_##inst##_config = { \ - .i2c_dev_name = DT_INST_BUS_LABEL(inst), \ - .slave = DT_INST_REG_ADDR(inst), \ - \ - }; \ - \ - static struct mcp23017_drv_data mcp23017_##inst##_drvdata = { \ - /* Default for registers according to datasheet */ \ - .reg_cache.iodir = 0xFFFF, .reg_cache.ipol = 0x0, .reg_cache.gpinten = 0x0, \ - .reg_cache.defval = 0x0, .reg_cache.intcon = 0x0, .reg_cache.iocon = 0x0, \ - .reg_cache.gppu = 0x0, .reg_cache.intf = 0x0, .reg_cache.intcap = 0x0, \ - .reg_cache.gpio = 0x0, .reg_cache.olat = 0x0, \ - }; \ - \ - /* This has to init after SPI master */ \ - DEVICE_DT_INST_DEFINE(inst, mcp23017_init, NULL, &mcp23017_##inst##_drvdata, \ - &mcp23017_##inst##_config, POST_KERNEL, \ - CONFIG_GPIO_MCP23017_INIT_PRIORITY, &api_table); - -DT_INST_FOREACH_STATUS_OKAY(MCP23017_INIT) diff --git a/app/drivers/gpio/gpio_mcp23017.h b/app/drivers/gpio/gpio_mcp23017.h deleted file mode 100644 index 01908c0c..00000000 --- a/app/drivers/gpio/gpio_mcp23017.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2020 Geanix ApS, Pete Johanson - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @file Header file for the MCP23017 driver. - */ - -#ifndef ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ -#define ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ - -#include - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Register definitions */ -#define REG_IODIR_PORTA 0x00 -#define REG_IODIR_PORTB 0x01 -#define REG_IPOL_PORTA 0x02 -#define REG_IPOL_PORTB 0x03 -#define REG_GPINTEN_PORTA 0x04 -#define REG_GPINTEN_PORTB 0x05 -#define REG_DEFVAL_PORTA 0x06 -#define REG_DEFVAL_PORTB 0x07 -#define REG_INTCON_PORTA 0x08 -#define REG_INTCON_PORTB 0x09 -#define REG_GPPU_PORTA 0x0C -#define REG_GPPU_PORTB 0x0D -#define REG_INTF_PORTA 0x0E -#define REG_INTF_PORTB 0x0F -#define REG_INTCAP_PORTA 0x10 -#define REG_INTCAP_PORTB 0x11 -#define REG_GPIO_PORTA 0x12 -#define REG_GPIO_PORTB 0x13 -#define REG_OLAT_PORTA 0x14 -#define REG_OLAT_PORTB 0x15 - -#define MCP23017_ADDR 0x40 -#define MCP23017_READBIT 0x01 - -/** Configuration data */ -struct mcp23017_config { - /* gpio_driver_data needs to be first */ - struct gpio_driver_config common; - - const char *const i2c_dev_name; - const uint16_t slave; -}; - -/** Runtime driver data */ -struct mcp23017_drv_data { - /* gpio_driver_data needs to be first */ - struct gpio_driver_config data; - - /** Master SPI device */ - const struct device *i2c; - - struct k_sem lock; - - struct { - uint16_t iodir; - uint16_t ipol; - uint16_t gpinten; - uint16_t defval; - uint16_t intcon; - uint16_t iocon; - uint16_t gppu; - uint16_t intf; - uint16_t intcap; - uint16_t gpio; - uint16_t olat; - } reg_cache; -}; - -#ifdef __cplusplus -} -#endif - -#endif /* ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ */ diff --git a/app/drivers/kscan/kscan_composite.c b/app/drivers/kscan/kscan_composite.c index b452a9d2..9909a4cf 100644 --- a/app/drivers/kscan/kscan_composite.c +++ b/app/drivers/kscan/kscan_composite.c @@ -7,7 +7,7 @@ #define DT_DRV_COMPAT zmk_kscan_composite #include -#include +#include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -16,13 +16,13 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define MATRIX_COLS DT_PROP(MATRIX_NODE_ID, columns) struct kscan_composite_child_config { - char *label; + const struct device *child; uint8_t row_offset; uint8_t column_offset; }; #define CHILD_CONFIG(inst) \ - {.label = DT_LABEL(DT_PHANDLE(inst, kscan)), \ + {.child = DEVICE_DT_GET(DT_PHANDLE(inst, kscan)), \ .row_offset = DT_PROP(inst, row_offset), \ .column_offset = DT_PROP(inst, column_offset)}, @@ -41,12 +41,7 @@ static int kscan_composite_enable_callback(const struct device *dev) { for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; - const struct device *dev = device_get_binding(cfg->label); - if (!dev) { - LOG_WRN("Failed to load child kscan device %s", cfg->label); - continue; - } - kscan_enable_callback(dev); + kscan_enable_callback(cfg->child); } return 0; } @@ -55,12 +50,7 @@ static int kscan_composite_disable_callback(const struct device *dev) { for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; - const struct device *dev = device_get_binding(cfg->label); - if (!dev) { - LOG_WRN("Failed to load child kscan device %s", cfg->label); - continue; - } - kscan_disable_callback(dev); + kscan_disable_callback(cfg->child); } return 0; } @@ -68,13 +58,13 @@ static int kscan_composite_disable_callback(const struct device *dev) { static void kscan_composite_child_callback(const struct device *child_dev, uint32_t row, uint32_t column, bool pressed) { // TODO: Ideally we can get this passed into our callback! - const struct device *dev = device_get_binding(DT_INST_LABEL(0)); + const struct device *dev = DEVICE_DT_GET(DT_DRV_INST(0)); struct kscan_composite_data *data = dev->data; for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; - if (device_get_binding(cfg->label) != child_dev) { + if (cfg->child != child_dev) { continue; } @@ -92,7 +82,7 @@ static int kscan_composite_configure(const struct device *dev, kscan_callback_t for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; - kscan_config(device_get_binding(cfg->label), &kscan_composite_child_callback); + kscan_config(cfg->child, &kscan_composite_child_callback); } data->callback = callback; diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/drivers/kscan/kscan_gpio_demux.c index 3ca300a3..812a899d 100644 --- a/app/drivers/kscan/kscan_gpio_demux.c +++ b/app/drivers/kscan/kscan_gpio_demux.c @@ -13,26 +13,11 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -struct kscan_gpio_item_config { - char *label; - gpio_pin_t pin; - gpio_flags_t flags; -}; - // Helper macro #define PWR_TWO(x) (1 << (x)) -// Define GPIO cfg -#define _KSCAN_GPIO_ITEM_CFG_INIT(n, prop, idx) \ - { \ - .label = DT_INST_GPIO_LABEL_BY_IDX(n, prop, idx), \ - .pin = DT_INST_GPIO_PIN_BY_IDX(n, prop, idx), \ - .flags = DT_INST_GPIO_FLAGS_BY_IDX(n, prop, idx), \ - } - // Define row and col cfg -#define _KSCAN_GPIO_INPUT_CFG_INIT(idx, n) _KSCAN_GPIO_ITEM_CFG_INIT(n, input_gpios, idx) -#define _KSCAN_GPIO_OUTPUT_CFG_INIT(idx, n) _KSCAN_GPIO_ITEM_CFG_INIT(n, output_gpios, idx) +#define _KSCAN_GPIO_CFG_INIT(n, prop, idx) GPIO_DT_SPEC_GET_BY_IDX(n, prop, idx), // Check debounce config #define CHECK_DEBOUNCE_CFG(n, a, b) COND_CODE_0(DT_INST_PROP(n, debounce_period), a, b) @@ -51,8 +36,8 @@ struct kscan_gpio_item_config { }; \ \ struct kscan_gpio_config_##n { \ - struct kscan_gpio_item_config rows[INST_MATRIX_INPUTS(n)]; \ - struct kscan_gpio_item_config cols[INST_DEMUX_GPIOS(n)]; \ + const struct gpio_dt_spec rows[INST_MATRIX_INPUTS(n)]; \ + const struct gpio_dt_spec cols[INST_DEMUX_GPIOS(n)]; \ }; \ \ struct kscan_gpio_data_##n { \ @@ -60,33 +45,16 @@ struct kscan_gpio_item_config { struct k_timer poll_timer; \ struct CHECK_DEBOUNCE_CFG(n, (k_work), (k_work_delayable)) work; \ bool matrix_state[INST_MATRIX_INPUTS(n)][INST_MATRIX_OUTPUTS(n)]; \ - const struct device *rows[INST_MATRIX_INPUTS(n)]; \ - const struct device *cols[INST_MATRIX_OUTPUTS(n)]; \ const struct device *dev; \ }; \ /* IO/GPIO SETUP */ \ - /* gpio_input_devices are PHYSICAL IO devices */ \ - static const struct device **kscan_gpio_input_devices_##n(const struct device *dev) { \ - struct kscan_gpio_data_##n *data = dev->data; \ - return data->rows; \ - } \ - \ - static const struct kscan_gpio_item_config *kscan_gpio_input_configs_##n( \ - const struct device *dev) { \ + static const struct gpio_dt_spec *kscan_gpio_input_specs_##n(const struct device *dev) { \ const struct kscan_gpio_config_##n *cfg = dev->config; \ return cfg->rows; \ } \ \ - /* gpio_output_devices are PHYSICAL IO devices */ \ - static const struct device **kscan_gpio_output_devices_##n(const struct device *dev) { \ - struct kscan_gpio_data_##n *data = dev->data; \ - return data->cols; \ - } \ - \ - static const struct kscan_gpio_item_config *kscan_gpio_output_configs_##n( \ - const struct device *dev) { \ + static const struct gpio_dt_spec *kscan_gpio_output_specs_##n(const struct device *dev) { \ const struct kscan_gpio_config_##n *cfg = dev->config; \ - /* If row2col, rows = outputs & cols = inputs */ \ return cfg->cols; \ } \ /* POLLING SETUP */ \ @@ -106,21 +74,16 @@ struct kscan_gpio_item_config { /* Iterate over bits and set GPIOs accordingly */ \ for (uint8_t bit = 0; bit < INST_DEMUX_GPIOS(n); bit++) { \ uint8_t state = (o & (0b1 << bit)) >> bit; \ - const struct device *out_dev = kscan_gpio_output_devices_##n(dev)[bit]; \ - const struct kscan_gpio_item_config *out_cfg = \ - &kscan_gpio_output_configs_##n(dev)[bit]; \ - gpio_pin_set(out_dev, out_cfg->pin, state); \ + const struct gpio_dt_spec *out_spec = &kscan_gpio_output_specs_##n(dev)[bit]; \ + gpio_pin_set_dt(out_spec, state); \ } \ /* Let the col settle before reading the rows */ \ k_usleep(1); \ \ for (int i = 0; i < INST_MATRIX_INPUTS(n); i++) { \ - /* Get the input device (port) */ \ - const struct device *in_dev = kscan_gpio_input_devices_##n(dev)[i]; \ - /* Get the input device config (pin) */ \ - const struct kscan_gpio_item_config *in_cfg = \ - &kscan_gpio_input_configs_##n(dev)[i]; \ - read_state[i][o] = gpio_pin_get(in_dev, in_cfg->pin) > 0; \ + /* Get the input spec */ \ + const struct gpio_dt_spec *in_spec = &kscan_gpio_input_specs_##n(dev)[i]; \ + read_state[i][o] = gpio_pin_get_dt(in_spec) > 0; \ } \ } \ for (int r = 0; r < INST_MATRIX_INPUTS(n); r++) { \ @@ -146,8 +109,7 @@ struct kscan_gpio_item_config { kscan_gpio_read_##n(data->dev); \ } \ \ - static struct kscan_gpio_data_##n kscan_gpio_data_##n = { \ - .rows = {[INST_MATRIX_INPUTS(n) - 1] = NULL}, .cols = {[INST_DEMUX_GPIOS(n) - 1] = NULL}}; \ + static struct kscan_gpio_data_##n kscan_gpio_data_##n = {}; \ \ /* KSCAN API configure function */ \ static int kscan_gpio_configure_##n(const struct device *dev, kscan_callback_t callback) { \ @@ -185,20 +147,18 @@ struct kscan_gpio_item_config { struct kscan_gpio_data_##n *data = dev->data; \ int err; \ /* configure input devices*/ \ - const struct device **input_devices = kscan_gpio_input_devices_##n(dev); \ for (int i = 0; i < INST_MATRIX_INPUTS(n); i++) { \ - const struct kscan_gpio_item_config *in_cfg = &kscan_gpio_input_configs_##n(dev)[i]; \ - input_devices[i] = device_get_binding(in_cfg->label); \ - if (!input_devices[i]) { \ + const struct gpio_dt_spec *in_spec = &kscan_gpio_input_specs_##n(dev)[i]; \ + if (!device_is_ready(in_spec->port)) { \ LOG_ERR("Unable to find input GPIO device"); \ return -EINVAL; \ } \ - err = gpio_pin_configure(input_devices[i], in_cfg->pin, GPIO_INPUT | in_cfg->flags); \ + err = gpio_pin_configure_dt(in_spec, GPIO_INPUT); \ if (err) { \ - LOG_ERR("Unable to configure pin %d on %s for input", in_cfg->pin, in_cfg->label); \ + LOG_ERR("Unable to configure pin %d for input", in_spec->pin); \ return err; \ } else { \ - LOG_DBG("Configured pin %d on %s for input", in_cfg->pin, in_cfg->label); \ + LOG_DBG("Configured pin %d for input", in_spec->pin); \ } \ if (err) { \ LOG_ERR("Error adding the callback to the column device"); \ @@ -206,22 +166,18 @@ struct kscan_gpio_item_config { } \ } \ /* configure output devices*/ \ - const struct device **output_devices = kscan_gpio_output_devices_##n(dev); \ for (int o = 0; o < INST_DEMUX_GPIOS(n); o++) { \ - const struct kscan_gpio_item_config *out_cfg = &kscan_gpio_output_configs_##n(dev)[o]; \ - output_devices[o] = device_get_binding(out_cfg->label); \ - if (!output_devices[o]) { \ + const struct gpio_dt_spec *out_spec = &kscan_gpio_output_specs_##n(dev)[o]; \ + if (!device_is_ready(out_spec->port)) { \ LOG_ERR("Unable to find output GPIO device"); \ return -EINVAL; \ } \ - err = gpio_pin_configure(output_devices[o], out_cfg->pin, \ - GPIO_OUTPUT_ACTIVE | out_cfg->flags); \ + err = gpio_pin_configure_dt(out_spec, GPIO_OUTPUT_ACTIVE); \ if (err) { \ - LOG_ERR("Unable to configure pin %d on %s for output", out_cfg->pin, \ - out_cfg->label); \ + LOG_ERR("Unable to configure pin %d for output", out_spec->pin); \ return err; \ } else { \ - LOG_DBG("Configured pin %d on %s for output", out_cfg->pin, out_cfg->label); \ + LOG_DBG("Configured pin %d for output", out_spec->pin); \ } \ } \ data->dev = dev; \ @@ -240,8 +196,8 @@ struct kscan_gpio_item_config { }; \ \ static const struct kscan_gpio_config_##n kscan_gpio_config_##n = { \ - .rows = {LISTIFY(INST_MATRIX_INPUTS(n), _KSCAN_GPIO_INPUT_CFG_INIT, (, ), n)}, \ - .cols = {LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, (, ), n)}, \ + .rows = {DT_FOREACH_PROP_ELEM(DT_DRV_INST(n), input_gpios, _KSCAN_GPIO_CFG_INIT)}, \ + .cols = {DT_FOREACH_PROP_ELEM(DT_DRV_INST(n), output_gpios, _KSCAN_GPIO_CFG_INIT)}, \ }; \ \ DEVICE_DT_INST_DEFINE(n, kscan_gpio_init_##n, NULL, &kscan_gpio_data_##n, \ diff --git a/app/drivers/sensor/battery/battery_voltage_divider.c b/app/drivers/sensor/battery/battery_voltage_divider.c index bc35d002..655af3db 100644 --- a/app/drivers/sensor/battery/battery_voltage_divider.c +++ b/app/drivers/sensor/battery/battery_voltage_divider.c @@ -8,9 +8,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include #include "battery_common.h" @@ -21,22 +21,15 @@ struct io_channel_config { uint8_t channel; }; -struct gpio_channel_config { - const char *label; - uint8_t pin; - uint8_t flags; -}; - struct bvd_config { struct io_channel_config io_channel; - struct gpio_channel_config power_gpios; + struct gpio_dt_spec power; uint32_t output_ohm; uint32_t full_ohm; }; struct bvd_data { const struct device *adc; - const struct device *gpio; struct adc_channel_cfg acc; struct adc_sequence as; struct battery_value value; @@ -56,19 +49,19 @@ static int bvd_sample_fetch(const struct device *dev, enum sensor_channel chan) int rc = 0; - // Enable power GPIO if present - if (drv_data->gpio) { - rc = gpio_pin_set(drv_data->gpio, drv_cfg->power_gpios.pin, 1); +#if DT_INST_NODE_HAS_PROP(0, power_gpios) + // Enable power before sampling + rc = gpio_pin_set_dt(&drv_cfg->power, 1); - if (rc != 0) { - LOG_DBG("Failed to enable ADC power GPIO: %d", rc); - return rc; - } - - // wait for any capacitance to charge up - k_sleep(K_MSEC(10)); + if (rc != 0) { + LOG_DBG("Failed to enable ADC power GPIO: %d", rc); + return rc; } + // wait for any capacitance to charge up + k_sleep(K_MSEC(10)); +#endif // DT_INST_NODE_HAS_PROP(0, power_gpios) + // Read ADC rc = adc_read(drv_data->adc, as); as->calibrate = false; @@ -90,15 +83,15 @@ static int bvd_sample_fetch(const struct device *dev, enum sensor_channel chan) LOG_DBG("Failed to read ADC: %d", rc); } +#if DT_INST_NODE_HAS_PROP(0, power_gpios) // Disable power GPIO if present - if (drv_data->gpio) { - int rc2 = gpio_pin_set(drv_data->gpio, drv_cfg->power_gpios.pin, 0); + int rc2 = gpio_pin_set_dt(&drv_cfg->power, 0); - if (rc2 != 0) { - LOG_DBG("Failed to disable ADC power GPIO: %d", rc2); - return rc2; - } + if (rc2 != 0) { + LOG_DBG("Failed to disable ADC power GPIO: %d", rc2); + return rc2; } +#endif // DT_INST_NODE_HAS_PROP(0, power_gpios) return rc; } @@ -125,20 +118,17 @@ static int bvd_init(const struct device *dev) { int rc = 0; - if (drv_cfg->power_gpios.label) { - drv_data->gpio = device_get_binding(drv_cfg->power_gpios.label); - if (drv_data->gpio == NULL) { - LOG_ERR("Failed to get GPIO %s", drv_cfg->power_gpios.label); - return -ENODEV; - } - rc = gpio_pin_configure(drv_data->gpio, drv_cfg->power_gpios.pin, - GPIO_OUTPUT_INACTIVE | drv_cfg->power_gpios.flags); - if (rc != 0) { - LOG_ERR("Failed to control feed %s.%u: %d", drv_cfg->power_gpios.label, - drv_cfg->power_gpios.pin, rc); - return rc; - } +#if DT_INST_NODE_HAS_PROP(0, power_gpios) + if (!device_is_ready(drv_cfg->power.port)) { + LOG_ERR("GPIO port for power control is not ready"); + return -ENODEV; } + rc = gpio_pin_configure_dt(&drv_cfg->power, GPIO_OUTPUT_INACTIVE); + if (rc != 0) { + LOG_ERR("Failed to control feed %u: %d", drv_cfg->power.pin, rc); + return rc; + } +#endif // DT_INST_NODE_HAS_PROP(0, power_gpios) drv_data->as = (struct adc_sequence){ .channels = BIT(0), @@ -175,12 +165,7 @@ static const struct bvd_config bvd_cfg = { DT_IO_CHANNELS_INPUT(DT_DRV_INST(0)), }, #if DT_INST_NODE_HAS_PROP(0, power_gpios) - .power_gpios = - { - DT_INST_GPIO_LABEL(0, power_gpios), - DT_INST_GPIO_PIN(0, power_gpios), - DT_INST_GPIO_FLAGS(0, power_gpios), - }, + .power = GPIO_DT_SPEC_INST_GET(0, power_gpios), #endif .output_ohm = DT_INST_PROP(0, output_ohms), .full_ohm = DT_INST_PROP(0, full_ohms), diff --git a/app/drivers/sensor/ec11/ec11.c b/app/drivers/sensor/ec11/ec11.c index 5f26ebc3..7091f73e 100644 --- a/app/drivers/sensor/ec11/ec11.c +++ b/app/drivers/sensor/ec11/ec11.c @@ -19,11 +19,9 @@ LOG_MODULE_REGISTER(EC11, CONFIG_SENSOR_LOG_LEVEL); static int ec11_get_ab_state(const struct device *dev) { - struct ec11_data *drv_data = dev->data; const struct ec11_config *drv_cfg = dev->config; - return (gpio_pin_get(drv_data->a, drv_cfg->a_pin) << 1) | - gpio_pin_get(drv_data->b, drv_cfg->b_pin); + return (gpio_pin_get_dt(&drv_cfg->a) << 1) | gpio_pin_get_dt(&drv_cfg->b); } static int ec11_sample_fetch(const struct device *dev, enum sensor_channel chan) { @@ -94,27 +92,25 @@ int ec11_init(const struct device *dev) { struct ec11_data *drv_data = dev->data; const struct ec11_config *drv_cfg = dev->config; - LOG_DBG("A: %s %d B: %s %d resolution %d", drv_cfg->a_label, drv_cfg->a_pin, drv_cfg->b_label, - drv_cfg->b_pin, drv_cfg->resolution); + LOG_DBG("A: %s %d B: %s %d resolution %d", drv_cfg->a.port->name, drv_cfg->a.pin, + drv_cfg->b.port->name, drv_cfg->b.pin, drv_cfg->resolution); - drv_data->a = device_get_binding(drv_cfg->a_label); - if (drv_data->a == NULL) { - LOG_ERR("Failed to get pointer to A GPIO device"); + if (!device_is_ready(drv_cfg->a.port)) { + LOG_ERR("A GPIO device is not ready"); return -EINVAL; } - drv_data->b = device_get_binding(drv_cfg->b_label); - if (drv_data->b == NULL) { - LOG_ERR("Failed to get pointer to B GPIO device"); + if (!device_is_ready(drv_cfg->b.port)) { + LOG_ERR("B GPIO device is not ready"); return -EINVAL; } - if (gpio_pin_configure(drv_data->a, drv_cfg->a_pin, drv_cfg->a_flags | GPIO_INPUT)) { + if (gpio_pin_configure_dt(&drv_cfg->a, GPIO_INPUT)) { LOG_DBG("Failed to configure A pin"); return -EIO; } - if (gpio_pin_configure(drv_data->b, drv_cfg->b_pin, drv_cfg->b_flags | GPIO_INPUT)) { + if (gpio_pin_configure_dt(&drv_cfg->b, GPIO_INPUT)) { LOG_DBG("Failed to configure B pin"); return -EIO; } @@ -134,12 +130,8 @@ int ec11_init(const struct device *dev) { #define EC11_INST(n) \ struct ec11_data ec11_data_##n; \ const struct ec11_config ec11_cfg_##n = { \ - .a_label = DT_INST_GPIO_LABEL(n, a_gpios), \ - .a_pin = DT_INST_GPIO_PIN(n, a_gpios), \ - .a_flags = DT_INST_GPIO_FLAGS(n, a_gpios), \ - .b_label = DT_INST_GPIO_LABEL(n, b_gpios), \ - .b_pin = DT_INST_GPIO_PIN(n, b_gpios), \ - .b_flags = DT_INST_GPIO_FLAGS(n, b_gpios), \ + .a = GPIO_DT_SPEC_INST_GET(n, a_gpios), \ + .b = GPIO_DT_SPEC_INST_GET(n, b_gpios), \ COND_CODE_0(DT_INST_NODE_HAS_PROP(n, resolution), (1), (DT_INST_PROP(n, resolution))), \ }; \ DEVICE_DT_INST_DEFINE(n, ec11_init, NULL, &ec11_data_##n, &ec11_cfg_##n, POST_KERNEL, \ diff --git a/app/drivers/sensor/ec11/ec11.h b/app/drivers/sensor/ec11/ec11.h index 04750df5..82c21572 100644 --- a/app/drivers/sensor/ec11/ec11.h +++ b/app/drivers/sensor/ec11/ec11.h @@ -11,20 +11,13 @@ #include struct ec11_config { - const char *a_label; - const uint8_t a_pin; - const uint8_t a_flags; - - const char *b_label; - const uint8_t b_pin; - const uint8_t b_flags; + const struct gpio_dt_spec a; + const struct gpio_dt_spec b; const uint8_t resolution; }; struct ec11_data { - const struct device *a; - const struct device *b; uint8_t ab_state; int8_t pulses; int8_t ticks; diff --git a/app/drivers/sensor/ec11/ec11_trigger.c b/app/drivers/sensor/ec11/ec11_trigger.c index 804a21d9..f9384a66 100644 --- a/app/drivers/sensor/ec11/ec11_trigger.c +++ b/app/drivers/sensor/ec11/ec11_trigger.c @@ -20,18 +20,15 @@ extern struct ec11_data ec11_driver; LOG_MODULE_DECLARE(EC11, CONFIG_SENSOR_LOG_LEVEL); static inline void setup_int(const struct device *dev, bool enable) { - struct ec11_data *data = dev->data; const struct ec11_config *cfg = dev->config; LOG_DBG("enabled %s", (enable ? "true" : "false")); - if (gpio_pin_interrupt_configure(data->a, cfg->a_pin, - enable ? GPIO_INT_EDGE_BOTH : GPIO_INT_DISABLE)) { + if (gpio_pin_interrupt_configure_dt(&cfg->a, enable ? GPIO_INT_EDGE_BOTH : GPIO_INT_DISABLE)) { LOG_WRN("Unable to set A pin GPIO interrupt"); } - if (gpio_pin_interrupt_configure(data->b, cfg->b_pin, - enable ? GPIO_INT_EDGE_BOTH : GPIO_INT_DISABLE)) { + if (gpio_pin_interrupt_configure_dt(&cfg->b, enable ? GPIO_INT_EDGE_BOTH : GPIO_INT_DISABLE)) { LOG_WRN("Unable to set A pin GPIO interrupt"); } } @@ -121,16 +118,16 @@ int ec11_init_interrupt(const struct device *dev) { drv_data->dev = dev; /* setup gpio interrupt */ - gpio_init_callback(&drv_data->a_gpio_cb, ec11_a_gpio_callback, BIT(drv_cfg->a_pin)); + gpio_init_callback(&drv_data->a_gpio_cb, ec11_a_gpio_callback, BIT(drv_cfg->a.pin)); - if (gpio_add_callback(drv_data->a, &drv_data->a_gpio_cb) < 0) { + if (gpio_add_callback(drv_cfg->a.port, &drv_data->a_gpio_cb) < 0) { LOG_DBG("Failed to set A callback!"); return -EIO; } - gpio_init_callback(&drv_data->b_gpio_cb, ec11_b_gpio_callback, BIT(drv_cfg->b_pin)); + gpio_init_callback(&drv_data->b_gpio_cb, ec11_b_gpio_callback, BIT(drv_cfg->b.pin)); - if (gpio_add_callback(drv_data->b, &drv_data->b_gpio_cb) < 0) { + if (gpio_add_callback(drv_cfg->b.port, &drv_data->b_gpio_cb) < 0) { LOG_DBG("Failed to set B callback!"); return -EIO; } diff --git a/app/drivers/zephyr/dts/bindings/gpio/microchip,mcp23017.yaml b/app/drivers/zephyr/dts/bindings/gpio/microchip,mcp23017.yaml deleted file mode 100644 index 75e19c49..00000000 --- a/app/drivers/zephyr/dts/bindings/gpio/microchip,mcp23017.yaml +++ /dev/null @@ -1,29 +0,0 @@ -# -# Copyright (c) 2020 Geanix ApS -# -# SPDX-License-Identifier: Apache-2.0 -# - -description: > - This is a representation of the Microchip MCP23017 I2C Gpio Expander. - -compatible: "microchip,mcp23017" - -include: [gpio-controller.yaml, i2c-device.yaml] - -properties: - label: - required: true - - "#gpio-cells": - const: 2 - - ngpios: - type: int - required: true - const: 16 - description: Number of gpios supported - -gpio-cells: - - pin - - flags diff --git a/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml b/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml index 43fa7511..605c969d 100644 --- a/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml +++ b/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml @@ -12,9 +12,6 @@ compatible: "zmk,gpio-595" include: [gpio-controller.yaml, spi-device.yaml] properties: - label: - required: true - "#gpio-cells": const: 2 diff --git a/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml b/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml index a8904360..28b7541b 100644 --- a/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml +++ b/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml @@ -4,8 +4,3 @@ description: Battery SoC monitoring using nRF VDDH compatible: "zmk,battery-nrf-vddh" - -properties: - label: - required: true - type: string diff --git a/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-voltage-divider.yaml b/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-voltage-divider.yaml index c4c6f80c..d9e07b79 100644 --- a/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-voltage-divider.yaml +++ b/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-voltage-divider.yaml @@ -6,8 +6,3 @@ description: Battery SoC monitoring using voltage divider compatible: "zmk,battery-voltage-divider" include: voltage-divider.yaml - -properties: - label: - required: true - type: string diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index 1195b943..a47cd505 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -25,7 +25,7 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr #define ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst) \ { \ - .behavior_dev = DT_LABEL(DT_PHANDLE_BY_IDX(drv_inst, bindings, idx)), \ + .behavior_dev = DT_PROP(DT_PHANDLE_BY_IDX(drv_inst, bindings, idx), label), \ .param1 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(drv_inst, bindings, idx, param1), (0), \ (DT_PHA_BY_IDX(drv_inst, bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(drv_inst, bindings, idx, param2), (0), \ diff --git a/app/include/zmk/kscan.h b/app/include/zmk/kscan.h index 33526008..eebe41e7 100644 --- a/app/include/zmk/kscan.h +++ b/app/include/zmk/kscan.h @@ -6,4 +6,6 @@ #pragma once -int zmk_kscan_init(char *name); +#include + +int zmk_kscan_init(const struct device *dev); diff --git a/app/src/activity.c b/app/src/activity.c index 41fe2e15..46af56fb 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -74,8 +74,8 @@ void activity_work_handler(struct k_work *work) { } else #endif /* IS_ENABLED(CONFIG_ZMK_SLEEP) */ if (inactive_time > MAX_IDLE_MS) { - set_state(ZMK_ACTIVITY_IDLE); - } + set_state(ZMK_ACTIVITY_IDLE); + } } K_WORK_DEFINE(activity_work, activity_work_handler); diff --git a/app/src/behavior_queue.c b/app/src/behavior_queue.c index 971816f2..1511e755 100644 --- a/app/src/behavior_queue.c +++ b/app/src/behavior_queue.c @@ -28,8 +28,8 @@ static void behavior_queue_process_next(struct k_work *work) { struct q_item item = {.wait = 0}; while (k_msgq_get(&zmk_behavior_queue_msgq, &item, K_NO_WAIT) == 0) { - LOG_DBG("Invoking %s: 0x%02x 0x%02x", item.binding.behavior_dev, - item.binding.param1, item.binding.param2); + LOG_DBG("Invoking %s: 0x%02x 0x%02x", item.binding.behavior_dev, item.binding.param1, + item.binding.param2); struct zmk_behavior_binding_event event = {.position = item.position, .timestamp = k_uptime_get()}; diff --git a/app/src/behaviors/behavior_bt.c b/app/src/behaviors/behavior_bt.c index 71cf2322..6d44b5f5 100644 --- a/app/src/behaviors/behavior_bt.c +++ b/app/src/behaviors/behavior_bt.c @@ -16,7 +16,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include - #include #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 8ee5bb5c..4c9fd711 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -166,9 +166,10 @@ static int behavior_caps_word_init(const struct device *dev) { #define CAPS_WORD_LABEL(i, _n) DT_INST_LABEL(i) #define PARSE_BREAK(i) \ - {.page = ZMK_HID_USAGE_PAGE(i), \ - .id = ZMK_HID_USAGE_ID(i), \ - .implicit_modifiers = SELECT_MODS(i)} + { \ + .page = ZMK_HID_USAGE_PAGE(i), .id = ZMK_HID_USAGE_ID(i), \ + .implicit_modifiers = SELECT_MODS(i) \ + } #define BREAK_ITEM(i, n) PARSE_BREAK(DT_INST_PROP_BY_IDX(n, continue_list, i)) @@ -177,7 +178,7 @@ static int behavior_caps_word_init(const struct device *dev) { static struct behavior_caps_word_config behavior_caps_word_config_##n = { \ .index = n, \ .mods = DT_INST_PROP_OR(n, mods, MOD_LSFT), \ - .continuations = {LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, (,), n)}, \ + .continuations = {LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, (, ), n)}, \ .continuations_count = DT_INST_PROP_LEN(n, continue_list), \ }; \ DEVICE_DT_INST_DEFINE(n, behavior_caps_word_init, NULL, &behavior_caps_word_data_##n, \ diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index 6ea2fe97..30350ef2 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -700,8 +700,8 @@ static int behavior_hold_tap_init(const struct device *dev) { #define KP_INST(n) \ static struct behavior_hold_tap_config behavior_hold_tap_config_##n = { \ .tapping_term_ms = DT_INST_PROP(n, tapping_term_ms), \ - .hold_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 0)), \ - .tap_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 1)), \ + .hold_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label), \ + .tap_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label), \ .quick_tap_ms = DT_INST_PROP(n, quick_tap_ms), \ .global_quick_tap = DT_INST_PROP(n, global_quick_tap), \ .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index c86d732a..e84f1fc8 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -44,13 +44,13 @@ struct behavior_macro_config { struct zmk_behavior_binding bindings[]; }; -#define TAP_MODE DT_LABEL(DT_INST(0, zmk_macro_control_mode_tap)) -#define PRESS_MODE DT_LABEL(DT_INST(0, zmk_macro_control_mode_press)) -#define REL_MODE DT_LABEL(DT_INST(0, zmk_macro_control_mode_release)) +#define TAP_MODE DT_PROP(DT_INST(0, zmk_macro_control_mode_tap), label) +#define PRESS_MODE DT_PROP(DT_INST(0, zmk_macro_control_mode_press), label) +#define REL_MODE DT_PROP(DT_INST(0, zmk_macro_control_mode_release), label) -#define TAP_TIME DT_LABEL(DT_INST(0, zmk_macro_control_tap_time)) -#define WAIT_TIME DT_LABEL(DT_INST(0, zmk_macro_control_wait_time)) -#define WAIT_REL DT_LABEL(DT_INST(0, zmk_macro_pause_for_release)) +#define TAP_TIME DT_PROP(DT_INST(0, zmk_macro_control_tap_time), label) +#define WAIT_TIME DT_PROP(DT_INST(0, zmk_macro_control_wait_time), label) +#define WAIT_REL DT_PROP(DT_INST(0, zmk_macro_pause_for_release), label) #define ZM_IS_NODE_MATCH(a, b) (strcmp(a, b) == 0) #define IS_TAP_MODE(dev) ZM_IS_NODE_MATCH(dev, TAP_MODE) @@ -169,7 +169,7 @@ static const struct behavior_driver_api behavior_macro_driver_api = { #define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, DT_DRV_INST(drv_inst)) #define TRANSFORMED_BEHAVIORS(n) \ - {LISTIFY(DT_PROP_LEN(DT_DRV_INST(n), bindings), BINDING_WITH_COMMA, (,), n)}, + {LISTIFY(DT_PROP_LEN(DT_DRV_INST(n), bindings), BINDING_WITH_COMMA, (, ), n)}, #define MACRO_INST(n) \ static struct behavior_macro_state behavior_macro_state_##n = {}; \ diff --git a/app/src/behaviors/behavior_mod_morph.c b/app/src/behaviors/behavior_mod_morph.c index e5ba346e..d540abd9 100644 --- a/app/src/behaviors/behavior_mod_morph.c +++ b/app/src/behaviors/behavior_mod_morph.c @@ -81,7 +81,7 @@ static int behavior_mod_morph_init(const struct device *dev) { return 0; } #define _TRANSFORM_ENTRY(idx, node) \ { \ - .behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(node, bindings, idx)), \ + .behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(node, bindings, idx), label), \ .param1 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param1), (0), \ (DT_INST_PHA_BY_IDX(node, bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param2), (0), \ diff --git a/app/src/behaviors/behavior_tap_dance.c b/app/src/behaviors/behavior_tap_dance.c index ddb4aeab..fc685124 100644 --- a/app/src/behaviors/behavior_tap_dance.c +++ b/app/src/behaviors/behavior_tap_dance.c @@ -240,7 +240,7 @@ static int behavior_tap_dance_init(const struct device *dev) { #define _TRANSFORM_ENTRY(idx, node) ZMK_KEYMAP_EXTRACT_BINDING(idx, node) #define TRANSFORMED_BINDINGS(node) \ - { LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, (,), DT_DRV_INST(node)) } + { LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, (, ), DT_DRV_INST(node)) } #define KP_INST(n) \ static struct zmk_behavior_binding \ diff --git a/app/src/display/main.c b/app/src/display/main.c index 52fa3c69..e34f8a53 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -12,7 +12,7 @@ #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#include +#include #include #include "theme.h" @@ -21,9 +21,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -#define ZMK_DISPLAY_NAME CONFIG_LV_Z_DISPLAY_DEV_NAME - -static const struct device *display; +static const struct device *display = DEVICE_DT_GET(DT_CHOSEN(zephyr_display)); static bool initialized = false; static lv_obj_t *screen; @@ -103,8 +101,7 @@ static void initialize_theme() { void initialize_display(struct k_work *work) { LOG_DBG(""); - display = device_get_binding(ZMK_DISPLAY_NAME); - if (display == NULL) { + if (!device_is_ready(display)) { LOG_ERR("Failed to find display device"); return; } @@ -165,4 +162,4 @@ int display_event_handler(const zmk_event_t *eh) { ZMK_LISTENER(display, display_event_handler); ZMK_SUBSCRIPTION(display, zmk_activity_state_changed); -#endif /* IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) */ \ No newline at end of file +#endif /* IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) */ diff --git a/app/src/ext_power_generic.c b/app/src/ext_power_generic.c index 654f683f..e35714da 100644 --- a/app/src/ext_power_generic.c +++ b/app/src/ext_power_generic.c @@ -22,14 +22,11 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); struct ext_power_generic_config { - const char *label; - const uint8_t pin; - const uint8_t flags; + const struct gpio_dt_spec control; const uint16_t init_delay_ms; }; struct ext_power_generic_data { - const struct device *gpio; bool status; #if IS_ENABLED(CONFIG_SETTINGS) bool settings_init; @@ -39,10 +36,10 @@ struct ext_power_generic_data { #if IS_ENABLED(CONFIG_SETTINGS) static void ext_power_save_state_work(struct k_work *work) { char setting_path[40]; - const struct device *ext_power = device_get_binding(DT_INST_LABEL(0)); + const struct device *ext_power = DEVICE_DT_GET(DT_DRV_INST(0)); struct ext_power_generic_data *data = ext_power->data; - snprintf(setting_path, 40, "ext_power/state/%s", DT_INST_LABEL(0)); + snprintf(setting_path, 40, "ext_power/state/%s", DT_INST_PROP(0, label)); settings_save_one(setting_path, &data->status, sizeof(data->status)); } @@ -62,7 +59,7 @@ static int ext_power_generic_enable(const struct device *dev) { struct ext_power_generic_data *data = dev->data; const struct ext_power_generic_config *config = dev->config; - if (gpio_pin_set(data->gpio, config->pin, 1)) { + if (gpio_pin_set_dt(&config->control, 1)) { LOG_WRN("Failed to set ext-power control pin"); return -EIO; } @@ -74,7 +71,8 @@ static int ext_power_generic_disable(const struct device *dev) { struct ext_power_generic_data *data = dev->data; const struct ext_power_generic_config *config = dev->config; - if (gpio_pin_set(data->gpio, config->pin, 0)) { + if (gpio_pin_set_dt(&config->control, 0)) { + LOG_WRN("Failed to set ext-power control pin"); LOG_WRN("Failed to clear ext-power control pin"); return -EIO; } @@ -93,7 +91,7 @@ static int ext_power_settings_set(const char *name, size_t len, settings_read_cb const char *next; int rc; - if (settings_name_steq(name, DT_INST_LABEL(0), &next) && !next) { + if (settings_name_steq(name, DT_INST_PROP(0, label), &next) && !next) { const struct device *ext_power = DEVICE_DT_GET(DT_DRV_INST(0)); struct ext_power_generic_data *data = ext_power->data; @@ -106,7 +104,7 @@ static int ext_power_settings_set(const char *name, size_t len, settings_read_cb data->settings_init = true; if (ext_power == NULL) { - LOG_ERR("Unable to retrieve ext_power device: %s", DT_INST_LABEL(0)); + LOG_ERR("Unable to retrieve ext_power device: %s", DT_INST_PROP(0, label)); return -EIO; } @@ -131,13 +129,7 @@ static int ext_power_generic_init(const struct device *dev) { struct ext_power_generic_data *data = dev->data; const struct ext_power_generic_config *config = dev->config; - data->gpio = device_get_binding(config->label); - if (data->gpio == NULL) { - LOG_ERR("Failed to get ext-power control device"); - return -EINVAL; - } - - if (gpio_pin_configure(data->gpio, config->pin, config->flags | GPIO_OUTPUT)) { + if (gpio_pin_configure_dt(&config->control, GPIO_OUTPUT_INACTIVE)) { LOG_ERR("Failed to configure ext-power control pin"); return -EIO; } @@ -190,9 +182,7 @@ static int ext_power_generic_pm_action(const struct device *dev, enum pm_device_ #endif /* CONFIG_PM_DEVICE */ static const struct ext_power_generic_config config = { - .label = DT_INST_GPIO_LABEL(0, control_gpios), - .pin = DT_INST_GPIO_PIN(0, control_gpios), - .flags = DT_INST_GPIO_FLAGS(0, control_gpios), + .control = GPIO_DT_SPEC_INST_GET(0, control_gpios), .init_delay_ms = DT_INST_PROP_OR(0, init_delay_ms, 0)}; static struct ext_power_generic_data data = { diff --git a/app/src/keymap.c b/app/src/keymap.c index 99483592..c4e304d4 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -42,7 +42,7 @@ static uint8_t _zmk_keymap_layer_default = 0; #if ZMK_KEYMAP_HAS_SENSORS #define _TRANSFORM_SENSOR_ENTRY(idx, layer) \ { \ - .behavior_dev = DT_LABEL(DT_PHANDLE_BY_IDX(layer, sensor_bindings, idx)), \ + .behavior_dev = DT_PROP(DT_PHANDLE_BY_IDX(layer, sensor_bindings, idx), label), \ .param1 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(layer, sensor_bindings, idx, param1), (0), \ (DT_PHA_BY_IDX(layer, sensor_bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(layer, sensor_bindings, idx, param2), (0), \ @@ -57,7 +57,8 @@ static uint8_t _zmk_keymap_layer_default = 0; #endif /* ZMK_KEYMAP_HAS_SENSORS */ -#define LAYER_LABEL(node) COND_CODE_0(DT_NODE_HAS_PROP(node, label), (NULL), (DT_LABEL(node))), +#define LAYER_LABEL(node) \ + COND_CODE_0(DT_NODE_HAS_PROP(node, label), (NULL), (DT_PROP(node, label))), // State diff --git a/app/src/kscan.c b/app/src/kscan.c index f9db8b1c..b0713320 100644 --- a/app/src/kscan.c +++ b/app/src/kscan.c @@ -58,8 +58,7 @@ void zmk_kscan_process_msgq(struct k_work *item) { } } -int zmk_kscan_init(char *name) { - const struct device *dev = device_get_binding(name); +int zmk_kscan_init(const struct device *dev) { if (dev == NULL) { LOG_ERR("Failed to get the KSCAN device"); return -EINVAL; diff --git a/app/src/main.c b/app/src/main.c index 8ea67057..3fd6b116 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -17,12 +17,10 @@ LOG_MODULE_REGISTER(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -#define ZMK_KSCAN_DEV DT_LABEL(ZMK_MATRIX_NODE_ID) - void main(void) { LOG_INF("Welcome to ZMK!\n"); - if (zmk_kscan_init(ZMK_KSCAN_DEV) != 0) { + if (zmk_kscan_init(DEVICE_DT_GET(ZMK_MATRIX_NODE_ID)) != 0) { return; } diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 47c3658e..0ed2087a 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -27,8 +27,14 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#define STRIP_LABEL DT_LABEL(DT_CHOSEN(zmk_underglow)) -#define STRIP_NUM_PIXELS DT_PROP(DT_CHOSEN(zmk_underglow), chain_length) +#if !DT_CHOSEN(zmk_underglow) + +#error "A zmk,underglow chosen node must be declared" + +#endif + +#define STRIP_CHOSEN DT_CHOSEN(zmk_underglow) +#define STRIP_NUM_PIXELS DT_PROP(STRIP_CHOSEN, chain_length) #define HUE_MAX 360 #define SAT_MAX 100 @@ -230,13 +236,7 @@ static struct k_work_delayable underglow_save_work; #endif static int zmk_rgb_underglow_init(const struct device *_arg) { - led_strip = device_get_binding(STRIP_LABEL); - if (led_strip) { - LOG_INF("Found LED strip device %s", STRIP_LABEL); - } else { - LOG_ERR("LED strip device %s not found", STRIP_LABEL); - return -EINVAL; - } + led_strip = DEVICE_DT_GET(STRIP_CHOSEN); #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) ext_power = device_get_binding("EXT_POWER"); diff --git a/app/src/sensors.c b/app/src/sensors.c index 9873de4f..efae2bd9 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -65,7 +65,8 @@ static void zmk_sensors_init_item(const char *node, uint8_t i, uint8_t abs_i) { sensor_trigger_set(sensors[i].dev, &sensors[i].trigger, zmk_sensors_trigger_handler); } -#define _SENSOR_INIT(node) zmk_sensors_init_item(DT_LABEL(node), local_index++, absolute_index++); +#define _SENSOR_INIT(node) \ + zmk_sensors_init_item(DT_PROP(node, label), local_index++, absolute_index++); #define SENSOR_INIT(idx, _i) \ COND_CODE_1(DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_BY_IDX(idx), okay), \ (_SENSOR_INIT(ZMK_KEYMAP_SENSORS_BY_IDX(idx))), (absolute_index++;)) diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 5b952dfc..ac073c59 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -377,8 +377,7 @@ static bool split_central_eir_found(struct bt_data *data, void *user_data) { bt_uuid_to_str(&uuid.uuid, uuid_str, sizeof(uuid_str)); bt_uuid_to_str(BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SERVICE_UUID), service_uuid_str, sizeof(service_uuid_str)); - LOG_DBG("UUID %s does not match split UUID: %s", uuid_str, - service_uuid_str); + LOG_DBG("UUID %s does not match split UUID: %s", uuid_str, service_uuid_str); continue; } @@ -433,8 +432,7 @@ static void split_central_device_found(const bt_addr_le_t *addr, int8_t rssi, ui char dev[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(addr, dev, sizeof(dev)); - LOG_DBG("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i", dev, type, ad->len, - rssi); + LOG_DBG("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i", dev, type, ad->len, rssi); /* We're only interested in connectable events */ if (type == BT_GAP_ADV_TYPE_ADV_IND || type == BT_GAP_ADV_TYPE_ADV_DIRECT_IND) { diff --git a/app/src/split/bluetooth/service.c b/app/src/split/bluetooth/service.c index fa4b7718..f7b0d587 100644 --- a/app/src/split/bluetooth/service.c +++ b/app/src/split/bluetooth/service.c @@ -60,8 +60,8 @@ static ssize_t split_svc_run_behavior(struct bt_conn *conn, const struct bt_gatt .param2 = payload->data.param2, .behavior_dev = payload->behavior_dev, }; - LOG_DBG("%s with params %d %d: pressed? %d", binding.behavior_dev, - binding.param1, binding.param2, payload->data.state); + LOG_DBG("%s with params %d %d: pressed? %d", binding.behavior_dev, binding.param1, + binding.param2, payload->data.state); struct zmk_behavior_binding_event event = {.position = payload->data.position, .timestamp = k_uptime_get()}; int err; diff --git a/docs/docs/development/new-behavior.md b/docs/docs/development/new-behavior.md index e65bb296..6d026f2b 100644 --- a/docs/docs/development/new-behavior.md +++ b/docs/docs/development/new-behavior.md @@ -258,8 +258,8 @@ An example of this can be seen below, taking the `#define KP_INST(n)` from the h #define KP_INST(n) \ static struct behavior_hold_tap_config behavior_hold_tap_config_##n = { \ .tapping_term_ms = DT_INST_PROP(n, tapping_term_ms), \ - .hold_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 0)), \ - .tap_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 1)), \ + .hold_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label), \ + .tap_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label), \ .quick_tap_ms = DT_INST_PROP(n, quick_tap_ms), \ .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ .retro_tap = DT_INST_PROP(n, retro_tap), \ From 4ff1a4d3ea98390325e6330802e56381f9e910d5 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 8 Oct 2022 01:52:25 -0400 Subject: [PATCH 175/289] refactor: Move to updated Docker images. --- .devcontainer/Dockerfile | 2 +- .github/workflows/build.yml | 2 +- .github/workflows/hardware-metadata-validation.yml | 2 +- .github/workflows/test.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 21a7fd5a..5b69e180 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/zmkfirmware/zmk-dev-arm:3.0 +FROM docker.io/zmkfirmware/zmk-dev-arm:3.2 COPY .bashrc tmp RUN mv /tmp/.bashrc ~/.bashrc diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6305b741..f472f755 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,7 @@ jobs: if: ${{ always() }} runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-build-arm:3.0 + image: docker.io/zmkfirmware/zmk-build-arm:3.2 needs: compile-matrix strategy: matrix: diff --git a/.github/workflows/hardware-metadata-validation.yml b/.github/workflows/hardware-metadata-validation.yml index c6566feb..4b10a28b 100644 --- a/.github/workflows/hardware-metadata-validation.yml +++ b/.github/workflows/hardware-metadata-validation.yml @@ -29,7 +29,7 @@ jobs: validate-metadata: runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-dev-arm:3.0 + image: docker.io/zmkfirmware/zmk-dev-arm:3.2 steps: - uses: actions/checkout@v3 - name: Install dependencies diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 38c61eea..e8a9d220 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -33,7 +33,7 @@ jobs: test: ${{ fromJSON(needs.collect-tests.outputs.test-dirs) }} runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-build-arm:3.0 + image: docker.io/zmkfirmware/zmk-build-arm:3.2 steps: - name: Checkout uses: actions/checkout@v3 From 31f664ffec0e90fe2123e1dfcaca4b34654d4714 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 23 Dec 2021 23:45:29 -0500 Subject: [PATCH 176/289] fix(boards): Base config/overlay for rp2040 boards Baseline config and overlay for the following: * `rpi_pico` * `adafruit_kb2040` * `sparkfun_pro_micro_rp2040` * `adafruit_qt_py_rp2040` * `seeeduino_xiao_rp2040` * `boardsource_blok` * `01space_rp2040_042lcd` Co-authored-by: Joel Spadin --- app/boards/01space_rp2040_042lcd.conf | 6 ++++++ app/boards/01space_rp2040_042lcd.overlay | 9 +++++++++ app/boards/adafruit_kb2040.conf | 4 ++++ app/boards/adafruit_kb2040.overlay | 9 +++++++++ app/boards/adafruit_qt_py_rp2040.conf | 4 ++++ app/boards/adafruit_qt_py_rp2040.overlay | 9 +++++++++ .../adafruit_kb2040/adafruit_kb2040.zmk.yml | 9 +++++++++ .../adafruit_qt_py_rp2040.zmk.yml | 9 +++++++++ .../boardsource_blok/boardsource_blok.zmk.yml | 9 +++++++++ .../seeeduino_xiao_rp2040.zmk.yml | 9 +++++++++ .../sparkfun_pro_micro_rp2040.zmk.yml | 9 +++++++++ app/boards/boardsource_blok.conf | 4 ++++ app/boards/boardsource_blok.overlay | 9 +++++++++ app/boards/rpi_pico.conf | 5 +++++ app/boards/rpi_pico.overlay | 8 ++++++++ app/boards/seeeduino_xiao_rp2040.conf | 4 ++++ app/boards/seeeduino_xiao_rp2040.overlay | 9 +++++++++ app/boards/sparkfun_pro_micro_rp2040.conf | 4 ++++ app/boards/sparkfun_pro_micro_rp2040.overlay | 9 +++++++++ app/boards/usb_console.dtsi | 20 +++++++++++++++++++ 20 files changed, 158 insertions(+) create mode 100644 app/boards/01space_rp2040_042lcd.conf create mode 100644 app/boards/01space_rp2040_042lcd.overlay create mode 100644 app/boards/adafruit_kb2040.conf create mode 100644 app/boards/adafruit_kb2040.overlay create mode 100644 app/boards/adafruit_qt_py_rp2040.conf create mode 100644 app/boards/adafruit_qt_py_rp2040.overlay create mode 100644 app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml create mode 100644 app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml create mode 100644 app/boards/arm/boardsource_blok/boardsource_blok.zmk.yml create mode 100644 app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml create mode 100644 app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml create mode 100644 app/boards/boardsource_blok.conf create mode 100644 app/boards/boardsource_blok.overlay create mode 100644 app/boards/rpi_pico.conf create mode 100644 app/boards/rpi_pico.overlay create mode 100644 app/boards/seeeduino_xiao_rp2040.conf create mode 100644 app/boards/seeeduino_xiao_rp2040.overlay create mode 100644 app/boards/sparkfun_pro_micro_rp2040.conf create mode 100644 app/boards/sparkfun_pro_micro_rp2040.overlay create mode 100644 app/boards/usb_console.dtsi diff --git a/app/boards/01space_rp2040_042lcd.conf b/app/boards/01space_rp2040_042lcd.conf new file mode 100644 index 00000000..c520a3b7 --- /dev/null +++ b/app/boards/01space_rp2040_042lcd.conf @@ -0,0 +1,6 @@ +CONFIG_ZMK_DISPLAY=y +CONFIG_LV_FONT_UNSCII_8=n +CONFIG_ZMK_USB=y +CONFIG_I2C=y +CONFIG_I2C_DW=y +CONFIG_LV_Z_VDB_SIZE=50 diff --git a/app/boards/01space_rp2040_042lcd.overlay b/app/boards/01space_rp2040_042lcd.overlay new file mode 100644 index 00000000..d89e53f4 --- /dev/null +++ b/app/boards/01space_rp2040_042lcd.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&xiao_serial { status = "disabled"; }; diff --git a/app/boards/adafruit_kb2040.conf b/app/boards/adafruit_kb2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/adafruit_kb2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/adafruit_kb2040.overlay b/app/boards/adafruit_kb2040.overlay new file mode 100644 index 00000000..b14e0d04 --- /dev/null +++ b/app/boards/adafruit_kb2040.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&pro_micro_serial { status = "disabled"; }; diff --git a/app/boards/adafruit_qt_py_rp2040.conf b/app/boards/adafruit_qt_py_rp2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/adafruit_qt_py_rp2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/adafruit_qt_py_rp2040.overlay b/app/boards/adafruit_qt_py_rp2040.overlay new file mode 100644 index 00000000..d89e53f4 --- /dev/null +++ b/app/boards/adafruit_qt_py_rp2040.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&xiao_serial { status = "disabled"; }; diff --git a/app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml b/app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml new file mode 100644 index 00000000..c8973f5c --- /dev/null +++ b/app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: adafruit_kb2040 +name: Adafruit KB2040 +type: board +arch: arm +outputs: + - usb +url: https://www.adafruit.com/product/5302 +exposes: [pro_micro] diff --git a/app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml b/app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml new file mode 100644 index 00000000..9b9c1450 --- /dev/null +++ b/app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: adafruit_qt_py_rp2040 +name: Adafruit QT Py RP2040 +type: board +arch: arm +outputs: + - usb +url: https://www.adafruit.com/product/4900 +exposes: [seeed_xiao] diff --git a/app/boards/arm/boardsource_blok/boardsource_blok.zmk.yml b/app/boards/arm/boardsource_blok/boardsource_blok.zmk.yml new file mode 100644 index 00000000..a6e91afd --- /dev/null +++ b/app/boards/arm/boardsource_blok/boardsource_blok.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: boardsource_blok +name: BoardSource blok +type: board +arch: arm +outputs: + - usb +url: https://peg.software/docs/blok +exposes: [pro_micro] diff --git a/app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml b/app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml new file mode 100644 index 00000000..77d8d664 --- /dev/null +++ b/app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: seeeduino_xiao_rp2040 +name: Seeeduino XIAO RP2040 +type: board +arch: arm +outputs: + - usb +url: https://wiki.seeedstudio.com/XIAO-RP2040/ +exposes: [seeed_xiao] diff --git a/app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml b/app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml new file mode 100644 index 00000000..26a2ca64 --- /dev/null +++ b/app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: sparkfun_pro_micro_rp2040 +name: SparkFun Pro Micro RP2040 +type: board +arch: arm +outputs: + - usb +url: https://www.sparkfun.com/products/18288 +exposes: [pro_micro] diff --git a/app/boards/boardsource_blok.conf b/app/boards/boardsource_blok.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/boardsource_blok.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/boardsource_blok.overlay b/app/boards/boardsource_blok.overlay new file mode 100644 index 00000000..b14e0d04 --- /dev/null +++ b/app/boards/boardsource_blok.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&pro_micro_serial { status = "disabled"; }; diff --git a/app/boards/rpi_pico.conf b/app/boards/rpi_pico.conf new file mode 100644 index 00000000..f0db8ed1 --- /dev/null +++ b/app/boards/rpi_pico.conf @@ -0,0 +1,5 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y diff --git a/app/boards/rpi_pico.overlay b/app/boards/rpi_pico.overlay new file mode 100644 index 00000000..efc8e080 --- /dev/null +++ b/app/boards/rpi_pico.overlay @@ -0,0 +1,8 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + diff --git a/app/boards/seeeduino_xiao_rp2040.conf b/app/boards/seeeduino_xiao_rp2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/seeeduino_xiao_rp2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/seeeduino_xiao_rp2040.overlay b/app/boards/seeeduino_xiao_rp2040.overlay new file mode 100644 index 00000000..d89e53f4 --- /dev/null +++ b/app/boards/seeeduino_xiao_rp2040.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&xiao_serial { status = "disabled"; }; diff --git a/app/boards/sparkfun_pro_micro_rp2040.conf b/app/boards/sparkfun_pro_micro_rp2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/sparkfun_pro_micro_rp2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/sparkfun_pro_micro_rp2040.overlay b/app/boards/sparkfun_pro_micro_rp2040.overlay new file mode 100644 index 00000000..b14e0d04 --- /dev/null +++ b/app/boards/sparkfun_pro_micro_rp2040.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&pro_micro_serial { status = "disabled"; }; diff --git a/app/boards/usb_console.dtsi b/app/boards/usb_console.dtsi new file mode 100644 index 00000000..4ce59408 --- /dev/null +++ b/app/boards/usb_console.dtsi @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + + +/ { + chosen { + zephyr,console = &cdc_acm_uart; + }; +}; + +&usbd { + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + From 2f9bc2f1f7b2ad0e0662ef53f5479b72c0f84d02 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 13 Jul 2022 23:34:32 -0400 Subject: [PATCH 177/289] fix(logging): Disable USB driver logging. When enabling our high level USB logging, disable the USB driver logging itself entirely, to avoid logging in the driver causing errors when USB isn't up yet to send the logs. --- app/Kconfig | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index cf2cc6b3..01817107 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -419,9 +419,16 @@ if ZMK_USB_LOGGING config ZMK_LOG_LEVEL default 4 +choice USB_CDC_ACM_LOG_LEVEL_CHOICE + default USB_CDC_ACM_LOG_LEVEL_OFF +endchoice + +choice USB_DRIVER_LOG_LEVEL_CHOICE + default USB_DRIVER_LOG_LEVEL_OFF + +endchoice + # We do this to avoid log loop where logging to USB generates more log messages. -config USB_CDC_ACM_LOG_LEVEL - default 1 config USB_CDC_ACM_RINGBUF_SIZE default 1024 From a6ebdb7180f5b49d0603de91ca899ea789af0365 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 15 Jul 2022 11:14:51 -0400 Subject: [PATCH 178/289] fix(kscan): Default wait between outputs on RP2040. --- app/drivers/kscan/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/app/drivers/kscan/Kconfig b/app/drivers/kscan/Kconfig index 51546006..216651a1 100644 --- a/app/drivers/kscan/Kconfig +++ b/app/drivers/kscan/Kconfig @@ -44,6 +44,7 @@ config ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS int "Ticks to wait between each output when scanning" + default 1 if SOC_RP2040 default 0 help When iterating over each output to drive it active, read inputs, then set From c3d06b22c8b501fc69f6c2c140c10c95f989c76b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 3 Aug 2022 20:24:45 -0400 Subject: [PATCH 179/289] fix(core): Bump system work queue stack on RP2040. --- app/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Kconfig b/app/Kconfig index 01817107..824d2700 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -121,6 +121,7 @@ menuconfig ZMK_BLE if ZMK_BLE config SYSTEM_WORKQUEUE_STACK_SIZE + default 4096 if SOC_RP2040 default 2048 config ZMK_BLE_THREAD_STACK_SIZE From 198daaf524a2c1223393922195d8f1004964ae2e Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 20 Oct 2022 02:21:25 -0400 Subject: [PATCH 180/289] fix(shields): Don't try to disable xiao_i2c on Hummingbird. --- app/boards/shields/hummingbird/hummingbird.overlay | 1 - 1 file changed, 1 deletion(-) diff --git a/app/boards/shields/hummingbird/hummingbird.overlay b/app/boards/shields/hummingbird/hummingbird.overlay index 327200a8..4af9cbdf 100644 --- a/app/boards/shields/hummingbird/hummingbird.overlay +++ b/app/boards/shields/hummingbird/hummingbird.overlay @@ -53,5 +53,4 @@ }; &xiao_spi { status = "disabled"; }; -&xiao_i2c { status = "disabled"; }; &xiao_serial { status = "disabled"; }; From 518f9a550f5016dad4e8d96ed68f1c4e6a8ccb93 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 20 Oct 2022 17:23:43 +0000 Subject: [PATCH 181/289] fix(underglow): Use `DT_HAS_CHOSEN` properly. --- app/src/rgb_underglow.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 0ed2087a..048b58b4 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -27,7 +27,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#if !DT_CHOSEN(zmk_underglow) +#if !DT_HAS_CHOSEN(zmk_underglow) #error "A zmk,underglow chosen node must be declared" From 1493620bf76e05d8419ceec37681b69ca024a871 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 5 Nov 2022 00:35:58 -0400 Subject: [PATCH 182/289] refactor(boards): Move to pinctrl. --- .../bluemicro840/bluemicro840_v1-pinctrl.dtsi | 39 ++++++++++ .../arm/bluemicro840/bluemicro840_v1.dts | 13 ++-- .../bluemicro840/bluemicro840_v1_defconfig | 4 +- .../arm/corneish_zen/corneish_zen_v2_left.dts | 27 ++++++- .../corneish_zen_v2_left_defconfig | 3 + .../corneish_zen/corneish_zen_v2_right.dts | 25 +++++- .../corneish_zen_v2_right_defconfig | 3 + app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi | 39 ++++++++++ app/boards/arm/mikoto/mikoto_520.dts | 12 ++- app/boards/arm/mikoto/mikoto_520_defconfig | 2 + app/boards/arm/nice60/nice60-pinctrl.dtsi | 12 +++ app/boards/arm/nice60/nice60.dts | 7 +- app/boards/arm/nice60/nice60_defconfig | 2 + .../arm/nice_nano/nice_nano-pinctrl.dtsi | 39 ++++++++++ app/boards/arm/nice_nano/nice_nano.dtsi | 12 ++- app/boards/arm/nice_nano/nice_nano_defconfig | 5 +- .../arm/nice_nano/nice_nano_v2_defconfig | 5 +- .../nrfmicro/nrfmicro-flipped-pinctrl.dtsi | 39 ++++++++++ app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi | 39 ++++++++++ app/boards/arm/nrfmicro/nrfmicro_11.dts | 13 ++-- app/boards/arm/nrfmicro/nrfmicro_11_defconfig | 2 + .../arm/nrfmicro/nrfmicro_11_flipped.dts | 15 ++-- .../nrfmicro/nrfmicro_11_flipped_defconfig | 2 + app/boards/arm/nrfmicro/nrfmicro_13.dts | 13 ++-- app/boards/arm/nrfmicro/nrfmicro_13_52833.dts | 13 ++-- .../arm/nrfmicro/nrfmicro_13_52833_defconfig | 2 + app/boards/arm/nrfmicro/nrfmicro_13_defconfig | 2 + app/boards/arm/pillbug/pillbug-pinctrl.dtsi | 56 +++++++++++++ app/boards/arm/pillbug/pillbug.dts | 20 +++-- .../arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi | 39 ++++++++++ app/boards/arm/puchi_ble/puchi_ble_v1.dts | 11 ++- .../arm/puchi_ble/puchi_ble_v1_defconfig | 3 + .../shields/chalice/boards/nice_nano.overlay | 25 ++++-- .../chalice/boards/nice_nano_v2.overlay | 25 ++++-- .../shields/corne/boards/nice_nano.overlay | 28 +++++-- .../shields/corne/boards/nice_nano_v2.overlay | 47 +++++++++++ .../elephant42/boards/nice_nano.overlay | 47 +++++++++++ .../elephant42/boards/nice_nano_v2.overlay | 29 +++++-- .../eternal_keypad/boards/nice_nano.overlay | 47 +++++++++++ .../boards/nice_nano_v2.overlay | 35 +++++---- .../shields/helix/boards/nice_nano.overlay | 65 +++++++++------- .../shields/helix/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/jorne/boards/nice_nano.overlay | 27 +++++-- .../shields/jorne/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/kyria/boards/nice_nano.overlay | 24 +++++- .../shields/kyria/boards/nice_nano_v2.overlay | 23 +++++- .../shields/kyria/boards/nrfmicro_11.overlay | 25 ++++-- .../kyria/boards/nrfmicro_11_flipped.overlay | 24 +++++- .../shields/kyria/boards/nrfmicro_13.overlay | 24 +++++- .../shields/lily58/boards/nice_nano.overlay | 32 +++++--- .../lily58/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/microdox/boards/nice_nano.overlay | 35 +++++---- .../microdox/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/murphpad/boards/nice_nano.overlay | 33 +++++--- .../murphpad/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/nibble/boards/nice_nano.overlay | 32 +++++--- .../nibble/boards/nice_nano_v2.overlay | 47 +++++++++++ .../boards/bluemicro840_v1.overlay | 16 +++- .../boards/mikoto_520.overlay | 15 +++- .../boards/nice_nano.overlay | 15 +++- .../boards/nice_nano_v2.overlay | 15 +++- .../boards/nrfmicro_11.overlay | 16 +++- .../boards/nrfmicro_11_flipped.overlay | 15 +++- .../boards/nrfmicro_13.overlay | 15 +++- .../boards/puchi_ble_v1.overlay | 15 +++- .../shields/redox/boards/nice_nano.overlay | 31 +++++--- .../shields/redox/boards/nice_nano_v2.overlay | 47 +++++++++++ .../reviung41/boards/nice_nano.overlay | 26 +++++-- .../reviung41/boards/nice_nano_v2.overlay | 47 +++++++++++ .../romac_plus/boards/nice_nano.overlay | 78 +++++++++++-------- .../romac_plus/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/snap/boards/nice_nano.overlay | 32 +++++--- .../shields/snap/boards/nice_nano_v2.overlay | 32 +++++--- .../boards/nice_nano.overlay | 26 +++++-- .../boards/nice_nano_v2.overlay | 26 +++++-- .../boards/nice_nano.overlay | 24 +++++- .../boards/nice_nano_v2.overlay | 23 +++++- .../boards/nice_nano.overlay | 26 +++++-- .../boards/nice_nano_v2.overlay | 26 +++++-- .../shields/tg4x/boards/nice_nano.overlay | 32 +++++--- .../shields/tg4x/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/tidbit/boards/nice_nano.overlay | 32 +++++--- .../tidbit/boards/nice_nano_v2.overlay | 47 +++++++++++ .../two_percent_milk/boards/nice_nano.overlay | 26 +++++-- .../boards/nice_nano_v2.overlay | 26 +++++-- .../boards/nrfmicro_11.overlay | 27 +++++-- .../boards/nrfmicro_11_flipped.overlay | 26 +++++-- .../boards/nrfmicro_13.overlay | 26 +++++-- docs/docs/features/underglow.md | 28 ++++--- 89 files changed, 1981 insertions(+), 376 deletions(-) create mode 100644 app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi create mode 100644 app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi create mode 100644 app/boards/arm/nice60/nice60-pinctrl.dtsi create mode 100644 app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi create mode 100644 app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi create mode 100644 app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi create mode 100644 app/boards/arm/pillbug/pillbug-pinctrl.dtsi create mode 100644 app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi create mode 100644 app/boards/shields/corne/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/elephant42/boards/nice_nano.overlay create mode 100644 app/boards/shields/eternal_keypad/boards/nice_nano.overlay create mode 100644 app/boards/shields/helix/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/jorne/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/lily58/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/microdox/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/murphpad/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/nibble/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/redox/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/reviung41/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/romac_plus/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/tg4x/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/tidbit/boards/nice_nano_v2.overlay diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi new file mode 100644 index 00000000..18b90f21 --- /dev/null +++ b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1.dts b/app/boards/arm/bluemicro840/bluemicro840_v1.dts index 29bf0f8d..c636ca31 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1.dts +++ b/app/boards/arm/bluemicro840/bluemicro840_v1.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins.dtsi" +#include "bluemicro840_v1-pinctrl.dtsi" / { model = "BlueMicro840_V1"; @@ -62,15 +63,17 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <17>; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig b/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig index b8e4e805..99d51a94 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig +++ b/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_BLUEMICRO840_V1=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y @@ -18,4 +20,4 @@ CONFIG_NVS=y CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y \ No newline at end of file +CONFIG_FLASH_MAP=y diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index 2d8f0a81..4dbdaef5 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -53,12 +53,31 @@ }; +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; + &spi0 { status = "okay"; compatible = "nordic,nrf-spim"; - sck-pin = <27>; - mosi-pin = <8>; - miso-pin = <22>; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>; epd: il0323@0 { @@ -75,4 +94,4 @@ cdi = <0xd2>; tcon = <0x22>; }; -}; \ No newline at end of file +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig index 42e27037..305ce72e 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -13,6 +13,9 @@ CONFIG_ZMK_DISPLAY=y # Enable MPU CONFIG_ARM_MPU=y +# enable pinctrl +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts index 097872f5..52439e4f 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts @@ -60,12 +60,31 @@ col-offset = <6>; }; +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; + &spi0 { status = "okay"; compatible = "nordic,nrf-spim"; - sck-pin = <20>; - mosi-pin = <24>; - miso-pin = <27>; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; epd: il0323@0 { diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig index e9b36f2e..0fd0fd6c 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -13,6 +13,9 @@ CONFIG_ZMK_DISPLAY=y # Enable MPU CONFIG_ARM_MPU=y +# enable pinctrl +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi b/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi new file mode 100644 index 00000000..4a8ff82c --- /dev/null +++ b/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/mikoto/mikoto_520.dts b/app/boards/arm/mikoto/mikoto_520.dts index 49d9d6be..3fff0835 100644 --- a/app/boards/arm/mikoto/mikoto_520.dts +++ b/app/boards/arm/mikoto/mikoto_520.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins.dtsi" +#include "mikoto_520-pinctrl.dtsi" / { model = "mikoto"; @@ -62,14 +63,17 @@ &i2c0 { compatible = "nordic,nrf-twi"; - sda-pin = <17>; - scl-pin = <20>; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <8>; - rx-pin = <4>; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/mikoto/mikoto_520_defconfig b/app/boards/arm/mikoto/mikoto_520_defconfig index d5fd8958..c755633e 100644 --- a/app/boards/arm/mikoto/mikoto_520_defconfig +++ b/app/boards/arm/mikoto/mikoto_520_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_MIKOTO_520=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/nice60/nice60-pinctrl.dtsi b/app/boards/arm/nice60/nice60-pinctrl.dtsi new file mode 100644 index 00000000..aced76b4 --- /dev/null +++ b/app/boards/arm/nice60/nice60-pinctrl.dtsi @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = ; + }; + }; +}; diff --git a/app/boards/arm/nice60/nice60.dts b/app/boards/arm/nice60/nice60.dts index bb058da8..c982f88e 100644 --- a/app/boards/arm/nice60/nice60.dts +++ b/app/boards/arm/nice60/nice60.dts @@ -10,6 +10,8 @@ #include #include +#include "nice60-pinctrl.dtsi" + / { model = "nice!60"; compatible = "nice,60"; @@ -110,10 +112,9 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) R &spi0 { compatible = "nordic,nrf-spim"; /* Cannot be used together with i2c0. */ + pinctrl-0 = <&spi0_default>; + pinctrl-names = "default"; status = "okay"; - sck-pin = <12>; - mosi-pin = <27>; - miso-pin = <13>; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; diff --git a/app/boards/arm/nice60/nice60_defconfig b/app/boards/arm/nice60/nice60_defconfig index 9fac3a30..48936a04 100644 --- a/app/boards/arm/nice60/nice60_defconfig +++ b/app/boards/arm/nice60/nice60_defconfig @@ -8,6 +8,8 @@ CONFIG_BOARD_NICE60=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi b/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi new file mode 100644 index 00000000..18b90f21 --- /dev/null +++ b/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/nice_nano/nice_nano.dtsi b/app/boards/arm/nice_nano/nice_nano.dtsi index 6c9d081c..ad5ef278 100644 --- a/app/boards/arm/nice_nano/nice_nano.dtsi +++ b/app/boards/arm/nice_nano/nice_nano.dtsi @@ -5,6 +5,7 @@ */ #include +#include "nice_nano-pinctrl.dtsi" #include "arduino_pro_micro_pins.dtsi" / { @@ -45,14 +46,17 @@ &i2c0 { compatible = "nordic,nrf-twi"; - sda-pin = <17>; - scl-pin = <20>; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/nice_nano/nice_nano_defconfig b/app/boards/arm/nice_nano/nice_nano_defconfig index 1ff025ec..a837b7d2 100644 --- a/app/boards/arm/nice_nano/nice_nano_defconfig +++ b/app/boards/arm/nice_nano/nice_nano_defconfig @@ -10,6 +10,9 @@ CONFIG_ARM_MPU=y # enable GPIO CONFIG_GPIO=y +# Use pinctrl +CONFIG_PINCTRL=y + CONFIG_USE_DT_CODE_PARTITION=y CONFIG_BUILD_OUTPUT_UF2=y @@ -18,4 +21,4 @@ CONFIG_NVS=y CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y \ No newline at end of file +CONFIG_FLASH_MAP=y diff --git a/app/boards/arm/nice_nano/nice_nano_v2_defconfig b/app/boards/arm/nice_nano/nice_nano_v2_defconfig index 206e51c2..667cf71a 100644 --- a/app/boards/arm/nice_nano/nice_nano_v2_defconfig +++ b/app/boards/arm/nice_nano/nice_nano_v2_defconfig @@ -7,6 +7,9 @@ CONFIG_BOARD_NICE_NANO_V2=y # Enable MPU CONFIG_ARM_MPU=y +# Use pinctrl +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y @@ -18,4 +21,4 @@ CONFIG_NVS=y CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y \ No newline at end of file +CONFIG_FLASH_MAP=y diff --git a/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi b/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi new file mode 100644 index 00000000..a54c2598 --- /dev/null +++ b/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi b/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi new file mode 100644 index 00000000..a5385690 --- /dev/null +++ b/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11.dts b/app/boards/arm/nrfmicro/nrfmicro_11.dts index 82951b5f..48186ac9 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins.dtsi" +#include "nrfmicro-pinctrl.dtsi" / { model = "nrfmicro"; @@ -47,15 +48,17 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <17>; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_defconfig b/app/boards/arm/nrfmicro/nrfmicro_11_defconfig index 3f6a447d..b51929b0 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_11_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_NRFMICRO_11=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts index fdfba507..656873a0 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins_flipped.dtsi" +#include "nrfmicro-flipped-pinctrl.dtsi" / { model = "nrfmicro"; @@ -47,15 +48,17 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <30>; - scl-pin = <31>; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { @@ -105,4 +108,4 @@ reg = <0x000f4000 0x0000c000>; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig b/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig index efe924f2..335a2d75 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_NRFMICRO_11_FLIPPED=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/nrfmicro/nrfmicro_13.dts b/app/boards/arm/nrfmicro/nrfmicro_13.dts index a0f74170..9fb68562 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins.dtsi" +#include "nrfmicro-pinctrl.dtsi" / { model = "nrfmicro"; @@ -60,15 +61,17 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <17>; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts index 7f833ff5..9ade364d 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins_52833.dtsi" +#include "nrfmicro-pinctrl.dtsi" / { model = "nrfmicro"; @@ -60,15 +61,17 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <17>; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig b/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig index 112e0344..4af1ff86 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_NRFMICRO_13_52833=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_defconfig b/app/boards/arm/nrfmicro/nrfmicro_13_defconfig index 06758784..43ba40e2 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_13_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_NRFMICRO_13=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/pillbug/pillbug-pinctrl.dtsi b/app/boards/arm/pillbug/pillbug-pinctrl.dtsi new file mode 100644 index 00000000..8751bc4b --- /dev/null +++ b/app/boards/arm/pillbug/pillbug-pinctrl.dtsi @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + spi1_default: spi1_default { + group1 { + psels = , + , + ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/pillbug/pillbug.dts b/app/boards/arm/pillbug/pillbug.dts index 85c5cccd..c1330319 100644 --- a/app/boards/arm/pillbug/pillbug.dts +++ b/app/boards/arm/pillbug/pillbug.dts @@ -7,6 +7,7 @@ /dts-v1/; #include +#include "pillbug-pinctrl.dtsi" #include "blackpill_pins.dtsi" / { @@ -63,22 +64,25 @@ &i2c0 { compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <13>; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; -&spi1{ +&spi1 { status = "disabled"; compatible = "nordic,nrf-spim"; - sck-pin = <40>; - mosi-pin = <11>; - miso-pin = <26>; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi b/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi new file mode 100644 index 00000000..a5385690 --- /dev/null +++ b/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1.dts b/app/boards/arm/puchi_ble/puchi_ble_v1.dts index e324cccc..a8f25c37 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1.dts +++ b/app/boards/arm/puchi_ble/puchi_ble_v1.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins.dtsi" +#include "puchi_ble_v1-pinctrl.dtsi" / { model = "puchi_ble"; @@ -61,14 +62,16 @@ &i2c0 { compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <17>; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig b/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig index e32886d0..1adb9217 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig +++ b/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig @@ -11,6 +11,9 @@ CONFIG_ARM_MPU=y # enable GPIO CONFIG_GPIO=y +# Use pinctrl +CONFIG_PINCTRL=y + CONFIG_USE_DT_CODE_PARTITION=y CONFIG_BUILD_OUTPUT_UF2=y diff --git a/app/boards/shields/chalice/boards/nice_nano.overlay b/app/boards/shields/chalice/boards/nice_nano.overlay index 5a74582a..172859ae 100644 --- a/app/boards/shields/chalice/boards/nice_nano.overlay +++ b/app/boards/shields/chalice/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <14>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/chalice/boards/nice_nano_v2.overlay b/app/boards/shields/chalice/boards/nice_nano_v2.overlay index 5a74582a..172859ae 100644 --- a/app/boards/shields/chalice/boards/nice_nano_v2.overlay +++ b/app/boards/shields/chalice/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <14>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/corne/boards/nice_nano.overlay b/app/boards/shields/corne/boards/nice_nano.overlay index e5f84063..172859ae 100644 --- a/app/boards/shields/corne/boards/nice_nano.overlay +++ b/app/boards/shields/corne/boards/nice_nano.overlay @@ -1,24 +1,38 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; - label = "SK6812mini"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* There are per-key RGB, but the first 6 are underglow */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/corne/boards/nice_nano_v2.overlay b/app/boards/shields/corne/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/corne/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/elephant42/boards/nice_nano.overlay b/app/boards/shields/elephant42/boards/nice_nano.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/elephant42/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay index 87c8da21..172859ae 100644 --- a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay @@ -1,23 +1,38 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; label = "WS2812"; + /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <27>; /* There are per-key RGB and the LAST 6 are underglow */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; @@ -29,4 +44,4 @@ chosen { zmk,underglow = &led_strip; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay index 61950d18..172859ae 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay +++ b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay @@ -1,32 +1,41 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; - label = "SK6812mini"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <8>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/helix/boards/nice_nano.overlay b/app/boards/shields/helix/boards/nice_nano.overlay index da7deed1..172859ae 100644 --- a/app/boards/shields/helix/boards/nice_nano.overlay +++ b/app/boards/shields/helix/boards/nice_nano.overlay @@ -1,38 +1,47 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + compatible = "nordic,nrf-spim"; + status = "okay"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* WS2812 */ - chain-length = <32>; /* number of LEDs */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/helix/boards/nice_nano_v2.overlay b/app/boards/shields/helix/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/helix/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/jorne/boards/nice_nano.overlay b/app/boards/shields/jorne/boards/nice_nano.overlay index 2864fd60..172859ae 100644 --- a/app/boards/shields/jorne/boards/nice_nano.overlay +++ b/app/boards/shields/jorne/boards/nice_nano.overlay @@ -1,13 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -18,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* There are per-key RGB, but the first 6 are underglow */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/jorne/boards/nice_nano_v2.overlay b/app/boards/shields/jorne/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/jorne/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/kyria/boards/nice_nano.overlay b/app/boards/shields/kyria/boards/nice_nano.overlay index b774b4ba..172859ae 100644 --- a/app/boards/shields/kyria/boards/nice_nano.overlay +++ b/app/boards/shields/kyria/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -20,6 +35,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/kyria/boards/nice_nano_v2.overlay b/app/boards/shields/kyria/boards/nice_nano_v2.overlay index b1e7fbb5..172859ae 100644 --- a/app/boards/shields/kyria/boards/nice_nano_v2.overlay +++ b/app/boards/shields/kyria/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; diff --git a/app/boards/shields/kyria/boards/nrfmicro_11.overlay b/app/boards/shields/kyria/boards/nrfmicro_11.overlay index 1cff5f77..172859ae 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_11.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -20,6 +35,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; @@ -29,4 +45,3 @@ zmk,underglow = &led_strip; }; }; - diff --git a/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay index 80d0c898..172859ae 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -20,6 +35,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/kyria/boards/nrfmicro_13.overlay b/app/boards/shields/kyria/boards/nrfmicro_13.overlay index 80d0c898..172859ae 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_13.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_13.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -20,6 +35,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/lily58/boards/nice_nano.overlay b/app/boards/shields/lily58/boards/nice_nano.overlay index 69bfffa0..172859ae 100644 --- a/app/boards/shields/lily58/boards/nice_nano.overlay +++ b/app/boards/shields/lily58/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <5>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/lily58/boards/nice_nano_v2.overlay b/app/boards/shields/lily58/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/lily58/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/microdox/boards/nice_nano.overlay b/app/boards/shields/microdox/boards/nice_nano.overlay index 360e7098..172859ae 100644 --- a/app/boards/shields/microdox/boards/nice_nano.overlay +++ b/app/boards/shields/microdox/boards/nice_nano.overlay @@ -1,32 +1,41 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; - label = "SK6812mini"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* There are per-key RGB, but the first 6 are underglow */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/microdox/boards/nice_nano_v2.overlay b/app/boards/shields/microdox/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/microdox/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/murphpad/boards/nice_nano.overlay b/app/boards/shields/murphpad/boards/nice_nano.overlay index d7cdcff7..89ba4f9d 100644 --- a/app/boards/shields/murphpad/boards/nice_nano.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2021 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ +#include - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <31>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <8>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; @@ -35,4 +44,4 @@ chosen { zmk,underglow = &led_strip; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..89ba4f9d --- /dev/null +++ b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/nibble/boards/nice_nano.overlay b/app/boards/shields/nibble/boards/nice_nano.overlay index 0a08c770..ece699e2 100644 --- a/app/boards/shields/nibble/boards/nice_nano.overlay +++ b/app/boards/shields/nibble/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <11>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <10>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/nibble/boards/nice_nano_v2.overlay b/app/boards/shields/nibble/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..ece699e2 --- /dev/null +++ b/app/boards/shields/nibble/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay index 9d9ab734..27d76b07 100644 --- a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay @@ -4,11 +4,21 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <17>; - mosi-pin = <15>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay index 9f6fad1c..fc2667f3 100644 --- a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay +++ b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <20>; - mosi-pin = <17>; - miso-pin = <5>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay index 3a0ad462..c9a0e788 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <20>; - mosi-pin = <17>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay index 3a0ad462..0068b5b2 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <20>; - mosi-pin = <17>; - miso-pin = <25>; + pinctrl-0 = <&spi0_default>; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay index 9d9ab734..27d76b07 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay @@ -4,11 +4,21 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <17>; - mosi-pin = <15>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay index 7b12c252..5074d0f9 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <31>; - mosi-pin = <30>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay index 9d9ab734..9a4f3170 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <17>; - mosi-pin = <15>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay index 9d9ab734..9a4f3170 100644 --- a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <17>; - mosi-pin = <15>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/redox/boards/nice_nano.overlay b/app/boards/shields/redox/boards/nice_nano.overlay index d67e46f9..172859ae 100644 --- a/app/boards/shields/redox/boards/nice_nano.overlay +++ b/app/boards/shields/redox/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2021 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ +#include - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <5>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/redox/boards/nice_nano_v2.overlay b/app/boards/shields/redox/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/redox/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/reviung41/boards/nice_nano.overlay b/app/boards/shields/reviung41/boards/nice_nano.overlay index b52faac6..172859ae 100644 --- a/app/boards/shields/reviung41/boards/nice_nano.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <11>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/romac_plus/boards/nice_nano.overlay b/app/boards/shields/romac_plus/boards/nice_nano.overlay index dc686af8..172859ae 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano.overlay @@ -1,31 +1,47 @@ -#include - -&spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; \ No newline at end of file +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/snap/boards/nice_nano.overlay b/app/boards/shields/snap/boards/nice_nano.overlay index f869db5d..15c5801e 100644 --- a/app/boards/shields/snap/boards/nice_nano.overlay +++ b/app/boards/shields/snap/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <10>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <5>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/snap/boards/nice_nano_v2.overlay b/app/boards/shields/snap/boards/nice_nano_v2.overlay index f869db5d..15c5801e 100644 --- a/app/boards/shields/snap/boards/nice_nano_v2.overlay +++ b/app/boards/shields/snap/boards/nice_nano_v2.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <10>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <5>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay index 0087208c..172859ae 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay index 0087208c..172859ae 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay index eb838b24..4a6b717d 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay @@ -1,12 +1,28 @@ #include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay index eb838b24..ed03ed0d 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay index 0087208c..172859ae 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay index 0087208c..172859ae 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/tg4x/boards/nice_nano.overlay b/app/boards/shields/tg4x/boards/nice_nano.overlay index fe7fbf18..62f20140 100644 --- a/app/boards/shields/tg4x/boards/nice_nano.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <8>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <7>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..62f20140 --- /dev/null +++ b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/tidbit/boards/nice_nano.overlay b/app/boards/shields/tidbit/boards/nice_nano.overlay index d8a647e9..08379e30 100644 --- a/app/boards/shields/tidbit/boards/nice_nano.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <9>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <8>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..08379e30 --- /dev/null +++ b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay index dd7e34c4..08379e30 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <9>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <2>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay index dd7e34c4..08379e30 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <9>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <2>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay index c2dab5a6..64d16572 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <43>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <2>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; @@ -29,4 +45,3 @@ zmk,underglow = &led_strip; }; }; - diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay index e53b149a..b84beb93 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <38>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <2>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay index 252329b4..64d16572 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <43>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <2>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index 020701fd..c70ffffb 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -54,23 +54,33 @@ For example, the Kyria shield has a `boards/nice_nano.overlay` file that defines With nRF52 boards, you can just use `&spi1` and define the pins you want to use. -To identify which pin number you need to put in the config you need do to a bit of math. You need the hardware port and run it through a function. -**32 \* X + Y** = `` where X is first part of the hardware port "PX.01" and Y is the second part of the hardware port "P1.Y". - -(_P1.13_ would give you _32 \* 1 + 13_ = `<45>` and P0.15 would give you _32 \* 0 + 15_ = `<15>`) - Here's an example on a definition that uses P0.06: ``` #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; From 0c5bcf5fe4dff38f55219c213a745a6731544896 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 16 Jan 2023 04:28:35 +0000 Subject: [PATCH 183/289] feat(docs): Add BLE feature/config pages. Co-authored-by: Cem Aksoylar --- docs/docs/config/bluetooth.md | 14 ++++++++ docs/docs/features/bluetooth.md | 59 +++++++++++++++++++++++++++++++++ docs/sidebars.js | 2 ++ 3 files changed, 75 insertions(+) create mode 100644 docs/docs/config/bluetooth.md create mode 100644 docs/docs/features/bluetooth.md diff --git a/docs/docs/config/bluetooth.md b/docs/docs/config/bluetooth.md new file mode 100644 index 00000000..420dd5c3 --- /dev/null +++ b/docs/docs/config/bluetooth.md @@ -0,0 +1,14 @@ +--- +title: Bluetooth Configuration +sidebar_label: Bluetooth +--- + +See the [bluetooth feature page](../features/bluetooth.md) for more details on the general Bluetooth functionality in ZMK. + +See [Configuration Overview](index.md) for instructions on how to change these settings. + +## Kconfig + +| Option | Type | Description | Default | +| ------------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------------- | ------- | +| `CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION` | bool | Low level setting for GATT subscriptions. Set to `n` to work around an annoying Windows bug with battery notifications. | y | diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md new file mode 100644 index 00000000..f1a3e241 --- /dev/null +++ b/docs/docs/features/bluetooth.md @@ -0,0 +1,59 @@ +--- +title: Bluetooth +sidebar_label: Bluetooth +--- + +ZMK's bluetooth functionality allows users to connect their keyboards to hosts using Bluetooth Low Energy (BLE) technology. It also is used for split keyboards to connect the two halves wirelessly. + +:::note + +Bluetooth 4.2 or newer is required in order to connect to a ZMK keyboard. ZMK implements advanced security using BLE's Secure Connection feature, which requires Bluetooth 4.2 at a minimum. To avoid well-known security vulnerabilities, we disallow using Legacy pairing. + +::: + +## Security + +BLE connections between keyboards and hosts are secured by an initial pairing/bonding process that establishes long term keys (LTK) shared between the two sides, using Elliptic Curve Diffie Hellman (ECDH) for key generation. The same security is used to secure the communication between the two sides of split keyboards running ZMK. + +The only known vulnerability in the protocol is a risk of an active man-in-the-middle (MITM) attack exactly during the initial pairing, which can be mitigated in the future using the Numeric Comparison association model. Support for that in ZMK is still experimental, so if you have serious concerns about an active attacker with physical proximity to your device, consider only pairing/bonding your keyboards in a controlled environment. + +## Profiles + +By default, ZMK supports five "profiles" for selecting which bonded host +device should receive the keyboard input. + +:::note Connection Management + +When pairing to a host device ZMK saves bond information to the selected profile. It will not replace this automatically when you initiate pairing with another device. To pair with a new device select an unused profile with or clearing the current profile, using the [`&bt` behavior](../behaviors/bluetooth.md) on your keyboard. + +A ZMK device may show as "connected" on multiple hosts at the same time. This is working as intended, and only the host associated with the active profile will receive keystrokes. + +::: + +Failure to manage the profiles can result in unexpected/broken behavior with hosts due to bond key mismatches, so it is an important aspect of ZMK to understand. + +## Bluetooth Behavior + +Management of the bluetooth in ZMK is accomplished using the [`&bt` behavior](../behaviors/bluetooth.md). Be sure to refer to that documentation to learn how to manage profiles, switch between connected hosts, etc. + +## Troubleshooting + +## Known Issues + +There are a few known issues related to BLE and ZMK: + +### Windows Battery Reporting + +There is a known issue with Windows failing to update the battery information after connecting to a ZMK keyboard. You can work around this Windows bug by overriding a [Bluetooth config variable](../config/bluetooth.md) to force battery notifications even if a host neglects to subscribe to them: + +``` +CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n +``` + +### macOS Connected But Not Working + +If you attempt to pair a ZMK keyboard from macOS in a way that causes a bonding issue, macOS may report the keyboard as connected, but fail to actually work. If this occurs: + +1. Remove the keyboard from macOS using the Bluetooth control panel. +1. Invoke `&bt BT_CLR` on the keyboard while the profile associated with the macOS device is active, by pressing the correct keys for your particular keymap. +1. Try connecting again from macOS. diff --git a/docs/sidebars.js b/docs/sidebars.js index 7b445a29..a52f3302 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -10,6 +10,7 @@ module.exports = { ], Features: [ "features/keymaps", + "features/bluetooth", "features/combos", "features/conditional-layers", "features/debouncing", @@ -57,6 +58,7 @@ module.exports = { "config/backlight", "config/battery", "config/behaviors", + "config/bluetooth", "config/combos", "config/displays", "config/encoders", From 313ed6adb6db3154c14f783b791255b6f3422fb3 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 17 Mar 2023 06:20:33 +0000 Subject: [PATCH 184/289] fix(display): Tweak EPD driver init/blanking. Ensure we only clear the display when turning blanking off the first time, not every time, to avoid duplicate clears. --- app/drivers/display/il0323.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/drivers/display/il0323.c b/app/drivers/display/il0323.c index 94e38481..6555e5c1 100644 --- a/app/drivers/display/il0323.c +++ b/app/drivers/display/il0323.c @@ -47,6 +47,7 @@ static uint8_t il0323_pwr[] = DT_INST_PROP(0, pwr); static uint8_t last_buffer[IL0323_BUFFER_SIZE]; static bool blanking_on = true; +static bool init_clear_done = false; static inline int il0323_write_cmd(const struct il0323_cfg *cfg, uint8_t cmd, uint8_t *data, size_t len) { @@ -198,16 +199,21 @@ static int il0323_clear_and_write_buffer(const struct device *dev, uint8_t patte static int il0323_blanking_off(const struct device *dev) { const struct il0323_cfg *cfg = dev->config; - if (blanking_on) { + if (!init_clear_done) { /* Update EPD panel in normal mode */ il0323_busy_wait(cfg); if (il0323_clear_and_write_buffer(dev, 0xff, true)) { return -EIO; } + init_clear_done = true; } blanking_on = false; + if (il0323_update_display(dev)) { + return -EIO; + } + return 0; } From 2614b856349a39a39ddb88c71b695c70a6fa1c05 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 24 Oct 2022 03:54:49 +0000 Subject: [PATCH 185/289] feat(docs): Add blog post for Zephyr 3.2. Co-authored-by: Cem Aksoylar --- docs/blog/2023-04-06-zephyr-3-2.md | 303 +++++++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 docs/blog/2023-04-06-zephyr-3-2.md diff --git a/docs/blog/2023-04-06-zephyr-3-2.md b/docs/blog/2023-04-06-zephyr-3-2.md new file mode 100644 index 00000000..b60ad27c --- /dev/null +++ b/docs/blog/2023-04-06-zephyr-3-2.md @@ -0,0 +1,303 @@ +--- +title: "Zephyr 3.2 Update" +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 +tags: [firmware, zephyr, core] +--- + +I'm happy to announce that we have completed the [work](https://github.com/zmkfirmware/zmk/pull/1499) to upgrade ZMK to [Zephyr 3.2](https://docs.zephyrproject.org/3.2.0/releases/release-notes-3.2.html)! + +[petejohanson] did the upgrade work to adjust ZMK for the Zephyr changes, with help from [Nicell] on the LVGL pieces. + +- Upgrade to LVGL 8.x API, and move to the new Kconfig settings. +- Tons of RP2040 work. +- Zephyr core API changes, including DTS `label` use changes. +- Move to [pinctrl](https://docs.zephyrproject.org/3.2.0/hardware/pinctrl/index.html) Zephyr subsystem. + +## Getting The Changes + +Use the following steps to update to the latest tooling in order to properly use the new ZMK changes: + +### User Config Repositories Using GitHub Actions + +Existing user config repositories using Github Actions to build will pull down Zephyr 3.2 automatically, however if you created your user config a while ago, you may need to update it to reference our shared build configuration to leverage the correct Docker image. + +1. Replace the contents of your `.github/workflows/build.yml` with: + + ``` + on: [push, pull_request, workflow_dispatch] + + jobs: + build: + uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@main + ``` + +1. If it doesn't exist already, add a new file to your repository named `build.yaml`: + + ``` + # This file generates the GitHub Actions matrix + # For simple board + shield combinations, add them + # to the top level board and shield arrays, for more + # control, add individual board + shield combinations to + # the `include` property, e.g: + # + # board: [ "nice_nano_v2" ] + # shield: [ "corne_left", "corne_right" ] + # include: + # - board: bdn9_rev2 + # - board: nice_nano_v2 + # shield: reviung41 + # + --- + ``` + +and then update it as appropriate to build the right shields/boards for your configuration. + +### Upgrade a manual script + +If you have a custom GitHub Actions workflow you need to maintain for some reason, you can update the workflow to to use the `stable` Docker image tag for the build: + +- Open `.github/workflows/build.yml` in your editor/IDE +- Change `zmkfirmware/zmk-build-arm:2.5` to `zmkfirmware/zmk-build-arm:stable` wherever it is found +- Locate and delete the lines for the DTS output step, which is no longer needed: + + ``` + - name: ${{ steps.variables.outputs.display-name }} DTS File + if: ${{ always() }} + run: | + if [ -f "build/zephyr/${{ matrix.board }}.pre.tmp" ]; then cat -n build/zephyr/${{ matrix.board }}.pre.tmp; fi + if [ -f "build/zephyr/zephyr.dts" ]; then cat -n build/zephyr/zephyr.dts; fi + ``` + +### VS Code & Docker (Dev Container) + +If you build locally using VS Code & Docker then: + +- pull the latest ZMK `main` with `git pull` for your ZMK checkout +- reload the project +- if you are prompted to rebuild the remote container, click `Rebuild` +- otherwise, press `F1` and run `Remote Containers: Rebuild Container` +- Once the container has rebuilt and reloaded, run `west update` to pull the updated Zephyr version and its dependencies. + +Once the container has rebuilt, VS Code will be running the 3.2 Docker image. + +### Local Host Development + +The following steps will get you building ZMK locally against Zephyr 3.2: + +- Run the updated [toolchain installation](/docs/development/setup#toolchain-installation) steps, and once completed, remove the previously installed SDK version (optional, existing SDK should still work) +- Install the latest version of `west` by running `pip3 install --user --update west`. +- pull the latest ZMK `main` with `git pull` for your ZMK checkout +- run `west update` to pull the updated Zephyr version and its dependencies + +From there, you should be ready to build as normal! + +## Known Issues + +A few testers have reported inconsistent issues with bluetooth connections on Windows after upgrading, which can be resolved by re-pairing your keyboard by: + +1. Remove the device from Windows. +1. Clear the profile on your keyboard that is associated with the Windows device by triggering `&bt BT_CLR` on your keymap while that profile is active. +1. Restart Windows. +1. Re-connect Windows to your keyboard. + +## Windows Battery Reporting Fix + +Zephyr 3.2 introduced [a new Kconfig setting](https://github.com/zephyrproject-rtos/zephyr/pull/48929) that can be used to work around a bug in Windows related to battery reporting. Check out our [bluetooth config](/docs/config/bluetooth) for the full details. The key new configuration that can be set if using Windows is: + +``` +CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n +``` + +## Keymap Changes + +Due to conflicts with new devicetree node labels added for Zephyr's [reset system](https://docs.zephyrproject.org/3.2.0/hardware/peripherals/reset.html), the `&reset` behavior has been renamed to `&sys_reset`. + +All of the in-tree keymaps have been fixed, but you may encounter build failures about duplicate names, requiring you rename the behavior reference in your keymap. Use the [Keymap Upgrader](docs/codes/keymap-upgrader) and this will get fixed for you automatically. + +## Board/Shield Changes + +The following changes have [already been completed](https://github.com/zmkfirmware/zmk/pull/1499/commits) for all boards/shields in ZMK `main` branch. For existing or new PRs, or out of tree boards, the following changes are necessary to properly work with the latest changes. + +### Move to `pinctrl` driver + +Before this change, setting up the details of pins to use them for peripherals like SPI, I2C, etc. was a mix of platform specific driver code. Zephyr has moved to the newer `pinctrl` system to unify the handling of pin configuration, with additional flexibility for things like low power modes for those pins, etc. + +#### Board specific shield overlays + +The main area this affects existing shields is those with board specific overrides, e.g. `/boards/seeeduino_xiao_ble.overlay`, that sets up additional components on custom buses, e.g. addressable RGB LEDs leveraging the SPI MOSI pin. + +#### nRF52 Pin Assignments + +Previously in ZMK, we relied on per-driver devicetree source properties to set the alternate pin functions for things like SPI or I2C. For example, here is the I2C bus setup as it was previously on the `nice_nano` board: + +``` +&i2c0 { + compatible = "nordic,nrf-twi"; + sda-pin = <17>; + scl-pin = <20>; +}; +``` + +With the move to the `pinctrl` system, this setup now look like: + +``` + &i2c0 { + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; + }; +``` + +which references the `pinctrl` configuration: + +``` +&pinctrl { + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; +``` + +Although slightly more _verbose_ this allows pin configuration infrastructure to be re-used, specify other modes, like sleep, etc. in a standard way across architectures. + +#### Out of Tree Boards/Shields + +All of the in-tree boards and shields have been upgraded, but if you maintain/use an out-of-tree board or shield that uses the converted boards and overrides pins for various buses, you may need to switch to `pinctrl` to match ZMK's new approach. + +The approach is the following when updating a _board_: + +1. Add an entry `CONFIG_PINCTRL=y` to the `_defconfig` file in the board directory. +1. Add a new file with the naming convention `-pinctrl.dtsi` to your board directory. +1. In the new file, add your `pinctrl` entries that set up different pin control configurations for whatever peripherals/buses are needed. Here's the nice!nano file as an example: + + ``` + /* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + + &pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + }; + ``` + +1. From the main `.dts` file, add an `#include "-pinctrl.dtsi"` to have the C-preprocessor combine the files. +1. Update the various peripheral nodes to use the new `pinctrl` configurations. For example, the following old configuration: + + ``` + &i2c0 { + compatible = "nordic,nrf-twi"; + sda-pin = <15>; + scl-pin = <17>; + }; + ``` + + would be changed to: + + ``` + &i2c0 { + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; + }; + ``` + +Because `pinctrl` configuration is very dependent on the specific target SoC, you will rarely need to consider it for a shield overlay that leverages a pro micro or XIAO abstraction. As noted, you're more likely to need to fix up pinctrl settings is using a board specific shield overlay, e.g. `/boards/.overlay` to set things up. + +### LVGL Kconfig changes. + +With the update to LVGL 8.x, Zephyr now leverages an upstream Kconfig file for most LVGL settings. Due to this, the naming for many existing configs has been adjusted. For any configs moved upstream, the naming mostly involves a prefix change from `LVGL_` to the shorter `LV_`. For any that are still Zephyr specific configs, they are now prefixed with `LV_Z_` prefix. + +If you maintain or use an out of tree board/shield with a display, the following will need to be changed in your Kconfig files: + +- `LVGL_VDB_SIZE` -> `LV_Z_VDB_SIZE` +- `LVGL_DPI` -> `LV_DPI_DEF` +- `LVGL_BITS_PER_PIXEL` -> `LV_Z_BITS_PER_PIXEL` + +Other than those specific examples, most other Kconfig values can simply change the `LVGL_` prefix to `LV_`. + +## Raspberry Pi Pico/RP2040 Support + +This Zephyr update allows ZMK to support the new(-ish) RP2040 SoC found in the Raspberry Pi Pico. + +:::note + +ZMK does _not_ support wired split communication yet, so RP2040 is only usable for non-split keyboards. To follow progress on wired splits, see [#1117](https://github.com/zmkfirmware/zmk/pull/1117). + +::: + +### Supported Controllers + +The following RP2040 powered controllers have board definitions for folks to test: + +- Raspberry Pi Pico (`rpi_pico`) +- SparkFun Pro Micro RP2040 (`sparkfun_pro_micro_rp2040`) +- Adafruit Keyboar/KB2040 (`adafruit_kb2040`) +- Seeeduino XIAO RP2040 (`seeeduino_xiao_rp2040`) +- Adafruit Qt PY RP2040 (`adafruit_qt_py_rp2040`) +- BoardSource blok (`boardsource_blok`) +- Elite-Pi (compatible with the `sparkfun_pro_micro_rp2040` board) + +## Upcoming Changes + +### Display re-init + +Zephyr's improved [power domain](https://docs.zephyrproject.org/3.2.0/services/pm/power_domain.html#pm-power-domain) support is a foundation +upon which we can provide a proper fix for the [longstanding display re-init bug](https://github.com/zmkfirmware/zmk/issues/674) which has prevented +ZMK from formally supporting our display code. + +There is work still remaining to fully leverage the power domain system within ZMK to fix the bug, but upgrading Zephyr is the first necessary step. + +## Thanks! + +Thanks to all the testers who have helped verify ZMK functionality on the newer Zephyr version. + +[petejohanson]: https://github.com/petejohanson +[nicell]: https://github.com/Nicell From 134b64ef5bbc67dd9f1c2a961609c62d4f226711 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 6 Apr 2023 06:14:44 +0000 Subject: [PATCH 186/289] fix(docs): Make link to keymap upgrader work. --- docs/blog/2023-04-06-zephyr-3-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/2023-04-06-zephyr-3-2.md b/docs/blog/2023-04-06-zephyr-3-2.md index b60ad27c..693d93dc 100644 --- a/docs/blog/2023-04-06-zephyr-3-2.md +++ b/docs/blog/2023-04-06-zephyr-3-2.md @@ -115,7 +115,7 @@ CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n Due to conflicts with new devicetree node labels added for Zephyr's [reset system](https://docs.zephyrproject.org/3.2.0/hardware/peripherals/reset.html), the `&reset` behavior has been renamed to `&sys_reset`. -All of the in-tree keymaps have been fixed, but you may encounter build failures about duplicate names, requiring you rename the behavior reference in your keymap. Use the [Keymap Upgrader](docs/codes/keymap-upgrader) and this will get fixed for you automatically. +All of the in-tree keymaps have been fixed, but you may encounter build failures about duplicate names, requiring you rename the behavior reference in your keymap. Use the [Keymap Upgrader](/docs/codes/keymap-upgrader) and this will get fixed for you automatically. ## Board/Shield Changes From 9dcc3ac3753d06db752a1fa7610df1f1be376bd2 Mon Sep 17 00:00:00 2001 From: Hooky <117450225+HookyKB@users.noreply.github.com> Date: Fri, 7 Apr 2023 21:53:10 +0800 Subject: [PATCH 187/289] fix(shields): Fixup nice!view adapter pinctrl props. `pinctrl-0` setting missing `<>`. --- .../shields/nice_view_adapter/boards/bluemicro840_v1.overlay | 2 +- app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay | 2 +- app/boards/shields/nice_view_adapter/boards/nice_nano.overlay | 2 +- app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay | 2 +- .../nice_view_adapter/boards/nrfmicro_11_flipped.overlay | 2 +- app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay | 2 +- .../shields/nice_view_adapter/boards/puchi_ble_v1.overlay | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay index 27d76b07..9667edf9 100644 --- a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay @@ -17,7 +17,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay index fc2667f3..21383c70 100644 --- a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay +++ b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay @@ -16,7 +16,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay index c9a0e788..0068b5b2 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay @@ -16,7 +16,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay index 27d76b07..9667edf9 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay @@ -17,7 +17,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay index 5074d0f9..09b57d16 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay @@ -16,7 +16,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay index 9a4f3170..0cdb933a 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay @@ -16,7 +16,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay index 9a4f3170..0cdb933a 100644 --- a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay @@ -16,7 +16,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; From 7434a6b99b01561ea20088819dd1e3cc2b989973 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 8 Apr 2023 00:30:20 -0700 Subject: [PATCH 188/289] fix(shields): Fix nice!view for deep sleep --- .../nice_view_adapter/boards/bluemicro840_v1.overlay | 12 ++++++++++-- .../nice_view_adapter/boards/mikoto_520.overlay | 11 ++++++++++- .../nice_view_adapter/boards/nice_nano.overlay | 11 ++++++++++- .../nice_view_adapter/boards/nice_nano_v2.overlay | 11 ++++++++++- .../nice_view_adapter/boards/nrfmicro_11.overlay | 12 ++++++++++-- .../boards/nrfmicro_11_flipped.overlay | 11 ++++++++++- .../nice_view_adapter/boards/nrfmicro_13.overlay | 11 ++++++++++- .../nice_view_adapter/boards/puchi_ble_v1.overlay | 11 ++++++++++- 8 files changed, 80 insertions(+), 10 deletions(-) diff --git a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay index 9667edf9..b8b07258 100644 --- a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay @@ -12,13 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; - nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay index 21383c70..d9cc0835 100644 --- a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay +++ b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay index 0068b5b2..2a1b757d 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay index 0068b5b2..2a1b757d 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay index 9667edf9..b8b07258 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay @@ -12,13 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; - nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay index 09b57d16..1cd19db9 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay index 0cdb933a..b8b07258 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay index 0cdb933a..b8b07258 100644 --- a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; From b31b42018ae4368b03b72f038d4dfbbeb31a630a Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 8 Apr 2023 11:08:12 -0500 Subject: [PATCH 189/289] fix: Remove deprecated labels from zmk_uno --- app/boards/shields/zmk_uno/zmk_uno.overlay | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/boards/shields/zmk_uno/zmk_uno.overlay b/app/boards/shields/zmk_uno/zmk_uno.overlay index f10d18af..12b5e2b3 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.overlay +++ b/app/boards/shields/zmk_uno/zmk_uno.overlay @@ -16,7 +16,6 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; - label = "RGB"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ @@ -126,8 +125,6 @@ kscan_matrix: kscan_matrix { compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN_MATRIX"; - diode-direction = "col2row"; col-gpios @@ -146,8 +143,6 @@ compatible = "zmk,kscan-gpio-direct"; status = "disabled"; - label = "KSCAN_DIRECT"; - input-gpios = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> @@ -161,8 +156,6 @@ compatible = "zmk,kscan-gpio-direct"; toggle-mode; - label = "KSCAN_TOGGLE"; - input-gpios = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> From 374104dec616013bd85bcdf095e1ecc4fea40954 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 9 Apr 2023 12:35:34 -0700 Subject: [PATCH 190/289] fix(underglow): Move to spi3 for underglow bus. * Workaround Zephyr bug for Nordic SPI(M) driver after the pinctrl refactor by using spi3 peripheral for the SPI bus for the WS2812 led_strip driver. --- .../shields/chalice/boards/nice_nano.overlay | 10 +++++----- .../shields/chalice/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/corne/boards/nice_nano.overlay | 10 +++++----- .../shields/corne/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/elephant42/boards/nice_nano.overlay | 10 +++++----- .../elephant42/boards/nice_nano_v2.overlay | 10 +++++----- .../eternal_keypad/boards/nice_nano.overlay | 10 +++++----- .../eternal_keypad/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/helix/boards/nice_nano.overlay | 10 +++++----- .../shields/helix/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/jorne/boards/nice_nano.overlay | 10 +++++----- .../shields/jorne/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/kyria/boards/nice_nano.overlay | 10 +++++----- .../shields/kyria/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/lily58/boards/nice_nano.overlay | 10 +++++----- .../shields/lily58/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/microdox/boards/nice_nano.overlay | 10 +++++----- .../shields/microdox/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/murphpad/boards/nice_nano.overlay | 10 +++++----- .../shields/murphpad/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/nibble/boards/nice_nano.overlay | 10 +++++----- .../shields/nibble/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/redox/boards/nice_nano.overlay | 10 +++++----- .../shields/redox/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/reviung41/boards/nice_nano.overlay | 12 ++++++------ .../reviung41/boards/nice_nano_v2.overlay | 12 ++++++------ .../shields/romac_plus/boards/nice_nano.overlay | 10 +++++----- .../romac_plus/boards/nice_nano_v2.overlay | 10 +++++----- app/boards/shields/snap/boards/nice_nano.overlay | 10 +++++----- .../shields/snap/boards/nice_nano_v2.overlay | 10 +++++----- .../boards/nice_nano.overlay | 10 +++++----- .../boards/nice_nano_v2.overlay | 10 +++++----- .../boards/nice_nano.overlay | 10 +++++----- .../boards/nice_nano_v2.overlay | 10 +++++----- .../boards/nice_nano.overlay | 10 +++++----- .../boards/nice_nano_v2.overlay | 10 +++++----- app/boards/shields/tg4x/boards/nice_nano.overlay | 10 +++++----- .../shields/tg4x/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/tidbit/boards/nice_nano.overlay | 10 +++++----- .../shields/tidbit/boards/nice_nano_v2.overlay | 10 +++++----- .../two_percent_milk/boards/nice_nano.overlay | 10 +++++----- .../two_percent_milk/boards/nice_nano_v2.overlay | 10 +++++----- docs/docs/features/underglow.md | 16 ++++++++-------- 43 files changed, 220 insertions(+), 220 deletions(-) diff --git a/app/boards/shields/chalice/boards/nice_nano.overlay b/app/boards/shields/chalice/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/chalice/boards/nice_nano.overlay +++ b/app/boards/shields/chalice/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/chalice/boards/nice_nano_v2.overlay b/app/boards/shields/chalice/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/chalice/boards/nice_nano_v2.overlay +++ b/app/boards/shields/chalice/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/corne/boards/nice_nano.overlay b/app/boards/shields/corne/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/corne/boards/nice_nano.overlay +++ b/app/boards/shields/corne/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/corne/boards/nice_nano_v2.overlay b/app/boards/shields/corne/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/corne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/corne/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/elephant42/boards/nice_nano.overlay b/app/boards/shields/elephant42/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/elephant42/boards/nice_nano.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay +++ b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay +++ b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/helix/boards/nice_nano.overlay b/app/boards/shields/helix/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/helix/boards/nice_nano.overlay +++ b/app/boards/shields/helix/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/helix/boards/nice_nano_v2.overlay b/app/boards/shields/helix/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/helix/boards/nice_nano_v2.overlay +++ b/app/boards/shields/helix/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/jorne/boards/nice_nano.overlay b/app/boards/shields/jorne/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/jorne/boards/nice_nano.overlay +++ b/app/boards/shields/jorne/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/jorne/boards/nice_nano_v2.overlay b/app/boards/shields/jorne/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/jorne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/jorne/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/kyria/boards/nice_nano.overlay b/app/boards/shields/kyria/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/kyria/boards/nice_nano.overlay +++ b/app/boards/shields/kyria/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/kyria/boards/nice_nano_v2.overlay b/app/boards/shields/kyria/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/kyria/boards/nice_nano_v2.overlay +++ b/app/boards/shields/kyria/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/lily58/boards/nice_nano.overlay b/app/boards/shields/lily58/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/lily58/boards/nice_nano.overlay +++ b/app/boards/shields/lily58/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/lily58/boards/nice_nano_v2.overlay b/app/boards/shields/lily58/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/lily58/boards/nice_nano_v2.overlay +++ b/app/boards/shields/lily58/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/microdox/boards/nice_nano.overlay b/app/boards/shields/microdox/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/microdox/boards/nice_nano.overlay +++ b/app/boards/shields/microdox/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/microdox/boards/nice_nano_v2.overlay b/app/boards/shields/microdox/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/microdox/boards/nice_nano_v2.overlay +++ b/app/boards/shields/microdox/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/murphpad/boards/nice_nano.overlay b/app/boards/shields/murphpad/boards/nice_nano.overlay index 89ba4f9d..3e2241a2 100644 --- a/app/boards/shields/murphpad/boards/nice_nano.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay index 89ba4f9d..3e2241a2 100644 --- a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/nibble/boards/nice_nano.overlay b/app/boards/shields/nibble/boards/nice_nano.overlay index ece699e2..54ab9fec 100644 --- a/app/boards/shields/nibble/boards/nice_nano.overlay +++ b/app/boards/shields/nibble/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/nibble/boards/nice_nano_v2.overlay b/app/boards/shields/nibble/boards/nice_nano_v2.overlay index ece699e2..54ab9fec 100644 --- a/app/boards/shields/nibble/boards/nice_nano_v2.overlay +++ b/app/boards/shields/nibble/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/redox/boards/nice_nano.overlay b/app/boards/shields/redox/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/redox/boards/nice_nano.overlay +++ b/app/boards/shields/redox/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/redox/boards/nice_nano_v2.overlay b/app/boards/shields/redox/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/redox/boards/nice_nano_v2.overlay +++ b/app/boards/shields/redox/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/reviung41/boards/nice_nano.overlay b/app/boards/shields/reviung41/boards/nice_nano.overlay index 172859ae..741237e1 100644 --- a/app/boards/shields/reviung41/boards/nice_nano.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { @@ -32,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ + chain-length = <11>; spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay index 172859ae..741237e1 100644 --- a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { @@ -32,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ + chain-length = <11>; spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/romac_plus/boards/nice_nano.overlay b/app/boards/shields/romac_plus/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/snap/boards/nice_nano.overlay b/app/boards/shields/snap/boards/nice_nano.overlay index 15c5801e..28e9ce69 100644 --- a/app/boards/shields/snap/boards/nice_nano.overlay +++ b/app/boards/shields/snap/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/snap/boards/nice_nano_v2.overlay b/app/boards/shields/snap/boards/nice_nano_v2.overlay index 15c5801e..28e9ce69 100644 --- a/app/boards/shields/snap/boards/nice_nano_v2.overlay +++ b/app/boards/shields/snap/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay index 4a6b717d..5b9ce4a8 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay @@ -2,13 +2,13 @@ &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -16,12 +16,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay index ed03ed0d..9e168625 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/tg4x/boards/nice_nano.overlay b/app/boards/shields/tg4x/boards/nice_nano.overlay index 62f20140..54046bf5 100644 --- a/app/boards/shields/tg4x/boards/nice_nano.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay index 62f20140..54046bf5 100644 --- a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/tidbit/boards/nice_nano.overlay b/app/boards/shields/tidbit/boards/nice_nano.overlay index 08379e30..ad66feac 100644 --- a/app/boards/shields/tidbit/boards/nice_nano.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay index 08379e30..ad66feac 100644 --- a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay index 08379e30..ad66feac 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay index 08379e30..ad66feac 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index c70ffffb..c1dc68d3 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -52,7 +52,7 @@ For example, the Kyria shield has a `boards/nice_nano.overlay` file that defines ### nRF52-based boards -With nRF52 boards, you can just use `&spi1` and define the pins you want to use. +With nRF52 boards, you can just use `&spi3` and define the pins you want to use. Here's an example on a definition that uses P0.06: @@ -60,13 +60,13 @@ Here's an example on a definition that uses P0.06: #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -74,12 +74,12 @@ Here's an example on a definition that uses P0.06: }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { @@ -119,12 +119,12 @@ If your board/shield uses LEDs that require the data sent in a different order, For other boards, you must select an SPI definition that has the `MOSI` pin as your data pin going to your LED strip. -Here's another example for a non-nRF52 board on `spi1`: +Here's another example for a non-nRF52 board on `spi3`: ``` #include -&spi1 { +&spi3 { led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; From 064aff6bc074febd394a288403129e95c386395d Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 8 Apr 2023 16:32:29 -0500 Subject: [PATCH 191/289] fix(behaviors): Fix use after free in sticky key Fixed an issue where the sticky key behavior would call ZMK_EVENT_RAISE_AFTER(), which would free the provided event, but then it would keep using that now-freed event data. --- app/src/behaviors/behavior_sticky_key.c | 30 +++++++++++++++---------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/app/src/behaviors/behavior_sticky_key.c b/app/src/behaviors/behavior_sticky_key.c index 22936086..6697b9b1 100644 --- a/app/src/behaviors/behavior_sticky_key.c +++ b/app/src/behaviors/behavior_sticky_key.c @@ -191,6 +191,11 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) { // keep track whether the event has been reraised, so we only reraise it once bool event_reraised = false; + + // reraising the event frees it, so make a copy of any event data we might + // need after it's been freed. + const struct zmk_keycode_state_changed ev_copy = *ev; + for (int i = 0; i < ZMK_BHV_STICKY_KEY_MAX_HELD; i++) { struct active_sticky_key *sticky_key = &active_sticky_keys[i]; if (sticky_key->position == ZMK_BHV_STICKY_KEY_POSITION_FREE) { @@ -198,23 +203,24 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) { } if (strcmp(sticky_key->config->behavior.behavior_dev, "KEY_PRESS") == 0 && - ZMK_HID_USAGE_ID(sticky_key->param1) == ev->keycode && - ZMK_HID_USAGE_PAGE(sticky_key->param1) == ev->usage_page && - SELECT_MODS(sticky_key->param1) == ev->implicit_modifiers) { + ZMK_HID_USAGE_ID(sticky_key->param1) == ev_copy.keycode && + ZMK_HID_USAGE_PAGE(sticky_key->param1) == ev_copy.usage_page && + SELECT_MODS(sticky_key->param1) == ev_copy.implicit_modifiers) { // don't catch key down events generated by the sticky key behavior itself continue; } // If this event was queued, the timer may be triggered late or not at all. // Release the sticky key if the timer should've run out in the meantime. - if (sticky_key->release_at != 0 && ev->timestamp > sticky_key->release_at) { + if (sticky_key->release_at != 0 && ev_copy.timestamp > sticky_key->release_at) { stop_timer(sticky_key); release_sticky_key_behavior(sticky_key, sticky_key->release_at); continue; } - if (ev->state) { // key down - if (sticky_key->config->ignore_modifiers && is_mod(ev->usage_page, ev->keycode)) { + if (ev_copy.state) { // key down + if (sticky_key->config->ignore_modifiers && + is_mod(ev_copy.usage_page, ev_copy.keycode)) { // ignore modifier key press so we can stack sticky keys and combine with other // modifiers continue; @@ -231,17 +237,17 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) { ZMK_EVENT_RAISE_AFTER(eh, behavior_sticky_key); event_reraised = true; } - release_sticky_key_behavior(sticky_key, ev->timestamp); + release_sticky_key_behavior(sticky_key, ev_copy.timestamp); } } - sticky_key->modified_key_usage_page = ev->usage_page; - sticky_key->modified_key_keycode = ev->keycode; + sticky_key->modified_key_usage_page = ev_copy.usage_page; + sticky_key->modified_key_keycode = ev_copy.keycode; } else { // key up if (sticky_key->timer_started && - sticky_key->modified_key_usage_page == ev->usage_page && - sticky_key->modified_key_keycode == ev->keycode) { + sticky_key->modified_key_usage_page == ev_copy.usage_page && + sticky_key->modified_key_keycode == ev_copy.keycode) { stop_timer(sticky_key); - release_sticky_key_behavior(sticky_key, ev->timestamp); + release_sticky_key_behavior(sticky_key, ev_copy.timestamp); } } } From 3c8f55ede0a8f08f0cc11e500c0f2e3d05a87f7c Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 9 Apr 2023 18:08:35 -0700 Subject: [PATCH 192/289] fix(display): Do not override font size in status screen --- app/src/display/status_screen.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/src/display/status_screen.c b/app/src/display/status_screen.c index 7c3870a8..58de09ae 100644 --- a/app/src/display/status_screen.c +++ b/app/src/display/status_screen.c @@ -34,16 +34,9 @@ static struct zmk_widget_layer_status layer_status_widget; static struct zmk_widget_wpm_status wpm_status_widget; #endif -lv_style_t global_style; - lv_obj_t *zmk_display_status_screen() { lv_obj_t *screen; - - lv_style_init(&global_style); - lv_style_set_text_font(&global_style, &lv_font_montserrat_12); - screen = lv_obj_create(NULL); - lv_obj_add_style(screen, &global_style, LV_PART_MAIN); #if IS_ENABLED(CONFIG_ZMK_WIDGET_BATTERY_STATUS) zmk_widget_battery_status_init(&battery_status_widget, screen); From 702d79c108bfd02d85dda3dda55f31ce8316cfd8 Mon Sep 17 00:00:00 2001 From: nguyendown <50001260+nguyendown@users.noreply.github.com> Date: Mon, 10 Apr 2023 12:50:57 +0700 Subject: [PATCH 193/289] test(behaviors): add unit tests for sticky key `quick-release` Duplicate the existing tests with `quick-release` enabled: - 8-lsk-osk-combination-quick-release - 10-callum-mods-quick-release --- .../events.patterns | 1 + .../keycode_events.snapshot | 10 ++++ .../native_posix_64.keymap | 40 +++++++++++++ .../events.patterns | 1 + .../keycode_events.snapshot | 12 ++++ .../native_posix_64.keymap | 56 +++++++++++++++++++ 6 files changed, 120 insertions(+) create mode 100644 app/tests/sticky-keys/10-callum-mods-quick-release/events.patterns create mode 100644 app/tests/sticky-keys/10-callum-mods-quick-release/keycode_events.snapshot create mode 100644 app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap create mode 100644 app/tests/sticky-keys/8-lsk-osk-combination-quick-release/events.patterns create mode 100644 app/tests/sticky-keys/8-lsk-osk-combination-quick-release/keycode_events.snapshot create mode 100644 app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap diff --git a/app/tests/sticky-keys/10-callum-mods-quick-release/events.patterns b/app/tests/sticky-keys/10-callum-mods-quick-release/events.patterns new file mode 100644 index 00000000..b1342af4 --- /dev/null +++ b/app/tests/sticky-keys/10-callum-mods-quick-release/events.patterns @@ -0,0 +1 @@ +s/.*hid_listener_keycode_//p diff --git a/app/tests/sticky-keys/10-callum-mods-quick-release/keycode_events.snapshot b/app/tests/sticky-keys/10-callum-mods-quick-release/keycode_events.snapshot new file mode 100644 index 00000000..5ee7c103 --- /dev/null +++ b/app/tests/sticky-keys/10-callum-mods-quick-release/keycode_events.snapshot @@ -0,0 +1,10 @@ +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap new file mode 100644 index 00000000..5c1c2264 --- /dev/null +++ b/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap @@ -0,0 +1,40 @@ +#include +#include +#include + +&sk { + quick-release; +}; + +/ { + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &sk LEFT_CONTROL &kp A + &sk LEFT_SHIFT &sk LEFT_ALT>; + }; + }; +}; + +&kscan { + events = < + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap sk LEFT_SHIFT */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap sk LEFT_ALT */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* tap A */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap A (no sticky keys anymore) */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; +}; diff --git a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/events.patterns b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/events.patterns new file mode 100644 index 00000000..b1342af4 --- /dev/null +++ b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/events.patterns @@ -0,0 +1 @@ +s/.*hid_listener_keycode_//p diff --git a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/keycode_events.snapshot b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/keycode_events.snapshot new file mode 100644 index 00000000..d71c3968 --- /dev/null +++ b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/keycode_events.snapshot @@ -0,0 +1,12 @@ +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap new file mode 100644 index 00000000..6d88a9ea --- /dev/null +++ b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap @@ -0,0 +1,56 @@ +#include +#include +#include + +&sk { + quick-release; +}; + +/ { + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &sk LEFT_SHIFT &sl 1 + &kp A &kp B>; + }; + + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &kp Y &kp Z>; + }; + }; +}; + +&kscan { + events = < + /* tap sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap A */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap B */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + + /* tap sk LEFT_SHIFT */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap Y */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap B */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + >; +}; From 3f48062225e0382de35cecc3da6914be89a2c91e Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 24 Feb 2023 18:11:46 -0500 Subject: [PATCH 194/289] feat(core): Add Kconfig option to exclude debug log messages --- app/Kconfig | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 824d2700..794b6762 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -402,6 +402,17 @@ endmenu menu "USB Logging" +config ZMK_LOGGING_MINIMAL + bool "Suppress all ZMK debug log messages" + default false + +if !ZMK_LOGGING_MINIMAL + +config ZMK_LOG_LEVEL + default 4 + +endif + config ZMK_USB_LOGGING bool "Enable USB CDC ACM logging to help debug" select LOG @@ -417,16 +428,12 @@ config ZMK_USB_LOGGING if ZMK_USB_LOGGING -config ZMK_LOG_LEVEL - default 4 - choice USB_CDC_ACM_LOG_LEVEL_CHOICE default USB_CDC_ACM_LOG_LEVEL_OFF endchoice choice USB_DRIVER_LOG_LEVEL_CHOICE default USB_DRIVER_LOG_LEVEL_OFF - endchoice # We do this to avoid log loop where logging to USB generates more log messages. From a20b9502bc069cac94a55243cf091e3174a9992b Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 24 Feb 2023 18:14:23 -0500 Subject: [PATCH 195/289] feat(core): Add RTT logging Kconfig option --- app/Kconfig | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 794b6762..75a37f63 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -400,7 +400,7 @@ config ZMK_KSCAN_EVENT_QUEUE_SIZE #KSCAN Settings endmenu -menu "USB Logging" +menu "Logging" config ZMK_LOGGING_MINIMAL bool "Suppress all ZMK debug log messages" @@ -441,16 +441,38 @@ endchoice config USB_CDC_ACM_RINGBUF_SIZE default 1024 -config LOG_BUFFER_SIZE - default 8192 - config LOG_PROCESS_THREAD_STARTUP_DELAY_MS default 1000 #ZMK_USB_LOGGING endif -#USB Logging +config ZMK_RTT_LOGGING + bool "Enable RTT logging to help debug" + select LOG + select DEBUG + select ASSERT + select USE_SEGGER_RTT + select CONSOLE + select RTT_CONSOLE + +if ZMK_RTT_LOGGING + +config SEGGER_RTT_BUFFER_SIZE_UP + default 8192 + +#ZMK_RTT_LOGGING +endif + +if ZMK_USB_LOGGING || ZMK_RTT_LOGGING + +config LOG_BUFFER_SIZE + default 8192 + +#ZMK_USB_LOGGING || ZMK_RTT_LOGGING +endif + +#Logging endmenu if SETTINGS From ee9fcec3c97c23e15a2369b95cc0a590f04f1875 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 24 Feb 2023 18:16:18 -0500 Subject: [PATCH 196/289] feat(core): Process log every 100ms --- app/Kconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/Kconfig b/app/Kconfig index 75a37f63..431a1bb1 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -469,6 +469,9 @@ if ZMK_USB_LOGGING || ZMK_RTT_LOGGING config LOG_BUFFER_SIZE default 8192 +config LOG_PROCESS_THREAD_SLEEP_MS + default 100 + #ZMK_USB_LOGGING || ZMK_RTT_LOGGING endif From 309359b32f2ce46adc2b720b1cca20d9ac333d6c Mon Sep 17 00:00:00 2001 From: Purdea Andrei Date: Mon, 10 Apr 2023 10:27:19 +0300 Subject: [PATCH 197/289] fix(keymaps): fix keypresses that are not in the transform Before this change, if a matrix position was not present in the transform, various incorrect behaviors would happen: 1) In some cases out-of-bounds accesses: Note that the size of the`transform[]` array does not necessarily match the size of the matrix. So for example if key position (ZMK_MATRIX_COLS-1, ZMK_MATRIX_ROWS-1) is not present in the transform, but ends up being pressed, then the array will be accessed beyond its size, and any data could be returned. 2) In other cases the 0th position in the keymap will be used because the `transform[]` array is initialized to all zeros. --- app/include/zmk/matrix_transform.h | 2 +- app/src/kscan.c | 9 ++++++- app/src/matrix_transform.c | 43 +++++++++++++++++++++++------- 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/app/include/zmk/matrix_transform.h b/app/include/zmk/matrix_transform.h index 413678a7..ffd3e3f1 100644 --- a/app/include/zmk/matrix_transform.h +++ b/app/include/zmk/matrix_transform.h @@ -6,4 +6,4 @@ #pragma once -uint32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t column); \ No newline at end of file +int32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t column); \ No newline at end of file diff --git a/app/src/kscan.c b/app/src/kscan.c index b0713320..62d0cf07 100644 --- a/app/src/kscan.c +++ b/app/src/kscan.c @@ -47,7 +47,14 @@ void zmk_kscan_process_msgq(struct k_work *item) { while (k_msgq_get(&zmk_kscan_msgq, &ev, K_NO_WAIT) == 0) { bool pressed = (ev.state == ZMK_KSCAN_EVENT_STATE_PRESSED); - uint32_t position = zmk_matrix_transform_row_column_to_position(ev.row, ev.column); + int32_t position = zmk_matrix_transform_row_column_to_position(ev.row, ev.column); + + if (position < 0) { + LOG_WRN("Not found in transform: row: %d, col: %d, pressed: %s", ev.row, ev.column, + (pressed ? "true" : "false")); + continue; + } + LOG_DBG("Row: %d, col: %d, position: %d, pressed: %s", ev.row, ev.column, position, (pressed ? "true" : "false")); ZMK_EVENT_RAISE(new_zmk_position_state_changed( diff --git a/app/src/matrix_transform.c b/app/src/matrix_transform.c index 47256608..6c616d5e 100644 --- a/app/src/matrix_transform.c +++ b/app/src/matrix_transform.c @@ -11,17 +11,32 @@ #ifdef ZMK_KEYMAP_TRANSFORM_NODE -#define _TRANSFORM_ENTRY(i, _) \ - [(KT_ROW(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i)) * ZMK_MATRIX_COLS) + \ - KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i +/* the transform in the device tree is a list of (row,column) pairs that is + * indexed by by the keymap position of that key. We want to invert this in + * order to be able to quickly determine what keymap position a particular + * row,column pair is associated with, using a single lookup. + * + * We do this by creating the `transform` array at compile time, which is + * indexed by (row * ZMK_MATRIX_COLS) + column, and the value contains an + * encoded keymap index it is associated with. The keymap index is encoded + * by adding INDEX_OFFSET to it, because not all row,column pairs have an + * associated keymap index (some matrices are sparse), C globals are + * initialized to 0, and the keymap index of 0 is a valid index. We want to + * be able to detect the condition when an unassigned matrix position is + * pressed and we want to return an error. + */ -static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, _TRANSFORM_ENTRY, (, ), 0)}; +#define INDEX_OFFSET 1 + +#define TRANSFORM_ENTRY(i, _) \ + [(KT_ROW(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i)) * ZMK_MATRIX_COLS) + \ + KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i + INDEX_OFFSET + +static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, TRANSFORM_ENTRY, (, ), 0)}; #endif -uint32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t column) { - uint32_t matrix_index; - +int32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t column) { #if DT_NODE_HAS_PROP(ZMK_KEYMAP_TRANSFORM_NODE, col_offset) column += DT_PROP(ZMK_KEYMAP_TRANSFORM_NODE, col_offset); #endif @@ -30,10 +45,20 @@ uint32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t colu row += DT_PROP(ZMK_KEYMAP_TRANSFORM_NODE, row_offset); #endif - matrix_index = (row * ZMK_MATRIX_COLS) + column; + const uint32_t matrix_index = (row * ZMK_MATRIX_COLS) + column; #ifdef ZMK_KEYMAP_TRANSFORM_NODE - return transform[matrix_index]; + if (matrix_index >= ARRAY_SIZE(transform)) { + return -EINVAL; + } + + const uint32_t value = transform[matrix_index]; + + if (!value) { + return -EINVAL; + } + + return value - INDEX_OFFSET; #else return matrix_index; #endif /* ZMK_KEYMAP_TRANSFORM_NODE */ From f1b138cbf0a37147f24150af2721899fa17e9fd4 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 14 Apr 2023 14:22:53 -0700 Subject: [PATCH 198/289] fix(boards): Fix Zen logo alignment --- app/boards/arm/corneish_zen/custom_status_screen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/arm/corneish_zen/custom_status_screen.c b/app/boards/arm/corneish_zen/custom_status_screen.c index c45a6243..492239c8 100644 --- a/app/boards/arm/corneish_zen/custom_status_screen.c +++ b/app/boards/arm/corneish_zen/custom_status_screen.c @@ -70,7 +70,7 @@ lv_obj_t *zmk_display_status_screen() { lv_obj_t *zenlogo_icon; zenlogo_icon = lv_img_create(screen); lv_img_set_src(zenlogo_icon, &zenlogo); - lv_obj_align(zenlogo_icon, LV_ALIGN_BOTTOM_MID, 2, -5); + lv_obj_align(zenlogo_icon, LV_ALIGN_BOTTOM_MID, 0, -5); #endif return screen; From 71855af14fa079606d4cbdd3d6403e8956c136f8 Mon Sep 17 00:00:00 2001 From: Josep Roca Date: Sun, 16 Apr 2023 10:04:49 +0300 Subject: [PATCH 199/289] fix(docs): ignore-modifiers clarification * Clarify the potential need of adding the ignore-modifiers setting for new sticky key behaviors. * Add ignore-modifiers setting to skq example * Update docs/docs/behaviors/sticky-key.md Co-authored-by: Cem Aksoylar --- docs/docs/behaviors/sticky-key.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/docs/behaviors/sticky-key.md b/docs/docs/behaviors/sticky-key.md index 12541ed8..d881e6b0 100644 --- a/docs/docs/behaviors/sticky-key.md +++ b/docs/docs/behaviors/sticky-key.md @@ -36,7 +36,7 @@ Some typists may find that using a sticky shift key interspersed with rapid typi #### `ignore-modifiers` -This setting is enabled by default. It ensures that if a sticky key modifier is pressed before a previously pressed sticky key is released, the modifiers will get combined so you can add more sticky keys or press a regular key to apply the modifiers. This is to accommodate _callum-style mods_ where you are prone to rolling sticky keys. If you want sticky key modifiers to only chain after release, you can disable this setting. +This setting is enabled by default. It ensures that if a sticky key modifier is pressed before a previously pressed sticky key is released, the modifiers will get combined so you can add more sticky keys or press a regular key to apply the modifiers. This is to accommodate _callum-style mods_ where you are prone to rolling sticky keys. If you want sticky key modifiers to only chain after release, you can disable this setting. Please note that activating multiple modifiers via [modifier functions](https://zmk.dev/docs/codes/modifiers#modifier-functions) such as `&sk LS(LALT)`, require `ignore-modifiers` enabled in order to function properly. #### Example @@ -66,6 +66,7 @@ This configuration would apply to all sticky keys. This may not be appropriate i bindings = <&kp>; release-after-ms = <1000>; quick-release; + ignore-modifiers; }; }; From 83a151890cd9491036ef2d73cd22db86a7a55f5c Mon Sep 17 00:00:00 2001 From: sporkus <102923689+sporkus@users.noreply.github.com> Date: Sun, 16 Apr 2023 13:28:08 -0700 Subject: [PATCH 200/289] fix(docs): Correct example keymap filename --- docs/docs/development/boards-shields-keymaps.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/development/boards-shields-keymaps.md b/docs/docs/development/boards-shields-keymaps.md index 4644ee79..77d8361a 100644 --- a/docs/docs/development/boards-shields-keymaps.md +++ b/docs/docs/development/boards-shields-keymaps.md @@ -30,7 +30,7 @@ in the `app/boards/${arch}/${board_name}` directory, e.g. `app/boards/arm/planck - A [chosen](https://docs.zephyrproject.org/2.5.0/guides/dts/intro.html#aliases-and-chosen-nodes) node named `zmk,kscan` which references the configured KSCAN driver (usually a GPIO matrix) - (Optional) A [chosen](https://docs.zephyrproject.org/2.5.0/guides/dts/intro.html#aliases-and-chosen-nodes) node named `zmk,matrix_transform` that defines the mapping from KSCAN row/column values to the logical key position for the keyboard. - A `board.cmake` file with CMake directives for how to flash to the device. -- A `keymap/keymap.overlay` file that includes the default keymap for that keyboard. Users will be able to override this keymap in their user configs. +- A `${board_name}.keymap` file that includes the default keymap for that keyboard. Users will be able to override this keymap in their user configs. ## Pro Micro Compatible Keyboard From e7a6e4016d757d37f0b8df28d7b78f38554e0b27 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 29 Oct 2022 23:17:12 -0500 Subject: [PATCH 201/289] feat(behaviors): Add key position to key events Extended the virtual key position system from combos so that each sensor also gets a virtual key position. This allows sensor behaviors to use the behavior queue API. --- app/include/drivers/behavior.h | 13 +++++++----- app/include/zmk/sensors.h | 7 ++++++- app/include/zmk/virtual_key_position.h | 20 +++++++++++++++++++ .../behavior_sensor_rotate_key_press.c | 3 ++- app/src/combo.c | 3 ++- app/src/keymap.c | 10 ++++++---- 6 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 app/include/zmk/virtual_key_position.h diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index 71df7344..df18385f 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -26,6 +26,7 @@ typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *b struct zmk_behavior_binding_event event); typedef int (*behavior_sensor_keymap_binding_callback_t)(struct zmk_behavior_binding *binding, const struct device *sensor, + uint32_t virtual_key_position, int64_t timestamp); enum behavior_locality { @@ -150,21 +151,23 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi /** * @brief Handle the a sensor keymap binding being triggered - * @param dev Pointer to the device structure for the driver instance. + * @param binding Sensor keymap binding which was triggered. * @param sensor Pointer to the sensor device structure for the sensor driver instance. - * @param param1 User parameter specified at time of behavior binding. - * @param param2 User parameter specified at time of behavior binding. + * @param virtual_key_position ZMK_KEYMAP_LEN + sensor number + * @param timestamp Time at which the binding was triggered. * * @retval 0 If successful. * @retval Negative errno code if failure. */ __syscall int behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, const struct device *sensor, + uint32_t virtual_key_position, int64_t timestamp); static inline int z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, - const struct device *sensor, int64_t timestamp) { + const struct device *sensor, + uint32_t virtual_key_position, int64_t timestamp) { const struct device *dev = device_get_binding(binding->behavior_dev); if (dev == NULL) { @@ -177,7 +180,7 @@ z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *bin return -ENOTSUP; } - return api->sensor_binding_triggered(binding, sensor, timestamp); + return api->sensor_binding_triggered(binding, sensor, virtual_key_position, timestamp); } /** diff --git a/app/include/zmk/sensors.h b/app/include/zmk/sensors.h index 8c6c28b3..9e54695f 100644 --- a/app/include/zmk/sensors.h +++ b/app/include/zmk/sensors.h @@ -8,5 +8,10 @@ #define ZMK_KEYMAP_SENSORS_NODE DT_INST(0, zmk_keymap_sensors) #define ZMK_KEYMAP_HAS_SENSORS DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_NODE, okay) -#define ZMK_KEYMAP_SENSORS_LEN DT_PROP_LEN(ZMK_KEYMAP_SENSORS_NODE, sensors) #define ZMK_KEYMAP_SENSORS_BY_IDX(idx) DT_PHANDLE_BY_IDX(ZMK_KEYMAP_SENSORS_NODE, sensors, idx) + +#if ZMK_KEYMAP_HAS_SENSORS +#define ZMK_KEYMAP_SENSORS_LEN DT_PROP_LEN(ZMK_KEYMAP_SENSORS_NODE, sensors) +#else +#define ZMK_KEYMAP_SENSORS_LEN 0 +#endif diff --git a/app/include/zmk/virtual_key_position.h b/app/include/zmk/virtual_key_position.h new file mode 100644 index 00000000..48deee5c --- /dev/null +++ b/app/include/zmk/virtual_key_position.h @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include +#include + +/** + * Gets the virtual key position to use for the sensor with the given index. + */ +#define ZMK_VIRTUAL_KEY_POSITION_SENSOR(index) (ZMK_KEYMAP_LEN + (index)) + +/** + * Gets the virtual key position to use for the combo with the given index. + */ +#define ZMK_VIRTUAL_KEY_POSITION_COMBO(index) (ZMK_KEYMAP_LEN + ZMK_KEYMAP_SENSORS_LEN + (index)) diff --git a/app/src/behaviors/behavior_sensor_rotate_key_press.c b/app/src/behaviors/behavior_sensor_rotate_key_press.c index ed6eedae..72e33ea4 100644 --- a/app/src/behaviors/behavior_sensor_rotate_key_press.c +++ b/app/src/behaviors/behavior_sensor_rotate_key_press.c @@ -21,7 +21,8 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); static int behavior_sensor_rotate_key_press_init(const struct device *dev) { return 0; }; static int on_sensor_binding_triggered(struct zmk_behavior_binding *binding, - const struct device *sensor, int64_t timestamp) { + const struct device *sensor, uint32_t virtual_key_position, + int64_t timestamp) { struct sensor_value value; int err; uint32_t keycode; diff --git a/app/src/combo.c b/app/src/combo.c index 2e237330..90c89c15 100644 --- a/app/src/combo.c +++ b/app/src/combo.c @@ -19,6 +19,7 @@ #include #include #include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -476,7 +477,7 @@ ZMK_SUBSCRIPTION(combo, zmk_position_state_changed); .key_positions = DT_PROP(n, key_positions), \ .key_position_len = DT_PROP_LEN(n, key_positions), \ .behavior = ZMK_KEYMAP_EXTRACT_BINDING(0, n), \ - .virtual_key_position = ZMK_KEYMAP_LEN + __COUNTER__, \ + .virtual_key_position = ZMK_VIRTUAL_KEY_POSITION_COMBO(__COUNTER__), \ .slow_release = DT_PROP(n, slow_release), \ .layers = DT_PROP(n, layers), \ .layers_len = DT_PROP_LEN(n, layers), \ diff --git a/app/src/keymap.c b/app/src/keymap.c index c4e304d4..825246fa 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -4,16 +4,17 @@ * SPDX-License-Identifier: MIT */ +#include #include #include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); +#include +#include #include #include -#include -#include -#include +#include #include #if ZMK_BLE_IS_CENTRAL @@ -269,7 +270,8 @@ int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sens continue; } - ret = behavior_sensor_keymap_binding_triggered(binding, sensor, timestamp); + const uint32_t position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_number); + ret = behavior_sensor_keymap_binding_triggered(binding, sensor, position, timestamp); if (ret > 0) { LOG_DBG("behavior processing to continue to next layer"); From 5c6f21b0e0fe0e85b43056e1ec8b6087b5d31e29 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 29 Oct 2022 23:26:25 -0500 Subject: [PATCH 202/289] fix: Fix compiler warnings in sensor code --- app/src/keymap.c | 2 +- app/src/sensors.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/keymap.c b/app/src/keymap.c index 825246fa..1f55ad03 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -255,7 +255,7 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sensor, int64_t timestamp) { for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= _zmk_keymap_layer_default; layer--) { - if (zmk_keymap_layer_active(layer) && zmk_sensor_keymap[layer] != NULL) { + if (zmk_keymap_layer_active(layer)) { struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_number]; const struct device *behavior; int ret; diff --git a/app/src/sensors.c b/app/src/sensors.c index efae2bd9..1b92147f 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -35,9 +35,10 @@ struct sensors_data_item { static struct sensors_data_item sensors[] = {LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_ITEM, (, ), 0)}; -static void zmk_sensors_trigger_handler(const struct device *dev, struct sensor_trigger *trigger) { +static void zmk_sensors_trigger_handler(const struct device *dev, + const struct sensor_trigger *trigger) { int err; - struct sensors_data_item *item = CONTAINER_OF(trigger, struct sensors_data_item, trigger); + const struct sensors_data_item *item = CONTAINER_OF(trigger, struct sensors_data_item, trigger); LOG_DBG("sensor %d", item->sensor_number); From 9a73650041da7008fa2df7bd8bbb02ecc8efd9b4 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 21 Apr 2023 09:16:28 -0700 Subject: [PATCH 203/289] fix(boards): Move nice!60 to SPI3 for underglow * Move to SPI3 for underglow peripheral, needed after the move to pinctrl. --- app/boards/arm/nice60/nice60-pinctrl.dtsi | 2 +- app/boards/arm/nice60/nice60.dts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/boards/arm/nice60/nice60-pinctrl.dtsi b/app/boards/arm/nice60/nice60-pinctrl.dtsi index aced76b4..ace80f10 100644 --- a/app/boards/arm/nice60/nice60-pinctrl.dtsi +++ b/app/boards/arm/nice60/nice60-pinctrl.dtsi @@ -4,7 +4,7 @@ */ &pinctrl { - spi0_default: spi0_default { + spi3_default: spi3_default { group1 { psels = ; }; diff --git a/app/boards/arm/nice60/nice60.dts b/app/boards/arm/nice60/nice60.dts index c982f88e..fdc65d6b 100644 --- a/app/boards/arm/nice60/nice60.dts +++ b/app/boards/arm/nice60/nice60.dts @@ -109,10 +109,10 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) R status = "okay"; }; -&spi0 { +&spi3 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ - pinctrl-0 = <&spi0_default>; + + pinctrl-0 = <&spi3_default>; pinctrl-names = "default"; status = "okay"; From 3db163aa2cf7db2bd710ba93b57f3eb804b086c7 Mon Sep 17 00:00:00 2001 From: Nick Conway Date: Mon, 23 May 2022 16:33:08 -0400 Subject: [PATCH 204/289] feat(behaviors): Add reusable sensor behaviors. * Add new sensor behaviors that either take full bindings add definition, or accept parameters when bound in the keymap. * Remove existing hard-coded key press sensor behavior and instead leverage new generic sensor behaviors to achieve the same functionality. Co-authored-by: nick@conway.dev --- app/CMakeLists.txt | 4 +- app/Kconfig | 6 +- app/Kconfig.behaviors | 24 ++++++ .../behaviors/sensor_rotate_key_press.dtsi | 3 +- .../zmk,behavior-sensor-rotate-key-press.yaml | 19 ----- .../zmk,behavior-sensor-rotate-var.yaml | 25 ++++++ .../behaviors/zmk,behavior-sensor-rotate.yaml | 21 +++++ app/include/drivers/behavior.h | 10 +-- app/src/behaviors/behavior_sensor_rotate.c | 40 ++++++++++ .../behaviors/behavior_sensor_rotate_common.c | 52 +++++++++++++ .../behaviors/behavior_sensor_rotate_common.h | 13 ++++ .../behavior_sensor_rotate_key_press.c | 69 ----------------- .../behaviors/behavior_sensor_rotate_var.c | 31 ++++++++ app/src/keymap.c | 5 +- docs/docs/behaviors/sensor-rotate.md | 77 +++++++++++++++++++ docs/docs/features/encoders.md | 8 +- docs/sidebars.js | 1 + 17 files changed, 301 insertions(+), 107 deletions(-) create mode 100644 app/Kconfig.behaviors delete mode 100644 app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-key-press.yaml create mode 100644 app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml create mode 100644 app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml create mode 100644 app/src/behaviors/behavior_sensor_rotate.c create mode 100644 app/src/behaviors/behavior_sensor_rotate_common.c create mode 100644 app/src/behaviors/behavior_sensor_rotate_common.h delete mode 100644 app/src/behaviors/behavior_sensor_rotate_key_press.c create mode 100644 app/src/behaviors/behavior_sensor_rotate_var.c create mode 100644 docs/docs/behaviors/sensor-rotate.md diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 3da50b57..a647e883 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -51,7 +51,9 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/behaviors/behavior_to_layer.c) target_sources(app PRIVATE src/behaviors/behavior_transparent.c) target_sources(app PRIVATE src/behaviors/behavior_none.c) - target_sources(app PRIVATE src/behaviors/behavior_sensor_rotate_key_press.c) + target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE app PRIVATE src/behaviors/behavior_sensor_rotate.c) + target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR app PRIVATE src/behaviors/behavior_sensor_rotate_var.c) + target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON app PRIVATE src/behaviors/behavior_sensor_rotate_common.c) target_sources(app PRIVATE src/combo.c) target_sources(app PRIVATE src/behaviors/behavior_tap_dance.c) target_sources(app PRIVATE src/behavior_queue.c) diff --git a/app/Kconfig b/app/Kconfig index 431a1bb1..ccc5f42d 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -350,11 +350,7 @@ config ZMK_BEHAVIORS_QUEUE_SIZE int "Maximum number of behaviors to allow queueing from a macro or other complex behavior" default 64 -DT_COMPAT_ZMK_BEHAVIOR_KEY_TOGGLE := zmk,behavior-key-toggle - -config ZMK_BEHAVIOR_KEY_TOGGLE - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_KEY_TOGGLE)) +rsource "Kconfig.behaviors" config ZMK_MACRO_DEFAULT_WAIT_MS int "Default time to wait (in milliseconds) before triggering the next behavior in macros" diff --git a/app/Kconfig.behaviors b/app/Kconfig.behaviors new file mode 100644 index 00000000..17850eae --- /dev/null +++ b/app/Kconfig.behaviors @@ -0,0 +1,24 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config ZMK_BEHAVIOR_KEY_TOGGLE + bool + default y + depends on DT_HAS_ZMK_BEHAVIOR_KEY_TOGGLE_ENABLED + + +config ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON + bool + default n + +config ZMK_BEHAVIOR_SENSOR_ROTATE + bool + default y + depends on DT_HAS_ZMK_BEHAVIOR_SENSOR_ROTATE_ENABLED + select ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON + +config ZMK_BEHAVIOR_SENSOR_ROTATE_VAR + bool + default y + depends on DT_HAS_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR_ENABLED + select ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON \ No newline at end of file diff --git a/app/dts/behaviors/sensor_rotate_key_press.dtsi b/app/dts/behaviors/sensor_rotate_key_press.dtsi index d3f084b0..ed1b4cd0 100644 --- a/app/dts/behaviors/sensor_rotate_key_press.dtsi +++ b/app/dts/behaviors/sensor_rotate_key_press.dtsi @@ -8,9 +8,10 @@ behaviors { /* DEPRECATED: `inc_dec_cp` will be removed in the future */ /omit-if-no-ref/ inc_dec_cp: inc_dec_kp: behavior_sensor_rotate_key_press { - compatible = "zmk,behavior-sensor-rotate-key-press"; + compatible = "zmk,behavior-sensor-rotate-var"; label = "ENC_KEY_PRESS"; #sensor-binding-cells = <2>; + bindings = <&kp>, <&kp>; }; }; }; diff --git a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-key-press.yaml b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-key-press.yaml deleted file mode 100644 index 1fc60fcf..00000000 --- a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-key-press.yaml +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2020 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Sensor rotate key press/release behavior - -compatible: "zmk,behavior-sensor-rotate-key-press" - -properties: - label: - type: string - required: true - "#sensor-binding-cells": - type: int - required: true - const: 2 - -sensor-binding-cells: - - param1 - - param2 diff --git a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml new file mode 100644 index 00000000..0da3b4db --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml @@ -0,0 +1,25 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Sensor rotate behavior + +compatible: "zmk,behavior-sensor-rotate-var" + +properties: + label: + type: string + required: true + "#sensor-binding-cells": + type: int + required: true + const: 2 + bindings: + type: phandles + required: true + tap-ms: + type: int + default: 5 + +sensor-binding-cells: + - param1 + - param2 diff --git a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml new file mode 100644 index 00000000..d20777b8 --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml @@ -0,0 +1,21 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Sensor rotate behavior + +compatible: "zmk,behavior-sensor-rotate" + +properties: + label: + type: string + required: true + "#sensor-binding-cells": + type: int + required: true + const: 0 + bindings: + type: phandle-array + required: true + tap-ms: + type: int + default: 5 diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index df18385f..380fc76f 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -26,8 +26,7 @@ typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *b struct zmk_behavior_binding_event event); typedef int (*behavior_sensor_keymap_binding_callback_t)(struct zmk_behavior_binding *binding, const struct device *sensor, - uint32_t virtual_key_position, - int64_t timestamp); + struct zmk_behavior_binding_event event); enum behavior_locality { BEHAVIOR_LOCALITY_CENTRAL, @@ -161,13 +160,12 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi */ __syscall int behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, const struct device *sensor, - uint32_t virtual_key_position, - int64_t timestamp); + struct zmk_behavior_binding_event event); static inline int z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, const struct device *sensor, - uint32_t virtual_key_position, int64_t timestamp) { + struct zmk_behavior_binding_event event) { const struct device *dev = device_get_binding(binding->behavior_dev); if (dev == NULL) { @@ -180,7 +178,7 @@ z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *bin return -ENOTSUP; } - return api->sensor_binding_triggered(binding, sensor, virtual_key_position, timestamp); + return api->sensor_binding_triggered(binding, sensor, event); } /** diff --git a/app/src/behaviors/behavior_sensor_rotate.c b/app/src/behaviors/behavior_sensor_rotate.c new file mode 100644 index 00000000..e12278bb --- /dev/null +++ b/app/src/behaviors/behavior_sensor_rotate.c @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_behavior_sensor_rotate + +#include + +#include + +#include "behavior_sensor_rotate_common.h" + +static const struct behavior_driver_api behavior_sensor_rotate_driver_api = { + .sensor_binding_triggered = zmk_behavior_sensor_rotate_common_trigger}; + +static int behavior_sensor_rotate_init(const struct device *dev) { return 0; }; + +#define _TRANSFORM_ENTRY(idx, node) \ + { \ + .behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(node, bindings, idx), label), \ + .param1 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param1), (0), \ + (DT_INST_PHA_BY_IDX(node, bindings, idx, param1))), \ + .param2 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param2), (0), \ + (DT_INST_PHA_BY_IDX(node, bindings, idx, param2))), \ + } + +#define SENSOR_ROTATE_INST(n) \ + static struct behavior_sensor_rotate_config behavior_sensor_rotate_config_##n = { \ + .cw_binding = _TRANSFORM_ENTRY(0, n), \ + .ccw_binding = _TRANSFORM_ENTRY(1, n), \ + .tap_ms = DT_INST_PROP_OR(n, tap_ms, 5), \ + .override_params = false, \ + }; \ + DEVICE_DT_INST_DEFINE( \ + n, behavior_sensor_rotate_init, NULL, NULL, &behavior_sensor_rotate_config_##n, \ + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sensor_rotate_driver_api); + +DT_INST_FOREACH_STATUS_OKAY(SENSOR_ROTATE_INST) diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c new file mode 100644 index 00000000..bd31170e --- /dev/null +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -0,0 +1,52 @@ + +#include +#include +#include +#include + +#include + +#include "behavior_sensor_rotate_common.h" + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, + const struct device *sensor, + struct zmk_behavior_binding_event event) { + const struct device *dev = device_get_binding(binding->behavior_dev); + const struct behavior_sensor_rotate_config *cfg = dev->config; + + struct sensor_value value; + + const int err = sensor_channel_get(sensor, SENSOR_CHAN_ROTATION, &value); + + if (err < 0) { + LOG_WRN("Failed to get sensor rotation value: %d", err); + return err; + } + + struct zmk_behavior_binding triggered_binding; + switch (value.val1) { + case 1: + triggered_binding = cfg->cw_binding; + if (cfg->override_params) { + triggered_binding.param1 = binding->param1; + } + break; + case -1: + triggered_binding = cfg->ccw_binding; + if (cfg->override_params) { + triggered_binding.param1 = binding->param2; + } + break; + default: + return -ENOTSUP; + } + + LOG_DBG("Sensor binding: %s", binding->behavior_dev); + + zmk_behavior_queue_add(event.position, triggered_binding, true, cfg->tap_ms); + zmk_behavior_queue_add(event.position, triggered_binding, false, 0); + + return ZMK_BEHAVIOR_OPAQUE; +} diff --git a/app/src/behaviors/behavior_sensor_rotate_common.h b/app/src/behaviors/behavior_sensor_rotate_common.h new file mode 100644 index 00000000..2d58218d --- /dev/null +++ b/app/src/behaviors/behavior_sensor_rotate_common.h @@ -0,0 +1,13 @@ + +#include + +struct behavior_sensor_rotate_config { + struct zmk_behavior_binding cw_binding; + struct zmk_behavior_binding ccw_binding; + int tap_ms; + bool override_params; +}; + +int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, + const struct device *sensor, + struct zmk_behavior_binding_event event); \ No newline at end of file diff --git a/app/src/behaviors/behavior_sensor_rotate_key_press.c b/app/src/behaviors/behavior_sensor_rotate_key_press.c deleted file mode 100644 index 72e33ea4..00000000 --- a/app/src/behaviors/behavior_sensor_rotate_key_press.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_behavior_sensor_rotate_key_press - -#include -#include -#include - -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - -static int behavior_sensor_rotate_key_press_init(const struct device *dev) { return 0; }; - -static int on_sensor_binding_triggered(struct zmk_behavior_binding *binding, - const struct device *sensor, uint32_t virtual_key_position, - int64_t timestamp) { - struct sensor_value value; - int err; - uint32_t keycode; - LOG_DBG("inc keycode 0x%02X dec keycode 0x%02X", binding->param1, binding->param2); - - err = sensor_channel_get(sensor, SENSOR_CHAN_ROTATION, &value); - - if (err) { - LOG_WRN("Failed to ge sensor rotation value: %d", err); - return err; - } - - switch (value.val1) { - case 1: - keycode = binding->param1; - break; - case -1: - keycode = binding->param2; - break; - default: - return -ENOTSUP; - } - - LOG_DBG("SEND %d", keycode); - - ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(keycode, true, timestamp)); - - // TODO: Better way to do this? - k_msleep(5); - - return ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(keycode, false, timestamp)); -} - -static const struct behavior_driver_api behavior_sensor_rotate_key_press_driver_api = { - .sensor_binding_triggered = on_sensor_binding_triggered}; - -#define KP_INST(n) \ - DEVICE_DT_INST_DEFINE(n, behavior_sensor_rotate_key_press_init, NULL, NULL, NULL, APPLICATION, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ - &behavior_sensor_rotate_key_press_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(KP_INST) - -#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_sensor_rotate_var.c b/app/src/behaviors/behavior_sensor_rotate_var.c new file mode 100644 index 00000000..a82267a5 --- /dev/null +++ b/app/src/behaviors/behavior_sensor_rotate_var.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_behavior_sensor_rotate_var + +#include + +#include + +#include "behavior_sensor_rotate_common.h" + +static const struct behavior_driver_api behavior_sensor_rotate_var_driver_api = { + .sensor_binding_triggered = zmk_behavior_sensor_rotate_common_trigger}; + +static int behavior_sensor_rotate_var_init(const struct device *dev) { return 0; }; + +#define SENSOR_ROTATE_VAR_INST(n) \ + static struct behavior_sensor_rotate_config behavior_sensor_rotate_var_config_##n = { \ + .cw_binding = {.behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label)}, \ + .ccw_binding = {.behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label)}, \ + .tap_ms = DT_INST_PROP(n, tap_ms), \ + .override_params = true, \ + }; \ + DEVICE_DT_INST_DEFINE( \ + n, behavior_sensor_rotate_var_init, NULL, NULL, &behavior_sensor_rotate_var_config_##n, \ + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sensor_rotate_var_driver_api); + +DT_INST_FOREACH_STATUS_OKAY(SENSOR_ROTATE_VAR_INST) diff --git a/app/src/keymap.c b/app/src/keymap.c index 1f55ad03..909fd20d 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -270,8 +270,9 @@ int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sens continue; } - const uint32_t position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_number); - ret = behavior_sensor_keymap_binding_triggered(binding, sensor, position, timestamp); + struct zmk_behavior_binding_event event = { + .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_number), .timestamp = timestamp}; + ret = behavior_sensor_keymap_binding_triggered(binding, sensor, event); if (ret > 0) { LOG_DBG("behavior processing to continue to next layer"); diff --git a/docs/docs/behaviors/sensor-rotate.md b/docs/docs/behaviors/sensor-rotate.md new file mode 100644 index 00000000..bd8a50bc --- /dev/null +++ b/docs/docs/behaviors/sensor-rotate.md @@ -0,0 +1,77 @@ +--- +title: Sensor Rotation +sidebar_label: Sensor Rotation +--- + +## Summary + +The Sensor Rotation behavior triggers a different behavior, depending on whether the sensor is rotated clockwise or counter-clockwise. Two variants of this behavior are available, allowing either fully specifying the +two behaviors and their parameters together, or allowing binding the sensor rotation with different clockwise and counterclockwise parameters in the keymap itself. + +## Sensor Rotation + +The standard sensor rotation behavior allows fully binding behaviors to be invoked: + +- If rotated counter-clockwise, the first bound behavior is triggered. +- If rotated clockwise, the second bound behavior is triggered. + +### Configuration + +Here is an example that binds the [RGB Underglow Behavior](/docs/behaviors/underglow.md) to change the RGB brightness: + +``` +/ { + behaviors { + rgb_encoder: rgb_encoder { + compatible = "zmk,behavior-sensor-rotate"; + label = "RGB_ENCODER"; + #sensor-binding-cells = <0>; + bindings = <&rgb_ug RGB_BRD>, <&rgb_ug RGB_BRI>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + + base { + ... + sensor-bindings = <&rgb_encoder>; + } + }; +}; +``` + +## Variable Sensor Rotation + +The variable sensor rotation behavior is configured with two behaviors that each expect a single parameter, +allowing the sensor rotation instance to be bound with two parameters at usage time. + +- If rotated counter-clockwise, the first bound behavior is triggered with the first parameter passed to the sensor rotation. +- If rotated clockwise, the second bound behavior is triggered with the second parameter passed to the sensor rotation. + +### Configuration + +Here is an example, showing how send key presses on rotation: + +First, defining the sensor rotation itself, binding the [Key Press Behavior](/docs/behaviors/key-press.md) twice, then binding it in the `sensor-bindings` property of a keymap layer: + +``` +/ { + behaviors { + rot_kp: behavior_sensor_rotate_kp { + compatible = "zmk,behavior-sensor-rotate-var"; + label = "ENC_KP"; + #sensor-binding-cells = <2>; + bindings = <&kp>, <&kp>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + base { + ... + sensor-bindings = <&rot_kp PG_DN PG_UP>; + } + } +}; +``` diff --git a/docs/docs/features/encoders.md b/docs/docs/features/encoders.md index 225ee6f3..29906c90 100644 --- a/docs/docs/features/encoders.md +++ b/docs/docs/features/encoders.md @@ -23,17 +23,17 @@ Keyboards and macropads with encoder support will typically take the two EC11 pi ### Rotation -Rotation is handled separately as a type of sensor. The behavior for this is set in `sensor-bindings`, which is defined in each keymap layer in the following format: +Rotation is handled separately as a type of sensor. The behavior for this is set in `sensor-bindings`. See [Sensor Rotation](../behaviors/sensor-rotate.md) for customizing this behavior. ``` -sensor-bindings = ; +sensor-bindings = ; ``` -- `BINDING`, for now, has only one behavior available; `&inc_dec_kp` for key presses (see [Key Press](../behaviors/key-press.md) for details on available keycodes). +- `BINDING` is either a user-defined behavior, or `&inc_dec_kp` for key presses (see [Key Press](../behaviors/key-press.md) for details on available keycodes). - `CW_KEY` is the keycode activated by a clockwise turn. - `CCW_KEY` is the keycode activated by a counter-clockwise turn. -Additional encoders can be configured by adding more `BINDING CW_KEY CCW_KEY` sets immediately after the first. +Additional encoders can be configured by adding more bindings immediately after the first. As an example, a complete `sensor-bindings` for a Kyria with two encoders could look like: diff --git a/docs/sidebars.js b/docs/sidebars.js index a52f3302..21585747 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -35,6 +35,7 @@ module.exports = { "behaviors/tap-dance", "behaviors/caps-word", "behaviors/key-repeat", + "behaviors/sensor-rotate", "behaviors/reset", "behaviors/bluetooth", "behaviors/outputs", From 9d64c2a3a0bdd3d092585be1c6ba86fc8e26d084 Mon Sep 17 00:00:00 2001 From: Nick Coutsos Date: Sat, 22 Apr 2023 20:14:08 -0400 Subject: [PATCH 205/289] fix(docs): switch sensor rotate parameter order --- docs/docs/behaviors/sensor-rotate.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/docs/behaviors/sensor-rotate.md b/docs/docs/behaviors/sensor-rotate.md index bd8a50bc..02e56924 100644 --- a/docs/docs/behaviors/sensor-rotate.md +++ b/docs/docs/behaviors/sensor-rotate.md @@ -12,8 +12,8 @@ two behaviors and their parameters together, or allowing binding the sensor rota The standard sensor rotation behavior allows fully binding behaviors to be invoked: -- If rotated counter-clockwise, the first bound behavior is triggered. -- If rotated clockwise, the second bound behavior is triggered. +- If rotated clockwise, the first bound behavior is triggered. +- If rotated counter-clockwise, the second bound behavior is triggered. ### Configuration @@ -26,7 +26,7 @@ Here is an example that binds the [RGB Underglow Behavior](/docs/behaviors/under compatible = "zmk,behavior-sensor-rotate"; label = "RGB_ENCODER"; #sensor-binding-cells = <0>; - bindings = <&rgb_ug RGB_BRD>, <&rgb_ug RGB_BRI>; + bindings = <&rgb_ug RGB_BRI>, <&rgb_ug RGB_BRD>; }; }; @@ -46,8 +46,8 @@ Here is an example that binds the [RGB Underglow Behavior](/docs/behaviors/under The variable sensor rotation behavior is configured with two behaviors that each expect a single parameter, allowing the sensor rotation instance to be bound with two parameters at usage time. -- If rotated counter-clockwise, the first bound behavior is triggered with the first parameter passed to the sensor rotation. -- If rotated clockwise, the second bound behavior is triggered with the second parameter passed to the sensor rotation. +- If rotated clockwise, the first bound behavior is triggered with the first parameter passed to the sensor rotation. +- If rotated counter-clockwise, the second bound behavior is triggered with the second parameter passed to the sensor rotation. ### Configuration @@ -70,7 +70,7 @@ First, defining the sensor rotation itself, binding the [Key Press Behavior](/do compatible = "zmk,keymap"; base { ... - sensor-bindings = <&rot_kp PG_DN PG_UP>; + sensor-bindings = <&rot_kp PG_UP PG_DN>; } } }; From 53dea223b73922e385ecf11883e5327a4f328eae Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 14 Jan 2023 12:01:33 -0500 Subject: [PATCH 206/289] feat(shields): Add splitkb.com Kyria Rev3. --- app/boards/shields/kyria/Kconfig.defconfig | 2 +- app/boards/shields/kyria/Kconfig.shield | 8 ++++ app/boards/shields/kyria/kyria_rev3.conf | 10 +++++ app/boards/shields/kyria/kyria_rev3.dtsi | 41 +++++++++++++++++++ app/boards/shields/kyria/kyria_rev3.keymap | 38 +++++++++++++++++ app/boards/shields/kyria/kyria_rev3.zmk.yml | 15 +++++++ .../shields/kyria/kyria_rev3_left.overlay | 29 +++++++++++++ .../shields/kyria/kyria_rev3_right.overlay | 33 +++++++++++++++ 8 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 app/boards/shields/kyria/kyria_rev3.conf create mode 100644 app/boards/shields/kyria/kyria_rev3.dtsi create mode 100644 app/boards/shields/kyria/kyria_rev3.keymap create mode 100644 app/boards/shields/kyria/kyria_rev3.zmk.yml create mode 100644 app/boards/shields/kyria/kyria_rev3_left.overlay create mode 100644 app/boards/shields/kyria/kyria_rev3_right.overlay diff --git a/app/boards/shields/kyria/Kconfig.defconfig b/app/boards/shields/kyria/Kconfig.defconfig index cdb57b6b..53b441cb 100644 --- a/app/boards/shields/kyria/Kconfig.defconfig +++ b/app/boards/shields/kyria/Kconfig.defconfig @@ -1,5 +1,5 @@ -if SHIELD_KYRIA_LEFT || SHIELD_KYRIA_REV2_LEFT +if SHIELD_KYRIA_LEFT || SHIELD_KYRIA_REV2_LEFT || SHIELD_KYRIA_REV3_LEFT config ZMK_KEYBOARD_NAME default "Kyria" diff --git a/app/boards/shields/kyria/Kconfig.shield b/app/boards/shields/kyria/Kconfig.shield index 6304f5d5..52df9378 100644 --- a/app/boards/shields/kyria/Kconfig.shield +++ b/app/boards/shields/kyria/Kconfig.shield @@ -19,3 +19,11 @@ config SHIELD_KYRIA_REV2_LEFT config SHIELD_KYRIA_REV2_RIGHT def_bool $(shields_list_contains,kyria_rev2_right) select SHIELD_KYRIA + +config SHIELD_KYRIA_REV3_LEFT + def_bool $(shields_list_contains,kyria_rev3_left) + select SHIELD_KYRIA + +config SHIELD_KYRIA_REV3_RIGHT + def_bool $(shields_list_contains,kyria_rev3_right) + select SHIELD_KYRIA diff --git a/app/boards/shields/kyria/kyria_rev3.conf b/app/boards/shields/kyria/kyria_rev3.conf new file mode 100644 index 00000000..7a0b5b6c --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3.conf @@ -0,0 +1,10 @@ +# Uncomment these two line to add support for encoders to your firmware +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the Kyria OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment the following lines to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/kyria/kyria_rev3.dtsi b/app/boards/shields/kyria/kyria_rev3.dtsi new file mode 100644 index 00000000..4a500006 --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3.dtsi @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "kyria_common.dtsi" + +/ { + chosen { + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <4>; + // | MX6 | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | + // | MX12 | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | + // | MX20 | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | + // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,3) RC(2,6) RC(2,7) RC(3,10) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,2) RC(3,4) RC(3,5) RC(3,1) RC(3,6) RC(3,7) RC(3,12) RC(3,8) RC(3,9) RC(3,11) + >; + }; +}; + +&left_encoder { + resolution = <2>; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; +}; + +&right_encoder { + resolution = <2>; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; +}; diff --git a/app/boards/shields/kyria/kyria_rev3.keymap b/app/boards/shields/kyria/kyria_rev3.keymap new file mode 100644 index 00000000..fff2e051 --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3.keymap @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include + +/* Uncomment this block if using RGB +&led_strip { + chain-length = <6>; + // chain-length = <31>; // Uncomment if using both per-key and underglow LEDs + // chain-length = <25>; // Uncomment if using only per-key LEDs. +}; + */ + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { + // --------------------------------------------------------------------------------------------------------------------------------- + // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | + // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | + // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | + bindings = < + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; +}; diff --git a/app/boards/shields/kyria/kyria_rev3.zmk.yml b/app/boards/shields/kyria/kyria_rev3.zmk.yml new file mode 100644 index 00000000..bf84c82c --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: kyria_rev3 +name: Kyria Rev3 +type: shield +url: https://splitkb.com/products/kyria-pcb-kit +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display + - encoder + - underglow +siblings: + - kyria_rev3_left + - kyria_rev3_right diff --git a/app/boards/shields/kyria/kyria_rev3_left.overlay b/app/boards/shields/kyria/kyria_rev3_left.overlay new file mode 100644 index 00000000..d00b9e4a --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3_left.overlay @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "kyria_rev3.dtsi" + +&kscan0 { + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + ; +}; + +&left_encoder { + status = "okay"; +}; diff --git a/app/boards/shields/kyria/kyria_rev3_right.overlay b/app/boards/shields/kyria/kyria_rev3_right.overlay new file mode 100644 index 00000000..ee69730c --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3_right.overlay @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "kyria_rev3.dtsi" + +&default_transform { + col-offset = <7>; +}; + +&kscan0 { + row-gpios + = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; +}; + +&right_encoder { + status = "okay"; +}; From 9c4f1e02d14e2903d7ec377fc3042bb704cc7253 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Mon, 24 Apr 2023 16:24:36 +0800 Subject: [PATCH 207/289] fix(docs): Update references to QMK settings * Remove TAPPING_FORCE_HOLD reference * Remove IGNORE_MOD_TAP_INTERRUPT reference --- docs/docs/behaviors/hold-tap.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index 1dfb8e5d..f267e4a4 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -49,8 +49,6 @@ Defines how long a key must be pressed to trigger Hold behavior. If you press a tapped hold-tap again within `quick-tap-ms` milliseconds, it will always trigger the tap behavior. This is useful for things like a backspace, where a quick tap+hold holds backspace pressed. Set this to a negative value to disable. The default is -1 (disabled). -In QMK, unlike ZMK, this functionality is enabled by default, and you turn it off using `TAPPING_FORCE_HOLD`. - #### `global-quick-tap` If `global-quick-tap` is enabled, then `quick-tap-ms` will apply not only when the given hold-tap is tapped, but for any key tapped before it. This effectively disables the hold-tap when typing quickly, which can be quite useful for homerow mods. It can also have the effect of removing the input delay when typing quickly. @@ -319,4 +317,4 @@ This hold-tap example implements a [momentary-layer](layers.md/#momentary-layer) ### Comparison to QMK -The hold-preferred flavor works similar to the `HOLD_ON_OTHER_KEY_PRESS` setting in QMK. The 'balanced' flavor is similar to the `PERMISSIVE_HOLD` setting, and the `tap-preferred` flavor is similar to `IGNORE_MOD_TAP_INTERRUPT`. +The `hold-preferred` flavor works similar to the `HOLD_ON_OTHER_KEY_PRESS` setting in QMK. The `balanced` flavor is similar to the `PERMISSIVE_HOLD` setting, and the `tap-preferred` flavor is the QMK default. From 32ae776c42215d7302ab47787cbfb47298ccb532 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 22 Apr 2023 23:16:36 -0500 Subject: [PATCH 208/289] refactor: Add more checks to pre-commit Updated existing pre-commit hooks and added some new hooks: - Remove trailing whitespace - Ensure every non-empty file ends with a new line - Check YAML file validity - Prevent adding large files - Ensure any scripts with shebangs are executable Added a GitHub action to run pre-commit on every commit. Removed any existing actions which duplicate pre-commit. Ran pre-commit on the codebase. --- .github/pull_request_template.md | 24 +++--- .github/workflows/build-user-config.yml | 4 +- .github/workflows/build.yml | 6 +- .github/workflows/clang-format-lint.yml | 29 ------- .github/workflows/doc-checks.yml | 10 --- .../hardware-metadata-validation.yml | 11 --- .github/workflows/pre-commit.yml | 15 ++++ .pre-commit-config.yaml | 12 ++- .vscode/settings.json | 2 +- app/.prettierrc.js | 2 +- .../bluemicro840/arduino_pro_micro_pins.dtsi | 10 +-- .../arm/corneish_zen/corneish_zen_v2_left.dts | 2 +- .../corneish_zen/corneish_zen_v2_right.dts | 2 +- app/boards/arm/ferris/README.md | 1 - app/boards/arm/nice60/README.md | 2 + app/boards/arm/nice60/nice60.keymap | 4 +- app/boards/arm/pillbug/pillbug.dts | 2 +- app/boards/arm/preonic/preonic_rev3.yaml | 2 +- app/boards/arm/s40nc/README.md | 2 + app/boards/arm/s40nc/s40nc.keymap | 8 +- app/boards/shields/bfo9000/README.md | 8 +- .../boardsource5x12/boardsource5x12.keymap | 6 +- .../boardsource5x12/boardsource5x12.overlay | 2 +- app/boards/shields/chalice/chalice.keymap | 8 +- app/boards/shields/chalice/chalice.overlay | 4 +- app/boards/shields/clog/clog.dtsi | 2 +- app/boards/shields/corne/corne.dtsi | 2 +- app/boards/shields/eek/eek.keymap | 12 +-- app/boards/shields/eek/eek.overlay | 2 +- .../shields/elephant42/Kconfig.defconfig | 2 +- app/boards/shields/elephant42/elephant42.dtsi | 4 +- .../shields/elephant42/elephant42.keymap | 4 +- .../elephant42/elephant42_left.overlay | 2 +- .../elephant42/elephant42_right.overlay | 2 +- app/boards/shields/helix/helix.dtsi | 2 +- app/boards/shields/helix/helix.keymap | 4 +- app/boards/shields/helix/helix_left.overlay | 2 +- .../shields/hummingbird/hummingbird.overlay | 2 +- app/boards/shields/iris/Kconfig.defconfig | 2 +- app/boards/shields/iris/iris.dtsi | 2 +- app/boards/shields/jian/jian.dtsi | 2 +- app/boards/shields/jiran/jiran.dtsi | 2 +- app/boards/shields/jorne/Kconfig.defconfig | 2 +- app/boards/shields/jorne/jorne.dtsi | 2 +- app/boards/shields/kyria/Kconfig.defconfig | 2 +- app/boards/shields/kyria/kyria_common.dtsi | 2 +- app/boards/shields/leeloo/Kconfig.defconfig | 2 +- app/boards/shields/leeloo/README.md | 19 +++-- app/boards/shields/lily58/lily58.dtsi | 2 +- app/boards/shields/lotus58/Kconfig.defconfig | 2 +- app/boards/shields/lotus58/lotus58.dtsi | 2 +- app/boards/shields/lotus58/lotus58.keymap | 10 +-- .../shields/lotus58/lotus58_left.overlay | 2 +- app/boards/shields/microdox/Kconfig.defconfig | 2 +- app/boards/shields/microdox/microdox.dtsi | 2 +- app/boards/shields/murphpad/murphpad.keymap | 26 +++--- app/boards/shields/murphpad/murphpad.overlay | 2 +- app/boards/shields/naked60/naked60.keymap | 4 +- app/boards/shields/nibble/nibble.keymap | 2 +- app/boards/shields/nibble/nibble.overlay | 2 +- app/boards/shields/nice_view/README.md | 2 +- .../shields/nice_view_adapter/README.md | 2 +- app/boards/shields/pancake/pancake.keymap | 12 +-- app/boards/shields/pancake/pancake.overlay | 4 +- app/boards/shields/qaz/qaz.overlay | 2 +- .../shields/quefrency/Kconfig.defconfig | 4 +- app/boards/shields/quefrency/quefrency.dtsi | 10 +-- .../shields/quefrency/quefrency_right.overlay | 2 +- app/boards/shields/redox/redox.dtsi | 4 +- app/boards/shields/redox/redox.keymap | 4 +- app/boards/shields/snap/Kconfig.defconfig | 2 +- app/boards/shields/snap/snap.dtsi | 2 +- app/boards/shields/snap/snap.keymap | 2 +- app/boards/shields/snap/snap_left.overlay | 2 +- app/boards/shields/snap/snap_right.overlay | 2 +- app/boards/shields/sofle/Kconfig.defconfig | 2 +- .../splitkb_aurora_corne/Kconfig.defconfig | 2 +- .../splitkb_aurora_corne_left.overlay | 2 +- .../splitkb_aurora_corne_right.overlay | 2 +- .../splitkb_aurora_lily58/Kconfig.defconfig | 2 +- .../splitkb_aurora_lily58_left.overlay | 2 +- .../splitkb_aurora_lily58_right.overlay | 2 +- .../splitkb_aurora_sweep/Kconfig.defconfig | 2 +- .../splitkb_aurora_sweep.keymap | 52 ++++++------ .../splitkb_aurora_sweep_left.overlay | 2 +- .../splitkb_aurora_sweep_right.overlay | 2 +- .../shields/splitreus62/Kconfig.defconfig | 6 +- .../shields/splitreus62/splitreus62.dtsi | 2 +- .../splitreus62/splitreus62_right.overlay | 2 +- app/boards/shields/tg4x/README.md | 6 +- app/boards/shields/tg4x/tg4x.overlay | 2 +- app/boards/shields/tidbit/tidbit.keymap | 2 +- app/boards/shields/tidbit/tidbit_19key.keymap | 2 +- .../two_percent_milk/two_percent_milk.keymap | 4 +- .../shields/waterfowl/Kconfig.defconfig | 2 +- app/boards/shields/waterfowl/waterfowl.dtsi | 2 +- app/boards/shields/waterfowl/waterfowl.keymap | 12 +-- app/boards/shields/zmk_uno/zmk_uno.keymap | 8 +- app/boards/shields/zodiark/Kconfig.defconfig | 2 +- app/boards/shields/zodiark/zodiark.keymap | 2 +- app/core-coverage.yml | 64 +++++++-------- .../dts/bindings/gpio/maxim,max7318.yaml | 20 ++--- .../behaviors/zmk,behavior-macro.yaml | 2 +- .../behaviors/zmk,behavior-tap-dance.yaml | 2 +- .../bindings/display/gooddisplay,il0323.yaml | 82 +++++++++---------- .../macros/zmk,macro-control-mode-press.yaml | 2 +- .../zmk,macro-control-mode-release.yaml | 2 +- .../macros/zmk,macro-control-tap-time.yaml | 2 +- .../macros/zmk,macro-control-wait-time.yaml | 2 +- .../macros/zmk,macro-pause-for-release.yaml | 2 +- app/dts/bindings/zmk,combos.yaml | 2 +- app/include/linker/zmk-events.ld | 2 +- app/package.json | 4 +- app/src/activity.c | 4 +- app/src/display/widgets/Kconfig | 2 +- .../native_posix_64.keymap | 12 +-- .../native_posix_64.keymap | 10 +-- .../layer-filter-0/native_posix_64.keymap | 26 +++--- .../layer-filter-1/native_posix_64.keymap | 6 +- .../multiple-timeouts/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 76 ++++++++--------- .../native_posix_64.keymap | 24 +++--- .../native_posix_64.keymap | 14 ++-- .../native_posix_64.keymap | 14 ++-- .../native_posix_64.keymap | 46 +++++------ .../native_posix_64.keymap | 8 +- .../press-release/native_posix_64.keymap | 26 +++--- .../press-timeout/native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 12 +-- .../native_posix_64.keymap | 14 ++-- .../native_posix_64.keymap | 12 +-- .../native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 18 ++-- .../native_posix_64.keymap | 6 +- .../balanced/1-dn-up/native_posix_64.keymap | 4 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 2 +- .../5-quick-tap/native_posix_64.keymap | 6 +- .../6-retro-tap/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../1-basic/native_posix_64.keymap | 4 +- .../many-nested/native_posix_64.keymap | 16 ++-- .../1-dn-up/native_posix_64.keymap | 4 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 2 +- .../5-quick-tap/native_posix_64.keymap | 6 +- .../6-retro-tap/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../1-basic/native_posix_64.keymap | 4 +- .../1-dn-up/native_posix_64.keymap | 4 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 2 +- .../5-quick-tap/native_posix_64.keymap | 6 +- .../6-nested-timeouts/native_posix_64.keymap | 10 +-- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../1-basic/native_posix_64.keymap | 4 +- .../1-dn-up/native_posix_64.keymap | 4 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 2 +- .../5-quick-tap/native_posix_64.keymap | 6 +- .../1-basic/native_posix_64.keymap | 4 +- .../kp-press-release/native_posix_64.keymap | 2 +- .../kt-alt-tab/native_posix_64.keymap | 18 ++-- .../kt-modded-alpha/native_posix_64.keymap | 10 +-- .../native_posix_64.keymap | 4 +- .../kt-press-release/native_posix_64.keymap | 4 +- app/tests/macros/basic/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../press-mid-macro/native_posix_64.keymap | 2 +- .../press-release/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 8 +- .../kp-lctl-dn-lctl-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 6 +- .../pending | 4 +- .../native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 6 +- .../1-normal/native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 6 +- .../3-covered/native_posix_64.keymap | 2 +- .../1-os-dn-up/native_posix_64.keymap | 4 +- .../10-callum-mods/native_posix_64.keymap | 12 +-- .../10-sl-sl-kp/native_posix_64.keymap | 16 ++-- .../native_posix_64.keymap | 10 +-- .../native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 18 ++-- .../9-sk-dn-up-dn-up/native_posix_64.keymap | 6 +- .../tap-dance/1b-tap2/native_posix_64.keymap | 4 +- .../tap-dance/1c-tap3/native_posix_64.keymap | 4 +- .../tap-dance/2a-hold1/native_posix_64.keymap | 2 +- .../tap-dance/2b-hold2/native_posix_64.keymap | 4 +- .../tap-dance/2c-hold3/native_posix_64.keymap | 4 +- .../1-single_keypress/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 6 +- docs/package-lock.json | 17 ++-- docs/package.json | 2 +- docs/src/templates/setup.ps1.mustache | 4 +- docs/src/templates/setup.sh.mustache | 2 +- schema/hardware-metadata.schema.json | 32 ++------ 247 files changed, 759 insertions(+), 797 deletions(-) delete mode 100644 .github/workflows/clang-format-lint.yml create mode 100644 .github/workflows/pre-commit.yml diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 9c3543dd..9e523a36 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,13 +1,15 @@ + ## Board/Shield Check-list - - [ ] This board/shield is tested working on real hardware - - [ ] Definitions follow the general style of other shields/boards upstream ([Reference](https://zmk.dev/docs/development/new-shield)) - - [ ] `.zmk.yml` metadata file added - - [ ] Proper Copyright + License headers added to applicable files (Generally, we stick to "The ZMK Contributors" for copyrights to help avoid churn when files get edited) - - [ ] General consistent formatting of DeviceTree files - - [ ] Keymaps do not use deprecated key defines (Check using the [upgrader tool](https://zmk.dev/docs/codes/keymap-upgrader)) - - [ ] `&pro_micro` used in favor of `&pro_micro_d/a` if applicable - - [ ] If split, no name added for the right/peripheral half - - [ ] Kconfig.defconfig file correctly wraps *all* configuration in conditional on the shield symbol - - [ ] `.conf` file has optional extra features commented out - - [ ] Keyboard/PCB is part of a shipped group buy or is generally available in stock to purchase (OSH/personal projects without general availability should create a zmk-config repo instead) + +- [ ] This board/shield is tested working on real hardware +- [ ] Definitions follow the general style of other shields/boards upstream ([Reference](https://zmk.dev/docs/development/new-shield)) +- [ ] `.zmk.yml` metadata file added +- [ ] Proper Copyright + License headers added to applicable files (Generally, we stick to "The ZMK Contributors" for copyrights to help avoid churn when files get edited) +- [ ] General consistent formatting of DeviceTree files +- [ ] Keymaps do not use deprecated key defines (Check using the [upgrader tool](https://zmk.dev/docs/codes/keymap-upgrader)) +- [ ] `&pro_micro` used in favor of `&pro_micro_d/a` if applicable +- [ ] If split, no name added for the right/peripheral half +- [ ] Kconfig.defconfig file correctly wraps _all_ configuration in conditional on the shield symbol +- [ ] `.conf` file has optional extra features commented out +- [ ] Keyboard/PCB is part of a shipped group buy or is generally available in stock to purchase (OSH/personal projects without general availability should create a zmk-config repo instead) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 3d89ed7b..b1e0602d 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -19,8 +19,8 @@ on: required: false type: string archive_name: - description: 'Archive output file name' - default: 'firmware' + description: "Archive output file name" + default: "firmware" required: false type: string diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f472f755..82b156e1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -131,7 +131,7 @@ jobs: for (const configuration of combinedUnique) { if (!perBoard[configuration.board]) perBoard[configuration.board] = []; - + perBoard[configuration.board].push({ shield: configuration.shield, 'cmake-args': configuration['cmake-args'], @@ -234,7 +234,7 @@ jobs: }; } } else if (hm.exposes) { - return hm.exposes.flatMap(i => + return hm.exposes.flatMap(i => metadata.interconnects[i].shields.flatMap(s => boardAndShield(hm, s)) ); } else { @@ -243,7 +243,7 @@ jobs: break; case "shield": if (hm.features && hm.features.includes("keys")) { - return hm.requires.flatMap(i => + return hm.requires.flatMap(i => metadata.interconnects[i].boards.flatMap(b => boardAndShield(b, hm)) ); } else { diff --git a/.github/workflows/clang-format-lint.yml b/.github/workflows/clang-format-lint.yml deleted file mode 100644 index 8c2cfbcf..00000000 --- a/.github/workflows/clang-format-lint.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Clang Format - -on: - push: - paths: - - ".github/workflows/clang-format-lint.yml" - - "app/boards/**/*.c" - - "app/include/**/*.h" - - "app/src/**" - - "app/drivers/**/*.c" - - "app/drivers/**/*.h" - pull_request: - paths: - - ".github/workflows/clang-format-lint.yml" - - "app/boards/**/*.c" - - "app/include/**/*.h" - - "app/src/**" - - "app/drivers/**/*.c" - - "app/drivers/**/*.h" - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: DoozyX/clang-format-lint-action@v0.13 - with: - source: "./app" - extensions: "h,c" diff --git a/.github/workflows/doc-checks.yml b/.github/workflows/doc-checks.yml index d048a03e..91e65e6d 100644 --- a/.github/workflows/doc-checks.yml +++ b/.github/workflows/doc-checks.yml @@ -21,16 +21,6 @@ jobs: - name: ESLint run: npm run lint working-directory: docs - prettier: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: bahmutov/npm-install@v1 - with: - working-directory: docs - - name: Prettier check - run: npm run prettier:check - working-directory: docs typecheck: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/hardware-metadata-validation.yml b/.github/workflows/hardware-metadata-validation.yml index 4b10a28b..10092836 100644 --- a/.github/workflows/hardware-metadata-validation.yml +++ b/.github/workflows/hardware-metadata-validation.yml @@ -15,17 +15,6 @@ on: - "app/scripts/west_commands/metadata.py" jobs: - check-metadata-format: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/checkout@v3 - - uses: bahmutov/npm-install@v1 - with: - working-directory: app - - name: Prettier Check - run: npm run prettier:check - working-directory: app validate-metadata: runs-on: ubuntu-latest container: diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 00000000..a6583d4f --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,15 @@ +name: pre-commit + +on: + pull_request: + push: + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: 3.x + - uses: pre-commit/action@v3.0.0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 02adf09c..7687fc6e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,12 +1,20 @@ fail_fast: false repos: - repo: https://github.com/pocc/pre-commit-hooks - rev: v1.1.1 + rev: v1.3.5 hooks: - id: clang-format args: - -i - repo: https://github.com/pre-commit/mirrors-prettier - rev: v2.2.1 + rev: v2.7.1 hooks: - id: prettier + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: trailing-whitespace + - id: check-yaml + - id: check-added-large-files + - id: check-shebang-scripts-are-executable + exclude: "\\.mustache$" diff --git a/.vscode/settings.json b/.vscode/settings.json index 2730549a..aea29cf0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,4 +4,4 @@ "*.keymap": "dts" }, "python.formatting.provider": "black" -} \ No newline at end of file +} diff --git a/app/.prettierrc.js b/app/.prettierrc.js index 806328d9..2a1f0b48 100644 --- a/app/.prettierrc.js +++ b/app/.prettierrc.js @@ -1,3 +1,3 @@ module.exports = { - endOfLine: "auto", + endOfLine: "auto", }; diff --git a/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi b/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi index 237f5c45..53514d64 100644 --- a/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi @@ -11,11 +11,11 @@ gpio-map-mask = <0xffffffff 0xffffffc0>; gpio-map-pass-thru = <0 0x3f>; gpio-map - = <0 0 &gpio0 8 0> /* D0 D2 */ - , <1 0 &gpio0 6 0> /* D1 D3*/ - , <2 0 &gpio0 15 0> /* D2 D1*/ - , <3 0 &gpio0 17 0> /* D3 D0*/ - , <4 0 &gpio0 20 0> /* D4/A6 D4*/ + = <0 0 &gpio0 8 0> /* D0 D2 */ + , <1 0 &gpio0 6 0> /* D1 D3*/ + , <2 0 &gpio0 15 0> /* D2 D1*/ + , <3 0 &gpio0 17 0> /* D3 D0*/ + , <4 0 &gpio0 20 0> /* D4/A6 D4*/ , <5 0 &gpio0 13 0> /* D5 C6*/ , <6 0 &gpio0 24 0> /* D6/A7 D7*/ , <7 0 &gpio0 9 0> /* D7 E6*/ diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index 4dbdaef5..65092dc5 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -32,7 +32,7 @@ , <&gpio1 9 GPIO_ACTIVE_HIGH> , <&gpio0 7 GPIO_ACTIVE_HIGH> , <&gpio0 5 GPIO_ACTIVE_HIGH> - ; + ; }; leds { diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts index 52439e4f..980c9900 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts @@ -33,7 +33,7 @@ , <&gpio1 9 GPIO_ACTIVE_HIGH> , <&gpio0 7 GPIO_ACTIVE_HIGH> ; - + }; leds { diff --git a/app/boards/arm/ferris/README.md b/app/boards/arm/ferris/README.md index 2793c6fa..b6fdcdf2 100644 --- a/app/boards/arm/ferris/README.md +++ b/app/boards/arm/ferris/README.md @@ -1,6 +1,5 @@ # Building ZMK for the Ferris 0.2 - ## Standard Build ``` diff --git a/app/boards/arm/nice60/README.md b/app/boards/arm/nice60/README.md index 49433df8..dce230ae 100644 --- a/app/boards/arm/nice60/README.md +++ b/app/boards/arm/nice60/README.md @@ -1,9 +1,11 @@ # nice!60 + ![nice!60](https://i.imgur.com/0YWv5PE.png) The nice!60 is a hotswap 60% made by Nice Keyboards. https://nicekeyboards.com/nice-60 ## Building nice!60 ZMK firmware + ``` west build -p -b nice60 ``` diff --git a/app/boards/arm/nice60/nice60.keymap b/app/boards/arm/nice60/nice60.keymap index bdb188df..edfec32e 100644 --- a/app/boards/arm/nice60/nice60.keymap +++ b/app/boards/arm/nice60/nice60.keymap @@ -12,7 +12,7 @@ / { keymap { compatible = "zmk,keymap"; - + default_layer { // ------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | @@ -40,7 +40,7 @@ // ------------------------------------------------------------------------------------------------ bindings = < &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &rgb_ug RGB_EFR - &bt BT_SEL 0 &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &trans &trans &trans &trans &trans &trans + &bt BT_SEL 0 &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &trans &trans &trans &trans &trans &trans &bt BT_SEL 1 &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &trans &trans &trans &trans &rgb_ug RGB_EFF &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_SEL 3 &trans &trans &rgb_ug RGB_TOG &kp PSCRN &trans &trans &kp DEL diff --git a/app/boards/arm/pillbug/pillbug.dts b/app/boards/arm/pillbug/pillbug.dts index c1330319..a2e56df3 100644 --- a/app/boards/arm/pillbug/pillbug.dts +++ b/app/boards/arm/pillbug/pillbug.dts @@ -29,7 +29,7 @@ label = "Blue LED"; }; }; - + ext-power { compatible = "zmk,ext-power-generic"; label = "EXT_POWER"; diff --git a/app/boards/arm/preonic/preonic_rev3.yaml b/app/boards/arm/preonic/preonic_rev3.yaml index 679e1464..861f1d2d 100644 --- a/app/boards/arm/preonic/preonic_rev3.yaml +++ b/app/boards/arm/preonic/preonic_rev3.yaml @@ -16,4 +16,4 @@ supported: - lsm303dlhc - nvs - can - - kscan \ No newline at end of file + - kscan diff --git a/app/boards/arm/s40nc/README.md b/app/boards/arm/s40nc/README.md index 32db57e9..96bebb33 100644 --- a/app/boards/arm/s40nc/README.md +++ b/app/boards/arm/s40nc/README.md @@ -1,9 +1,11 @@ # S40NC + ![S40NC](https://i.imgur.com/fk8587n.jpg) Shorty40NoCordy (S40NC) is a limited run 40% bluetooth keyboard originally made and sold by MechWild. ## Building S40NC ZMK firmware + ``` west build -p -b s40nc ``` diff --git a/app/boards/arm/s40nc/s40nc.keymap b/app/boards/arm/s40nc/s40nc.keymap index c43bc671..f0e60e7d 100644 --- a/app/boards/arm/s40nc/s40nc.keymap +++ b/app/boards/arm/s40nc/s40nc.keymap @@ -17,7 +17,7 @@ / { keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC @@ -35,7 +35,7 @@ &trans &trans &trans &kp TAB &kp TAB &kp TAB &kp HOME &kp PG_DN &kp END >; }; - + raise_layer { bindings = < &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &trans @@ -44,7 +44,7 @@ &trans &trans &trans &kp TAB &kp TAB &kp TAB &kp HOME &kp PG_DN &kp END >; }; - + control_layer { bindings = < &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp C_PP @@ -55,4 +55,4 @@ }; }; }; - + diff --git a/app/boards/shields/bfo9000/README.md b/app/boards/shields/bfo9000/README.md index 1e91fdcf..54893aed 100644 --- a/app/boards/shields/bfo9000/README.md +++ b/app/boards/shields/bfo9000/README.md @@ -4,10 +4,10 @@ Customizable full-size split ortholinear. ## Features -* Compatible with MX-compatible, Alps-compatible, and Kailh Low-Profile Choc switches. -* Breakoff pieces to allow for 4 to 6 rows and 7 to 9 columns. -* RGB LED connections +- Compatible with MX-compatible, Alps-compatible, and Kailh Low-Profile Choc switches. +- Breakoff pieces to allow for 4 to 6 rows and 7 to 9 columns. +- RGB LED connections ## Hardware Notes -[Included default keymap](http://www.keyboard-layout-editor.com/#/gists/51293c31afcd5f1765e8f413a46bfcf8) \ No newline at end of file +[Included default keymap](http://www.keyboard-layout-editor.com/#/gists/51293c31afcd5f1765e8f413a46bfcf8) diff --git a/app/boards/shields/boardsource5x12/boardsource5x12.keymap b/app/boards/shields/boardsource5x12/boardsource5x12.keymap index 8956ca98..cb851c35 100644 --- a/app/boards/shields/boardsource5x12/boardsource5x12.keymap +++ b/app/boards/shields/boardsource5x12/boardsource5x12.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include @@ -28,7 +28,7 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp LSHFT &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LCTRL &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RET - &mo 3 &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + &mo 3 &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT >; }; @@ -44,7 +44,7 @@ &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp DEL &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(NON_US_HASH) &kp LS(NON_US_BSLH) &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE + &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE >; }; diff --git a/app/boards/shields/boardsource5x12/boardsource5x12.overlay b/app/boards/shields/boardsource5x12/boardsource5x12.overlay index 0fafe8a1..080a2392 100644 --- a/app/boards/shields/boardsource5x12/boardsource5x12.overlay +++ b/app/boards/shields/boardsource5x12/boardsource5x12.overlay @@ -39,4 +39,4 @@ , <&pro_micro 6 GPIO_ACTIVE_HIGH> ; }; -}; \ No newline at end of file +}; \ No newline at end of file diff --git a/app/boards/shields/chalice/chalice.keymap b/app/boards/shields/chalice/chalice.keymap index cba93d03..c72e3ee1 100644 --- a/app/boards/shields/chalice/chalice.keymap +++ b/app/boards/shields/chalice/chalice.keymap @@ -19,9 +19,9 @@ bindings = < &kp ESC &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp INSERT &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp DELETE &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp ENTER + &kp DELETE &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp ENTER &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RSHFT &kp UP - &kp LCTRL &kp LALT &kp SPACE &mo 1 &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + &kp LCTRL &kp LALT &kp SPACE &mo 1 &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT >; }; @@ -30,9 +30,9 @@ bindings = < &bootloader &out OUT_TOG &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &bt BT_CLR &rgb_ug RGB_TOG &rgb_ug RGB_HUD &rgb_ug RGB_HUI &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &trans &bt BT_SEL 0 &rgb_ug RGB_EFF &rgb_ug RGB_SAD &rgb_ug RGB_SAI &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &bt BT_SEL 0 &rgb_ug RGB_EFF &rgb_ug RGB_SAD &rgb_ug RGB_SAI &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_SEL 1 &rgb_ug RGB_EFR &rgb_ug RGB_BRD &rgb_ug RGB_BRI &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp PG_UP - &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_DN &kp END + &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_DN &kp END >; }; }; diff --git a/app/boards/shields/chalice/chalice.overlay b/app/boards/shields/chalice/chalice.overlay index 34cbd34e..6778588b 100644 --- a/app/boards/shields/chalice/chalice.overlay +++ b/app/boards/shields/chalice/chalice.overlay @@ -21,7 +21,7 @@ map = < RC(0,0) RC(1,0) RC(0,1) RC(1,1) RC(0,2) RC(1,2) RC(0,3) RC(1,3) RC(0,4) RC(1,4) RC(0,5) RC(1,5) RC(0,6) RC(1,6) RC(4,6) RC(2,0) RC(3,0) RC(2,1) RC(3,1) RC(2,2) RC(3,2) RC(2,3) RC(3,3) RC(2,4) RC(3,4) RC(2,5) RC(3,5) RC(2,6) RC(3,6) RC(5,6) - RC(4,0) RC(5,0) RC(4,1) RC(5,1) RC(4,2) RC(5,2) RC(4,3) RC(5,3) RC(4,4) RC(5,4) RC(4,5) RC(5,5) RC(6,6) RC(7,6) + RC(4,0) RC(5,0) RC(4,1) RC(5,1) RC(4,2) RC(5,2) RC(4,3) RC(5,3) RC(4,4) RC(5,4) RC(4,5) RC(5,5) RC(6,6) RC(7,6) RC(6,0) RC(7,0) RC(6,1) RC(7,1) RC(6,2) RC(7,2) RC(6,3) RC(7,3) RC(6,4) RC(7,4) RC(6,5) RC(7,5) RC(8,6) RC(9,6) RC(8,0) RC(9,1) RC(8,2) RC(9,2) RC(8,3) RC(9,3) RC(8,4) RC(9,4) RC(8,5) RC(9,5) >; @@ -35,7 +35,7 @@ map = < RC(0,0) RC(1,0) RC(0,1) RC(1,1) RC(0,2) RC(1,2) RC(0,3) RC(1,3) RC(0,4) RC(1,4) RC(0,5) RC(1,5) RC(0,6) RC(1,6) RC(4,6) RC(8,1) RC(2,0) RC(3,0) RC(2,1) RC(3,1) RC(2,2) RC(3,2) RC(2,3) RC(3,3) RC(2,4) RC(3,4) RC(2,5) RC(3,5) RC(2,6) RC(3,6) RC(5,6) - RC(4,0) RC(5,0) RC(4,1) RC(5,1) RC(4,2) RC(5,2) RC(4,3) RC(5,3) RC(4,4) RC(5,4) RC(4,5) RC(5,5) RC(6,6) RC(7,6) + RC(4,0) RC(5,0) RC(4,1) RC(5,1) RC(4,2) RC(5,2) RC(4,3) RC(5,3) RC(4,4) RC(5,4) RC(4,5) RC(5,5) RC(6,6) RC(7,6) RC(6,0) RC(7,0) RC(6,1) RC(7,1) RC(6,2) RC(7,2) RC(6,3) RC(7,3) RC(6,4) RC(7,4) RC(6,5) RC(7,5) RC(8,6) RC(9,6) RC(8,0) RC(9,1) RC(8,2) RC(9,2) RC(8,3) RC(9,3) RC(8,4) RC(9,4) RC(8,5) RC(9,5) >; diff --git a/app/boards/shields/clog/clog.dtsi b/app/boards/shields/clog/clog.dtsi index 27943100..ccad150c 100644 --- a/app/boards/shields/clog/clog.dtsi +++ b/app/boards/shields/clog/clog.dtsi @@ -27,7 +27,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-direct"; label = "KSCAN"; - + input-gpios = <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> diff --git a/app/boards/shields/corne/corne.dtsi b/app/boards/shields/corne/corne.dtsi index e81afcf8..a9c1c287 100644 --- a/app/boards/shields/corne/corne.dtsi +++ b/app/boards/shields/corne/corne.dtsi @@ -56,7 +56,7 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; // TODO: per-key RGB node(s)? diff --git a/app/boards/shields/eek/eek.keymap b/app/boards/shields/eek/eek.keymap index d250cb01..74ecc407 100644 --- a/app/boards/shields/eek/eek.keymap +++ b/app/boards/shields/eek/eek.keymap @@ -15,9 +15,9 @@ default { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Q | W | E | R | T | | Y | U | I | O | P | -// A | S | D | F | G | | H | J | K | L | ; | -// Lsft/Z| X | C | V | B | | N | M | , | . |Rsft//| +// Q | W | E | R | T | | Y | U | I | O | P | +// A | S | D | F | G | | H | J | K | L | ; | +// Lsft/Z| X | C | V | B | | N | M | , | . |Rsft//| // | LCTL | Bspc/LMOD | SPC | | Del/Num | Ent | Sym | bindings = < &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P @@ -28,7 +28,7 @@ }; numbers { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -// 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | +// 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | // TAB | BT_PRV | BT_NXT | VOL-| VOL+| | < | v | ∧ | > | ' | // Lsft| BT_SEL0| BT_CLR | MUTE| | | HOME| END | PGUP| PGDN| Rsft| // | LCTL | LMOD| LALT | | Num | | BL-reset | @@ -41,8 +41,8 @@ }; symbols { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -// ESC | F1 | F2 | F3 | F4 | | OUT_USB | OUT_BLE | | = | - | -// CAPS| F5 | F6 | F7 | F8 | | [ | ] | | ` | \ | +// ESC | F1 | F2 | F3 | F4 | | OUT_USB | OUT_BLE | | = | - | +// CAPS| F5 | F6 | F7 | F8 | | [ | ] | | ` | \ | // LSFT| F9 | F10 | F11 | F12 | | | | | | RSFT | // | LCTL | LMOD| LALT | | RESET | | SYM | bindings = < diff --git a/app/boards/shields/eek/eek.overlay b/app/boards/shields/eek/eek.overlay index 3f830f07..f53c6b5b 100644 --- a/app/boards/shields/eek/eek.overlay +++ b/app/boards/shields/eek/eek.overlay @@ -20,7 +20,7 @@ RC(0,9) RC(0,8) RC(0,7) RC(0,6) RC(0,5) RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(1,9) RC(1,8) RC(1,7) RC(1,6) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(2,9) RC(2,8) RC(2,7) RC(2,6) RC(2,5) RC(2,4) RC(2,3) RC(2,2) RC(2,1) RC(2,0) - RC(3,7) RC(3,6) RC(3,5) RC(3,4) RC(3,3) RC(3,2) + RC(3,7) RC(3,6) RC(3,5) RC(3,4) RC(3,3) RC(3,2) >; }; diff --git a/app/boards/shields/elephant42/Kconfig.defconfig b/app/boards/shields/elephant42/Kconfig.defconfig index e507f2c6..55ee6c87 100644 --- a/app/boards/shields/elephant42/Kconfig.defconfig +++ b/app/boards/shields/elephant42/Kconfig.defconfig @@ -15,7 +15,7 @@ if SHIELD_ELEPHANT42_LEFT || SHIELD_ELEPHANT42_RIGHT config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/elephant42/elephant42.dtsi b/app/boards/shields/elephant42/elephant42.dtsi index e2b708ca..2d3f5166 100644 --- a/app/boards/shields/elephant42/elephant42.dtsi +++ b/app/boards/shields/elephant42/elephant42.dtsi @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include / { @@ -36,7 +36,7 @@ RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - }; + }; }; &pro_micro_i2c { diff --git a/app/boards/shields/elephant42/elephant42.keymap b/app/boards/shields/elephant42/elephant42.keymap index 8594c117..62484728 100644 --- a/app/boards/shields/elephant42/elephant42.keymap +++ b/app/boards/shields/elephant42/elephant42.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include @@ -19,7 +19,7 @@ default_layer { bindings = < - < ADJT ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp DEL + < ADJT ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp DEL &mt LCTRL TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp LSHFT &mo LOWR &kp LGUI &kp BSPC &kp SPACE &kp ENTER &mo RAIS &kp LALT diff --git a/app/boards/shields/elephant42/elephant42_left.overlay b/app/boards/shields/elephant42/elephant42_left.overlay index 72fe2251..10473438 100644 --- a/app/boards/shields/elephant42/elephant42_left.overlay +++ b/app/boards/shields/elephant42/elephant42_left.overlay @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include "elephant42.dtsi" &kscan0 { diff --git a/app/boards/shields/elephant42/elephant42_right.overlay b/app/boards/shields/elephant42/elephant42_right.overlay index 35bd5895..c8f69a04 100644 --- a/app/boards/shields/elephant42/elephant42_right.overlay +++ b/app/boards/shields/elephant42/elephant42_right.overlay @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include "elephant42.dtsi" &default_transform { diff --git a/app/boards/shields/helix/helix.dtsi b/app/boards/shields/helix/helix.dtsi index 45457560..bbaec636 100644 --- a/app/boards/shields/helix/helix.dtsi +++ b/app/boards/shields/helix/helix.dtsi @@ -42,6 +42,6 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9 , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; }; \ No newline at end of file diff --git a/app/boards/shields/helix/helix.keymap b/app/boards/shields/helix/helix.keymap index 82327c32..80678fe6 100644 --- a/app/boards/shields/helix/helix.keymap +++ b/app/boards/shields/helix/helix.keymap @@ -23,7 +23,7 @@ As such, those are in use within the default layer at this time.*/ / { keymap { compatible = "zmk,keymap"; - + default_layer { // --------------------------------------------------------------------------------------------------------------------------------- // | GRAVE | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | @@ -78,7 +78,7 @@ As such, those are in use within the default layer at this time.*/ // | | | | | | | | | | | | | | | | bindings = < &kp GRAVE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &ext_power EP_TOG - &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &rgb_ug RGB_EFF &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_SPI &rgb_ug RGB_BRI &rgb_ug RGB_TOG + &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &rgb_ug RGB_EFF &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_SPI &rgb_ug RGB_BRI &rgb_ug RGB_TOG &bt BT_NXT &out OUT_TOG &out OUT_USB &out OUT_BLE &trans &trans &rgb_ug RGB_EFR &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_SPD &rgb_ug RGB_BRD &trans &bt BT_PRV &trans &trans &trans &trans &trans &kp LBRC &kp RBRC &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/boards/shields/helix/helix_left.overlay b/app/boards/shields/helix/helix_left.overlay index 5b0c7623..2a7ac805 100644 --- a/app/boards/shields/helix/helix_left.overlay +++ b/app/boards/shields/helix/helix_left.overlay @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include "helix.dtsi" &kscan0 { diff --git a/app/boards/shields/hummingbird/hummingbird.overlay b/app/boards/shields/hummingbird/hummingbird.overlay index 4af9cbdf..0c48c128 100644 --- a/app/boards/shields/hummingbird/hummingbird.overlay +++ b/app/boards/shields/hummingbird/hummingbird.overlay @@ -49,7 +49,7 @@ , <&xiao_d 5 GPIO_ACTIVE_HIGH> ; }; - + }; &xiao_spi { status = "disabled"; }; diff --git a/app/boards/shields/iris/Kconfig.defconfig b/app/boards/shields/iris/Kconfig.defconfig index 972884db..83331d10 100644 --- a/app/boards/shields/iris/Kconfig.defconfig +++ b/app/boards/shields/iris/Kconfig.defconfig @@ -15,5 +15,5 @@ if SHIELD_IRIS_LEFT || SHIELD_IRIS_RIGHT config ZMK_SPLIT default y - + endif \ No newline at end of file diff --git a/app/boards/shields/iris/iris.dtsi b/app/boards/shields/iris/iris.dtsi index 24099f61..0e976f86 100644 --- a/app/boards/shields/iris/iris.dtsi +++ b/app/boards/shields/iris/iris.dtsi @@ -42,6 +42,6 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,2) RC(4,9) RC(3,6) RC(3,7) , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; }; \ No newline at end of file diff --git a/app/boards/shields/jian/jian.dtsi b/app/boards/shields/jian/jian.dtsi index 34c0298e..2b1eb391 100644 --- a/app/boards/shields/jian/jian.dtsi +++ b/app/boards/shields/jian/jian.dtsi @@ -71,6 +71,6 @@ , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; }; diff --git a/app/boards/shields/jiran/jiran.dtsi b/app/boards/shields/jiran/jiran.dtsi index 5dfaa46b..f0727dd4 100644 --- a/app/boards/shields/jiran/jiran.dtsi +++ b/app/boards/shields/jiran/jiran.dtsi @@ -77,6 +77,6 @@ , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; }; diff --git a/app/boards/shields/jorne/Kconfig.defconfig b/app/boards/shields/jorne/Kconfig.defconfig index 4664debf..775bb56a 100644 --- a/app/boards/shields/jorne/Kconfig.defconfig +++ b/app/boards/shields/jorne/Kconfig.defconfig @@ -13,7 +13,7 @@ if SHIELD_JORNE_LEFT || SHIELD_JORNE_RIGHT config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/jorne/jorne.dtsi b/app/boards/shields/jorne/jorne.dtsi index 6f43393d..bb862b8d 100644 --- a/app/boards/shields/jorne/jorne.dtsi +++ b/app/boards/shields/jorne/jorne.dtsi @@ -72,7 +72,7 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; // TODO: per-key RGB node(s)? diff --git a/app/boards/shields/kyria/Kconfig.defconfig b/app/boards/shields/kyria/Kconfig.defconfig index 53b441cb..82f48b4c 100644 --- a/app/boards/shields/kyria/Kconfig.defconfig +++ b/app/boards/shields/kyria/Kconfig.defconfig @@ -13,7 +13,7 @@ if SHIELD_KYRIA config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/kyria/kyria_common.dtsi b/app/boards/shields/kyria/kyria_common.dtsi index c52ab05a..1e61cc6b 100644 --- a/app/boards/shields/kyria/kyria_common.dtsi +++ b/app/boards/shields/kyria/kyria_common.dtsi @@ -17,7 +17,7 @@ compatible = "zmk,kscan-gpio-matrix"; label = "KSCAN"; - diode-direction = "col2row"; + diode-direction = "col2row"; }; left_encoder: encoder_left { diff --git a/app/boards/shields/leeloo/Kconfig.defconfig b/app/boards/shields/leeloo/Kconfig.defconfig index 36306757..d5bfab3d 100644 --- a/app/boards/shields/leeloo/Kconfig.defconfig +++ b/app/boards/shields/leeloo/Kconfig.defconfig @@ -8,7 +8,7 @@ config ZMK_KEYBOARD_NAME config ZMK_SPLIT_ROLE_CENTRAL default y - + endif if SHIELD_LEELOO_LEFT || SHIELD_LEELOO_RIGHT diff --git a/app/boards/shields/leeloo/README.md b/app/boards/shields/leeloo/README.md index 35e04994..a807843f 100644 --- a/app/boards/shields/leeloo/README.md +++ b/app/boards/shields/leeloo/README.md @@ -6,20 +6,22 @@ Keyboard Designer: [clicketysplit.ca](https://clicketysplit.ca) GitHub: [ClicketySplit](https://github.com/ClicketySplit) Hardware Supported: Pro Micro, Elite-C, nice!nano v2 -Albeit, there is no doubt where Leeloo's heritage is derived from—Lily58, and Corne. It is not a copy-paste-modify implementation. +Albeit, there is no doubt where Leeloo's heritage is derived from—Lily58, and Corne. It is not a copy-paste-modify implementation. Leeloo has been designed from scratch; everything from the schematic to its PCB footprints, and column stagger. There are some subtle differences that may not be apparent; however, its subtle changes enable an interesting future. Features: -* 4x6x5m Split Keyboard -* Support for MX/Box or Low Profile Choc switches. -* 90% of the switches are socketed; with the exception to the rotary encoder positions—6 positions require soldering. -* Support for 128x32 OLED Displays. -* The option to select one of three positions for an EC11 rotary encoder on each half. -* Support for Alps Alpine Micro Switch -* Support for 3.7v 301230 LiPo Battery + +- 4x6x5m Split Keyboard +- Support for MX/Box or Low Profile Choc switches. +- 90% of the switches are socketed; with the exception to the rotary encoder positions—6 positions require soldering. +- Support for 128x32 OLED Displays. +- The option to select one of three positions for an EC11 rotary encoder on each half. +- Support for Alps Alpine Micro Switch +- Support for 3.7v 301230 LiPo Battery # Building Your Firmware + ZMK Firmware: [Introduction to ZMK](https://zmk.dev/docs/) Installation: [Installing ZMK](https://zmk.dev/docs/user-setup) Customization: [Customizing ZMK](https://zmk.dev/docs/customization) @@ -36,6 +38,7 @@ Build command for your custom keymap of Leeloo: west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo/config" # Support + If you have any questions with regards to Leeloo, please [Contact Us](https://clicketysplit.ca/pages/contact-us). Clickety Split diff --git a/app/boards/shields/lily58/lily58.dtsi b/app/boards/shields/lily58/lily58.dtsi index 4efa1069..1a296a8c 100644 --- a/app/boards/shields/lily58/lily58.dtsi +++ b/app/boards/shields/lily58/lily58.dtsi @@ -43,7 +43,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; left_encoder: encoder_left { diff --git a/app/boards/shields/lotus58/Kconfig.defconfig b/app/boards/shields/lotus58/Kconfig.defconfig index 56eef359..b6bb37d8 100644 --- a/app/boards/shields/lotus58/Kconfig.defconfig +++ b/app/boards/shields/lotus58/Kconfig.defconfig @@ -8,7 +8,7 @@ config ZMK_KEYBOARD_NAME config ZMK_SPLIT_ROLE_CENTRAL default y - + endif if SHIELD_LOTUS58_LEFT || SHIELD_LOTUS58_RIGHT diff --git a/app/boards/shields/lotus58/lotus58.dtsi b/app/boards/shields/lotus58/lotus58.dtsi index 1df0bf38..e24d75e7 100644 --- a/app/boards/shields/lotus58/lotus58.dtsi +++ b/app/boards/shields/lotus58/lotus58.dtsi @@ -27,7 +27,7 @@ RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7 RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(4,0) RC(4,11) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,7) RC(4,8) RC(4,9) RC(4,10) + RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,7) RC(4,8) RC(4,9) RC(4,10) >; }; diff --git a/app/boards/shields/lotus58/lotus58.keymap b/app/boards/shields/lotus58/lotus58.keymap index 50249146..fae463c9 100644 --- a/app/boards/shields/lotus58/lotus58.keymap +++ b/app/boards/shields/lotus58/lotus58.keymap @@ -17,7 +17,7 @@ key-positions = <24 52>; layers = <0>; bindings = <&kp LGUI>; - }; + }; }; behaviors { @@ -59,7 +59,7 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp LSHFT &kp A &sleft &kp D &fright &kp G &sys_reset &sys_reset &kp H &kp J &kp K &kp L &kp SEMI &mt RSHFT SQT &kp LCTRL &kp Z &kp X &kp C &kp V &kp B &kp C_MUTE &kp C_PP &kp N &kp M &kp COMMA &kp DOT &kp FSLH &mt RCTRL BSLH - < 2 RET &kp LALT &kp SPACE < 1 DEL < 2 RET &kp BSPC < 1 RBKT &kp LGUI + < 2 RET &kp LALT &kp SPACE < 1 DEL < 2 RET &kp BSPC < 1 RBKT &kp LGUI >; sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP &inc_dec_kp PG_UP PG_DN>; @@ -71,7 +71,7 @@ // | | ! | HOME| ^ | END | % | | VOL^ | PGUP | INS | ^ | PSCR | - | // | | # | <- | v | -> | $ | | | | VOLv | <- | ^ | -> | ~ | _ | // | | @ | - | ( | ) | & | | | | MUTE | PGDN | v | : | * | | | -// | F11 | | | | | | | | F12 | +// | F11 | | | | | | | | F12 | bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp PLUS &trans &kp EXCL &kp HOME &kp UP &kp END &kp PRCNT &kp C_VOL_UP &kp PG_UP &kp INS &kp CARET &kp PSCRN &kp MINUS @@ -89,13 +89,13 @@ // | | INS | PSCR | GUI | RESET | | | PGUP | | ^ | | | | // | | ALT | CTRL | SHIFT | FLASH | CAPS | | | | PGDN | <- | v | -> | DEL | BSPC | // | | UNDO | CUT | COPY | PASTE | | | | | | |> | <|<| | |>|> | | | -// | | | | | | | | | | +// | | | | | | | | | | bindings = < &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &out OUT_TOG &out OUT_USB &out OUT_BLE &trans &sys_reset &bootloader &trans &kp INS &kp PSCRN &kp K_CMENU &sys_reset &trans &kp PG_UP &trans &kp UP &trans &trans &trans &trans &kp LALT &kp LCTRL &kp LSHFT &bootloader &kp CLCK &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp DEL &kp BSPC &trans &kp K_UNDO &kp K_CUT &kp K_COPY &kp K_PASTE &trans &trans &trans &trans &kp C_PP &kp C_PREV &kp C_NEXT &trans &trans - &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans >; sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP &inc_dec_kp PG_UP PG_DN>; diff --git a/app/boards/shields/lotus58/lotus58_left.overlay b/app/boards/shields/lotus58/lotus58_left.overlay index 9755ae0b..a51659df 100644 --- a/app/boards/shields/lotus58/lotus58_left.overlay +++ b/app/boards/shields/lotus58/lotus58_left.overlay @@ -8,7 +8,7 @@ &kscan0 { col-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> + = <&pro_micro 15 GPIO_ACTIVE_HIGH> , <&pro_micro 16 GPIO_ACTIVE_HIGH> , <&pro_micro 14 GPIO_ACTIVE_HIGH> , <&pro_micro 10 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/microdox/Kconfig.defconfig b/app/boards/shields/microdox/Kconfig.defconfig index 28f8c811..8c0b042e 100644 --- a/app/boards/shields/microdox/Kconfig.defconfig +++ b/app/boards/shields/microdox/Kconfig.defconfig @@ -15,7 +15,7 @@ if SHIELD_MICRODOX_LEFT || SHIELD_MICRODOX_RIGHT config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/microdox/microdox.dtsi b/app/boards/shields/microdox/microdox.dtsi index b8d47b2a..e3fabb3e 100644 --- a/app/boards/shields/microdox/microdox.dtsi +++ b/app/boards/shields/microdox/microdox.dtsi @@ -40,7 +40,7 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; // TODO: per-key RGB node(s)? diff --git a/app/boards/shields/murphpad/murphpad.keymap b/app/boards/shields/murphpad/murphpad.keymap index 2e8c6f6e..ccdff9f7 100644 --- a/app/boards/shields/murphpad/murphpad.keymap +++ b/app/boards/shields/murphpad/murphpad.keymap @@ -44,7 +44,7 @@ bindings = <&bt BT_NXT>; }; }; - + sensors { compatible = "zmk,keymap-sensors"; sensors = <&encoder_1 &encoder_2>; @@ -57,29 +57,29 @@ default_layer { label = "default layer"; bindings = < - &bt BT_CLR &kp TAB &kp F5 &kp LC(LA(C)) &kp LG(D) - &rgb_ug RGB_TOG &kp ESC &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS - &rgb_ug RGB_EFF &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_PLUS + &bt BT_CLR &kp TAB &kp F5 &kp LC(LA(C)) &kp LG(D) + &rgb_ug RGB_TOG &kp ESC &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS + &rgb_ug RGB_EFF &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_PLUS &kp C_MUTE &kp KP_N4 &kp KP_N5 &kp KP_N6 &trans &mo 1 &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_ENTER &kp BSPC &kp KP_N0 &trans &kp KP_DOT &trans >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - + }; + fn_layer { label = "fn layer"; bindings = < - &trans &trans &trans &trans &trans - &trans &kp KP_NUM &trans &trans &trans - &trans &trans &trans &trans &trans - &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &trans &trans - &kp DEL &trans &trans &trans &trans - >; + &trans &kp KP_NUM &trans &trans &trans + &trans &trans &trans &trans &trans + &bt BT_CLR &trans &trans &trans &trans + &trans &trans &trans &trans &trans + &kp DEL &trans &trans &trans &trans + >; sensor-bindings = <&inc_dec_kp PG_UP PG_DN &inc_dec_kp C_VOL_UP C_VOL_DN>; - + }; }; }; \ No newline at end of file diff --git a/app/boards/shields/murphpad/murphpad.overlay b/app/boards/shields/murphpad/murphpad.overlay index c66f2aef..b7fead60 100644 --- a/app/boards/shields/murphpad/murphpad.overlay +++ b/app/boards/shields/murphpad/murphpad.overlay @@ -42,7 +42,7 @@ resolution = <4>; status = "disabled"; }; - + encoder_2: encoder_2 { compatible = "alps,ec11"; label = "Encoder 2"; diff --git a/app/boards/shields/naked60/naked60.keymap b/app/boards/shields/naked60/naked60.keymap index d380a599..1c212cd4 100644 --- a/app/boards/shields/naked60/naked60.keymap +++ b/app/boards/shields/naked60/naked60.keymap @@ -28,7 +28,7 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp LSHFT &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LCTRL &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RET - &mo 3 &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + &mo 3 &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT >; }; @@ -44,7 +44,7 @@ &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp DEL &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(NON_US_HASH) &kp LS(NON_US_BSLH) &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE + &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE >; }; diff --git a/app/boards/shields/nibble/nibble.keymap b/app/boards/shields/nibble/nibble.keymap index 23c796ea..c02aad75 100644 --- a/app/boards/shields/nibble/nibble.keymap +++ b/app/boards/shields/nibble/nibble.keymap @@ -32,7 +32,7 @@ }; function_layer { label = "Function"; - + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; bindings = < diff --git a/app/boards/shields/nibble/nibble.overlay b/app/boards/shields/nibble/nibble.overlay index 13f2c2fe..baf1eb10 100644 --- a/app/boards/shields/nibble/nibble.overlay +++ b/app/boards/shields/nibble/nibble.overlay @@ -51,7 +51,7 @@ RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,15) RC(3,0) RC(3,1) RC(0,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) RC(3,15) -RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,6) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) +RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,6) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) >; }; }; diff --git a/app/boards/shields/nice_view/README.md b/app/boards/shields/nice_view/README.md index 0b4ac21f..e3dffa34 100644 --- a/app/boards/shields/nice_view/README.md +++ b/app/boards/shields/nice_view/README.md @@ -2,4 +2,4 @@ The nice!view is a low power, high refresh rate display meant to replace I2C OLEDs traditionally used. -This shield requires that an `&nice_view_spi` labelled SPI bus is provided with *at least* MOSI, SCK, and CS pins defined. +This shield requires that an `&nice_view_spi` labelled SPI bus is provided with _at least_ MOSI, SCK, and CS pins defined. diff --git a/app/boards/shields/nice_view_adapter/README.md b/app/boards/shields/nice_view_adapter/README.md index ec4665a3..fe0a6f07 100644 --- a/app/boards/shields/nice_view_adapter/README.md +++ b/app/boards/shields/nice_view_adapter/README.md @@ -2,7 +2,7 @@ This shield is used as an adapter between the nice!view and existing shields/boards that expose an I2C OLED header. -To use this shield, you should add this shield to your list of shields *before* `nice_view`. +To use this shield, you should add this shield to your list of shields _before_ `nice_view`. The nice!view will use the SDA/SCL pins of the OLED, and then the adapter expects a final pin to be "bodged" from your microcontroller to the nice!view CS pin. This adapter assumes that the CS pin bodged is the `&pro_micro 1` pin or "D1", which is the top left pin when looking at the front of the board. If you can't use this pin, you'll need to override the `cs-gpios` for the `&nice_view_spi` bus (in your `zmk-config` keymap for example) or you will want to define your own `&nice_view_spi` bus without using this adapter. diff --git a/app/boards/shields/pancake/pancake.keymap b/app/boards/shields/pancake/pancake.keymap index 99f2aaff..e5ca4372 100644 --- a/app/boards/shields/pancake/pancake.keymap +++ b/app/boards/shields/pancake/pancake.keymap @@ -20,7 +20,7 @@ default_layer { bindings = < - &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SQT &kp SEMI &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp UP &kp ENTER &kp LCTRL &kp LALT &kp LGUI &mo FNC &mo LWR &kp SPACE &kp SPACE &mo RSE &kp SLASH &kp LEFT &kp DOWN &kp RIGHT @@ -32,7 +32,7 @@ &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &kp BSPC &trans &trans &trans &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp LBRC &kp RBRC &kp C_VOL_UP &trans - &trans &trans &trans &trans &trans &trans &trans &trans &kp QMARK &trans &kp C_VOL_DN &trans + &trans &trans &trans &trans &trans &trans &trans &trans &kp QMARK &trans &kp C_VOL_DN &trans >; }; @@ -41,8 +41,8 @@ &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &trans &kp BSLH &trans &trans &trans &trans &trans &trans &trans &trans &kp LBKT &kp RBKT &kp C_VOL_UP &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_VOL_DN &trans - >; + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_VOL_DN &trans + >; }; function_layer { @@ -50,8 +50,8 @@ &bootloader &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp F11 &kp F12 &trans &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans - &out OUT_BLE &out OUT_USB &out OUT_TOG &trans &trans &trans &trans &trans &trans &trans &trans &trans - >; + &out OUT_BLE &out OUT_USB &out OUT_TOG &trans &trans &trans &trans &trans &trans &trans &trans &trans + >; }; }; }; diff --git a/app/boards/shields/pancake/pancake.overlay b/app/boards/shields/pancake/pancake.overlay index 53e8c8c1..6fae463f 100644 --- a/app/boards/shields/pancake/pancake.overlay +++ b/app/boards/shields/pancake/pancake.overlay @@ -14,7 +14,7 @@ label = "KSCAN"; diode-direction = "col2row"; - col-gpios + col-gpios = <&pro_micro 21 GPIO_ACTIVE_HIGH> , <&pro_micro 20 GPIO_ACTIVE_HIGH> , <&pro_micro 19 GPIO_ACTIVE_HIGH> @@ -28,7 +28,7 @@ , <&pro_micro 3 GPIO_ACTIVE_HIGH> , <&pro_micro 2 GPIO_ACTIVE_HIGH> ; - + row-gpios = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> diff --git a/app/boards/shields/qaz/qaz.overlay b/app/boards/shields/qaz/qaz.overlay index 098c9f02..76ee5ba7 100644 --- a/app/boards/shields/qaz/qaz.overlay +++ b/app/boards/shields/qaz/qaz.overlay @@ -49,5 +49,5 @@ , <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; }; - + }; \ No newline at end of file diff --git a/app/boards/shields/quefrency/Kconfig.defconfig b/app/boards/shields/quefrency/Kconfig.defconfig index 9e51c2bc..28e46a56 100644 --- a/app/boards/shields/quefrency/Kconfig.defconfig +++ b/app/boards/shields/quefrency/Kconfig.defconfig @@ -1,7 +1,7 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT - - + + if SHIELD_QUEFRENCY_LEFT config ZMK_KEYBOARD_NAME diff --git a/app/boards/shields/quefrency/quefrency.dtsi b/app/boards/shields/quefrency/quefrency.dtsi index 411d3658..c9cb7d43 100644 --- a/app/boards/shields/quefrency/quefrency.dtsi +++ b/app/boards/shields/quefrency/quefrency.dtsi @@ -13,7 +13,7 @@ zmk,matrix_transform = &default_transform; }; - /* + /* * This transform correspondsto the 60% left without macro keypad and 65% right, even this * combination of PCBs can have keys in different locations based on configuration. */ @@ -22,11 +22,11 @@ columns = <15>; rows = <6>; map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) /**/ RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,14) RC(5,13) +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) /**/ RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,14) RC(5,13) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) /**/RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(5,14) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) /**/ RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,13) -RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) /**/ RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,12) RC(3,13) RC(3,14) RC(3,11) -RC(4,0) RC(4,1) RC(4,2) RC(4,4) RC(4,6) /**/ RC(4,7) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,9) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) /**/ RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,13) +RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) /**/ RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,12) RC(3,13) RC(3,14) RC(3,11) +RC(4,0) RC(4,1) RC(4,2) RC(4,4) RC(4,6) /**/ RC(4,7) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,9) >; }; }; diff --git a/app/boards/shields/quefrency/quefrency_right.overlay b/app/boards/shields/quefrency/quefrency_right.overlay index 8e42d555..bf97d34b 100644 --- a/app/boards/shields/quefrency/quefrency_right.overlay +++ b/app/boards/shields/quefrency/quefrency_right.overlay @@ -12,7 +12,7 @@ / { - /* This kscan is for the 65% right half the 60% right half + /* This kscan is for the 65% right half the 60% right half * may require different column and row pins */ kscan0: kscan { diff --git a/app/boards/shields/redox/redox.dtsi b/app/boards/shields/redox/redox.dtsi index 4825a39f..9c0705a6 100644 --- a/app/boards/shields/redox/redox.dtsi +++ b/app/boards/shields/redox/redox.dtsi @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include / { @@ -42,7 +42,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; }; diff --git a/app/boards/shields/redox/redox.keymap b/app/boards/shields/redox/redox.keymap index a45595ff..c88f703b 100644 --- a/app/boards/shields/redox/redox.keymap +++ b/app/boards/shields/redox/redox.keymap @@ -30,7 +30,7 @@ >; }; - + lower_layer { // -------------------------------------------------------------------------------------------------------------------------- // | ESC | 1 | 2 | 3 | 4 | 5 | --- | 6 | 7 | 8 | 9 | 0 | DEL | @@ -62,7 +62,7 @@ &trans &trans &trans &mo 3 &trans &mo 3 &trans &trans &trans &trans &trans &trans &trans &trans >; }; - + adjust_layer { // ----------------------------------------------------------------------------------------- // | F1 | F2 | F3 | F4 | F5 | F6 | --- | F7 | F8 | F9 | F10 | F11 | F12 | diff --git a/app/boards/shields/snap/Kconfig.defconfig b/app/boards/shields/snap/Kconfig.defconfig index fa02421a..c4a67e65 100644 --- a/app/boards/shields/snap/Kconfig.defconfig +++ b/app/boards/shields/snap/Kconfig.defconfig @@ -15,7 +15,7 @@ if SHIELD_SNAP_LEFT || SHIELD_SNAP_RIGHT config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/snap/snap.dtsi b/app/boards/shields/snap/snap.dtsi index 0b7f32e5..77070db9 100644 --- a/app/boards/shields/snap/snap.dtsi +++ b/app/boards/shields/snap/snap.dtsi @@ -38,7 +38,7 @@ // R3C07L | R3C06L | R3C05L | R3C04L | R3C03L | R3C02L | R3C00L | | R3C15R | R3C14R | R3C13R | R3C12R | R3C11R | R3C10R | R3C09R | R4C08R | // R4C07L | R4C06L | R4C05L | R4C04L | R4C03L | R4C02L | R4C01L | R4C00L | | R4C15R | R4C14R | R4C13R | R4C12R | R4C11R | R4C10R | R4C09R | R5C08R | // R5C07L | R5C06L | R5C05L | R5C04L | R5C02L | R5C00L | | R5C15R | R5C14R | R5C13R | R5C12R | R5C11R | R5C10R | R5C09R | - + map = < RC(0,6) RC(0,5) RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,15) RC(0,14) RC(0,13) RC(0,12) RC(0,11) RC(0,10) RC(0,9) RC(0,8) RC(1,7) RC(1,6) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,15) RC(1,14) RC(1,13) RC(1,12) RC(1,11) RC(1,10) RC(1,9) RC(1,8) RC(1,16) diff --git a/app/boards/shields/snap/snap.keymap b/app/boards/shields/snap/snap.keymap index db44eb69..cc4c5255 100644 --- a/app/boards/shields/snap/snap.keymap +++ b/app/boards/shields/snap/snap.keymap @@ -37,7 +37,7 @@ bindings = < &bootloader &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader &kp C_PP &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_PP -&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 &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 &rgb_ug RGB_TOG &rgb_ug RGB_BRI &rgb_ug RGB_EFF &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_BRD &rgb_ug RGB_HUI diff --git a/app/boards/shields/snap/snap_left.overlay b/app/boards/shields/snap/snap_left.overlay index 90fd66d1..b5b8a841 100644 --- a/app/boards/shields/snap/snap_left.overlay +++ b/app/boards/shields/snap/snap_left.overlay @@ -24,7 +24,7 @@ &left_encoder { a-gpios = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; status = "okay"; }; diff --git a/app/boards/shields/snap/snap_right.overlay b/app/boards/shields/snap/snap_right.overlay index 4243f518..dc71a5cf 100644 --- a/app/boards/shields/snap/snap_right.overlay +++ b/app/boards/shields/snap/snap_right.overlay @@ -46,6 +46,6 @@ kscan_direct: kscan_direct { &right_encoder { a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; status = "okay"; }; diff --git a/app/boards/shields/sofle/Kconfig.defconfig b/app/boards/shields/sofle/Kconfig.defconfig index 1c1c5604..afa710ff 100644 --- a/app/boards/shields/sofle/Kconfig.defconfig +++ b/app/boards/shields/sofle/Kconfig.defconfig @@ -8,7 +8,7 @@ config ZMK_KEYBOARD_NAME config ZMK_SPLIT_ROLE_CENTRAL default y - + endif if SHIELD_SOFLE_LEFT || SHIELD_SOFLE_RIGHT diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig index 29de8d7e..03078cd6 100644 --- a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig @@ -21,7 +21,7 @@ config ZMK_RGB_UNDERGLOW select SPI config ZMK_DISPLAY - + if ZMK_DISPLAY config SSD1306 diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay index 864321cc..82234278 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay @@ -24,7 +24,7 @@ , <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> ; - col-gpios + col-gpios = <&pro_micro 16 GPIO_ACTIVE_HIGH> , <&pro_micro 10 GPIO_ACTIVE_HIGH> , <&pro_micro 14 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay index 34330400..c1d34ffd 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay @@ -24,7 +24,7 @@ , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> ; - col-gpios + col-gpios = <&pro_micro 9 GPIO_ACTIVE_HIGH> , <&pro_micro 8 GPIO_ACTIVE_HIGH> , <&pro_micro 7 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig index 3c8d5f58..221bf90a 100644 --- a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig @@ -21,7 +21,7 @@ config ZMK_RGB_UNDERGLOW select SPI config ZMK_DISPLAY - + if ZMK_DISPLAY config SSD1306 diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay index 1fa61286..10a195ff 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay @@ -25,7 +25,7 @@ , <&pro_micro 8 GPIO_ACTIVE_HIGH> ; - col-gpios + col-gpios = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay index 7f281db9..eaebff36 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay @@ -25,7 +25,7 @@ , <&pro_micro 10 GPIO_ACTIVE_HIGH> ; - col-gpios + col-gpios = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig index 4a2b8973..ac07c935 100644 --- a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig @@ -21,7 +21,7 @@ config ZMK_RGB_UNDERGLOW select SPI config ZMK_DISPLAY - + if ZMK_DISPLAY config SSD1306 diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap index 136e6927..385d2022 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap @@ -14,7 +14,7 @@ // tapping_term_ms = <200>; }; -/ { +/ { combos { compatible = "zmk,combos"; @@ -23,80 +23,80 @@ key-positions = <0 1>; bindings = <&kp ESC>; }; - + combo_tab { timeout-ms = <50>; key-positions = <10 11>; bindings = <&kp TAB>; }; - + combo_ralt { timeout-ms = <50>; key-positions = <17 16>; bindings = <&kp RALT>; }; - + combo_lalt { timeout-ms = <50>; key-positions = <11 12>; bindings = <&kp LALT>; }; - + combo_lgui { timeout-ms = <50>; key-positions = <12 13>; bindings = <&kp LGUI>; }; - - + + combo_rgui { timeout-ms = <50>; key-positions = <17 18>; bindings = <&kp RGUI>; }; - - + + }; keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < - &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp QUOT &mt LSFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &mt LSFT RET - &mo 1 &kp LCTL &kp SPC &mo 2 + &mo 1 &kp LCTL &kp SPC &mo 2 >; }; left_layer { bindings = < - &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 - &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL - &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL - &mo 1 &kp LGUI &kp RGUI &mo 2 + &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 + &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL + &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL + &mo 1 &kp LGUI &kp RGUI &mo 2 >; }; - + right_layer { bindings = < - &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN + &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN &kp HASH &kp QMARK &kp FSLH &kp COLN &kp SCLN &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BKSP &kp LSFT &kp KPLS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT - &mo 3 &kp LCTL &kp SPC &mo 2 + &mo 3 &kp LCTL &kp SPC &mo 2 >; - }; - + }; + tri_layer { bindings = < &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &trans &trans &trans &trans &trans - &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans - &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans - &trans &trans &trans &trans + &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans + &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans + &trans &trans &trans &trans >; - }; - + }; + }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay index 3dc954c3..1ff5ed5e 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay @@ -24,7 +24,7 @@ , <&pro_micro 15 GPIO_ACTIVE_HIGH> ; - col-gpios + col-gpios = <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 4 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay index 3811423e..81ddca40 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay @@ -24,7 +24,7 @@ , <&pro_micro 14 GPIO_ACTIVE_HIGH> ; - col-gpios + col-gpios = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> diff --git a/app/boards/shields/splitreus62/Kconfig.defconfig b/app/boards/shields/splitreus62/Kconfig.defconfig index 88a53a2f..14063d3e 100644 --- a/app/boards/shields/splitreus62/Kconfig.defconfig +++ b/app/boards/shields/splitreus62/Kconfig.defconfig @@ -1,8 +1,8 @@ # Copyright (c) 2020 Derek Schmell # SPDX-License-Identifier: MIT - - + + if SHIELD_SPLITREUS62_LEFT config ZMK_KEYBOARD_NAME @@ -17,5 +17,5 @@ if SHIELD_SPLITREUS62_LEFT || SHIELD_SPLITREUS62_RIGHT config ZMK_SPLIT default y - + endif diff --git a/app/boards/shields/splitreus62/splitreus62.dtsi b/app/boards/shields/splitreus62/splitreus62.dtsi index 4b55bb8d..905605e9 100644 --- a/app/boards/shields/splitreus62/splitreus62.dtsi +++ b/app/boards/shields/splitreus62/splitreus62.dtsi @@ -45,6 +45,6 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) , <&pro_micro 5 GPIO_ACTIVE_HIGH> , <&pro_micro 6 GPIO_ACTIVE_HIGH> ; - + }; }; diff --git a/app/boards/shields/splitreus62/splitreus62_right.overlay b/app/boards/shields/splitreus62/splitreus62_right.overlay index f301ab99..9f76e7eb 100644 --- a/app/boards/shields/splitreus62/splitreus62_right.overlay +++ b/app/boards/shields/splitreus62/splitreus62_right.overlay @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include "splitreus62.dtsi" &default_transform { diff --git a/app/boards/shields/tg4x/README.md b/app/boards/shields/tg4x/README.md index 087ce251..12709fde 100644 --- a/app/boards/shields/tg4x/README.md +++ b/app/boards/shields/tg4x/README.md @@ -6,6 +6,6 @@ Standard setup for the [TG4x](https://github.com/MythosMann/tg4x/) 40% keyboard. This TG4x implementation is for... -* rev 2.1 of the board -* Split spacebar with 2.25U on the left and 2.75U on the right -* 2U right shift +- rev 2.1 of the board +- Split spacebar with 2.25U on the left and 2.75U on the right +- 2U right shift diff --git a/app/boards/shields/tg4x/tg4x.overlay b/app/boards/shields/tg4x/tg4x.overlay index 0df94a2b..ca6e23c3 100644 --- a/app/boards/shields/tg4x/tg4x.overlay +++ b/app/boards/shields/tg4x/tg4x.overlay @@ -10,7 +10,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; label = "KSCAN"; - + diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/tidbit/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index e8cb3789..11424dc8 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -21,7 +21,7 @@ keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < &kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS diff --git a/app/boards/shields/tidbit/tidbit_19key.keymap b/app/boards/shields/tidbit/tidbit_19key.keymap index 8414a012..5710aeaf 100644 --- a/app/boards/shields/tidbit/tidbit_19key.keymap +++ b/app/boards/shields/tidbit/tidbit_19key.keymap @@ -22,7 +22,7 @@ keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < &tog 1 &kp KP_NUMLOCK &kp KP_SLASH diff --git a/app/boards/shields/two_percent_milk/two_percent_milk.keymap b/app/boards/shields/two_percent_milk/two_percent_milk.keymap index 04dc4c0d..132793b3 100644 --- a/app/boards/shields/two_percent_milk/two_percent_milk.keymap +++ b/app/boards/shields/two_percent_milk/two_percent_milk.keymap @@ -7,11 +7,11 @@ #include #include #include - + / { keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < &kp X diff --git a/app/boards/shields/waterfowl/Kconfig.defconfig b/app/boards/shields/waterfowl/Kconfig.defconfig index 70029f0b..5a77ca11 100644 --- a/app/boards/shields/waterfowl/Kconfig.defconfig +++ b/app/boards/shields/waterfowl/Kconfig.defconfig @@ -13,7 +13,7 @@ if SHIELD_WATERFOWL_LEFT || SHIELD_WATERFOWL_RIGHT config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/waterfowl/waterfowl.dtsi b/app/boards/shields/waterfowl/waterfowl.dtsi index c21dcf07..a156360e 100644 --- a/app/boards/shields/waterfowl/waterfowl.dtsi +++ b/app/boards/shields/waterfowl/waterfowl.dtsi @@ -40,7 +40,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; left_encoder: encoder_left { //roller diff --git a/app/boards/shields/waterfowl/waterfowl.keymap b/app/boards/shields/waterfowl/waterfowl.keymap index d208fe49..9583499c 100644 --- a/app/boards/shields/waterfowl/waterfowl.keymap +++ b/app/boards/shields/waterfowl/waterfowl.keymap @@ -22,8 +22,8 @@ * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| * | Z | X | C | V | B | | 2 | | 3 | | N | M | , | . | / | * `----------------------------------' `-----' `-----' `----------------------------------' - * ,-----. ,--------------------. ,--------------------. ,-----. - * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | + * ,-----. ,--------------------. ,--------------------. ,-----. + * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ bindings = < @@ -46,7 +46,7 @@ * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| * | | | INS | | | | 2 | | 3 | | 0 | 1 | 2 | 3 | * | * `----------------------------------' `-----' `-----' `----------------------------------' - * ,-----. ,--------------------. ,--------------------. ,-----. + * ,-----. ,--------------------. ,--------------------. ,-----. * | 1 | | DEL | SPACE | MO(3)| | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ @@ -70,7 +70,7 @@ * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| * | $ | | { | } | & | | 2 | | 3 | | | | | | | * `----------------------------------' `-----' `-----' `----------------------------------' - * ,-----. ,--------------------. ,--------------------. ,-----. + * ,-----. ,--------------------. ,--------------------. ,-----. * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ @@ -94,7 +94,7 @@ * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| * | | | | | | | 2 | | 3 | | F10 | F1 | F2 | F3 | F13 | * `----------------------------------' `-----' `-----' `----------------------------------' - * ,-----. ,--------------------. ,--------------------. ,-----. + * ,-----. ,--------------------. ,--------------------. ,-----. * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ @@ -106,7 +106,7 @@ >; sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; - }; + }; }; }; \ No newline at end of file diff --git a/app/boards/shields/zmk_uno/zmk_uno.keymap b/app/boards/shields/zmk_uno/zmk_uno.keymap index 7ab2632a..0e0fc795 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.keymap +++ b/app/boards/shields/zmk_uno/zmk_uno.keymap @@ -29,8 +29,8 @@ }; REMOVE ME: */ - - + + / { macros { ZMK_MACRO(ble_zero, @@ -47,7 +47,7 @@ REMOVE ME: */ keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < &kp A &bl BL_TOG @@ -55,7 +55,7 @@ REMOVE ME: */ &out OUT_USB &ble_zero &ble_one >; - + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; }; }; diff --git a/app/boards/shields/zodiark/Kconfig.defconfig b/app/boards/shields/zodiark/Kconfig.defconfig index 77648afd..c6024694 100644 --- a/app/boards/shields/zodiark/Kconfig.defconfig +++ b/app/boards/shields/zodiark/Kconfig.defconfig @@ -8,7 +8,7 @@ config ZMK_KEYBOARD_NAME config ZMK_SPLIT_ROLE_CENTRAL default y - + endif if SHIELD_ZODIARK_LEFT || SHIELD_ZODIARK_RIGHT diff --git a/app/boards/shields/zodiark/zodiark.keymap b/app/boards/shields/zodiark/zodiark.keymap index 0211f818..82639edc 100644 --- a/app/boards/shields/zodiark/zodiark.keymap +++ b/app/boards/shields/zodiark/zodiark.keymap @@ -39,7 +39,7 @@ // | | 0 | . | Enter| | | | | | | | 0 | . | Enter | | bindings = < &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 -&kp KP_NUM &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp PSCRN &kp SLCK &trans &trans &kp PAUSE_BREAK &trans &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp F12 +&kp KP_NUM &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp PSCRN &kp SLCK &trans &trans &kp PAUSE_BREAK &trans &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp F12 &trans &kp KP_N4 &kp KP_N5 &kp KP_N6 &kp INS &kp HOME &trans &trans &kp PG_UP &trans &kp KP_N4 &kp KP_N5 &kp KP_N6 &trans &trans &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp DEL &kp END &trans &trans &trans &trans &kp PG_DN &trans &kp KP_N1 &kp KP_N2 &kp KP_N3 &trans &trans &kp KP_N0 &kp KP_DOT &kp KP_ENTER &trans &trans &trans &trans &trans &trans &kp KP_N0 &kp KP_DOT &kp KP_ENTER &trans diff --git a/app/core-coverage.yml b/app/core-coverage.yml index 12c03613..4a60aad9 100644 --- a/app/core-coverage.yml +++ b/app/core-coverage.yml @@ -1,35 +1,35 @@ board: -- nice_nano_v2 -- nrfmicro_13 -- proton_c + - nice_nano_v2 + - nrfmicro_13 + - proton_c shield: -- corne_left -- corne_right -- romac -- settings_reset -- tidbit + - corne_left + - corne_right + - romac + - settings_reset + - tidbit include: -- board: bdn9_rev2 -- board: nice60 -- board: seeeduino_xiao_ble - shield: hummingbird -- board: nrf52840_m2 - shield: m60 -- board: planck_rev6 -- board: proton_c - shield: clueboard_california -- board: nice_nano_v2 - shield: kyria_left - cmake-args: "-DCONFIG_ZMK_DISPLAY=y" - nickname: "display" -- board: nice_nano_v2 - shield: kyria_right - cmake-args: "-DCONFIG_ZMK_DISPLAY=y" - nickname: "display" -- board: nice_nano - shield: romac_plus - cmake-args: "-DCONFIG_ZMK_RGB_UNDERGLOW=y -DCONFIG_WS2812_STRIP=y" - nickname: "underglow" -- board: nice_nano_v2 - shield: lily58_left nice_view_adapter nice_view - nickname: "niceview" + - board: bdn9_rev2 + - board: nice60 + - board: seeeduino_xiao_ble + shield: hummingbird + - board: nrf52840_m2 + shield: m60 + - board: planck_rev6 + - board: proton_c + shield: clueboard_california + - board: nice_nano_v2 + shield: kyria_left + cmake-args: "-DCONFIG_ZMK_DISPLAY=y" + nickname: "display" + - board: nice_nano_v2 + shield: kyria_right + cmake-args: "-DCONFIG_ZMK_DISPLAY=y" + nickname: "display" + - board: nice_nano + shield: romac_plus + cmake-args: "-DCONFIG_ZMK_RGB_UNDERGLOW=y -DCONFIG_WS2812_STRIP=y" + nickname: "underglow" + - board: nice_nano_v2 + shield: lily58_left nice_view_adapter nice_view + nickname: "niceview" diff --git a/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml b/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml index 2db84bcd..94952813 100644 --- a/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml +++ b/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml @@ -5,24 +5,24 @@ # description: > - This is a representation of the Maxim MAX7318 I2C Gpio Expander. + This is a representation of the Maxim MAX7318 I2C Gpio Expander. compatible: "maxim,max7318" include: [gpio-controller.yaml, i2c-device.yaml] properties: - label: - required: true + label: + required: true - "#gpio-cells": - const: 2 + "#gpio-cells": + const: 2 - ngpios: - type: int - required: true - const: 16 - description: Number of gpios supported + ngpios: + type: int + required: true + const: 16 + description: Number of gpios supported gpio-cells: - pin diff --git a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml index 00947685..e6f6757d 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml @@ -16,4 +16,4 @@ properties: description: The default time to wait (in milliseconds) before triggering the next behavior in the macro bindings list. tap-ms: type: int - description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding \ No newline at end of file + description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding diff --git a/app/dts/bindings/behaviors/zmk,behavior-tap-dance.yaml b/app/dts/bindings/behaviors/zmk,behavior-tap-dance.yaml index 8f01effc..82e1517d 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-tap-dance.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-tap-dance.yaml @@ -13,4 +13,4 @@ properties: required: true tapping-term-ms: type: int - default: 200 \ No newline at end of file + default: 200 diff --git a/app/dts/bindings/display/gooddisplay,il0323.yaml b/app/dts/bindings/display/gooddisplay,il0323.yaml index d4a9ac7d..46fc7326 100644 --- a/app/dts/bindings/display/gooddisplay,il0323.yaml +++ b/app/dts/bindings/display/gooddisplay,il0323.yaml @@ -8,54 +8,54 @@ compatible: "gooddisplay,il0323" include: spi-device.yaml properties: - height: - type: int - required: true - description: Height in pixel of the panel driven by the controller + height: + type: int + required: true + description: Height in pixel of the panel driven by the controller - width: - type: int - required: true - description: Width in pixel of the panel driven by the controller + width: + type: int + required: true + description: Width in pixel of the panel driven by the controller - reset-gpios: - type: phandle-array - required: true - description: RESET pin. + reset-gpios: + type: phandle-array + required: true + description: RESET pin. - The RESET pin of GD7965 is active low. - If connected directly the MCU pin should be configured - as active low. + The RESET pin of GD7965 is active low. + If connected directly the MCU pin should be configured + as active low. - dc-gpios: - type: phandle-array - required: true - description: DC pin. + dc-gpios: + type: phandle-array + required: true + description: DC pin. - The DC pin of GD7965 is active low (transmission command byte). - If connected directly the MCU pin should be configured - as active low. + The DC pin of GD7965 is active low (transmission command byte). + If connected directly the MCU pin should be configured + as active low. - busy-gpios: - type: phandle-array - required: true - description: BUSY pin. + busy-gpios: + type: phandle-array + required: true + description: BUSY pin. - The BUSY pin of GD7965 is active low. - If connected directly the MCU pin should be configured - as active low. + The BUSY pin of GD7965 is active low. + If connected directly the MCU pin should be configured + as active low. - pwr: - type: uint8-array - required: true - description: Power Setting (PWR) values + pwr: + type: uint8-array + required: true + description: Power Setting (PWR) values - cdi: - type: int - required: true - description: VCOM and data interval value + cdi: + type: int + required: true + description: VCOM and data interval value - tcon: - type: int - required: true - description: TCON setting value \ No newline at end of file + tcon: + type: int + required: true + description: TCON setting value diff --git a/app/dts/bindings/macros/zmk,macro-control-mode-press.yaml b/app/dts/bindings/macros/zmk,macro-control-mode-press.yaml index 64b3939b..57603f3a 100644 --- a/app/dts/bindings/macros/zmk,macro-control-mode-press.yaml +++ b/app/dts/bindings/macros/zmk,macro-control-mode-press.yaml @@ -5,4 +5,4 @@ description: Set Macro To Press Mode compatible: "zmk,macro-control-mode-press" -include: zero_param.yaml \ No newline at end of file +include: zero_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-control-mode-release.yaml b/app/dts/bindings/macros/zmk,macro-control-mode-release.yaml index c1c27882..cd4ee2b6 100644 --- a/app/dts/bindings/macros/zmk,macro-control-mode-release.yaml +++ b/app/dts/bindings/macros/zmk,macro-control-mode-release.yaml @@ -5,4 +5,4 @@ description: Set Macro To Release Mode compatible: "zmk,macro-control-mode-release" -include: zero_param.yaml \ No newline at end of file +include: zero_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-control-tap-time.yaml b/app/dts/bindings/macros/zmk,macro-control-tap-time.yaml index 8dacdc2a..f3bfcd5f 100644 --- a/app/dts/bindings/macros/zmk,macro-control-tap-time.yaml +++ b/app/dts/bindings/macros/zmk,macro-control-tap-time.yaml @@ -5,4 +5,4 @@ description: Set Macro Tap Duration compatible: "zmk,macro-control-tap-time" -include: one_param.yaml \ No newline at end of file +include: one_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-control-wait-time.yaml b/app/dts/bindings/macros/zmk,macro-control-wait-time.yaml index 9e9beac2..45da69fa 100644 --- a/app/dts/bindings/macros/zmk,macro-control-wait-time.yaml +++ b/app/dts/bindings/macros/zmk,macro-control-wait-time.yaml @@ -5,4 +5,4 @@ description: Set Macro Wait Duration compatible: "zmk,macro-control-wait-time" -include: one_param.yaml \ No newline at end of file +include: one_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-pause-for-release.yaml b/app/dts/bindings/macros/zmk,macro-pause-for-release.yaml index e89d8b24..929e2a29 100644 --- a/app/dts/bindings/macros/zmk,macro-pause-for-release.yaml +++ b/app/dts/bindings/macros/zmk,macro-pause-for-release.yaml @@ -5,4 +5,4 @@ description: Macro Pause Until Release Marker compatible: "zmk,macro-pause-for-release" -include: zero_param.yaml \ No newline at end of file +include: zero_param.yaml diff --git a/app/dts/bindings/zmk,combos.yaml b/app/dts/bindings/zmk,combos.yaml index 1a914a7f..d094b5c4 100644 --- a/app/dts/bindings/zmk,combos.yaml +++ b/app/dts/bindings/zmk,combos.yaml @@ -22,4 +22,4 @@ child-binding: type: boolean layers: type: array - default: [-1] \ No newline at end of file + default: [-1] diff --git a/app/include/linker/zmk-events.ld b/app/include/linker/zmk-events.ld index 66c1264a..3e307f85 100644 --- a/app/include/linker/zmk-events.ld +++ b/app/include/linker/zmk-events.ld @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include __event_type_start = .; \ diff --git a/app/package.json b/app/package.json index e75d9695..9ad28788 100644 --- a/app/package.json +++ b/app/package.json @@ -18,6 +18,6 @@ }, "homepage": "https://zmk.dev/", "devDependencies": { - "prettier": "^2.4.0" + "prettier": "^2.7.1" } -} \ No newline at end of file +} diff --git a/app/src/activity.c b/app/src/activity.c index 46af56fb..41fe2e15 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -74,8 +74,8 @@ void activity_work_handler(struct k_work *work) { } else #endif /* IS_ENABLED(CONFIG_ZMK_SLEEP) */ if (inactive_time > MAX_IDLE_MS) { - set_state(ZMK_ACTIVITY_IDLE); - } + set_state(ZMK_ACTIVITY_IDLE); + } } K_WORK_DEFINE(activity_work, activity_work_handler); diff --git a/app/src/display/widgets/Kconfig b/app/src/display/widgets/Kconfig index 5ef32d20..4c056cf5 100644 --- a/app/src/display/widgets/Kconfig +++ b/app/src/display/widgets/Kconfig @@ -33,7 +33,7 @@ config ZMK_WIDGET_PERIPHERAL_STATUS depends on BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL default y if BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL select LV_USE_LABEL - + config ZMK_WIDGET_WPM_STATUS bool "Widget for displaying typed words per minute" depends on !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL diff --git a/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap index d35c7277..a02f6c64 100644 --- a/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap @@ -8,7 +8,7 @@ /* This test fails if the order of event handlers for hold-taps -and combos is wrong. Hold-taps need to process key position events +and combos is wrong. Hold-taps need to process key position events first so the decision to hold or tap can be made. */ / { @@ -37,11 +37,11 @@ first so the decision to hold or tap can be made. &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap index a99c15d9..325da627 100644 --- a/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap @@ -32,11 +32,11 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/layer-filter-0/native_posix_64.keymap b/app/tests/combo/layer-filter-0/native_posix_64.keymap index aac330f9..33712822 100644 --- a/app/tests/combo/layer-filter-0/native_posix_64.keymap +++ b/app/tests/combo/layer-filter-0/native_posix_64.keymap @@ -52,27 +52,27 @@ &kscan { events = < /* Combo One */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) /* Combo Three */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,1,10) /* Toggle Layer */ - ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,10) /* Combo Two */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) /* Combo Three */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/layer-filter-1/native_posix_64.keymap b/app/tests/combo/layer-filter-1/native_posix_64.keymap index 995f27ee..8eb5e9eb 100644 --- a/app/tests/combo/layer-filter-1/native_posix_64.keymap +++ b/app/tests/combo/layer-filter-1/native_posix_64.keymap @@ -32,9 +32,9 @@ &kscan { events = < /* Combo One */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/multiple-timeouts/native_posix_64.keymap b/app/tests/combo/multiple-timeouts/native_posix_64.keymap index 91bf5235..87d21be1 100644 --- a/app/tests/combo/multiple-timeouts/native_posix_64.keymap +++ b/app/tests/combo/multiple-timeouts/native_posix_64.keymap @@ -34,7 +34,7 @@ events = < ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-0/native_posix_64.keymap b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap index e3cbf437..8b7b4196 100644 --- a/app/tests/combo/overlapping-combos-0/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap @@ -2,7 +2,7 @@ #include #include -/* +/* combo 0 timeout inf combo 01 timeout inf combo 0123 timeout inf @@ -51,66 +51,66 @@ events = < /* all permutations of combo one press, combo triggered by release */ /* while debugging these, you may want to set the release_timer to a high number */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,10) - - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,2,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - + ZMK_MOCK_RELEASE(0,0,10) + /* all permutations of combo two press and release, combo triggered by release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) ZMK_MOCK_RELEASE(0,2,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/combo/overlapping-combos-1/native_posix_64.keymap b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap index c228c475..45737882 100644 --- a/app/tests/combo/overlapping-combos-1/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap @@ -39,26 +39,26 @@ &kscan { events = < - /* if you're debugging these, remember that the timer can be triggered between + /* if you're debugging these, remember that the timer can be triggered between events while stepping through code. */ /* all permutations of combo two press and release, combo triggered by timeout */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,100) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/combo/overlapping-combos-2/native_posix_64.keymap b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap index 3d364213..ba547dc2 100644 --- a/app/tests/combo/overlapping-combos-2/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap @@ -2,7 +2,7 @@ #include #include -/* +/* combo 01 timeout 100 combo 0123 timeout 100 press 012, wait until timeout runs out @@ -40,13 +40,13 @@ &kscan { events = < - /* if you're debugging these, remember that the timer can be triggered between + /* if you're debugging these, remember that the timer can be triggered between events while stepping through code. */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,100) >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-3/native_posix_64.keymap b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap index 0622dcd0..0da394b5 100644 --- a/app/tests/combo/overlapping-combos-3/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap @@ -2,7 +2,7 @@ #include #include -/* +/* combo 12 timeout 100 combo 0123 timeout 100 press 012, release 2 @@ -41,13 +41,13 @@ &kscan { events = < - /* if you're debugging these, remember that the timer can be triggered between + /* if you're debugging these, remember that the timer can be triggered between events while stepping through code. */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,100) >; }; \ No newline at end of file diff --git a/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap index 4e68105f..f9537344 100644 --- a/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap +++ b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap @@ -10,7 +10,7 @@ key-positions = <0 1>; bindings = <&kp X>; }; - + combo_two { timeout-ms = <30>; key-positions = <0 2>; @@ -40,44 +40,44 @@ &kscan { events = < /* all permutations of combo one press and release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) /* all permutations of combo two press and release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) ZMK_MOCK_RELEASE(0,2,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap index 68736d8f..c6202365 100644 --- a/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap +++ b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap @@ -3,7 +3,7 @@ #include / { - combos { + combos { compatible = "zmk,combos"; combo_one { timeout-ms = <80>; @@ -27,9 +27,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,100) ZMK_MOCK_RELEASE(1,1,100) >; }; \ No newline at end of file diff --git a/app/tests/combo/press-release/native_posix_64.keymap b/app/tests/combo/press-release/native_posix_64.keymap index 0f45792d..8d81f35b 100644 --- a/app/tests/combo/press-release/native_posix_64.keymap +++ b/app/tests/combo/press-release/native_posix_64.keymap @@ -3,7 +3,7 @@ #include / { - combos { + combos { compatible = "zmk,combos"; combo_one { timeout-ms = <30>; @@ -28,24 +28,24 @@ &kscan { events = < /* all different combinations of press and release order */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/press-timeout/native_posix_64.keymap b/app/tests/combo/press-timeout/native_posix_64.keymap index ff0b7493..497cf1aa 100644 --- a/app/tests/combo/press-timeout/native_posix_64.keymap +++ b/app/tests/combo/press-timeout/native_posix_64.keymap @@ -27,9 +27,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap index 2518bbc9..cf7e79f7 100644 --- a/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap +++ b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap @@ -33,13 +33,13 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap index 4895636e..0c55eb47 100644 --- a/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap +++ b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap @@ -33,14 +33,14 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + + ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap index 0c4a698c..248d6e75 100644 --- a/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap +++ b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap @@ -33,14 +33,14 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/slowrelease-disabled/native_posix_64.keymap b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap index 3bacb886..5af94d45 100644 --- a/app/tests/combo/slowrelease-disabled/native_posix_64.keymap +++ b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap @@ -28,11 +28,11 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,0,10) /* this should release the combo */ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/slowrelease-enabled/native_posix_64.keymap b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap index 8ac8316b..88351bea 100644 --- a/app/tests/combo/slowrelease-enabled/native_posix_64.keymap +++ b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap @@ -28,11 +28,11 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,0,10) /* this should not release the combo yet */ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/gresc/gresc-press-release/native_posix_64.keymap b/app/tests/gresc/gresc-press-release/native_posix_64.keymap index 7ca3d77d..4b658a73 100644 --- a/app/tests/gresc/gresc-press-release/native_posix_64.keymap +++ b/app/tests/gresc/gresc-press-release/native_posix_64.keymap @@ -19,30 +19,30 @@ &kscan { events = < /* esc */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* ~ */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,0,10) /* LGUI+` */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,1,10) /* ~ */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) /* LGUI+` */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/gresc/gresc-two-instances/native_posix_64.keymap b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap index 0c38721d..78b8ebcb 100644 --- a/app/tests/gresc/gresc-two-instances/native_posix_64.keymap +++ b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap @@ -27,15 +27,15 @@ The first gresc that is released releases the key. &kscan { events = < /* esc */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(0,1,10) /* the second gresc is ignored */ ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) /* the second gresc is ignored */ /* ~ */ - ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) /* the second gresc is ignored */ + ZMK_MOCK_PRESS(0,0,10) /* the second gresc is ignored */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) /* the second gresc is ignored */ diff --git a/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap index 040cdd3e..38c8668c 100644 --- a/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap index abb31b4b..a540353b 100644 --- a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 38575e9a..76bb2fa3 100644 --- a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,300) /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 21baa447..882f33aa 100644 --- a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /*d*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index cd7ff384..0fc0b848 100644 --- a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /* d */ ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index b84aa626..5d0fcbfb 100644 --- a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index bdfaf9d3..fca60ba8 100644 --- a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index c0fd1bd1..5d0af9ca 100644 --- a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_PRESS(1,0,100) ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 69c19676..6b138352 100644 --- a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) - /* timer */ + /* timer */ >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap index 8f90ffad..d895df02 100644 --- a/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap @@ -6,9 +6,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap b/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap index 706ca540..832ea7ef 100644 --- a/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap @@ -31,15 +31,15 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* retro tap */ ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* hold */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index d1d2b756..7560a05a 100644 --- a/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index 94d9a923..b915a6a9 100644 --- a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index 6ddf87f8..a6ac1507 100644 --- a/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(1,0,10) // trigger key ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap index 93076055..9965c9b3 100644 --- a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap index 2698f055..6d016501 100644 --- a/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap @@ -20,7 +20,7 @@ default_layer { bindings = < - &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J &ht_bal LEFT_GUI H &ht_bal LEFT_ALT L >; }; @@ -29,13 +29,13 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,100) ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_PRESS(1,1,100) - ZMK_MOCK_RELEASE(0,0,100) - ZMK_MOCK_RELEASE(0,1,100) - ZMK_MOCK_RELEASE(1,0,100) - ZMK_MOCK_RELEASE(1,1,100) + ZMK_MOCK_PRESS(1,1,100) + ZMK_MOCK_RELEASE(0,0,100) + ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_RELEASE(1,0,100) + ZMK_MOCK_RELEASE(1,1,100) >; }; diff --git a/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap index 040cdd3e..38c8668c 100644 --- a/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap index abb31b4b..a540353b 100644 --- a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 38575e9a..76bb2fa3 100644 --- a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,300) /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 21baa447..882f33aa 100644 --- a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /*d*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index cd7ff384..0fc0b848 100644 --- a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /* d */ ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index b84aa626..5d0fcbfb 100644 --- a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index bdfaf9d3..fca60ba8 100644 --- a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index c0fd1bd1..5d0af9ca 100644 --- a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_PRESS(1,0,100) ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 69c19676..6b138352 100644 --- a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) - /* timer */ + /* timer */ >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap index 8f90ffad..d895df02 100644 --- a/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap @@ -6,9 +6,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap index 314b7334..dc96ee8b 100644 --- a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap @@ -31,15 +31,15 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* retro tap */ ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* hold */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index d1d2b756..7560a05a 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index 94d9a923..b915a6a9 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index 6ddf87f8..a6ac1507 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(1,0,10) // trigger key ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap index ee0d5e80..13a58c3e 100644 --- a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap index 040cdd3e..38c8668c 100644 --- a/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap index abb31b4b..a540353b 100644 --- a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 38575e9a..76bb2fa3 100644 --- a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,300) /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 21baa447..882f33aa 100644 --- a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /*d*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index cd7ff384..0fc0b848 100644 --- a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /* d */ ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index b84aa626..5d0fcbfb 100644 --- a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index bdfaf9d3..fca60ba8 100644 --- a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index c0fd1bd1..5d0af9ca 100644 --- a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_PRESS(1,0,100) ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 69c19676..6b138352 100644 --- a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) - /* timer */ + /* timer */ >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap index 8f90ffad..d895df02 100644 --- a/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap @@ -6,9 +6,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap index adbd648e..b733e3a2 100644 --- a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap @@ -2,7 +2,7 @@ #include #include -/* +/* * A hold-tap with long tapping term is pressed first. * A hold-tap with short tapping term is quickly tapped. * The short tapping term hold-tap should 'tap', not 'hold'. @@ -45,9 +45,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,20) - ZMK_MOCK_PRESS(0,1,20) - ZMK_MOCK_RELEASE(0,1,200) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,20) + ZMK_MOCK_PRESS(0,1,20) + ZMK_MOCK_RELEASE(0,1,200) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index d1d2b756..7560a05a 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index 94d9a923..b915a6a9 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index 6ddf87f8..a6ac1507 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(1,0,10) // trigger key ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap index 93076055..9965c9b3 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap index 040cdd3e..38c8668c 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap index abb31b4b..a540353b 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 38575e9a..76bb2fa3 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,300) /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 21baa447..882f33aa 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /*d*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index cd7ff384..0fc0b848 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /* d */ ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index b84aa626..5d0fcbfb 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index bdfaf9d3..fca60ba8 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index c0fd1bd1..5d0af9ca 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_PRESS(1,0,100) ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 69c19676..6b138352 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) - /* timer */ + /* timer */ >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap index 8f90ffad..d895df02 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap @@ -6,9 +6,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap index 93076055..9965c9b3 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/keypress/kp-press-release/native_posix_64.keymap b/app/tests/keypress/kp-press-release/native_posix_64.keymap index 0ddb7ab6..c8e744ee 100644 --- a/app/tests/keypress/kp-press-release/native_posix_64.keymap +++ b/app/tests/keypress/kp-press-release/native_posix_64.keymap @@ -2,7 +2,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap index f4379893..f4d03429 100644 --- a/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap @@ -5,30 +5,30 @@ &kscan { events = < /* Toggle LALT on */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Tap TAB twice */ - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) /* Toggle LSHFT on */ - ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) /* Tap TAB once */ - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) /* Toggle LALT off */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Tap A */ - ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,10) /* Toggle LSHFT off */ - ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) /* Tap A */ - ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,10) >; }; diff --git a/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap index 3b14e416..0a4ad4ae 100644 --- a/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap @@ -5,18 +5,18 @@ &kscan { events = < /* Toggle LS(A) on */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Toggle LS(A) off */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Press A */ - ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,0,10) /* Toggle LS(A) on */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Toggle LS(A) off */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Release A */ ZMK_MOCK_RELEASE(1,0,10) diff --git a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap index 644caa26..e25d4b18 100644 --- a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap @@ -2,9 +2,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-press-release/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release/native_posix_64.keymap index 644caa26..e25d4b18 100644 --- a/app/tests/keytoggle/kt-press-release/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-press-release/native_posix_64.keymap @@ -2,9 +2,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/macros/basic/native_posix_64.keymap b/app/tests/macros/basic/native_posix_64.keymap index 6a2391db..a2812792 100644 --- a/app/tests/macros/basic/native_posix_64.keymap +++ b/app/tests/macros/basic/native_posix_64.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include diff --git a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap index 2f3b943a..e6ef4f49 100644 --- a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap +++ b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include diff --git a/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap b/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap index c264a9ab..c5cde5b4 100644 --- a/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap +++ b/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include diff --git a/app/tests/macros/press-mid-macro/native_posix_64.keymap b/app/tests/macros/press-mid-macro/native_posix_64.keymap index a075a443..b8ae76f1 100644 --- a/app/tests/macros/press-mid-macro/native_posix_64.keymap +++ b/app/tests/macros/press-mid-macro/native_posix_64.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include diff --git a/app/tests/macros/press-release/native_posix_64.keymap b/app/tests/macros/press-release/native_posix_64.keymap index 6814d542..25467126 100644 --- a/app/tests/macros/press-release/native_posix_64.keymap +++ b/app/tests/macros/press-release/native_posix_64.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include diff --git a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap index b8142425..dbb2df5c 100644 --- a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap index 26af5657..b01c6257 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) >; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap index 9df2c152..89930328 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap @@ -5,8 +5,8 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap index 5f9375fb..acd55e83 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap index 1b175d44..7e1865a0 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap index 0e9a2d6a..e175d60e 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending index 3f49005a..f3df27ca 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending @@ -1,9 +1,9 @@ -This test fails because the hid_listener_keycode_released function +This test fails because the hid_listener_keycode_released function releases implicit modifiers always, even if they were not set by the key that's going up. Also see the comment in that function: If LC(A) is pressed, then LS(B), then LC(A) is released, the shift for B will be released prematurely. This causes if LS(B) to repeat like Bbbbbbbb when pressed for a long time. Solving this would require keeping track of which key's implicit modifiers are currently - active and only releasing modifiers at that time. + active and only releasing modifiers at that time. diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap index 10d0dbf8..8c4534f4 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap index 3d6494dd..e82182c4 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap @@ -5,9 +5,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap index d5f372f1..a36b85d2 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; diff --git a/app/tests/momentary-layer/1-normal/native_posix_64.keymap b/app/tests/momentary-layer/1-normal/native_posix_64.keymap index b5249f7b..ed0e8ad1 100644 --- a/app/tests/momentary-layer/1-normal/native_posix_64.keymap +++ b/app/tests/momentary-layer/1-normal/native_posix_64.keymap @@ -24,9 +24,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap b/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap index 96e4e8d9..9311fdee 100644 --- a/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap +++ b/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap @@ -24,9 +24,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/3-covered/native_posix_64.keymap b/app/tests/momentary-layer/3-covered/native_posix_64.keymap index 2dde6d88..62ae301d 100644 --- a/app/tests/momentary-layer/3-covered/native_posix_64.keymap +++ b/app/tests/momentary-layer/3-covered/native_posix_64.keymap @@ -27,7 +27,7 @@ and the original key is "covered". &kscan { events = < - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) >; }; diff --git a/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap b/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap index d0f26b2f..230e9566 100644 --- a/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap @@ -5,8 +5,8 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,1200) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,1200) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) >; diff --git a/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap b/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap index 9febf08c..79567de9 100644 --- a/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap @@ -24,7 +24,7 @@ &kscan { events = < /* press sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,1,10) /* tap sk LEFT_CONTROL */ ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) @@ -32,12 +32,12 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) /* release sl lower_layer */ - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* tap A (with left control and left shift enabled) */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) /* tap A (no sticky keys anymore) */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap index e9b87f42..e89faa93 100644 --- a/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap @@ -35,11 +35,11 @@ &kscan { events = < /* press sl 1 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* press sl 2 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* press 1 */ ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) @@ -49,11 +49,11 @@ /* repeat test to check if cleanup is done correctly */ /* press sl 1 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* press sl 2 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* press 1 */ ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap index 33115453..f52a6bec 100644 --- a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap @@ -9,17 +9,17 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(1,0,10) /* second key is pressed shortly after the first. It should not be capitalized. */ - ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,10) /* repeat test to check if cleanup is done correctly */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) >; diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap index 2d078ba5..63aca99b 100644 --- a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap @@ -5,14 +5,14 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) /* repeat test to check if cleanup is done correctly */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) >; diff --git a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap index 4470fb21..18d09ebc 100644 --- a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap @@ -29,8 +29,8 @@ &kscan { events = < /* press sl 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* press X */ ZMK_MOCK_PRESS(0,1,10) /* press A */ @@ -40,8 +40,8 @@ /* repeat test to check if cleanup is done correctly */ /* press sl 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* press X */ ZMK_MOCK_PRESS(0,1,10) /* press Y */ diff --git a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap index 438880d5..47600269 100644 --- a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap @@ -5,9 +5,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap index 067f2379..2fb661a7 100644 --- a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap @@ -5,9 +5,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap index d58641bd..92fd1e0a 100644 --- a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap @@ -5,8 +5,8 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,800) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,800) ZMK_MOCK_PRESS(1,0,400) ZMK_MOCK_RELEASE(1,0,10) >; diff --git a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap index aac6725e..1daa6c4f 100644 --- a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,1100) + ZMK_MOCK_RELEASE(0,0,1100) >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap index 66bb72d8..1be65a5b 100644 --- a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap +++ b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap @@ -5,8 +5,8 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,0,100) diff --git a/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap b/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap index bdcccf33..a90bb32e 100644 --- a/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap +++ b/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap @@ -24,24 +24,24 @@ &kscan { events = < /* tap sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* tap sk LEFT_CONTROL */ ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* repeat */ /* tap sl */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* tap sk */ ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap index d4c30fbf..f811f7e9 100644 --- a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap @@ -18,10 +18,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* the sticky key is pressed again, so the previous one must be cancelled */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,1200) >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/1b-tap2/native_posix_64.keymap b/app/tests/tap-dance/1b-tap2/native_posix_64.keymap index c5e1c8db..5674c4ea 100644 --- a/app/tests/tap-dance/1b-tap2/native_posix_64.keymap +++ b/app/tests/tap-dance/1b-tap2/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,200) + ZMK_MOCK_RELEASE(0,0,200) >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/1c-tap3/native_posix_64.keymap b/app/tests/tap-dance/1c-tap3/native_posix_64.keymap index 6813393e..142b8236 100644 --- a/app/tests/tap-dance/1c-tap3/native_posix_64.keymap +++ b/app/tests/tap-dance/1c-tap3/native_posix_64.keymap @@ -6,10 +6,10 @@ &kscan { events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,200) + ZMK_MOCK_RELEASE(0,0,200) >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2a-hold1/native_posix_64.keymap b/app/tests/tap-dance/2a-hold1/native_posix_64.keymap index f4c7a2d2..bcfc21d2 100644 --- a/app/tests/tap-dance/2a-hold1/native_posix_64.keymap +++ b/app/tests/tap-dance/2a-hold1/native_posix_64.keymap @@ -6,6 +6,6 @@ &kscan { events = < ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2b-hold2/native_posix_64.keymap b/app/tests/tap-dance/2b-hold2/native_posix_64.keymap index 0fec2e40..6691437e 100644 --- a/app/tests/tap-dance/2b-hold2/native_posix_64.keymap +++ b/app/tests/tap-dance/2b-hold2/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2c-hold3/native_posix_64.keymap b/app/tests/tap-dance/2c-hold3/native_posix_64.keymap index 8375c6f6..942ecfc0 100644 --- a/app/tests/tap-dance/2c-hold3/native_posix_64.keymap +++ b/app/tests/tap-dance/2c-hold3/native_posix_64.keymap @@ -6,10 +6,10 @@ &kscan { events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/wpm/1-single_keypress/native_posix_64.keymap b/app/tests/wpm/1-single_keypress/native_posix_64.keymap index ec12a286..2aa52c16 100644 --- a/app/tests/wpm/1-single_keypress/native_posix_64.keymap +++ b/app/tests/wpm/1-single_keypress/native_posix_64.keymap @@ -2,9 +2,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Wait for the worker to trigger and reset after 5 seconds, followed by a 0 at 6 seconds */ - ZMK_MOCK_PRESS(0,0,6000) + ZMK_MOCK_PRESS(0,0,6000) >; }; \ No newline at end of file diff --git a/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap b/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap index f4ba2dfe..3cfab946 100644 --- a/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap +++ b/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap @@ -2,14 +2,14 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) //1st WPM worker call - 12wpm - 1 key press in 1 second - ZMK_MOCK_PRESS(0,0,1000) + ZMK_MOCK_PRESS(0,0,1000) ZMK_MOCK_RELEASE(0,0,10) // 2nd WPM worker call - 12wpm - 2 key press in 2 second // note there is no event for this as WPM hasn't changed // 3rd WPM worker call - 8wpm - 2 key press in 3 seconds - ZMK_MOCK_PRESS(0,0,2000) + ZMK_MOCK_PRESS(0,0,2000) >; }; \ No newline at end of file diff --git a/docs/package-lock.json b/docs/package-lock.json index fbc859e5..c7333cb3 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -39,7 +39,7 @@ "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", - "prettier": "2.3.1", + "prettier": "^2.7.1", "string-replace-loader": "^3.1.0", "typescript": "^4.6.3", "webpack": "^5.72.1" @@ -12201,15 +12201,18 @@ } }, "node_modules/prettier": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", - "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/pretty-error": { @@ -24675,9 +24678,9 @@ "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" }, "prettier": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", - "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true }, "pretty-error": { diff --git a/docs/package.json b/docs/package.json index 7c933b03..95d47b9f 100644 --- a/docs/package.json +++ b/docs/package.json @@ -58,7 +58,7 @@ "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", - "prettier": "2.3.1", + "prettier": "^2.7.1", "string-replace-loader": "^3.1.0", "typescript": "^4.6.3", "webpack": "^5.72.1" diff --git a/docs/src/templates/setup.ps1.mustache b/docs/src/templates/setup.ps1.mustache index f90c7488..90f9cdcf 100644 --- a/docs/src/templates/setup.ps1.mustache +++ b/docs/src/templates/setup.ps1.mustache @@ -74,7 +74,7 @@ if (Test-CommandExists Get-Acl) { $permission = (Get-Acl $pwd).Access | ?{$_.IdentityReference -match $env:UserName ` -and $_.FileSystemRights -match "FullControl" ` - -or $_.FileSystemRights -match "Write" } | + -or $_.FileSystemRights -match "Write" } | Select IdentityReference,FileSystemRights If (-Not $permission){ @@ -141,7 +141,7 @@ if ($keyboard_type -eq "shield") { Write-Host "Wired split is not yet supported by ZMK." exit 1 } - + $shields = $keyboard_siblings $board = $($($boards.keys)[$choice]) $boards = ( $board ) diff --git a/docs/src/templates/setup.sh.mustache b/docs/src/templates/setup.sh.mustache index 4c3868ec..c711dbc5 100644 --- a/docs/src/templates/setup.sh.mustache +++ b/docs/src/templates/setup.sh.mustache @@ -97,7 +97,7 @@ select opt in "${options[@]}" "Quit"; do keyboard_arch=${keyboards_arch[$keyboard_index]} keyboard_basedir=${keyboards_basedir[$keyboard_index]} keyboard_title=${options[$keyboard_index]} - keyboard_sibling_var=${keyboard}_siblings[@] + keyboard_sibling_var=${keyboard}_siblings[@] keyboard_sibling_first=${keyboard}_siblings[0] if [ -n "${!keyboard_sibling_first}" ]; then keyboard_siblings=${!keyboard_sibling_var} diff --git a/schema/hardware-metadata.schema.json b/schema/hardware-metadata.schema.json index 8ca382c5..4c2bdf3b 100644 --- a/schema/hardware-metadata.schema.json +++ b/schema/hardware-metadata.schema.json @@ -31,10 +31,7 @@ }, { "type": "object", - "required": [ - "id", - "features" - ], + "required": ["id", "features"], "properties": { "id": { "$ref": "#/$defs/id" @@ -89,9 +86,7 @@ "title": "InterconnectNodeLabels", "type": "object", "additionalProperties": false, - "required": [ - "gpio" - ], + "required": ["gpio"], "properties": { "gpio": { "type": "string" }, "i2c": { "type": "string" }, @@ -104,14 +99,7 @@ "title": "Interconnect", "type": "object", "additionalProperties": false, - "required": [ - "file_format", - "id", - "name", - "description", - "url", - "type" - ], + "required": ["file_format", "id", "name", "description", "url", "type"], "properties": { "file_format": { "type": "string", @@ -200,10 +188,7 @@ "type": "array", "items": { "type": "string", - "enum": [ - "usb", - "ble" - ] + "enum": ["usb", "ble"] } }, "features": { @@ -224,14 +209,7 @@ "title": "Shield", "type": "object", "additionalProperties": false, - "required": [ - "file_format", - "id", - "name", - "url", - "type", - "requires" - ], + "required": ["file_format", "id", "name", "url", "type", "requires"], "properties": { "file_format": { "type": "string", From 94061bb91629a83cfe251e63799a9be04a1564d4 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 22 Apr 2023 23:25:56 -0500 Subject: [PATCH 209/289] refactor: Replace tabs with spaces Standardized indentation to use spaces with a new pre-commit hook. --- .pre-commit-config.yaml | 5 + app/Kconfig | 380 +++++++++--------- app/boards/arm/bdn9/Kconfig.board | 4 +- app/boards/arm/bdn9/Kconfig.defconfig | 10 +- app/boards/arm/bdn9/bdn9_rev2.dts | 198 ++++----- app/boards/arm/bdn9/bdn9_rev2.keymap | 30 +- app/boards/arm/bluemicro840/Kconfig | 8 +- app/boards/arm/bluemicro840/Kconfig.board | 4 +- app/boards/arm/bluemicro840/Kconfig.defconfig | 10 +- .../bluemicro840/arduino_pro_micro_pins.dtsi | 86 ++-- .../bluemicro840/bluemicro840_v1-pinctrl.dtsi | 58 +-- .../arm/bluemicro840/bluemicro840_v1.dts | 158 ++++---- app/boards/arm/bt60/Kconfig | 8 +- app/boards/arm/bt60/Kconfig.board | 8 +- app/boards/arm/bt60/Kconfig.defconfig | 14 +- app/boards/arm/bt60/bt60.dtsi | 170 ++++---- app/boards/arm/bt60/bt60_v1.dts | 186 ++++----- app/boards/arm/bt60/bt60_v1.keymap | 328 +++++++-------- app/boards/arm/bt60/bt60_v1_hs.dts | 88 ++-- app/boards/arm/bt60/bt60_v1_hs.keymap | 60 +-- app/boards/arm/corneish_zen/Kconfig.board | 8 +- app/boards/arm/corneish_zen/Kconfig.defconfig | 46 +-- app/boards/arm/corneish_zen/corneish_zen.dtsi | 166 ++++---- .../arm/corneish_zen/corneish_zen.keymap | 4 +- .../arm/corneish_zen/corneish_zen_v2_left.dts | 144 +++---- .../corneish_zen/corneish_zen_v2_right.dts | 150 +++---- app/boards/arm/dz60rgb/Kconfig.board | 4 +- app/boards/arm/dz60rgb/Kconfig.defconfig | 4 +- app/boards/arm/dz60rgb/dz60rgb_rev1.dts | 126 +++--- app/boards/arm/dz60rgb/dz60rgb_rev1.keymap | 24 +- app/boards/arm/ferris/Kconfig.board | 4 +- app/boards/arm/ferris/Kconfig.defconfig | 8 +- app/boards/arm/ferris/ferris_rev02.dts | 226 +++++------ app/boards/arm/mikoto/Kconfig | 10 +- app/boards/arm/mikoto/Kconfig.board | 4 +- app/boards/arm/mikoto/Kconfig.defconfig | 14 +- .../arm/mikoto/arduino_pro_micro_pins.dtsi | 86 ++-- app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi | 58 +-- app/boards/arm/mikoto/mikoto_520.dts | 160 ++++---- app/boards/arm/nice60/Kconfig | 8 +- app/boards/arm/nice60/Kconfig.board | 4 +- app/boards/arm/nice60/Kconfig.defconfig | 10 +- app/boards/arm/nice60/nice60-pinctrl.dtsi | 10 +- app/boards/arm/nice60/nice60.dts | 248 ++++++------ app/boards/arm/nice60/nice60.keymap | 42 +- app/boards/arm/nice_nano/Kconfig | 8 +- app/boards/arm/nice_nano/Kconfig.board | 8 +- app/boards/arm/nice_nano/Kconfig.defconfig | 10 +- .../arm/nice_nano/arduino_pro_micro_pins.dtsi | 86 ++-- .../arm/nice_nano/nice_nano-pinctrl.dtsi | 58 +-- app/boards/arm/nice_nano/nice_nano.dts | 30 +- app/boards/arm/nice_nano/nice_nano.dtsi | 132 +++--- app/boards/arm/nice_nano/nice_nano_v2.dts | 26 +- app/boards/arm/nrf52840_m2/Kconfig | 8 +- app/boards/arm/nrf52840_m2/Kconfig.board | 4 +- app/boards/arm/nrf52840_m2/Kconfig.defconfig | 10 +- app/boards/arm/nrf52840_m2/nrf52840_m2.dts | 148 +++---- app/boards/arm/nrfmicro/Kconfig | 14 +- app/boards/arm/nrfmicro/Kconfig.board | 16 +- app/boards/arm/nrfmicro/Kconfig.defconfig | 16 +- .../arm/nrfmicro/arduino_pro_micro_pins.dtsi | 86 ++-- .../arduino_pro_micro_pins_52833.dtsi | 86 ++-- .../arduino_pro_micro_pins_flipped.dtsi | 86 ++-- .../nrfmicro/nrfmicro-flipped-pinctrl.dtsi | 58 +-- app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi | 58 +-- app/boards/arm/nrfmicro/nrfmicro_11.dts | 138 +++---- .../arm/nrfmicro/nrfmicro_11_flipped.dts | 138 +++---- app/boards/arm/nrfmicro/nrfmicro_13.dts | 156 +++---- app/boards/arm/nrfmicro/nrfmicro_13_52833.dts | 156 +++---- app/boards/arm/pillbug/pillbug-pinctrl.dtsi | 88 ++-- app/boards/arm/planck/Kconfig.board | 4 +- app/boards/arm/planck/Kconfig.defconfig | 4 +- app/boards/arm/planck/planck_rev6.dts | 192 ++++----- app/boards/arm/planck/planck_rev6.keymap | 64 +-- app/boards/arm/preonic/Kconfig.board | 4 +- app/boards/arm/proton_c/Kconfig.board | 4 +- app/boards/arm/proton_c/Kconfig.defconfig | 4 +- .../arm/proton_c/arduino_pro_micro_pins.dtsi | 86 ++-- app/boards/arm/proton_c/proton_c.dts | 112 +++--- app/boards/arm/puchi_ble/Kconfig.board | 4 +- app/boards/arm/puchi_ble/Kconfig.defconfig | 12 +- .../arm/puchi_ble/arduino_pro_micro_pins.dtsi | 86 ++-- .../arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi | 58 +-- app/boards/arm/puchi_ble/puchi_ble_v1.dts | 156 +++---- app/boards/arm/s40nc/Kconfig.board | 4 +- app/boards/arm/s40nc/Kconfig.defconfig | 12 +- app/boards/arm/s40nc/s40nc.dts | 198 ++++----- app/boards/arm/s40nc/s40nc.keymap | 34 +- app/boards/native_posix.overlay | 20 +- app/boards/native_posix_64.overlay | 20 +- app/boards/seeeduino_xiao.overlay | 14 +- app/boards/seeeduino_xiao_ble.overlay | 34 +- app/boards/shields/Kconfig.defconfig | 4 +- app/boards/shields/Kconfig.shield | 2 +- app/boards/shields/a_dux/Kconfig.defconfig | 6 +- app/boards/shields/a_dux/Kconfig.shield | 4 +- app/boards/shields/a_dux/a_dux.dtsi | 76 ++-- app/boards/shields/a_dux/a_dux.keymap | 24 +- app/boards/shields/a_dux/a_dux_right.overlay | 2 +- app/boards/shields/bfo9000/Kconfig.defconfig | 6 +- app/boards/shields/bfo9000/Kconfig.shield | 4 +- app/boards/shields/bfo9000/bfo9000.dtsi | 60 +-- app/boards/shields/bfo9000/bfo9000.keymap | 70 ++-- .../shields/bfo9000/bfo9000_left.overlay | 22 +- .../shields/bfo9000/bfo9000_right.overlay | 24 +- .../shields/boardsource3x4/Kconfig.shield | 2 +- .../shields/chalice/boards/nice_nano.overlay | 62 +-- .../chalice/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/clog/Kconfig.defconfig | 6 +- app/boards/shields/clog/Kconfig.shield | 4 +- app/boards/shields/clog/clog.dtsi | 64 +-- app/boards/shields/clog/clog_right.overlay | 2 +- .../clueboard_california/Kconfig.defconfig | 4 +- .../clueboard_california/Kconfig.shield | 2 +- .../clueboard_california.keymap | 26 +- .../clueboard_california.overlay | 40 +- app/boards/shields/contra/Kconfig.shield | 2 +- app/boards/shields/corne/Kconfig.defconfig | 20 +- app/boards/shields/corne/Kconfig.shield | 4 +- .../shields/corne/boards/nice_nano.overlay | 62 +-- .../shields/corne/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/corne/corne.dtsi | 94 ++--- app/boards/shields/corne/corne.keymap | 4 +- app/boards/shields/corne/corne_left.overlay | 16 +- app/boards/shields/corne/corne_right.overlay | 20 +- app/boards/shields/cradio/Kconfig.defconfig | 6 +- app/boards/shields/cradio/Kconfig.shield | 4 +- app/boards/shields/cradio/README.md | 38 +- app/boards/shields/cradio/cradio.dtsi | 76 ++-- .../shields/cradio/cradio_right.overlay | 2 +- app/boards/shields/crbn/Kconfig.defconfig | 2 +- app/boards/shields/crbn/Kconfig.shield | 2 +- app/boards/shields/crbn/crbn.keymap | 86 ++-- app/boards/shields/crbn/crbn.overlay | 80 ++-- .../shields/elephant42/Kconfig.defconfig | 16 +- .../elephant42/boards/nice_nano.overlay | 62 +-- .../elephant42/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/elephant42/elephant42.dtsi | 32 +- app/boards/shields/ergodash/Kconfig.defconfig | 6 +- app/boards/shields/ergodash/Kconfig.shield | 4 +- app/boards/shields/ergodash/ergodash.dtsi | 62 +-- .../shields/ergodash/ergodash_right.overlay | 2 +- .../shields/eternal_keypad/Kconfig.defconfig | 2 +- .../shields/eternal_keypad/Kconfig.shield | 4 +- .../eternal_keypad/boards/nice_nano.overlay | 62 +-- .../boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/fourier/Kconfig.defconfig | 6 +- app/boards/shields/fourier/Kconfig.shield | 4 +- app/boards/shields/fourier/fourier.dtsi | 52 +-- .../shields/helix/boards/nice_nano.overlay | 62 +-- .../shields/helix/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/helix/helix_right.overlay | 2 +- .../shields/hummingbird/hummingbird.overlay | 4 +- app/boards/shields/iris/Kconfig.defconfig | 6 +- app/boards/shields/iris/Kconfig.shield | 4 +- app/boards/shields/iris/iris.dtsi | 48 +-- app/boards/shields/iris/iris.keymap | 38 +- app/boards/shields/iris/iris_left.overlay | 16 +- app/boards/shields/iris/iris_right.overlay | 18 +- app/boards/shields/jian/Kconfig.defconfig | 6 +- app/boards/shields/jian/Kconfig.shield | 4 +- app/boards/shields/jian/jian.dtsi | 76 ++-- app/boards/shields/jian/jian_left.overlay | 16 +- app/boards/shields/jian/jian_right.overlay | 22 +- app/boards/shields/jiran/Kconfig.defconfig | 6 +- app/boards/shields/jiran/Kconfig.shield | 4 +- app/boards/shields/jiran/jiran.dtsi | 74 ++-- app/boards/shields/jiran/jiran_left.overlay | 16 +- app/boards/shields/jiran/jiran_right.overlay | 22 +- app/boards/shields/jorne/Kconfig.defconfig | 20 +- app/boards/shields/jorne/Kconfig.shield | 4 +- .../shields/jorne/boards/nice_nano.overlay | 62 +-- .../shields/jorne/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/jorne/jorne.dtsi | 108 ++--- app/boards/shields/jorne/jorne_left.overlay | 16 +- app/boards/shields/jorne/jorne_right.overlay | 22 +- app/boards/shields/kyria/Kconfig.defconfig | 20 +- app/boards/shields/kyria/Kconfig.shield | 24 +- .../shields/kyria/boards/nice_nano.overlay | 62 +-- .../shields/kyria/boards/nice_nano_v2.overlay | 62 +-- .../shields/kyria/boards/nrfmicro_11.overlay | 62 +-- .../kyria/boards/nrfmicro_11_flipped.overlay | 62 +-- .../shields/kyria/boards/nrfmicro_13.overlay | 62 +-- app/boards/shields/kyria/kyria.dtsi | 54 +-- app/boards/shields/kyria/kyria.keymap | 24 +- app/boards/shields/kyria/kyria_common.dtsi | 80 ++-- app/boards/shields/kyria/kyria_left.overlay | 22 +- app/boards/shields/kyria/kyria_rev2.dtsi | 42 +- app/boards/shields/kyria/kyria_rev2.keymap | 24 +- .../shields/kyria/kyria_rev2_left.overlay | 34 +- .../shields/kyria/kyria_rev2_right.overlay | 38 +- app/boards/shields/kyria/kyria_rev3.dtsi | 48 +-- app/boards/shields/kyria/kyria_rev3.keymap | 40 +- .../shields/kyria/kyria_rev3_left.overlay | 32 +- .../shields/kyria/kyria_rev3_right.overlay | 34 +- app/boards/shields/kyria/kyria_right.overlay | 26 +- app/boards/shields/leeloo/Kconfig.defconfig | 20 +- app/boards/shields/leeloo/Kconfig.shield | 4 +- app/boards/shields/leeloo/leeloo.dtsi | 32 +- app/boards/shields/leeloo/leeloo_left.overlay | 18 +- .../shields/leeloo/leeloo_right.overlay | 20 +- app/boards/shields/lily58/Kconfig.defconfig | 20 +- app/boards/shields/lily58/Kconfig.shield | 4 +- .../shields/lily58/boards/nice_nano.overlay | 62 +-- .../lily58/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/lily58/lily58.dtsi | 102 ++--- app/boards/shields/lily58/lily58.keymap | 36 +- app/boards/shields/lily58/lily58_left.overlay | 18 +- .../shields/lily58/lily58_right.overlay | 18 +- app/boards/shields/lotus58/Kconfig.defconfig | 20 +- app/boards/shields/lotus58/Kconfig.shield | 4 +- .../shields/lotus58/lotus58_left.overlay | 18 +- .../shields/lotus58/lotus58_right.overlay | 20 +- app/boards/shields/m60/Kconfig.defconfig | 2 +- app/boards/shields/m60/Kconfig.shield | 2 +- app/boards/shields/m60/m60.keymap | 32 +- app/boards/shields/m60/m60.overlay | 68 ++-- app/boards/shields/microdox/Kconfig.defconfig | 20 +- app/boards/shields/microdox/Kconfig.shield | 4 +- .../shields/microdox/boards/nice_nano.overlay | 62 +-- .../microdox/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/microdox/microdox.dtsi | 76 ++-- .../shields/microdox/microdox_left.overlay | 14 +- .../shields/microdox/microdox_right.overlay | 20 +- app/boards/shields/murphpad/Kconfig.defconfig | 16 +- app/boards/shields/murphpad/Kconfig.shield | 2 +- .../shields/murphpad/boards/nice_nano.overlay | 62 +-- .../murphpad/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/murphpad/murphpad.overlay | 110 ++--- app/boards/shields/nibble/Kconfig.defconfig | 18 +- app/boards/shields/nibble/Kconfig.shield | 2 +- .../shields/nibble/boards/nice_nano.overlay | 62 +-- .../nibble/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/nibble/nibble.keymap | 38 +- app/boards/shields/nibble/nibble.overlay | 106 ++--- .../shields/nice_view/Kconfig.defconfig | 12 +- app/boards/shields/nice_view/Kconfig.shield | 2 +- .../shields/nice_view/nice_view.overlay | 24 +- .../shields/nice_view_adapter/Kconfig.shield | 2 +- .../boards/bluemicro840_v1.overlay | 42 +- .../boards/mikoto_520.overlay | 42 +- .../boards/nice_nano.overlay | 42 +- .../boards/nice_nano_v2.overlay | 42 +- .../boards/nrfmicro_11.overlay | 42 +- .../boards/nrfmicro_11_flipped.overlay | 42 +- .../boards/nrfmicro_13.overlay | 42 +- .../boards/puchi_ble_v1.overlay | 42 +- app/boards/shields/pancake/Kconfig.shield | 2 +- .../shields/quefrency/Kconfig.defconfig | 6 +- app/boards/shields/quefrency/Kconfig.shield | 4 +- app/boards/shields/quefrency/quefrency.dtsi | 30 +- app/boards/shields/redox/Kconfig.defconfig | 6 +- app/boards/shields/redox/Kconfig.shield | 4 +- .../shields/redox/boards/nice_nano.overlay | 62 +-- .../shields/redox/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/redox/redox.dtsi | 46 +-- app/boards/shields/redox/redox_left.overlay | 18 +- app/boards/shields/redox/redox_right.overlay | 20 +- .../reviung41/boards/nice_nano.overlay | 62 +-- .../reviung41/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/romac/Kconfig.defconfig | 2 +- app/boards/shields/romac/Kconfig.shield | 2 +- app/boards/shields/romac/romac.overlay | 38 +- .../shields/romac_plus/Kconfig.defconfig | 2 +- app/boards/shields/romac_plus/Kconfig.shield | 2 +- .../romac_plus/boards/nice_nano.overlay | 62 +-- .../romac_plus/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/romac_plus/romac_plus.dtsi | 70 ++-- .../shields/romac_plus/romac_plus.overlay | 26 +- .../shields/settings_reset/Kconfig.defconfig | 2 +- .../shields/settings_reset/Kconfig.shield | 2 +- .../settings_reset/settings_reset.overlay | 20 +- app/boards/shields/snap/Kconfig.defconfig | 20 +- app/boards/shields/snap/Kconfig.shield | 4 +- .../shields/snap/boards/nice_nano.overlay | 62 +-- .../shields/snap/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/snap/snap.dtsi | 106 ++--- app/boards/shields/snap/snap.keymap | 38 +- app/boards/shields/snap/snap_left.overlay | 36 +- app/boards/shields/snap/snap_right.overlay | 56 +-- app/boards/shields/sofle/Kconfig.defconfig | 20 +- app/boards/shields/sofle/Kconfig.shield | 4 +- app/boards/shields/sofle/sofle_left.overlay | 18 +- app/boards/shields/sofle/sofle_right.overlay | 20 +- .../splitkb_aurora_corne/Kconfig.defconfig | 24 +- .../splitkb_aurora_corne/Kconfig.shield | 4 +- .../boards/nice_nano.overlay | 62 +-- .../boards/nice_nano_v2.overlay | 62 +-- .../splitkb_aurora_corne.dtsi | 108 ++--- .../splitkb_aurora_corne.keymap | 4 +- .../splitkb_aurora_corne_left.overlay | 46 +-- .../splitkb_aurora_corne_right.overlay | 50 +-- .../splitkb_aurora_lily58/Kconfig.defconfig | 24 +- .../splitkb_aurora_lily58/Kconfig.shield | 4 +- .../boards/nice_nano.overlay | 62 +-- .../boards/nice_nano_v2.overlay | 62 +-- .../splitkb_aurora_lily58.dtsi | 94 ++--- .../splitkb_aurora_lily58.keymap | 36 +- .../splitkb_aurora_lily58_left.overlay | 48 +-- .../splitkb_aurora_lily58_right.overlay | 50 +-- .../splitkb_aurora_sweep/Kconfig.defconfig | 24 +- .../splitkb_aurora_sweep/Kconfig.shield | 4 +- .../boards/nice_nano.overlay | 62 +-- .../boards/nice_nano_v2.overlay | 62 +-- .../splitkb_aurora_sweep.dtsi | 118 +++--- .../splitkb_aurora_sweep.keymap | 66 +-- .../splitkb_aurora_sweep_left.overlay | 54 +-- .../splitkb_aurora_sweep_right.overlay | 56 +-- .../shields/splitreus62/Kconfig.defconfig | 6 +- app/boards/shields/splitreus62/Kconfig.shield | 4 +- .../shields/splitreus62/splitreus62.dtsi | 56 +-- .../shields/splitreus62/splitreus62.keymap | 14 +- .../splitreus62/splitreus62_left.overlay | 16 +- .../splitreus62/splitreus62_right.overlay | 18 +- app/boards/shields/tg4x/Kconfig.shield | 2 +- .../shields/tg4x/boards/nice_nano.overlay | 62 +-- .../shields/tg4x/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/tg4x/tg4x.keymap | 50 +-- app/boards/shields/tg4x/tg4x.overlay | 70 ++-- app/boards/shields/tidbit/Kconfig.defconfig | 16 +- app/boards/shields/tidbit/Kconfig.shield | 2 +- .../shields/tidbit/boards/nice_nano.overlay | 62 +-- .../tidbit/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/tidbit/tidbit.dtsi | 182 ++++----- app/boards/shields/tidbit/tidbit.keymap | 56 +-- app/boards/shields/tidbit/tidbit_19key.keymap | 56 +-- .../shields/two_percent_milk/Kconfig.shield | 2 +- .../two_percent_milk/boards/nice_nano.overlay | 62 +-- .../boards/nice_nano_v2.overlay | 62 +-- .../boards/nrfmicro_11.overlay | 62 +-- .../boards/nrfmicro_11_flipped.overlay | 62 +-- .../boards/nrfmicro_13.overlay | 62 +-- .../two_percent_milk/two_percent_milk.overlay | 22 +- .../shields/waterfowl/Kconfig.defconfig | 20 +- app/boards/shields/waterfowl/Kconfig.shield | 4 +- app/boards/shields/waterfowl/waterfowl.dtsi | 126 +++--- app/boards/shields/waterfowl/waterfowl.keymap | 78 ++-- .../shields/waterfowl/waterfowl_left.overlay | 16 +- .../shields/waterfowl/waterfowl_right.overlay | 18 +- app/boards/shields/zmk_uno/Kconfig.shield | 2 +- app/boards/shields/zmk_uno/zmk_uno.overlay | 256 ++++++------ app/boards/shields/zodiark/Kconfig.defconfig | 20 +- app/boards/shields/zodiark/Kconfig.shield | 4 +- .../shields/zodiark/zodiark_left.overlay | 20 +- .../shields/zodiark/zodiark_right.overlay | 22 +- app/boards/usb_console.dtsi | 14 +- app/cmake/ZephyrBuildConfig.cmake | 250 ++++++------ app/drivers/display/CMakeLists.txt | 2 +- app/drivers/display/Kconfig.il0323 | 10 +- app/drivers/gpio/Kconfig.595 | 22 +- app/drivers/gpio/Kconfig.max7318 | 22 +- app/drivers/kscan/Kconfig | 102 ++--- app/drivers/sensor/battery/Kconfig | 30 +- app/drivers/sensor/ec11/Kconfig | 52 +-- app/dts/behaviors/backlight.dtsi | 14 +- app/dts/behaviors/bluetooth.dtsi | 14 +- app/dts/behaviors/caps_word.dtsi | 16 +- app/dts/behaviors/ext_power.dtsi | 14 +- app/dts/behaviors/gresc.dtsi | 16 +- app/dts/behaviors/key_press.dtsi | 16 +- app/dts/behaviors/key_repeat.dtsi | 16 +- app/dts/behaviors/key_toggle.dtsi | 14 +- app/dts/behaviors/layer_tap.dtsi | 20 +- app/dts/behaviors/macros.dtsi | 76 ++-- app/dts/behaviors/mod_tap.dtsi | 20 +- app/dts/behaviors/momentary_layer.dtsi | 14 +- app/dts/behaviors/none.dtsi | 14 +- app/dts/behaviors/reset.dtsi | 26 +- app/dts/behaviors/rgb_underglow.dtsi | 14 +- .../behaviors/sensor_rotate_key_press.dtsi | 18 +- app/dts/behaviors/sticky_key.dtsi | 36 +- app/dts/behaviors/to_layer.dtsi | 14 +- app/dts/behaviors/toggle_layer.dtsi | 14 +- app/dts/behaviors/transparent.dtsi | 14 +- app/dts/common/arduino_uno_pro_micro_map.dtsi | 68 ++-- app/include/linker/zmk-events.ld | 12 +- app/run-test.sh | 32 +- app/src/split/Kconfig | 14 +- app/src/split/bluetooth/Kconfig | 50 +-- .../backlight/basic/native_posix_64.keymap | 52 +-- app/tests/backlight/behavior_keymap.dtsi | 48 +-- .../config-brt/native_posix_64.keymap | 16 +- .../config-on/native_posix_64.keymap | 16 +- .../config-step/native_posix_64.keymap | 64 +-- .../backlight/cycle/native_posix_64.keymap | 130 +++--- .../low-brightness/native_posix_64.keymap | 70 ++-- app/tests/caps-word/behavior_keymap.dtsi | 20 +- .../native_posix_64.keymap | 44 +- .../native_posix_64.keymap | 22 +- .../native_posix_64.keymap | 22 +- .../native_posix_64.keymap | 20 +- .../native_posix.keymap | 20 +- .../native_posix_64.keymap | 20 +- .../native_posix_64.keymap | 54 +-- .../native_posix_64.keymap | 54 +-- .../native_posix_64.keymap | 56 +-- .../native_posix_64.keymap | 52 +-- .../native_posix_64.keymap | 54 +-- .../layer-filter-0/native_posix_64.keymap | 122 +++--- .../layer-filter-1/native_posix_64.keymap | 52 +-- .../multiple-timeouts/native_posix_64.keymap | 58 +-- .../native_posix_64.keymap | 172 ++++---- .../native_posix_64.keymap | 88 ++-- .../native_posix_64.keymap | 66 +-- .../native_posix_64.keymap | 66 +-- .../native_posix_64.keymap | 128 +++--- .../native_posix_64.keymap | 56 +-- .../native_posix_64.keymap | 48 +-- .../native_posix_64.keymap | 52 +-- .../press-release/native_posix_64.keymap | 74 ++-- .../press-timeout/native_posix_64.keymap | 48 +-- .../native_posix_64.keymap | 66 +-- .../native_posix_64.keymap | 66 +-- .../native_posix_64.keymap | 66 +-- .../native_posix_64.keymap | 54 +-- .../native_posix_64.keymap | 54 +-- .../native_posix_64.keymap | 70 ++-- .../native_posix_64.keymap | 48 +-- .../balanced/1-dn-up/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../5-quick-tap/native_posix_64.keymap | 12 +- .../6-retro-tap/native_posix_64.keymap | 66 +-- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../7-positional/behavior_keymap.dtsi | 40 +- .../native_posix_64.keymap | 16 +- .../on-release-trigger/native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 18 +- .../1-basic/native_posix_64.keymap | 36 +- .../2-double-hold/native_posix_64.keymap | 24 +- .../8-global-quick-tap/behavior_keymap.dtsi | 42 +- .../hold-tap/balanced/behavior_keymap.dtsi | 40 +- .../many-nested/native_posix_64.keymap | 60 +-- .../1-dn-up/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../5-quick-tap/native_posix_64.keymap | 12 +- .../6-retro-tap/native_posix_64.keymap | 66 +-- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../7-positional/behavior_keymap.dtsi | 40 +- .../native_posix_64.keymap | 16 +- .../on-release-trigger/native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 18 +- .../1-basic/native_posix_64.keymap | 36 +- .../2-double-hold/native_posix_64.keymap | 24 +- .../8-global-quick-tap/behavior_keymap.dtsi | 42 +- .../hold-preferred/behavior_keymap.dtsi | 40 +- .../1-dn-up/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../5-quick-tap/native_posix_64.keymap | 12 +- .../6-nested-timeouts/native_posix_64.keymap | 70 ++-- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../7-positional/behavior_keymap.dtsi | 40 +- .../native_posix_64.keymap | 16 +- .../on-release-trigger/native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 18 +- .../1-basic/native_posix_64.keymap | 36 +- .../2-double-hold/native_posix_64.keymap | 24 +- .../8-global-quick-tap/behavior_keymap.dtsi | 42 +- .../tap-preferred/behavior_keymap.dtsi | 40 +- .../1-dn-up/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../5-quick-tap/native_posix_64.keymap | 12 +- .../1-basic/native_posix_64.keymap | 36 +- .../2-double-hold/native_posix_64.keymap | 24 +- .../6-global-quick-tap/behavior_keymap.dtsi | 42 +- .../behavior_keymap.dtsi | 40 +- app/tests/key-repeat/behavior_keymap.dtsi | 20 +- .../native_posix_64.keymap | 16 +- .../native_posix.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 8 +- app/tests/keypress/behavior_keymap.dtsi | 20 +- .../kp-press-release/native_posix_64.keymap | 8 +- app/tests/keytoggle/behavior_keymap.dtsi | 20 +- .../kt-alt-tab/native_posix_64.keymap | 60 +-- .../kt-modded-alpha/native_posix_64.keymap | 44 +- .../native_posix_64.keymap | 12 +- .../kt-press-release/native_posix_64.keymap | 12 +- app/tests/macros/basic/native_posix_64.keymap | 2 +- app/tests/macros/behavior_keymap.dtsi | 96 ++--- .../native_posix_64.keymap | 56 +-- .../native_posix_64.keymap | 52 +-- .../press-mid-macro/native_posix_64.keymap | 2 +- .../press-release/native_posix_64.keymap | 2 +- .../timing-override/native_posix_64.keymap | 2 +- .../wait-macro-release/native_posix_64.keymap | 2 +- .../1-no-morph/native_posix_64.keymap | 8 +- .../2a-masked-morph/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 42 +- .../native_posix_64.keymap | 46 +-- .../3-unmasked-morph/native_posix_64.keymap | 32 +- app/tests/mod-morph/behavior_keymap.dtsi | 20 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../kp-lctl-dn-lctl-up/native_posix_64.keymap | 28 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../1-normal/native_posix_64.keymap | 40 +- .../native_posix_64.keymap | 40 +- .../3-covered/native_posix_64.keymap | 36 +- .../4-nested/native_posix_64.keymap | 54 +-- .../native_posix_64.keymap | 54 +-- .../momentary-layer/behavior_keymap.dtsi | 28 +- app/tests/none/behavior_keymap.dtsi | 28 +- app/tests/none/layered/native_posix_64.keymap | 2 +- app/tests/none/normal/native_posix.keymap | 2 +- app/tests/none/normal/native_posix_64.keymap | 2 +- .../1-os-dn-up/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 54 +-- .../10-callum-mods/native_posix_64.keymap | 64 +-- .../10-sl-sl-kp/native_posix_64.keymap | 92 ++--- .../native_posix_64.keymap | 30 +- .../native_posix_64.keymap | 22 +- .../native_posix_64.keymap | 70 ++-- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 82 ++-- .../native_posix_64.keymap | 70 ++-- .../9-sk-dn-up-dn-up/native_posix_64.keymap | 34 +- app/tests/sticky-keys/behavior_keymap.dtsi | 28 +- .../tap-dance/1a-tap1/native_posix_64.keymap | 8 +- .../tap-dance/1b-tap2/native_posix_64.keymap | 10 +- .../tap-dance/1c-tap3/native_posix_64.keymap | 12 +- .../tap-dance/2a-hold1/native_posix_64.keymap | 8 +- .../tap-dance/2b-hold2/native_posix_64.keymap | 10 +- .../tap-dance/2c-hold3/native_posix_64.keymap | 12 +- .../3a-tap-int-mid/native_posix_64.keymap | 6 +- .../3b-tap-int-seq/native_posix_64.keymap | 6 +- .../3c-tap-int-after/native_posix_64.keymap | 6 +- .../3d-hold-int-mid/native_posix_64.keymap | 6 +- .../3e-hold-int-seq/native_posix_64.keymap | 6 +- .../3f-hold-int-after/native_posix_64.keymap | 6 +- .../4a-single/native_posix_64.keymap | 8 +- .../5a-tdint-mid/native_posix_64.keymap | 6 +- .../5b-tdint-seq/native_posix_64.keymap | 6 +- .../5c-tdint-after/native_posix_64.keymap | 6 +- .../5d-tdint-multiple/native_posix_64.keymap | 6 +- .../6-combo-tap2/native_posix_64.keymap | 20 +- app/tests/to-layer/behavior_keymap.dtsi | 28 +- .../to-layer/normal/native_posix_64.keymap | 30 +- app/tests/toggle-layer/behavior_keymap.dtsi | 38 +- .../early-key-release/native_posix_64.keymap | 4 +- .../normal/native_posix_64.keymap | 2 +- app/tests/transparent/behavior_keymap.dtsi | 28 +- .../layered/native_posix_64.keymap | 2 +- .../transparent/normal/native_posix_64.keymap | 2 +- .../1-single_keypress/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 22 +- app/tests/wpm/behavior_keymap.dtsi | 20 +- docs/blog/2020-10-03-bootloader-fix.md | 22 +- docs/docs/behaviors/hold-tap.md | 212 +++++----- docs/docs/behaviors/layers.md | 20 +- docs/docs/behaviors/tap-dance.md | 44 +- docs/docs/config/index.md | 22 +- docs/docs/development/new-behavior.md | 16 +- docs/docs/development/new-shield.md | 162 ++++---- docs/docs/features/backlight.md | 26 +- docs/docs/features/combos.md | 16 +- docs/docs/features/keymaps.md | 4 +- docs/docs/features/underglow.md | 28 +- docs/docs/keymap-example-file.md | 16 +- docs/docs/keymap-example.md | 16 +- 613 files changed, 11572 insertions(+), 11567 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7687fc6e..1375a6ae 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,10 @@ fail_fast: false repos: + - repo: https://github.com/Lucas-C/pre-commit-hooks + rev: v1.5.1 + hooks: + - id: remove-tabs + exclude: "vendor-prefixes\\.txt$" - repo: https://github.com/pocc/pre-commit-hooks rev: v1.3.5 hooks: diff --git a/app/Kconfig b/app/Kconfig index ccc5f42d..25a99b55 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -8,167 +8,167 @@ menu "ZMK" menu "Basic Keyboard Setup" config ZMK_KEYBOARD_NAME - string "Keyboard Name" + string "Keyboard Name" config USB_DEVICE_PRODUCT - default ZMK_KEYBOARD_NAME + default ZMK_KEYBOARD_NAME config BT_DEVICE_NAME - default ZMK_KEYBOARD_NAME + default ZMK_KEYBOARD_NAME config USB_DEVICE_VID - default 0x1D50 + default 0x1D50 config USB_DEVICE_PID - default 0x615E + default 0x615E config USB_DEVICE_MANUFACTURER - default "ZMK Project" + default "ZMK Project" config BT_DIS_PNP_VID - default 0x1D50 + default 0x1D50 config BT_DIS_PNP_PID - default 0x615E + default 0x615E config BT_DIS_MODEL - default ZMK_KEYBOARD_NAME + default ZMK_KEYBOARD_NAME config BT_DIS_MANUF - default "ZMK Project" + default "ZMK Project" menu "HID" choice ZMK_HID_REPORT_TYPE - prompt "HID Report Type" + prompt "HID Report Type" config ZMK_HID_REPORT_TYPE_HKRO - bool "#-Key Roll Over (HKRO) HID Report" - help - Enable # key roll over for HID report. This selection is "boot keyboard" compatible - but limits the total number of possible keys to report as held to #. + bool "#-Key Roll Over (HKRO) HID Report" + help + Enable # key roll over for HID report. This selection is "boot keyboard" compatible + but limits the total number of possible keys to report as held to #. config ZMK_HID_REPORT_TYPE_NKRO - bool "Full N-Key Roll Over (NKRO) HID Report" - help - Enable full N-Key Roll Over for HID output. This selection will prevent the keyboard - from working with some BIOS/UEFI versions that only support "boot keyboard" support. - This option also prevents using some infrequently used higher range HID usages. + bool "Full N-Key Roll Over (NKRO) HID Report" + help + Enable full N-Key Roll Over for HID output. This selection will prevent the keyboard + from working with some BIOS/UEFI versions that only support "boot keyboard" support. + This option also prevents using some infrequently used higher range HID usages. endchoice if ZMK_HID_REPORT_TYPE_HKRO config ZMK_HID_KEYBOARD_REPORT_SIZE - int "# Keyboard Keys Reportable" - default 6 + int "# Keyboard Keys Reportable" + default 6 endif config ZMK_HID_CONSUMER_REPORT_SIZE - int "# Consumer Keys Reportable" - default 6 + int "# Consumer Keys Reportable" + default 6 choice ZMK_HID_CONSUMER_REPORT_USAGES - prompt "HID Report Type" + prompt "HID Report Type" config ZMK_HID_CONSUMER_REPORT_USAGES_FULL - bool "Full Consumer HID Usage Support" - help - Enable full Consumer usage ID values to be sent to hosts. Allows for less - frequently used usages, but has compatibability issues with some host OSes. + bool "Full Consumer HID Usage Support" + help + Enable full Consumer usage ID values to be sent to hosts. Allows for less + frequently used usages, but has compatibability issues with some host OSes. config ZMK_HID_CONSUMER_REPORT_USAGES_BASIC - bool "Basic Consumer HID Usage Support" - help - Enable Consumer usage ID values up to "Playback Speed - Slow" to be sent to - hosts. Allows for broader compatibability with more host OSes. + bool "Basic Consumer HID Usage Support" + help + Enable Consumer usage ID values up to "Playback Speed - Slow" to be sent to + hosts. Allows for broader compatibability with more host OSes. endchoice menu "Output Types" config ZMK_USB - bool "USB" - select USB - select USB_DEVICE_STACK - select USB_DEVICE_HID + bool "USB" + select USB + select USB_DEVICE_STACK + select USB_DEVICE_HID if ZMK_USB config USB_NUMOF_EP_WRITE_RETRIES - default 10 + default 10 config USB_HID_POLL_INTERVAL_MS - default 1 + default 1 #ZMK_USB endif menuconfig ZMK_BLE - bool "BLE (HID over GATT)" - select BT - select BT_SMP - select BT_SMP_SC_PAIR_ONLY - select BT_SMP_APP_PAIRING_ACCEPT - select BT_PERIPHERAL - select BT_DIS - select BT_BAS - select BT_SETTINGS - select SETTINGS + bool "BLE (HID over GATT)" + select BT + select BT_SMP + select BT_SMP_SC_PAIR_ONLY + select BT_SMP_APP_PAIRING_ACCEPT + select BT_PERIPHERAL + select BT_DIS + select BT_BAS + select BT_SETTINGS + select SETTINGS if ZMK_BLE config SYSTEM_WORKQUEUE_STACK_SIZE - default 4096 if SOC_RP2040 - default 2048 + default 4096 if SOC_RP2040 + default 2048 config ZMK_BLE_THREAD_STACK_SIZE - int "BLE notify thread stack size" - default 512 + int "BLE notify thread stack size" + default 512 config ZMK_BLE_THREAD_PRIORITY - int "BLE notify thread priority" - default 5 + int "BLE notify thread priority" + default 5 config ZMK_BLE_KEYBOARD_REPORT_QUEUE_SIZE - int "Max number of keyboard HID reports to queue for sending over BLE" - default 20 + int "Max number of keyboard HID reports to queue for sending over BLE" + default 20 config ZMK_BLE_CONSUMER_REPORT_QUEUE_SIZE - int "Max number of consumer HID reports to queue for sending over BLE" - default 5 + int "Max number of consumer HID reports to queue for sending over BLE" + default 5 config ZMK_BLE_CLEAR_BONDS_ON_START - bool "Configuration that clears all bond information from the keyboard on startup." - default n + bool "Configuration that clears all bond information from the keyboard on startup." + default n # HID GATT notifications sent this way are *not* picked up by Linux, and possibly others. config BT_GATT_NOTIFY_MULTIPLE - default n + default n config BT_GATT_AUTO_SEC_REQ - default n + default n config BT_DEVICE_APPEARANCE - default 961 + default 961 config ZMK_BLE_PASSKEY_ENTRY - bool "Experimental: Requiring typing passkey from host to pair BLE connection" - default n + bool "Experimental: Requiring typing passkey from host to pair BLE connection" + default n config BT_PERIPHERAL_PREF_MIN_INT - default 6 + default 6 config BT_PERIPHERAL_PREF_MAX_INT - default 12 + default 12 config BT_PERIPHERAL_PREF_LATENCY - default 30 + default 30 config BT_PERIPHERAL_PREF_TIMEOUT - default 400 + default 400 #ZMK_BLE endif @@ -189,108 +189,108 @@ menu "Display/LED Options" rsource "src/display/Kconfig" menuconfig ZMK_RGB_UNDERGLOW - bool "RGB Adressable LED Underglow" - select LED_STRIP + bool "RGB Adressable LED Underglow" + select LED_STRIP if ZMK_RGB_UNDERGLOW # This default value cuts down on tons of excess .conf files, if you're using GPIO, manually disable this config SPI - default y + default y config ZMK_RGB_UNDERGLOW_EXT_POWER - bool "RGB underglow toggling also controls external power" - default y + bool "RGB underglow toggling also controls external power" + default y config ZMK_RGB_UNDERGLOW_BRT_MIN - int "RGB underglow minimum brightness in percent" - range 0 100 - default 0 + int "RGB underglow minimum brightness in percent" + range 0 100 + default 0 config ZMK_RGB_UNDERGLOW_BRT_MAX - int "RGB underglow maximum brightness in percent" - range ZMK_RGB_UNDERGLOW_BRT_MIN 100 - default 100 + int "RGB underglow maximum brightness in percent" + range ZMK_RGB_UNDERGLOW_BRT_MIN 100 + default 100 config ZMK_RGB_UNDERGLOW_HUE_STEP - int "RGB underglow hue step in degrees" - range 0 359 - default 10 + int "RGB underglow hue step in degrees" + range 0 359 + default 10 config ZMK_RGB_UNDERGLOW_SAT_STEP - int "RGB underglow saturation step in percent" - range 0 100 - default 10 + int "RGB underglow saturation step in percent" + range 0 100 + default 10 config ZMK_RGB_UNDERGLOW_BRT_STEP - int "RGB underglow brightness step in percent" - range 0 100 - default 10 + int "RGB underglow brightness step in percent" + range 0 100 + default 10 config ZMK_RGB_UNDERGLOW_HUE_START - int "RGB underglow start hue value in degrees" - range 0 359 - default 0 + int "RGB underglow start hue value in degrees" + range 0 359 + default 0 config ZMK_RGB_UNDERGLOW_SAT_START - int "RGB underglow start saturations value in percent" - range 0 100 - default 100 + int "RGB underglow start saturations value in percent" + range 0 100 + default 100 config ZMK_RGB_UNDERGLOW_BRT_START - int "RGB underglow start brightness value in percent" - range ZMK_RGB_UNDERGLOW_BRT_MIN ZMK_RGB_UNDERGLOW_BRT_MAX - default ZMK_RGB_UNDERGLOW_BRT_MAX + int "RGB underglow start brightness value in percent" + range ZMK_RGB_UNDERGLOW_BRT_MIN ZMK_RGB_UNDERGLOW_BRT_MAX + default ZMK_RGB_UNDERGLOW_BRT_MAX config ZMK_RGB_UNDERGLOW_SPD_START - int "RGB underglow start animation speed value" - range 1 5 - default 3 + int "RGB underglow start animation speed value" + range 1 5 + default 3 config ZMK_RGB_UNDERGLOW_EFF_START - int "RGB underglow start effect int value related to the effect enum list" - range 0 3 - default 0 + int "RGB underglow start effect int value related to the effect enum list" + range 0 3 + default 0 config ZMK_RGB_UNDERGLOW_ON_START - bool "RGB underglow starts on by default" - default y + bool "RGB underglow starts on by default" + default y config ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE - bool "Turn off RGB underglow when keyboard goes into idle state" + bool "Turn off RGB underglow when keyboard goes into idle state" config ZMK_RGB_UNDERGLOW_AUTO_OFF_USB - bool "Turn off RGB underglow when USB is disconnected" - depends on USB_DEVICE_STACK + bool "Turn off RGB underglow when USB is disconnected" + depends on USB_DEVICE_STACK #ZMK_RGB_UNDERGLOW endif menuconfig ZMK_BACKLIGHT - bool "LED backlight" - select LED + bool "LED backlight" + select LED if ZMK_BACKLIGHT config ZMK_BACKLIGHT_BRT_STEP - int "Brightness step in percent" - range 1 100 - default 20 + int "Brightness step in percent" + range 1 100 + default 20 config ZMK_BACKLIGHT_BRT_START - int "Default brightness in percent" - range 1 100 - default 40 + int "Default brightness in percent" + range 1 100 + default 40 config ZMK_BACKLIGHT_ON_START - bool "Default backlight state" - default y + bool "Default backlight state" + default y config ZMK_BACKLIGHT_AUTO_OFF_IDLE - bool "Turn off backlight when keyboard goes into idle state" + bool "Turn off backlight when keyboard goes into idle state" config ZMK_BACKLIGHT_AUTO_OFF_USB - bool "Turn off backlight when USB is disconnected" + bool "Turn off backlight when USB is disconnected" #ZMK_BACKLIGHT endif @@ -301,28 +301,28 @@ endmenu menu "Power Management" config ZMK_IDLE_TIMEOUT - int "Milliseconds of inactivity before entering idle state (OLED shutoff, etc)" - default 30000 + int "Milliseconds of inactivity before entering idle state (OLED shutoff, etc)" + default 30000 config ZMK_SLEEP - bool "Enable deep sleep support" - imply USB + bool "Enable deep sleep support" + imply USB if ZMK_SLEEP config PM_DEVICE - default y + default y config ZMK_IDLE_SLEEP_TIMEOUT - int "Milliseconds of inactivity before entering deep sleep" - default 900000 + int "Milliseconds of inactivity before entering deep sleep" + default 900000 #ZMK_SLEEP endif config ZMK_EXT_POWER - bool "Enable support to control external power output" - default y + bool "Enable support to control external power output" + default y #Power Management endmenu @@ -330,16 +330,16 @@ endmenu menu "Combo options" config ZMK_COMBO_MAX_PRESSED_COMBOS - int "Maximum number of currently pressed combos" - default 4 + int "Maximum number of currently pressed combos" + default 4 config ZMK_COMBO_MAX_COMBOS_PER_KEY - int "Maximum number of combos per key" - default 5 + int "Maximum number of combos per key" + default 5 config ZMK_COMBO_MAX_KEYS_PER_COMBO - int "Maximum number of keys per combo" - default 4 + int "Maximum number of keys per combo" + default 4 #Combo options endmenu @@ -347,18 +347,18 @@ endmenu menu "Behavior Options" config ZMK_BEHAVIORS_QUEUE_SIZE - int "Maximum number of behaviors to allow queueing from a macro or other complex behavior" - default 64 + int "Maximum number of behaviors to allow queueing from a macro or other complex behavior" + default 64 rsource "Kconfig.behaviors" config ZMK_MACRO_DEFAULT_WAIT_MS - int "Default time to wait (in milliseconds) before triggering the next behavior in macros" - default 15 + int "Default time to wait (in milliseconds) before triggering the next behavior in macros" + default 15 config ZMK_MACRO_DEFAULT_TAP_MS - int "Default time to wait (in milliseconds) between the press and release events of a tapped behavior in macros" - default 30 + int "Default time to wait (in milliseconds) between the press and release events of a tapped behavior in macros" + default 30 endmenu @@ -369,8 +369,8 @@ menu "Initialization Priorities" if USB_DEVICE_STACK config ZMK_USB_INIT_PRIORITY - int "USB Init Priority" - default 50 + int "USB Init Priority" + default 50 #USB endif @@ -378,8 +378,8 @@ endif if ZMK_BLE || ZMK_SPLIT_BLE config ZMK_BLE_INIT_PRIORITY - int "BLE Init Priority" - default 50 + int "BLE Init Priority" + default 50 #ZMK_BLE || ZMK_SPLIT_BLE endif @@ -390,8 +390,8 @@ endmenu menu "KSCAN Settings" config ZMK_KSCAN_EVENT_QUEUE_SIZE - int "Size of the event queue for KSCAN events to buffer events" - default 4 + int "Size of the event queue for KSCAN events to buffer events" + default 4 #KSCAN Settings endmenu @@ -399,63 +399,63 @@ endmenu menu "Logging" config ZMK_LOGGING_MINIMAL - bool "Suppress all ZMK debug log messages" - default false + bool "Suppress all ZMK debug log messages" + default false if !ZMK_LOGGING_MINIMAL config ZMK_LOG_LEVEL - default 4 + default 4 endif config ZMK_USB_LOGGING - bool "Enable USB CDC ACM logging to help debug" - select LOG - select USB - select USB_DEVICE_STACK - select USB_CDC_ACM - select SERIAL - select CONSOLE - select UART_INTERRUPT_DRIVEN - select UART_LINE_CTRL - select UART_CONSOLE - select USB_UART_CONSOLE + bool "Enable USB CDC ACM logging to help debug" + select LOG + select USB + select USB_DEVICE_STACK + select USB_CDC_ACM + select SERIAL + select CONSOLE + select UART_INTERRUPT_DRIVEN + select UART_LINE_CTRL + select UART_CONSOLE + select USB_UART_CONSOLE if ZMK_USB_LOGGING choice USB_CDC_ACM_LOG_LEVEL_CHOICE - default USB_CDC_ACM_LOG_LEVEL_OFF + default USB_CDC_ACM_LOG_LEVEL_OFF endchoice choice USB_DRIVER_LOG_LEVEL_CHOICE - default USB_DRIVER_LOG_LEVEL_OFF + default USB_DRIVER_LOG_LEVEL_OFF endchoice # We do this to avoid log loop where logging to USB generates more log messages. config USB_CDC_ACM_RINGBUF_SIZE - default 1024 + default 1024 config LOG_PROCESS_THREAD_STARTUP_DELAY_MS - default 1000 + default 1000 #ZMK_USB_LOGGING endif config ZMK_RTT_LOGGING - bool "Enable RTT logging to help debug" - select LOG - select DEBUG - select ASSERT - select USE_SEGGER_RTT - select CONSOLE - select RTT_CONSOLE + bool "Enable RTT logging to help debug" + select LOG + select DEBUG + select ASSERT + select USE_SEGGER_RTT + select CONSOLE + select RTT_CONSOLE if ZMK_RTT_LOGGING config SEGGER_RTT_BUFFER_SIZE_UP - default 8192 + default 8192 #ZMK_RTT_LOGGING endif @@ -463,10 +463,10 @@ endif if ZMK_USB_LOGGING || ZMK_RTT_LOGGING config LOG_BUFFER_SIZE - default 8192 + default 8192 config LOG_PROCESS_THREAD_SLEEP_MS - default 100 + default 100 #ZMK_USB_LOGGING || ZMK_RTT_LOGGING endif @@ -477,16 +477,16 @@ endmenu if SETTINGS config ZMK_SETTINGS_SAVE_DEBOUNCE - int "Milliseconds to debounce settings saves" - default 60000 + int "Milliseconds to debounce settings saves" + default 60000 #SETTINGS endif config ZMK_BATTERY_REPORT_INTERVAL - depends on ZMK_BLE - int "Battery level report interval in seconds" - default 60 + depends on ZMK_BLE + int "Battery level report interval in seconds" + default 60 #Advanced endmenu @@ -495,26 +495,26 @@ endmenu endmenu config HEAP_MEM_POOL_SIZE - default 8192 + default 8192 config KERNEL_BIN_NAME - default "zmk" + default "zmk" config REBOOT - default y + default y config USB_DEVICE_STACK - default y if HAS_HW_NRF_USBD + default y if HAS_HW_NRF_USBD config ZMK_WPM - bool "Calculate WPM" - default n + bool "Calculate WPM" + default n config SENSOR - default y + default y choice CBPRINTF_IMPLEMENTATION - default CBPRINTF_NANO + default CBPRINTF_NANO endchoice diff --git a/app/boards/arm/bdn9/Kconfig.board b/app/boards/arm/bdn9/Kconfig.board index a67e9a51..76a204cc 100644 --- a/app/boards/arm/bdn9/Kconfig.board +++ b/app/boards/arm/bdn9/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_BDN9 - bool "BDN9 rev2" - depends on SOC_STM32F072XB + bool "BDN9 rev2" + depends on SOC_STM32F072XB diff --git a/app/boards/arm/bdn9/Kconfig.defconfig b/app/boards/arm/bdn9/Kconfig.defconfig index 17695185..d1c82811 100644 --- a/app/boards/arm/bdn9/Kconfig.defconfig +++ b/app/boards/arm/bdn9/Kconfig.defconfig @@ -6,16 +6,16 @@ if BOARD_BDN9 config BOARD - default "bdn9_rev2" + default "bdn9_rev2" config ZMK_KEYBOARD_NAME - default "BDN9 Rev2" + default "BDN9 Rev2" config ZMK_USB - default y + default y config ZMK_RGB_UNDERGLOW - select SPI - select WS2812_STRIP + select SPI + select WS2812_STRIP endif # BOARD_BDN9 diff --git a/app/boards/arm/bdn9/bdn9_rev2.dts b/app/boards/arm/bdn9/bdn9_rev2.dts index e75893d6..d2d1c65c 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.dts +++ b/app/boards/arm/bdn9/bdn9_rev2.dts @@ -10,134 +10,134 @@ #include / { - model = "Keeb.io BDN9 rev2"; - compatible = "keebio,bdn9", "st,stm32f072"; + model = "Keeb.io BDN9 rev2"; + compatible = "keebio,bdn9", "st,stm32f072"; - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,kscan = &kscan; - zmk,underglow = &led_strip; - }; + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,kscan = &kscan; + zmk,underglow = &led_strip; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; + kscan: kscan { + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; - input-gpios - = <&gpiob 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiof 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiof 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + input-gpios + = <&gpiob 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiof 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiof 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; - mid_encoder: encoder_mid { - compatible = "alps,ec11"; - label = "MID_ENCODER"; - a-gpios = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; - right_encoder: encoder_right { - compatible = "alps,ec11"; - label = "RIGHT_ENCODER"; - a-gpios = <&gpioa 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&gpiob 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; + mid_encoder: encoder_mid { + compatible = "alps,ec11"; + label = "MID_ENCODER"; + a-gpios = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; + right_encoder: encoder_right { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + a-gpios = <&gpioa 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpiob 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - sensors: sensors { - compatible = "zmk,keymap-sensors"; - status = "disabled"; - sensors = <>; - }; + sensors: sensors { + compatible = "zmk,keymap-sensors"; + status = "disabled"; + sensors = <>; + }; }; &spi2 { - status = "okay"; - pinctrl-0 = <&spi2_sck_pb13 &spi2_mosi_pb15>; - pinctrl-names = "default"; + status = "okay"; + pinctrl-0 = <&spi2_sck_pb13 &spi2_mosi_pb15>; + pinctrl-names = "default"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <9>; - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <9>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; &clk_hsi { - status = "okay"; + status = "okay"; }; &pll { - status = "okay"; - prediv = <1>; - mul = <6>; - clocks = <&clk_hsi>; + status = "okay"; + prediv = <1>; + mul = <6>; + clocks = <&clk_hsi>; }; &rcc { - clocks = <&pll>; - clock-frequency = ; - ahb-prescaler = <1>; - apb1-prescaler = <1>; + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <1>; }; &usb { - status = "okay"; - pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; - pinctrl-names = "default"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; + pinctrl-names = "default"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &rtc { - status = "okay"; + status = "okay"; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - /* Set 6Kb of storage at the end of the 128Kb of flash */ - storage_partition: partition@1e800 { - label = "storage"; - reg = <0x0001e800 0x00001800>; - }; - }; + /* Set 6Kb of storage at the end of the 128Kb of flash */ + storage_partition: partition@1e800 { + label = "storage"; + reg = <0x0001e800 0x00001800>; + }; + }; }; diff --git a/app/boards/arm/bdn9/bdn9_rev2.keymap b/app/boards/arm/bdn9/bdn9_rev2.keymap index 50c273c7..1e2c192d 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.keymap +++ b/app/boards/arm/bdn9/bdn9_rev2.keymap @@ -9,8 +9,8 @@ /* Uncomment and keep whatever encoders are on your BDN9 &sensors { - status = "okay"; - sensors = <&left_encoder &mid_encoder &right_encoder>; + status = "okay"; + sensors = <&left_encoder &mid_encoder &right_encoder>; }; */ @@ -20,19 +20,19 @@ // &right_encoder { status = "okay"; }; / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp HOME &kp K_PP &kp END - &kp PG_UP &kp UP &kp PG_DN - &kp LEFT &kp DOWN &kp RIGHT - >; - /* Uncomment and add necessary bindings. This examples is for one encoder - sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; - */ - }; - }; + default_layer { + bindings = < + &kp HOME &kp K_PP &kp END + &kp PG_UP &kp UP &kp PG_DN + &kp LEFT &kp DOWN &kp RIGHT + >; + /* Uncomment and add necessary bindings. This examples is for one encoder + sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; + */ + }; + }; }; diff --git a/app/boards/arm/bluemicro840/Kconfig b/app/boards/arm/bluemicro840/Kconfig index 0e6743d3..ca060885 100644 --- a/app/boards/arm/bluemicro840/Kconfig +++ b/app/boards/arm/bluemicro840/Kconfig @@ -1,8 +1,8 @@ # SPDX-License-Identifier: MIT config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on BOARD_BLUEMICRO840_V1 + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on BOARD_BLUEMICRO840_V1 diff --git a/app/boards/arm/bluemicro840/Kconfig.board b/app/boards/arm/bluemicro840/Kconfig.board index bc271af3..e2794015 100644 --- a/app/boards/arm/bluemicro840/Kconfig.board +++ b/app/boards/arm/bluemicro840/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_BLUEMICRO840_V1 - bool "BlueMicro840_V1" - depends on SOC_NRF52840_QIAA + bool "BlueMicro840_V1" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/bluemicro840/Kconfig.defconfig b/app/boards/arm/bluemicro840/Kconfig.defconfig index 5d911ec6..732805ae 100644 --- a/app/boards/arm/bluemicro840/Kconfig.defconfig +++ b/app/boards/arm/bluemicro840/Kconfig.defconfig @@ -6,22 +6,22 @@ if BOARD_BLUEMICRO840_V1 config BOARD - default "bluemicro840_v1" + default "bluemicro840_v1" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y endif # BOARD_BLUEMICRO840_V1 diff --git a/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi b/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi index 53514d64..cdb8fcdd 100644 --- a/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi @@ -5,50 +5,50 @@ */ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 D2 */ - , <1 0 &gpio0 6 0> /* D1 D3*/ - , <2 0 &gpio0 15 0> /* D2 D1*/ - , <3 0 &gpio0 17 0> /* D3 D0*/ - , <4 0 &gpio0 20 0> /* D4/A6 D4*/ - , <5 0 &gpio0 13 0> /* D5 C6*/ - , <6 0 &gpio0 24 0> /* D6/A7 D7*/ - , <7 0 &gpio0 9 0> /* D7 E6*/ - , <8 0 &gpio0 10 0> /* D8/A8 B4*/ - , <9 0 &gpio1 6 0> /* D9/A9 B5*/ - , <10 0 &gpio1 11 0> /* D10/A10 B6*/ - , <16 0 &gpio0 28 0> /* D16 B2*/ - , <14 0 &gpio0 3 0> /* D14 B3*/ - , <15 0 &gpio1 13 0> /* D15 B1*/ - , <18 0 &gpio0 2 0> /* D18/A0 F7*/ - , <19 0 &gpio0 29 0> /* D19/A1 F6*/ - , <20 0 &gpio0 26 0> /* D20/A2 F5*/ - , <21 0 &gpio0 30 0> /* D21/A3 F4*/ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 D2 */ + , <1 0 &gpio0 6 0> /* D1 D3*/ + , <2 0 &gpio0 15 0> /* D2 D1*/ + , <3 0 &gpio0 17 0> /* D3 D0*/ + , <4 0 &gpio0 20 0> /* D4/A6 D4*/ + , <5 0 &gpio0 13 0> /* D5 C6*/ + , <6 0 &gpio0 24 0> /* D6/A7 D7*/ + , <7 0 &gpio0 9 0> /* D7 E6*/ + , <8 0 &gpio0 10 0> /* D8/A8 B4*/ + , <9 0 &gpio1 6 0> /* D9/A9 B5*/ + , <10 0 &gpio1 11 0> /* D10/A10 B6*/ + , <16 0 &gpio0 28 0> /* D16 B2*/ + , <14 0 &gpio0 3 0> /* D14 B3*/ + , <15 0 &gpio1 13 0> /* D15 B1*/ + , <18 0 &gpio0 2 0> /* D18/A0 F7*/ + , <19 0 &gpio0 29 0> /* D19/A1 F6*/ + , <20 0 &gpio0 26 0> /* D20/A2 F5*/ + , <21 0 &gpio0 30 0> /* D21/A3 F4*/ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 2 0> /* D18/A0 F7*/ - , <1 0 &gpio0 29 0> /* D19/A1 F6*/ - , <2 0 &gpio0 26 0> /* D20/A2 F5*/ - , <3 0 &gpio0 30 0> /* D21/A3 F4*/ - , <6 0 &gpio0 20 0> /* D4/A6 D4*/ - , <7 0 &gpio0 24 0> /* D6/A7 D7*/ - , <8 0 &gpio0 10 0> /* D8/A8 B4*/ - , <9 0 &gpio1 6 0> /* D9/A9 B5*/ - , <10 0 &gpio1 11 0> /* D10/A10 B6*/ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 2 0> /* D18/A0 F7*/ + , <1 0 &gpio0 29 0> /* D19/A1 F6*/ + , <2 0 &gpio0 26 0> /* D20/A2 F5*/ + , <3 0 &gpio0 30 0> /* D21/A3 F4*/ + , <6 0 &gpio0 20 0> /* D4/A6 D4*/ + , <7 0 &gpio0 24 0> /* D6/A7 D7*/ + , <8 0 &gpio0 10 0> /* D8/A8 B4*/ + , <9 0 &gpio1 6 0> /* D9/A9 B5*/ + , <10 0 &gpio1 11 0> /* D10/A10 B6*/ + ; + }; }; pro_micro_d: &pro_micro {}; diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi index 18b90f21..15c48509 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi +++ b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1.dts b/app/boards/arm/bluemicro840/bluemicro840_v1.dts index c636ca31..f1952601 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1.dts +++ b/app/boards/arm/bluemicro840/bluemicro840_v1.dts @@ -10,117 +10,117 @@ #include "bluemicro840_v1-pinctrl.dtsi" / { - model = "BlueMicro840_V1"; - compatible = "bluemicro840,v1"; + model = "BlueMicro840_V1"; + compatible = "bluemicro840,v1"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - init-delay-ms = <20>; - control-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + init-delay-ms = <20>; + control-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 7>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 806000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 7>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 806000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twim"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/bt60/Kconfig b/app/boards/arm/bt60/Kconfig index 359e237d..d57a6b7e 100644 --- a/app/boards/arm/bt60/Kconfig +++ b/app/boards/arm/bt60/Kconfig @@ -1,7 +1,7 @@ # SPDX-License-Identifier: MIT config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on (BOARD_BT60_V1_HS || BOARD_BT60_V1) + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_BT60_V1_HS || BOARD_BT60_V1) diff --git a/app/boards/arm/bt60/Kconfig.board b/app/boards/arm/bt60/Kconfig.board index 0f0a9c6e..24c0a8b5 100644 --- a/app/boards/arm/bt60/Kconfig.board +++ b/app/boards/arm/bt60/Kconfig.board @@ -4,9 +4,9 @@ # SPDX-License-Identifier: MIT config BOARD_BT60_V1 - bool "bt60" - depends on SOC_NRF52840_QIAA + bool "bt60" + depends on SOC_NRF52840_QIAA config BOARD_BT60_V1_HS - bool "bt60 hotswap" - depends on SOC_NRF52840_QIAA + bool "bt60 hotswap" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/bt60/Kconfig.defconfig b/app/boards/arm/bt60/Kconfig.defconfig index bad1e7cd..e7cf1a48 100644 --- a/app/boards/arm/bt60/Kconfig.defconfig +++ b/app/boards/arm/bt60/Kconfig.defconfig @@ -4,28 +4,28 @@ if BOARD_BT60_V1_HS || BOARD_BT60_V1 config BOARD - default "bt60" + default "bt60" if USB config USB_NRFX - default y + default y config USB_DEVICE_STACK - default y + default y endif # USB config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y config ZMK_KEYBOARD_NAME - default "BT60" + default "BT60" endif # BOARD_BT60 diff --git a/app/boards/arm/bt60/bt60.dtsi b/app/boards/arm/bt60/bt60.dtsi index 3858ba46..6e4900af 100644 --- a/app/boards/arm/bt60/bt60.dtsi +++ b/app/boards/arm/bt60/bt60.dtsi @@ -9,126 +9,126 @@ #include / { - model = "BT60"; - compatible = "polarityworks,bt60"; + model = "BT60"; + compatible = "polarityworks,bt60"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder>; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - status = "okay"; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 806000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 806000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <17>; - scl-pin = <20>; + compatible = "nordic,nrf-twi"; + sda-pin = <17>; + scl-pin = <20>; }; &uart0 { - compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + compatible = "nordic,nrf-uarte"; + tx-pin = <6>; + rx-pin = <8>; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/bt60/bt60_v1.dts b/app/boards/arm/bt60/bt60_v1.dts index 8b2f0cb4..0cfe184a 100644 --- a/app/boards/arm/bt60/bt60_v1.dts +++ b/app/boards/arm/bt60/bt60_v1.dts @@ -9,105 +9,105 @@ / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &ansi_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &ansi_transform; + }; - ansi_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) - RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) - RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) - >; - }; + ansi_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) + RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) + >; + }; - hhkb_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) - RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) - RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) - >; - }; + hhkb_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) + RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) + >; + }; - iso_transform: keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) - RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) - >; - }; + iso_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) + >; + }; - all_1u_transform: keymap_transform_3 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) - RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,14) - RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) - >; - }; + all_1u_transform: keymap_transform_3 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) + RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,14) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) + >; + }; - split_transform: keymap_transform_4 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) - RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) - RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) - >; - }; + split_transform: keymap_transform_4 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) + RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) + >; + }; - kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "col2row"; + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; - col-gpios - = <&gpio1 13 GPIO_ACTIVE_HIGH> - , <&gpio1 10 GPIO_ACTIVE_HIGH> - , <&gpio1 11 GPIO_ACTIVE_HIGH> - , <&gpio1 15 GPIO_ACTIVE_HIGH> - , <&gpio0 3 GPIO_ACTIVE_HIGH> - , <&gpio0 2 GPIO_ACTIVE_HIGH> - , <&gpio0 28 GPIO_ACTIVE_HIGH> - , <&gpio0 29 GPIO_ACTIVE_HIGH> - , <&gpio0 30 GPIO_ACTIVE_HIGH> - , <&gpio0 31 GPIO_ACTIVE_HIGH> - , <&gpio0 5 GPIO_ACTIVE_HIGH> - , <&gpio0 7 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - , <&gpio0 12 GPIO_ACTIVE_HIGH> - , <&gpio0 23 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&gpio1 13 GPIO_ACTIVE_HIGH> + , <&gpio1 10 GPIO_ACTIVE_HIGH> + , <&gpio1 11 GPIO_ACTIVE_HIGH> + , <&gpio1 15 GPIO_ACTIVE_HIGH> + , <&gpio0 3 GPIO_ACTIVE_HIGH> + , <&gpio0 2 GPIO_ACTIVE_HIGH> + , <&gpio0 28 GPIO_ACTIVE_HIGH> + , <&gpio0 29 GPIO_ACTIVE_HIGH> + , <&gpio0 30 GPIO_ACTIVE_HIGH> + , <&gpio0 31 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + ; - row-gpios - = <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + row-gpios + = <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; }; diff --git a/app/boards/arm/bt60/bt60_v1.keymap b/app/boards/arm/bt60/bt60_v1.keymap index b42f3f3d..25ae269d 100644 --- a/app/boards/arm/bt60/bt60_v1.keymap +++ b/app/boards/arm/bt60/bt60_v1.keymap @@ -11,170 +11,170 @@ / { - chosen { - #ifdef ANSI - zmk,matrix_transform = &ansi_transform; - #elif defined(HHKB) - zmk,matrix_transform = &hhkb_transform; - #elif defined(ISO) - zmk,matrix_transform = &iso_transform; - #elif defined(ALL_1U) - zmk,matrix_transform = &all_1u_transform; - #else - zmk,matrix_transform = &split_transform; - #endif - }; + chosen { + #ifdef ANSI + zmk,matrix_transform = &ansi_transform; + #elif defined(HHKB) + zmk,matrix_transform = &hhkb_transform; + #elif defined(ISO) + zmk,matrix_transform = &iso_transform; + #elif defined(ALL_1U) + zmk,matrix_transform = &all_1u_transform; + #else + zmk,matrix_transform = &split_transform; + #endif + }; - keymap { - compatible = "zmk,keymap"; - #ifdef ANSI - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | - // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | - // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL &bt BT_CLR - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - // ------------------------------------------------------------------------------------------ - // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | - // | TAB | Q | UP | E | R | T | Y | U | INS | O |PSCRN|SLCK |PSEBRK| RESET | - // | CAPS |LEFT |DOWN |RIGHT| F | G | H | J | K | L |HOME |PGUP | BOOTLOADER | - // | PREV |VOLUP |VOLDN|MUTE | V | B | N | M | , | END | PGDN | NEXT | - // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | BT_CLR | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset - &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader - &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT - &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR &trans - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - #elif defined(HHKB) - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | BSPC | - // | CTRL | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | 1 | - // | CAPS | ALT | WIN | SPACE | WIN | ALT | CTRL | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSLH &kp GRAVE - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSPC - &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &mo 1 - &kp LCTRL &kp LALT &kp LGUI &kp SPACE &kp RGUI &kp RALT &kp RCTRL - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - bindings = < - &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp INS &kp DEL - &kp CLCK &bt BT_PRV &bt BT_NXT &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &kp UP &trans &sys_reset - &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp LEFT &kp RIGHT &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp DOWN &trans &trans - &trans &trans &trans &bootloader &trans &trans &trans - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - #elif defined(ISO) - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | - // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | - // | SHIFT | | | Z | X | C | V | B | N | M | , | . | / | SHIFT | - // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET - &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL - &sys_reset &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK - &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &trans &bootloader - &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT - &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - #elif defined(ALL_1U) - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | - // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 | - // | CTL | WIN | ALT | SPACE | ALT | CTRL | LEFT | DOWN | RIGHT | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &mo 1 - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp F1 - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset - &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader - &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT - &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &bt BT_CLR - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - #else - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP| DEL | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | - // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | 1 | - // | CTL | WIN | ALT | SPACE | ALT | 1 | CTRL | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &mo 1 - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RGUI &kp C_MENU &kp RCTRL - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset - &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader - &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &trans - &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - #endif - }; + keymap { + compatible = "zmk,keymap"; + #ifdef ANSI + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // ------------------------------------------------------------------------------------------ + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | + // | TAB | Q | UP | E | R | T | Y | U | INS | O |PSCRN|SLCK |PSEBRK| RESET | + // | CAPS |LEFT |DOWN |RIGHT| F | G | H | J | K | L |HOME |PGUP | BOOTLOADER | + // | PREV |VOLUP |VOLDN|MUTE | V | B | N | M | , | END | PGDN | NEXT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | BT_CLR | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR &trans + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(HHKB) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | BSPC | + // | CTRL | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | 1 | + // | CAPS | ALT | WIN | SPACE | WIN | ALT | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSLH &kp GRAVE + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSPC + &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &mo 1 + &kp LCTRL &kp LALT &kp LGUI &kp SPACE &kp RGUI &kp RALT &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp INS &kp DEL + &kp CLCK &bt BT_PRV &bt BT_NXT &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &kp UP &trans &sys_reset + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp LEFT &kp RIGHT &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp DOWN &trans &trans + &trans &trans &trans &bootloader &trans &trans &trans + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ISO) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | + // | SHIFT | | | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET + &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &sys_reset &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &trans &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ALL_1U) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 | + // | CTL | WIN | ALT | SPACE | ALT | CTRL | LEFT | DOWN | RIGHT | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &mo 1 + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp F1 + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #else + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP| DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | 1 | + // | CTL | WIN | ALT | SPACE | ALT | 1 | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &mo 1 + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RGUI &kp C_MENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #endif + }; }; diff --git a/app/boards/arm/bt60/bt60_v1_hs.dts b/app/boards/arm/bt60/bt60_v1_hs.dts index 0e686fd9..b24dee1e 100644 --- a/app/boards/arm/bt60/bt60_v1_hs.dts +++ b/app/boards/arm/bt60/bt60_v1_hs.dts @@ -9,53 +9,53 @@ / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(2,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - RC(4,0) RC(4,1) RC(4,2) RC(4,5) RC(4,8) RC(4,9) RC(4,10) RC(4,11) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(2,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) + RC(4,0) RC(4,1) RC(4,2) RC(4,5) RC(4,8) RC(4,9) RC(4,10) RC(4,11) + >; + }; - kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "col2row"; + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; - col-gpios - = <&gpio1 11 GPIO_ACTIVE_HIGH> - , <&gpio1 10 GPIO_ACTIVE_HIGH> - , <&gpio1 13 GPIO_ACTIVE_HIGH> - , <&gpio1 15 GPIO_ACTIVE_HIGH> - , <&gpio0 3 GPIO_ACTIVE_HIGH> - , <&gpio0 2 GPIO_ACTIVE_HIGH> - , <&gpio0 28 GPIO_ACTIVE_HIGH> - , <&gpio0 29 GPIO_ACTIVE_HIGH> - , <&gpio0 30 GPIO_ACTIVE_HIGH> - , <&gpio0 31 GPIO_ACTIVE_HIGH> - , <&gpio0 5 GPIO_ACTIVE_HIGH> - , <&gpio0 7 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - , <&gpio0 12 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&gpio1 11 GPIO_ACTIVE_HIGH> + , <&gpio1 10 GPIO_ACTIVE_HIGH> + , <&gpio1 13 GPIO_ACTIVE_HIGH> + , <&gpio1 15 GPIO_ACTIVE_HIGH> + , <&gpio0 3 GPIO_ACTIVE_HIGH> + , <&gpio0 2 GPIO_ACTIVE_HIGH> + , <&gpio0 28 GPIO_ACTIVE_HIGH> + , <&gpio0 29 GPIO_ACTIVE_HIGH> + , <&gpio0 30 GPIO_ACTIVE_HIGH> + , <&gpio0 31 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + ; - row-gpios - = <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 23 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + row-gpios + = <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 23 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; }; diff --git a/app/boards/arm/bt60/bt60_v1_hs.keymap b/app/boards/arm/bt60/bt60_v1_hs.keymap index 167460c6..6c26756e 100644 --- a/app/boards/arm/bt60/bt60_v1_hs.keymap +++ b/app/boards/arm/bt60/bt60_v1_hs.keymap @@ -3,35 +3,35 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | - // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | - // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &bt BT_CLR - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset - &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader - &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT - &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - }; + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &bt BT_CLR + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; }; diff --git a/app/boards/arm/corneish_zen/Kconfig.board b/app/boards/arm/corneish_zen/Kconfig.board index 33baa110..ca82e330 100644 --- a/app/boards/arm/corneish_zen/Kconfig.board +++ b/app/boards/arm/corneish_zen/Kconfig.board @@ -4,9 +4,9 @@ # config BOARD_CORNEISH_ZEN_V2_LEFT - bool "corneish zen left v2" - depends on SOC_NRF52840_QIAA + bool "corneish zen left v2" + depends on SOC_NRF52840_QIAA config BOARD_CORNEISH_ZEN_V2_RIGHT - bool "corneish zen right v2" - depends on SOC_NRF52840_QIAA \ No newline at end of file + bool "corneish zen right v2" + depends on SOC_NRF52840_QIAA \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig index 33ce1256..a161230c 100644 --- a/app/boards/arm/corneish_zen/Kconfig.defconfig +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -6,10 +6,10 @@ if BOARD_CORNEISH_ZEN_V2_LEFT config ZMK_KEYBOARD_NAME - default "Corne-ish Zen" + default "Corne-ish Zen" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif # BOARD_CORNEISH_ZEN_V2_LEFT @@ -17,65 +17,65 @@ endif # BOARD_CORNEISH_ZEN_V2_LEFT if BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT config BOARD - default "corneish_zen" + default "corneish_zen" config ZMK_SPLIT - default y + default y config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y if USB config USB_NRFX - default y + default y config USB_DEVICE_STACK - default y + default y endif # USB config ZMK_DISPLAY - select LV_USE_CONT - select LV_FONT_MONTSERRAT_26 - select LV_FONT_MONTSERRAT_20 - select LV_FONT_MONTSERRAT_16 - select LV_USE_LABEL - select LV_USE_IMG + select LV_USE_CONT + select LV_FONT_MONTSERRAT_26 + select LV_FONT_MONTSERRAT_20 + select LV_FONT_MONTSERRAT_16 + select LV_USE_LABEL + select LV_USE_IMG choice ZMK_DISPLAY_STATUS_SCREEN - default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM + default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM endchoice if ZMK_DISPLAY config SPI - default y + default y config IL0323 - default y + default y config ZMK_DISPLAY_BLANK_ON_IDLE - default n + default n endif # ZMK_DISPLAY menuconfig CUSTOM_WIDGET_BATTERY_STATUS - bool "custom battery status widget" + bool "custom battery status widget" menuconfig CUSTOM_WIDGET_OUTPUT_STATUS - bool "custom output status widget" + bool "custom output status widget" menuconfig CUSTOM_WIDGET_LAYER_STATUS - bool "custom layer status widget" + bool "custom layer status widget" menuconfig CUSTOM_WIDGET_PERIPHERAL_STATUS - bool "custom peripheral status widget" + bool "custom peripheral status widget" endif # BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT diff --git a/app/boards/arm/corneish_zen/corneish_zen.dtsi b/app/boards/arm/corneish_zen/corneish_zen.dtsi index f203c9f8..10be54cc 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.dtsi +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -11,116 +11,116 @@ #include / { - model = "corneish_zen_v2"; - compatible = "corneish_zen_v2"; + model = "corneish_zen_v2"; + compatible = "corneish_zen_v2"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zmk,kscan = &kscan0; - zmk,display = &epd; - zmk,battery = &vbatt; - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zmk,kscan = &kscan0; + zmk,display = &epd; + zmk,battery = &vbatt; + zephyr,console = &cdc_acm_uart; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; - // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | - // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | - // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | - // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) - RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | + // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | + // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | + // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) + >; + }; - five_column_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; - // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | - // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | - // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | - // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < - RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) - RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) - RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) - RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | + // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | + // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | + // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | + map = < + RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) + RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) + RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) + >; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/corneish_zen.keymap b/app/boards/arm/corneish_zen/corneish_zen.keymap index 72d0b8f1..2b9eeb14 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.keymap +++ b/app/boards/arm/corneish_zen/corneish_zen.keymap @@ -45,7 +45,7 @@ &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; @@ -60,7 +60,7 @@ &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; }; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index 65092dc5..9f3dd73a 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -8,90 +8,90 @@ #include "corneish_zen.dtsi" /{ - chosen { - zephyr,display = &epd; - zmk,battery = &vbatt; - }; + chosen { + zephyr,display = &epd; + zmk,battery = &vbatt; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&gpio0 21 GPIO_ACTIVE_HIGH> - , <&gpio0 23 GPIO_ACTIVE_HIGH> - , <&gpio0 12 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - , <&gpio0 7 GPIO_ACTIVE_HIGH> - , <&gpio0 5 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + ; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 0>; - output-ohms = <1960000>; - full-ohms = <(1960000 + 810000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1960000>; + full-ohms = <(1960000 + 810000)>; + }; }; &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; &spi0 { - status = "okay"; - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>; + status = "okay"; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>; - epd: il0323@0 { - compatible = "gooddisplay,il0323"; - reg = <0>; - label = "DISPLAY"; - width = <80>; - height = <128>; - spi-max-frequency = <4000000>; - dc-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>; - busy-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; - reset-gpios = <&gpio0 24 GPIO_ACTIVE_LOW>; - pwr = [03 00 26 26]; - cdi = <0xd2>; - tcon = <0x22>; - }; + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 24 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + cdi = <0xd2>; + tcon = <0x22>; + }; }; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts index 980c9900..3cb7556f 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts @@ -8,98 +8,98 @@ #include "corneish_zen.dtsi" /{ - chosen { - zephyr,display = &epd; - zmk,battery = &vbatt; - }; + chosen { + zephyr,display = &epd; + zmk,battery = &vbatt; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&gpio0 19 GPIO_ACTIVE_HIGH> - , <&gpio0 21 GPIO_ACTIVE_HIGH> - , <&gpio0 23 GPIO_ACTIVE_HIGH> - , <&gpio0 12 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - , <&gpio0 7 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&gpio0 19 GPIO_ACTIVE_HIGH> + , <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + ; - }; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 0>; - output-ohms = <1960000>; - full-ohms = <(1960000 + 810000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1960000>; + full-ohms = <(1960000 + 810000)>; + }; }; &default_transform { - col-offset = <6>; + col-offset = <6>; }; &five_column_transform { - col-offset = <6>; + col-offset = <6>; }; &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; &spi0 { - status = "okay"; - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; + status = "okay"; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; - epd: il0323@0 { - compatible = "gooddisplay,il0323"; - reg = <0>; - label = "DISPLAY"; - width = <80>; - height = <128>; - spi-max-frequency = <4000000>; - dc-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; - busy-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>; - reset-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; - pwr = [03 00 26 26]; - //softstart = [17 17 17 17]; - cdi = <0xd2>; - tcon = <0x22>; - }; + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + //softstart = [17 17 17 17]; + cdi = <0xd2>; + tcon = <0x22>; + }; }; diff --git a/app/boards/arm/dz60rgb/Kconfig.board b/app/boards/arm/dz60rgb/Kconfig.board index ec8dad68..ba09e2dd 100644 --- a/app/boards/arm/dz60rgb/Kconfig.board +++ b/app/boards/arm/dz60rgb/Kconfig.board @@ -2,5 +2,5 @@ # SPDX-License-Identifier: MIT config BOARD_DZ60RGB_REV1 - bool "DZ60RGB Keyboard" - depends on SOC_STM32F303XC + bool "DZ60RGB Keyboard" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/dz60rgb/Kconfig.defconfig b/app/boards/arm/dz60rgb/Kconfig.defconfig index 779d3123..2e30e3d0 100644 --- a/app/boards/arm/dz60rgb/Kconfig.defconfig +++ b/app/boards/arm/dz60rgb/Kconfig.defconfig @@ -6,9 +6,9 @@ if BOARD_DZ60RGB_REV1 config ZMK_KEYBOARD_NAME - default "DZ60RGB Rev 1" + default "DZ60RGB Rev 1" config ZMK_USB - default y + default y endif # BOARD_DZ60RGB_REV1 diff --git a/app/boards/arm/dz60rgb/dz60rgb_rev1.dts b/app/boards/arm/dz60rgb/dz60rgb_rev1.dts index e2730d21..14be837d 100644 --- a/app/boards/arm/dz60rgb/dz60rgb_rev1.dts +++ b/app/boards/arm/dz60rgb/dz60rgb_rev1.dts @@ -10,84 +10,84 @@ #include / { - model = "DZ60RGB, Rev 1"; - compatible = "dz60rgb,rev1", "st,stm32f303"; + model = "DZ60RGB, Rev 1"; + compatible = "dz60rgb,rev1", "st,stm32f303"; - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; - map = < + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(4,0) RC(4,1) RC(4,2) RC(4,5) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,13) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&gpioa 6 GPIO_ACTIVE_HIGH> - , <&gpioa 7 GPIO_ACTIVE_HIGH> - , <&gpiob 0 GPIO_ACTIVE_HIGH> - , <&gpiob 13 GPIO_ACTIVE_HIGH> - , <&gpiob 15 GPIO_ACTIVE_HIGH> - , <&gpioa 8 GPIO_ACTIVE_HIGH> - , <&gpioa 15 GPIO_ACTIVE_HIGH> - , <&gpiob 3 GPIO_ACTIVE_HIGH> - , <&gpiob 4 GPIO_ACTIVE_HIGH> - , <&gpiob 5 GPIO_ACTIVE_HIGH> - , <&gpiob 8 GPIO_ACTIVE_HIGH> - , <&gpiob 9 GPIO_ACTIVE_HIGH> - , <&gpioc 13 GPIO_ACTIVE_HIGH> - , <&gpioc 14 GPIO_ACTIVE_HIGH> - ; - }; + diode-direction = "col2row"; + row-gpios + = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpioa 6 GPIO_ACTIVE_HIGH> + , <&gpioa 7 GPIO_ACTIVE_HIGH> + , <&gpiob 0 GPIO_ACTIVE_HIGH> + , <&gpiob 13 GPIO_ACTIVE_HIGH> + , <&gpiob 15 GPIO_ACTIVE_HIGH> + , <&gpioa 8 GPIO_ACTIVE_HIGH> + , <&gpioa 15 GPIO_ACTIVE_HIGH> + , <&gpiob 3 GPIO_ACTIVE_HIGH> + , <&gpiob 4 GPIO_ACTIVE_HIGH> + , <&gpiob 5 GPIO_ACTIVE_HIGH> + , <&gpiob 8 GPIO_ACTIVE_HIGH> + , <&gpiob 9 GPIO_ACTIVE_HIGH> + , <&gpioc 13 GPIO_ACTIVE_HIGH> + , <&gpioc 14 GPIO_ACTIVE_HIGH> + ; + }; }; &usb { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - /* Set 6Kb of storage at the end of the 256Kb of flash */ - storage_partition: partition@3e800 { - label = "storage"; - reg = <0x0003e800 0x00001800>; - }; - }; + /* Set 6Kb of storage at the end of the 256Kb of flash */ + storage_partition: partition@3e800 { + label = "storage"; + reg = <0x0003e800 0x00001800>; + }; + }; }; diff --git a/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap b/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap index f95fce0e..e8cc6a7a 100644 --- a/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap +++ b/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap @@ -2,10 +2,10 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | @@ -13,13 +13,13 @@ // | SHIFT | Z | X | C | V | B | N | M | , | . | SHIFT(/) | ^ | DEL | // | CTL | WIN | ALT | SPACE | ALT | MO(1) | <- | v | -> | // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &mt RSHFT FSLH &kp UP &kp DEL - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp LEFT &kp DOWN &kp RIGHT - >; - }; - }; + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &mt RSHFT FSLH &kp UP &kp DEL + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp LEFT &kp DOWN &kp RIGHT + >; + }; + }; }; \ No newline at end of file diff --git a/app/boards/arm/ferris/Kconfig.board b/app/boards/arm/ferris/Kconfig.board index ad96271a..70ee895d 100644 --- a/app/boards/arm/ferris/Kconfig.board +++ b/app/boards/arm/ferris/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_FERRIS - bool "Ferris rev 0.2" - depends on SOC_STM32F072XB + bool "Ferris rev 0.2" + depends on SOC_STM32F072XB diff --git a/app/boards/arm/ferris/Kconfig.defconfig b/app/boards/arm/ferris/Kconfig.defconfig index c59cb902..7cf43bcb 100644 --- a/app/boards/arm/ferris/Kconfig.defconfig +++ b/app/boards/arm/ferris/Kconfig.defconfig @@ -6,15 +6,15 @@ if BOARD_FERRIS config BOARD - default "ferris_rev02" + default "ferris_rev02" config ZMK_KEYBOARD_NAME - default "Ferris rev 0.2" + default "Ferris rev 0.2" config ZMK_USB - default y + default y config ZMK_KSCAN_MATRIX_POLLING - default y + default y endif # BOARD_FERRIS diff --git a/app/boards/arm/ferris/ferris_rev02.dts b/app/boards/arm/ferris/ferris_rev02.dts index 55055e9a..618a5591 100644 --- a/app/boards/arm/ferris/ferris_rev02.dts +++ b/app/boards/arm/ferris/ferris_rev02.dts @@ -11,153 +11,153 @@ #include / { - model = "Ferris rev0.2"; - compatible = "ferris,rev02", "st,stm32f072"; + model = "Ferris rev0.2"; + compatible = "ferris,rev02", "st,stm32f072"; - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,kscan = &kscan; - zmk,matrix_transform = &transform; - /* TODO: Enable once we support the IC for underglow - zmk,underglow = &led_strip; - */ - }; + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,kscan = &kscan; + zmk,matrix_transform = &transform; + /* TODO: Enable once we support the IC for underglow + zmk,underglow = &led_strip; + */ + }; - transform: transform { - compatible = "zmk,matrix-transform"; - rows = <4>; - columns = <10>; + transform: transform { + compatible = "zmk,matrix-transform"; + rows = <4>; + columns = <10>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) - RC(3,3) RC(3,4) RC(3,5) RC(3,6) - >; - }; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) + >; + }; - kscan: kscan { - compatible = "zmk,kscan-composite"; - label = "KSCAN"; - rows = <4>; - columns = <10>; + kscan: kscan { + compatible = "zmk,kscan-composite"; + label = "KSCAN"; + rows = <4>; + columns = <10>; - left { - kscan = <&kscan_left>; - }; + left { + kscan = <&kscan_left>; + }; - right { - kscan = <&kscan_right>; - column-offset = <5>; - }; - }; + right { + kscan = <&kscan_right>; + column-offset = <5>; + }; + }; - kscan_left: kscan_left { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN_LEFT"; + kscan_left: kscan_left { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN_LEFT"; - diode-direction = "col2row"; + diode-direction = "col2row"; - col-gpios - = <&gpiob 8 (GPIO_ACTIVE_HIGH)> - , <&gpiob 4 (GPIO_ACTIVE_HIGH)> - , <&gpiob 3 (GPIO_ACTIVE_HIGH)> - , <&gpioa 15 (GPIO_ACTIVE_HIGH)> - , <&gpioa 14 (GPIO_ACTIVE_HIGH)> - ; - row-gpios - = <&gpiob 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioa 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + col-gpios + = <&gpiob 8 (GPIO_ACTIVE_HIGH)> + , <&gpiob 4 (GPIO_ACTIVE_HIGH)> + , <&gpiob 3 (GPIO_ACTIVE_HIGH)> + , <&gpioa 15 (GPIO_ACTIVE_HIGH)> + , <&gpioa 14 (GPIO_ACTIVE_HIGH)> + ; + row-gpios + = <&gpiob 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; - kscan_right: kscan_right { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN_RIGHT"; + kscan_right: kscan_right { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN_RIGHT"; - diode-direction = "row2col"; + diode-direction = "row2col"; - col-gpios - = <&right_io 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&right_io 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&right_io 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&right_io 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&right_io 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - row-gpios - = <&right_io 8 (GPIO_ACTIVE_LOW)> - , <&right_io 9 (GPIO_ACTIVE_LOW)> - , <&right_io 10 (GPIO_ACTIVE_LOW)> - , <&right_io 11 (GPIO_ACTIVE_LOW)> - ; - }; + col-gpios + = <&right_io 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&right_io 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&right_io 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&right_io 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&right_io 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + row-gpios + = <&right_io 8 (GPIO_ACTIVE_LOW)> + , <&right_io 9 (GPIO_ACTIVE_LOW)> + , <&right_io 10 (GPIO_ACTIVE_LOW)> + , <&right_io 11 (GPIO_ACTIVE_LOW)> + ; + }; }; &i2c2 { - pinctrl-0 = <&i2c2_scl_pb10 &i2c2_sda_pb11>; - pinctrl-names = "default"; - status = "okay"; - clock-frequency = ; + pinctrl-0 = <&i2c2_scl_pb10 &i2c2_sda_pb11>; + pinctrl-names = "default"; + status = "okay"; + clock-frequency = ; - right_io: mcp23017@20 { - compatible = "microchip,mcp230xx"; - status = "okay"; - gpio-controller; - reg = <0x20>; - #gpio-cells = <2>; - ngpios = <16>; - }; + right_io: mcp23017@20 { + compatible = "microchip,mcp230xx"; + status = "okay"; + gpio-controller; + reg = <0x20>; + #gpio-cells = <2>; + ngpios = <16>; + }; }; &usb { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &clk_hsi { - status = "okay"; + status = "okay"; }; &pll { - prediv = <1>; - mul = <6>; - clocks = <&clk_hsi>; - status = "okay"; + prediv = <1>; + mul = <6>; + clocks = <&clk_hsi>; + status = "okay"; }; &rcc { - clocks = <&pll>; - clock-frequency = ; - ahb-prescaler = <1>; - apb1-prescaler = <1>; + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <1>; }; &rtc { - status = "okay"; + status = "okay"; }; &flash0 { - /* - * For more information, see: - * http: //docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http: //docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - /* Set 6Kb of storage at the end of the 128Kb of flash */ - storage_partition: partition@3e800 { - label = "storage"; - reg = <0x0001e800 0x00001800>; - }; - }; + /* Set 6Kb of storage at the end of the 128Kb of flash */ + storage_partition: partition@3e800 { + label = "storage"; + reg = <0x0001e800 0x00001800>; + }; + }; }; diff --git a/app/boards/arm/mikoto/Kconfig b/app/boards/arm/mikoto/Kconfig index 646d119c..71ec9411 100644 --- a/app/boards/arm/mikoto/Kconfig +++ b/app/boards/arm/mikoto/Kconfig @@ -1,12 +1,12 @@ config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on (BOARD_MIKOTO_520) + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_MIKOTO_520) choice BOARD_MIKOTO_CHARGER_CURRENT prompt "Charge current to supply to attached batteries" - depends on (BOARD_MIKOTO_520) + depends on (BOARD_MIKOTO_520) config BOARD_MIKOTO_CHARGER_CURRENT_40MA bool "40mA charge current, for battery capacity 40mAh or higher" diff --git a/app/boards/arm/mikoto/Kconfig.board b/app/boards/arm/mikoto/Kconfig.board index 067c2fbe..a872fa1f 100644 --- a/app/boards/arm/mikoto/Kconfig.board +++ b/app/boards/arm/mikoto/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_MIKOTO_520 - bool "mikoto_520" - depends on SOC_NRF52840_QIAA + bool "mikoto_520" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/mikoto/Kconfig.defconfig b/app/boards/arm/mikoto/Kconfig.defconfig index 6aafc613..8c7746db 100644 --- a/app/boards/arm/mikoto/Kconfig.defconfig +++ b/app/boards/arm/mikoto/Kconfig.defconfig @@ -6,29 +6,29 @@ if BOARD_MIKOTO_520 config BOARD - default "mikoto" + default "mikoto" if USB config USB_NRFX - default y + default y config USB_DEVICE_STACK - default y + default y endif # USB config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y config PINMUX - default y + default y choice BOARD_MIKOTO_CHARGER_CURRENT default BOARD_MIKOTO_CHARGER_CURRENT_100MA diff --git a/app/boards/arm/mikoto/arduino_pro_micro_pins.dtsi b/app/boards/arm/mikoto/arduino_pro_micro_pins.dtsi index 7c5cd12f..ed6097ec 100644 --- a/app/boards/arm/mikoto/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/mikoto/arduino_pro_micro_pins.dtsi @@ -6,50 +6,50 @@ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 4 0> /* D0 */ - , <1 0 &gpio0 8 0> /* D1 */ - , <2 0 &gpio0 17 0> /* D2 */ - , <3 0 &gpio0 20 0> /* D3 */ - , <4 0 &gpio0 22 0> /* D4/A6 */ - , <5 0 &gpio0 24 0> /* D5 */ - , <6 0 &gpio1 0 0> /* D6/A7 */ - , <7 0 &gpio1 2 0> /* D7 */ - , <8 0 &gpio1 4 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio0 9 0> /* D10/A10 */ - , <16 0 &gpio0 10 0> /* D16 */ - , <14 0 &gpio1 13 0> /* D14 */ - , <15 0 &gpio0 2 0> /* D15 */ - , <18 0 &gpio0 29 0> /* D18/A0 */ - , <19 0 &gpio0 31 0> /* D19/A1 */ - , <20 0 &gpio0 25 0> /* D20/A2 */ - , <21 0 &gpio0 11 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 4 0> /* D0 */ + , <1 0 &gpio0 8 0> /* D1 */ + , <2 0 &gpio0 17 0> /* D2 */ + , <3 0 &gpio0 20 0> /* D3 */ + , <4 0 &gpio0 22 0> /* D4/A6 */ + , <5 0 &gpio0 24 0> /* D5 */ + , <6 0 &gpio1 0 0> /* D6/A7 */ + , <7 0 &gpio1 2 0> /* D7 */ + , <8 0 &gpio1 4 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio0 9 0> /* D10/A10 */ + , <16 0 &gpio0 10 0> /* D16 */ + , <14 0 &gpio1 13 0> /* D14 */ + , <15 0 &gpio0 2 0> /* D15 */ + , <18 0 &gpio0 29 0> /* D18/A0 */ + , <19 0 &gpio0 31 0> /* D19/A1 */ + , <20 0 &gpio0 25 0> /* D20/A2 */ + , <21 0 &gpio0 11 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 29 0> /* D18/A0 */ - , <1 0 &gpio0 31 0> /* D19/A1 */ - , <2 0 &gpio0 25 0> /* D20/A2 */ - , <3 0 &gpio0 11 0> /* D21/A3 */ - , <6 0 &gpio0 22 0> /* D4/A6 */ - , <7 0 &gpio1 0 0> /* D6/A7 */ - , <8 0 &gpio1 4 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio0 9 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 29 0> /* D18/A0 */ + , <1 0 &gpio0 31 0> /* D19/A1 */ + , <2 0 &gpio0 25 0> /* D20/A2 */ + , <3 0 &gpio0 11 0> /* D21/A3 */ + , <6 0 &gpio0 22 0> /* D4/A6 */ + , <7 0 &gpio1 0 0> /* D6/A7 */ + , <8 0 &gpio1 4 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio0 9 0> /* D10/A10 */ + ; + }; }; diff --git a/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi b/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi index 4a8ff82c..df43c407 100644 --- a/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi +++ b/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/mikoto/mikoto_520.dts b/app/boards/arm/mikoto/mikoto_520.dts index 3fff0835..f8007033 100644 --- a/app/boards/arm/mikoto/mikoto_520.dts +++ b/app/boards/arm/mikoto/mikoto_520.dts @@ -10,117 +10,117 @@ #include "mikoto_520-pinctrl.dtsi" / { - model = "mikoto"; - compatible = "zhiayang,mikoto"; + model = "mikoto"; + compatible = "zhiayang,mikoto"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; - init-delay-ms = <50>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; + init-delay-ms = <50>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 1>; - output-ohms = <10000000>; - full-ohms = <(10000000 + 4000000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 1>; + output-ohms = <10000000>; + full-ohms = <(10000000 + 4000000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twi"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - current-speed = <115200>; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nice60/Kconfig b/app/boards/arm/nice60/Kconfig index db7cf398..dfca4f1b 100644 --- a/app/boards/arm/nice60/Kconfig +++ b/app/boards/arm/nice60/Kconfig @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on BOARD_NICE60 + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on BOARD_NICE60 diff --git a/app/boards/arm/nice60/Kconfig.board b/app/boards/arm/nice60/Kconfig.board index 778f79eb..88db9ee8 100644 --- a/app/boards/arm/nice60/Kconfig.board +++ b/app/boards/arm/nice60/Kconfig.board @@ -2,5 +2,5 @@ # SPDX-License-Identifier: MIT config BOARD_NICE60 - bool "nice!60" - depends on SOC_NRF52840_QIAA + bool "nice!60" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/nice60/Kconfig.defconfig b/app/boards/arm/nice60/Kconfig.defconfig index 39cf1540..f3347df9 100644 --- a/app/boards/arm/nice60/Kconfig.defconfig +++ b/app/boards/arm/nice60/Kconfig.defconfig @@ -4,22 +4,22 @@ if BOARD_NICE60 config ZMK_KEYBOARD_NAME - default "nice!60" + default "nice!60" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y endif # BOARD_NICE60 diff --git a/app/boards/arm/nice60/nice60-pinctrl.dtsi b/app/boards/arm/nice60/nice60-pinctrl.dtsi index ace80f10..9b0e198d 100644 --- a/app/boards/arm/nice60/nice60-pinctrl.dtsi +++ b/app/boards/arm/nice60/nice60-pinctrl.dtsi @@ -4,9 +4,9 @@ */ &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; }; diff --git a/app/boards/arm/nice60/nice60.dts b/app/boards/arm/nice60/nice60.dts index fdc65d6b..651dd555 100644 --- a/app/boards/arm/nice60/nice60.dts +++ b/app/boards/arm/nice60/nice60.dts @@ -13,170 +13,170 @@ #include "nice60-pinctrl.dtsi" / { - model = "nice!60"; - compatible = "nice,60"; + model = "nice!60"; + compatible = "nice,60"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - zmk,underglow = &led_strip; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + zmk,underglow = &led_strip; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; - map = < + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,13) RC(4,0) RC(4,1) RC(4,2) RC(4,5) RC(4,9) RC(4,10) RC(4,11) RC(4,13) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpio1 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&gpio1 15 GPIO_ACTIVE_HIGH> - , <&gpio0 29 GPIO_ACTIVE_HIGH> - , <&gpio0 31 GPIO_ACTIVE_HIGH> - , <&gpio0 30 GPIO_ACTIVE_HIGH> - , <&gpio0 28 GPIO_ACTIVE_HIGH> - , <&gpio0 2 GPIO_ACTIVE_HIGH> - , <&gpio0 3 GPIO_ACTIVE_HIGH> - , <&gpio1 3 GPIO_ACTIVE_HIGH> - , <&gpio1 7 GPIO_ACTIVE_HIGH> - , <&gpio1 4 GPIO_ACTIVE_HIGH> - , <&gpio1 6 GPIO_ACTIVE_HIGH> - , <&gpio1 5 GPIO_ACTIVE_HIGH> - , <&gpio1 1 GPIO_ACTIVE_HIGH> - , <&gpio1 2 GPIO_ACTIVE_HIGH> - ; - }; + diode-direction = "col2row"; + row-gpios + = <&gpio1 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpio1 15 GPIO_ACTIVE_HIGH> + , <&gpio0 29 GPIO_ACTIVE_HIGH> + , <&gpio0 31 GPIO_ACTIVE_HIGH> + , <&gpio0 30 GPIO_ACTIVE_HIGH> + , <&gpio0 28 GPIO_ACTIVE_HIGH> + , <&gpio0 2 GPIO_ACTIVE_HIGH> + , <&gpio0 3 GPIO_ACTIVE_HIGH> + , <&gpio1 3 GPIO_ACTIVE_HIGH> + , <&gpio1 7 GPIO_ACTIVE_HIGH> + , <&gpio1 4 GPIO_ACTIVE_HIGH> + , <&gpio1 6 GPIO_ACTIVE_HIGH> + , <&gpio1 5 GPIO_ACTIVE_HIGH> + , <&gpio1 1 GPIO_ACTIVE_HIGH> + , <&gpio1 2 GPIO_ACTIVE_HIGH> + ; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 806000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 806000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &spi3 { - compatible = "nordic,nrf-spim"; + compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi3_default>; - pinctrl-names = "default"; - status = "okay"; + pinctrl-0 = <&spi3_default>; + pinctrl-names = "default"; + status = "okay"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <12>; /* LED strip length */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - color-mapping = ; - }; + /* WS2812 */ + chain-length = <12>; /* LED strip length */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "mbr"; - reg = <0x00000000 0x00001000>; - }; + sd_partition: partition@0 { + label = "mbr"; + reg = <0x00000000 0x00001000>; + }; - code_partition: partition@1000 { - label = "code_partition"; - reg = <0x00001000 0x000d3000>; - }; + code_partition: partition@1000 { + label = "code_partition"; + reg = <0x00001000 0x000d3000>; + }; - /* - * The flash starting at 0x000d4000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000d4000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@d4000 { - label = "storage"; - reg = <0x000d4000 0x00020000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@d4000 { + label = "storage"; + reg = <0x000d4000 0x00020000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nice60/nice60.keymap b/app/boards/arm/nice60/nice60.keymap index edfec32e..3a357163 100644 --- a/app/boards/arm/nice60/nice60.keymap +++ b/app/boards/arm/nice60/nice60.keymap @@ -10,10 +10,10 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | @@ -21,16 +21,16 @@ // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | // | CTL | WIN | ALT | SPACE | ALT | WIN | MO(1) | CTL | // ------------------------------------------------------------------------------------------ - bindings = < - &gresc &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RGUI &mo 1 &kp RCTRL - >; - }; + bindings = < + &gresc &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RGUI &mo 1 &kp RCTRL + >; + }; - rgb_layer { + rgb_layer { // ------------------------------------------------------------------------------------------------ // | BT CLR | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | EFFECT REV | // | BT 1 | | UP | | HUEUP | SATUP | BRIUP | SPDUP | | | | | | | @@ -38,13 +38,13 @@ // | BT 3 | | | | | | | | | | | | // | BT 4 | | | TOG RGB | PRT SCR | | | DEL | // ------------------------------------------------------------------------------------------------ - bindings = < - &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &rgb_ug RGB_EFR - &bt BT_SEL 0 &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &trans &trans &trans &trans &trans &trans - &bt BT_SEL 1 &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &trans &trans &trans &trans &rgb_ug RGB_EFF - &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &bt BT_SEL 3 &trans &trans &rgb_ug RGB_TOG &kp PSCRN &trans &trans &kp DEL - >; - }; - }; + bindings = < + &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &rgb_ug RGB_EFR + &bt BT_SEL 0 &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &trans &trans &trans &trans &trans &trans + &bt BT_SEL 1 &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &trans &trans &trans &trans &rgb_ug RGB_EFF + &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &bt BT_SEL 3 &trans &trans &rgb_ug RGB_TOG &kp PSCRN &trans &trans &kp DEL + >; + }; + }; }; diff --git a/app/boards/arm/nice_nano/Kconfig b/app/boards/arm/nice_nano/Kconfig index 0c9fbc79..ac6828a4 100644 --- a/app/boards/arm/nice_nano/Kconfig +++ b/app/boards/arm/nice_nano/Kconfig @@ -1,7 +1,7 @@ # SPDX-License-Identifier: MIT config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on (BOARD_NICE_NANO || BOARD_NICE_NANO_V2) + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_NICE_NANO || BOARD_NICE_NANO_V2) diff --git a/app/boards/arm/nice_nano/Kconfig.board b/app/boards/arm/nice_nano/Kconfig.board index 4a80b448..8dd16512 100644 --- a/app/boards/arm/nice_nano/Kconfig.board +++ b/app/boards/arm/nice_nano/Kconfig.board @@ -4,10 +4,10 @@ # SPDX-License-Identifier: MIT config BOARD_NICE_NANO - bool "nice!nano" - depends on SOC_NRF52840_QIAA + bool "nice!nano" + depends on SOC_NRF52840_QIAA config BOARD_NICE_NANO_V2 - bool "nice!nano v2" - depends on SOC_NRF52840_QIAA + bool "nice!nano v2" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/nice_nano/Kconfig.defconfig b/app/boards/arm/nice_nano/Kconfig.defconfig index ad3fefef..ada59dd9 100644 --- a/app/boards/arm/nice_nano/Kconfig.defconfig +++ b/app/boards/arm/nice_nano/Kconfig.defconfig @@ -4,22 +4,22 @@ if BOARD_NICE_NANO || BOARD_NICE_NANO_V2 config BOARD - default "nice_nano" + default "nice_nano" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y endif # BOARD_NICE_NANO || BOARD_NICE_NANO_V2 diff --git a/app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi b/app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi index b972451b..f1b569c0 100644 --- a/app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi @@ -5,50 +5,50 @@ */ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 */ - , <1 0 &gpio0 6 0> /* D1 */ - , <2 0 &gpio0 17 0> /* D2 */ - , <3 0 &gpio0 20 0> /* D3 */ - , <4 0 &gpio0 22 0> /* D4/A6 */ - , <5 0 &gpio0 24 0> /* D5 */ - , <6 0 &gpio1 0 0> /* D6/A7 */ - , <7 0 &gpio0 11 0> /* D7 */ - , <8 0 &gpio1 4 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio0 9 0> /* D10/A10 */ - , <16 0 &gpio0 10 0> /* D16 */ - , <14 0 &gpio1 11 0> /* D14 */ - , <15 0 &gpio1 13 0> /* D15 */ - , <18 0 &gpio1 15 0> /* D18/A0 */ - , <19 0 &gpio0 2 0> /* D19/A1 */ - , <20 0 &gpio0 29 0> /* D20/A2 */ - , <21 0 &gpio0 31 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 17 0> /* D2 */ + , <3 0 &gpio0 20 0> /* D3 */ + , <4 0 &gpio0 22 0> /* D4/A6 */ + , <5 0 &gpio0 24 0> /* D5 */ + , <6 0 &gpio1 0 0> /* D6/A7 */ + , <7 0 &gpio0 11 0> /* D7 */ + , <8 0 &gpio1 4 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio0 9 0> /* D10/A10 */ + , <16 0 &gpio0 10 0> /* D16 */ + , <14 0 &gpio1 11 0> /* D14 */ + , <15 0 &gpio1 13 0> /* D15 */ + , <18 0 &gpio1 15 0> /* D18/A0 */ + , <19 0 &gpio0 2 0> /* D19/A1 */ + , <20 0 &gpio0 29 0> /* D20/A2 */ + , <21 0 &gpio0 31 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio1 15 0> /* D18/A0 */ - , <1 0 &gpio0 2 0> /* D19/A1 */ - , <2 0 &gpio0 29 0> /* D20/A2 */ - , <3 0 &gpio0 31 0> /* D21/A3 */ - , <6 0 &gpio0 22 0> /* D4/A6 */ - , <7 0 &gpio1 0 0> /* D6/A7 */ - , <8 0 &gpio1 4 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio0 9 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio1 15 0> /* D18/A0 */ + , <1 0 &gpio0 2 0> /* D19/A1 */ + , <2 0 &gpio0 29 0> /* D20/A2 */ + , <3 0 &gpio0 31 0> /* D21/A3 */ + , <6 0 &gpio0 22 0> /* D4/A6 */ + , <7 0 &gpio1 0 0> /* D6/A7 */ + , <8 0 &gpio1 4 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio0 9 0> /* D10/A10 */ + ; + }; }; pro_micro_d: &pro_micro {}; diff --git a/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi b/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi index 18b90f21..15c48509 100644 --- a/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi +++ b/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/nice_nano/nice_nano.dts b/app/boards/arm/nice_nano/nice_nano.dts index e29df205..4ee0df7f 100644 --- a/app/boards/arm/nice_nano/nice_nano.dts +++ b/app/boards/arm/nice_nano/nice_nano.dts @@ -8,21 +8,21 @@ #include "nice_nano.dtsi" / { - chosen { - zmk,battery = &vbatt; - }; + chosen { + zmk,battery = &vbatt; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 806000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 806000)>; + }; }; diff --git a/app/boards/arm/nice_nano/nice_nano.dtsi b/app/boards/arm/nice_nano/nice_nano.dtsi index ad5ef278..0c0a3823 100644 --- a/app/boards/arm/nice_nano/nice_nano.dtsi +++ b/app/boards/arm/nice_nano/nice_nano.dtsi @@ -9,101 +9,101 @@ #include "arduino_pro_micro_pins.dtsi" / { - model = "nice!nano"; - compatible = "nice,nano"; + model = "nice!nano"; + compatible = "nice,nano"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twi"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - current-speed = <115200>; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nice_nano/nice_nano_v2.dts b/app/boards/arm/nice_nano/nice_nano_v2.dts index ed2b35f4..b2fbcc81 100644 --- a/app/boards/arm/nice_nano/nice_nano_v2.dts +++ b/app/boards/arm/nice_nano/nice_nano_v2.dts @@ -8,19 +8,19 @@ #include "nice_nano.dtsi" / { - chosen { - zmk,battery = &vbatt; - }; + chosen { + zmk,battery = &vbatt; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; - init-delay-ms = <50>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; + init-delay-ms = <50>; + }; - vbatt: vbatt { - compatible = "zmk,battery-nrf-vddh"; - label = "BATTERY"; - }; + vbatt: vbatt { + compatible = "zmk,battery-nrf-vddh"; + label = "BATTERY"; + }; }; diff --git a/app/boards/arm/nrf52840_m2/Kconfig b/app/boards/arm/nrf52840_m2/Kconfig index c7edeb8d..c9cb6523 100644 --- a/app/boards/arm/nrf52840_m2/Kconfig +++ b/app/boards/arm/nrf52840_m2/Kconfig @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on BOARD_NRF52840_M2 + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on BOARD_NRF52840_M2 diff --git a/app/boards/arm/nrf52840_m2/Kconfig.board b/app/boards/arm/nrf52840_m2/Kconfig.board index 49901039..b2927ff2 100644 --- a/app/boards/arm/nrf52840_m2/Kconfig.board +++ b/app/boards/arm/nrf52840_m2/Kconfig.board @@ -4,6 +4,6 @@ # SPDX-License-Identifier: MIT config BOARD_NRF52840_M2 - bool "nrf52480_m2" - depends on SOC_NRF52840_QIAA + bool "nrf52480_m2" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/nrf52840_m2/Kconfig.defconfig b/app/boards/arm/nrf52840_m2/Kconfig.defconfig index 4e1679ba..50a049bb 100644 --- a/app/boards/arm/nrf52840_m2/Kconfig.defconfig +++ b/app/boards/arm/nrf52840_m2/Kconfig.defconfig @@ -4,22 +4,22 @@ if BOARD_NRF52840_M2 config BOARD - default "nrf52480_m2" + default "nrf52480_m2" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y endif # BOARD_NRF52840_M2 diff --git a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts index dc22c40b..253e6b77 100644 --- a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts +++ b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts @@ -8,105 +8,105 @@ #include / { - model = "Makerdiary nRF52840 M.2 module"; - compatible = "makerdiary,nrf52840_m2"; + model = "Makerdiary nRF52840 M.2 module"; + compatible = "makerdiary,nrf52840_m2"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - red_led: led_0 { - gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>; - label = "Red LED"; - }; - green_led: led_1 { - gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>; - label = "Green LED"; - }; - blue_led: led_2 { - gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + red_led: led_0 { + gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>; + label = "Red LED"; + }; + green_led: led_1 { + gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>; + label = "Green LED"; + }; + blue_led: led_2 { + gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 0>; - output-ohms = <1000000>; - full-ohms = <(1000000 + 1000000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1000000>; + full-ohms = <(1000000 + 1000000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &usbd { - compatible = "nordic,nrf-usbd"; - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + compatible = "nordic,nrf-usbd"; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/Kconfig b/app/boards/arm/nrfmicro/Kconfig index 12b06621..233ddbad 100644 --- a/app/boards/arm/nrfmicro/Kconfig +++ b/app/boards/arm/nrfmicro/Kconfig @@ -1,10 +1,10 @@ config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on (BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) config BOARD_NRFMICRO_CHARGER - bool "Enable battery charger" - default y - depends on (BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) + bool "Enable battery charger" + default y + depends on (BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) diff --git a/app/boards/arm/nrfmicro/Kconfig.board b/app/boards/arm/nrfmicro/Kconfig.board index 244242a9..441de5cf 100644 --- a/app/boards/arm/nrfmicro/Kconfig.board +++ b/app/boards/arm/nrfmicro/Kconfig.board @@ -4,17 +4,17 @@ # SPDX-License-Identifier: MIT config BOARD_NRFMICRO_11 - bool "nrfmicro_11" - depends on SOC_NRF52840_QIAA + bool "nrfmicro_11" + depends on SOC_NRF52840_QIAA config BOARD_NRFMICRO_11_FLIPPED - bool "nrfmicro_11_flipped" - depends on SOC_NRF52840_QIAA + bool "nrfmicro_11_flipped" + depends on SOC_NRF52840_QIAA config BOARD_NRFMICRO_13 - bool "nrfmicro_13" - depends on SOC_NRF52840_QIAA + bool "nrfmicro_13" + depends on SOC_NRF52840_QIAA config BOARD_NRFMICRO_13_52833 - bool "nrfmicro_13_52833" - depends on SOC_NRF52833_QIAA + bool "nrfmicro_13_52833" + depends on SOC_NRF52833_QIAA diff --git a/app/boards/arm/nrfmicro/Kconfig.defconfig b/app/boards/arm/nrfmicro/Kconfig.defconfig index 751d592b..7d752ac6 100644 --- a/app/boards/arm/nrfmicro/Kconfig.defconfig +++ b/app/boards/arm/nrfmicro/Kconfig.defconfig @@ -6,31 +6,31 @@ if BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 config BOARD - default "nrfmicro" + default "nrfmicro" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y config PINMUX - default y + default y -if BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 +if BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 config BOARD_NRFMICRO_CHARGER - default y + default y endif # BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 diff --git a/app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi b/app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi index 537aaed3..01e342c0 100644 --- a/app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi @@ -6,50 +6,50 @@ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 */ - , <1 0 &gpio0 6 0> /* D1 */ - , <2 0 &gpio0 15 0> /* D2 */ - , <3 0 &gpio0 17 0> /* D3 */ - , <4 0 &gpio0 20 0> /* D4/A6 */ - , <5 0 &gpio0 13 0> /* D5 */ - , <6 0 &gpio0 24 0> /* D6/A7 */ - , <7 0 &gpio0 9 0> /* D7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 11 0> /* D10/A10 */ - , <16 0 &gpio0 28 0> /* D16 */ - , <14 0 &gpio0 3 0> /* D14 */ - , <15 0 &gpio1 13 0> /* D15 */ - , <18 0 &gpio0 2 0> /* D18/A0 */ - , <19 0 &gpio0 29 0> /* D19/A1 */ - , <20 0 &gpio0 31 0> /* D20/A2 */ - , <21 0 &gpio0 30 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 15 0> /* D2 */ + , <3 0 &gpio0 17 0> /* D3 */ + , <4 0 &gpio0 20 0> /* D4/A6 */ + , <5 0 &gpio0 13 0> /* D5 */ + , <6 0 &gpio0 24 0> /* D6/A7 */ + , <7 0 &gpio0 9 0> /* D7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + , <16 0 &gpio0 28 0> /* D16 */ + , <14 0 &gpio0 3 0> /* D14 */ + , <15 0 &gpio1 13 0> /* D15 */ + , <18 0 &gpio0 2 0> /* D18/A0 */ + , <19 0 &gpio0 29 0> /* D19/A1 */ + , <20 0 &gpio0 31 0> /* D20/A2 */ + , <21 0 &gpio0 30 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 2 0> /* D18/A0 */ - , <1 0 &gpio0 29 0> /* D19/A1 */ - , <2 0 &gpio0 31 0> /* D20/A2 */ - , <3 0 &gpio0 30 0> /* D21/A3 */ - , <6 0 &gpio0 20 0> /* D4/A6 */ - , <7 0 &gpio0 24 0> /* D6/A7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 11 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 2 0> /* D18/A0 */ + , <1 0 &gpio0 29 0> /* D19/A1 */ + , <2 0 &gpio0 31 0> /* D20/A2 */ + , <3 0 &gpio0 30 0> /* D21/A3 */ + , <6 0 &gpio0 20 0> /* D4/A6 */ + , <7 0 &gpio0 24 0> /* D6/A7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + ; + }; }; diff --git a/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi index 651edb94..76ece25f 100644 --- a/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi +++ b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi @@ -6,50 +6,50 @@ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 */ - , <1 0 &gpio0 6 0> /* D1 */ - , <2 0 &gpio0 15 0> /* D2 */ - , <3 0 &gpio0 17 0> /* D3 */ - , <4 0 &gpio0 20 0> /* D4/A6 */ - , <5 0 &gpio0 13 0> /* D5 */ - , <6 0 &gpio0 24 0> /* D6/A7 */ - , <7 0 &gpio0 9 0> /* D7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 4 0> /* D10/A10 */ - , <16 0 &gpio0 28 0> /* D16 */ - , <14 0 &gpio0 3 0> /* D14 */ - , <15 0 &gpio1 5 0> /* D15 */ - , <18 0 &gpio0 2 0> /* D18/A0 */ - , <19 0 &gpio0 29 0> /* D19/A1 */ - , <20 0 &gpio0 31 0> /* D20/A2 */ - , <21 0 &gpio0 30 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 15 0> /* D2 */ + , <3 0 &gpio0 17 0> /* D3 */ + , <4 0 &gpio0 20 0> /* D4/A6 */ + , <5 0 &gpio0 13 0> /* D5 */ + , <6 0 &gpio0 24 0> /* D6/A7 */ + , <7 0 &gpio0 9 0> /* D7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 4 0> /* D10/A10 */ + , <16 0 &gpio0 28 0> /* D16 */ + , <14 0 &gpio0 3 0> /* D14 */ + , <15 0 &gpio1 5 0> /* D15 */ + , <18 0 &gpio0 2 0> /* D18/A0 */ + , <19 0 &gpio0 29 0> /* D19/A1 */ + , <20 0 &gpio0 31 0> /* D20/A2 */ + , <21 0 &gpio0 30 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 2 0> /* D18/A0 */ - , <1 0 &gpio0 29 0> /* D19/A1 */ - , <2 0 &gpio0 31 0> /* D20/A2 */ - , <3 0 &gpio0 30 0> /* D21/A3 */ - , <6 0 &gpio0 20 0> /* D4/A6 */ - , <7 0 &gpio0 24 0> /* D6/A7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 11 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 2 0> /* D18/A0 */ + , <1 0 &gpio0 29 0> /* D19/A1 */ + , <2 0 &gpio0 31 0> /* D20/A2 */ + , <3 0 &gpio0 30 0> /* D21/A3 */ + , <6 0 &gpio0 20 0> /* D4/A6 */ + , <7 0 &gpio0 24 0> /* D6/A7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + ; + }; }; diff --git a/app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi index 887a3144..923efbbf 100644 --- a/app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi +++ b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi @@ -5,50 +5,50 @@ */ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 */ - , <1 0 &gpio0 6 0> /* D1 */ - , <2 0 &gpio0 30 0> /* D2 */ - , <3 0 &gpio0 31 0> /* D3 */ - , <4 0 &gpio0 29 0> /* D4/A6 */ - , <5 0 &gpio0 2 0> /* D5 */ - , <6 0 &gpio1 13 0> /* D6/A7 */ - , <7 0 &gpio0 3 0> /* D7 */ - , <8 0 &gpio0 28 0> /* D8/A8 */ - , <9 0 &gpio1 11 0> /* D9/A9 */ - , <10 0 &gpio1 6 0> /* D10/A10 */ - , <16 0 &gpio0 10 0> /* D16 */ - , <14 0 &gpio0 9 0> /* D14 */ - , <15 0 &gpio0 24 0> /* D15 */ - , <18 0 &gpio0 13 0> /* D18/A0 */ - , <19 0 &gpio0 20 0> /* D19/A1 */ - , <20 0 &gpio0 17 0> /* D20/A2 */ - , <21 0 &gpio0 15 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 30 0> /* D2 */ + , <3 0 &gpio0 31 0> /* D3 */ + , <4 0 &gpio0 29 0> /* D4/A6 */ + , <5 0 &gpio0 2 0> /* D5 */ + , <6 0 &gpio1 13 0> /* D6/A7 */ + , <7 0 &gpio0 3 0> /* D7 */ + , <8 0 &gpio0 28 0> /* D8/A8 */ + , <9 0 &gpio1 11 0> /* D9/A9 */ + , <10 0 &gpio1 6 0> /* D10/A10 */ + , <16 0 &gpio0 10 0> /* D16 */ + , <14 0 &gpio0 9 0> /* D14 */ + , <15 0 &gpio0 24 0> /* D15 */ + , <18 0 &gpio0 13 0> /* D18/A0 */ + , <19 0 &gpio0 20 0> /* D19/A1 */ + , <20 0 &gpio0 17 0> /* D20/A2 */ + , <21 0 &gpio0 15 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 13 0> /* D18/A0 */ - , <1 0 &gpio0 20 0> /* D19/A1 */ - , <2 0 &gpio0 17 0> /* D20/A2 */ - , <3 0 &gpio0 15 0> /* D21/A3 */ - , <6 0 &gpio0 29 0> /* D4/A6 */ - , <7 0 &gpio1 13 0> /* D6/A7 */ - , <8 0 &gpio0 28 0> /* D8/A8 */ - , <9 0 &gpio1 11 0> /* D9/A9 */ - , <10 0 &gpio1 6 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 13 0> /* D18/A0 */ + , <1 0 &gpio0 20 0> /* D19/A1 */ + , <2 0 &gpio0 17 0> /* D20/A2 */ + , <3 0 &gpio0 15 0> /* D21/A3 */ + , <6 0 &gpio0 29 0> /* D4/A6 */ + , <7 0 &gpio1 13 0> /* D6/A7 */ + , <8 0 &gpio0 28 0> /* D8/A8 */ + , <9 0 &gpio1 11 0> /* D9/A9 */ + , <10 0 &gpio1 6 0> /* D10/A10 */ + ; + }; }; pro_micro_d: &pro_micro {}; diff --git a/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi b/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi index a54c2598..22bc11d4 100644 --- a/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi +++ b/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi b/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi index a5385690..35a46e5a 100644 --- a/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi +++ b/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11.dts b/app/boards/arm/nrfmicro/nrfmicro_11.dts index 48186ac9..68331edc 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11.dts @@ -10,102 +10,102 @@ #include "nrfmicro-pinctrl.dtsi" / { - model = "nrfmicro"; - compatible = "joric,nrfmicro"; + model = "nrfmicro"; + compatible = "joric,nrfmicro"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; + }; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twim"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts index 656873a0..9977617c 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts @@ -10,102 +10,102 @@ #include "nrfmicro-flipped-pinctrl.dtsi" / { - model = "nrfmicro"; - compatible = "joric,nrfmicro"; + model = "nrfmicro"; + compatible = "joric,nrfmicro"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; + }; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twim"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13.dts b/app/boards/arm/nrfmicro/nrfmicro_13.dts index 9fb68562..300838ff 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13.dts @@ -10,115 +10,115 @@ #include "nrfmicro-pinctrl.dtsi" / { - model = "nrfmicro"; - compatible = "joric,nrfmicro"; + model = "nrfmicro"; + compatible = "joric,nrfmicro"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twim"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts index 9ade364d..86bcb5e5 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts @@ -10,115 +10,115 @@ #include "nrfmicro-pinctrl.dtsi" / { - model = "nrfmicro"; - compatible = "joric,nrfmicro"; + model = "nrfmicro"; + compatible = "joric,nrfmicro"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twim"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x00046000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x00046000>; + }; - /* - * The flash starting at 0x0006c000 and ending at - * 0x00073fff is reserved for use by the application. - */ + /* + * The flash starting at 0x0006c000 and ending at + * 0x00073fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@6c000 { - label = "storage"; - reg = <0x0006c000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@6c000 { + label = "storage"; + reg = <0x0006c000 0x00008000>; + }; - boot_partition: partition@74000 { - label = "adafruit_boot"; - reg = <0x00074000 0x0000c000>; - }; - }; + boot_partition: partition@74000 { + label = "adafruit_boot"; + reg = <0x00074000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/pillbug/pillbug-pinctrl.dtsi b/app/boards/arm/pillbug/pillbug-pinctrl.dtsi index 8751bc4b..8a9e9fc2 100644 --- a/app/boards/arm/pillbug/pillbug-pinctrl.dtsi +++ b/app/boards/arm/pillbug/pillbug-pinctrl.dtsi @@ -4,53 +4,53 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - spi1_default: spi1_default { - group1 { - psels = , - , - ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = , + , + ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/planck/Kconfig.board b/app/boards/arm/planck/Kconfig.board index fe15e1a9..28b7381f 100644 --- a/app/boards/arm/planck/Kconfig.board +++ b/app/boards/arm/planck/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_PLANCK_REV6 - bool "Planck V6 Keyboard" - depends on SOC_STM32F303XC + bool "Planck V6 Keyboard" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/planck/Kconfig.defconfig b/app/boards/arm/planck/Kconfig.defconfig index 913c1c13..d1304da0 100644 --- a/app/boards/arm/planck/Kconfig.defconfig +++ b/app/boards/arm/planck/Kconfig.defconfig @@ -6,10 +6,10 @@ if BOARD_PLANCK_REV6 config ZMK_KEYBOARD_NAME - default "Planck V6" + default "Planck V6" config ZMK_USB - default y + default y config ZMK_KSCAN_MATRIX_POLLING default y diff --git a/app/boards/arm/planck/planck_rev6.dts b/app/boards/arm/planck/planck_rev6.dts index 97239595..5fdd2c21 100644 --- a/app/boards/arm/planck/planck_rev6.dts +++ b/app/boards/arm/planck/planck_rev6.dts @@ -10,123 +10,123 @@ #include / { - model = "Plack PCD, rev6"; - compatible = "planck,rev6", "st,stm32f303"; + model = "Plack PCD, rev6"; + compatible = "planck,rev6", "st,stm32f303"; - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,kscan = &kscan0; - zmk,matrix_transform = &layout_grid_transform; - }; + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,kscan = &kscan0; + zmk,matrix_transform = &layout_grid_transform; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; diode-direction = "col2row"; - row-gpios - = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioc 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioc 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioc 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioa 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&gpiob 11 GPIO_ACTIVE_HIGH> - , <&gpiob 10 GPIO_ACTIVE_HIGH> - , <&gpiob 2 GPIO_ACTIVE_HIGH> - , <&gpiob 1 GPIO_ACTIVE_HIGH> - , <&gpioa 7 GPIO_ACTIVE_HIGH> - , <&gpiob 0 GPIO_ACTIVE_HIGH> - ; - }; + row-gpios + = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioc 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioc 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioc 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpiob 11 GPIO_ACTIVE_HIGH> + , <&gpiob 10 GPIO_ACTIVE_HIGH> + , <&gpiob 2 GPIO_ACTIVE_HIGH> + , <&gpiob 1 GPIO_ACTIVE_HIGH> + , <&gpioa 7 GPIO_ACTIVE_HIGH> + , <&gpiob 0 GPIO_ACTIVE_HIGH> + ; + }; layout_grid_transform: - keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <6>; - rows = <8>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) - RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,4) RC(7,5) RC(7,0) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) - >; - }; + keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <6>; + rows = <8>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) + RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,4) RC(7,5) RC(7,0) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) + >; + }; layout_mit_transform: - keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <6>; - rows = <8>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) - RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,4) RC(7,0) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) - >; - }; + keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <6>; + rows = <8>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) + RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,4) RC(7,0) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) + >; + }; layout_2x2u_transform: - keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <6>; - rows = <8>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) - RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,5) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) - >; - }; + keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <6>; + rows = <8>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) + RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,5) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) + >; + }; }; &usb { - pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; - pinctrl-names = "default"; - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; + pinctrl-names = "default"; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &clk_hse { - status = "okay"; - clock-frequency = ; + status = "okay"; + clock-frequency = ; }; &pll { - prediv = <1>; - mul = <9>; - clocks = <&clk_hse>; - status = "okay"; + prediv = <1>; + mul = <9>; + clocks = <&clk_hse>; + status = "okay"; }; &rcc { - clocks = <&pll>; - clock-frequency = ; - ahb-prescaler = <1>; - apb1-prescaler = <2>; - apb2-prescaler = <1>; + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <2>; + apb2-prescaler = <1>; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - /* Set 6Kb of storage at the end of the 256Kb of flash */ - storage_partition: partition@3e800 { - label = "storage"; - reg = <0x0003e800 0x00001800>; - }; - }; + /* Set 6Kb of storage at the end of the 256Kb of flash */ + storage_partition: partition@3e800 { + label = "storage"; + reg = <0x0003e800 0x00001800>; + }; + }; }; diff --git a/app/boards/arm/planck/planck_rev6.keymap b/app/boards/arm/planck/planck_rev6.keymap index 7e4f6732..65138057 100644 --- a/app/boards/arm/planck/planck_rev6.keymap +++ b/app/boards/arm/planck/planck_rev6.keymap @@ -8,39 +8,39 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - // ----------------------------------------------------------------------------------------- - // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | - // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | - // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | - bindings = < - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC - &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET - &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &trans &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT - >; - }; + default_layer { + // ----------------------------------------------------------------------------------------- + // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | + // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | + // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | + bindings = < + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET + &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &trans &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + >; + }; - lower { - bindings = < - &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL - &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE - &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(HASH) &kp LS(BSLH) &kp HOME &kp END &trans - &trans &trans &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP - >; - }; + lower { + bindings = < + &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(HASH) &kp LS(BSLH) &kp HOME &kp END &trans + &trans &trans &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + >; + }; - raise { - bindings = < - &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC - &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH - &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans - &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP - >; - }; - }; + raise { + bindings = < + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans + &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + >; + }; + }; }; diff --git a/app/boards/arm/preonic/Kconfig.board b/app/boards/arm/preonic/Kconfig.board index a930b90f..39f35db6 100644 --- a/app/boards/arm/preonic/Kconfig.board +++ b/app/boards/arm/preonic/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_PREONIC_REV3 - bool "Preonic V3 Keyboard" - depends on SOC_STM32F303XC + bool "Preonic V3 Keyboard" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/proton_c/Kconfig.board b/app/boards/arm/proton_c/Kconfig.board index ffa7ffd6..1596077f 100644 --- a/app/boards/arm/proton_c/Kconfig.board +++ b/app/boards/arm/proton_c/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_QMK_PROTON_C - bool "QMK Proton-C" - depends on SOC_STM32F303XC + bool "QMK Proton-C" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/proton_c/Kconfig.defconfig b/app/boards/arm/proton_c/Kconfig.defconfig index 78ccbabd..f5089119 100644 --- a/app/boards/arm/proton_c/Kconfig.defconfig +++ b/app/boards/arm/proton_c/Kconfig.defconfig @@ -6,9 +6,9 @@ if BOARD_QMK_PROTON_C config BOARD - default "proton_c" + default "proton_c" config ZMK_USB - default y + default y endif # BOARD_QMK_PROTON_C diff --git a/app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi b/app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi index 9a026adf..18311942 100644 --- a/app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi @@ -5,50 +5,50 @@ */ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpioa 10 0> /* D0 */ - , <1 0 &gpioa 9 0> /* D1 */ - , <2 0 &gpiob 7 0> /* D2 */ - , <3 0 &gpiob 6 0> /* D3 */ - , <4 0 &gpiob 5 0> /* D4/A6 */ - , <5 0 &gpiob 4 0> /* D5 */ - , <6 0 &gpiob 3 0> /* D6/A7 */ - , <7 0 &gpiob 2 0> /* D7 */ - , <8 0 &gpiob 1 0> /* D8/A8 */ - , <9 0 &gpiob 0 0> /* D9/A9 */ - , <10 0 &gpiob 9 0> /* D10/A10 */ - , <16 0 &gpiob 15 0> /* D16 */ - , <14 0 &gpiob 14 0> /* D14 */ - , <15 0 &gpiob 13 0> /* D15 */ - , <18 0 &gpiob 8 0> /* D18/A0 */ - , <19 0 &gpioa 0 0> /* D19/A1 */ - , <20 0 &gpioa 1 0> /* D20/A2 */ - , <21 0 &gpioa 2 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpioa 10 0> /* D0 */ + , <1 0 &gpioa 9 0> /* D1 */ + , <2 0 &gpiob 7 0> /* D2 */ + , <3 0 &gpiob 6 0> /* D3 */ + , <4 0 &gpiob 5 0> /* D4/A6 */ + , <5 0 &gpiob 4 0> /* D5 */ + , <6 0 &gpiob 3 0> /* D6/A7 */ + , <7 0 &gpiob 2 0> /* D7 */ + , <8 0 &gpiob 1 0> /* D8/A8 */ + , <9 0 &gpiob 0 0> /* D9/A9 */ + , <10 0 &gpiob 9 0> /* D10/A10 */ + , <16 0 &gpiob 15 0> /* D16 */ + , <14 0 &gpiob 14 0> /* D14 */ + , <15 0 &gpiob 13 0> /* D15 */ + , <18 0 &gpiob 8 0> /* D18/A0 */ + , <19 0 &gpioa 0 0> /* D19/A1 */ + , <20 0 &gpioa 1 0> /* D20/A2 */ + , <21 0 &gpioa 2 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpiob 8 0> /* D18/A0 */ - , <1 0 &gpioa 0 0> /* D19/A1 */ - , <2 0 &gpioa 1 0> /* D20/A2 */ - , <3 0 &gpioa 2 0> /* D21/A3 */ - , <6 0 &gpiob 5 0> /* D4/A6 */ - , <7 0 &gpiob 3 0> /* D6/A7 */ - , <8 0 &gpiob 1 0> /* D8/A8 */ - , <9 0 &gpiob 0 0> /* D9/A9 */ - , <10 0 &gpiob 9 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpiob 8 0> /* D18/A0 */ + , <1 0 &gpioa 0 0> /* D19/A1 */ + , <2 0 &gpioa 1 0> /* D20/A2 */ + , <3 0 &gpioa 2 0> /* D21/A3 */ + , <6 0 &gpiob 5 0> /* D4/A6 */ + , <7 0 &gpiob 3 0> /* D6/A7 */ + , <8 0 &gpiob 1 0> /* D8/A8 */ + , <9 0 &gpiob 0 0> /* D9/A9 */ + , <10 0 &gpiob 9 0> /* D10/A10 */ + ; + }; }; pro_micro_d: &pro_micro {}; diff --git a/app/boards/arm/proton_c/proton_c.dts b/app/boards/arm/proton_c/proton_c.dts index df63427f..b5a490ee 100644 --- a/app/boards/arm/proton_c/proton_c.dts +++ b/app/boards/arm/proton_c/proton_c.dts @@ -10,91 +10,91 @@ #include "arduino_pro_micro_pins.dtsi" / { - model = "QMK Proton C"; - compatible = "qmk,proton_c", "st,stm32f303"; + model = "QMK Proton C"; + compatible = "qmk,proton_c", "st,stm32f303"; - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart0; - }; + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart0; + }; - aliases { - led0 = &led; - }; + aliases { + led0 = &led; + }; - leds { - compatible = "gpio-leds"; - led: led_0 { - gpios = <&gpioc 13 GPIO_ACTIVE_HIGH>; - label = "User LED"; - }; - }; + leds { + compatible = "gpio-leds"; + led: led_0 { + gpios = <&gpioc 13 GPIO_ACTIVE_HIGH>; + label = "User LED"; + }; + }; }; &usart1 { - pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>; - pinctrl-names = "default"; + pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>; + pinctrl-names = "default"; }; &spi2 { - pinctrl-0 = <&spi2_sck_pb13 &spi2_miso_pb14 &spi2_mosi_pb15>; - pinctrl-names = "default"; + pinctrl-0 = <&spi2_sck_pb13 &spi2_miso_pb14 &spi2_mosi_pb15>; + pinctrl-names = "default"; }; &i2c1 { - pinctrl-0 = <&i2c1_scl_pb6 &i2c1_sda_pb7>; - pinctrl-names = "default"; + pinctrl-0 = <&i2c1_scl_pb6 &i2c1_sda_pb7>; + pinctrl-names = "default"; }; &clk_hse { - status = "okay"; - clock-frequency = ; + status = "okay"; + clock-frequency = ; }; &pll { - prediv = <1>; - mul = <9>; - clocks = <&clk_hse>; - status = "okay"; + prediv = <1>; + mul = <9>; + clocks = <&clk_hse>; + status = "okay"; }; &rcc { - clocks = <&pll>; - clock-frequency = ; - ahb-prescaler = <1>; - apb1-prescaler = <2>; - apb2-prescaler = <1>; + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <2>; + apb2-prescaler = <1>; }; &usb { - pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; - pinctrl-names = "default"; - status = "okay"; - cdc_acm_uart0: cdc_acm_uart0 { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; + pinctrl-names = "default"; + status = "okay"; + cdc_acm_uart0: cdc_acm_uart0 { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &rtc { - status = "okay"; + status = "okay"; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - /* Set 6Kb of storage at the end of the 256Kb of flash */ - storage_partition: partition@3e800 { - label = "storage"; - reg = <0x0003e800 0x00001800>; - }; - }; + /* Set 6Kb of storage at the end of the 256Kb of flash */ + storage_partition: partition@3e800 { + label = "storage"; + reg = <0x0003e800 0x00001800>; + }; + }; }; diff --git a/app/boards/arm/puchi_ble/Kconfig.board b/app/boards/arm/puchi_ble/Kconfig.board index 07638885..0f5b7f96 100644 --- a/app/boards/arm/puchi_ble/Kconfig.board +++ b/app/boards/arm/puchi_ble/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_PUCHI_BLE_v1 - bool "puchi_ble_v1" - depends on SOC_NRF52840_QIAA + bool "puchi_ble_v1" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/puchi_ble/Kconfig.defconfig b/app/boards/arm/puchi_ble/Kconfig.defconfig index 94d12c17..c4fca8e1 100644 --- a/app/boards/arm/puchi_ble/Kconfig.defconfig +++ b/app/boards/arm/puchi_ble/Kconfig.defconfig @@ -4,25 +4,25 @@ if BOARD_PUCHI_BLE_v1 config BOARD - default "puchi_ble" + default "puchi_ble" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y config PINMUX - default y + default y endif # BOARD_PUCHI_BLE_v1 diff --git a/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi b/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi index ed3317f1..3037ea3e 100644 --- a/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi @@ -6,50 +6,50 @@ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 */ - , <1 0 &gpio0 6 0> /* D1 */ - , <2 0 &gpio0 15 0> /* D2 */ - , <3 0 &gpio0 17 0> /* D3 */ - , <4 0 &gpio0 20 0> /* D4/A6 */ - , <5 0 &gpio0 13 0> /* D5 */ - , <6 0 &gpio0 24 0> /* D6/A7 */ - , <7 0 &gpio0 9 0> /* D7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 11 0> /* D10/A10 */ - , <16 0 &gpio0 28 0> /* D16 */ - , <14 0 &gpio0 3 0> /* D14 */ - , <15 0 &gpio1 13 0> /* D15 */ - , <18 0 &gpio0 2 0> /* D18/A0 */ - , <19 0 &gpio0 29 0> /* D19/A1 */ - , <20 0 &gpio0 31 0> /* D20/A2 */ - , <21 0 &gpio0 30 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 15 0> /* D2 */ + , <3 0 &gpio0 17 0> /* D3 */ + , <4 0 &gpio0 20 0> /* D4/A6 */ + , <5 0 &gpio0 13 0> /* D5 */ + , <6 0 &gpio0 24 0> /* D6/A7 */ + , <7 0 &gpio0 9 0> /* D7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + , <16 0 &gpio0 28 0> /* D16 */ + , <14 0 &gpio0 3 0> /* D14 */ + , <15 0 &gpio1 13 0> /* D15 */ + , <18 0 &gpio0 2 0> /* D18/A0 */ + , <19 0 &gpio0 29 0> /* D19/A1 */ + , <20 0 &gpio0 31 0> /* D20/A2 */ + , <21 0 &gpio0 30 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 2 0> /* D18/A0 */ - , <1 0 &gpio0 29 0> /* D19/A1 */ - , <2 0 &gpio0 31 0> /* D20/A2 */ - , <3 0 &gpio0 30 0> /* D21/A3 */ - , <6 0 &gpio0 20 0> /* D4/A6 */ - , <7 0 &gpio0 24 0> /* D6/A7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 11 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 2 0> /* D18/A0 */ + , <1 0 &gpio0 29 0> /* D19/A1 */ + , <2 0 &gpio0 31 0> /* D20/A2 */ + , <3 0 &gpio0 30 0> /* D21/A3 */ + , <6 0 &gpio0 20 0> /* D4/A6 */ + , <7 0 &gpio0 24 0> /* D6/A7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + ; + }; }; diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi b/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi index a5385690..35a46e5a 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi +++ b/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1.dts b/app/boards/arm/puchi_ble/puchi_ble_v1.dts index a8f25c37..b056f711 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1.dts +++ b/app/boards/arm/puchi_ble/puchi_ble_v1.dts @@ -10,115 +10,115 @@ #include "puchi_ble_v1-pinctrl.dtsi" / { - model = "puchi_ble"; - compatible = "puchi_ble"; + model = "puchi_ble"; + compatible = "puchi_ble"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twi"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/s40nc/Kconfig.board b/app/boards/arm/s40nc/Kconfig.board index 673e3b24..e703d726 100644 --- a/app/boards/arm/s40nc/Kconfig.board +++ b/app/boards/arm/s40nc/Kconfig.board @@ -2,5 +2,5 @@ # SPDX-License-Identifier: MIT config BOARD_S40NC - bool "S40NC" - depends on SOC_NRF52840_QIAA + bool "S40NC" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/s40nc/Kconfig.defconfig b/app/boards/arm/s40nc/Kconfig.defconfig index 266f8443..11e62cf5 100644 --- a/app/boards/arm/s40nc/Kconfig.defconfig +++ b/app/boards/arm/s40nc/Kconfig.defconfig @@ -4,25 +4,25 @@ if BOARD_S40NC config ZMK_KEYBOARD_NAME - default "S40NC" + default "S40NC" if USB config USB_NRFX - default y + default y config USB_DEVICE_STACK - default y + default y endif # USB config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y endif # BOARD_S40NC diff --git a/app/boards/arm/s40nc/s40nc.dts b/app/boards/arm/s40nc/s40nc.dts index 5b588b45..6eb9e2a5 100644 --- a/app/boards/arm/s40nc/s40nc.dts +++ b/app/boards/arm/s40nc/s40nc.dts @@ -9,137 +9,137 @@ #include / { - model = "S40NC"; - compatible = "s40nc"; + model = "S40NC"; + compatible = "s40nc"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; - map = < + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,11) RC(2,0) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,4) RC(3,6) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&gpio1 2 GPIO_ACTIVE_HIGH> - , <&gpio1 1 GPIO_ACTIVE_HIGH> - , <&gpio1 3 GPIO_ACTIVE_HIGH> - , <&gpio1 0 GPIO_ACTIVE_HIGH> - , <&gpio0 22 GPIO_ACTIVE_HIGH> - , <&gpio1 15 GPIO_ACTIVE_HIGH> - , <&gpio0 3 GPIO_ACTIVE_HIGH> - , <&gpio0 2 GPIO_ACTIVE_HIGH> - , <&gpio0 28 GPIO_ACTIVE_HIGH> - , <&gpio0 29 GPIO_ACTIVE_HIGH> - , <&gpio0 30 GPIO_ACTIVE_HIGH> - , <&gpio0 31 GPIO_ACTIVE_HIGH> - ; - }; + diode-direction = "col2row"; + row-gpios + = <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpio1 2 GPIO_ACTIVE_HIGH> + , <&gpio1 1 GPIO_ACTIVE_HIGH> + , <&gpio1 3 GPIO_ACTIVE_HIGH> + , <&gpio1 0 GPIO_ACTIVE_HIGH> + , <&gpio0 22 GPIO_ACTIVE_HIGH> + , <&gpio1 15 GPIO_ACTIVE_HIGH> + , <&gpio0 3 GPIO_ACTIVE_HIGH> + , <&gpio0 2 GPIO_ACTIVE_HIGH> + , <&gpio0 28 GPIO_ACTIVE_HIGH> + , <&gpio0 29 GPIO_ACTIVE_HIGH> + , <&gpio0 30 GPIO_ACTIVE_HIGH> + , <&gpio0 31 GPIO_ACTIVE_HIGH> + ; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "mbr"; - reg = <0x00000000 0x00001000>; - }; + sd_partition: partition@0 { + label = "mbr"; + reg = <0x00000000 0x00001000>; + }; - code_partition: partition@1000 { - label = "code_partition"; - reg = <0x00001000 0x000d3000>; - }; + code_partition: partition@1000 { + label = "code_partition"; + reg = <0x00001000 0x000d3000>; + }; - /* - * The flash starting at 0x000d4000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000d4000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@d4000 { - label = "storage"; - reg = <0x000d4000 0x00020000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@d4000 { + label = "storage"; + reg = <0x000d4000 0x00020000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/s40nc/s40nc.keymap b/app/boards/arm/s40nc/s40nc.keymap index f0e60e7d..dfc352d7 100644 --- a/app/boards/arm/s40nc/s40nc.keymap +++ b/app/boards/arm/s40nc/s40nc.keymap @@ -15,44 +15,44 @@ #define CONTROL 3 / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < + default_layer { + bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &mo LOWER &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp ENTER &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp FSLH &kp UP &kp RSHFT &kp LCTRL &kp LGUI &kp LALT < LOWER SPACE < CONTROL SPACE < RAISE SPACE &kp LEFT &kp DOWN &kp RIGHT - >; - }; + >; + }; - lower_layer { - bindings = < + lower_layer { + bindings = < &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL &kp PSCRN &kp MINUS &kp EQUAL &trans &trans &trans &trans &kp LBKT &kp RBKT &kp SEMI &kp APOS &trans &trans &trans &trans &trans &trans &trans &kp COMMA &kp DOT &kp PG_UP &kp BSLH &trans &trans &trans &kp TAB &kp TAB &kp TAB &kp HOME &kp PG_DN &kp END - >; - }; + >; + }; raise_layer { - bindings = < + bindings = < &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &trans &kp PSCRN &kp UNDER &kp PLUS &trans &trans &trans &trans &kp LBRC &kp RBRC &kp COLON &kp DQT &trans &trans &trans &trans &trans &trans &trans &kp LT &kp GT &kp PG_UP &kp PIPE &trans &trans &trans &kp TAB &kp TAB &kp TAB &kp HOME &kp PG_DN &kp END - >; - }; + >; + }; control_layer { - bindings = < + bindings = < &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp C_PP &bt BT_SEL 0 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &kp K_LOCK &bt BT_SEL 1 &out OUT_USB &kp CAPS &kp KP_NUM &kp SLCK &trans &trans &kp COMMA &kp DOT &kp K_VOL_UP &kp K_MUTE &bt BT_SEL 2 &out OUT_BLE &kp PAUSE_BREAK &sys_reset &trans &bootloader &kp C_BRI_DN &kp K_VOL_DN &kp C_BRI_UP - >; - }; - }; + >; + }; + }; }; diff --git a/app/boards/native_posix.overlay b/app/boards/native_posix.overlay index 2c1ed79d..f8a8f700 100644 --- a/app/boards/native_posix.overlay +++ b/app/boards/native_posix.overlay @@ -3,16 +3,16 @@ #include / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-mock"; - label = "KSCAN_MOCK"; + kscan: kscan { + compatible = "zmk,kscan-mock"; + label = "KSCAN_MOCK"; - rows = <2>; - columns = <2>; - exit-after; - }; + rows = <2>; + columns = <2>; + exit-after; + }; }; diff --git a/app/boards/native_posix_64.overlay b/app/boards/native_posix_64.overlay index 2c1ed79d..f8a8f700 100644 --- a/app/boards/native_posix_64.overlay +++ b/app/boards/native_posix_64.overlay @@ -3,16 +3,16 @@ #include / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-mock"; - label = "KSCAN_MOCK"; + kscan: kscan { + compatible = "zmk,kscan-mock"; + label = "KSCAN_MOCK"; - rows = <2>; - columns = <2>; - exit-after; - }; + rows = <2>; + columns = <2>; + exit-after; + }; }; diff --git a/app/boards/seeeduino_xiao.overlay b/app/boards/seeeduino_xiao.overlay index 70080286..a2ddaea4 100644 --- a/app/boards/seeeduino_xiao.overlay +++ b/app/boards/seeeduino_xiao.overlay @@ -5,15 +5,15 @@ */ / { - chosen { - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,console = &cdc_acm_uart; + }; }; &usb0 { - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/boards/seeeduino_xiao_ble.overlay b/app/boards/seeeduino_xiao_ble.overlay index 452786d1..51671a80 100644 --- a/app/boards/seeeduino_xiao_ble.overlay +++ b/app/boards/seeeduino_xiao_ble.overlay @@ -6,29 +6,29 @@ / { - chosen { - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 7>; - power-gpios = <&gpio0 14 (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW)>; - output-ohms = <510000>; - full-ohms = <(1000000 + 510000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 7>; + power-gpios = <&gpio0 14 (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW)>; + output-ohms = <510000>; + full-ohms = <(1000000 + 510000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &usbd { - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/boards/shields/Kconfig.defconfig b/app/boards/shields/Kconfig.defconfig index 5b9ca9a1..58dd45d6 100644 --- a/app/boards/shields/Kconfig.defconfig +++ b/app/boards/shields/Kconfig.defconfig @@ -2,13 +2,13 @@ config ZMK_KEYBOARD_NAME - default "cradios" + default "cradios" # Unable to use interrupts as the same pin number is used # across A & B controllers, and STM32F303CCT6 can't enable # interrutps for multiple controllers for the same "line" # for the external interrupts. config ZMK_KSCAN_GPIO_POLLING - default y + default y diff --git a/app/boards/shields/Kconfig.shield b/app/boards/shields/Kconfig.shield index 844d4332..cab78898 100644 --- a/app/boards/shields/Kconfig.shield +++ b/app/boards/shields/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_CRADIOS - def_bool $(shields_list_contains,cradios) + def_bool $(shields_list_contains,cradios) diff --git a/app/boards/shields/a_dux/Kconfig.defconfig b/app/boards/shields/a_dux/Kconfig.defconfig index 53cd1986..2dc40dbe 100644 --- a/app/boards/shields/a_dux/Kconfig.defconfig +++ b/app/boards/shields/a_dux/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_A_DUX_LEFT config ZMK_KEYBOARD_NAME - default "A. Dux" + default "A. Dux" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_A_DUX_LEFT || SHIELD_A_DUX_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/a_dux/Kconfig.shield b/app/boards/shields/a_dux/Kconfig.shield index 6058f290..928f432c 100644 --- a/app/boards/shields/a_dux/Kconfig.shield +++ b/app/boards/shields/a_dux/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_A_DUX_LEFT - def_bool $(shields_list_contains,a_dux_left) + def_bool $(shields_list_contains,a_dux_left) config SHIELD_A_DUX_RIGHT - def_bool $(shields_list_contains,a_dux_right) + def_bool $(shields_list_contains,a_dux_right) diff --git a/app/boards/shields/a_dux/a_dux.dtsi b/app/boards/shields/a_dux/a_dux.dtsi index 4840227c..28156f42 100644 --- a/app/boards/shields/a_dux/a_dux.dtsi +++ b/app/boards/shields/a_dux/a_dux.dtsi @@ -8,45 +8,45 @@ / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <34>; - rows = <1>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,21) RC(0,20) RC(0,19) RC(0,18) RC(0,17) - RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) - RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) - RC(0,15) RC(0,16) RC(0,33) RC(0,32) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <34>; + rows = <1>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,21) RC(0,20) RC(0,19) RC(0,18) RC(0,17) + RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) + RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) + RC(0,15) RC(0,16) RC(0,33) RC(0,32) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; - input-gpios = - <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + kscan0: kscan { + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; + input-gpios = + <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; }; diff --git a/app/boards/shields/a_dux/a_dux.keymap b/app/boards/shields/a_dux/a_dux.keymap index eda03ff9..0f162a33 100644 --- a/app/boards/shields/a_dux/a_dux.keymap +++ b/app/boards/shields/a_dux/a_dux.keymap @@ -9,18 +9,18 @@ / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - // This is a sample keymap intended to be replaced with your own - base_layer { - bindings = < - &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P - &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI - &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH - &kp TAB &kp BSPC &kp SPACE &kp ENTER - >; - }; + // This is a sample keymap intended to be replaced with your own + base_layer { + bindings = < + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI + &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH + &kp TAB &kp BSPC &kp SPACE &kp ENTER + >; + }; - }; + }; }; diff --git a/app/boards/shields/a_dux/a_dux_right.overlay b/app/boards/shields/a_dux/a_dux_right.overlay index 0034317e..d4aed65c 100644 --- a/app/boards/shields/a_dux/a_dux_right.overlay +++ b/app/boards/shields/a_dux/a_dux_right.overlay @@ -7,5 +7,5 @@ #include "a_dux.dtsi" &default_transform { - col-offset = <17>; + col-offset = <17>; }; diff --git a/app/boards/shields/bfo9000/Kconfig.defconfig b/app/boards/shields/bfo9000/Kconfig.defconfig index 7e9ccf9c..7e41b04a 100644 --- a/app/boards/shields/bfo9000/Kconfig.defconfig +++ b/app/boards/shields/bfo9000/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_BFO9000_LEFT config ZMK_KEYBOARD_NAME - default "BFO-9000" + default "BFO-9000" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_BFO9000_LEFT || SHIELD_BFO9000_RIGHT config ZMK_SPLIT - default y + default y endif \ No newline at end of file diff --git a/app/boards/shields/bfo9000/Kconfig.shield b/app/boards/shields/bfo9000/Kconfig.shield index 4750e43a..5746abbe 100644 --- a/app/boards/shields/bfo9000/Kconfig.shield +++ b/app/boards/shields/bfo9000/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_BFO9000_LEFT - def_bool $(shields_list_contains,bfo9000_left) + def_bool $(shields_list_contains,bfo9000_left) config SHIELD_BFO9000_RIGHT - def_bool $(shields_list_contains,bfo9000_right) + def_bool $(shields_list_contains,bfo9000_right) diff --git a/app/boards/shields/bfo9000/bfo9000.dtsi b/app/boards/shields/bfo9000/bfo9000.dtsi index 0ceb9127..c5547920 100644 --- a/app/boards/shields/bfo9000/bfo9000.dtsi +++ b/app/boards/shields/bfo9000/bfo9000.dtsi @@ -7,38 +7,38 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <18>; - rows = <6>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(0,16) RC(0,17) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) RC(1,16) RC(1,17) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(2,15) RC(2,16) RC(2,17) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,14) RC(3,15) RC(3,16) RC(3,17) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,15) RC(4,16) RC(4,17) - RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) RC(5,6) RC(5,7) RC(5,8) RC(5,9) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) RC(5,16) RC(5,17) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <18>; + rows = <6>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(0,16) RC(0,17) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) RC(1,16) RC(1,17) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(2,15) RC(2,16) RC(2,17) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,14) RC(3,15) RC(3,16) RC(3,17) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,15) RC(4,16) RC(4,17) + RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) RC(5,6) RC(5,7) RC(5,8) RC(5,9) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) RC(5,16) RC(5,17) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; }; \ No newline at end of file diff --git a/app/boards/shields/bfo9000/bfo9000.keymap b/app/boards/shields/bfo9000/bfo9000.keymap index 22186a1d..18a2085c 100644 --- a/app/boards/shields/bfo9000/bfo9000.keymap +++ b/app/boards/shields/bfo9000/bfo9000.keymap @@ -15,41 +15,41 @@ #define LOWER 1 / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - // | Esc | Vol Up | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del | - // | Home | Vol Dn | ` | 1 | 2 | 3 | 4 | 5 | 6 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bk Spc | - // | End | Tab | Tab | Q | W | E | R | T | Y | T | Y | U | I | O | P | [ | ] | \ | - // | Pg Up | Caps | Ctrl | A | S | D | F | G | H | G | H | J | K | L | ; | ' | Enter | Enter | - // | Pg Dn | Up | Shift | Z | X | C | V | B | N | B | N | M | , | . | / | Shift | Up | | - // | Left | Dn | Right | Ctrl | Alt | Win | Spc | Spc | Enter | Bk Spc | Spc | Spc | Win | Alt | Ctrl | Left | Dn | Right | - bindings = < - &kp ESC &kp C_VOL_UP &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL - &kp HOME &kp C_VOL_DN &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp END &kp TAB &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp PG_UP &kp CAPS &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp APOS &kp ENTER &kp ENTER - &kp PG_DN &kp UP &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RSHFT &kp UP &mo LOWER - &kp LEFT &kp DOWN &kp RIGHT &kp LCTRL &kp LALT &kp LMETA &kp SPACE &kp SPACE &kp ENTER &kp BSPC &kp SPACE &kp SPACE &kp RMETA &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT - >; - }; + default_layer { + // | Esc | Vol Up | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del | + // | Home | Vol Dn | ` | 1 | 2 | 3 | 4 | 5 | 6 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bk Spc | + // | End | Tab | Tab | Q | W | E | R | T | Y | T | Y | U | I | O | P | [ | ] | \ | + // | Pg Up | Caps | Ctrl | A | S | D | F | G | H | G | H | J | K | L | ; | ' | Enter | Enter | + // | Pg Dn | Up | Shift | Z | X | C | V | B | N | B | N | M | , | . | / | Shift | Up | | + // | Left | Dn | Right | Ctrl | Alt | Win | Spc | Spc | Enter | Bk Spc | Spc | Spc | Win | Alt | Ctrl | Left | Dn | Right | + bindings = < + &kp ESC &kp C_VOL_UP &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &kp HOME &kp C_VOL_DN &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp END &kp TAB &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp PG_UP &kp CAPS &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp APOS &kp ENTER &kp ENTER + &kp PG_DN &kp UP &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RSHFT &kp UP &mo LOWER + &kp LEFT &kp DOWN &kp RIGHT &kp LCTRL &kp LALT &kp LMETA &kp SPACE &kp SPACE &kp ENTER &kp BSPC &kp SPACE &kp SPACE &kp RMETA &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + }; - lower_layer { - // | | | | | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | | | | | | - bindings = < - &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 - &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans - &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans - &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans - &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans - &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans - >; - }; - }; + lower_layer { + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + bindings = < + &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 + &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans + &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans + &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans + &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans + &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans + >; + }; + }; }; diff --git a/app/boards/shields/bfo9000/bfo9000_left.overlay b/app/boards/shields/bfo9000/bfo9000_left.overlay index 3f034d95..9e921053 100644 --- a/app/boards/shields/bfo9000/bfo9000_left.overlay +++ b/app/boards/shields/bfo9000/bfo9000_left.overlay @@ -7,15 +7,15 @@ #include "bfo9000.dtsi" &kscan0 { - col-gpios - = <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/bfo9000/bfo9000_right.overlay b/app/boards/shields/bfo9000/bfo9000_right.overlay index 30bd35e2..897c6b0b 100644 --- a/app/boards/shields/bfo9000/bfo9000_right.overlay +++ b/app/boards/shields/bfo9000/bfo9000_right.overlay @@ -7,19 +7,19 @@ #include "bfo9000.dtsi" &default_transform { - col-offset = <9>; + col-offset = <9>; }; &kscan0 { - col-gpios - = <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/boardsource3x4/Kconfig.shield b/app/boards/shields/boardsource3x4/Kconfig.shield index cda55d07..7f574cea 100644 --- a/app/boards/shields/boardsource3x4/Kconfig.shield +++ b/app/boards/shields/boardsource3x4/Kconfig.shield @@ -2,5 +2,5 @@ # SPDX-License-Identifier: MIT config SHIELD_BOARDSOURCE3X4 - def_bool $(shields_list_contains,boardsource3x4) + def_bool $(shields_list_contains,boardsource3x4) diff --git a/app/boards/shields/chalice/boards/nice_nano.overlay b/app/boards/shields/chalice/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/chalice/boards/nice_nano.overlay +++ b/app/boards/shields/chalice/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/chalice/boards/nice_nano_v2.overlay b/app/boards/shields/chalice/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/chalice/boards/nice_nano_v2.overlay +++ b/app/boards/shields/chalice/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/clog/Kconfig.defconfig b/app/boards/shields/clog/Kconfig.defconfig index 1ca779f3..53ded4d7 100644 --- a/app/boards/shields/clog/Kconfig.defconfig +++ b/app/boards/shields/clog/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_CLOG_LEFT config ZMK_KEYBOARD_NAME - default "Clog" + default "Clog" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_CLOG_LEFT || SHIELD_CLOG_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/clog/Kconfig.shield b/app/boards/shields/clog/Kconfig.shield index 2301af94..69ecef8d 100644 --- a/app/boards/shields/clog/Kconfig.shield +++ b/app/boards/shields/clog/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_CLOG_LEFT - def_bool $(shields_list_contains,clog_left) + def_bool $(shields_list_contains,clog_left) config SHIELD_CLOG_RIGHT - def_bool $(shields_list_contains,clog_right) + def_bool $(shields_list_contains,clog_right) diff --git a/app/boards/shields/clog/clog.dtsi b/app/boards/shields/clog/clog.dtsi index ccad150c..40e9a39f 100644 --- a/app/boards/shields/clog/clog.dtsi +++ b/app/boards/shields/clog/clog.dtsi @@ -8,44 +8,44 @@ / { chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <34>; - rows = <1>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,20) RC(0,19) RC(0,18) RC(0,17) - RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) RC(0,21) - RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) - RC(0,15) RC(0,16) RC(0,33) RC(0,32) - >; + compatible = "zmk,matrix-transform"; + columns = <34>; + rows = <1>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,20) RC(0,19) RC(0,18) RC(0,17) + RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) RC(0,21) + RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) + RC(0,15) RC(0,16) RC(0,33) RC(0,32) + >; }; kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; - input-gpios - = <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + input-gpios + = <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; }; }; diff --git a/app/boards/shields/clog/clog_right.overlay b/app/boards/shields/clog/clog_right.overlay index 0dc5d64f..8b0efb3d 100644 --- a/app/boards/shields/clog/clog_right.overlay +++ b/app/boards/shields/clog/clog_right.overlay @@ -7,5 +7,5 @@ #include "clog.dtsi" &default_transform { - col-offset = <17>; + col-offset = <17>; }; diff --git a/app/boards/shields/clueboard_california/Kconfig.defconfig b/app/boards/shields/clueboard_california/Kconfig.defconfig index e101ea76..278aaa44 100644 --- a/app/boards/shields/clueboard_california/Kconfig.defconfig +++ b/app/boards/shields/clueboard_california/Kconfig.defconfig @@ -2,13 +2,13 @@ if SHIELD_CLUEBOARD_CALIFORNIA config ZMK_KEYBOARD_NAME - default "Clueboard California Macropad" + default "Clueboard California Macropad" # Unable to use interrupts as the same pin number is used # across A & B controllers, and STM32F303CCT6 can't enable # interrutps for multiple controllers for the same "line" # for the external interrupts. config ZMK_KSCAN_DIRECT_POLLING - default y + default y endif diff --git a/app/boards/shields/clueboard_california/Kconfig.shield b/app/boards/shields/clueboard_california/Kconfig.shield index eca025d1..e987d29a 100644 --- a/app/boards/shields/clueboard_california/Kconfig.shield +++ b/app/boards/shields/clueboard_california/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_CLUEBOARD_CALIFORNIA - def_bool $(shields_list_contains,clueboard_california) + def_bool $(shields_list_contains,clueboard_california) diff --git a/app/boards/shields/clueboard_california/clueboard_california.keymap b/app/boards/shields/clueboard_california/clueboard_california.keymap index b9041c37..9af22fa1 100644 --- a/app/boards/shields/clueboard_california/clueboard_california.keymap +++ b/app/boards/shields/clueboard_california/clueboard_california.keymap @@ -8,18 +8,18 @@ #include / { - keymap0: keymap { - compatible = "zmk,keymap"; + keymap0: keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp N9 &kp N8 - &kp N7 &kp N6 - &kp N5 - &kp N4 &kp N3 - &kp N2 &kp N1 - &kp N0 - >; - }; - }; + default_layer { + bindings = < + &kp N9 &kp N8 + &kp N7 &kp N6 + &kp N5 + &kp N4 &kp N3 + &kp N2 &kp N1 + &kp N0 + >; + }; + }; }; \ No newline at end of file diff --git a/app/boards/shields/clueboard_california/clueboard_california.overlay b/app/boards/shields/clueboard_california/clueboard_california.overlay index 9f52d0d3..dfa5d9cf 100644 --- a/app/boards/shields/clueboard_california/clueboard_california.overlay +++ b/app/boards/shields/clueboard_california/clueboard_california.overlay @@ -5,30 +5,30 @@ */ / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-direct"; + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; + label = "KSCAN"; - input-gpios - = <&gpioa 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + input-gpios + = <&gpioa 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; - }; + }; - // TODO: Per-key LED node(s) + // TODO: Per-key LED node(s) }; diff --git a/app/boards/shields/contra/Kconfig.shield b/app/boards/shields/contra/Kconfig.shield index 59412ff5..e9f8e804 100644 --- a/app/boards/shields/contra/Kconfig.shield +++ b/app/boards/shields/contra/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_CONTRA - def_bool $(shields_list_contains,contra) \ No newline at end of file + def_bool $(shields_list_contains,contra) \ No newline at end of file diff --git a/app/boards/shields/corne/Kconfig.defconfig b/app/boards/shields/corne/Kconfig.defconfig index acf542d7..07dd07e9 100644 --- a/app/boards/shields/corne/Kconfig.defconfig +++ b/app/boards/shields/corne/Kconfig.defconfig @@ -1,44 +1,44 @@ if SHIELD_CORNE_LEFT config ZMK_KEYBOARD_NAME - default "Corne" + default "Corne" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_CORNE_LEFT || SHIELD_CORNE_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/corne/Kconfig.shield b/app/boards/shields/corne/Kconfig.shield index 3cac86fe..099680b9 100644 --- a/app/boards/shields/corne/Kconfig.shield +++ b/app/boards/shields/corne/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_CORNE_LEFT - def_bool $(shields_list_contains,corne_left) + def_bool $(shields_list_contains,corne_left) config SHIELD_CORNE_RIGHT - def_bool $(shields_list_contains,corne_right) + def_bool $(shields_list_contains,corne_right) diff --git a/app/boards/shields/corne/boards/nice_nano.overlay b/app/boards/shields/corne/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/corne/boards/nice_nano.overlay +++ b/app/boards/shields/corne/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/corne/boards/nice_nano_v2.overlay b/app/boards/shields/corne/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/corne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/corne/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/corne/corne.dtsi b/app/boards/shields/corne/corne.dtsi index a9c1c287..0e9eddf9 100644 --- a/app/boards/shields/corne/corne.dtsi +++ b/app/boards/shields/corne/corne.dtsi @@ -7,77 +7,77 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - five_column_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - // TODO: per-key RGB node(s)? + // TODO: per-key RGB node(s)? }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/corne/corne.keymap b/app/boards/shields/corne/corne.keymap index 53218a86..0555cf41 100644 --- a/app/boards/shields/corne/corne.keymap +++ b/app/boards/shields/corne/corne.keymap @@ -35,7 +35,7 @@ &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; @@ -49,7 +49,7 @@ &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; }; diff --git a/app/boards/shields/corne/corne_left.overlay b/app/boards/shields/corne/corne_left.overlay index fe7e3c78..117cb19e 100644 --- a/app/boards/shields/corne/corne_left.overlay +++ b/app/boards/shields/corne/corne_left.overlay @@ -7,12 +7,12 @@ #include "corne.dtsi" &kscan0 { - col-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/corne/corne_right.overlay b/app/boards/shields/corne/corne_right.overlay index 1d7ed9ec..a8a0cfe7 100644 --- a/app/boards/shields/corne/corne_right.overlay +++ b/app/boards/shields/corne/corne_right.overlay @@ -7,20 +7,20 @@ #include "corne.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &five_column_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/cradio/Kconfig.defconfig b/app/boards/shields/cradio/Kconfig.defconfig index b600383a..c5d03f4e 100644 --- a/app/boards/shields/cradio/Kconfig.defconfig +++ b/app/boards/shields/cradio/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_CRADIO_LEFT config ZMK_KEYBOARD_NAME - default "Cradio" + default "Cradio" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_CRADIO_LEFT || SHIELD_CRADIO_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/cradio/Kconfig.shield b/app/boards/shields/cradio/Kconfig.shield index bb5f0735..affb1c53 100644 --- a/app/boards/shields/cradio/Kconfig.shield +++ b/app/boards/shields/cradio/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_CRADIO_LEFT - def_bool $(shields_list_contains,cradio_left) + def_bool $(shields_list_contains,cradio_left) config SHIELD_CRADIO_RIGHT - def_bool $(shields_list_contains,cradio_right) + def_bool $(shields_list_contains,cradio_right) diff --git a/app/boards/shields/cradio/README.md b/app/boards/shields/cradio/README.md index ee1cab0e..2c4e2e60 100644 --- a/app/boards/shields/cradio/README.md +++ b/app/boards/shields/cradio/README.md @@ -10,25 +10,25 @@ Some revisions of the aforementioned PCBs have slightly different pin arrangemen /* Adjusted Cradio pin arrangement */ /* The position of Q and B keys have been swapped */ &kscan0 { - input-gpios - = <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + input-gpios + = <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; }; ``` diff --git a/app/boards/shields/cradio/cradio.dtsi b/app/boards/shields/cradio/cradio.dtsi index ca464c95..57dcfd4b 100644 --- a/app/boards/shields/cradio/cradio.dtsi +++ b/app/boards/shields/cradio/cradio.dtsi @@ -8,45 +8,45 @@ / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <34>; - rows = <1>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,21) RC(0,20) RC(0,19) RC(0,18) RC(0,17) - RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) - RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) - RC(0,15) RC(0,16) RC(0,33) RC(0,32) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <34>; + rows = <1>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,21) RC(0,20) RC(0,19) RC(0,18) RC(0,17) + RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) + RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) + RC(0,15) RC(0,16) RC(0,33) RC(0,32) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; - input-gpios - = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + kscan0: kscan { + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; + input-gpios + = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; }; diff --git a/app/boards/shields/cradio/cradio_right.overlay b/app/boards/shields/cradio/cradio_right.overlay index 41436e97..fea9ae1c 100644 --- a/app/boards/shields/cradio/cradio_right.overlay +++ b/app/boards/shields/cradio/cradio_right.overlay @@ -7,5 +7,5 @@ #include "cradio.dtsi" &default_transform { - col-offset = <17>; + col-offset = <17>; }; diff --git a/app/boards/shields/crbn/Kconfig.defconfig b/app/boards/shields/crbn/Kconfig.defconfig index 2a5c8e39..c00e97a4 100644 --- a/app/boards/shields/crbn/Kconfig.defconfig +++ b/app/boards/shields/crbn/Kconfig.defconfig @@ -4,6 +4,6 @@ if SHIELD_CRBN config ZMK_KEYBOARD_NAME - default "CRBN" + default "CRBN" endif diff --git a/app/boards/shields/crbn/Kconfig.shield b/app/boards/shields/crbn/Kconfig.shield index ceeb5f63..bf92dbf1 100644 --- a/app/boards/shields/crbn/Kconfig.shield +++ b/app/boards/shields/crbn/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_CRBN - def_bool $(shields_list_contains,crbn) + def_bool $(shields_list_contains,crbn) diff --git a/app/boards/shields/crbn/crbn.keymap b/app/boards/shields/crbn/crbn.keymap index b967e5e2..f963ba84 100644 --- a/app/boards/shields/crbn/crbn.keymap +++ b/app/boards/shields/crbn/crbn.keymap @@ -9,54 +9,54 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - // ----------------------------------------------------------------------------------------- - // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | - // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | - // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | - bindings = < - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC - &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET - &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &kp SPACE &trans &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT - >; + default_layer { + // ----------------------------------------------------------------------------------------- + // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | + // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | + // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | + bindings = < + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET + &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &kp SPACE &trans &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + >; - sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; - }; + sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; + }; - lower { - bindings = < - &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL - &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE - &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(HASH) &kp LS(BSLH) &kp HOME &kp END &trans - &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP - >; + lower { + bindings = < + &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(HASH) &kp LS(BSLH) &kp HOME &kp END &trans + &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; - raise { - bindings = < - &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC - &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH - &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans - &trans &trans &trans &trans &mo 3 &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP - >; + raise { + bindings = < + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans + &trans &trans &trans &trans &mo 3 &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + >; - sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; - }; + sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; + }; - control { - bindings = < - &sys_reset &bootloader &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans - &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &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 &trans &trans &trans - >; - }; - }; + control { + bindings = < + &sys_reset &bootloader &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans + &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &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 &trans &trans &trans + >; + }; + }; }; diff --git a/app/boards/shields/crbn/crbn.overlay b/app/boards/shields/crbn/crbn.overlay index 18382cce..817a83d0 100644 --- a/app/boards/shields/crbn/crbn.overlay +++ b/app/boards/shields/crbn/crbn.overlay @@ -7,49 +7,49 @@ #include / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "col2row"; + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; - col-gpios - = <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 2 GPIO_ACTIVE_HIGH> - , <&pro_micro 3 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 2 GPIO_ACTIVE_HIGH> + , <&pro_micro 3 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + ; - row-gpios - = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + row-gpios + = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; - encoder: encoder { - compatible = "alps,ec11"; - label = "ENCODER"; - a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <2>; - status = "okay"; - }; + encoder: encoder { + compatible = "alps,ec11"; + label = "ENCODER"; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <2>; + status = "okay"; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder>; + }; }; diff --git a/app/boards/shields/elephant42/Kconfig.defconfig b/app/boards/shields/elephant42/Kconfig.defconfig index 55ee6c87..70a312c1 100644 --- a/app/boards/shields/elephant42/Kconfig.defconfig +++ b/app/boards/shields/elephant42/Kconfig.defconfig @@ -14,34 +14,34 @@ endif if SHIELD_ELEPHANT42_LEFT || SHIELD_ELEPHANT42_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/elephant42/boards/nice_nano.overlay b/app/boards/shields/elephant42/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/elephant42/boards/nice_nano.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/elephant42/elephant42.dtsi b/app/boards/shields/elephant42/elephant42.dtsi index 2d3f5166..b0e9a32e 100644 --- a/app/boards/shields/elephant42/elephant42.dtsi +++ b/app/boards/shields/elephant42/elephant42.dtsi @@ -40,21 +40,21 @@ RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; \ No newline at end of file diff --git a/app/boards/shields/ergodash/Kconfig.defconfig b/app/boards/shields/ergodash/Kconfig.defconfig index 43cab0b1..34a87e8e 100644 --- a/app/boards/shields/ergodash/Kconfig.defconfig +++ b/app/boards/shields/ergodash/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_ERGODASH_LEFT config ZMK_KEYBOARD_NAME - default "Ergodash" + default "Ergodash" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_ERGODASH_LEFT || SHIELD_ERGODASH_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/ergodash/Kconfig.shield b/app/boards/shields/ergodash/Kconfig.shield index b3cca293..5814e21e 100644 --- a/app/boards/shields/ergodash/Kconfig.shield +++ b/app/boards/shields/ergodash/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_ERGODASH_LEFT - def_bool $(shields_list_contains,ergodash_left) + def_bool $(shields_list_contains,ergodash_left) config SHIELD_ERGODASH_RIGHT - def_bool $(shields_list_contains,ergodash_right) + def_bool $(shields_list_contains,ergodash_right) diff --git a/app/boards/shields/ergodash/ergodash.dtsi b/app/boards/shields/ergodash/ergodash.dtsi index a2b76075..d109fa66 100644 --- a/app/boards/shields/ergodash/ergodash.dtsi +++ b/app/boards/shields/ergodash/ergodash.dtsi @@ -7,15 +7,15 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; // Numbering based on rev 1.2 schema // * keys that can be in different positions are denoted as MW // * MW40 can be broken off @@ -24,38 +24,38 @@ // | SW3 | SW7 | SW11 | SW15 | SW19 | SW23 | SW27 | | | | SW27 | SW23 | SW19 | SW15 | SW11 | SW7 | SW3 | // | SW4 | SW8 | SW12 | SW16 | SW20 | SW24 | | MW28 | | MW28 | | SW24 | SW20 | SW16 | SW12 | SW8 | SW4 | // | SW30 | SW31 | SW32 | MW33 | SW34 | | MW35 | MW40 | | MW40 | MW35 | | SW34 | MW33 | SW32 | SW31 | SW30 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,13) RC(0,12) RC(0,11) RC(0,10) RC(0,9) RC(0,8) RC(0,7) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,13) RC(1,12) RC(1,11) RC(1,10) RC(1,9) RC(1,8) RC(1,7) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,13) RC(2,12) RC(2,11) RC(2,10) RC(2,9) RC(2,8) RC(2,7) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,13) RC(3,12) RC(3,11) RC(3,10) RC(3,9) RC(3,8) RC(3,7) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,13) RC(4,12) RC(4,11) RC(4,10) RC(4,9) RC(4,8) RC(4,7) - >; + >; }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; + diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + col-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; }; diff --git a/app/boards/shields/ergodash/ergodash_right.overlay b/app/boards/shields/ergodash/ergodash_right.overlay index 464b3f5d..07fbbb70 100644 --- a/app/boards/shields/ergodash/ergodash_right.overlay +++ b/app/boards/shields/ergodash/ergodash_right.overlay @@ -7,5 +7,5 @@ #include "ergodash.dtsi" &default_transform { - col-offset = <7>; + col-offset = <7>; }; diff --git a/app/boards/shields/eternal_keypad/Kconfig.defconfig b/app/boards/shields/eternal_keypad/Kconfig.defconfig index 4d4195ef..72514192 100644 --- a/app/boards/shields/eternal_keypad/Kconfig.defconfig +++ b/app/boards/shields/eternal_keypad/Kconfig.defconfig @@ -4,6 +4,6 @@ if SHIELD_ETERNAL_KEYPAD || SHIELD_ETERNAL_KEYPAD_LEFTY config ZMK_KEYBOARD_NAME - default "Eternal Keypad" + default "Eternal Keypad" endif diff --git a/app/boards/shields/eternal_keypad/Kconfig.shield b/app/boards/shields/eternal_keypad/Kconfig.shield index 4a59379e..23015153 100644 --- a/app/boards/shields/eternal_keypad/Kconfig.shield +++ b/app/boards/shields/eternal_keypad/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_ETERNAL_KEYPAD - def_bool $(shields_list_contains,eternal_keypad) + def_bool $(shields_list_contains,eternal_keypad) config SHIELD_ETERNAL_KEYPAD_LEFTY - def_bool $(shields_list_contains,eternal_keypad_lefty) + def_bool $(shields_list_contains,eternal_keypad_lefty) diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay +++ b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay +++ b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/fourier/Kconfig.defconfig b/app/boards/shields/fourier/Kconfig.defconfig index b887870c..a07ca714 100644 --- a/app/boards/shields/fourier/Kconfig.defconfig +++ b/app/boards/shields/fourier/Kconfig.defconfig @@ -5,16 +5,16 @@ if SHIELD_FOURIER_LEFT config ZMK_KEYBOARD_NAME - default "Fourier" + default "Fourier" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_FOURIER_LEFT || SHIELD_FOURIER_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/fourier/Kconfig.shield b/app/boards/shields/fourier/Kconfig.shield index 2e337410..ee28c7ac 100644 --- a/app/boards/shields/fourier/Kconfig.shield +++ b/app/boards/shields/fourier/Kconfig.shield @@ -3,7 +3,7 @@ config SHIELD_FOURIER_LEFT - def_bool $(shields_list_contains,fourier_left) + def_bool $(shields_list_contains,fourier_left) config SHIELD_FOURIER_RIGHT - def_bool $(shields_list_contains,fourier_right) + def_bool $(shields_list_contains,fourier_right) diff --git a/app/boards/shields/fourier/fourier.dtsi b/app/boards/shields/fourier/fourier.dtsi index 99027ea9..0902d687 100644 --- a/app/boards/shields/fourier/fourier.dtsi +++ b/app/boards/shields/fourier/fourier.dtsi @@ -7,37 +7,37 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - /* - * This transform correspondsto the 60% left without macro keypad and 65% right, even this - * combination of PCBs can have keys in different locations based on configuration. - */ - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <13>; - rows = <4>; - map = < + /* + * This transform correspondsto the 60% left without macro keypad and 65% right, even this + * combination of PCBs can have keys in different locations based on configuration. + */ + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <13>; + rows = <4>; + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) /**/ RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0, 11) RC(0,12) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) /**/ RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,12) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) /**/ RC(2,6) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) /**/ RC(3,6) RC(3,9) RC(3,10) RC(3,11) RC(3,12) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row A - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row B - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row C - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row D - ; - }; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row A + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row B + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row C + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row D + ; + }; }; diff --git a/app/boards/shields/helix/boards/nice_nano.overlay b/app/boards/shields/helix/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/helix/boards/nice_nano.overlay +++ b/app/boards/shields/helix/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/helix/boards/nice_nano_v2.overlay b/app/boards/shields/helix/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/helix/boards/nice_nano_v2.overlay +++ b/app/boards/shields/helix/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/helix/helix_right.overlay b/app/boards/shields/helix/helix_right.overlay index 42dd0f52..0d3cc63d 100644 --- a/app/boards/shields/helix/helix_right.overlay +++ b/app/boards/shields/helix/helix_right.overlay @@ -7,7 +7,7 @@ #include "helix.dtsi" &default_transform { - col-offset = <7>; + col-offset = <7>; }; &kscan0 { diff --git a/app/boards/shields/hummingbird/hummingbird.overlay b/app/boards/shields/hummingbird/hummingbird.overlay index 0c48c128..1b40acba 100644 --- a/app/boards/shields/hummingbird/hummingbird.overlay +++ b/app/boards/shields/hummingbird/hummingbird.overlay @@ -10,8 +10,8 @@ chosen { zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; - /delete-property/ zephyr,console; - /delete-property/ zephyr,shell-uart; + /delete-property/ zephyr,console; + /delete-property/ zephyr,shell-uart; }; default_transform: keymap_transform_0 { diff --git a/app/boards/shields/iris/Kconfig.defconfig b/app/boards/shields/iris/Kconfig.defconfig index 83331d10..b68bc999 100644 --- a/app/boards/shields/iris/Kconfig.defconfig +++ b/app/boards/shields/iris/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_IRIS_LEFT config ZMK_KEYBOARD_NAME - default "Iris" + default "Iris" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_IRIS_LEFT || SHIELD_IRIS_RIGHT config ZMK_SPLIT - default y + default y endif \ No newline at end of file diff --git a/app/boards/shields/iris/Kconfig.shield b/app/boards/shields/iris/Kconfig.shield index 370bd222..764d8101 100644 --- a/app/boards/shields/iris/Kconfig.shield +++ b/app/boards/shields/iris/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_IRIS_LEFT - def_bool $(shields_list_contains,iris_left) + def_bool $(shields_list_contains,iris_left) config SHIELD_IRIS_RIGHT - def_bool $(shields_list_contains,iris_right) + def_bool $(shields_list_contains,iris_right) diff --git a/app/boards/shields/iris/iris.dtsi b/app/boards/shields/iris/iris.dtsi index 0e976f86..a0caf1ad 100644 --- a/app/boards/shields/iris/iris.dtsi +++ b/app/boards/shields/iris/iris.dtsi @@ -7,41 +7,41 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; // | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | // | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | // | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | // | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | // | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,2) RC(4,9) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) - >; - }; + RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; }; \ No newline at end of file diff --git a/app/boards/shields/iris/iris.keymap b/app/boards/shields/iris/iris.keymap index 7c00d0a5..209c2277 100644 --- a/app/boards/shields/iris/iris.keymap +++ b/app/boards/shields/iris/iris.keymap @@ -9,55 +9,55 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | "[" | | "]" | N | M | , | . | / | SHIFT | -// | GUI | LOWER| SPACE | | ENTER | RAISE| ALT | - bindings = < +// | GUI | LOWER| SPACE | | ENTER | RAISE| ALT | + bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp GRAVE &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT - >; - }; + &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT + >; + }; - lower_layer { + lower_layer { // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | // | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | ~ | // | | | | | | | | | | | _ | + | { | } | "|" | // | | | | | | | | - bindings = < + bindings = < &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp TILDE &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp KP_PLUS &kp LBRC &kp RBRC &kp PIPE - &trans &trans &trans &trans &trans &trans - >; - }; + &trans &trans &trans &trans &trans &trans + >; + }; - raise_layer { + raise_layer { // ------------------------------------------------------------------------------------------------------------ // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | // | F1 | F2 | F3 | F4 | F5 | F6 | | | <- | ^ | v | -> | | // | F7 | F8 | F9 | F10 | F11 | F12 | | | | + | - | = | [ | ] | \ | // | | | | | | | | - bindings = < + bindings = < &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &kp KP_PLUS &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH - &trans &trans &trans &trans &trans &trans - >; - }; - }; + &trans &trans &trans &trans &trans &trans + >; + }; + }; }; diff --git a/app/boards/shields/iris/iris_left.overlay b/app/boards/shields/iris/iris_left.overlay index 2c52fca8..eb330d31 100644 --- a/app/boards/shields/iris/iris_left.overlay +++ b/app/boards/shields/iris/iris_left.overlay @@ -7,12 +7,12 @@ #include "iris.dtsi" &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/iris/iris_right.overlay b/app/boards/shields/iris/iris_right.overlay index 2ed712a2..d2375b18 100644 --- a/app/boards/shields/iris/iris_right.overlay +++ b/app/boards/shields/iris/iris_right.overlay @@ -7,16 +7,16 @@ #include "iris.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jian/Kconfig.defconfig b/app/boards/shields/jian/Kconfig.defconfig index bbdafbae..2f3d0a17 100644 --- a/app/boards/shields/jian/Kconfig.defconfig +++ b/app/boards/shields/jian/Kconfig.defconfig @@ -2,16 +2,16 @@ if SHIELD_JIAN_LEFT config ZMK_KEYBOARD_NAME - default "Jian" + default "Jian" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_JIAN_LEFT || SHIELD_JIAN_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/jian/Kconfig.shield b/app/boards/shields/jian/Kconfig.shield index 5b874f03..efcfa214 100644 --- a/app/boards/shields/jian/Kconfig.shield +++ b/app/boards/shields/jian/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_JIAN_LEFT - def_bool $(shields_list_contains,jian_left) + def_bool $(shields_list_contains,jian_left) config SHIELD_JIAN_RIGHT - def_bool $(shields_list_contains,jian_right) + def_bool $(shields_list_contains,jian_right) diff --git a/app/boards/shields/jian/jian.dtsi b/app/boards/shields/jian/jian.dtsi index 2b1eb391..8e772791 100644 --- a/app/boards/shields/jian/jian.dtsi +++ b/app/boards/shields/jian/jian.dtsi @@ -7,70 +7,70 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW0 | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | SW0 | // | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(2,0) RC(0,0) RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) RC(0,11) RC(2,11) RC(1,0) RC(1,1) RC(2,2) RC(1,3) RC(1,4) RC(0,5) RC(0,6) RC(1,7) RC(1,8) RC(2,9) RC(1,10) RC(1,11) RC(2,1) RC(3,2) RC(3,3) RC(2,3) RC(2,4) RC(1,5) RC(1,6) RC(2,7) RC(2,8) RC(3,8) RC(3,9) RC(2,10) RC(3,4) RC(2,5) RC(3,5) RC(3,6) RC(2,6) RC(3,7) - >; - }; + >; + }; - crkbd_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + crkbd_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < - RC(0,0) RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) RC(0,11) + map = < + RC(0,0) RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(2,2) RC(1,3) RC(1,4) RC(0,5) RC(0,6) RC(1,7) RC(1,8) RC(2,9) RC(1,10) RC(1,11) RC(2,1) RC(3,2) RC(3,3) RC(2,3) RC(2,4) RC(1,5) RC(1,6) RC(2,7) RC(2,8) RC(3,8) RC(3,9) RC(2,10) RC(3,4) RC(2,5) RC(3,5) RC(3,6) RC(2,6) RC(3,7) - >; - }; + >; + }; - five_column_transform: keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + five_column_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < - RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) + map = < + RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) RC(1,1) RC(2,2) RC(1,3) RC(1,4) RC(0,5) RC(0,6) RC(1,7) RC(1,8) RC(2,9) RC(1,10) RC(3,2) RC(3,3) RC(2,3) RC(2,4) RC(1,5) RC(1,6) RC(2,7) RC(2,8) RC(3,8) RC(3,9) RC(3,4) RC(2,5) RC(3,5) RC(3,6) RC(2,6) RC(3,7) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; }; diff --git a/app/boards/shields/jian/jian_left.overlay b/app/boards/shields/jian/jian_left.overlay index e7f9d5b5..e402f03b 100644 --- a/app/boards/shields/jian/jian_left.overlay +++ b/app/boards/shields/jian/jian_left.overlay @@ -7,12 +7,12 @@ #include "jian.dtsi" &kscan0 { - col-gpios - = <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jian/jian_right.overlay b/app/boards/shields/jian/jian_right.overlay index cac83fd3..f646741b 100644 --- a/app/boards/shields/jian/jian_right.overlay +++ b/app/boards/shields/jian/jian_right.overlay @@ -7,24 +7,24 @@ #include "jian.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &crkbd_transform { - col-offset = <6>; + col-offset = <6>; }; &five_column_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 1 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 1 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jiran/Kconfig.defconfig b/app/boards/shields/jiran/Kconfig.defconfig index b5b1f97b..0c6683f4 100644 --- a/app/boards/shields/jiran/Kconfig.defconfig +++ b/app/boards/shields/jiran/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_JIRAN_LEFT config ZMK_KEYBOARD_NAME - default "Jiran" + default "Jiran" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_JIRAN_LEFT || SHIELD_JIRAN_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/jiran/Kconfig.shield b/app/boards/shields/jiran/Kconfig.shield index 8a24ace0..8f480723 100644 --- a/app/boards/shields/jiran/Kconfig.shield +++ b/app/boards/shields/jiran/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_JIRAN_LEFT - def_bool $(shields_list_contains,jiran_left) + def_bool $(shields_list_contains,jiran_left) config SHIELD_JIRAN_RIGHT - def_bool $(shields_list_contains,jiran_right) + def_bool $(shields_list_contains,jiran_right) diff --git a/app/boards/shields/jiran/jiran.dtsi b/app/boards/shields/jiran/jiran.dtsi index f0727dd4..b7e74c27 100644 --- a/app/boards/shields/jiran/jiran.dtsi +++ b/app/boards/shields/jiran/jiran.dtsi @@ -7,76 +7,76 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <5>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW0 | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | SW0 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | // | SW25 | SW26 | SW27 | | SW27 | SW26 | SW25 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(4,0) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(4,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) - >; - }; + >; + }; - jian_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <5>; + jian_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <5>; // | SW0 | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | SW0 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | // | SW25 | SW26 | SW27 | | SW27 | SW26 | SW25 | - map = < + map = < RC(4,0) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(4,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) - >; - }; + >; + }; - crkbd_transform: keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <5>; + crkbd_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <5>; // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | // | SW25 | SW26 | SW27 | | SW27 | SW26 | SW25 | - map = < + map = < RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; }; diff --git a/app/boards/shields/jiran/jiran_left.overlay b/app/boards/shields/jiran/jiran_left.overlay index 4466202c..3b7f5e55 100644 --- a/app/boards/shields/jiran/jiran_left.overlay +++ b/app/boards/shields/jiran/jiran_left.overlay @@ -7,12 +7,12 @@ #include "jiran.dtsi" &kscan0 { - col-gpios - = <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jiran/jiran_right.overlay b/app/boards/shields/jiran/jiran_right.overlay index c3648797..668c5513 100644 --- a/app/boards/shields/jiran/jiran_right.overlay +++ b/app/boards/shields/jiran/jiran_right.overlay @@ -7,24 +7,24 @@ #include "jiran.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &jian_transform { - col-offset = <6>; + col-offset = <6>; }; &crkbd_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 1 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 1 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jorne/Kconfig.defconfig b/app/boards/shields/jorne/Kconfig.defconfig index 775bb56a..04beb792 100644 --- a/app/boards/shields/jorne/Kconfig.defconfig +++ b/app/boards/shields/jorne/Kconfig.defconfig @@ -2,44 +2,44 @@ if SHIELD_JORNE_LEFT config ZMK_KEYBOARD_NAME - default "Jorne" + default "Jorne" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_JORNE_LEFT || SHIELD_JORNE_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/jorne/Kconfig.shield b/app/boards/shields/jorne/Kconfig.shield index 88fd4e5a..37a3cab5 100644 --- a/app/boards/shields/jorne/Kconfig.shield +++ b/app/boards/shields/jorne/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_JORNE_LEFT - def_bool $(shields_list_contains,jorne_left) + def_bool $(shields_list_contains,jorne_left) config SHIELD_JORNE_RIGHT - def_bool $(shields_list_contains,jorne_right) + def_bool $(shields_list_contains,jorne_right) diff --git a/app/boards/shields/jorne/boards/nice_nano.overlay b/app/boards/shields/jorne/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/jorne/boards/nice_nano.overlay +++ b/app/boards/shields/jorne/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/jorne/boards/nice_nano_v2.overlay b/app/boards/shields/jorne/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/jorne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/jorne/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/jorne/jorne.dtsi b/app/boards/shields/jorne/jorne.dtsi index bb862b8d..1d12b85c 100644 --- a/app/boards/shields/jorne/jorne.dtsi +++ b/app/boards/shields/jorne/jorne.dtsi @@ -7,93 +7,93 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW0 | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | SW0 | // | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(3,0) RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(3,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - crkbd_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + crkbd_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - five_column_transform: keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + five_column_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - // TODO: per-key RGB node(s)? + // TODO: per-key RGB node(s)? }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/jorne/jorne_left.overlay b/app/boards/shields/jorne/jorne_left.overlay index 7e132cd9..f0476b41 100644 --- a/app/boards/shields/jorne/jorne_left.overlay +++ b/app/boards/shields/jorne/jorne_left.overlay @@ -7,12 +7,12 @@ #include "jorne.dtsi" &kscan0 { - col-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jorne/jorne_right.overlay b/app/boards/shields/jorne/jorne_right.overlay index 698bf9dd..604f4816 100644 --- a/app/boards/shields/jorne/jorne_right.overlay +++ b/app/boards/shields/jorne/jorne_right.overlay @@ -7,24 +7,24 @@ #include "jorne.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &crkbd_transform { - col-offset = <6>; + col-offset = <6>; }; &five_column_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/kyria/Kconfig.defconfig b/app/boards/shields/kyria/Kconfig.defconfig index 82f48b4c..2d162736 100644 --- a/app/boards/shields/kyria/Kconfig.defconfig +++ b/app/boards/shields/kyria/Kconfig.defconfig @@ -2,44 +2,44 @@ if SHIELD_KYRIA_LEFT || SHIELD_KYRIA_REV2_LEFT || SHIELD_KYRIA_REV3_LEFT config ZMK_KEYBOARD_NAME - default "Kyria" + default "Kyria" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_KYRIA config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/kyria/Kconfig.shield b/app/boards/shields/kyria/Kconfig.shield index 52df9378..a9d5ac4f 100644 --- a/app/boards/shields/kyria/Kconfig.shield +++ b/app/boards/shields/kyria/Kconfig.shield @@ -5,25 +5,25 @@ config SHIELD_KYRIA bool config SHIELD_KYRIA_LEFT - def_bool $(shields_list_contains,kyria_left) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_left) + select SHIELD_KYRIA config SHIELD_KYRIA_RIGHT - def_bool $(shields_list_contains,kyria_right) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_right) + select SHIELD_KYRIA config SHIELD_KYRIA_REV2_LEFT - def_bool $(shields_list_contains,kyria_rev2_left) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_rev2_left) + select SHIELD_KYRIA config SHIELD_KYRIA_REV2_RIGHT - def_bool $(shields_list_contains,kyria_rev2_right) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_rev2_right) + select SHIELD_KYRIA config SHIELD_KYRIA_REV3_LEFT - def_bool $(shields_list_contains,kyria_rev3_left) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_rev3_left) + select SHIELD_KYRIA config SHIELD_KYRIA_REV3_RIGHT - def_bool $(shields_list_contains,kyria_rev3_right) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_rev3_right) + select SHIELD_KYRIA diff --git a/app/boards/shields/kyria/boards/nice_nano.overlay b/app/boards/shields/kyria/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/kyria/boards/nice_nano.overlay +++ b/app/boards/shields/kyria/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/kyria/boards/nice_nano_v2.overlay b/app/boards/shields/kyria/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/kyria/boards/nice_nano_v2.overlay +++ b/app/boards/shields/kyria/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/kyria/boards/nrfmicro_11.overlay b/app/boards/shields/kyria/boards/nrfmicro_11.overlay index 172859ae..8754dec6 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_11.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay index 172859ae..8754dec6 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/kyria/boards/nrfmicro_13.overlay b/app/boards/shields/kyria/boards/nrfmicro_13.overlay index 172859ae..8754dec6 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_13.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_13.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/kyria/kyria.dtsi b/app/boards/shields/kyria/kyria.dtsi index cffe23b0..b98240e4 100644 --- a/app/boards/shields/kyria/kyria.dtsi +++ b/app/boards/shields/kyria/kyria.dtsi @@ -7,58 +7,58 @@ #include "kyria_common.dtsi" / { - chosen { - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; // | MX6 | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | // | MX12 | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | // | MX20 | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(2,15) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) - >; - }; + >; + }; // | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | // | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | // | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | - five_column_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <4>; - map = < + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <4>; + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) - >; - }; + >; + }; }; &kscan0 { - row-gpios - = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + row-gpios + = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; }; &left_encoder { - a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; &right_encoder { - a-gpios = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + a-gpios = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; diff --git a/app/boards/shields/kyria/kyria.keymap b/app/boards/shields/kyria/kyria.keymap index a8804dd9..9a2163db 100644 --- a/app/boards/shields/kyria/kyria.keymap +++ b/app/boards/shields/kyria/kyria.keymap @@ -8,23 +8,23 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // --------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | - bindings = < - &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH - &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL - &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT - >; + bindings = < + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; }; diff --git a/app/boards/shields/kyria/kyria_common.dtsi b/app/boards/shields/kyria/kyria_common.dtsi index 1e61cc6b..2e10cd37 100644 --- a/app/boards/shields/kyria/kyria_common.dtsi +++ b/app/boards/shields/kyria/kyria_common.dtsi @@ -7,54 +7,54 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - }; + diode-direction = "col2row"; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - resolution = <4>; - status = "disabled"; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; - right_encoder: encoder_right { - compatible = "alps,ec11"; - label = "RIGHT_ENCODER"; - resolution = <4>; - status = "disabled"; - }; + right_encoder: encoder_right { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; - // TODO: RGB node(s) + // TODO: RGB node(s) }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <64>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <63>; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <64>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <63>; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/kyria/kyria_left.overlay b/app/boards/shields/kyria/kyria_left.overlay index 20ced548..d89a0775 100644 --- a/app/boards/shields/kyria/kyria_left.overlay +++ b/app/boards/shields/kyria/kyria_left.overlay @@ -7,18 +7,18 @@ #include "kyria.dtsi" &kscan0 { - col-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/kyria/kyria_rev2.dtsi b/app/boards/shields/kyria/kyria_rev2.dtsi index b40af365..e61131bf 100644 --- a/app/boards/shields/kyria/kyria_rev2.dtsi +++ b/app/boards/shields/kyria/kyria_rev2.dtsi @@ -7,49 +7,49 @@ #include "kyria_common.dtsi" / { - chosen { - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; // | MX6 | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | // | MX12 | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | // | MX20 | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(2,15) RC(3,2) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) - >; - }; + >; + }; // | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | // | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | // | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | - five_column_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <4>; - map = < + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <4>; + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(3,2) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) - >; - }; + >; + }; }; &left_encoder { - a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; &right_encoder { - a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; diff --git a/app/boards/shields/kyria/kyria_rev2.keymap b/app/boards/shields/kyria/kyria_rev2.keymap index a8804dd9..9a2163db 100644 --- a/app/boards/shields/kyria/kyria_rev2.keymap +++ b/app/boards/shields/kyria/kyria_rev2.keymap @@ -8,23 +8,23 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // --------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | - bindings = < - &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH - &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL - &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT - >; + bindings = < + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; }; diff --git a/app/boards/shields/kyria/kyria_rev2_left.overlay b/app/boards/shields/kyria/kyria_rev2_left.overlay index cee2e2a8..67eaeac2 100644 --- a/app/boards/shields/kyria/kyria_rev2_left.overlay +++ b/app/boards/shields/kyria/kyria_rev2_left.overlay @@ -7,24 +7,24 @@ #include "kyria_rev2.dtsi" &kscan0 { - row-gpios - = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/kyria/kyria_rev2_right.overlay b/app/boards/shields/kyria/kyria_rev2_right.overlay index 9e29c6f7..acc806cf 100644 --- a/app/boards/shields/kyria/kyria_rev2_right.overlay +++ b/app/boards/shields/kyria/kyria_rev2_right.overlay @@ -7,32 +7,32 @@ #include "kyria_rev2.dtsi" &default_transform { - col-offset = <8>; + col-offset = <8>; }; &five_column_transform { - col-offset = <8>; + col-offset = <8>; }; &kscan0 { - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/kyria/kyria_rev3.dtsi b/app/boards/shields/kyria/kyria_rev3.dtsi index 4a500006..0cf91c60 100644 --- a/app/boards/shields/kyria/kyria_rev3.dtsi +++ b/app/boards/shields/kyria/kyria_rev3.dtsi @@ -7,35 +7,35 @@ #include "kyria_common.dtsi" / { - chosen { - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <4>; - // | MX6 | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | - // | MX12 | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | - // | MX20 | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | - // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,3) RC(2,6) RC(2,7) RC(3,10) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) - RC(3,2) RC(3,4) RC(3,5) RC(3,1) RC(3,6) RC(3,7) RC(3,12) RC(3,8) RC(3,9) RC(3,11) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <4>; + // | MX6 | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | + // | MX12 | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | + // | MX20 | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | + // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,3) RC(2,6) RC(2,7) RC(3,10) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,2) RC(3,4) RC(3,5) RC(3,1) RC(3,6) RC(3,7) RC(3,12) RC(3,8) RC(3,9) RC(3,11) + >; + }; }; &left_encoder { - resolution = <2>; - a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <2>; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; &right_encoder { - resolution = <2>; - a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <2>; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; diff --git a/app/boards/shields/kyria/kyria_rev3.keymap b/app/boards/shields/kyria/kyria_rev3.keymap index fff2e051..d74757ca 100644 --- a/app/boards/shields/kyria/kyria_rev3.keymap +++ b/app/boards/shields/kyria/kyria_rev3.keymap @@ -9,30 +9,30 @@ /* Uncomment this block if using RGB &led_strip { - chain-length = <6>; - // chain-length = <31>; // Uncomment if using both per-key and underglow LEDs - // chain-length = <25>; // Uncomment if using only per-key LEDs. + chain-length = <6>; + // chain-length = <31>; // Uncomment if using both per-key and underglow LEDs + // chain-length = <25>; // Uncomment if using only per-key LEDs. }; */ / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - // --------------------------------------------------------------------------------------------------------------------------------- - // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | - // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | - // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | - // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | - bindings = < - &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH - &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL - &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT - >; + default_layer { + // --------------------------------------------------------------------------------------------------------------------------------- + // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | + // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | + // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | + bindings = < + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; }; diff --git a/app/boards/shields/kyria/kyria_rev3_left.overlay b/app/boards/shields/kyria/kyria_rev3_left.overlay index d00b9e4a..577b89dc 100644 --- a/app/boards/shields/kyria/kyria_rev3_left.overlay +++ b/app/boards/shields/kyria/kyria_rev3_left.overlay @@ -7,23 +7,23 @@ #include "kyria_rev3.dtsi" &kscan0 { - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/kyria/kyria_rev3_right.overlay b/app/boards/shields/kyria/kyria_rev3_right.overlay index ee69730c..88ed6589 100644 --- a/app/boards/shields/kyria/kyria_rev3_right.overlay +++ b/app/boards/shields/kyria/kyria_rev3_right.overlay @@ -7,27 +7,27 @@ #include "kyria_rev3.dtsi" &default_transform { - col-offset = <7>; + col-offset = <7>; }; &kscan0 { - row-gpios - = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/kyria/kyria_right.overlay b/app/boards/shields/kyria/kyria_right.overlay index 00ba5b2f..72d97027 100644 --- a/app/boards/shields/kyria/kyria_right.overlay +++ b/app/boards/shields/kyria/kyria_right.overlay @@ -7,27 +7,27 @@ #include "kyria.dtsi" &default_transform { - col-offset = <8>; + col-offset = <8>; }; &five_column_transform { - col-offset = <8>; + col-offset = <8>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/leeloo/Kconfig.defconfig b/app/boards/shields/leeloo/Kconfig.defconfig index d5bfab3d..7388a4b9 100644 --- a/app/boards/shields/leeloo/Kconfig.defconfig +++ b/app/boards/shields/leeloo/Kconfig.defconfig @@ -4,28 +4,28 @@ if SHIELD_LEELOO_LEFT config ZMK_KEYBOARD_NAME - default "Leeloo" + default "Leeloo" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_LEELOO_LEFT || SHIELD_LEELOO_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY @@ -33,16 +33,16 @@ if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/leeloo/Kconfig.shield b/app/boards/shields/leeloo/Kconfig.shield index 1736c6eb..46ea9640 100644 --- a/app/boards/shields/leeloo/Kconfig.shield +++ b/app/boards/shields/leeloo/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_LEELOO_LEFT - def_bool $(shields_list_contains,leeloo_left) + def_bool $(shields_list_contains,leeloo_left) config SHIELD_LEELOO_RIGHT - def_bool $(shields_list_contains,leeloo_right) + def_bool $(shields_list_contains,leeloo_right) diff --git a/app/boards/shields/leeloo/leeloo.dtsi b/app/boards/shields/leeloo/leeloo.dtsi index 5f2cbeac..438f9a9d 100644 --- a/app/boards/shields/leeloo/leeloo.dtsi +++ b/app/boards/shields/leeloo/leeloo.dtsi @@ -67,21 +67,21 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/leeloo/leeloo_left.overlay b/app/boards/shields/leeloo/leeloo_left.overlay index 1d6424fd..59fce1b0 100644 --- a/app/boards/shields/leeloo/leeloo_left.overlay +++ b/app/boards/shields/leeloo/leeloo_left.overlay @@ -6,16 +6,16 @@ #include "leeloo.dtsi" &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/leeloo/leeloo_right.overlay b/app/boards/shields/leeloo/leeloo_right.overlay index 2f3fbf5c..80e89529 100644 --- a/app/boards/shields/leeloo/leeloo_right.overlay +++ b/app/boards/shields/leeloo/leeloo_right.overlay @@ -6,20 +6,20 @@ #include "leeloo.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/lily58/Kconfig.defconfig b/app/boards/shields/lily58/Kconfig.defconfig index 97cecce1..e77a9c22 100644 --- a/app/boards/shields/lily58/Kconfig.defconfig +++ b/app/boards/shields/lily58/Kconfig.defconfig @@ -2,44 +2,44 @@ if SHIELD_LILY58_LEFT config ZMK_KEYBOARD_NAME - default "Lily58" + default "Lily58" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_LILY58_LEFT || SHIELD_LILY58_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/lily58/Kconfig.shield b/app/boards/shields/lily58/Kconfig.shield index 932e33b3..1b3bb6ba 100644 --- a/app/boards/shields/lily58/Kconfig.shield +++ b/app/boards/shields/lily58/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_LILY58_LEFT - def_bool $(shields_list_contains,lily58_left) + def_bool $(shields_list_contains,lily58_left) config SHIELD_LILY58_RIGHT - def_bool $(shields_list_contains,lily58_right) + def_bool $(shields_list_contains,lily58_right) diff --git a/app/boards/shields/lily58/boards/nice_nano.overlay b/app/boards/shields/lily58/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/lily58/boards/nice_nano.overlay +++ b/app/boards/shields/lily58/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/lily58/boards/nice_nano_v2.overlay b/app/boards/shields/lily58/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/lily58/boards/nice_nano_v2.overlay +++ b/app/boards/shields/lily58/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/lily58/lily58.dtsi b/app/boards/shields/lily58/lily58.dtsi index 1a296a8c..ec520f6b 100644 --- a/app/boards/shields/lily58/lily58.dtsi +++ b/app/boards/shields/lily58/lily58.dtsi @@ -7,75 +7,75 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; // | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | // | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | // | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | // | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | // | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,7) RC(4,8) RC(4,9) RC(4,10) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder>; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/lily58/lily58.keymap b/app/boards/shields/lily58/lily58.keymap index dd935c7a..7df3277f 100644 --- a/app/boards/shields/lily58/lily58.keymap +++ b/app/boards/shields/lily58/lily58.keymap @@ -10,61 +10,61 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | "[" | | "]" | N | M | , | . | / | SHIFT | // | ALT | GUI | LOWER| SPACE | | ENTER | RAISE| BSPC | GUI | - bindings = < + bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp GRAVE &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp LALT &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp BSPC &kp RGUI - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; - lower_layer { + lower_layer { // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | // | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | ~ | // | | | | | | | | | | | _ | + | { | } | "|" | // | | | | | | | | | | - bindings = < + bindings = < &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp TILDE &trans &ext_power EP_ON &ext_power EP_OFF &ext_power EP_TOG &trans &trans &trans &trans &trans &kp MINUS &kp KP_PLUS &kp LBRC &kp RBRC &kp PIPE &trans &trans &trans &trans &trans &trans &trans &trans - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; - raise_layer { + raise_layer { // ------------------------------------------------------------------------------------------------------------ // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | // | F1 | F2 | F3 | F4 | F5 | F6 | | | <- | v | ^ | -> | | // | F7 | F8 | F9 | F10 | F11 | F12 | | | | + | - | = | [ | ] | \ | // | | | | | | | | | | - bindings = < + bindings = < &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &kp KP_PLUS &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &trans &trans &trans &trans &trans &trans &trans &trans - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; }; diff --git a/app/boards/shields/lily58/lily58_left.overlay b/app/boards/shields/lily58/lily58_left.overlay index daa53651..b95332d9 100644 --- a/app/boards/shields/lily58/lily58_left.overlay +++ b/app/boards/shields/lily58/lily58_left.overlay @@ -7,16 +7,16 @@ #include "lily58.dtsi" &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/lily58/lily58_right.overlay b/app/boards/shields/lily58/lily58_right.overlay index 18ec806b..15820ad2 100644 --- a/app/boards/shields/lily58/lily58_right.overlay +++ b/app/boards/shields/lily58/lily58_right.overlay @@ -7,16 +7,16 @@ #include "lily58.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/lotus58/Kconfig.defconfig b/app/boards/shields/lotus58/Kconfig.defconfig index b6bb37d8..62695c20 100644 --- a/app/boards/shields/lotus58/Kconfig.defconfig +++ b/app/boards/shields/lotus58/Kconfig.defconfig @@ -4,44 +4,44 @@ if SHIELD_LOTUS58_LEFT config ZMK_KEYBOARD_NAME - default "Lotus58" + default "Lotus58" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_LOTUS58_LEFT || SHIELD_LOTUS58_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/lotus58/Kconfig.shield b/app/boards/shields/lotus58/Kconfig.shield index dbf7ba01..2d91c58c 100644 --- a/app/boards/shields/lotus58/Kconfig.shield +++ b/app/boards/shields/lotus58/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_LOTUS58_LEFT - def_bool $(shields_list_contains,lotus58_left) + def_bool $(shields_list_contains,lotus58_left) config SHIELD_LOTUS58_RIGHT - def_bool $(shields_list_contains,lotus58_right) + def_bool $(shields_list_contains,lotus58_right) diff --git a/app/boards/shields/lotus58/lotus58_left.overlay b/app/boards/shields/lotus58/lotus58_left.overlay index a51659df..a1fc1e28 100644 --- a/app/boards/shields/lotus58/lotus58_left.overlay +++ b/app/boards/shields/lotus58/lotus58_left.overlay @@ -7,16 +7,16 @@ #include "lotus58.dtsi" &kscan0 { - col-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/lotus58/lotus58_right.overlay b/app/boards/shields/lotus58/lotus58_right.overlay index dffcaeb1..5bdfe710 100644 --- a/app/boards/shields/lotus58/lotus58_right.overlay +++ b/app/boards/shields/lotus58/lotus58_right.overlay @@ -7,20 +7,20 @@ #include "lotus58.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/m60/Kconfig.defconfig b/app/boards/shields/m60/Kconfig.defconfig index ad105ed9..a4696954 100644 --- a/app/boards/shields/m60/Kconfig.defconfig +++ b/app/boards/shields/m60/Kconfig.defconfig @@ -4,6 +4,6 @@ if SHIELD_M60 config ZMK_KEYBOARD_NAME - default "m60" + default "m60" endif diff --git a/app/boards/shields/m60/Kconfig.shield b/app/boards/shields/m60/Kconfig.shield index 4ed58c49..b1414b96 100644 --- a/app/boards/shields/m60/Kconfig.shield +++ b/app/boards/shields/m60/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_M60 - def_bool $(shields_list_contains,m60) + def_bool $(shields_list_contains,m60) diff --git a/app/boards/shields/m60/m60.keymap b/app/boards/shields/m60/m60.keymap index aa656929..8daa6b7c 100644 --- a/app/boards/shields/m60/m60.keymap +++ b/app/boards/shields/m60/m60.keymap @@ -9,10 +9,10 @@ #include / { - keymap0: keymap { - compatible = "zmk,keymap"; + keymap0: keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | @@ -20,23 +20,23 @@ // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | // | CTL | WIN | ALT | SPACE | ALT | MO(1) | WIN | CTRL | // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RGUI &kp RCTRL - >; - }; + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RGUI &kp RCTRL + >; + }; - fn_layer { - bindings = < + fn_layer { + bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bootloader &trans &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &sys_reset &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &none &none &trans &trans &none &none &none &none &none &none &none &none &none &none &trans &trans &trans &trans &trans &trans &trans &trans &trans - >; - }; - }; + >; + }; + }; }; diff --git a/app/boards/shields/m60/m60.overlay b/app/boards/shields/m60/m60.overlay index 18d06511..a2ab2593 100644 --- a/app/boards/shields/m60/m60.overlay +++ b/app/boards/shields/m60/m60.overlay @@ -7,42 +7,42 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&gpio0 19 GPIO_ACTIVE_HIGH> - , <&gpio0 20 GPIO_ACTIVE_HIGH> - , <&gpio0 21 GPIO_ACTIVE_HIGH> - , <&gpio0 22 GPIO_ACTIVE_HIGH> - , <&gpio0 23 GPIO_ACTIVE_HIGH> - , <&gpio0 24 GPIO_ACTIVE_HIGH> - , <&gpio0 25 GPIO_ACTIVE_HIGH> - , <&gpio0 26 GPIO_ACTIVE_HIGH> - ; - }; + diode-direction = "col2row"; + row-gpios + = <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpio0 19 GPIO_ACTIVE_HIGH> + , <&gpio0 20 GPIO_ACTIVE_HIGH> + , <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 22 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 24 GPIO_ACTIVE_HIGH> + , <&gpio0 25 GPIO_ACTIVE_HIGH> + , <&gpio0 26 GPIO_ACTIVE_HIGH> + ; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <8>; - rows = <8>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <8>; + rows = <8>; // | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | MX13 | MX14 | // | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | MX21 | MX22 | MX23 | MX24 | MX25 | MX26 | MX27 | MX28 | // | MX29 | MX30 | MX31 | MX32 | MX33 | MX34 | MX35 | MX36 | MX37 | MX38 | MX39 | MX40 | MX41 | @@ -55,6 +55,6 @@ RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4 RC(6,4) RC(6,3) RC(6,2) RC(6,1) RC(6,0) RC(5,7) RC(5,6) RC(5,5) RC(5,4) RC(5,3) RC(5,2) RC(5,1) RC(6,5) RC(6,6) RC(6,7) RC(7,0) RC(7,1) RC(7,2) RC(7,3) RC(7,4) >; - }; + }; }; diff --git a/app/boards/shields/microdox/Kconfig.defconfig b/app/boards/shields/microdox/Kconfig.defconfig index 8c0b042e..d05ae045 100644 --- a/app/boards/shields/microdox/Kconfig.defconfig +++ b/app/boards/shields/microdox/Kconfig.defconfig @@ -4,44 +4,44 @@ if SHIELD_MICRODOX_LEFT config ZMK_KEYBOARD_NAME - default "Microdox" + default "Microdox" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_MICRODOX_LEFT || SHIELD_MICRODOX_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/microdox/Kconfig.shield b/app/boards/shields/microdox/Kconfig.shield index ac79eab6..47543760 100644 --- a/app/boards/shields/microdox/Kconfig.shield +++ b/app/boards/shields/microdox/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_MICRODOX_LEFT - def_bool $(shields_list_contains,microdox_left) + def_bool $(shields_list_contains,microdox_left) config SHIELD_MICRODOX_RIGHT - def_bool $(shields_list_contains,microdox_right) + def_bool $(shields_list_contains,microdox_right) diff --git a/app/boards/shields/microdox/boards/nice_nano.overlay b/app/boards/shields/microdox/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/microdox/boards/nice_nano.overlay +++ b/app/boards/shields/microdox/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/microdox/boards/nice_nano_v2.overlay b/app/boards/shields/microdox/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/microdox/boards/nice_nano_v2.overlay +++ b/app/boards/shields/microdox/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/microdox/microdox.dtsi b/app/boards/shields/microdox/microdox.dtsi index e3fabb3e..e02aa554 100644 --- a/app/boards/shields/microdox/microdox.dtsi +++ b/app/boards/shields/microdox/microdox.dtsi @@ -7,59 +7,59 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; // | SW1 | SW2 | SW3 | SW4 | SW5 | | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW6 | SW7 | SW8 | SW9 | SW10 | | SW10 | SW9 | SW8 | SW7 | SW6 | // | SW11 | SW12 | SW13 | SW14 | SW15 | | SW15 | SW14 | SW13 | SW12 | SW11 | // | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - // TODO: per-key RGB node(s)? + // TODO: per-key RGB node(s)? }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/microdox/microdox_left.overlay b/app/boards/shields/microdox/microdox_left.overlay index 307776e7..d38f50da 100644 --- a/app/boards/shields/microdox/microdox_left.overlay +++ b/app/boards/shields/microdox/microdox_left.overlay @@ -7,11 +7,11 @@ #include "microdox.dtsi" &kscan0 { - col-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/microdox/microdox_right.overlay b/app/boards/shields/microdox/microdox_right.overlay index 5475c31f..4dd29016 100644 --- a/app/boards/shields/microdox/microdox_right.overlay +++ b/app/boards/shields/microdox/microdox_right.overlay @@ -7,20 +7,20 @@ #include "microdox.dtsi" &default_transform { - col-offset = <5>; + col-offset = <5>; }; &oled { - segment-remap; - com-invdir; + segment-remap; + com-invdir; }; &kscan0 { - col-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/murphpad/Kconfig.defconfig b/app/boards/shields/murphpad/Kconfig.defconfig index 07e71826..80e65351 100644 --- a/app/boards/shields/murphpad/Kconfig.defconfig +++ b/app/boards/shields/murphpad/Kconfig.defconfig @@ -4,34 +4,34 @@ if SHIELD_MURPHPAD config ZMK_KEYBOARD_NAME - default "MurphPad" + default "MurphPad" if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/murphpad/Kconfig.shield b/app/boards/shields/murphpad/Kconfig.shield index 389caa26..1c961aea 100644 --- a/app/boards/shields/murphpad/Kconfig.shield +++ b/app/boards/shields/murphpad/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_MURPHPAD - def_bool $(shields_list_contains,murphpad) \ No newline at end of file + def_bool $(shields_list_contains,murphpad) \ No newline at end of file diff --git a/app/boards/shields/murphpad/boards/nice_nano.overlay b/app/boards/shields/murphpad/boards/nice_nano.overlay index 3e2241a2..ac6c51d5 100644 --- a/app/boards/shields/murphpad/boards/nice_nano.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay index 3e2241a2..ac6c51d5 100644 --- a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/murphpad/murphpad.overlay b/app/boards/shields/murphpad/murphpad.overlay index b7fead60..13905092 100644 --- a/app/boards/shields/murphpad/murphpad.overlay +++ b/app/boards/shields/murphpad/murphpad.overlay @@ -7,69 +7,69 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + diode-direction = "col2row"; + row-gpios + = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - col-gpios - = <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; + }; - encoder_1: encoder_1 { - compatible = "alps,ec11"; - label = "Encoder 1"; - a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_1: encoder_1 { + compatible = "alps,ec11"; + label = "Encoder 1"; + a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - encoder_2: encoder_2 { - compatible = "alps,ec11"; - label = "Encoder 2"; - a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_2: encoder_2 { + compatible = "alps,ec11"; + label = "Encoder 2"; + a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/nibble/Kconfig.defconfig b/app/boards/shields/nibble/Kconfig.defconfig index d5e8cbeb..31ac7cfe 100644 --- a/app/boards/shields/nibble/Kconfig.defconfig +++ b/app/boards/shields/nibble/Kconfig.defconfig @@ -4,38 +4,38 @@ if SHIELD_NIBBLE config ZMK_KEYBOARD_NAME - default "NIBBLE" + default "NIBBLE" config ZMK_USB - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/nibble/Kconfig.shield b/app/boards/shields/nibble/Kconfig.shield index 44364f4e..cb6fd15e 100644 --- a/app/boards/shields/nibble/Kconfig.shield +++ b/app/boards/shields/nibble/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_NIBBLE - def_bool $(shields_list_contains,nibble) + def_bool $(shields_list_contains,nibble) diff --git a/app/boards/shields/nibble/boards/nice_nano.overlay b/app/boards/shields/nibble/boards/nice_nano.overlay index 54ab9fec..45c55263 100644 --- a/app/boards/shields/nibble/boards/nice_nano.overlay +++ b/app/boards/shields/nibble/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/nibble/boards/nice_nano_v2.overlay b/app/boards/shields/nibble/boards/nice_nano_v2.overlay index 54ab9fec..45c55263 100644 --- a/app/boards/shields/nibble/boards/nice_nano_v2.overlay +++ b/app/boards/shields/nibble/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/nibble/nibble.keymap b/app/boards/shields/nibble/nibble.keymap index c02aad75..5b90f6c1 100644 --- a/app/boards/shields/nibble/nibble.keymap +++ b/app/boards/shields/nibble/nibble.keymap @@ -9,39 +9,39 @@ #include / { - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder_1>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder_1>; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - label = "Default"; + default_layer { + label = "Default"; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - bindings = < + bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp HOME &kp C_MUTE &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp DEL &trans &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP &trans &kp LSHFT &trans &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN &trans &kp LCTRL &kp LGUI &kp LALT &kp SPACE &mo 1 &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT - >; - }; - function_layer { - label = "Function"; + >; + }; + function_layer { + label = "Function"; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - bindings = < + bindings = < &kp TILDE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &kp END &kp C_MUTE &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_PRV &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &kp C_PREV &kp C_PP &kp C_NEXT - >; - }; - }; + >; + }; + }; }; diff --git a/app/boards/shields/nibble/nibble.overlay b/app/boards/shields/nibble/nibble.overlay index baf1eb10..cd117640 100644 --- a/app/boards/shields/nibble/nibble.overlay +++ b/app/boards/shields/nibble/nibble.overlay @@ -7,69 +7,69 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - encoder_1: encoder_1 { - compatible = "alps,ec11"; - label = "Encoder 1"; - a-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "okay"; - }; + encoder_1: encoder_1 { + compatible = "alps,ec11"; + label = "Encoder 1"; + a-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-demux"; - label = "KSCAN"; - polling-interval-msec = <25>; - input-gpios - = <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - output-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - ; - }; + kscan0: kscan { + compatible = "zmk,kscan-gpio-demux"; + label = "KSCAN"; + polling-interval-msec = <25>; + input-gpios + = <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + output-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + ; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; - map = < + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,15) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,15) RC(3,0) RC(3,1) RC(0,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) RC(3,15) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,6) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) - >; - }; + >; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/nice_view/Kconfig.defconfig b/app/boards/shields/nice_view/Kconfig.defconfig index 22c5f647..d2378409 100644 --- a/app/boards/shields/nice_view/Kconfig.defconfig +++ b/app/boards/shields/nice_view/Kconfig.defconfig @@ -4,24 +4,24 @@ if SHIELD_NICE_VIEW config ZMK_DISPLAY - select LV_FONT_MONTSERRAT_26 + select LV_FONT_MONTSERRAT_26 if ZMK_DISPLAY config SPI - default y + default y config LS0XX - default y + default y config ZMK_WIDGET_WPM_STATUS - default y if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL + default y if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # ZMK_DISPLAY diff --git a/app/boards/shields/nice_view/Kconfig.shield b/app/boards/shields/nice_view/Kconfig.shield index 55cba788..fbe4fde8 100644 --- a/app/boards/shields/nice_view/Kconfig.shield +++ b/app/boards/shields/nice_view/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_NICE_VIEW - def_bool $(shields_list_contains,nice_view) + def_bool $(shields_list_contains,nice_view) diff --git a/app/boards/shields/nice_view/nice_view.overlay b/app/boards/shields/nice_view/nice_view.overlay index eacdd41a..49ce0f23 100644 --- a/app/boards/shields/nice_view/nice_view.overlay +++ b/app/boards/shields/nice_view/nice_view.overlay @@ -5,19 +5,19 @@ */ &nice_view_spi { - status = "okay"; - nice_view: ls0xx@0 { - compatible = "sharp,ls0xx"; - label = "DISPLAY"; - spi-max-frequency = <1000000>; - reg = <0>; - width = <160>; - height = <68>; - }; + status = "okay"; + nice_view: ls0xx@0 { + compatible = "sharp,ls0xx"; + label = "DISPLAY"; + spi-max-frequency = <1000000>; + reg = <0>; + width = <160>; + height = <68>; + }; }; / { - chosen { - zephyr,display = &nice_view; - }; + chosen { + zephyr,display = &nice_view; + }; }; diff --git a/app/boards/shields/nice_view_adapter/Kconfig.shield b/app/boards/shields/nice_view_adapter/Kconfig.shield index bf9ba7cb..f95a209c 100644 --- a/app/boards/shields/nice_view_adapter/Kconfig.shield +++ b/app/boards/shields/nice_view_adapter/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_NICE_VIEW_ADAPTER - def_bool $(shields_list_contains,nice_view_adapter) + def_bool $(shields_list_contains,nice_view_adapter) diff --git a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay index b8b07258..706cffbe 100644 --- a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay index d9cc0835..e00b599c 100644 --- a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay +++ b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay index 2a1b757d..45ba34de 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay index 2a1b757d..45ba34de 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay index b8b07258..706cffbe 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay index 1cd19db9..5b5dbfb1 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay index b8b07258..706cffbe 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay index b8b07258..706cffbe 100644 --- a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/pancake/Kconfig.shield b/app/boards/shields/pancake/Kconfig.shield index 784d25a4..ca00d303 100644 --- a/app/boards/shields/pancake/Kconfig.shield +++ b/app/boards/shields/pancake/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_PANCAKE - def_bool $(shields_list_contains,pancake) \ No newline at end of file + def_bool $(shields_list_contains,pancake) \ No newline at end of file diff --git a/app/boards/shields/quefrency/Kconfig.defconfig b/app/boards/shields/quefrency/Kconfig.defconfig index 28e46a56..db618287 100644 --- a/app/boards/shields/quefrency/Kconfig.defconfig +++ b/app/boards/shields/quefrency/Kconfig.defconfig @@ -5,16 +5,16 @@ if SHIELD_QUEFRENCY_LEFT config ZMK_KEYBOARD_NAME - default "Quefrency" + default "Quefrency" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_QUEFRENCY_LEFT || SHIELD_QUEFRENCY_RIGHT config ZMK_SPLIT - default y + default y endif \ No newline at end of file diff --git a/app/boards/shields/quefrency/Kconfig.shield b/app/boards/shields/quefrency/Kconfig.shield index d205e58f..d30d30f1 100644 --- a/app/boards/shields/quefrency/Kconfig.shield +++ b/app/boards/shields/quefrency/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_QUEFRENCY_LEFT - def_bool $(shields_list_contains,quefrency_left) + def_bool $(shields_list_contains,quefrency_left) config SHIELD_QUEFRENCY_RIGHT - def_bool $(shields_list_contains,quefrency_right) + def_bool $(shields_list_contains,quefrency_right) diff --git a/app/boards/shields/quefrency/quefrency.dtsi b/app/boards/shields/quefrency/quefrency.dtsi index c9cb7d43..f7dc4489 100644 --- a/app/boards/shields/quefrency/quefrency.dtsi +++ b/app/boards/shields/quefrency/quefrency.dtsi @@ -7,26 +7,26 @@ #include / { - chosen { - zmk,kscan = &kscan0; + chosen { + zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + zmk,matrix_transform = &default_transform; + }; - /* - * This transform correspondsto the 60% left without macro keypad and 65% right, even this - * combination of PCBs can have keys in different locations based on configuration. - */ - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <6>; - map = < + /* + * This transform correspondsto the 60% left without macro keypad and 65% right, even this + * combination of PCBs can have keys in different locations based on configuration. + */ + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <6>; + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) /**/ RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,14) RC(5,13) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) /**/RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(5,14) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) /**/ RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,13) RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) /**/ RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,12) RC(3,13) RC(3,14) RC(3,11) RC(4,0) RC(4,1) RC(4,2) RC(4,4) RC(4,6) /**/ RC(4,7) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,9) - >; - }; + >; + }; }; diff --git a/app/boards/shields/redox/Kconfig.defconfig b/app/boards/shields/redox/Kconfig.defconfig index bf122b5e..32e30ad5 100644 --- a/app/boards/shields/redox/Kconfig.defconfig +++ b/app/boards/shields/redox/Kconfig.defconfig @@ -3,16 +3,16 @@ if SHIELD_REDOX_LEFT config ZMK_KEYBOARD_NAME - default "Redox" + default "Redox" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_REDOX_LEFT || SHIELD_REDOX_RIGHT config ZMK_SPLIT - default y + default y endif \ No newline at end of file diff --git a/app/boards/shields/redox/Kconfig.shield b/app/boards/shields/redox/Kconfig.shield index 2df91c11..8e6c601d 100644 --- a/app/boards/shields/redox/Kconfig.shield +++ b/app/boards/shields/redox/Kconfig.shield @@ -1,7 +1,7 @@ # Copyright (c) 2021 The ZMK Contributors # SPDX-License-Identifier: MIT config SHIELD_REDOX_LEFT - def_bool $(shields_list_contains,redox_left) + def_bool $(shields_list_contains,redox_left) config SHIELD_REDOX_RIGHT - def_bool $(shields_list_contains,redox_right) + def_bool $(shields_list_contains,redox_right) diff --git a/app/boards/shields/redox/boards/nice_nano.overlay b/app/boards/shields/redox/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/redox/boards/nice_nano.overlay +++ b/app/boards/shields/redox/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/redox/boards/nice_nano_v2.overlay b/app/boards/shields/redox/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/redox/boards/nice_nano_v2.overlay +++ b/app/boards/shields/redox/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/redox/redox.dtsi b/app/boards/shields/redox/redox.dtsi index 9c0705a6..d2d72d0f 100644 --- a/app/boards/shields/redox/redox.dtsi +++ b/app/boards/shields/redox/redox.dtsi @@ -7,42 +7,42 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | SW13 | | SW13 | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW14 | SW15 | SW16 | SW17 | SW18 | SW19 | SW20 | | SW20 | SW19 | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW21 | SW22 | SW23 | SW24 | SW25 | SW26 | SW27 | SW28 | | SW28 | SW27 | SW26 | SW25 | SW24 | SW23 | SW22 | SW21 | // | SW29 | SW30 | SW31 | SW32 | SW33 | SW34 | SW35 | | SW35 | SW34 | SW33 | SW32 | SW31 | SW30 | SW29 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(0,6) RC(0,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(1,6) RC(1,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(2,6) RC(3,6) RC(3,7) RC(2,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; }; diff --git a/app/boards/shields/redox/redox_left.overlay b/app/boards/shields/redox/redox_left.overlay index 322dca79..d68029d8 100644 --- a/app/boards/shields/redox/redox_left.overlay +++ b/app/boards/shields/redox/redox_left.overlay @@ -7,13 +7,13 @@ #include "redox.dtsi" &kscan0 { - col-gpios - = <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/redox/redox_right.overlay b/app/boards/shields/redox/redox_right.overlay index f2dcfed0..09b14637 100644 --- a/app/boards/shields/redox/redox_right.overlay +++ b/app/boards/shields/redox/redox_right.overlay @@ -7,17 +7,17 @@ #include "redox.dtsi" &default_transform { - col-offset = <7>; + col-offset = <7>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/reviung41/boards/nice_nano.overlay b/app/boards/shields/reviung41/boards/nice_nano.overlay index 741237e1..8590149e 100644 --- a/app/boards/shields/reviung41/boards/nice_nano.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <11>; - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <11>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay index 741237e1..8590149e 100644 --- a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <11>; - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <11>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/romac/Kconfig.defconfig b/app/boards/shields/romac/Kconfig.defconfig index 53527971..5cd94faa 100644 --- a/app/boards/shields/romac/Kconfig.defconfig +++ b/app/boards/shields/romac/Kconfig.defconfig @@ -4,7 +4,7 @@ if SHIELD_ROMAC config ZMK_KEYBOARD_NAME - default "RoMac" + default "RoMac" endif diff --git a/app/boards/shields/romac/Kconfig.shield b/app/boards/shields/romac/Kconfig.shield index 59669d33..9bdd2c5f 100644 --- a/app/boards/shields/romac/Kconfig.shield +++ b/app/boards/shields/romac/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_ROMAC - def_bool $(shields_list_contains,romac) + def_bool $(shields_list_contains,romac) diff --git a/app/boards/shields/romac/romac.overlay b/app/boards/shields/romac/romac.overlay index 827273a4..480d3f84 100644 --- a/app/boards/shields/romac/romac.overlay +++ b/app/boards/shields/romac/romac.overlay @@ -7,28 +7,28 @@ #include / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + ; - }; + }; }; diff --git a/app/boards/shields/romac_plus/Kconfig.defconfig b/app/boards/shields/romac_plus/Kconfig.defconfig index c4efdb97..442bc0bd 100644 --- a/app/boards/shields/romac_plus/Kconfig.defconfig +++ b/app/boards/shields/romac_plus/Kconfig.defconfig @@ -4,6 +4,6 @@ if SHIELD_ROMAC_PLUS config ZMK_KEYBOARD_NAME - default "RoMac+ v4" + default "RoMac+ v4" endif \ No newline at end of file diff --git a/app/boards/shields/romac_plus/Kconfig.shield b/app/boards/shields/romac_plus/Kconfig.shield index a7c7c614..277f1eb3 100644 --- a/app/boards/shields/romac_plus/Kconfig.shield +++ b/app/boards/shields/romac_plus/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_ROMAC_PLUS - def_bool $(shields_list_contains,romac_plus) + def_bool $(shields_list_contains,romac_plus) diff --git a/app/boards/shields/romac_plus/boards/nice_nano.overlay b/app/boards/shields/romac_plus/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/romac_plus/romac_plus.dtsi b/app/boards/shields/romac_plus/romac_plus.dtsi index 0fd4374a..71ec87b2 100644 --- a/app/boards/shields/romac_plus/romac_plus.dtsi +++ b/app/boards/shields/romac_plus/romac_plus.dtsi @@ -7,50 +7,50 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <3>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <3>; + rows = <4>; - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(1,0) RC(1,1) RC(1,2) RC(2,0) RC(2,1) RC(2,2) RC(3,0) RC(3,1) RC(3,2) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder>; + }; - // TODO: per-key RGB node(s)? + // TODO: per-key RGB node(s)? }; \ No newline at end of file diff --git a/app/boards/shields/romac_plus/romac_plus.overlay b/app/boards/shields/romac_plus/romac_plus.overlay index 4ef38744..2308e284 100644 --- a/app/boards/shields/romac_plus/romac_plus.overlay +++ b/app/boards/shields/romac_plus/romac_plus.overlay @@ -7,22 +7,22 @@ #include "romac_plus.dtsi" / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; + diode-direction = "col2row"; - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; + }; }; diff --git a/app/boards/shields/settings_reset/Kconfig.defconfig b/app/boards/shields/settings_reset/Kconfig.defconfig index 6d050cb4..05f3b406 100644 --- a/app/boards/shields/settings_reset/Kconfig.defconfig +++ b/app/boards/shields/settings_reset/Kconfig.defconfig @@ -4,7 +4,7 @@ if SHIELD_SETTINGS_RESET config ZMK_KEYBOARD_NAME - default "SETTINGS RESET" + default "SETTINGS RESET" endif diff --git a/app/boards/shields/settings_reset/Kconfig.shield b/app/boards/shields/settings_reset/Kconfig.shield index b5ce97f9..b1e6ed0e 100644 --- a/app/boards/shields/settings_reset/Kconfig.shield +++ b/app/boards/shields/settings_reset/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_SETTINGS_RESET - def_bool $(shields_list_contains,settings_reset) + def_bool $(shields_list_contains,settings_reset) diff --git a/app/boards/shields/settings_reset/settings_reset.overlay b/app/boards/shields/settings_reset/settings_reset.overlay index 51e04ba7..77a9d858 100644 --- a/app/boards/shields/settings_reset/settings_reset.overlay +++ b/app/boards/shields/settings_reset/settings_reset.overlay @@ -7,18 +7,18 @@ #include / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; - input-gpios - = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + input-gpios + = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; }; diff --git a/app/boards/shields/snap/Kconfig.defconfig b/app/boards/shields/snap/Kconfig.defconfig index c4a67e65..e21111e9 100644 --- a/app/boards/shields/snap/Kconfig.defconfig +++ b/app/boards/shields/snap/Kconfig.defconfig @@ -4,44 +4,44 @@ if SHIELD_SNAP_LEFT config ZMK_KEYBOARD_NAME - default "SNAP" + default "SNAP" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_SNAP_LEFT || SHIELD_SNAP_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/snap/Kconfig.shield b/app/boards/shields/snap/Kconfig.shield index eb02c45f..edbd1b57 100644 --- a/app/boards/shields/snap/Kconfig.shield +++ b/app/boards/shields/snap/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SNAP_LEFT - def_bool $(shields_list_contains,snap_left) + def_bool $(shields_list_contains,snap_left) config SHIELD_SNAP_RIGHT - def_bool $(shields_list_contains,snap_right) + def_bool $(shields_list_contains,snap_right) diff --git a/app/boards/shields/snap/boards/nice_nano.overlay b/app/boards/shields/snap/boards/nice_nano.overlay index 28e9ce69..1a51eb16 100644 --- a/app/boards/shields/snap/boards/nice_nano.overlay +++ b/app/boards/shields/snap/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/snap/boards/nice_nano_v2.overlay b/app/boards/shields/snap/boards/nice_nano_v2.overlay index 28e9ce69..1a51eb16 100644 --- a/app/boards/shields/snap/boards/nice_nano_v2.overlay +++ b/app/boards/shields/snap/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/snap/snap.dtsi b/app/boards/shields/snap/snap.dtsi index 77070db9..a374ad17 100644 --- a/app/boards/shields/snap/snap.dtsi +++ b/app/boards/shields/snap/snap.dtsi @@ -7,30 +7,30 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan_composite; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan_composite; + zmk,matrix_transform = &default_transform; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - resolution = <4>; - status = "disabled"; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; - right_encoder: encoder_right { - compatible = "alps,ec11"; - label = "RIGHT_ENCODER"; - resolution = <4>; - status = "disabled"; - }; + right_encoder: encoder_right { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <17>; - rows = <6>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <17>; + rows = <6>; // | R0C06L | R0C05L | R0C04L | R0C03L | R0C02L | R0C01L | R0C00L | | R0C15R | R0C14R | R0C13R | R0C12R | R0C11R | R0C10R | R0C09R | R0C08R | // R1C07L | R1C06L | R1C05L | R1C04L | R1C03L | R1C02L | R1C01L | R1C00L | | R1C15R | R1C14R | R1C13R | R1C12R | R1C11R | R1C10R | R1C09R | R1C08R | R2C0XR | @@ -39,48 +39,48 @@ // R4C07L | R4C06L | R4C05L | R4C04L | R4C03L | R4C02L | R4C01L | R4C00L | | R4C15R | R4C14R | R4C13R | R4C12R | R4C11R | R4C10R | R4C09R | R5C08R | // R5C07L | R5C06L | R5C05L | R5C04L | R5C02L | R5C00L | | R5C15R | R5C14R | R5C13R | R5C12R | R5C11R | R5C10R | R5C09R | - map = < - RC(0,6) RC(0,5) RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,15) RC(0,14) RC(0,13) RC(0,12) RC(0,11) RC(0,10) RC(0,9) RC(0,8) + map = < + RC(0,6) RC(0,5) RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,15) RC(0,14) RC(0,13) RC(0,12) RC(0,11) RC(0,10) RC(0,9) RC(0,8) RC(1,7) RC(1,6) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,15) RC(1,14) RC(1,13) RC(1,12) RC(1,11) RC(1,10) RC(1,9) RC(1,8) RC(1,16) RC(2,7) RC(2,6) RC(2,5) RC(2,4) RC(2,3) RC(2,2) RC(2,0) RC(2,15) RC(2,14) RC(2,13) RC(2,12) RC(2,11) RC(2,10) RC(2,9) RC(3,8) RC(2,8) RC(3,7) RC(3,6) RC(3,5) RC(3,4) RC(3,3) RC(3,2) RC(3,0) RC(3,15) RC(3,14) RC(3,13) RC(3,12) RC(3,11) RC(3,10) RC(3,9) RC(4,8) RC(4,7) RC(4,6) RC(4,5) RC(4,4) RC(4,3) RC(4,2) RC(4,1) RC(4,0) RC(4,15) RC(4,14) RC(4,13) RC(4,12) RC(4,11) RC(4,10) RC(4,9) RC(5,8) RC(5,7) RC(5,6) RC(5,5) RC(5,4) RC(5,2) RC(5,0) RC(5,15) RC(5,14) RC(5,13) RC(5,12) RC(5,11) RC(5,10) RC(5,9) - >; - }; + >; + }; - kscan_composite: kscan { - compatible = "zmk,kscan-composite"; - label = "KSCAN"; - rows = <6>; - columns = <17>; + kscan_composite: kscan { + compatible = "zmk,kscan-composite"; + label = "KSCAN"; + rows = <6>; + columns = <17>; - demux { - kscan = <&kscan_demux>; - }; - }; + demux { + kscan = <&kscan_demux>; + }; + }; - kscan_demux: kscan_demux { - compatible = "zmk,kscan-gpio-demux"; - label = "DEMUX"; - polling-interval-msec = <25>; - }; + kscan_demux: kscan_demux { + compatible = "zmk,kscan-gpio-demux"; + label = "DEMUX"; + polling-interval-msec = <25>; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/snap/snap.keymap b/app/boards/shields/snap/snap.keymap index cc4c5255..7c750f9f 100644 --- a/app/boards/shields/snap/snap.keymap +++ b/app/boards/shields/snap/snap.keymap @@ -10,38 +10,38 @@ #include / { - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - label = "Default"; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp C_VOL_UP C_VOL_DN>; - bindings = < + default_layer { + label = "Default"; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp C_VOL_UP C_VOL_DN>; + bindings = < &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp KP_NUM &kp PAUSE_BREAK &kp C_MUTE &kp TILDE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL &kp HOME &kp F13 &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp END &kp F14 &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP &kp F15 &kp LSHFT &kp NUHS &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN &kp F16 &kp LCTRL &kp LGUI &kp LALT &mo 1 &kp SPACE &kp BSPC &mo 1 &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT - >; - }; + >; + }; - function_layer { - label = "Function"; - sensor-bindings = <&inc_dec_kp C_NEXT C_PREV &inc_dec_kp C_NEXT C_PREV>; - bindings = < + function_layer { + label = "Function"; + sensor-bindings = <&inc_dec_kp C_NEXT C_PREV &inc_dec_kp C_NEXT C_PREV>; + bindings = < &bootloader &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader &kp C_PP &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_PP &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 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_BRI &rgb_ug RGB_EFF &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_BRD &rgb_ug RGB_HUI - >; - }; - }; + >; + }; + }; }; diff --git a/app/boards/shields/snap/snap_left.overlay b/app/boards/shields/snap/snap_left.overlay index b5b8a841..abbe9450 100644 --- a/app/boards/shields/snap/snap_left.overlay +++ b/app/boards/shields/snap/snap_left.overlay @@ -7,28 +7,28 @@ #include "snap.dtsi" &kscan_demux { - input-gpios - = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - output-gpios - = <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - ; + input-gpios + = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + output-gpios + = <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - a-gpios = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - status = "okay"; + a-gpios = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + status = "okay"; }; &oled { - segment-remap; - com-invdir; + segment-remap; + com-invdir; }; diff --git a/app/boards/shields/snap/snap_right.overlay b/app/boards/shields/snap/snap_right.overlay index dc71a5cf..ad04ae24 100644 --- a/app/boards/shields/snap/snap_right.overlay +++ b/app/boards/shields/snap/snap_right.overlay @@ -8,44 +8,44 @@ / { kscan_direct: kscan_direct { - compatible = "zmk,kscan-gpio-direct"; - label = "DIRECT"; - input-gpios - = <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + compatible = "zmk,kscan-gpio-direct"; + label = "DIRECT"; + input-gpios + = <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; }; &default_transform { - col-offset = <8>; + col-offset = <8>; }; &kscan_composite { - direct { - kscan = <&kscan_direct>; - row-offset = <1>; - column-offset = <8>; - }; + direct { + kscan = <&kscan_direct>; + row-offset = <1>; + column-offset = <8>; + }; }; &kscan_demux { - input-gpios - = <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - output-gpios - = <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - ; + input-gpios + = <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + output-gpios + = <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - status = "okay"; + a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + status = "okay"; }; diff --git a/app/boards/shields/sofle/Kconfig.defconfig b/app/boards/shields/sofle/Kconfig.defconfig index afa710ff..cc598d67 100644 --- a/app/boards/shields/sofle/Kconfig.defconfig +++ b/app/boards/shields/sofle/Kconfig.defconfig @@ -4,44 +4,44 @@ if SHIELD_SOFLE_LEFT config ZMK_KEYBOARD_NAME - default "Sofle" + default "Sofle" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_SOFLE_LEFT || SHIELD_SOFLE_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/sofle/Kconfig.shield b/app/boards/shields/sofle/Kconfig.shield index e23a97a1..a865e839 100644 --- a/app/boards/shields/sofle/Kconfig.shield +++ b/app/boards/shields/sofle/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SOFLE_LEFT - def_bool $(shields_list_contains,sofle_left) + def_bool $(shields_list_contains,sofle_left) config SHIELD_SOFLE_RIGHT - def_bool $(shields_list_contains,sofle_right) + def_bool $(shields_list_contains,sofle_right) diff --git a/app/boards/shields/sofle/sofle_left.overlay b/app/boards/shields/sofle/sofle_left.overlay index 13bfb397..057e6050 100644 --- a/app/boards/shields/sofle/sofle_left.overlay +++ b/app/boards/shields/sofle/sofle_left.overlay @@ -7,16 +7,16 @@ #include "sofle.dtsi" &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/sofle/sofle_right.overlay b/app/boards/shields/sofle/sofle_right.overlay index 53b10e60..65e5f330 100644 --- a/app/boards/shields/sofle/sofle_right.overlay +++ b/app/boards/shields/sofle/sofle_right.overlay @@ -7,20 +7,20 @@ #include "sofle.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig index 03078cd6..a28792c7 100644 --- a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig @@ -4,50 +4,50 @@ if SHIELD_SPLITKB_AURORA_CORNE_LEFT config ZMK_KEYBOARD_NAME - default "Aurora Corne" + default "Aurora Corne" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif # SHIELD_SPLITKB_AURORA_CORNE_LEFT if SHIELD_SPLITKB_AURORA_CORNE_LEFT || SHIELD_SPLITKB_AURORA_CORNE_RIGHT config ZMK_SPLIT - default y + default y config ZMK_RGB_UNDERGLOW - select WS2812_STRIP - select SPI + select WS2812_STRIP + select SPI config ZMK_DISPLAY if ZMK_DISPLAY config SSD1306 - default y + default y config I2C - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.shield b/app/boards/shields/splitkb_aurora_corne/Kconfig.shield index 3de10105..1efcdf00 100644 --- a/app/boards/shields/splitkb_aurora_corne/Kconfig.shield +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SPLITKB_AURORA_CORNE_LEFT - def_bool $(shields_list_contains,splitkb_aurora_corne_left) + def_bool $(shields_list_contains,splitkb_aurora_corne_left) config SHIELD_SPLITKB_AURORA_CORNE_RIGHT - def_bool $(shields_list_contains,splitkb_aurora_corne_right) + def_bool $(shields_list_contains,splitkb_aurora_corne_right) diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi index aa525948..a1b7b643 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi @@ -8,85 +8,85 @@ / { - chosen { - zephyr,display = &oled; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - five_column_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - left_encoder: left_encoder { - compatible = "alps,ec11"; - label = "L_ENCODER"; - resolution = <4>; - status = "disabled"; + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "L_ENCODER"; + resolution = <4>; + status = "disabled"; - a-gpios = <&pro_micro 4 GPIO_PULL_UP>; - b-gpios = <&pro_micro 5 GPIO_PULL_UP>; - }; + a-gpios = <&pro_micro 4 GPIO_PULL_UP>; + b-gpios = <&pro_micro 5 GPIO_PULL_UP>; + }; - right_encoder: right_encoder { - compatible = "alps,ec11"; - label = "R_ENCODER"; - resolution = <4>; - status = "disabled"; + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "R_ENCODER"; + resolution = <4>; + status = "disabled"; - a-gpios = <&pro_micro 19 GPIO_PULL_UP>; - b-gpios = <&pro_micro 18 GPIO_PULL_UP>; - }; + a-gpios = <&pro_micro 19 GPIO_PULL_UP>; + b-gpios = <&pro_micro 18 GPIO_PULL_UP>; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap index 53218a86..0555cf41 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap @@ -35,7 +35,7 @@ &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; @@ -49,7 +49,7 @@ &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay index 82234278..89563f42 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay @@ -7,36 +7,36 @@ #include "splitkb_aurora_corne.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "col2row"; + label = "KSCAN"; + diode-direction = "col2row"; - row-gpios - = <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; + row-gpios + = <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; - col-gpios - = <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; + }; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay index c1d34ffd..e05df223 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay @@ -7,42 +7,42 @@ #include "splitkb_aurora_corne.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "col2row"; + label = "KSCAN"; + diode-direction = "col2row"; - row-gpios - = <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; + row-gpios + = <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; - col-gpios - = <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + ; + }; }; &right_encoder { - status = "okay"; + status = "okay"; }; &default_transform { - col-offset = <6>; + col-offset = <6>; }; &five_column_transform { - col-offset = <6>; + col-offset = <6>; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig index 221bf90a..e54e2b43 100644 --- a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig @@ -4,50 +4,50 @@ if SHIELD_SPLITKB_AURORA_LILY58_LEFT config ZMK_KEYBOARD_NAME - default "Aurora Lily58" + default "Aurora Lily58" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif # SHIELD_SPLITKB_AURORA_LILY58_LEFT if SHIELD_SPLITKB_AURORA_LILY58_LEFT || SHIELD_SPLITKB_AURORA_LILY58_RIGHT config ZMK_SPLIT - default y + default y config ZMK_RGB_UNDERGLOW - select WS2812_STRIP - select SPI + select WS2812_STRIP + select SPI config ZMK_DISPLAY if ZMK_DISPLAY config SSD1306 - default y + default y config I2C - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield b/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield index 35f8b2d1..a64f47dc 100644 --- a/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SPLITKB_AURORA_LILY58_LEFT - def_bool $(shields_list_contains,splitkb_aurora_lily58_left) + def_bool $(shields_list_contains,splitkb_aurora_lily58_left) config SHIELD_SPLITKB_AURORA_LILY58_RIGHT - def_bool $(shields_list_contains,splitkb_aurora_lily58_right) + def_bool $(shields_list_contains,splitkb_aurora_lily58_right) diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay index 5b9ce4a8..0eafa704 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay @@ -2,46 +2,46 @@ &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <5>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - color-mapping = ; - }; + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay index 9e168625..6601d27d 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay @@ -1,46 +1,46 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <5>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - color-mapping = ; - }; + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi index 08e2ac9e..908356c7 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi @@ -8,71 +8,71 @@ / { - chosen { - zephyr,display = &oled; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; // | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | // | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | // | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | // | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | // | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,1) RC(4,10) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) - >; - }; + >; + }; - left_encoder: left_encoder { - compatible = "alps,ec11"; - label = "L_ENCODER"; - resolution = <4>; - status = "disabled"; + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "L_ENCODER"; + resolution = <4>; + status = "disabled"; - a-gpios = <&pro_micro 5 GPIO_PULL_UP>; - b-gpios = <&pro_micro 4 GPIO_PULL_UP>; - }; + a-gpios = <&pro_micro 5 GPIO_PULL_UP>; + b-gpios = <&pro_micro 4 GPIO_PULL_UP>; + }; - right_encoder: right_encoder { - compatible = "alps,ec11"; - label = "R_ENCODER"; - resolution = <4>; - status = "disabled"; + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "R_ENCODER"; + resolution = <4>; + status = "disabled"; - a-gpios = <&pro_micro 18 GPIO_PULL_UP>; - b-gpios = <&pro_micro 19 GPIO_PULL_UP>; - }; + a-gpios = <&pro_micro 18 GPIO_PULL_UP>; + b-gpios = <&pro_micro 19 GPIO_PULL_UP>; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap index 376bcf26..b8a9103b 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap @@ -10,61 +10,61 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | "[" | | "]" | N | M | , | . | / | SHIFT | // | ALT | GUI | LOWER| SPACE | | ENTER | RAISE| BSPC | GUI | - bindings = < + bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp GRAVE &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp LALT &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp BSPC &kp RGUI - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; - lower_layer { + lower_layer { // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | // | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | ~ | // | | | | | | | | | | | _ | + | { | } | "|" | // | | | | | | | | | | - bindings = < + bindings = < &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &kp TILDE &trans &ext_power EP_ON &ext_power EP_OFF &ext_power EP_TOG &trans &trans &trans &trans &trans &kp MINUS &kp PLUS &kp LBRC &kp RBRC &kp PIPE &trans &trans &trans &trans &trans &trans &trans &trans - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; - raise_layer { + raise_layer { // ------------------------------------------------------------------------------------------------------------ // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | // | F1 | F2 | F3 | F4 | F5 | F6 | | | <- | v | ^ | -> | | // | F7 | F8 | F9 | F10 | F11 | F12 | | | | + | - | = | [ | ] | \ | // | | | | | | | | | | - bindings = < + bindings = < &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &kp KP_PLUS &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &trans &trans &trans &trans &trans &trans &trans &trans - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay index 10a195ff..c4f12dda 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay @@ -7,37 +7,37 @@ #include "splitkb_aurora_lily58.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "row2col"; + label = "KSCAN"; + diode-direction = "row2col"; - row-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + ; - col-gpios - = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; - }; + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay index eaebff36..09da298c 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay @@ -7,39 +7,39 @@ #include "splitkb_aurora_lily58.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "row2col"; + label = "KSCAN"; + diode-direction = "row2col"; - row-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; - col-gpios - = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; - }; + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; }; &right_encoder { - status = "okay"; + status = "okay"; }; &default_transform { - col-offset = <6>; + col-offset = <6>; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig index ac07c935..83cb1bf6 100644 --- a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig @@ -4,50 +4,50 @@ if SHIELD_SPLITKB_AURORA_SWEEP_LEFT config ZMK_KEYBOARD_NAME - default "Aurora Sweep" + default "Aurora Sweep" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif # SHIELD_SPLITKB_AURORA_SWEEP_LEFT if SHIELD_SPLITKB_AURORA_SWEEP_LEFT || SHIELD_SPLITKB_AURORA_SWEEP_RIGHT config ZMK_SPLIT - default y + default y config ZMK_RGB_UNDERGLOW - select WS2812_STRIP - select SPI + select WS2812_STRIP + select SPI config ZMK_DISPLAY if ZMK_DISPLAY config SSD1306 - default y + default y config I2C - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield b/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield index abb05282..7d92134c 100644 --- a/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SPLITKB_AURORA_SWEEP_LEFT - def_bool $(shields_list_contains,splitkb_aurora_sweep_left) + def_bool $(shields_list_contains,splitkb_aurora_sweep_left) config SHIELD_SPLITKB_AURORA_SWEEP_RIGHT - def_bool $(shields_list_contains,splitkb_aurora_sweep_right) + def_bool $(shields_list_contains,splitkb_aurora_sweep_right) diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi index a999df6a..ab568a09 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi @@ -8,73 +8,73 @@ / { - chosen { - zephyr,display = &oled; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; - map = < - RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) - RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) - RC(2,4) RC(2,3) RC(2,2) RC(2,1) RC(2,0) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) - RC(3,1) RC(3,0) RC(3,5) RC(3,6) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; + map = < + RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) + RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) + RC(2,4) RC(2,3) RC(2,2) RC(2,1) RC(2,0) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) + RC(3,1) RC(3,0) RC(3,5) RC(3,6) + >; + }; - left_encoder1: left_encoder1 { - compatible = "alps,ec11"; - label = "L_ENCODER1"; - resolution = <4>; - status = "disabled"; - }; + left_encoder1: left_encoder1 { + compatible = "alps,ec11"; + label = "L_ENCODER1"; + resolution = <4>; + status = "disabled"; + }; - left_encoder2: left_encoder2 { - compatible = "alps,ec11"; - label = "L_ENCODER2"; - resolution = <4>; - status = "disabled"; - }; + left_encoder2: left_encoder2 { + compatible = "alps,ec11"; + label = "L_ENCODER2"; + resolution = <4>; + status = "disabled"; + }; - right_encoder1: right_encoder1 { - compatible = "alps,ec11"; - label = "R_ENCODER1"; - resolution = <4>; - status = "disabled"; - }; + right_encoder1: right_encoder1 { + compatible = "alps,ec11"; + label = "R_ENCODER1"; + resolution = <4>; + status = "disabled"; + }; - right_encoder2: right_encoder2 { - compatible = "alps,ec11"; - label = "R_ENCODER2"; - resolution = <4>; - status = "disabled"; - }; + right_encoder2: right_encoder2 { + compatible = "alps,ec11"; + label = "R_ENCODER2"; + resolution = <4>; + status = "disabled"; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder1 &right_encoder1>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder1 &right_encoder1>; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap index 385d2022..4b57beac 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap @@ -62,41 +62,41 @@ keymap { compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P - &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp QUOT - &mt LSFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &mt LSFT RET - &mo 1 &kp LCTL &kp SPC &mo 2 - >; - }; + default_layer { + bindings = < + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp QUOT + &mt LSFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &mt LSFT RET + &mo 1 &kp LCTL &kp SPC &mo 2 + >; + }; - left_layer { - bindings = < - &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 - &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL - &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL - &mo 1 &kp LGUI &kp RGUI &mo 2 - >; - }; + left_layer { + bindings = < + &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 + &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL + &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL + &mo 1 &kp LGUI &kp RGUI &mo 2 + >; + }; - right_layer { - bindings = < - &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN - &kp HASH &kp QMARK &kp FSLH &kp COLN &kp SCLN &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BKSP - &kp LSFT &kp KPLS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT - &mo 3 &kp LCTL &kp SPC &mo 2 - >; - }; + right_layer { + bindings = < + &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN + &kp HASH &kp QMARK &kp FSLH &kp COLN &kp SCLN &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BKSP + &kp LSFT &kp KPLS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT + &mo 3 &kp LCTL &kp SPC &mo 2 + >; + }; - tri_layer { - bindings = < - &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &trans &trans &trans &trans &trans - &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans - &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans - &trans &trans &trans &trans - >; - }; + tri_layer { + bindings = < + &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &trans &trans &trans &trans &trans + &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans + &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans + &trans &trans &trans &trans + >; + }; - }; + }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay index 1ff5ed5e..f62d24fa 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay @@ -7,42 +7,42 @@ #include "splitkb_aurora_sweep.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "row2col"; + label = "KSCAN"; + diode-direction = "row2col"; - row-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; - col-gpios - = <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 4 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; - }; + col-gpios + = <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 4 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; }; &left_encoder1 { - status = "okay"; - a-gpios = <&pro_micro 9 GPIO_PULL_UP>; - b-gpios = <&pro_micro 8 GPIO_PULL_UP>; + status = "okay"; + a-gpios = <&pro_micro 9 GPIO_PULL_UP>; + b-gpios = <&pro_micro 8 GPIO_PULL_UP>; }; &left_encoder2 { - status = "okay"; - a-gpios = <&pro_micro 14 GPIO_PULL_UP>; - b-gpios = <&pro_micro 16 GPIO_PULL_UP>; + status = "okay"; + a-gpios = <&pro_micro 14 GPIO_PULL_UP>; + b-gpios = <&pro_micro 16 GPIO_PULL_UP>; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay index 81ddca40..ff1d16d3 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay @@ -7,45 +7,45 @@ #include "splitkb_aurora_sweep.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "row2col"; + label = "KSCAN"; + diode-direction = "row2col"; - row-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + ; - col-gpios - = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; - }; + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; }; &right_encoder1 { - status = "okay"; - a-gpios = <&pro_micro 16 GPIO_PULL_UP>; - b-gpios = <&pro_micro 10 GPIO_PULL_UP>; + status = "okay"; + a-gpios = <&pro_micro 16 GPIO_PULL_UP>; + b-gpios = <&pro_micro 10 GPIO_PULL_UP>; }; &right_encoder2 { - status = "okay"; - a-gpios = <&pro_micro 20 GPIO_PULL_UP>; - b-gpios = <&pro_micro 4 GPIO_PULL_UP>; + status = "okay"; + a-gpios = <&pro_micro 20 GPIO_PULL_UP>; + b-gpios = <&pro_micro 4 GPIO_PULL_UP>; }; &default_transform { - col-offset = <5>; + col-offset = <5>; }; diff --git a/app/boards/shields/splitreus62/Kconfig.defconfig b/app/boards/shields/splitreus62/Kconfig.defconfig index 14063d3e..52d62c9d 100644 --- a/app/boards/shields/splitreus62/Kconfig.defconfig +++ b/app/boards/shields/splitreus62/Kconfig.defconfig @@ -6,16 +6,16 @@ if SHIELD_SPLITREUS62_LEFT config ZMK_KEYBOARD_NAME - default "Splitreus62" + default "Splitreus62" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_SPLITREUS62_LEFT || SHIELD_SPLITREUS62_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/splitreus62/Kconfig.shield b/app/boards/shields/splitreus62/Kconfig.shield index 762d991b..951ab9fb 100644 --- a/app/boards/shields/splitreus62/Kconfig.shield +++ b/app/boards/shields/splitreus62/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SPLITREUS62_LEFT - def_bool $(shields_list_contains,splitreus62_left) + def_bool $(shields_list_contains,splitreus62_left) config SHIELD_SPLITREUS62_RIGHT - def_bool $(shields_list_contains,splitreus62_right) + def_bool $(shields_list_contains,splitreus62_right) diff --git a/app/boards/shields/splitreus62/splitreus62.dtsi b/app/boards/shields/splitreus62/splitreus62.dtsi index 905605e9..abc3b7f7 100644 --- a/app/boards/shields/splitreus62/splitreus62.dtsi +++ b/app/boards/shields/splitreus62/splitreus62.dtsi @@ -7,44 +7,44 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <6>; -// | SW0 | SW5 | SW10 | SW15 | SW20 | SW25 | SW25 | SW20 | SW15 | SW10 | SW5 | SW1 | -// | SW1 | SW6 | SW11 | SW16 | SW21 | SW26 | SW26 | SW21 | SW16 | SW11 | SW6 | SW2 | -// | SW2 | SW7 | SW12 | SW17 | SW22 | SW27 | SW27 | SW22 | SW17 | SW12 | SW7 | SW3 | -// | SW3 | SW8 | SW13 | SW18 | SW23 | SW28 | SW28 | SW23 | SW18 | SW13 | SW8 | SW4 | + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <6>; +// | SW0 | SW5 | SW10 | SW15 | SW20 | SW25 | SW25 | SW20 | SW15 | SW10 | SW5 | SW1 | +// | SW1 | SW6 | SW11 | SW16 | SW21 | SW26 | SW26 | SW21 | SW16 | SW11 | SW6 | SW2 | +// | SW2 | SW7 | SW12 | SW17 | SW22 | SW27 | SW27 | SW22 | SW17 | SW12 | SW7 | SW3 | +// | SW3 | SW8 | SW13 | SW18 | SW23 | SW28 | SW28 | SW23 | SW18 | SW13 | SW8 | SW4 | // | SW4 | SW9 | SW14 | SW19 | SW24 | SW29 | SW29 | SW24 | SW19 | SW14 | SW9 | SW5 | // SW30 | SW30 - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(5,5) RC(5,6) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "row2col"; - row-gpios - = <&pro_micro 1 GPIO_ACTIVE_HIGH > - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 2 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - ; + diode-direction = "row2col"; + row-gpios + = <&pro_micro 1 GPIO_ACTIVE_HIGH > + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 2 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + ; - }; + }; }; diff --git a/app/boards/shields/splitreus62/splitreus62.keymap b/app/boards/shields/splitreus62/splitreus62.keymap index c1b0f50f..c7bdb443 100644 --- a/app/boards/shields/splitreus62/splitreus62.keymap +++ b/app/boards/shields/splitreus62/splitreus62.keymap @@ -9,24 +9,24 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | \ | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | | N | M | , | . | / | SHIFT | // | LCTL | LGUI | LALT | GRAV | | EQL | DEL | BKSP| | RET | SPC | LBKT | RBKT | LBKT | HOME | END | - bindings = < + bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp LCTRL &kp LGUI &kp LALT &kp GRAVE &kp EQUAL &kp DEL &kp SPACE &kp LBKT &kp RBKT &kp MINUS &kp HOME &kp END &kp BSPC &kp RET - >; - }; - }; + >; + }; + }; }; diff --git a/app/boards/shields/splitreus62/splitreus62_left.overlay b/app/boards/shields/splitreus62/splitreus62_left.overlay index ba5c21ff..992eb0db 100644 --- a/app/boards/shields/splitreus62/splitreus62_left.overlay +++ b/app/boards/shields/splitreus62/splitreus62_left.overlay @@ -7,12 +7,12 @@ #include "splitreus62.dtsi" &kscan0 { - col-gpios - = <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + col-gpios + = <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; }; diff --git a/app/boards/shields/splitreus62/splitreus62_right.overlay b/app/boards/shields/splitreus62/splitreus62_right.overlay index 9f76e7eb..d83db26d 100644 --- a/app/boards/shields/splitreus62/splitreus62_right.overlay +++ b/app/boards/shields/splitreus62/splitreus62_right.overlay @@ -7,16 +7,16 @@ #include "splitreus62.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + col-gpios + = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; }; diff --git a/app/boards/shields/tg4x/Kconfig.shield b/app/boards/shields/tg4x/Kconfig.shield index 27166b10..d7fc1c13 100644 --- a/app/boards/shields/tg4x/Kconfig.shield +++ b/app/boards/shields/tg4x/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_TG4X - def_bool $(shields_list_contains,tg4x) + def_bool $(shields_list_contains,tg4x) diff --git a/app/boards/shields/tg4x/boards/nice_nano.overlay b/app/boards/shields/tg4x/boards/nice_nano.overlay index 54046bf5..85ab6fbc 100644 --- a/app/boards/shields/tg4x/boards/nice_nano.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay index 54046bf5..85ab6fbc 100644 --- a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/tg4x/tg4x.keymap b/app/boards/shields/tg4x/tg4x.keymap index e68d0f92..89a478ae 100644 --- a/app/boards/shields/tg4x/tg4x.keymap +++ b/app/boards/shields/tg4x/tg4x.keymap @@ -9,46 +9,46 @@ #include / { - behaviors { - ht: hold_tap { - compatible = "zmk,behavior-hold-tap"; - label = "Hold Tap"; - #binding-cells = <2>; - tapping-term-ms = <200>; - flavor = "tap-preferred"; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + ht: hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "Hold Tap"; + #binding-cells = <2>; + tapping-term-ms = <200>; + flavor = "tap-preferred"; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < + default_layer { + bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp SEMI &kp BSPC &ht CAPS TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp APOS &kp RET &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp RSHFT &kp LCTRL &kp LGUI &kp LALT < 1 SPACE &kp SPACE &kp RALT &kp RGUI &mo 2 &kp RCTRL - >; - }; + >; + }; - function_layer { - bindings = < + function_layer { + bindings = < &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp DEL &none &kp HOME &kp PG_UP &trans &trans &trans &kp LBKT &kp RBKT &kp EQUAL &kp BSLH &kp FSLH &trans &trans &kp END &kp PG_DN &trans &trans &trans &trans &trans &trans &kp UP &trans &trans &trans &trans &trans &trans &trans &kp LEFT &kp DOWN &kp RIGHT - >; - }; + >; + }; - other_layer { - bindings = < + other_layer { + bindings = < &kp PRINTSCREEN &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &bootloader &sys_reset &trans &trans &trans &trans &trans &trans &kp C_VOL_UP &kp C_VOL_DN &kp C_PP - >; - }; + >; + }; - }; + }; }; diff --git a/app/boards/shields/tg4x/tg4x.overlay b/app/boards/shields/tg4x/tg4x.overlay index ca6e23c3..c0b1b3bc 100644 --- a/app/boards/shields/tg4x/tg4x.overlay +++ b/app/boards/shields/tg4x/tg4x.overlay @@ -7,49 +7,49 @@ #include / { - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; + diode-direction = "col2row"; - row-gpios - = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + row-gpios + = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - rows = <8>; - columns = <7>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + rows = <8>; + columns = <7>; - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(6,0) RC(6,1) RC(6,2) RC(6,4) RC(3,0) RC(3,1) RC(3,2) RC(3,4) RC(3,5) RC(7,1) RC(7,2) RC(7,3) RC(7,4) - >; - }; + >; + }; - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; }; diff --git a/app/boards/shields/tidbit/Kconfig.defconfig b/app/boards/shields/tidbit/Kconfig.defconfig index e3655a9e..393fbef1 100644 --- a/app/boards/shields/tidbit/Kconfig.defconfig +++ b/app/boards/shields/tidbit/Kconfig.defconfig @@ -4,35 +4,35 @@ if SHIELD_TIDBIT config ZMK_KEYBOARD_NAME - default "tidbit" + default "tidbit" if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/tidbit/Kconfig.shield b/app/boards/shields/tidbit/Kconfig.shield index c1e8ecca..dc811bb2 100644 --- a/app/boards/shields/tidbit/Kconfig.shield +++ b/app/boards/shields/tidbit/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_TIDBIT - def_bool $(shields_list_contains,tidbit) + def_bool $(shields_list_contains,tidbit) diff --git a/app/boards/shields/tidbit/boards/nice_nano.overlay b/app/boards/shields/tidbit/boards/nice_nano.overlay index ad66feac..75514ac4 100644 --- a/app/boards/shields/tidbit/boards/nice_nano.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay index ad66feac..75514ac4 100644 --- a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/tidbit/tidbit.dtsi b/app/boards/shields/tidbit/tidbit.dtsi index ba97a57a..fb84c89e 100644 --- a/app/boards/shields/tidbit/tidbit.dtsi +++ b/app/boards/shields/tidbit/tidbit.dtsi @@ -7,111 +7,111 @@ #include / { - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "row2col"; + diode-direction = "row2col"; - row-gpios - = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + row-gpios + = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + col-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <4>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <4>; + rows = <5>; - map = < - RC(0,1) RC(0,2) RC(0,3) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) - >; - }; + map = < + RC(0,1) RC(0,2) RC(0,3) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) + >; + }; - encoder_1_top_row: encoder_1_top_row { - compatible = "alps,ec11"; - label = "Top Row Encoder"; - a-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_1_top_row: encoder_1_top_row { + compatible = "alps,ec11"; + label = "Top Row Encoder"; + a-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - encoder_1: encoder_1 { - compatible = "alps,ec11"; - label = "Encoder 1"; - a-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_1: encoder_1 { + compatible = "alps,ec11"; + label = "Encoder 1"; + a-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - encoder_2: encoder_2 { - compatible = "alps,ec11"; - label = "Encoder 2"; - a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_2: encoder_2 { + compatible = "alps,ec11"; + label = "Encoder 2"; + a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - encoder_3: encoder_3 { - compatible = "alps,ec11"; - label = "Encoder 3"; - a-gpios = <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_3: encoder_3 { + compatible = "alps,ec11"; + label = "Encoder 3"; + a-gpios = <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - encoder_4: encoder_4 { - compatible = "alps,ec11"; - label = "Encoder 4"; - a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_4: encoder_4 { + compatible = "alps,ec11"; + label = "Encoder 4"; + a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/tidbit/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index 11424dc8..2e415bf8 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -10,40 +10,40 @@ #include &encoder_1_top_row { - status = "okay"; + status = "okay"; }; / { - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder_1_top_row>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder_1_top_row>; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS - &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_PLUS - &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &none - &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 < 1 KP_ENTER - &none &kp KP_NUMBER_0 &kp KP_DOT &none - >; + default_layer { + bindings = < + &kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS + &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_PLUS + &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &none + &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 < 1 KP_ENTER + &none &kp KP_NUMBER_0 &kp KP_DOT &none + >; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - }; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + }; - func_layer { - bindings = < - &none &sys_reset &bootloader - &out OUT_TOG &out OUT_USB &out OUT_BLE &none - &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR - &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &tog 0 - &kp C_MUTE &none &none &none - >; + func_layer { + bindings = < + &none &sys_reset &bootloader + &out OUT_TOG &out OUT_USB &out OUT_BLE &none + &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR + &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &tog 0 + &kp C_MUTE &none &none &none + >; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + }; + }; }; diff --git a/app/boards/shields/tidbit/tidbit_19key.keymap b/app/boards/shields/tidbit/tidbit_19key.keymap index 5710aeaf..1be71e7a 100644 --- a/app/boards/shields/tidbit/tidbit_19key.keymap +++ b/app/boards/shields/tidbit/tidbit_19key.keymap @@ -11,40 +11,40 @@ #include &encoder_4 { - status = "okay"; + status = "okay"; }; / { - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder_4>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder_4>; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &tog 1 &kp KP_NUMLOCK &kp KP_SLASH - &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_ASTERISK - &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &kp KP_MINUS - &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 &kp KP_PLUS - &kp C_MUTE &kp KP_NUMBER_0 &kp KP_DOT &kp KP_ENTER - >; + default_layer { + bindings = < + &tog 1 &kp KP_NUMLOCK &kp KP_SLASH + &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_ASTERISK + &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &kp KP_MINUS + &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 &kp KP_PLUS + &kp C_MUTE &kp KP_NUMBER_0 &kp KP_DOT &kp KP_ENTER + >; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - }; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + }; - func_layer { - bindings = < - &tog 0 &sys_reset &bootloader - &out OUT_TOG &out OUT_USB &out OUT_BLE &none - &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR - &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none - &kp C_MUTE &none &none &none - >; + func_layer { + bindings = < + &tog 0 &sys_reset &bootloader + &out OUT_TOG &out OUT_USB &out OUT_BLE &none + &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR + &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none + &kp C_MUTE &none &none &none + >; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + }; + }; }; diff --git a/app/boards/shields/two_percent_milk/Kconfig.shield b/app/boards/shields/two_percent_milk/Kconfig.shield index ec2c3b1f..b6fbcfdc 100644 --- a/app/boards/shields/two_percent_milk/Kconfig.shield +++ b/app/boards/shields/two_percent_milk/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_TWO_PERCENT_MILK - def_bool $(shields_list_contains,two_percent_milk) + def_bool $(shields_list_contains,two_percent_milk) diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay index ad66feac..75514ac4 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay index ad66feac..75514ac4 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay index 64d16572..d20e58e7 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay index b84beb93..31678980 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay index 64d16572..d20e58e7 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/two_percent_milk/two_percent_milk.overlay b/app/boards/shields/two_percent_milk/two_percent_milk.overlay index d43ed321..8d4a244a 100644 --- a/app/boards/shields/two_percent_milk/two_percent_milk.overlay +++ b/app/boards/shields/two_percent_milk/two_percent_milk.overlay @@ -5,20 +5,20 @@ */ / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; + label = "KSCAN"; - input-gpios - = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + input-gpios + = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; - }; + }; }; \ No newline at end of file diff --git a/app/boards/shields/waterfowl/Kconfig.defconfig b/app/boards/shields/waterfowl/Kconfig.defconfig index 5a77ca11..dbee82b8 100644 --- a/app/boards/shields/waterfowl/Kconfig.defconfig +++ b/app/boards/shields/waterfowl/Kconfig.defconfig @@ -2,44 +2,44 @@ if SHIELD_WATERFOWL_LEFT config ZMK_KEYBOARD_NAME - default "Waterfowl" + default "Waterfowl" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_WATERFOWL_LEFT || SHIELD_WATERFOWL_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/waterfowl/Kconfig.shield b/app/boards/shields/waterfowl/Kconfig.shield index a321b73d..ec01a626 100644 --- a/app/boards/shields/waterfowl/Kconfig.shield +++ b/app/boards/shields/waterfowl/Kconfig.shield @@ -3,7 +3,7 @@ config SHIELD_WATERFOWL_LEFT - def_bool $(shields_list_contains,waterfowl_left) + def_bool $(shields_list_contains,waterfowl_left) config SHIELD_WATERFOWL_RIGHT - def_bool $(shields_list_contains,waterfowl_right) + def_bool $(shields_list_contains,waterfowl_right) diff --git a/app/boards/shields/waterfowl/waterfowl.dtsi b/app/boards/shields/waterfowl/waterfowl.dtsi index a156360e..7f4929b3 100644 --- a/app/boards/shields/waterfowl/waterfowl.dtsi +++ b/app/boards/shields/waterfowl/waterfowl.dtsi @@ -7,79 +7,79 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <4>; -// | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | -// | MX10 | MX9 | MX8 | MX7 | MX6 | | MX6 | MX7 | MX8 | MX9 | MX10 | -// | MX15 | MX14 | MX13 | MX12 | MX11 | | MX11 | MX12 | MX13 | MX14 | MX15 | -// | MX20 | MX19 | MX18 | MX17 | MX16 | | MX16 | MX17 | MX18 | MX19 | MX20 | - map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) -RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) -RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; +// | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | +// | MX10 | MX9 | MX8 | MX7 | MX6 | | MX6 | MX7 | MX8 | MX9 | MX10 | +// | MX15 | MX14 | MX13 | MX12 | MX11 | | MX11 | MX12 | MX13 | MX14 | MX15 | +// | MX20 | MX19 | MX18 | MX17 | MX16 | | MX16 | MX17 | MX18 | MX19 | MX20 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - left_encoder: encoder_left { //roller - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - }; + left_encoder: encoder_left { //roller + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + }; - right_encoder: encoder_right { //Standard encoder on left half - compatible = "alps,ec11"; - label = "RIGHT_ENCODER"; - a-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <2>; - }; + right_encoder: encoder_right { //Standard encoder on left half + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + a-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <2>; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; - // TODO: RGB node(s) + // TODO: RGB node(s) }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <64>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <63>; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <64>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <63>; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/waterfowl/waterfowl.keymap b/app/boards/shields/waterfowl/waterfowl.keymap index 9583499c..c47f188b 100644 --- a/app/boards/shields/waterfowl/waterfowl.keymap +++ b/app/boards/shields/waterfowl/waterfowl.keymap @@ -9,10 +9,10 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { /* QWERTY * * ,----------------------------------. ,----------------------------------. @@ -26,17 +26,17 @@ * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ - bindings = < - &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P - &mt LGUI A &mt LALT S &mt LCTRL D &mt LSHFT F &kp G &kp H &mt LSHFT J &mt LCTRL K &mt LALT L &mt LGUI SEMI - &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH - &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 - >; + bindings = < + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &mt LGUI A &mt LALT S &mt LCTRL D &mt LSHFT F &kp G &kp H &mt LSHFT J &mt LCTRL K &mt LALT L &mt LGUI SEMI + &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; - }; + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; - navnum_layer { + navnum_layer { /* NAVNUM * * ,----------------------------------. ,----------------------------------. @@ -50,17 +50,17 @@ * | 1 | | DEL | SPACE | MO(3)| | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ - bindings = < - &trans &kp PG_UP &kp UP &kp PG_DN &trans &kp FSLH &kp N7 &kp N8 &kp N9 &kp MINUS - &kp HOME &kp LEFT &kp DOWN &kp RIGHT &kp END &kp EQUAL &kp N4 &kp N5 &kp N6 &kp PLUS - &trans &trans &kp INS &trans &trans &kp N0 &kp N1 &kp N2 &kp N3 &kp ASTERISK - &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 - >; + bindings = < + &trans &kp PG_UP &kp UP &kp PG_DN &trans &kp FSLH &kp N7 &kp N8 &kp N9 &kp MINUS + &kp HOME &kp LEFT &kp DOWN &kp RIGHT &kp END &kp EQUAL &kp N4 &kp N5 &kp N6 &kp PLUS + &trans &trans &kp INS &trans &trans &kp N0 &kp N1 &kp N2 &kp N3 &kp ASTERISK + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; - }; + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; - symbol_layer { + symbol_layer { /* SYM * * ,----------------------------------. ,----------------------------------. @@ -74,17 +74,17 @@ * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ - bindings = < - &kp PRCNT &kp AT &kp LBKT &kp RBKT &kp NON_US_BSLH &trans &trans &kp CARET &trans &trans - &kp HASH &kp EXCL &kp LPAR &kp RPAR &kp PIPE &kp UNDER &kp APOS &kp DOUBLE_QUOTES &kp TILDE &kp GRAVE - &kp DLLR &trans &kp LBRC &kp RBRC &kp AMPS &trans &trans &trans &trans &trans - &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 - >; + bindings = < + &kp PRCNT &kp AT &kp LBKT &kp RBKT &kp NON_US_BSLH &trans &trans &kp CARET &trans &trans + &kp HASH &kp EXCL &kp LPAR &kp RPAR &kp PIPE &kp UNDER &kp APOS &kp DOUBLE_QUOTES &kp TILDE &kp GRAVE + &kp DLLR &trans &kp LBRC &kp RBRC &kp AMPS &trans &trans &trans &trans &trans + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; - }; + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; - function_layer { + function_layer { /* FUNC * * ,----------------------------------. ,----------------------------------. @@ -98,15 +98,15 @@ * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ - bindings = < - &trans &trans &bt BT_CLR &trans &sys_reset &sys_reset &kp F7 &kp F8 &kp F9 &kp F11 - &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &kp F4 &kp F5 &kp F6 &kp F12 - &trans &trans &trans &trans &trans &kp F10 &kp F1 &kp F2 &kp F3 &kp F13 - &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 - >; + bindings = < + &trans &trans &bt BT_CLR &trans &sys_reset &sys_reset &kp F7 &kp F8 &kp F9 &kp F11 + &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &kp F4 &kp F5 &kp F6 &kp F12 + &trans &trans &trans &trans &trans &kp F10 &kp F1 &kp F2 &kp F3 &kp F13 + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; - }; + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; - }; + }; }; \ No newline at end of file diff --git a/app/boards/shields/waterfowl/waterfowl_left.overlay b/app/boards/shields/waterfowl/waterfowl_left.overlay index 031936ea..3b9fd42d 100644 --- a/app/boards/shields/waterfowl/waterfowl_left.overlay +++ b/app/boards/shields/waterfowl/waterfowl_left.overlay @@ -7,15 +7,15 @@ #include "waterfowl.dtsi" &kscan0 { - col-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/waterfowl/waterfowl_right.overlay b/app/boards/shields/waterfowl/waterfowl_right.overlay index cff0d53c..bf8f3a44 100644 --- a/app/boards/shields/waterfowl/waterfowl_right.overlay +++ b/app/boards/shields/waterfowl/waterfowl_right.overlay @@ -7,20 +7,20 @@ #include "waterfowl.dtsi" &default_transform { - col-offset = <5>; + col-offset = <5>; }; &kscan0 { - col-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/zmk_uno/Kconfig.shield b/app/boards/shields/zmk_uno/Kconfig.shield index 3f7331c3..958915f5 100644 --- a/app/boards/shields/zmk_uno/Kconfig.shield +++ b/app/boards/shields/zmk_uno/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_ZMK_UNO - def_bool $(shields_list_contains,zmk_uno) + def_bool $(shields_list_contains,zmk_uno) diff --git a/app/boards/shields/zmk_uno/zmk_uno.overlay b/app/boards/shields/zmk_uno/zmk_uno.overlay index 12b5e2b3..04332911 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.overlay +++ b/app/boards/shields/zmk_uno/zmk_uno.overlay @@ -8,172 +8,172 @@ #include &arduino_i2c { - status = "okay"; + status = "okay"; }; &arduino_spi { - status = "okay"; + status = "okay"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <7>; /* 4 underglow + 3 per-key LEDs */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <7>; /* 4 underglow + 3 per-key LEDs */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,kscan = &kscan_matrix_comp; - zmk,backlight = &backlight; - zmk,underglow = &led_strip; - zmk,matrix-transform = &matrix_transform; - }; + chosen { + zmk,kscan = &kscan_matrix_comp; + zmk,backlight = &backlight; + zmk,underglow = &led_strip; + zmk,matrix-transform = &matrix_transform; + }; - // Commented out until we add more powerful power domain support - // external_power { - // compatible = "zmk,ext-power-generic"; - // label = "EXT_POWER"; - // init-delay-ms = <200>; - // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; - // }; + // Commented out until we add more powerful power domain support + // external_power { + // compatible = "zmk,ext-power-generic"; + // label = "EXT_POWER"; + // init-delay-ms = <200>; + // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; + // }; - rgb_power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - // label = "RGB_POWER"; - init-delay-ms = <200>; - control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; - }; + rgb_power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + // label = "RGB_POWER"; + init-delay-ms = <200>; + control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; + }; - backlight: gpioleds { - compatible = "gpio-leds"; - label = "Backlight LEDs"; - gpio_led_0 { - gpios = <&arduino_header 12 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 0"; - }; - }; + backlight: gpioleds { + compatible = "gpio-leds"; + label = "Backlight LEDs"; + gpio_led_0 { + gpios = <&arduino_header 12 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 0"; + }; + }; - matrix_transform: matrix_transform { - compatible = "zmk,matrix-transform"; - rows = <3>; - columns = <4>; + matrix_transform: matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <3>; + columns = <4>; - map = < - RC(0,0) RC(0,1) - RC(1,0) RC(1,1) - RC(2,0) RC(2,1) RC(2,2) - >; - }; + map = < + RC(0,0) RC(0,1) + RC(1,0) RC(1,1) + RC(2,0) RC(2,1) RC(2,2) + >; + }; - direct_matrix_transform: direct_matrix_transform { - compatible = "zmk,matrix-transform"; - rows = <3>; - columns = <4>; + direct_matrix_transform: direct_matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <3>; + columns = <4>; - map = < - RC(0,0) RC(0,1) - RC(0,2) RC(0,3) - RC(1,0) RC(1,1) RC(1,2) - >; - }; + map = < + RC(0,0) RC(0,1) + RC(0,2) RC(0,3) + RC(1,0) RC(1,1) RC(1,2) + >; + }; - kscan_matrix_comp: kscan_matrix_comp { - compatible = "zmk,kscan-composite"; - rows = <1>; - columns = <7>; + kscan_matrix_comp: kscan_matrix_comp { + compatible = "zmk,kscan-composite"; + rows = <1>; + columns = <7>; - label = "KSCAN_MATRIX_COMP"; + label = "KSCAN_MATRIX_COMP"; - matrix { - kscan = <&kscan_matrix>; - }; + matrix { + kscan = <&kscan_matrix>; + }; - toggle { - kscan = <&kscan_sp3t_toggle>; - row-offset = <2>; - }; + toggle { + kscan = <&kscan_sp3t_toggle>; + row-offset = <2>; + }; - }; + }; - kscan_direct_comp: kscan_direct_comp { - compatible = "zmk,kscan-composite"; + kscan_direct_comp: kscan_direct_comp { + compatible = "zmk,kscan-composite"; - label = "KSCAN_DIRECT_COMP"; - status = "disabled"; + label = "KSCAN_DIRECT_COMP"; + status = "disabled"; - matrix { - kscan = <&kscan_direct>; - }; + matrix { + kscan = <&kscan_direct>; + }; - toggle { - kscan = <&kscan_sp3t_toggle>; - row-offset = <1>; - }; + toggle { + kscan = <&kscan_sp3t_toggle>; + row-offset = <1>; + }; - }; + }; - kscan_matrix: kscan_matrix { - compatible = "zmk,kscan-gpio-matrix"; + kscan_matrix: kscan_matrix { + compatible = "zmk,kscan-gpio-matrix"; - diode-direction = "col2row"; + diode-direction = "col2row"; - col-gpios - = <&arduino_header 10 GPIO_ACTIVE_HIGH> - , <&arduino_header 9 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&arduino_header 10 GPIO_ACTIVE_HIGH> + , <&arduino_header 9 GPIO_ACTIVE_HIGH> + ; - row-gpios - = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + row-gpios + = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - kscan_direct: kscan_direct { - compatible = "zmk,kscan-gpio-direct"; - status = "disabled"; + kscan_direct: kscan_direct { + compatible = "zmk,kscan-gpio-direct"; + status = "disabled"; - input-gpios - = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + input-gpios + = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; - }; + }; - kscan_sp3t_toggle: kscan_sp3t_toggle { - compatible = "zmk,kscan-gpio-direct"; - toggle-mode; + kscan_sp3t_toggle: kscan_sp3t_toggle { + compatible = "zmk,kscan-gpio-direct"; + toggle-mode; - input-gpios - = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + input-gpios + = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; - encoder: encoder { - label = "ENCODER"; - resolution = <4>; - compatible = "alps,ec11"; - a-gpios = <&arduino_header 14 GPIO_PULL_UP>; - b-gpios = <&arduino_header 15 GPIO_PULL_UP>; - }; + encoder: encoder { + label = "ENCODER"; + resolution = <4>; + compatible = "alps,ec11"; + a-gpios = <&arduino_header 14 GPIO_PULL_UP>; + b-gpios = <&arduino_header 15 GPIO_PULL_UP>; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder>; + }; }; diff --git a/app/boards/shields/zodiark/Kconfig.defconfig b/app/boards/shields/zodiark/Kconfig.defconfig index c6024694..e7538c41 100644 --- a/app/boards/shields/zodiark/Kconfig.defconfig +++ b/app/boards/shields/zodiark/Kconfig.defconfig @@ -4,44 +4,44 @@ if SHIELD_ZODIARK_LEFT config ZMK_KEYBOARD_NAME - default "Zodiark" + default "Zodiark" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_ZODIARK_LEFT || SHIELD_ZODIARK_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/zodiark/Kconfig.shield b/app/boards/shields/zodiark/Kconfig.shield index 25e23a14..0eb4e8ad 100644 --- a/app/boards/shields/zodiark/Kconfig.shield +++ b/app/boards/shields/zodiark/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_ZODIARK_LEFT - def_bool $(shields_list_contains,zodiark_left) + def_bool $(shields_list_contains,zodiark_left) config SHIELD_ZODIARK_RIGHT - def_bool $(shields_list_contains,zodiark_right) + def_bool $(shields_list_contains,zodiark_right) diff --git a/app/boards/shields/zodiark/zodiark_left.overlay b/app/boards/shields/zodiark/zodiark_left.overlay index fe55edc6..1f866f78 100644 --- a/app/boards/shields/zodiark/zodiark_left.overlay +++ b/app/boards/shields/zodiark/zodiark_left.overlay @@ -7,17 +7,17 @@ #include "zodiark.dtsi" &kscan0 { - col-gpios - = <&pro_micro 2 GPIO_ACTIVE_HIGH> - , <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 2 GPIO_ACTIVE_HIGH> + , <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/zodiark/zodiark_right.overlay b/app/boards/shields/zodiark/zodiark_right.overlay index 3405f59b..998f1e00 100644 --- a/app/boards/shields/zodiark/zodiark_right.overlay +++ b/app/boards/shields/zodiark/zodiark_right.overlay @@ -7,21 +7,21 @@ #include "zodiark.dtsi" &default_transform { - col-offset = <7>; + col-offset = <7>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 2 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 2 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/usb_console.dtsi b/app/boards/usb_console.dtsi index 4ce59408..3cc76ad3 100644 --- a/app/boards/usb_console.dtsi +++ b/app/boards/usb_console.dtsi @@ -6,15 +6,15 @@ / { - chosen { - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,console = &cdc_acm_uart; + }; }; &usbd { - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/cmake/ZephyrBuildConfig.cmake b/app/cmake/ZephyrBuildConfig.cmake index 931dd7ac..ade34199 100644 --- a/app/cmake/ZephyrBuildConfig.cmake +++ b/app/cmake/ZephyrBuildConfig.cmake @@ -14,13 +14,13 @@ get_property(cached_user_config_value CACHE ZMK_CONFIG PROPERTY VALUE) set(user_config_cli_argument ${cached_user_config_value}) # Either new or old if(user_config_cli_argument STREQUAL CACHED_ZMK_CONFIG) - # We already have a CACHED_ZMK_CONFIG so there is no new input on the CLI + # We already have a CACHED_ZMK_CONFIG so there is no new input on the CLI unset(user_config_cli_argument) endif() set(user_config_app_cmake_lists ${ZMK_CONFIG}) if(cached_user_config_value STREQUAL ZMK_CONFIG) - # The app build scripts did not set a default, The ZMK_CONFIG we are + # The app build scripts did not set a default, The ZMK_CONFIG we are # reading is the cached value from the CLI unset(user_config_app_cmake_lists) endif() @@ -29,172 +29,172 @@ if(CACHED_ZMK_CONFIG) # Warn the user if it looks like he is trying to change the user_config # without cleaning first if(user_config_cli_argument) - if(NOT (CACHED_ZMK_CONFIG STREQUAL user_config_cli_argument)) + if(NOT (CACHED_ZMK_CONFIG STREQUAL user_config_cli_argument)) message(WARNING "The build directory must be cleaned pristinely when changing user ZMK config") endif() endif() set(ZMK_CONFIG ${CACHED_ZMK_CONFIG}) elseif(user_config_cli_argument) - set(ZMK_CONFIG ${user_config_cli_argument}) + set(ZMK_CONFIG ${user_config_cli_argument}) elseif(DEFINED ENV{ZMK_CONFIG}) - set(ZMK_CONFIG $ENV{ZMK_CONFIG}) + set(ZMK_CONFIG $ENV{ZMK_CONFIG}) elseif(user_config_app_cmake_lists) - set(ZMK_CONFIG ${user_config_app_cmake_lists}) + set(ZMK_CONFIG ${user_config_app_cmake_lists}) endif() # Store the selected user_config in the cache set(CACHED_ZMK_CONFIG ${ZMK_CONFIG} CACHE STRING "Selected user ZMK config") if (ZMK_CONFIG) - set(ENV{ZMK_CONFIG} "${ZMK_CONFIG}") - if(EXISTS ${ZMK_CONFIG}/boards) - message(STATUS "Adding ZMK config directory as board root: ${ZMK_CONFIG}") - list(APPEND BOARD_ROOT ${ZMK_CONFIG}) - endif() - if(EXISTS ${ZMK_CONFIG}/dts) - message(STATUS "Adding ZMK config directory as DTS root: ${ZMK_CONFIG}") - list(APPEND DTS_ROOT ${ZMK_CONFIG}) - endif() + set(ENV{ZMK_CONFIG} "${ZMK_CONFIG}") + if(EXISTS ${ZMK_CONFIG}/boards) + message(STATUS "Adding ZMK config directory as board root: ${ZMK_CONFIG}") + list(APPEND BOARD_ROOT ${ZMK_CONFIG}) + endif() + if(EXISTS ${ZMK_CONFIG}/dts) + message(STATUS "Adding ZMK config directory as DTS root: ${ZMK_CONFIG}") + list(APPEND DTS_ROOT ${ZMK_CONFIG}) + endif() endif() if(DEFINED SHIELD) - string(REPLACE " " ";" SHIELD_AS_LIST "${SHIELD}") + string(REPLACE " " ";" SHIELD_AS_LIST "${SHIELD}") endif() foreach(root ${BOARD_ROOT}) - set(shield_dir ${root}/boards/shields) - # Match the Kconfig.shield files in the shield directories to make sure we are - # finding shields, e.g. x_nucleo_iks01a1/Kconfig.shield - file(GLOB_RECURSE shields_refs_list ${shield_dir}/*/Kconfig.shield) - unset(SHIELD_LIST) - foreach(shields_refs ${shields_refs_list}) - get_filename_component(shield_path ${shields_refs} DIRECTORY) - file(GLOB shield_overlays RELATIVE ${shield_path} ${shield_path}/*.overlay) - foreach(overlay ${shield_overlays}) - get_filename_component(shield ${overlay} NAME_WE) - list(APPEND SHIELD_LIST ${shield}) - set(SHIELD_DIR_${shield} ${shield_path}) - endforeach() - endforeach() + set(shield_dir ${root}/boards/shields) + # Match the Kconfig.shield files in the shield directories to make sure we are + # finding shields, e.g. x_nucleo_iks01a1/Kconfig.shield + file(GLOB_RECURSE shields_refs_list ${shield_dir}/*/Kconfig.shield) + unset(SHIELD_LIST) + foreach(shields_refs ${shields_refs_list}) + get_filename_component(shield_path ${shields_refs} DIRECTORY) + file(GLOB shield_overlays RELATIVE ${shield_path} ${shield_path}/*.overlay) + foreach(overlay ${shield_overlays}) + get_filename_component(shield ${overlay} NAME_WE) + list(APPEND SHIELD_LIST ${shield}) + set(SHIELD_DIR_${shield} ${shield_path}) + endforeach() + endforeach() - if (EXISTS "${root}/boards/${BOARD}.overlay") - list(APPEND shield_dts_files "${root}/boards/${BOARD}.overlay") - endif() - if (NOT DEFINED BOARD_DIR_NAME) - find_path(BOARD_DIR - NAMES ${BOARD}_defconfig - PATHS ${root}/boards/*/* - NO_DEFAULT_PATH - ) - if(BOARD_DIR) - get_filename_component(BOARD_DIR_NAME ${BOARD_DIR} NAME) - list(APPEND KEYMAP_DIRS ${BOARD_DIR}) - endif() - endif() + if (EXISTS "${root}/boards/${BOARD}.overlay") + list(APPEND shield_dts_files "${root}/boards/${BOARD}.overlay") + endif() + if (NOT DEFINED BOARD_DIR_NAME) + find_path(BOARD_DIR + NAMES ${BOARD}_defconfig + PATHS ${root}/boards/*/* + NO_DEFAULT_PATH + ) + if(BOARD_DIR) + get_filename_component(BOARD_DIR_NAME ${BOARD_DIR} NAME) + list(APPEND KEYMAP_DIRS ${BOARD_DIR}) + endif() + endif() - if(DEFINED SHIELD) - foreach(s ${SHIELD_AS_LIST}) - if(NOT ${s} IN_LIST SHIELD_LIST) - message(WARNING "Didn't find ${s}") - continue() - endif() - message(STATUS "Adding ${SHIELD_DIR_${s}}") - list(APPEND KEYMAP_DIRS ${SHIELD_DIR_${s}}) - get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) - list(APPEND SHIELD_DIR ${shield_dir_name}) - endforeach() - endif() + if(DEFINED SHIELD) + foreach(s ${SHIELD_AS_LIST}) + if(NOT ${s} IN_LIST SHIELD_LIST) + message(WARNING "Didn't find ${s}") + continue() + endif() + message(STATUS "Adding ${SHIELD_DIR_${s}}") + list(APPEND KEYMAP_DIRS ${SHIELD_DIR_${s}}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + list(APPEND SHIELD_DIR ${shield_dir_name}) + endforeach() + endif() endforeach() # Give a shield like `kyria_rev2_left` we want to use `kyria_rev2` and `kyria` as candidate names for # overlay/conf/keymap files. if(DEFINED SHIELD) - foreach(s ${SHIELD_AS_LIST}) - if (DEFINED $SHIELD_DIR_${s}) - get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) - endif() - string(REPLACE "_" ";" S_PIECES ${s}) - list(LENGTH S_PIECES S_PIECES_LEN) - while(NOT S_PIECES STREQUAL "") - list(POP_BACK S_PIECES) - list(JOIN S_PIECES "_" s_substr) - if ("${s_substr}" STREQUAL "" OR "${s_substr}" STREQUAL "${shield_dir_name}") - break() - endif() - list(APPEND shield_candidate_names ${s_substr}) - endwhile() - endforeach() + foreach(s ${SHIELD_AS_LIST}) + if (DEFINED $SHIELD_DIR_${s}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + endif() + string(REPLACE "_" ";" S_PIECES ${s}) + list(LENGTH S_PIECES S_PIECES_LEN) + while(NOT S_PIECES STREQUAL "") + list(POP_BACK S_PIECES) + list(JOIN S_PIECES "_" s_substr) + if ("${s_substr}" STREQUAL "" OR "${s_substr}" STREQUAL "${shield_dir_name}") + break() + endif() + list(APPEND shield_candidate_names ${s_substr}) + endwhile() + endforeach() endif() if (ZMK_CONFIG) - if (EXISTS ${ZMK_CONFIG}) - message(STATUS "ZMK Config directory: ${ZMK_CONFIG}") - list(PREPEND KEYMAP_DIRS "${ZMK_CONFIG}") + if (EXISTS ${ZMK_CONFIG}) + message(STATUS "ZMK Config directory: ${ZMK_CONFIG}") + list(PREPEND KEYMAP_DIRS "${ZMK_CONFIG}") - if (DEFINED SHIELD) - foreach (s ${shield_candidate_names} ${SHIELD_AS_LIST}) - if (DEFINED ${SHIELD_DIR_${s}}) - get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) - endif() - list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}_${BOARD}.overlay") - list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}.overlay") - if (NOT "${shield_dir_name}" STREQUAL "${s}") - list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}_${BOARD}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}.conf") - endif() - list(APPEND config_candidates "${ZMK_CONFIG}/${s}_${BOARD}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/${s}.conf") - endforeach() - endif() + if (DEFINED SHIELD) + foreach (s ${shield_candidate_names} ${SHIELD_AS_LIST}) + if (DEFINED ${SHIELD_DIR_${s}}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + endif() + list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}_${BOARD}.overlay") + list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}.overlay") + if (NOT "${shield_dir_name}" STREQUAL "${s}") + list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}_${BOARD}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}.conf") + endif() + list(APPEND config_candidates "${ZMK_CONFIG}/${s}_${BOARD}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/${s}.conf") + endforeach() + endif() - # TODO: Board revisions? - list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.overlay") - list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD}.overlay") - list(APPEND overlay_candidates "${ZMK_CONFIG}/default.overlay") - list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/default.conf") + # TODO: Board revisions? + list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.overlay") + list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD}.overlay") + list(APPEND overlay_candidates "${ZMK_CONFIG}/default.overlay") + list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/default.conf") - foreach(overlay ${overlay_candidates}) - if (EXISTS "${overlay}") - message(STATUS "ZMK Config devicetree overlay: ${overlay}") - list(APPEND shield_dts_files "${overlay}") - break() - endif() - endforeach() + foreach(overlay ${overlay_candidates}) + if (EXISTS "${overlay}") + message(STATUS "ZMK Config devicetree overlay: ${overlay}") + list(APPEND shield_dts_files "${overlay}") + break() + endif() + endforeach() - foreach(conf ${config_candidates}) - if (EXISTS "${conf}") - message(STATUS "ZMK Config Kconfig: ${conf}") - list(APPEND shield_conf_files "${conf}") - endif() - endforeach() - else() - message(WARNING "Unable to locate ZMK config at: ${ZMK_CONFIG}") - endif() + foreach(conf ${config_candidates}) + if (EXISTS "${conf}") + message(STATUS "ZMK Config Kconfig: ${conf}") + list(APPEND shield_conf_files "${conf}") + endif() + endforeach() + else() + message(WARNING "Unable to locate ZMK config at: ${ZMK_CONFIG}") + endif() endif() if(NOT KEYMAP_FILE) - foreach(keymap_dir ${KEYMAP_DIRS}) - foreach(keymap_prefix ${shield_candidate_names} ${SHIELD_AS_LIST} ${SHIELD_DIR} ${BOARD} ${BOARD_DIR_NAME}) - if (EXISTS ${keymap_dir}/${keymap_prefix}.keymap) - set(KEYMAP_FILE "${keymap_dir}/${keymap_prefix}.keymap" CACHE STRING "Selected keymap file") - message(STATUS "Using keymap file: ${KEYMAP_FILE}") - set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) - break() - endif() - endforeach() - endforeach() + foreach(keymap_dir ${KEYMAP_DIRS}) + foreach(keymap_prefix ${shield_candidate_names} ${SHIELD_AS_LIST} ${SHIELD_DIR} ${BOARD} ${BOARD_DIR_NAME}) + if (EXISTS ${keymap_dir}/${keymap_prefix}.keymap) + set(KEYMAP_FILE "${keymap_dir}/${keymap_prefix}.keymap" CACHE STRING "Selected keymap file") + message(STATUS "Using keymap file: ${KEYMAP_FILE}") + set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) + break() + endif() + endforeach() + endforeach() else() - message(STATUS "Using keymap file: ${KEYMAP_FILE}") - set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) + message(STATUS "Using keymap file: ${KEYMAP_FILE}") + set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) endif() if (NOT KEYMAP_FILE) - message(WARNING "Failed to locate keymap file!") + message(WARNING "Failed to locate keymap file!") endif() diff --git a/app/drivers/display/CMakeLists.txt b/app/drivers/display/CMakeLists.txt index 13b97193..d5e83c1d 100644 --- a/app/drivers/display/CMakeLists.txt +++ b/app/drivers/display/CMakeLists.txt @@ -1,4 +1,4 @@ # Copyright (c) 2021 The ZMK Contributors # SPDX-License-Identifier: MIT -zephyr_sources_ifdef(CONFIG_IL0323 il0323.c) \ No newline at end of file +zephyr_sources_ifdef(CONFIG_IL0323 il0323.c) \ No newline at end of file diff --git a/app/drivers/display/Kconfig.il0323 b/app/drivers/display/Kconfig.il0323 index f39015ef..f3308c16 100644 --- a/app/drivers/display/Kconfig.il0323 +++ b/app/drivers/display/Kconfig.il0323 @@ -4,8 +4,8 @@ # IL0323 display controller configuration options config IL0323 - bool "IL0323 compatible display controller driver" - depends on SPI - depends on HEAP_MEM_POOL_SIZE != 0 - help - Enable driver for IL0323 compatible controller. \ No newline at end of file + bool "IL0323 compatible display controller driver" + depends on SPI + depends on HEAP_MEM_POOL_SIZE != 0 + help + Enable driver for IL0323 compatible controller. \ No newline at end of file diff --git a/app/drivers/gpio/Kconfig.595 b/app/drivers/gpio/Kconfig.595 index f43e807b..b4b6bdcc 100644 --- a/app/drivers/gpio/Kconfig.595 +++ b/app/drivers/gpio/Kconfig.595 @@ -6,20 +6,20 @@ DT_COMPAT_ZMK_GPIO_595 := zmk,gpio-595 menuconfig GPIO_595 - bool "595 Shift Register SPI driver" - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_GPIO_595)) - depends on SPI - select HAS_DTS_GPIO - select ZMK_DRIVERS_GPIO - help - Enable driver for 595 shift register chip using SPI. + bool "595 Shift Register SPI driver" + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_GPIO_595)) + depends on SPI + select HAS_DTS_GPIO + select ZMK_DRIVERS_GPIO + help + Enable driver for 595 shift register chip using SPI. if GPIO_595 config GPIO_595_INIT_PRIORITY - int "Init priority" - default 75 - help - Device driver initialization priority. + int "Init priority" + default 75 + help + Device driver initialization priority. endif #GPIO_595 diff --git a/app/drivers/gpio/Kconfig.max7318 b/app/drivers/gpio/Kconfig.max7318 index ded7f926..d572b970 100644 --- a/app/drivers/gpio/Kconfig.max7318 +++ b/app/drivers/gpio/Kconfig.max7318 @@ -6,20 +6,20 @@ DT_COMPAT_MAXIM_MAX7318 := maxim,max7318 menuconfig GPIO_MAX7318 - bool "MAX7318 I2C-based GPIO chip" - default $(dt_compat_enabled,$(DT_COMPAT_MAXIM_MAX7318)) - depends on I2C - select HAS_DTS_GPIO - select ZMK_DRIVERS_GPIO - help - Enable driver for MAX7318 I2C-based GPIO chip. + bool "MAX7318 I2C-based GPIO chip" + default $(dt_compat_enabled,$(DT_COMPAT_MAXIM_MAX7318)) + depends on I2C + select HAS_DTS_GPIO + select ZMK_DRIVERS_GPIO + help + Enable driver for MAX7318 I2C-based GPIO chip. if GPIO_MAX7318 config GPIO_MAX7318_INIT_PRIORITY - int "Init priority" - default 75 - help - Device driver initialization priority. + int "Init priority" + default 75 + help + Device driver initialization priority. endif #GPIO_MAX7318 diff --git a/app/drivers/kscan/Kconfig b/app/drivers/kscan/Kconfig index 216651a1..1d165669 100644 --- a/app/drivers/kscan/Kconfig +++ b/app/drivers/kscan/Kconfig @@ -8,87 +8,87 @@ DT_COMPAT_ZMK_KSCAN_GPIO_MATRIX := zmk,kscan-gpio-matrix DT_COMPAT_ZMK_KSCAN_MOCK := zmk,kscan-mock config ZMK_KSCAN_COMPOSITE_DRIVER - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_COMPOSITE)) + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_COMPOSITE)) config ZMK_KSCAN_GPIO_DRIVER - bool - select GPIO + bool + select GPIO config ZMK_KSCAN_GPIO_DEMUX - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_DEMUX)) - select ZMK_KSCAN_GPIO_DRIVER + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_DEMUX)) + select ZMK_KSCAN_GPIO_DRIVER config ZMK_KSCAN_GPIO_DIRECT - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_DIRECT)) - select ZMK_KSCAN_GPIO_DRIVER + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_DIRECT)) + select ZMK_KSCAN_GPIO_DRIVER config ZMK_KSCAN_GPIO_MATRIX - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_MATRIX)) - select ZMK_KSCAN_GPIO_DRIVER + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_MATRIX)) + select ZMK_KSCAN_GPIO_DRIVER if ZMK_KSCAN_GPIO_MATRIX config ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS - int "Ticks to wait before reading inputs after an output set active" - default 0 - help - When iterating over each output to drive it active, read inputs, then set - inactive again, some boards may take time for output to propagate to the - inputs. In that scenario, set this value to a positive value to configure - the number of ticks to wait after setting an output active before reading - the inputs for their active state. + int "Ticks to wait before reading inputs after an output set active" + default 0 + help + When iterating over each output to drive it active, read inputs, then set + inactive again, some boards may take time for output to propagate to the + inputs. In that scenario, set this value to a positive value to configure + the number of ticks to wait after setting an output active before reading + the inputs for their active state. config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS int "Ticks to wait between each output when scanning" - default 1 if SOC_RP2040 - default 0 - help - When iterating over each output to drive it active, read inputs, then set - inactive again, some boards may take time for the previous output to - "settle" before reading inputs for the next active output column. In that - scenario, set this value to a positive value to configure the number of - ticks to wait after reading each column of keys. + default 1 if SOC_RP2040 + default 0 + help + When iterating over each output to drive it active, read inputs, then set + inactive again, some boards may take time for the previous output to + "settle" before reading inputs for the next active output column. In that + scenario, set this value to a positive value to configure the number of + ticks to wait after reading each column of keys. endif # ZMK_KSCAN_GPIO_MATRIX config ZMK_KSCAN_MOCK_DRIVER - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_MOCK)) + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_MOCK)) if ZMK_KSCAN_GPIO_DRIVER config ZMK_KSCAN_MATRIX_POLLING - bool "Poll for key event triggers instead of using interrupts on matrix boards." + bool "Poll for key event triggers instead of using interrupts on matrix boards." config ZMK_KSCAN_DIRECT_POLLING - bool "Poll for key event triggers instead of using interrupts on direct wired boards." + bool "Poll for key event triggers instead of using interrupts on direct wired boards." config ZMK_KSCAN_DEBOUNCE_PRESS_MS - int "Debounce time for key press in milliseconds." - default -1 - help - Global debounce time for key press in milliseconds. - If this is -1, the debounce time is controlled by the debounce-press-ms - Devicetree property, which defaults to 5 ms. Otherwise this overrides the - debounce time for all key scan drivers to the chosen value. + int "Debounce time for key press in milliseconds." + default -1 + help + Global debounce time for key press in milliseconds. + If this is -1, the debounce time is controlled by the debounce-press-ms + Devicetree property, which defaults to 5 ms. Otherwise this overrides the + debounce time for all key scan drivers to the chosen value. config ZMK_KSCAN_DEBOUNCE_RELEASE_MS - int "Debounce time for key release in milliseconds." - default -1 - help - Global debounce time for key release in milliseconds. - If this is -1, the debounce time is controlled by the debounce-release-ms - Devicetree property, which defaults to 5 ms. Otherwise this overrides the - debounce time for all key scan drivers to the chosen value. + int "Debounce time for key release in milliseconds." + default -1 + help + Global debounce time for key release in milliseconds. + If this is -1, the debounce time is controlled by the debounce-release-ms + Devicetree property, which defaults to 5 ms. Otherwise this overrides the + debounce time for all key scan drivers to the chosen value. endif config ZMK_KSCAN_INIT_PRIORITY - int "Keyboard scan driver init priority" - default 40 - help - Keyboard scan device driver initialization priority. + int "Keyboard scan driver init priority" + default 40 + help + Keyboard scan device driver initialization priority. diff --git a/app/drivers/sensor/battery/Kconfig b/app/drivers/sensor/battery/Kconfig index d7c82bb0..a9d7189e 100644 --- a/app/drivers/sensor/battery/Kconfig +++ b/app/drivers/sensor/battery/Kconfig @@ -5,22 +5,22 @@ DT_COMPAT_ZMK_BATTERY_NRF_VDDH := zmk,battery-nrf-vddh DT_COMPAT_ZMK_BATTERY_VOLTAGE_DIVIDER := zmk,battery-voltage-divider config ZMK_BATTERY - bool "ZMK battery monitoring" - help - Enable battery monitoring + bool "ZMK battery monitoring" + help + Enable battery monitoring config ZMK_BATTERY_NRF_VDDH - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_NRF_VDDH)) - select ADC - select ZMK_BATTERY - help - Enable ZMK nRF VDDH voltage driver for battery monitoring. + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_NRF_VDDH)) + select ADC + select ZMK_BATTERY + help + Enable ZMK nRF VDDH voltage driver for battery monitoring. config ZMK_BATTERY_VOLTAGE_DIVIDER - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_VOLTAGE_DIVIDER)) - select ADC - select ZMK_BATTERY - help - Enable ZMK battery voltage divider driver for battery monitoring. + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_VOLTAGE_DIVIDER)) + select ADC + select ZMK_BATTERY + help + Enable ZMK battery voltage divider driver for battery monitoring. diff --git a/app/drivers/sensor/ec11/Kconfig b/app/drivers/sensor/ec11/Kconfig index 6854e530..e86d092a 100644 --- a/app/drivers/sensor/ec11/Kconfig +++ b/app/drivers/sensor/ec11/Kconfig @@ -2,49 +2,49 @@ # SPDX-License-Identifier: MIT menuconfig EC11 - bool "EC11 Incremental Encoder Sensor" - depends on GPIO - help - Enable driver for EC11 incremental encoder sensors. + bool "EC11 Incremental Encoder Sensor" + depends on GPIO + help + Enable driver for EC11 incremental encoder sensors. if EC11 choice - prompt "Trigger mode" - default EC11_TRIGGER_NONE - help - Specify the type of triggering to be used by the driver. + prompt "Trigger mode" + default EC11_TRIGGER_NONE + help + Specify the type of triggering to be used by the driver. config EC11_TRIGGER_NONE - bool "No trigger" + bool "No trigger" config EC11_TRIGGER_GLOBAL_THREAD - bool "Use global thread" - depends on GPIO - select EC11_TRIGGER + bool "Use global thread" + depends on GPIO + select EC11_TRIGGER config EC11_TRIGGER_OWN_THREAD - bool "Use own thread" - depends on GPIO - select EC11_TRIGGER + bool "Use own thread" + depends on GPIO + select EC11_TRIGGER endchoice config EC11_TRIGGER - bool + bool config EC11_THREAD_PRIORITY - int "Thread priority" - depends on EC11_TRIGGER_OWN_THREAD - default 10 - help - Priority of thread used by the driver to handle interrupts. + int "Thread priority" + depends on EC11_TRIGGER_OWN_THREAD + default 10 + help + Priority of thread used by the driver to handle interrupts. config EC11_THREAD_STACK_SIZE - int "Thread stack size" - depends on EC11_TRIGGER_OWN_THREAD - default 1024 - help - Stack size of thread used by the driver to handle interrupts. + int "Thread stack size" + depends on EC11_TRIGGER_OWN_THREAD + default 1024 + help + Stack size of thread used by the driver to handle interrupts. endif # EC11 \ No newline at end of file diff --git a/app/dts/behaviors/backlight.dtsi b/app/dts/behaviors/backlight.dtsi index f9bd02b8..bebd6dfb 100644 --- a/app/dts/behaviors/backlight.dtsi +++ b/app/dts/behaviors/backlight.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ bl: behavior_backlight { - compatible = "zmk,behavior-backlight"; - label = "BCKLGHT"; - #binding-cells = <2>; - }; - }; + behaviors { + /omit-if-no-ref/ bl: behavior_backlight { + compatible = "zmk,behavior-backlight"; + label = "BCKLGHT"; + #binding-cells = <2>; + }; + }; }; diff --git a/app/dts/behaviors/bluetooth.dtsi b/app/dts/behaviors/bluetooth.dtsi index 1e9cf21b..a49ff4d6 100644 --- a/app/dts/behaviors/bluetooth.dtsi +++ b/app/dts/behaviors/bluetooth.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ bt: behavior_bluetooth { - compatible = "zmk,behavior-bluetooth"; - label = "BLUETOOTH"; - #binding-cells = <2>; - }; - }; + behaviors { + /omit-if-no-ref/ bt: behavior_bluetooth { + compatible = "zmk,behavior-bluetooth"; + label = "BLUETOOTH"; + #binding-cells = <2>; + }; + }; }; diff --git a/app/dts/behaviors/caps_word.dtsi b/app/dts/behaviors/caps_word.dtsi index ac04e26b..219300dc 100644 --- a/app/dts/behaviors/caps_word.dtsi +++ b/app/dts/behaviors/caps_word.dtsi @@ -7,13 +7,13 @@ #include / { - behaviors { - /omit-if-no-ref/ caps_word: behavior_caps_word { - compatible = "zmk,behavior-caps-word"; - label = "CAPS_WORD"; - #binding-cells = <0>; - continue-list = ; - }; - }; + behaviors { + /omit-if-no-ref/ caps_word: behavior_caps_word { + compatible = "zmk,behavior-caps-word"; + label = "CAPS_WORD"; + #binding-cells = <0>; + continue-list = ; + }; + }; }; diff --git a/app/dts/behaviors/ext_power.dtsi b/app/dts/behaviors/ext_power.dtsi index 18e824e2..f61170dd 100644 --- a/app/dts/behaviors/ext_power.dtsi +++ b/app/dts/behaviors/ext_power.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - ext_power: behavior_ext_power { - compatible = "zmk,behavior-ext-power"; - label = "EXTPOWER"; - #binding-cells = <1>; - }; - }; + behaviors { + ext_power: behavior_ext_power { + compatible = "zmk,behavior-ext-power"; + label = "EXTPOWER"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/gresc.dtsi b/app/dts/behaviors/gresc.dtsi index 29593880..fa4c685b 100644 --- a/app/dts/behaviors/gresc.dtsi +++ b/app/dts/behaviors/gresc.dtsi @@ -7,13 +7,13 @@ #include / { - behaviors { - /omit-if-no-ref/ gresc: grave_escape { - compatible = "zmk,behavior-mod-morph"; - label = "GRAVE_ESCAPE"; - #binding-cells = <0>; - bindings = <&kp ESC>, <&kp GRAVE>; + behaviors { + /omit-if-no-ref/ gresc: grave_escape { + compatible = "zmk,behavior-mod-morph"; + label = "GRAVE_ESCAPE"; + #binding-cells = <0>; + bindings = <&kp ESC>, <&kp GRAVE>; mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; - }; - }; + }; + }; }; diff --git a/app/dts/behaviors/key_press.dtsi b/app/dts/behaviors/key_press.dtsi index 59a4e12a..b0fc2db1 100644 --- a/app/dts/behaviors/key_press.dtsi +++ b/app/dts/behaviors/key_press.dtsi @@ -5,12 +5,12 @@ */ / { - behaviors { - /* DEPRECATED: `cp` will be removed in the future */ - /omit-if-no-ref/ cp: kp: behavior_key_press { - compatible = "zmk,behavior-key-press"; - label = "KEY_PRESS"; - #binding-cells = <1>; - }; - }; + behaviors { + /* DEPRECATED: `cp` will be removed in the future */ + /omit-if-no-ref/ cp: kp: behavior_key_press { + compatible = "zmk,behavior-key-press"; + label = "KEY_PRESS"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/key_repeat.dtsi b/app/dts/behaviors/key_repeat.dtsi index aa8ffa04..795a77f6 100644 --- a/app/dts/behaviors/key_repeat.dtsi +++ b/app/dts/behaviors/key_repeat.dtsi @@ -7,13 +7,13 @@ #include / { - behaviors { - /omit-if-no-ref/ key_repeat: behavior_key_repeat { - compatible = "zmk,behavior-key-repeat"; - label = "KEY_REPEAT"; - #binding-cells = <0>; - usage-pages = ; - }; - }; + behaviors { + /omit-if-no-ref/ key_repeat: behavior_key_repeat { + compatible = "zmk,behavior-key-repeat"; + label = "KEY_REPEAT"; + #binding-cells = <0>; + usage-pages = ; + }; + }; }; diff --git a/app/dts/behaviors/key_toggle.dtsi b/app/dts/behaviors/key_toggle.dtsi index 98001b79..df581014 100644 --- a/app/dts/behaviors/key_toggle.dtsi +++ b/app/dts/behaviors/key_toggle.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ kt: behavior_key_toggle { - compatible = "zmk,behavior-key-toggle"; - label = "KEY_TOGGLE"; - #binding-cells = <1>; - }; - }; + behaviors { + /omit-if-no-ref/ kt: behavior_key_toggle { + compatible = "zmk,behavior-key-toggle"; + label = "KEY_TOGGLE"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/layer_tap.dtsi b/app/dts/behaviors/layer_tap.dtsi index 21fd9d56..1d92245c 100644 --- a/app/dts/behaviors/layer_tap.dtsi +++ b/app/dts/behaviors/layer_tap.dtsi @@ -5,14 +5,14 @@ */ / { - behaviors { - /omit-if-no-ref/ lt: behavior_layer_tap { - compatible = "zmk,behavior-hold-tap"; - label = "LAYER_TAP"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <200>; - bindings = <&mo>, <&kp>; - }; - }; + behaviors { + /omit-if-no-ref/ lt: behavior_layer_tap { + compatible = "zmk,behavior-hold-tap"; + label = "LAYER_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + bindings = <&mo>, <&kp>; + }; + }; }; diff --git a/app/dts/behaviors/macros.dtsi b/app/dts/behaviors/macros.dtsi index 76153291..757c046e 100644 --- a/app/dts/behaviors/macros.dtsi +++ b/app/dts/behaviors/macros.dtsi @@ -6,49 +6,49 @@ #define ZMK_MACRO_STRINGIFY(x) #x #define ZMK_MACRO(name,...) \ - name: name { \ - label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ - compatible = "zmk,behavior-macro"; \ - #binding-cells = <0>; \ - __VA_ARGS__ \ - }; + name: name { \ + label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ + compatible = "zmk,behavior-macro"; \ + #binding-cells = <0>; \ + __VA_ARGS__ \ + }; / { - behaviors { - macro_tap: macro_control_mode_tap { - compatible = "zmk,macro-control-mode-tap"; - label = "MAC_TAP"; - #binding-cells = <0>; - }; + behaviors { + macro_tap: macro_control_mode_tap { + compatible = "zmk,macro-control-mode-tap"; + label = "MAC_TAP"; + #binding-cells = <0>; + }; - macro_press: macro_control_mode_press { - compatible = "zmk,macro-control-mode-press"; - label = "MAC_PRESS"; - #binding-cells = <0>; - }; + macro_press: macro_control_mode_press { + compatible = "zmk,macro-control-mode-press"; + label = "MAC_PRESS"; + #binding-cells = <0>; + }; - macro_release: macro_control_mode_release { - compatible = "zmk,macro-control-mode-release"; - label = "MAC_REL"; - #binding-cells = <0>; - }; + macro_release: macro_control_mode_release { + compatible = "zmk,macro-control-mode-release"; + label = "MAC_REL"; + #binding-cells = <0>; + }; - macro_tap_time: macro_control_tap_time { - compatible = "zmk,macro-control-tap-time"; - label = "MAC_TAP_TIME"; - #binding-cells = <1>; - }; + macro_tap_time: macro_control_tap_time { + compatible = "zmk,macro-control-tap-time"; + label = "MAC_TAP_TIME"; + #binding-cells = <1>; + }; - macro_wait_time: macro_control_wait_time { - compatible = "zmk,macro-control-wait-time"; - label = "MAC_WAIT_TIME"; - #binding-cells = <1>; - }; + macro_wait_time: macro_control_wait_time { + compatible = "zmk,macro-control-wait-time"; + label = "MAC_WAIT_TIME"; + #binding-cells = <1>; + }; - macro_pause_for_release: macro_pause_for_release { - compatible = "zmk,macro-pause-for-release"; - label = "MAC_WAIT_REL"; - #binding-cells = <0>; - }; - }; + macro_pause_for_release: macro_pause_for_release { + compatible = "zmk,macro-pause-for-release"; + label = "MAC_WAIT_REL"; + #binding-cells = <0>; + }; + }; }; diff --git a/app/dts/behaviors/mod_tap.dtsi b/app/dts/behaviors/mod_tap.dtsi index 7a98713c..d441a4f1 100644 --- a/app/dts/behaviors/mod_tap.dtsi +++ b/app/dts/behaviors/mod_tap.dtsi @@ -5,14 +5,14 @@ */ / { - behaviors { - /omit-if-no-ref/ mt: behavior_mod_tap { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + /omit-if-no-ref/ mt: behavior_mod_tap { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; }; diff --git a/app/dts/behaviors/momentary_layer.dtsi b/app/dts/behaviors/momentary_layer.dtsi index 2dbd88d9..d1c91232 100644 --- a/app/dts/behaviors/momentary_layer.dtsi +++ b/app/dts/behaviors/momentary_layer.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ mo: behavior_momentary_layer { - compatible = "zmk,behavior-momentary-layer"; - label = "MO"; - #binding-cells = <1>; - }; - }; + behaviors { + /omit-if-no-ref/ mo: behavior_momentary_layer { + compatible = "zmk,behavior-momentary-layer"; + label = "MO"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/none.dtsi b/app/dts/behaviors/none.dtsi index 790f2d61..fc4890c3 100644 --- a/app/dts/behaviors/none.dtsi +++ b/app/dts/behaviors/none.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ none: behavior_none { - compatible = "zmk,behavior-none"; - label = "NONE"; - #binding-cells = <0>; - }; - }; + behaviors { + /omit-if-no-ref/ none: behavior_none { + compatible = "zmk,behavior-none"; + label = "NONE"; + #binding-cells = <0>; + }; + }; }; diff --git a/app/dts/behaviors/reset.dtsi b/app/dts/behaviors/reset.dtsi index 74a7163b..2e775269 100644 --- a/app/dts/behaviors/reset.dtsi +++ b/app/dts/behaviors/reset.dtsi @@ -7,18 +7,18 @@ #include / { - behaviors { - sys_reset: behavior_reset { - compatible = "zmk,behavior-reset"; - label = "SYSRESET"; - #binding-cells = <0>; - }; + behaviors { + sys_reset: behavior_reset { + compatible = "zmk,behavior-reset"; + label = "SYSRESET"; + #binding-cells = <0>; + }; - bootloader: behavior_reset_dfu { - compatible = "zmk,behavior-reset"; - label = "BOOTLOAD"; - type = ; - #binding-cells = <0>; - }; - }; + bootloader: behavior_reset_dfu { + compatible = "zmk,behavior-reset"; + label = "BOOTLOAD"; + type = ; + #binding-cells = <0>; + }; + }; }; diff --git a/app/dts/behaviors/rgb_underglow.dtsi b/app/dts/behaviors/rgb_underglow.dtsi index 54fe422e..6ffec2e6 100644 --- a/app/dts/behaviors/rgb_underglow.dtsi +++ b/app/dts/behaviors/rgb_underglow.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - rgb_ug: behavior_rgb_underglow { - compatible = "zmk,behavior-rgb-underglow"; - label = "RGB_UG"; - #binding-cells = <2>; - }; - }; + behaviors { + rgb_ug: behavior_rgb_underglow { + compatible = "zmk,behavior-rgb-underglow"; + label = "RGB_UG"; + #binding-cells = <2>; + }; + }; }; diff --git a/app/dts/behaviors/sensor_rotate_key_press.dtsi b/app/dts/behaviors/sensor_rotate_key_press.dtsi index ed1b4cd0..dc30b798 100644 --- a/app/dts/behaviors/sensor_rotate_key_press.dtsi +++ b/app/dts/behaviors/sensor_rotate_key_press.dtsi @@ -5,13 +5,13 @@ */ / { - behaviors { - /* DEPRECATED: `inc_dec_cp` will be removed in the future */ - /omit-if-no-ref/ inc_dec_cp: inc_dec_kp: behavior_sensor_rotate_key_press { - compatible = "zmk,behavior-sensor-rotate-var"; - label = "ENC_KEY_PRESS"; - #sensor-binding-cells = <2>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + /* DEPRECATED: `inc_dec_cp` will be removed in the future */ + /omit-if-no-ref/ inc_dec_cp: inc_dec_kp: behavior_sensor_rotate_key_press { + compatible = "zmk,behavior-sensor-rotate-var"; + label = "ENC_KEY_PRESS"; + #sensor-binding-cells = <2>; + bindings = <&kp>, <&kp>; + }; + }; }; diff --git a/app/dts/behaviors/sticky_key.dtsi b/app/dts/behaviors/sticky_key.dtsi index 886d35b7..72a80a90 100644 --- a/app/dts/behaviors/sticky_key.dtsi +++ b/app/dts/behaviors/sticky_key.dtsi @@ -5,24 +5,24 @@ */ / { - behaviors { - /omit-if-no-ref/ sk: behavior_sticky_key { - compatible = "zmk,behavior-sticky-key"; - label = "STICKY_KEY"; - #binding-cells = <1>; - release-after-ms = <1000>; - bindings = <&kp>; - ignore-modifiers; - }; - /omit-if-no-ref/ sl: behavior_sticky_layer { - compatible = "zmk,behavior-sticky-key"; - label = "STICKY_LAYER"; - #binding-cells = <1>; - release-after-ms = <1000>; - bindings = <&mo>; - quick-release; - }; - }; + behaviors { + /omit-if-no-ref/ sk: behavior_sticky_key { + compatible = "zmk,behavior-sticky-key"; + label = "STICKY_KEY"; + #binding-cells = <1>; + release-after-ms = <1000>; + bindings = <&kp>; + ignore-modifiers; + }; + /omit-if-no-ref/ sl: behavior_sticky_layer { + compatible = "zmk,behavior-sticky-key"; + label = "STICKY_LAYER"; + #binding-cells = <1>; + release-after-ms = <1000>; + bindings = <&mo>; + quick-release; + }; + }; }; diff --git a/app/dts/behaviors/to_layer.dtsi b/app/dts/behaviors/to_layer.dtsi index fa8f98bd..0ea66fa9 100644 --- a/app/dts/behaviors/to_layer.dtsi +++ b/app/dts/behaviors/to_layer.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ to: behavior_to_layer { - compatible = "zmk,behavior-to-layer"; - label = "TO_LAYER"; - #binding-cells = <1>; - }; - }; + behaviors { + /omit-if-no-ref/ to: behavior_to_layer { + compatible = "zmk,behavior-to-layer"; + label = "TO_LAYER"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/toggle_layer.dtsi b/app/dts/behaviors/toggle_layer.dtsi index ea0b1c19..75730934 100644 --- a/app/dts/behaviors/toggle_layer.dtsi +++ b/app/dts/behaviors/toggle_layer.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ tog: behavior_toggle_layer { - compatible = "zmk,behavior-toggle-layer"; - label = "TOGGLE_LAYER"; - #binding-cells = <1>; - }; - }; + behaviors { + /omit-if-no-ref/ tog: behavior_toggle_layer { + compatible = "zmk,behavior-toggle-layer"; + label = "TOGGLE_LAYER"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/transparent.dtsi b/app/dts/behaviors/transparent.dtsi index 81ebb133..0dfaade2 100644 --- a/app/dts/behaviors/transparent.dtsi +++ b/app/dts/behaviors/transparent.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ trans: behavior_transparent { - compatible = "zmk,behavior-transparent"; - label = "TRANS"; - #binding-cells = <0>; - }; - }; + behaviors { + /omit-if-no-ref/ trans: behavior_transparent { + compatible = "zmk,behavior-transparent"; + label = "TRANS"; + #binding-cells = <0>; + }; + }; }; diff --git a/app/dts/common/arduino_uno_pro_micro_map.dtsi b/app/dts/common/arduino_uno_pro_micro_map.dtsi index 3f3d64f0..a6b8d792 100644 --- a/app/dts/common/arduino_uno_pro_micro_map.dtsi +++ b/app/dts/common/arduino_uno_pro_micro_map.dtsi @@ -7,41 +7,41 @@ /* This provies a mapping from Arduino Uno to Arduino Pro Micro pins for development */ / { - pro_micro_d: connector_d { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &arduino_header 6 0> /* D0 */ - , <1 0 &arduino_header 7 0> /* D1 */ - , <2 0 &arduino_header 8 0> /* D2 */ - , <3 0 &arduino_header 9 0> /* D3 */ - , <4 0 &arduino_header 10 0> /* D4/A6 */ - , <5 0 &arduino_header 11 0> /* D5 */ - , <6 0 &arduino_header 12 0> /* D6/A7 */ - , <7 0 &arduino_header 13 0> /* D7 */ - , <8 0 &arduino_header 14 0> /* D8/A8 */ - , <9 0 &arduino_header 15 0> /* D9/A9 */ - , <10 0 &arduino_header 16 0> /* D10/A10 */ - , <16 0 &arduino_header 17 0> /* D16 */ - , <14 0 &arduino_header 18 0> /* D14 */ - , <15 0 &arduino_header 19 0> /* D15 */ - ; - }; + pro_micro_d: connector_d { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &arduino_header 6 0> /* D0 */ + , <1 0 &arduino_header 7 0> /* D1 */ + , <2 0 &arduino_header 8 0> /* D2 */ + , <3 0 &arduino_header 9 0> /* D3 */ + , <4 0 &arduino_header 10 0> /* D4/A6 */ + , <5 0 &arduino_header 11 0> /* D5 */ + , <6 0 &arduino_header 12 0> /* D6/A7 */ + , <7 0 &arduino_header 13 0> /* D7 */ + , <8 0 &arduino_header 14 0> /* D8/A8 */ + , <9 0 &arduino_header 15 0> /* D9/A9 */ + , <10 0 &arduino_header 16 0> /* D10/A10 */ + , <16 0 &arduino_header 17 0> /* D16 */ + , <14 0 &arduino_header 18 0> /* D14 */ + , <15 0 &arduino_header 19 0> /* D15 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &arduino_header 0 0> /* A0 */ - , <1 0 &arduino_header 1 0> /* A1 */ - , <2 0 &arduino_header 2 0> /* A2 */ - , <3 0 &arduino_header 3 0> /* A3 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &arduino_header 0 0> /* A0 */ + , <1 0 &arduino_header 1 0> /* A1 */ + , <2 0 &arduino_header 2 0> /* A2 */ + , <3 0 &arduino_header 3 0> /* A3 */ + ; + }; }; pro_micro_i2c: &arduino_i2c {}; diff --git a/app/include/linker/zmk-events.ld b/app/include/linker/zmk-events.ld index 3e307f85..0c4bb6e4 100644 --- a/app/include/linker/zmk-events.ld +++ b/app/include/linker/zmk-events.ld @@ -6,11 +6,11 @@ #include - __event_type_start = .; \ - KEEP(*(".event_type")); \ - __event_type_end = .; \ + __event_type_start = .; \ + KEEP(*(".event_type")); \ + __event_type_end = .; \ - __event_subscriptions_start = .; \ - KEEP(*(".event_subscription")); \ - __event_subscriptions_end = .; \ + __event_subscriptions_start = .; \ + KEEP(*(".event_subscription")); \ + __event_subscriptions_end = .; \ diff --git a/app/run-test.sh b/app/run-test.sh index 94438f34..6935f2c8 100755 --- a/app/run-test.sh +++ b/app/run-test.sh @@ -4,23 +4,23 @@ # SPDX-License-Identifier: MIT if [ -z "$1" ]; then - echo "Usage: ./run-test.sh " - exit 1 + echo "Usage: ./run-test.sh " + exit 1 fi path="$1" if [ $path = "all" ]; then - path="tests" + path="tests" fi testcases=$(find $path -name native_posix_64.keymap -exec dirname \{\} \;) num_cases=$(echo "$testcases" | wc -l) if [ $num_cases -gt 1 ] || [ "$testcases" != "$path" ]; then - echo "" > ./build/tests/pass-fail.log - echo "$testcases" | xargs -L 1 -P ${J:-4} ./run-test.sh - err=$? - sort -k2 ./build/tests/pass-fail.log - exit $err + echo "" > ./build/tests/pass-fail.log + echo "$testcases" | xargs -L 1 -P ${J:-4} ./run-test.sh + err=$? + sort -k2 ./build/tests/pass-fail.log + exit $err fi testcase="$path" @@ -28,19 +28,19 @@ echo "Running $testcase:" west build -d build/$testcase -b native_posix_64 -- -DZMK_CONFIG="$(pwd)/$testcase" > /dev/null 2>&1 if [ $? -gt 0 ]; then - echo "FAILED: $testcase did not build" | tee -a ./build/tests/pass-fail.log - exit 1 + echo "FAILED: $testcase did not build" | tee -a ./build/tests/pass-fail.log + exit 1 fi ./build/$testcase/zephyr/zmk.exe | sed -e "s/.*> //" | tee build/$testcase/keycode_events_full.log | sed -n -f $testcase/events.patterns > build/$testcase/keycode_events.log diff -auZ $testcase/keycode_events.snapshot build/$testcase/keycode_events.log if [ $? -gt 0 ]; then - if [ -f $testcase/pending ]; then - echo "PENDING: $testcase" | tee -a ./build/tests/pass-fail.log - exit 0 - fi - echo "FAILED: $testcase" | tee -a ./build/tests/pass-fail.log - exit 1 + if [ -f $testcase/pending ]; then + echo "PENDING: $testcase" | tee -a ./build/tests/pass-fail.log + exit 0 + fi + echo "FAILED: $testcase" | tee -a ./build/tests/pass-fail.log + exit 1 fi echo "PASS: $testcase" | tee -a ./build/tests/pass-fail.log diff --git a/app/src/split/Kconfig b/app/src/split/Kconfig index 42cb411c..dbe5f092 100644 --- a/app/src/split/Kconfig +++ b/app/src/split/Kconfig @@ -2,21 +2,21 @@ # SPDX-License-Identifier: MIT menuconfig ZMK_SPLIT - bool "Split keyboard support" + bool "Split keyboard support" if ZMK_SPLIT config ZMK_SPLIT_ROLE_CENTRAL - bool "Split central device" + bool "Split central device" choice ZMK_SPLIT_TRANSPORT - prompt "Split transport" + prompt "Split transport" config ZMK_SPLIT_BLE - bool "BLE" - depends on ZMK_BLE - select BT_USER_PHY_UPDATE - select BT_AUTO_PHY_UPDATE + bool "BLE" + depends on ZMK_BLE + select BT_USER_PHY_UPDATE + select BT_AUTO_PHY_UPDATE endchoice diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index f6976cff..53119d82 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -7,55 +7,55 @@ menu "BLE Transport" # Added for backwards compatibility. New shields/board should set `ZMK_SPLIT_ROLE_CENTRAL` only. config ZMK_SPLIT_BLE_ROLE_CENTRAL - bool - select ZMK_SPLIT_ROLE_CENTRAL + bool + select ZMK_SPLIT_ROLE_CENTRAL config ZMK_SPLIT_ROLE_CENTRAL - select BT_CENTRAL - select BT_GATT_CLIENT - select BT_GATT_AUTO_DISCOVER_CCC + select BT_CENTRAL + select BT_GATT_CLIENT + select BT_GATT_AUTO_DISCOVER_CCC if ZMK_SPLIT_ROLE_CENTRAL config ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE - int "Max number of key position state events to queue when received from peripherals" - default 5 + int "Max number of key position state events to queue when received from peripherals" + default 5 config ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE - int "BLE split central write thread stack size" - default 512 + int "BLE split central write thread stack size" + default 512 config ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE - int "Max number of behavior run events to queue to send to the peripheral(s)" - default 5 + int "Max number of behavior run events to queue to send to the peripheral(s)" + default 5 endif # ZMK_SPLIT_ROLE_CENTRAL if !ZMK_SPLIT_ROLE_CENTRAL config ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE - int "BLE split peripheral notify thread stack size" - default 650 + int "BLE split peripheral notify thread stack size" + default 650 config ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY - int "BLE split peripheral notify thread priority" - default 5 + int "BLE split peripheral notify thread priority" + default 5 config ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE - int "Max number of key position state events to queue to send to the central" - default 10 + int "Max number of key position state events to queue to send to the central" + default 10 config ZMK_USB - default n + default n config BT_MAX_PAIRED - default 1 + default 1 config BT_MAX_CONN - default 1 + default 1 config BT_PERIPHERAL_PREF_MAX_INT - default 6 + default 6 #!ZMK_SPLIT_ROLE_CENTRAL endif @@ -71,10 +71,10 @@ if ZMK_BLE if ZMK_SPLIT_BLE && ZMK_SPLIT_ROLE_CENTRAL config BT_MAX_CONN - default 6 + default 6 config BT_MAX_PAIRED - default 6 + default 6 #ZMK_SPLIT_BLE && ZMK_SPLIT_ROLE_CENTRAL endif @@ -82,10 +82,10 @@ endif if !ZMK_SPLIT_BLE config BT_MAX_CONN - default 5 + default 5 config BT_MAX_PAIRED - default 5 + default 5 #!ZMK_SPLIT_BLE endif diff --git a/app/tests/backlight/basic/native_posix_64.keymap b/app/tests/backlight/basic/native_posix_64.keymap index 185dbf7c..dfb08fef 100644 --- a/app/tests/backlight/basic/native_posix_64.keymap +++ b/app/tests/backlight/basic/native_posix_64.keymap @@ -1,30 +1,30 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_OFF */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* BL_OFF */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* BL_ON */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* BL_ON */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_OFF */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* BL_OFF */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* BL_ON */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* BL_ON */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; diff --git a/app/tests/backlight/behavior_keymap.dtsi b/app/tests/backlight/behavior_keymap.dtsi index 26869272..771072ac 100644 --- a/app/tests/backlight/behavior_keymap.dtsi +++ b/app/tests/backlight/behavior_keymap.dtsi @@ -4,31 +4,31 @@ #include / { - chosen { - zmk,backlight = &backlight; - }; + chosen { + zmk,backlight = &backlight; + }; - backlight: leds { - compatible = "gpio-leds"; - led_0 { - gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 0"; - }; - led_1 { - gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 1"; - }; - }; + backlight: leds { + compatible = "gpio-leds"; + led_0 { + gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 0"; + }; + led_1 { + gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 1"; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &bl BL_INC &bl BL_DEC - &bl BL_ON &bl BL_OFF - >; - }; - }; + default_layer { + bindings = < + &bl BL_INC &bl BL_DEC + &bl BL_ON &bl BL_OFF + >; + }; + }; }; diff --git a/app/tests/backlight/config-brt/native_posix_64.keymap b/app/tests/backlight/config-brt/native_posix_64.keymap index 6617c9f6..cbb6c93f 100644 --- a/app/tests/backlight/config-brt/native_posix_64.keymap +++ b/app/tests/backlight/config-brt/native_posix_64.keymap @@ -1,12 +1,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/backlight/config-on/native_posix_64.keymap b/app/tests/backlight/config-on/native_posix_64.keymap index a95ccd93..1a8de928 100644 --- a/app/tests/backlight/config-on/native_posix_64.keymap +++ b/app/tests/backlight/config-on/native_posix_64.keymap @@ -1,12 +1,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* BL_ON */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* BL_OFF */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + events = < + /* BL_ON */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* BL_OFF */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; diff --git a/app/tests/backlight/config-step/native_posix_64.keymap b/app/tests/backlight/config-step/native_posix_64.keymap index 96fbe96a..70614459 100644 --- a/app/tests/backlight/config-step/native_posix_64.keymap +++ b/app/tests/backlight/config-step/native_posix_64.keymap @@ -1,36 +1,36 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/backlight/cycle/native_posix_64.keymap b/app/tests/backlight/cycle/native_posix_64.keymap index a2f3c830..00615e35 100644 --- a/app/tests/backlight/cycle/native_posix_64.keymap +++ b/app/tests/backlight/cycle/native_posix_64.keymap @@ -4,75 +4,75 @@ #include / { - chosen { - zmk,backlight = &backlight; - }; + chosen { + zmk,backlight = &backlight; + }; - backlight: leds { - compatible = "gpio-leds"; - led_0 { - gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 0"; - }; - led_1 { - gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 1"; - }; - }; + backlight: leds { + compatible = "gpio-leds"; + led_0 { + gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 0"; + }; + led_1 { + gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 1"; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &bl BL_CYCLE &none - &none &none - >; - }; - }; + default_layer { + bindings = < + &bl BL_CYCLE &none + &none &none + >; + }; + }; }; &kscan { - events = < - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/backlight/low-brightness/native_posix_64.keymap b/app/tests/backlight/low-brightness/native_posix_64.keymap index 3b01f700..a151e0f6 100644 --- a/app/tests/backlight/low-brightness/native_posix_64.keymap +++ b/app/tests/backlight/low-brightness/native_posix_64.keymap @@ -1,39 +1,39 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_ON */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* BL_OFF */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_OFF */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_ON */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* BL_OFF */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_OFF */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/caps-word/behavior_keymap.dtsi b/app/tests/caps-word/behavior_keymap.dtsi index 04653bec..855406fc 100644 --- a/app/tests/caps-word/behavior_keymap.dtsi +++ b/app/tests/caps-word/behavior_keymap.dtsi @@ -3,15 +3,15 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &caps_word &kp A - &kp N6 &kp MINUS - >; - }; - }; + default_layer { + bindings = < + &caps_word &kp A + &kp N6 &kp MINUS + >; + }; + }; }; diff --git a/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap b/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap index 3053d5df..bbbdac10 100644 --- a/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap +++ b/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap @@ -4,30 +4,30 @@ #include "../behavior_keymap.dtsi" / { - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &caps_word &kp A - &kp LSHFT &kp MINUS - >; - }; - }; + default_layer { + bindings = < + &caps_word &kp A + &kp LSHFT &kp MINUS + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap b/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap index 68c3249f..08b173bd 100644 --- a/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap +++ b/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap @@ -4,18 +4,18 @@ #include "../behavior_keymap.dtsi" &caps_word { - continue-list = ; + continue-list = ; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap b/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap index 40a4d4a9..cde97c84 100644 --- a/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap +++ b/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap @@ -4,18 +4,18 @@ #include "../behavior_keymap.dtsi" &caps_word { - continue-list = ; + continue-list = ; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap b/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap index 4219e354..3fbb020b 100644 --- a/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap +++ b/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap @@ -4,14 +4,14 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap b/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap index 05f13fed..121a827c 100644 --- a/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap +++ b/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap @@ -4,14 +4,14 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap b/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap index e0695564..b8ae4ee0 100644 --- a/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap +++ b/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap @@ -4,14 +4,14 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10000) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,30) - ZMK_MOCK_RELEASE(0,1,30) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,30) - ZMK_MOCK_PRESS(0,1,30) - ZMK_MOCK_RELEASE(0,1,1000) - >; + events = < + ZMK_MOCK_PRESS(0,0,10000) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,30) + ZMK_MOCK_RELEASE(0,1,30) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,30) + ZMK_MOCK_PRESS(0,1,30) + ZMK_MOCK_RELEASE(0,1,1000) + >; }; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap index a02f6c64..e6754b71 100644 --- a/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap @@ -3,7 +3,7 @@ #include &mt { - flavor = "hold-preferred"; + flavor = "hold-preferred"; }; /* @@ -12,36 +12,36 @@ and combos is wrong. Hold-taps need to process key position events first so the decision to hold or tap can be made. */ / { - combos { - compatible = "zmk,combos"; + combos { + compatible = "zmk,combos"; - combo_two { - timeout-ms = <100>; - key-positions = <1 2>; - bindings = <&kp Y>; - }; - }; + combo_two { + timeout-ms = <100>; + key-positions = <1 2>; + bindings = <&kp Y>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &mt LEFT_CONTROL A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &mt LEFT_CONTROL A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap index 325da627..95382432 100644 --- a/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap @@ -3,40 +3,40 @@ #include &mt { - flavor = "hold-preferred"; + flavor = "hold-preferred"; }; /* this test checks if hold-taps can be part of a combo */ / { - combos { - compatible = "zmk,combos"; - combo_two { - timeout-ms = <100>; - key-positions = <0 1>; - bindings = <&kp Y>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_two { + timeout-ms = <100>; + key-positions = <0 1>; + bindings = <&kp Y>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &mt LEFT_CONTROL A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &mt LEFT_CONTROL A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap index 7a789808..d6d187e2 100644 --- a/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap @@ -3,43 +3,43 @@ #include &mt { - flavor = "hold-preferred"; + flavor = "hold-preferred"; }; /* This test verifies that hold-tap keys can observe * events which were released from combos. */ / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <100>; - key-positions = <0 2>; - bindings = <&kp Y>; - }; - combo_two { - timeout-ms = <100>; - key-positions = <1 3>; - bindings = <&kp Z>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <100>; + key-positions = <0 2>; + bindings = <&kp Y>; + }; + combo_two { + timeout-ms = <100>; + key-positions = <1 3>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &mt LEFT_CONTROL A &mt RIGHT_CONTROL B - &none &none - >; - }; - }; + default_layer { + bindings = < + &mt LEFT_CONTROL A &mt RIGHT_CONTROL B + &none &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,0) - ZMK_MOCK_PRESS(0,1,300) - >; + events = < + ZMK_MOCK_PRESS(0,0,0) + ZMK_MOCK_PRESS(0,1,300) + >; }; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap index d4053793..f1c7eee7 100644 --- a/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap @@ -3,38 +3,38 @@ #include &mt { - flavor = "hold-preferred"; + flavor = "hold-preferred"; }; / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <40>; - key-positions = <0 1>; - bindings = <&kp X>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <40>; + key-positions = <0 1>; + bindings = <&kp X>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &mt RSHFT RET &kp C - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &mt RSHFT RET &kp C + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,1,50) - ZMK_MOCK_RELEASE(1,1,50) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,1,50) + ZMK_MOCK_RELEASE(1,1,50) + >; }; diff --git a/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap index ba6cecc6..134b77df 100644 --- a/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap @@ -5,14 +5,14 @@ #define ZMK_COMBO(name, combo_bindings, keypos, combo_term) \ / { \ - combos { \ - compatible = "zmk,combos"; \ - combo_ ## name { \ - key-positions = ; \ - bindings = ; \ - timeout-ms = ; \ - }; \ - }; \ + combos { \ + compatible = "zmk,combos"; \ + combo_ ## name { \ + key-positions = ; \ + bindings = ; \ + timeout-ms = ; \ + }; \ + }; \ }; ZMK_COMBO(qmark, &kp QMARK, 0 3, 30) @@ -20,27 +20,27 @@ ZMK_COMBO(dllr, &kp DLLR, 1 3, 50) ZMK_COMBO(tilde, &kp TILDE, 3 4, 50) / { - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &none &none - &kp A &mt LSHFT T - &none - >; - }; - }; + default_layer { + bindings = < + &none &none + &kp A &mt LSHFT T + &none + >; + }; + }; }; &kscan { - rows = <3>; - columns = <2>; - events = < - ZMK_MOCK_PRESS(1,1,500) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,500) - ZMK_MOCK_RELEASE(1,1,0) - >; + rows = <3>; + columns = <2>; + events = < + ZMK_MOCK_PRESS(1,1,500) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,500) + ZMK_MOCK_RELEASE(1,1,0) + >; }; \ No newline at end of file diff --git a/app/tests/combo/layer-filter-0/native_posix_64.keymap b/app/tests/combo/layer-filter-0/native_posix_64.keymap index 33712822..8d94872b 100644 --- a/app/tests/combo/layer-filter-0/native_posix_64.keymap +++ b/app/tests/combo/layer-filter-0/native_posix_64.keymap @@ -6,73 +6,73 @@ #define TIMEOUT (60*60*1000) / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = ; - key-positions = <0 1>; - bindings = <&kp X>; - layers = <0>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = ; + key-positions = <0 1>; + bindings = <&kp X>; + layers = <0>; + }; - combo_two { - timeout-ms = ; - key-positions = <0 1>; - bindings = <&kp Y>; - layers = <1>; - }; + combo_two { + timeout-ms = ; + key-positions = <0 1>; + bindings = <&kp Y>; + layers = <1>; + }; - combo_three { - timeout-ms = ; - key-positions = <0 2>; - bindings = <&kp Z>; - }; - }; + combo_three { + timeout-ms = ; + key-positions = <0 2>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &tog 1 - >; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &tog 1 + >; + }; - filtered_layer { - bindings = < - &kp A &kp B - &kp C &tog 0 - >; - }; - }; + filtered_layer { + bindings = < + &kp A &kp B + &kp C &tog 0 + >; + }; + }; }; &kscan { - events = < - /* Combo One */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - /* Combo Three */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,1,10) - /* Toggle Layer */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* Combo Two */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - /* Combo Three */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + events = < + /* Combo One */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + /* Combo Three */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,1,10) + /* Toggle Layer */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* Combo Two */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + /* Combo Three */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/layer-filter-1/native_posix_64.keymap b/app/tests/combo/layer-filter-1/native_posix_64.keymap index 8eb5e9eb..96eccea4 100644 --- a/app/tests/combo/layer-filter-1/native_posix_64.keymap +++ b/app/tests/combo/layer-filter-1/native_posix_64.keymap @@ -6,35 +6,35 @@ #define TIMEOUT (60*60*1000) / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = ; - key-positions = <0 1>; - bindings = <&kp X>; - layers = <1>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = ; + key-positions = <0 1>; + bindings = <&kp X>; + layers = <1>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &tog 1 - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &tog 1 + >; + }; + }; }; &kscan { - events = < - /* Combo One */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + /* Combo One */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/multiple-timeouts/native_posix_64.keymap b/app/tests/combo/multiple-timeouts/native_posix_64.keymap index 87d21be1..d2176390 100644 --- a/app/tests/combo/multiple-timeouts/native_posix_64.keymap +++ b/app/tests/combo/multiple-timeouts/native_posix_64.keymap @@ -3,38 +3,38 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; - combo_two { - timeout-ms = <120>; - key-positions = <0 1 2>; - bindings = <&kp C>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; + combo_two { + timeout-ms = <120>; + key-positions = <0 1 2>; + bindings = <&kp C>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &none &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-0/native_posix_64.keymap b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap index 8b7b4196..e8284665 100644 --- a/app/tests/combo/overlapping-combos-0/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap @@ -3,7 +3,7 @@ #include /* - combo 0 timeout inf + combo 0 timeout inf combo 01 timeout inf combo 0123 timeout inf press 012 in any combination, release any of those keys @@ -14,104 +14,104 @@ #define TIMEOUT (60*60*1000) / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = ; - key-positions = <0 1 2>; - bindings = <&kp X>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = ; + key-positions = <0 1 2>; + bindings = <&kp X>; + }; - combo_two { - timeout-ms = ; - key-positions = <0 2>; - bindings = <&kp Y>; - }; + combo_two { + timeout-ms = ; + key-positions = <0 2>; + bindings = <&kp Y>; + }; - combo_three { - timeout-ms = ; - key-positions = <1>; - bindings = <&kp Z>; - }; - }; + combo_three { + timeout-ms = ; + key-positions = <1>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - /* all permutations of combo one press, combo triggered by release */ - /* while debugging these, you may want to set the release_timer to a high number */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,10) + events = < + /* all permutations of combo one press, combo triggered by release */ + /* while debugging these, you may want to set the release_timer to a high number */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) - /* all permutations of combo two press and release, combo triggered by release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) + /* all permutations of combo two press and release, combo triggered by release */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-1/native_posix_64.keymap b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap index 45737882..a695a388 100644 --- a/app/tests/combo/overlapping-combos-1/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap @@ -9,57 +9,57 @@ expected outcome: AB after 100ms */ / { - combos { - compatible = "zmk,combos"; - combo_two { - timeout-ms = <50>; - key-positions = <0 1>; - bindings = <&kp Y>; - }; + combos { + compatible = "zmk,combos"; + combo_two { + timeout-ms = <50>; + key-positions = <0 1>; + bindings = <&kp Y>; + }; - combo_three { - timeout-ms = <100>; - key-positions = <0 1 2>; - bindings = <&kp X>; - }; - }; + combo_three { + timeout-ms = <100>; + key-positions = <0 1 2>; + bindings = <&kp X>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - /* if you're debugging these, remember that the timer can be triggered between - events while stepping through code. */ - /* all permutations of combo two press and release, combo triggered by timeout */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + events = < + /* if you're debugging these, remember that the timer can be triggered between + events while stepping through code. */ + /* all permutations of combo two press and release, combo triggered by timeout */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-2/native_posix_64.keymap b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap index ba547dc2..6bf0e710 100644 --- a/app/tests/combo/overlapping-combos-2/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap @@ -9,44 +9,44 @@ expected: combo 01 after 100ms, immediately followed by key 2. */ / { - combos { - compatible = "zmk,combos"; - combo_two { - timeout-ms = <100>; - key-positions = <0 1>; - bindings = <&kp Y>; - }; + combos { + compatible = "zmk,combos"; + combo_two { + timeout-ms = <100>; + key-positions = <0 1>; + bindings = <&kp Y>; + }; - combo_four { - timeout-ms = <100>; - key-positions = <0 1 2 3>; - bindings = <&kp W>; - }; + combo_four { + timeout-ms = <100>; + key-positions = <0 1 2 3>; + bindings = <&kp W>; + }; - }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - /* if you're debugging these, remember that the timer can be triggered between - events while stepping through code. */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,100) - >; + events = < + /* if you're debugging these, remember that the timer can be triggered between + events while stepping through code. */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,100) + >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-3/native_posix_64.keymap b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap index 0da394b5..0a2f5ee1 100644 --- a/app/tests/combo/overlapping-combos-3/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap @@ -9,45 +9,45 @@ expected: key pos 0 followed by combo 12 */ / { - combos { - compatible = "zmk,combos"; - combo_two { - timeout-ms = <100>; - key-positions = <1 2>; - bindings = <&kp Y>; - }; + combos { + compatible = "zmk,combos"; + combo_two { + timeout-ms = <100>; + key-positions = <1 2>; + bindings = <&kp Y>; + }; - combo_four { - timeout-ms = <100>; - key-positions = <0 1 2 3>; - bindings = <&kp W>; - }; + combo_four { + timeout-ms = <100>; + key-positions = <0 1 2 3>; + bindings = <&kp W>; + }; - }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - /* if you're debugging these, remember that the timer can be triggered between - events while stepping through code. */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,100) - >; + events = < + /* if you're debugging these, remember that the timer can be triggered between + events while stepping through code. */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,100) + >; }; \ No newline at end of file diff --git a/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap index f9537344..900c4af3 100644 --- a/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap +++ b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap @@ -3,82 +3,82 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp X>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp X>; + }; - combo_two { - timeout-ms = <30>; - key-positions = <0 2>; - bindings = <&kp Y>; - }; + combo_two { + timeout-ms = <30>; + key-positions = <0 2>; + bindings = <&kp Y>; + }; - combo_three { - timeout-ms = <30>; - key-positions = <3>; - bindings = <&kp Z>; - }; - }; + combo_three { + timeout-ms = <30>; + key-positions = <3>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - /* all permutations of combo one press and release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + events = < + /* all permutations of combo one press and release */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) - /* all permutations of combo two press and release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) + /* all permutations of combo two press and release */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap index 2a71ad32..dac0bd5c 100644 --- a/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap +++ b/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap @@ -3,37 +3,37 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <80>; - key-positions = <0 1 2 3>; - bindings = <&kp Z>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <80>; + key-positions = <0 1 2 3>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &kp D - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &kp D + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,100) - ZMK_MOCK_RELEASE(1,0,100) - ZMK_MOCK_RELEASE(0,1,100) - ZMK_MOCK_RELEASE(1,1,100) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,100) + ZMK_MOCK_RELEASE(1,0,100) + ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_RELEASE(1,1,100) + >; }; diff --git a/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap index c6202365..19bad1d0 100644 --- a/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap +++ b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap @@ -3,33 +3,33 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <80>; - key-positions = <0 1 2 3>; - bindings = <&kp Z>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <80>; + key-positions = <0 1 2 3>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &kp D - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &kp D + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,100) - ZMK_MOCK_RELEASE(1,1,100) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_RELEASE(1,1,100) + >; }; \ No newline at end of file diff --git a/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap index b8117187..2eb6271e 100644 --- a/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap +++ b/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap @@ -3,35 +3,35 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <80>; - key-positions = <0 1 2>; - bindings = <&kp Z>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <80>; + key-positions = <0 1 2>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &kp D - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &kp D + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,100) - ZMK_MOCK_RELEASE(0,1,100) - ZMK_MOCK_RELEASE(0,0,100) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,100) + ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_RELEASE(0,0,100) + >; }; diff --git a/app/tests/combo/press-release/native_posix_64.keymap b/app/tests/combo/press-release/native_posix_64.keymap index 8d81f35b..6bd432f9 100644 --- a/app/tests/combo/press-release/native_posix_64.keymap +++ b/app/tests/combo/press-release/native_posix_64.keymap @@ -3,49 +3,49 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &none &none + >; + }; + }; }; &kscan { - events = < - /* all different combinations of press and release order */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + events = < + /* all different combinations of press and release order */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/press-timeout/native_posix_64.keymap b/app/tests/combo/press-timeout/native_posix_64.keymap index 497cf1aa..6ca6487b 100644 --- a/app/tests/combo/press-timeout/native_posix_64.keymap +++ b/app/tests/combo/press-timeout/native_posix_64.keymap @@ -3,33 +3,33 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &none &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap index cf7e79f7..9a395a41 100644 --- a/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap +++ b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap @@ -3,43 +3,43 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; - combo_two { - timeout-ms = <30>; - key-positions = <2 3>; - bindings = <&kp D>; - }; - }; + combo_two { + timeout-ms = <30>; + key-positions = <2 3>; + bindings = <&kp D>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp Z &kp Y - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp Z &kp Y + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap index 0c55eb47..86ca3931 100644 --- a/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap +++ b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap @@ -3,44 +3,44 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; - combo_two { - timeout-ms = <30>; - key-positions = <2 3>; - bindings = <&kp D>; - }; - }; + combo_two { + timeout-ms = <30>; + key-positions = <2 3>; + bindings = <&kp D>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp Z &kp Y - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp Z &kp Y + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap index 248d6e75..65089578 100644 --- a/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap +++ b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap @@ -3,44 +3,44 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; - combo_two { - timeout-ms = <30>; - key-positions = <2 3>; - bindings = <&kp D>; - }; - }; + combo_two { + timeout-ms = <30>; + key-positions = <2 3>; + bindings = <&kp D>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp Z &kp Y - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp Z &kp Y + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/slowrelease-disabled/native_posix_64.keymap b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap index 5af94d45..832e9705 100644 --- a/app/tests/combo/slowrelease-disabled/native_posix_64.keymap +++ b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap @@ -3,36 +3,36 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - /* no slow-release! */ - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + /* no slow-release! */ + }; + }; - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp D &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp D &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) /* this should release the combo */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) /* this should release the combo */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/slowrelease-enabled/native_posix_64.keymap b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap index 88351bea..7fdb012e 100644 --- a/app/tests/combo/slowrelease-enabled/native_posix_64.keymap +++ b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap @@ -3,36 +3,36 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - slow-release; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + slow-release; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp D &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp D &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) /* this should not release the combo yet */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) /* this should not release the combo yet */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/gresc/gresc-press-release/native_posix_64.keymap b/app/tests/gresc/gresc-press-release/native_posix_64.keymap index 4b658a73..5e3fac42 100644 --- a/app/tests/gresc/gresc-press-release/native_posix_64.keymap +++ b/app/tests/gresc/gresc-press-release/native_posix_64.keymap @@ -3,47 +3,47 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &gresc &none - &kp LEFT_SHIFT &kp LEFT_GUI - >; - }; - }; + default_layer { + bindings = < + &gresc &none + &kp LEFT_SHIFT &kp LEFT_GUI + >; + }; + }; }; &kscan { - events = < - /* esc */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < + /* esc */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - /* ~ */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) + /* ~ */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* LGUI+` */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,1,10) + /* LGUI+` */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,1,10) - /* ~ */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + /* ~ */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) - /* LGUI+` */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + /* LGUI+` */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/gresc/gresc-two-instances/native_posix_64.keymap b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap index 78b8ebcb..18f94da5 100644 --- a/app/tests/gresc/gresc-two-instances/native_posix_64.keymap +++ b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap @@ -11,33 +11,33 @@ The first gresc that is released releases the key. */ / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &gresc &gresc - &kp LEFT_SHIFT &kp LEFT_GUI - >; - }; - }; + default_layer { + bindings = < + &gresc &gresc + &kp LEFT_SHIFT &kp LEFT_GUI + >; + }; + }; }; &kscan { - events = < - /* esc */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) /* the second gresc is ignored */ - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) /* the second gresc is ignored */ + events = < + /* esc */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) /* the second gresc is ignored */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) /* the second gresc is ignored */ - /* ~ */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) /* the second gresc is ignored */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) /* the second gresc is ignored */ - >; + /* ~ */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) /* the second gresc is ignored */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) /* the second gresc is ignored */ + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap index 38c8668c..5b725bb1 100644 --- a/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap index a540353b..3a696af7 100644 --- a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 76bb2fa3..5704ca4b 100644 --- a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,300) - /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,300) + /*timer*/ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 882f33aa..df066fb0 100644 --- a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /*d*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /*d*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index 0fc0b848..34645ad4 100644 --- a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /* d */ - ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ - ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /* d */ + ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ + ZMK_MOCK_RELEASE(1,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index 5d0fcbfb..9c108d32 100644 --- a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(0,1,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index fca60ba8..9fd7cbf0 100644 --- a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index 5d0af9ca..f586b978 100644 --- a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 6b138352..3a5eab10 100644 --- a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* timer */ - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* timer */ + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap index 301ef0ac..cc7412f7 100644 --- a/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(0,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(0,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap index d895df02..bd431ceb 100644 --- a/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap b/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap index 832ea7ef..51995f8d 100644 --- a/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap @@ -3,43 +3,43 @@ #include / { - behaviors { - ht_bal: behavior_balanced { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "balanced"; - tapping_term_ms = <300>; - bindings = <&kp>, <&kp>; - retro-tap; - }; - }; + behaviors { + ht_bal: behavior_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "balanced"; + tapping_term_ms = <300>; + bindings = <&kp>, <&kp>; + retro-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_bal LEFT_SHIFT F &none - &kp D &none>; - }; - }; + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &none + &kp D &none>; + }; + }; }; &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* retro tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - /* hold */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* retro tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index 7560a05a..9ee237d3 100644 --- a/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,1,200) // non trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index b915a6a9..f2f2f8bd 100644 --- a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) // trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi index 5657644d..c750f8e3 100644 --- a/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi +++ b/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - ht_bal: behavior_hold_tap_balanced { - compatible = "zmk,behavior-hold-tap"; - label = "HOLD_TAP_BALANCED"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; + behaviors { + ht_bal: behavior_hold_tap_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "HOLD_TAP_BALANCED"; + #binding-cells = <2>; + flavor = "balanced"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; hold-trigger-key-positions = <2>; - }; - }; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J - &kp D &kp E>; - }; - }; + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J + &kp D &kp E>; + }; + }; }; diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap index 942d5ae4..8c24dc34 100644 --- a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &ht_bal { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,1,10) // not trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap index 677a2534..1db5f20e 100644 --- a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &ht_bal { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,0,10) // trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index a6ac1507..78404536 100644 --- a/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -4,13 +4,13 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) // trigger key - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) // trigger key + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,400) // not trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap index 9965c9b3..5af001f6 100644 --- a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -4,22 +4,22 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* normal quick tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,400) - /* hold */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix_64.keymap index 37c37f55..69d691ce 100644 --- a/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix_64.keymap @@ -4,17 +4,17 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* hold the first mod tap */ - ZMK_MOCK_PRESS(0,0,400) - /* hold the second mod tap */ - ZMK_MOCK_PRESS(0,1,400) - /* press the normal key */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* release the hold taps */ - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi index 0966ce0d..ef8efd43 100644 --- a/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - ht_bal: behavior_balanced { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <300>; - quick-tap-ms = <300>; - bindings = <&kp>, <&kp>; - global-quick-tap; - }; - }; + behaviors { + ht_bal: behavior_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "balanced"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL C - &kp D &none>; - }; - }; + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL C + &kp D &none>; + }; + }; }; diff --git a/app/tests/hold-tap/balanced/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/behavior_keymap.dtsi index d62be888..9f338ebc 100644 --- a/app/tests/hold-tap/balanced/behavior_keymap.dtsi +++ b/app/tests/hold-tap/balanced/behavior_keymap.dtsi @@ -3,26 +3,26 @@ #include / { - behaviors { - ht_bal: behavior_hold_tap_balanced { - compatible = "zmk,behavior-hold-tap"; - label = "HOLD_TAP_BALANCED"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + ht_bal: behavior_hold_tap_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "HOLD_TAP_BALANCED"; + #binding-cells = <2>; + flavor = "balanced"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; diff --git a/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap index 6d016501..4bac8b83 100644 --- a/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap @@ -3,39 +3,39 @@ #include / { - behaviors { - ht_bal: behavior_hold_tap_balanced { - compatible = "zmk,behavior-hold-tap"; - label = "HOLD_TAP_BALANCED"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <300>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + ht_bal: behavior_hold_tap_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "HOLD_TAP_BALANCED"; + #binding-cells = <2>; + flavor = "balanced"; + tapping-term-ms = <300>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J - &ht_bal LEFT_GUI H &ht_bal LEFT_ALT L - >; - }; - }; + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J + &ht_bal LEFT_GUI H &ht_bal LEFT_ALT L + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_PRESS(1,1,100) - ZMK_MOCK_RELEASE(0,0,100) - ZMK_MOCK_RELEASE(0,1,100) - ZMK_MOCK_RELEASE(1,0,100) - ZMK_MOCK_RELEASE(1,1,100) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_PRESS(1,1,100) + ZMK_MOCK_RELEASE(0,0,100) + ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_RELEASE(1,0,100) + ZMK_MOCK_RELEASE(1,1,100) + >; }; diff --git a/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap index 38c8668c..5b725bb1 100644 --- a/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap index a540353b..3a696af7 100644 --- a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 76bb2fa3..5704ca4b 100644 --- a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,300) - /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,300) + /*timer*/ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 882f33aa..df066fb0 100644 --- a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /*d*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /*d*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index 0fc0b848..34645ad4 100644 --- a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /* d */ - ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ - ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /* d */ + ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ + ZMK_MOCK_RELEASE(1,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index 5d0fcbfb..9c108d32 100644 --- a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(0,1,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index fca60ba8..9fd7cbf0 100644 --- a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index 5d0af9ca..f586b978 100644 --- a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 6b138352..3a5eab10 100644 --- a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* timer */ - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* timer */ + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap index 301ef0ac..cc7412f7 100644 --- a/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(0,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(0,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap index d895df02..bd431ceb 100644 --- a/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap index dc96ee8b..8dbc7d82 100644 --- a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap @@ -3,43 +3,43 @@ #include / { - behaviors { - hp: behavior_hold_preferred { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping_term_ms = <300>; - bindings = <&kp>, <&kp>; - retro-tap; - }; - }; + behaviors { + hp: behavior_hold_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping_term_ms = <300>; + bindings = <&kp>, <&kp>; + retro-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &hp LEFT_SHIFT F &none - &kp D &none>; - }; - }; + default_layer { + bindings = < + &hp LEFT_SHIFT F &none + &kp D &none>; + }; + }; }; &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* retro tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - /* hold */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* retro tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index 7560a05a..9ee237d3 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,1,200) // non trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index b915a6a9..f2f2f8bd 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) // trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi index bf681004..71f3aba5 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi +++ b/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - ht_hold: behavior_hold_hold_tap { - compatible = "zmk,behavior-hold-tap"; - label = "hold_hold_tap"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; + behaviors { + ht_hold: behavior_hold_hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "hold_hold_tap"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; hold-trigger-key-positions = <2>; - }; - }; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_hold LEFT_SHIFT F &ht_hold LEFT_CONTROL J - &kp D &kp E>; - }; - }; + default_layer { + bindings = < + &ht_hold LEFT_SHIFT F &ht_hold LEFT_CONTROL J + &kp D &kp E>; + }; + }; }; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap index b48332ff..f35b73ba 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &ht_hold { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,1,10) // not trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap index 77398582..0b4eb320 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &ht_hold { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,0,10) // trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index a6ac1507..78404536 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -4,13 +4,13 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) // trigger key - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) // trigger key + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,400) // not trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap index 13a58c3e..e28eb4c3 100644 --- a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -4,22 +4,22 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* normal quick tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,400) - /* hold */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap index 37c37f55..69d691ce 100644 --- a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap @@ -4,17 +4,17 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* hold the first mod tap */ - ZMK_MOCK_PRESS(0,0,400) - /* hold the second mod tap */ - ZMK_MOCK_PRESS(0,1,400) - /* press the normal key */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* release the hold taps */ - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi index fee3361e..392a5f83 100644 --- a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - hp: behavior_hold_preferred { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <300>; - bindings = <&kp>, <&kp>; - global-quick-tap; - }; - }; + behaviors { + hp: behavior_hold_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &hp LEFT_SHIFT F &hp LEFT_CONTROL G - &kp D &none>; - }; - }; + default_layer { + bindings = < + &hp LEFT_SHIFT F &hp LEFT_CONTROL G + &kp D &none>; + }; + }; }; diff --git a/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi index 41c84e1e..da6b8362 100644 --- a/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi +++ b/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi @@ -5,26 +5,26 @@ / { - behaviors { - ht_hold: behavior_hold_hold_tap { - compatible = "zmk,behavior-hold-tap"; - label = "hold_hold_tap"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + ht_hold: behavior_hold_hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "hold_hold_tap"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_hold LEFT_SHIFT F &ht_hold LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &ht_hold LEFT_SHIFT F &ht_hold LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; diff --git a/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap index 38c8668c..5b725bb1 100644 --- a/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap index a540353b..3a696af7 100644 --- a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 76bb2fa3..5704ca4b 100644 --- a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,300) - /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,300) + /*timer*/ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 882f33aa..df066fb0 100644 --- a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /*d*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /*d*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index 0fc0b848..34645ad4 100644 --- a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /* d */ - ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ - ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /* d */ + ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ + ZMK_MOCK_RELEASE(1,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index 5d0fcbfb..9c108d32 100644 --- a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(0,1,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index fca60ba8..9fd7cbf0 100644 --- a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index 5d0af9ca..f586b978 100644 --- a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 6b138352..3a5eab10 100644 --- a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* timer */ - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* timer */ + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap index 301ef0ac..cc7412f7 100644 --- a/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(0,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(0,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap index d895df02..bd431ceb 100644 --- a/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap index b733e3a2..500d2670 100644 --- a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap @@ -9,45 +9,45 @@ */ / { - behaviors { - tp_short: short_tap { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP_SHORT"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <100>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - tp_long: long_tap { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP_LONG"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <200>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + tp_short: short_tap { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP_SHORT"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <100>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + tp_long: long_tap { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP_LONG"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &tp_long LEFT_SHIFT F &tp_short LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &tp_long LEFT_SHIFT F &tp_short LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,20) - ZMK_MOCK_PRESS(0,1,20) - ZMK_MOCK_RELEASE(0,1,200) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,20) + ZMK_MOCK_PRESS(0,1,20) + ZMK_MOCK_RELEASE(0,1,200) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index 7560a05a..9ee237d3 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,1,200) // non trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index b915a6a9..f2f2f8bd 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) // trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi index e4be8d15..79a88eb2 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - tp: behavior_tap_preferred { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; + behaviors { + tp: behavior_tap_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; hold-trigger-key-positions = <2>; - }; - }; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &tp LEFT_SHIFT F &tp LEFT_CONTROL J - &kp D &kp E>; - }; - }; + default_layer { + bindings = < + &tp LEFT_SHIFT F &tp LEFT_CONTROL J + &kp D &kp E>; + }; + }; }; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap index 504318f7..179b64ee 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &tp { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,1,10) // not trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap index 7061eee7..e926b45c 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &tp { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,0,10) // trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index a6ac1507..78404536 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -4,13 +4,13 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) // trigger key - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) // trigger key + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,400) // not trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap index 9965c9b3..5af001f6 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -4,22 +4,22 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* normal quick tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,400) - /* hold */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap index 37c37f55..69d691ce 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap @@ -4,17 +4,17 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* hold the first mod tap */ - ZMK_MOCK_PRESS(0,0,400) - /* hold the second mod tap */ - ZMK_MOCK_PRESS(0,1,400) - /* press the normal key */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* release the hold taps */ - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi index 4771ab75..02362ef2 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - tp: behavior_tap_preferred { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <300>; - bindings = <&kp>, <&kp>; - global-quick-tap; - }; - }; + behaviors { + tp: behavior_tap_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &tp LEFT_SHIFT F &tp LEFT_CONTROL C - &kp D &none>; - }; - }; + default_layer { + bindings = < + &tp LEFT_SHIFT F &tp LEFT_CONTROL C + &kp D &none>; + }; + }; }; diff --git a/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi index cdeb9596..df307740 100644 --- a/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi @@ -3,26 +3,26 @@ #include / { - behaviors { - tp: behavior_tap_preferred { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + tp: behavior_tap_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &tp LEFT_SHIFT F &tp LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &tp LEFT_SHIFT F &tp LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; diff --git a/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap index 38c8668c..5b725bb1 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap index a540353b..3a696af7 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 76bb2fa3..5704ca4b 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,300) - /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,300) + /*timer*/ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 882f33aa..df066fb0 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /*d*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /*d*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index 0fc0b848..34645ad4 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /* d */ - ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ - ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /* d */ + ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ + ZMK_MOCK_RELEASE(1,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index 5d0fcbfb..9c108d32 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(0,1,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index fca60ba8..9fd7cbf0 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index 5d0af9ca..f586b978 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 6b138352..3a5eab10 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* timer */ - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* timer */ + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap index 301ef0ac..cc7412f7 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(0,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(0,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap index d895df02..bd431ceb 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap index 9965c9b3..5af001f6 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap @@ -4,22 +4,22 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* normal quick tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,400) - /* hold */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix_64.keymap index 37c37f55..69d691ce 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix_64.keymap @@ -4,17 +4,17 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* hold the first mod tap */ - ZMK_MOCK_PRESS(0,0,400) - /* hold the second mod tap */ - ZMK_MOCK_PRESS(0,1,400) - /* press the normal key */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* release the hold taps */ - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi index 6ca7ac72..029a8128 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - ht_tui: behavior_hold_tap_tap_unless_interrupted { - compatible = "zmk,behavior-hold-tap"; - label = "hold_tap_tap_unless_interrupted"; - #binding-cells = <2>; - flavor = "tap-unless-interrupted"; - tapping-term-ms = <300>; - quick-tap-ms = <300>; - bindings = <&kp>, <&kp>; - global-quick-tap; - }; - }; + behaviors { + ht_tui: behavior_hold_tap_tap_unless_interrupted { + compatible = "zmk,behavior-hold-tap"; + label = "hold_tap_tap_unless_interrupted"; + #binding-cells = <2>; + flavor = "tap-unless-interrupted"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_tui LEFT_SHIFT F &ht_tui LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &ht_tui LEFT_SHIFT F &ht_tui LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; diff --git a/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi b/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi index 18f68d63..b24de6dd 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi @@ -5,26 +5,26 @@ / { - behaviors { - ht_tui: behavior_hold_tap_tap_unless_interrupted { - compatible = "zmk,behavior-hold-tap"; - label = "hold_tap_tap_unless_interrupted"; - #binding-cells = <2>; - flavor = "tap-unless-interrupted"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + ht_tui: behavior_hold_tap_tap_unless_interrupted { + compatible = "zmk,behavior-hold-tap"; + label = "hold_tap_tap_unless_interrupted"; + #binding-cells = <2>; + flavor = "tap-unless-interrupted"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_tui LEFT_SHIFT F &ht_tui LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &ht_tui LEFT_SHIFT F &ht_tui LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; diff --git a/app/tests/key-repeat/behavior_keymap.dtsi b/app/tests/key-repeat/behavior_keymap.dtsi index 24902fc6..c8e2d9c4 100644 --- a/app/tests/key-repeat/behavior_keymap.dtsi +++ b/app/tests/key-repeat/behavior_keymap.dtsi @@ -3,15 +3,15 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &key_repeat &kp A - &kp LCTRL &kp C_VOL_UP - >; - }; - }; + default_layer { + bindings = < + &key_repeat &kp A + &kp LCTRL &kp C_VOL_UP + >; + }; + }; }; diff --git a/app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap b/app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap index b042e8e0..e4687573 100644 --- a/app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap +++ b/app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap index 98c8f6f8..9078f304 100644 --- a/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap +++ b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap index 42f6514b..1d27770b 100644 --- a/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap +++ b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,1,9000) - ZMK_MOCK_RELEASE(0,1,30) - ZMK_MOCK_PRESS(0,0,30) - ZMK_MOCK_RELEASE(0,0,3000) - >; + events = < + ZMK_MOCK_PRESS(0,1,9000) + ZMK_MOCK_RELEASE(0,1,30) + ZMK_MOCK_PRESS(0,0,30) + ZMK_MOCK_RELEASE(0,0,3000) + >; }; \ No newline at end of file diff --git a/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap b/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap index ab9622e4..109aed5a 100644 --- a/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap +++ b/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap b/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap index 9ff64468..0d2d0f6c 100644 --- a/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap +++ b/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/keypress/behavior_keymap.dtsi b/app/tests/keypress/behavior_keymap.dtsi index f0c5d0c2..52f9421c 100644 --- a/app/tests/keypress/behavior_keymap.dtsi +++ b/app/tests/keypress/behavior_keymap.dtsi @@ -3,15 +3,15 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &none - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp B &none + &none &none + >; + }; + }; }; diff --git a/app/tests/keypress/kp-press-release/native_posix_64.keymap b/app/tests/keypress/kp-press-release/native_posix_64.keymap index c8e744ee..a414f34b 100644 --- a/app/tests/keypress/kp-press-release/native_posix_64.keymap +++ b/app/tests/keypress/kp-press-release/native_posix_64.keymap @@ -1,8 +1,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/keytoggle/behavior_keymap.dtsi b/app/tests/keytoggle/behavior_keymap.dtsi index 32712a8d..45d48164 100644 --- a/app/tests/keytoggle/behavior_keymap.dtsi +++ b/app/tests/keytoggle/behavior_keymap.dtsi @@ -3,15 +3,15 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kt B &none - &none &none - >; - }; - }; + default_layer { + bindings = < + &kt B &none + &none &none + >; + }; + }; }; diff --git a/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap index f4d03429..4f70b591 100644 --- a/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap @@ -3,46 +3,46 @@ #include &kscan { - events = < + events = < /* Toggle LALT on */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Tap TAB twice */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* Toggle LSHFT on */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) /* Tap TAB once */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* Toggle LALT off */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Tap A */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) /* Toggle LSHFT off */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) /* Tap A */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kt LALT &kp TAB - &kt LSHFT &kp A - >; - }; - }; + default_layer { + bindings = < + &kt LALT &kp TAB + &kt LSHFT &kp A + >; + }; + }; }; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap index 0a4ad4ae..b07f297f 100644 --- a/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap @@ -3,36 +3,36 @@ #include &kscan { - events = < + events = < /* Toggle LS(A) on */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Toggle LS(A) off */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Press A */ - ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,0,10) /* Toggle LS(A) on */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Toggle LS(A) off */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Release A */ - ZMK_MOCK_RELEASE(1,0,10) - >; + ZMK_MOCK_RELEASE(1,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kt LS(A) &trans - &kp A &trans - >; - }; - }; + default_layer { + bindings = < + &kt LS(A) &trans + &kp A &trans + >; + }; + }; }; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap index e25d4b18..5c2d2028 100644 --- a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap @@ -1,10 +1,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-press-release/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release/native_posix_64.keymap index e25d4b18..5c2d2028 100644 --- a/app/tests/keytoggle/kt-press-release/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-press-release/native_posix_64.keymap @@ -1,10 +1,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/macros/basic/native_posix_64.keymap b/app/tests/macros/basic/native_posix_64.keymap index a2812792..a34ba99f 100644 --- a/app/tests/macros/basic/native_posix_64.keymap +++ b/app/tests/macros/basic/native_posix_64.keymap @@ -10,5 +10,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/behavior_keymap.dtsi b/app/tests/macros/behavior_keymap.dtsi index 7399cd5b..90322e42 100644 --- a/app/tests/macros/behavior_keymap.dtsi +++ b/app/tests/macros/behavior_keymap.dtsi @@ -9,60 +9,60 @@ #include / { - macros { - ZMK_MACRO(abc_macro, - wait-ms = <10>; - tap-ms = <50>; - bindings = <&kp A &kp B &kp C>; - ) + macros { + ZMK_MACRO(abc_macro, + wait-ms = <10>; + tap-ms = <50>; + bindings = <&kp A &kp B &kp C>; + ) - ZMK_MACRO(hold_shift_macro, - bindings - = <¯o_press &kp LSHFT> - , <¯o_tap> - , <&kp D &kp O &kp G> - , <¯o_release &kp LSHFT> - ; - ) + ZMK_MACRO(hold_shift_macro, + bindings + = <¯o_press &kp LSHFT> + , <¯o_tap> + , <&kp D &kp O &kp G> + , <¯o_release &kp LSHFT> + ; + ) - ZMK_MACRO(custom_timing, - bindings - = <¯o_wait_time 50> - , <&kp A> - , <¯o_tap_time 20> - , <&kp B &kp C> - ; - ) + ZMK_MACRO(custom_timing, + bindings + = <¯o_wait_time 50> + , <&kp A> + , <¯o_tap_time 20> + , <&kp B &kp C> + ; + ) - ZMK_MACRO(dual_sequence_macro, - wait-ms = <10>; - tap-ms = <40>; - bindings - = <¯o_press &kp LALT> - , <¯o_tap> - , <&kp TAB> - , <¯o_pause_for_release> - , <¯o_release &kp LALT> - ; - ) - }; + ZMK_MACRO(dual_sequence_macro, + wait-ms = <10>; + tap-ms = <40>; + bindings + = <¯o_press &kp LALT> + , <¯o_tap> + , <&kp TAB> + , <¯o_pause_for_release> + , <¯o_release &kp LALT> + ; + ) + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &abc_macro &mo 1 - &hold_shift_macro &custom_timing>; - }; + default_layer { + bindings = < + &abc_macro &mo 1 + &hold_shift_macro &custom_timing>; + }; - extra_layer { - bindings = < - &dual_sequence_macro &trans - &kp TAB &none>; + extra_layer { + bindings = < + &dual_sequence_macro &trans + &kp TAB &none>; - }; + }; - }; + }; }; diff --git a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap index e6ef4f49..bdf89abf 100644 --- a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap +++ b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap @@ -9,19 +9,19 @@ #include / { - macros { - ZMK_MACRO( - mo_mod_macro, - wait-ms = <0>; - tap-ms = <20>; - bindings - = <¯o_press &mo 1 &kp LSHFT> - , <¯o_pause_for_release> - , <¯o_release &mo 1 &kp LSHFT>; - ) - }; + macros { + ZMK_MACRO( + mo_mod_macro, + wait-ms = <0>; + tap-ms = <20>; + bindings + = <¯o_press &mo 1 &kp LSHFT> + , <¯o_pause_for_release> + , <¯o_release &mo 1 &kp LSHFT>; + ) + }; - behaviors { + behaviors { mth: macro_tap_hold { compatible = "zmk,behavior-hold-tap"; label = "MACRO_TAP_HOLD"; @@ -30,28 +30,28 @@ tapping-term-ms = <200>; bindings = <&mo_mod_macro>, <&kp>; }; - }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &mth 0 TAB &kp A - &kp B &kp C>; - }; + default_layer { + bindings = < + &mth 0 TAB &kp A + &kp B &kp C>; + }; - extra_layer { - bindings = < - &kp D &kp E - &kp F &kp G>; + extra_layer { + bindings = < + &kp D &kp E + &kp F &kp G>; - }; + }; - }; + }; }; &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap b/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap index c5cde5b4..4cc60bf5 100644 --- a/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap +++ b/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap @@ -9,38 +9,38 @@ #include / { - macros { - ZMK_MACRO( - mo_mod_macro, - wait-ms = <0>; - tap-ms = <20>; - bindings - = <¯o_press &mo 1 &kp LSHFT> - , <¯o_pause_for_release> - , <¯o_release &mo 1 &kp LSHFT>; - ) - }; + macros { + ZMK_MACRO( + mo_mod_macro, + wait-ms = <0>; + tap-ms = <20>; + bindings + = <¯o_press &mo 1 &kp LSHFT> + , <¯o_pause_for_release> + , <¯o_release &mo 1 &kp LSHFT>; + ) + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &mo_mod_macro &kp A - &kp B &kp C>; - }; + default_layer { + bindings = < + &mo_mod_macro &kp A + &kp B &kp C>; + }; - extra_layer { - bindings = < - &kp D &kp E - &kp F &kp G>; + extra_layer { + bindings = < + &kp D &kp E + &kp F &kp G>; - }; + }; - }; + }; }; &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/press-mid-macro/native_posix_64.keymap b/app/tests/macros/press-mid-macro/native_posix_64.keymap index b8ae76f1..8010a8e7 100644 --- a/app/tests/macros/press-mid-macro/native_posix_64.keymap +++ b/app/tests/macros/press-mid-macro/native_posix_64.keymap @@ -10,5 +10,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/press-release/native_posix_64.keymap b/app/tests/macros/press-release/native_posix_64.keymap index 25467126..75333333 100644 --- a/app/tests/macros/press-release/native_posix_64.keymap +++ b/app/tests/macros/press-release/native_posix_64.keymap @@ -10,5 +10,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/timing-override/native_posix_64.keymap b/app/tests/macros/timing-override/native_posix_64.keymap index 343926a7..e5d35e88 100644 --- a/app/tests/macros/timing-override/native_posix_64.keymap +++ b/app/tests/macros/timing-override/native_posix_64.keymap @@ -10,5 +10,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/wait-macro-release/native_posix_64.keymap b/app/tests/macros/wait-macro-release/native_posix_64.keymap index 6dabaeca..394e4a88 100644 --- a/app/tests/macros/wait-macro-release/native_posix_64.keymap +++ b/app/tests/macros/wait-macro-release/native_posix_64.keymap @@ -10,5 +10,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/mod-morph/1-no-morph/native_posix_64.keymap b/app/tests/mod-morph/1-no-morph/native_posix_64.keymap index fb939de5..916aa569 100644 --- a/app/tests/mod-morph/1-no-morph/native_posix_64.keymap +++ b/app/tests/mod-morph/1-no-morph/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap b/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap index 9ad50202..ec0591e5 100644 --- a/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap +++ b/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; diff --git a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap index 74de8588..66fb1ed0 100644 --- a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap +++ b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap @@ -13,25 +13,25 @@ }; }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_ALT &mod_morph - &kp LEFT_SHIFT &kp RIGHT_SHIFT - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_ALT &mod_morph + &kp LEFT_SHIFT &kp RIGHT_SHIFT + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; diff --git a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap index d5406e19..de1368bd 100644 --- a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap +++ b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap index 7071e8cd..9b7f4fe1 100644 --- a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap +++ b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap @@ -3,13 +3,13 @@ #include &kscan { - events = < + events = < /* Shift + tap &mod_morph --> expect B (but get Shift + B) */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; / { @@ -24,22 +24,22 @@ }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_SHIFT &mod_morph - &kp C &none - >; - }; + default_layer { + bindings = < + &kp LEFT_SHIFT &mod_morph + &kp C &none + >; + }; second_layer { - bindings = < - &trans &trans - &kp D &trans - >; - }; - }; + bindings = < + &trans &trans + &kp D &trans + >; + }; + }; }; diff --git a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap index 96c2f270..e0c1d1e5 100644 --- a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap +++ b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap @@ -3,15 +3,15 @@ #include &kscan { - events = < + events = < /* Shift + hold &mod_morph --> expect and get D (no shift) */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,200) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,200) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; / { @@ -26,22 +26,22 @@ }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_SHIFT &mod_morph - &kp C &none - >; - }; + default_layer { + bindings = < + &kp LEFT_SHIFT &mod_morph + &kp C &none + >; + }; second_layer { - bindings = < - &trans &trans - &kp D &trans - >; - }; - }; + bindings = < + &trans &trans + &kp D &trans + >; + }; + }; }; diff --git a/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap b/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap index a82d3ea7..a20c04d5 100644 --- a/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap +++ b/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap @@ -14,24 +14,24 @@ }; }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_ALT &mod_morph - &kp LEFT_SHIFT &kp RIGHT_SHIFT - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_ALT &mod_morph + &kp LEFT_SHIFT &kp RIGHT_SHIFT + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; diff --git a/app/tests/mod-morph/behavior_keymap.dtsi b/app/tests/mod-morph/behavior_keymap.dtsi index 09720d8d..2f880540 100644 --- a/app/tests/mod-morph/behavior_keymap.dtsi +++ b/app/tests/mod-morph/behavior_keymap.dtsi @@ -9,15 +9,15 @@ }; }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_ALT &mod_morph - &kp LEFT_SHIFT &kp RIGHT_SHIFT - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_ALT &mod_morph + &kp LEFT_SHIFT &kp RIGHT_SHIFT + >; + }; + }; }; diff --git a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap index dbb2df5c..621945a8 100644 --- a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap @@ -4,25 +4,25 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) - >; + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LS(LA(LG(LEFT_CONTROL))) &kp LEFT_CONTROL - &kp A &none - >; - }; - }; + default_layer { + bindings = < + &kp LS(LA(LG(LEFT_CONTROL))) &kp LEFT_CONTROL + &kp A &none + >; + }; + }; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap index b01c6257..d68f8921 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_CONTROL &kp LEFT_CONTROL - &kp LEFT_SHIFT &none - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_CONTROL &kp LEFT_CONTROL + &kp LEFT_SHIFT &none + >; + }; + }; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap index 89930328..c2d12eb2 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap @@ -4,22 +4,22 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_CONTROL &kp LEFT_CONTROL - &kp LEFT_SHIFT &none - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_CONTROL &kp LEFT_CONTROL + &kp LEFT_SHIFT &none + >; + }; + }; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap index acd55e83..7be62b94 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_CONTROL &kp LEFT_CONTROL - &kp LEFT_SHIFT &none - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_CONTROL &kp LEFT_CONTROL + &kp LEFT_SHIFT &none + >; + }; + }; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap index 7e1865a0..8d1d773e 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap @@ -4,25 +4,25 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) - >; + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_CONTROL &kp LEFT_CONTROL - &kp LEFT_SHIFT &none - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_CONTROL &kp LEFT_CONTROL + &kp LEFT_SHIFT &none + >; + }; + }; }; diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap index e175d60e..87101d83 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LC(A) &kp LS(B) - &kp LEFT_CONTROL &none - >; - }; - }; + default_layer { + bindings = < + &kp LC(A) &kp LS(B) + &kp LEFT_CONTROL &none + >; + }; + }; }; diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap index 8c4534f4..6b40fef1 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LC(A) &kp LS(B) - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp LC(A) &kp LS(B) + &none &none + >; + }; + }; }; diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap index e82182c4..4b2ca139 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LC(A) &kp LS(B) - &kp LEFT_CONTROL &none - >; - }; - }; + default_layer { + bindings = < + &kp LC(A) &kp LS(B) + &kp LEFT_CONTROL &none + >; + }; + }; }; diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap index a36b85d2..a2564762 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LC(A) &kp LS(B) - &kp LEFT_CONTROL &none - >; - }; - }; + default_layer { + bindings = < + &kp LC(A) &kp LS(B) + &kp LEFT_CONTROL &none + >; + }; + }; }; diff --git a/app/tests/momentary-layer/1-normal/native_posix_64.keymap b/app/tests/momentary-layer/1-normal/native_posix_64.keymap index ed0e8ad1..387a1322 100644 --- a/app/tests/momentary-layer/1-normal/native_posix_64.keymap +++ b/app/tests/momentary-layer/1-normal/native_posix_64.keymap @@ -4,29 +4,29 @@ #include "../behavior_keymap.dtsi" / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &mo 1 - &none &none>; - }; + default_layer { + bindings = < + &kp B &mo 1 + &none &none>; + }; - layer_1 { - bindings = < - &kp C &trans - &none &none>; - }; - }; + layer_1 { + bindings = < + &kp C &trans + &none &none>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap b/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap index 9311fdee..776fc761 100644 --- a/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap +++ b/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap @@ -4,29 +4,29 @@ #include "../behavior_keymap.dtsi" / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &mo 1 - &none &none>; - }; + default_layer { + bindings = < + &kp B &mo 1 + &none &none>; + }; - layer_1 { - bindings = < - &kp C &none - &none &none>; - }; - }; + layer_1 { + bindings = < + &kp C &none + &none &none>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/3-covered/native_posix_64.keymap b/app/tests/momentary-layer/3-covered/native_posix_64.keymap index 62ae301d..a7939d9e 100644 --- a/app/tests/momentary-layer/3-covered/native_posix_64.keymap +++ b/app/tests/momentary-layer/3-covered/native_posix_64.keymap @@ -7,27 +7,27 @@ this test verifies that the correct key is released when a layer is enabled "on and the original key is "covered". */ / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &trans &mo 1 - &trans &trans>; - }; + default_layer { + bindings = < + &trans &mo 1 + &trans &trans>; + }; - layer_1 { - bindings = < - &trans &kp A - &trans &trans>; - }; - }; + layer_1 { + bindings = < + &trans &kp A + &trans &trans>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/momentary-layer/4-nested/native_posix_64.keymap b/app/tests/momentary-layer/4-nested/native_posix_64.keymap index fd376d00..1f4f0aea 100644 --- a/app/tests/momentary-layer/4-nested/native_posix_64.keymap +++ b/app/tests/momentary-layer/4-nested/native_posix_64.keymap @@ -3,37 +3,37 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &none &mo 1 - &none &none>; - }; + default_layer { + bindings = < + &none &mo 1 + &none &none>; + }; - layer_1 { - bindings = < - &mo 2 &none - &none &none>; - }; + layer_1 { + bindings = < + &mo 2 &none + &none &none>; + }; - layer_2 { - bindings = < - &none &none - &kp B &none>; - }; - }; + layer_2 { + bindings = < + &none &none + &kp B &none>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap b/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap index c467aea3..4c8f7890 100644 --- a/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap +++ b/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap @@ -3,37 +3,37 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &none &mo 1 - &none &none>; - }; + default_layer { + bindings = < + &none &mo 1 + &none &none>; + }; - layer_1 { - bindings = < - &mo 2 &none - &none &none>; - }; + layer_1 { + bindings = < + &mo 2 &none + &none &none>; + }; - layer_2 { - bindings = < - &none &none - &kp B &none>; - }; - }; + layer_2 { + bindings = < + &none &none + &kp B &none>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/behavior_keymap.dtsi b/app/tests/momentary-layer/behavior_keymap.dtsi index 40bc31ec..63127a39 100644 --- a/app/tests/momentary-layer/behavior_keymap.dtsi +++ b/app/tests/momentary-layer/behavior_keymap.dtsi @@ -3,20 +3,20 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &mo 1 - &trans &trans>; - }; + default_layer { + bindings = < + &kp B &mo 1 + &trans &trans>; + }; - layer_1 { - bindings = < - &kp C_NEXT &trans - &trans &trans>; - }; - }; + layer_1 { + bindings = < + &kp C_NEXT &trans + &trans &trans>; + }; + }; }; diff --git a/app/tests/none/behavior_keymap.dtsi b/app/tests/none/behavior_keymap.dtsi index 40d863c1..7a4c099b 100644 --- a/app/tests/none/behavior_keymap.dtsi +++ b/app/tests/none/behavior_keymap.dtsi @@ -3,20 +3,20 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &none &mo 1 - &kp A &none>; - }; + default_layer { + bindings = < + &none &mo 1 + &kp A &none>; + }; - lower_layer { - bindings = < - &none &trans - &none &kp A>; - }; - }; + lower_layer { + bindings = < + &none &trans + &none &kp A>; + }; + }; }; diff --git a/app/tests/none/layered/native_posix_64.keymap b/app/tests/none/layered/native_posix_64.keymap index 597ca2db..b1e84c30 100644 --- a/app/tests/none/layered/native_posix_64.keymap +++ b/app/tests/none/layered/native_posix_64.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/none/normal/native_posix.keymap b/app/tests/none/normal/native_posix.keymap index cbeb61dc..502f7ccc 100644 --- a/app/tests/none/normal/native_posix.keymap +++ b/app/tests/none/normal/native_posix.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/none/normal/native_posix_64.keymap b/app/tests/none/normal/native_posix_64.keymap index cbeb61dc..502f7ccc 100644 --- a/app/tests/none/normal/native_posix_64.keymap +++ b/app/tests/none/normal/native_posix_64.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap b/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap index 230e9566..f9612928 100644 --- a/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,1200) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,1200) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap index 5c1c2264..bc541824 100644 --- a/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap @@ -3,38 +3,38 @@ #include &sk { - quick-release; + quick-release; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk LEFT_CONTROL &kp A - &sk LEFT_SHIFT &sk LEFT_ALT>; - }; - }; + default_layer { + bindings = < + &sk LEFT_CONTROL &kp A + &sk LEFT_SHIFT &sk LEFT_ALT>; + }; + }; }; &kscan { - events = < - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap sk LEFT_SHIFT */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* tap sk LEFT_ALT */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* tap A */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap A (no sticky keys anymore) */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap sk LEFT_SHIFT */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap sk LEFT_ALT */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* tap A */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap A (no sticky keys anymore) */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap b/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap index 79567de9..9121b188 100644 --- a/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap @@ -3,41 +3,41 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk E &sl 1 - &kp A &kp B>; - }; + default_layer { + bindings = < + &sk E &sl 1 + &kp A &kp B>; + }; - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &sk LEFT_SHIFT &kp Z>; - }; - }; + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &sk LEFT_SHIFT &kp Z>; + }; + }; }; &kscan { - events = < - /* press sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap sk LEFT_SHIFT */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* release sl lower_layer */ - ZMK_MOCK_RELEASE(0,1,10) - /* tap A (with left control and left shift enabled) */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* tap A (no sticky keys anymore) */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + /* press sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap sk LEFT_SHIFT */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* release sl lower_layer */ + ZMK_MOCK_RELEASE(0,1,10) + /* tap A (with left control and left shift enabled) */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap A (no sticky keys anymore) */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap index e89faa93..23ceeeb6 100644 --- a/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap @@ -8,58 +8,58 @@ */ / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sl 1 &kp A - &none &none>; - }; + default_layer { + bindings = < + &sl 1 &kp A + &none &none>; + }; - layer_1 { - bindings = < - &sl 2 &none - &none &none>; - }; + layer_1 { + bindings = < + &sl 2 &none + &none &none>; + }; - layer_2 { - bindings = < - &none &kp NUM_1 - &none &none>; - }; - }; + layer_2 { + bindings = < + &none &kp NUM_1 + &none &none>; + }; + }; }; &kscan { - events = < - /* press sl 1 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* press sl 2 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* press 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* press A */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + events = < + /* press sl 1 */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* press sl 2 */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* press 1 */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* press A */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) - /* repeat test to check if cleanup is done correctly */ - /* press sl 1 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* press sl 2 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* press 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* press A */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + /* repeat test to check if cleanup is done correctly */ + /* press sl 1 */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* press sl 2 */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* press 1 */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* press A */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap index f52a6bec..131e7069 100644 --- a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap @@ -4,23 +4,23 @@ #include "../behavior_keymap.dtsi" &sk { - quick-release; + quick-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - /* second key is pressed shortly after the first. It should not be capitalized. */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(1,1,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + /* second key is pressed shortly after the first. It should not be capitalized. */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,1,10) - /* repeat test to check if cleanup is done correctly */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + /* repeat test to check if cleanup is done correctly */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap index 63aca99b..4a0c50c8 100644 --- a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap @@ -4,16 +4,16 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* repeat test to check if cleanup is done correctly */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + /* repeat test to check if cleanup is done correctly */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap index 18d09ebc..39020751 100644 --- a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap @@ -8,45 +8,45 @@ */ / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk E &sl 1 - &kp A &kp B>; - }; + default_layer { + bindings = < + &sk E &sl 1 + &kp A &kp B>; + }; - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &kp Y &kp Z>; - }; - }; + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &kp Y &kp Z>; + }; + }; }; &kscan { - events = < - /* press sl 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* press X */ - ZMK_MOCK_PRESS(0,1,10) - /* press A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* press sl 1 */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* press X */ + ZMK_MOCK_PRESS(0,1,10) + /* press A */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) - /* repeat test to check if cleanup is done correctly */ - /* press sl 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* press X */ - ZMK_MOCK_PRESS(0,1,10) - /* press Y */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + /* repeat test to check if cleanup is done correctly */ + /* press sl 1 */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* press X */ + ZMK_MOCK_PRESS(0,1,10) + /* press Y */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap index 47600269..c635dade 100644 --- a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap index 2fb661a7..e629d270 100644 --- a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap index 92fd1e0a..2404a582 100644 --- a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,800) - ZMK_MOCK_PRESS(1,0,400) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,800) + ZMK_MOCK_PRESS(1,0,400) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap index 1daa6c4f..7cf04b7d 100644 --- a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,1100) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,1100) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap index 1be65a5b..a22d0a5a 100644 --- a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap +++ b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,0,100) - ZMK_MOCK_RELEASE(1,1,100) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,0,100) + ZMK_MOCK_RELEASE(1,1,100) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap index 6d88a9ea..4da4ad98 100644 --- a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap +++ b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap @@ -3,54 +3,54 @@ #include &sk { - quick-release; + quick-release; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk LEFT_SHIFT &sl 1 - &kp A &kp B>; - }; + default_layer { + bindings = < + &sk LEFT_SHIFT &sl 1 + &kp A &kp B>; + }; - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &kp Y &kp Z>; - }; - }; + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &kp Y &kp Z>; + }; + }; }; &kscan { - events = < - /* tap sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* tap B */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) + events = < + /* tap sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap A */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap B */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) - /* tap sk LEFT_SHIFT */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap Y */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* tap B */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + /* tap sk LEFT_SHIFT */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap Y */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap B */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; diff --git a/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap b/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap index a90bb32e..d9c49014 100644 --- a/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap +++ b/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap @@ -3,45 +3,45 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk E &sl 1 - &kp A &kp B>; - }; + default_layer { + bindings = < + &sk E &sl 1 + &kp A &kp B>; + }; - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &kp Y &kp Z>; - }; - }; + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &kp Y &kp Z>; + }; + }; }; &kscan { - events = < - /* tap sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* tap sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap A */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* repeat */ - /* tap sl */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap sk */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + /* repeat */ + /* tap sl */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap sk */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap A */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap index f811f7e9..74678256 100644 --- a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap @@ -3,25 +3,25 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk LEFT_SHIFT &none - &none &none - >; - }; - }; + default_layer { + bindings = < + &sk LEFT_SHIFT &none + &none &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* the sticky key is pressed again, so the previous one must be cancelled */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,1200) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* the sticky key is pressed again, so the previous one must be cancelled */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,1200) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/behavior_keymap.dtsi b/app/tests/sticky-keys/behavior_keymap.dtsi index f1277009..9322cb14 100644 --- a/app/tests/sticky-keys/behavior_keymap.dtsi +++ b/app/tests/sticky-keys/behavior_keymap.dtsi @@ -3,20 +3,20 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk E &mo 1 - &kp A &kp B>; - }; + default_layer { + bindings = < + &sk E &mo 1 + &kp A &kp B>; + }; - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &kp Y &kp Z>; - }; - }; + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &kp Y &kp Z>; + }; + }; }; diff --git a/app/tests/tap-dance/1a-tap1/native_posix_64.keymap b/app/tests/tap-dance/1a-tap1/native_posix_64.keymap index 1e5dff06..4e65cfa1 100644 --- a/app/tests/tap-dance/1a-tap1/native_posix_64.keymap +++ b/app/tests/tap-dance/1a-tap1/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,200) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,200) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/1b-tap2/native_posix_64.keymap b/app/tests/tap-dance/1b-tap2/native_posix_64.keymap index 5674c4ea..47fa8c33 100644 --- a/app/tests/tap-dance/1b-tap2/native_posix_64.keymap +++ b/app/tests/tap-dance/1b-tap2/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,200) - >; + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,200) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/1c-tap3/native_posix_64.keymap b/app/tests/tap-dance/1c-tap3/native_posix_64.keymap index 142b8236..6b01dfff 100644 --- a/app/tests/tap-dance/1c-tap3/native_posix_64.keymap +++ b/app/tests/tap-dance/1c-tap3/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,200) - >; + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,200) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2a-hold1/native_posix_64.keymap b/app/tests/tap-dance/2a-hold1/native_posix_64.keymap index bcfc21d2..c16f875b 100644 --- a/app/tests/tap-dance/2a-hold1/native_posix_64.keymap +++ b/app/tests/tap-dance/2a-hold1/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2b-hold2/native_posix_64.keymap b/app/tests/tap-dance/2b-hold2/native_posix_64.keymap index 6691437e..49948886 100644 --- a/app/tests/tap-dance/2b-hold2/native_posix_64.keymap +++ b/app/tests/tap-dance/2b-hold2/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2c-hold3/native_posix_64.keymap b/app/tests/tap-dance/2c-hold3/native_posix_64.keymap index 942ecfc0..7bedd650 100644 --- a/app/tests/tap-dance/2c-hold3/native_posix_64.keymap +++ b/app/tests/tap-dance/2c-hold3/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap b/app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap index 8a62430c..903b9a88 100644 --- a/app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap +++ b/app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(1,0,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap b/app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap index 4a76bdb0..7d10b715 100644 --- a/app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap +++ b/app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,1,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap b/app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap index e1b6d979..571a877f 100644 --- a/app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap +++ b/app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap b/app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap index 55a98d36..0220977a 100644 --- a/app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap +++ b/app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,400) + events = < + ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap b/app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap index b31e92dc..58595291 100644 --- a/app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap +++ b/app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,400) + events = < + ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap b/app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap index 6397fbb3..78770b13 100644 --- a/app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap +++ b/app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,400) + events = < + ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/4a-single/native_posix_64.keymap b/app/tests/tap-dance/4a-single/native_posix_64.keymap index 348a6827..d473a7d2 100644 --- a/app/tests/tap-dance/4a-single/native_posix_64.keymap +++ b/app/tests/tap-dance/4a-single/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap b/app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap index 2188fd02..79bdf2f7 100644 --- a/app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap +++ b/app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(1,0,200) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap b/app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap index 320b7199..012d932d 100644 --- a/app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap +++ b/app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,200) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap b/app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap index 17e538bd..fea96a56 100644 --- a/app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap +++ b/app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,200) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap b/app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap index 150f6d05..f98be05f 100644 --- a/app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap +++ b/app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,200) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap b/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap index 72b6744a..a8a82fd9 100644 --- a/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap +++ b/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap @@ -4,14 +4,14 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,200) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,200) + >; }; \ No newline at end of file diff --git a/app/tests/to-layer/behavior_keymap.dtsi b/app/tests/to-layer/behavior_keymap.dtsi index 81e7e809..663e897d 100644 --- a/app/tests/to-layer/behavior_keymap.dtsi +++ b/app/tests/to-layer/behavior_keymap.dtsi @@ -3,20 +3,20 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &to 0 &to 1 - &kp A &kp S>; - }; + default_layer { + bindings = < + &to 0 &to 1 + &kp A &kp S>; + }; - second_layer { - bindings = < - &to 0 &to 1 - &kp J &kp K>; - }; - }; + second_layer { + bindings = < + &to 0 &to 1 + &kp J &kp K>; + }; + }; }; diff --git a/app/tests/to-layer/normal/native_posix_64.keymap b/app/tests/to-layer/normal/native_posix_64.keymap index 056341f7..4cb23809 100644 --- a/app/tests/to-layer/normal/native_posix_64.keymap +++ b/app/tests/to-layer/normal/native_posix_64.keymap @@ -11,19 +11,19 @@ // To layer 0 -- does nothing &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/toggle-layer/behavior_keymap.dtsi b/app/tests/toggle-layer/behavior_keymap.dtsi index b9c0d4a4..1ecf8599 100644 --- a/app/tests/toggle-layer/behavior_keymap.dtsi +++ b/app/tests/toggle-layer/behavior_keymap.dtsi @@ -3,26 +3,26 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &tog 1 - &kp D &kp G>; - }; + default_layer { + bindings = < + &kp B &tog 1 + &kp D &kp G>; + }; - lower_layer { - bindings = < - &kp C_NEXT &trans - &kp L &kp J>; - }; + lower_layer { + bindings = < + &kp C_NEXT &trans + &kp L &kp J>; + }; - raise_layer { - bindings = < - &kp W &kp U - &kp X &kp M>; - }; - }; + raise_layer { + bindings = < + &kp W &kp U + &kp X &kp M>; + }; + }; }; diff --git a/app/tests/toggle-layer/early-key-release/native_posix_64.keymap b/app/tests/toggle-layer/early-key-release/native_posix_64.keymap index 6c293390..0a0c88ea 100644 --- a/app/tests/toggle-layer/early-key-release/native_posix_64.keymap +++ b/app/tests/toggle-layer/early-key-release/native_posix_64.keymap @@ -4,6 +4,6 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/toggle-layer/normal/native_posix_64.keymap b/app/tests/toggle-layer/normal/native_posix_64.keymap index 9df9d649..97bdd179 100644 --- a/app/tests/toggle-layer/normal/native_posix_64.keymap +++ b/app/tests/toggle-layer/normal/native_posix_64.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/transparent/behavior_keymap.dtsi b/app/tests/transparent/behavior_keymap.dtsi index 2a7e783a..dd5ded90 100644 --- a/app/tests/transparent/behavior_keymap.dtsi +++ b/app/tests/transparent/behavior_keymap.dtsi @@ -3,20 +3,20 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &trans &mo 1 - &kp A &none>; - }; + default_layer { + bindings = < + &trans &mo 1 + &kp A &none>; + }; - lower_layer { - bindings = < - &trans &trans - &trans &kp A>; - }; - }; + lower_layer { + bindings = < + &trans &trans + &trans &kp A>; + }; + }; }; diff --git a/app/tests/transparent/layered/native_posix_64.keymap b/app/tests/transparent/layered/native_posix_64.keymap index 597ca2db..b1e84c30 100644 --- a/app/tests/transparent/layered/native_posix_64.keymap +++ b/app/tests/transparent/layered/native_posix_64.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/transparent/normal/native_posix_64.keymap b/app/tests/transparent/normal/native_posix_64.keymap index cbeb61dc..502f7ccc 100644 --- a/app/tests/transparent/normal/native_posix_64.keymap +++ b/app/tests/transparent/normal/native_posix_64.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/wpm/1-single_keypress/native_posix_64.keymap b/app/tests/wpm/1-single_keypress/native_posix_64.keymap index 2aa52c16..2b113409 100644 --- a/app/tests/wpm/1-single_keypress/native_posix_64.keymap +++ b/app/tests/wpm/1-single_keypress/native_posix_64.keymap @@ -1,10 +1,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* Wait for the worker to trigger and reset after 5 seconds, followed by a 0 at 6 seconds */ - ZMK_MOCK_PRESS(0,0,6000) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* Wait for the worker to trigger and reset after 5 seconds, followed by a 0 at 6 seconds */ + ZMK_MOCK_PRESS(0,0,6000) + >; }; \ No newline at end of file diff --git a/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap b/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap index 3cfab946..869a5208 100644 --- a/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap +++ b/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap @@ -1,15 +1,15 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - //1st WPM worker call - 12wpm - 1 key press in 1 second - ZMK_MOCK_PRESS(0,0,1000) - ZMK_MOCK_RELEASE(0,0,10) - // 2nd WPM worker call - 12wpm - 2 key press in 2 second - // note there is no event for this as WPM hasn't changed - // 3rd WPM worker call - 8wpm - 2 key press in 3 seconds - ZMK_MOCK_PRESS(0,0,2000) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + //1st WPM worker call - 12wpm - 1 key press in 1 second + ZMK_MOCK_PRESS(0,0,1000) + ZMK_MOCK_RELEASE(0,0,10) + // 2nd WPM worker call - 12wpm - 2 key press in 2 second + // note there is no event for this as WPM hasn't changed + // 3rd WPM worker call - 8wpm - 2 key press in 3 seconds + ZMK_MOCK_PRESS(0,0,2000) + >; }; \ No newline at end of file diff --git a/app/tests/wpm/behavior_keymap.dtsi b/app/tests/wpm/behavior_keymap.dtsi index f0c5d0c2..52f9421c 100644 --- a/app/tests/wpm/behavior_keymap.dtsi +++ b/app/tests/wpm/behavior_keymap.dtsi @@ -3,15 +3,15 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &none - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp B &none + &none &none + >; + }; + }; }; diff --git a/docs/blog/2020-10-03-bootloader-fix.md b/docs/blog/2020-10-03-bootloader-fix.md index 8a9fd7f8..ec1d7b0b 100644 --- a/docs/blog/2020-10-03-bootloader-fix.md +++ b/docs/blog/2020-10-03-bootloader-fix.md @@ -175,19 +175,19 @@ do is shift back the settings area and code space `0xC000` bytes. We'll apply this to all of the `.dts` files for the boards that were affected by this issue. ```diff - code_partition: partition@26000 { - label = "code_partition"; -- reg = <0x00026000 0x000d2000>; -+ reg = <0x00026000 0x000c6000>; - }; + code_partition: partition@26000 { + label = "code_partition"; +- reg = <0x00026000 0x000d2000>; ++ reg = <0x00026000 0x000c6000>; + }; -- storage_partition: partition@f8000 { -+ storage_partition: partition@ec000 { - label = "storage"; -- reg = <0x000f8000 0x00008000>; -+ reg = <0x000ec000 0x00008000>; - }; +- storage_partition: partition@f8000 { ++ storage_partition: partition@ec000 { + label = "storage"; +- reg = <0x000f8000 0x00008000>; ++ reg = <0x000ec000 0x00008000>; + }; ``` And with those changes, we should no longer run into this issue! In the process diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index f267e4a4..f0096606 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -57,14 +57,14 @@ For example, the following hold-tap configuration enables `global-quick-tap` wit ``` gqt: global-quick-tap { - compatible = "zmk,behavior-hold-tap"; - label = "GLOBAL_QUICK_TAP"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <200>; - quick-tap-ms = <125>; - global-quick-tap; - bindings = <&kp>, <&kp>; + compatible = "zmk,behavior-hold-tap"; + label = "GLOBAL_QUICK_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + quick-tap-ms = <125>; + global-quick-tap; + bindings = <&kp>, <&kp>; }; ``` @@ -80,7 +80,7 @@ For example, if you press `&mt LEFT_SHIFT A` and then release it without pressin ``` &mt { - retro-tap; + retro-tap; }; ``` @@ -101,28 +101,28 @@ See the following example, which uses a hold-tap behavior definition, configured #include / { - behaviors { - pht: positional_hold_tap { - compatible = "zmk,behavior-hold-tap"; - label = "POSITIONAL_HOLD_TAP"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <400>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - hold-trigger-key-positions = <1>; // <---[[the W key]] - }; - }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - default_layer { - bindings = < - // position 0 position 1 position 2 - &pht LEFT_SHIFT Q &kp W &kp E - >; - }; - }; + behaviors { + pht: positional_hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "POSITIONAL_HOLD_TAP"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <400>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + hold-trigger-key-positions = <1>; // <---[[the W key]] + }; + }; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + default_layer { + bindings = < + // position 0 position 1 position 2 + &pht LEFT_SHIFT Q &kp W &kp E + >; + }; + }; }; ``` @@ -154,28 +154,28 @@ The following are suggested hold-tap configurations that work well with home row #include / { - behaviors { - lh_pht: left_hand_positional_hold_tap { - compatible = "zmk,behavior-hold-tap"; - label = "LEFT_POSITIONAL_HOLD_TAP"; - #binding-cells = <2>; - flavor = "tap-unless-interrupted"; - tapping-term-ms = <100>; // <---[[produces tap if held longer than tapping-term-ms]] - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - hold-trigger-key-positions = <5 6 7 8 9 10>; // <---[[right-hand keys]] - }; - }; + behaviors { + lh_pht: left_hand_positional_hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "LEFT_POSITIONAL_HOLD_TAP"; + #binding-cells = <2>; + flavor = "tap-unless-interrupted"; + tapping-term-ms = <100>; // <---[[produces tap if held longer than tapping-term-ms]] + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + hold-trigger-key-positions = <5 6 7 8 9 10>; // <---[[right-hand keys]] + }; + }; - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - // position 0 pos 1 pos 2 pos 3 pos 4 pos 5 pos 6 pos 7 pos 8 pos 9 pos 10 - &lh_pht LSFT A &lh_pht LGUI S &lh_pht LALT D &lh_pht LCTL F &kp G &kp H &kp I &kp J &kp K &kp L &kp SEMI - >; - }; - }; + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + // position 0 pos 1 pos 2 pos 3 pos 4 pos 5 pos 6 pos 7 pos 8 pos 9 pos 10 + &lh_pht LSFT A &lh_pht LGUI S &lh_pht LALT D &lh_pht LCTL F &kp G &kp H &kp I &kp J &kp K &kp L &kp SEMI + >; + }; + }; }; ``` @@ -186,26 +186,26 @@ The following are suggested hold-tap configurations that work well with home row #include / { - behaviors { - hm: homerow_mods { - compatible = "zmk,behavior-hold-tap"; - label = "HOMEROW_MODS"; - #binding-cells = <2>; - tapping-term-ms = <150>; - quick-tap-ms = <0>; - flavor = "tap-preferred"; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + hm: homerow_mods { + compatible = "zmk,behavior-hold-tap"; + label = "HOMEROW_MODS"; + #binding-cells = <2>; + tapping-term-ms = <150>; + quick-tap-ms = <0>; + flavor = "tap-preferred"; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - &hm LCTRL A &hm LGUI S &hm LALT D &hm LSHIFT F - >; - }; - }; + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + &hm LCTRL A &hm LGUI S &hm LALT D &hm LSHIFT F + >; + }; + }; }; ``` @@ -216,26 +216,26 @@ The following are suggested hold-tap configurations that work well with home row #include / { - behaviors { - bhm: balanced_homerow_mods { - compatible = "zmk,behavior-hold-tap"; - label = "HOMEROW_MODS"; - #binding-cells = <2>; - tapping-term-ms = <200>; // <---[[moderate duration]] - quick-tap-ms = <0>; - flavor = "balanced"; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + bhm: balanced_homerow_mods { + compatible = "zmk,behavior-hold-tap"; + label = "HOMEROW_MODS"; + #binding-cells = <2>; + tapping-term-ms = <200>; // <---[[moderate duration]] + quick-tap-ms = <0>; + flavor = "balanced"; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - &bhm LCTRL A &bhm LGUI S &bhm LALT D &bhm LSHIFT F - >; - }; - }; + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + &bhm LCTRL A &bhm LGUI S &bhm LALT D &bhm LSHIFT F + >; + }; + }; }; ``` @@ -264,14 +264,14 @@ A popular method of implementing Autoshift in ZMK involves a C-preprocessor macr }; }; - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - AS(Q) AS(W) AS(E) AS(R) AS(T) AS(Y) // Autoshift applied for QWERTY keys - >; - }; - }; + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + AS(Q) AS(W) AS(E) AS(R) AS(T) AS(Y) // Autoshift applied for QWERTY keys + >; + }; + }; }; ``` @@ -300,14 +300,14 @@ This hold-tap example implements a [momentary-layer](layers.md/#momentary-layer) }; keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - &mo_tog 2 1 // &mo 2 on hold, &tog 1 on tap - MO_TOG(3) // &mo 3 on hold, &tog 3 on tap - >; - }; - }; + compatible = "zmk,keymap"; + default_layer { + bindings = < + &mo_tog 2 1 // &mo 2 on hold, &tog 1 on tap + MO_TOG(3) // &mo 3 on hold, &tog 3 on tap + >; + }; + }; }; ``` diff --git a/docs/docs/behaviors/layers.md b/docs/docs/behaviors/layers.md index 0818aaae..cf793089 100644 --- a/docs/docs/behaviors/layers.md +++ b/docs/docs/behaviors/layers.md @@ -105,29 +105,29 @@ Example: #define NONE 0 / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < + default_layer { + bindings = < &tog NAVI &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS &kp NUMBER_7 &kp NUMBER_8 &kp NUMBER_9 &kp KP_PLUS &kp NUMBER_4 &kp NUMBER_5 &kp NUMBER_6 &kp KP_PLUS &kp NUMBER_1 &kp NUMBER_2 &kp NUMBER_3 &kp RETURN &kp NUMBER_0 &kp NUMBER_0 &kp DOT &kp RETURN - >; - }; + >; + }; - nav_layer { - bindings = < + nav_layer { + bindings = < &tog NAVI &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS &kp HOME &kp UP &kp PAGE_UP &kp KP_PLUS &kp LEFT &none &kp RIGHT &kp KP_PLUS &kp END &kp DOWN &kp PAGE_DOWN &kp RETURN &kp INSERT &kp INSERT &kp DEL &kp RETURN >; - }; - }; + }; + }; }; ``` diff --git a/docs/docs/behaviors/tap-dance.md b/docs/docs/behaviors/tap-dance.md index 65d5e765..c68b51dc 100644 --- a/docs/docs/behaviors/tap-dance.md +++ b/docs/docs/behaviors/tap-dance.md @@ -42,25 +42,25 @@ This example configures a tap-dance named `td0` that outputs the number of times #include / { - behaviors { - td0: tap_dance_0 { + behaviors { + td0: tap_dance_0 { compatible = "zmk,behavior-tap-dance"; label = "TAP_DANCE_0"; #binding-cells = <0>; tapping-term-ms = <200>; bindings = <&kp N1>, <&kp N2>, <&kp N3>; }; - }; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &td0 - >; - }; - }; + default_layer { + bindings = < + &td0 + >; + }; + }; }; ``` @@ -83,25 +83,25 @@ This example configures a mod-tap inside a tap-dance named `td_mt` that outputs #include / { - behaviors { - td_mt: tap_dance_mod_tap { + behaviors { + td_mt: tap_dance_mod_tap { compatible = "zmk,behavior-tap-dance"; label = "TAP_DANCE_MOD_TAP"; #binding-cells = <0>; tapping-term-ms = <200>; bindings = <&mt LSHIFT CAPSLOCK>, <&kp LCTRL>; }; - }; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &td_mt - >; - }; - }; + default_layer { + bindings = < + &td_mt + >; + }; + }; }; ``` diff --git a/docs/docs/config/index.md b/docs/docs/config/index.md index 51fd45b7..1ff1bfa0 100644 --- a/docs/docs/config/index.md +++ b/docs/docs/config/index.md @@ -116,14 +116,14 @@ Devicetree files look like this: ```devicetree / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - }; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + }; }; ``` @@ -167,9 +167,9 @@ If the node you want to edit doesn't have a label, you can also write a new tree ```devicetree / { - kscan { - debounce-press-ms = <0>; - }; + kscan { + debounce-press-ms = <0>; + }; }; ``` @@ -244,7 +244,7 @@ Example: some-gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>, <&gpio0 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + ; ``` #### path diff --git a/docs/docs/development/new-behavior.md b/docs/docs/development/new-behavior.md index 6d026f2b..0d70aa3b 100644 --- a/docs/docs/development/new-behavior.md +++ b/docs/docs/development/new-behavior.md @@ -367,15 +367,15 @@ For the purpose of this section, we will discuss the structure of `app/dts/behav #include / { - behaviors { - /omit-if-no-ref/ gresc: grave_escape { - compatible = "zmk,behavior-mod-morph"; - label = "GRAVE_ESCAPE"; - #binding-cells = <0>; - bindings = <&kp ESC>, <&kp GRAVE>; + behaviors { + /omit-if-no-ref/ gresc: grave_escape { + compatible = "zmk,behavior-mod-morph"; + label = "GRAVE_ESCAPE"; + #binding-cells = <0>; + bindings = <&kp ESC>, <&kp GRAVE>; mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; - }; - }; + }; + }; }; ``` diff --git a/docs/docs/development/new-shield.md b/docs/docs/development/new-shield.md index 62d71f03..18616923 100644 --- a/docs/docs/development/new-shield.md +++ b/docs/docs/development/new-shield.md @@ -55,7 +55,7 @@ The `Kconfig.shield` file defines any additional Kconfig settings that may be re ``` config SHIELD_MY_BOARD - def_bool $(shields_list_contains,my_board) + def_bool $(shields_list_contains,my_board) ``` This will make sure that a new configuration value named `SHIELD_MY_BOARD` is set to true whenever `my_board` is used as the shield name, either as the `SHIELD` variable [in a local build](build-flash.md) or in your `build.yaml` file [when using Github Actions](../customization). Note that this configuration value will be used in `Kconfig.defconfig` to set other properties about your shield, so make sure that they match. @@ -64,10 +64,10 @@ This will make sure that a new configuration value named `SHIELD_MY_BOARD` is se ``` config SHIELD_MY_BOARD_LEFT - def_bool $(shields_list_contains,my_board_left) + def_bool $(shields_list_contains,my_board_left) config SHIELD_MY_BOARD_RIGHT - def_bool $(shields_list_contains,my_board_right) + def_bool $(shields_list_contains,my_board_right) ``` ### Kconfig.defconfig @@ -87,7 +87,7 @@ The keyboard name must be less than or equal to 16 characters in length, otherwi if SHIELD_MY_BOARD config ZMK_KEYBOARD_NAME - default "My Board" + default "My Board" endif ``` @@ -101,17 +101,17 @@ Finally, you'll want to turn on the split option for both sides. This can all be if SHIELD_MY_BOARD_LEFT config ZMK_KEYBOARD_NAME - default "My Board" + default "My Board" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_MY_BOARD_LEFT || SHIELD_MY_BOARD_RIGHT config ZMK_SPLIT - default y + default y endif ``` @@ -134,13 +134,13 @@ this might look something like: ``` / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; diode-direction = "col2row"; col-gpios @@ -149,12 +149,12 @@ this might look something like: , <&pro_micro 16 GPIO_ACTIVE_HIGH> ; - row-gpios - = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + row-gpios + = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + ; + }; }; ``` @@ -174,43 +174,43 @@ For `col2row` directed boards like the iris, the shared .dtsi file may look like #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; // | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | // | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | // | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | // | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | // | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,2) RC(4,9) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) - >; - }; + RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row A from the schematic file - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row B from the schematic file - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row C from the schematic file - , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row D from the schematic file - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row E from the schematic file - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row A from the schematic file + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row B from the schematic file + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row C from the schematic file + , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row D from the schematic file + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row E from the schematic file + ; - }; + }; }; ``` @@ -230,14 +230,14 @@ This is exemplified with the iris .overlay files. #include "iris.dtsi" // Notice that the main dtsi files are included in the overlay. &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> // col1 in the schematic - , <&pro_micro 18 GPIO_ACTIVE_HIGH> // col2 in the schematic - , <&pro_micro 15 GPIO_ACTIVE_HIGH> // col3 in the schematic - , <&pro_micro 14 GPIO_ACTIVE_HIGH> // col4 in the schematic - , <&pro_micro 16 GPIO_ACTIVE_HIGH> // col5 in the schematic - , <&pro_micro 10 GPIO_ACTIVE_HIGH> // col6 in the schematic - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> // col1 in the schematic + , <&pro_micro 18 GPIO_ACTIVE_HIGH> // col2 in the schematic + , <&pro_micro 15 GPIO_ACTIVE_HIGH> // col3 in the schematic + , <&pro_micro 14 GPIO_ACTIVE_HIGH> // col4 in the schematic + , <&pro_micro 16 GPIO_ACTIVE_HIGH> // col5 in the schematic + , <&pro_micro 10 GPIO_ACTIVE_HIGH> // col6 in the schematic + ; }; ``` @@ -247,18 +247,18 @@ This is exemplified with the iris .overlay files. #include "iris.dtsi" &default_transform { // The matrix transform for this board is 6 columns over because the left half is 6 columns wide according to the matrix. - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> // col6 in the schematic - , <&pro_micro 16 GPIO_ACTIVE_HIGH> // col5 in the schematic - , <&pro_micro 14 GPIO_ACTIVE_HIGH> // col4 in the schematic - , <&pro_micro 15 GPIO_ACTIVE_HIGH> // col3 in the schematic - , <&pro_micro 18 GPIO_ACTIVE_HIGH> // col2 in the schematic - , <&pro_micro 19 GPIO_ACTIVE_HIGH> // col1 in the schematic - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> // col6 in the schematic + , <&pro_micro 16 GPIO_ACTIVE_HIGH> // col5 in the schematic + , <&pro_micro 14 GPIO_ACTIVE_HIGH> // col4 in the schematic + , <&pro_micro 15 GPIO_ACTIVE_HIGH> // col3 in the schematic + , <&pro_micro 18 GPIO_ACTIVE_HIGH> // col2 in the schematic + , <&pro_micro 19 GPIO_ACTIVE_HIGH> // col1 in the schematic + ; }; ``` @@ -316,28 +316,28 @@ Here is an example for the [nice60](https://github.com/Nicell/nice60), which use #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <8>; - rows = <8>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <8>; + rows = <8>; // | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | MX13 | MX14 | // | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | MX21 | MX22 | MX23 | MX34 | MX25 | MX26 | MX27 | MX28 | // | MX29 | MX30 | MX31 | MX32 | MX33 | MX34 | MX35 | MX36 | MX37 | MX38 | MX39 | MX40 | MX41 | // | MX42 | MX43 | MX44 | MX45 | MX46 | MX47 | MX48 | MX49 | MX50 | MX51 | MX52 | MX53 | // | MX54 | MX55 | MX56 | MX57 | MX58 | MX59 | MX60 | MX61 | - map = < + map = < RC(3,0) RC(2,0) RC(1,0) RC(0,0) RC(1,1) RC(0,1) RC(0,2) RC(1,3) RC(0,3) RC(1,4) RC(0,4) RC(0,5) RC(1,6) RC(1,7) RC(4,0) RC(4,1) RC(3,1) RC(2,1) RC(2,2) RC(1,2) RC(2,3) RC(3,4) RC(2,4) RC(2,5) RC(1,5) RC(2,6) RC(2,7) RC(3,7) RC(5,0) RC(5,1) RC(5,2) RC(4,2) RC(3,2) RC(4,3) RC(3,3) RC(4,4) RC(4,5) RC(3,5) RC(4,6) RC(3,6) RC(4,7) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(5,3) RC(6,4) RC(5,4) RC(6,5) RC(5,5) RC(6,6) RC(5,6) RC(5,7) RC(7,0) RC(7,1) RC(7,2) RC(7,3) RC(7,5) RC(7,6) RC(6,7) RC(7,7) - >; - }; + >; + }; ``` Some important things to note: @@ -433,13 +433,13 @@ In your device tree file you will need to add the following lines to define the ``` left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = ; - b-gpios = ; - resolution = <4>; - status = "disabled"; - }; + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = ; + b-gpios = ; + resolution = <4>; + status = "disabled"; + }; ``` Here you will have to replace PIN_A and PIN_B with the appropriate pins that your PCB utilizes for the encoder(s). For keyboards that use the Pro Micro or any of the Pro Micro replacements, Sparkfun's [Pro Micro Hookup Guide](https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide/hardware-overview-pro-micro) has a pinout diagram that can be useful to determine the right pins. Reference either the blue numbers labeled "Arduino" (digital pins) or the green numbers labeled "Analog" (analog pins). For pins that are labeled as both digital and analog, refer to your specific board's .dtsi file to determine how you should refer to that pin. @@ -450,9 +450,9 @@ Once you have defined the encoder sensors, you will have to add them to the list ``` sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; ``` In this example, a left_encoder and right_encoder are both added. Additional encoders can be added with spaces separating each, and the order they are added here determines the order in which you define their behavior in your keymap. @@ -463,7 +463,7 @@ Add the following lines to your overlay file(s) to enable the encoder: ``` &left_encoder { - status = "okay"; + status = "okay"; }; ``` diff --git a/docs/docs/features/backlight.md b/docs/docs/features/backlight.md index 03d206f1..717361a2 100644 --- a/docs/docs/features/backlight.md +++ b/docs/docs/features/backlight.md @@ -62,9 +62,9 @@ Then you have to add the following lines to your `.dts` file: ``` &pwm0 { - status = "okay"; - ch0-pin = <45>; - /* ch0-inverted; */ + status = "okay"; + ch0-pin = <45>; + /* ch0-inverted; */ }; ``` @@ -84,7 +84,7 @@ Then you have to add the following lines inside the root devicetree node on the label = "Backlight LEDs"; pwm_led_0 { pwms = <&pwm0 45>; - label = "Backlight LED 0"; + label = "Backlight LED 0"; }; }; }; @@ -129,9 +129,9 @@ Then add the following lines to your `.overlay` file: ``` &pwm0 { - status = "okay"; - ch0-pin = <45>; - /* ch0-inverted; */ + status = "okay"; + ch0-pin = <45>; + /* ch0-inverted; */ }; ``` @@ -151,7 +151,7 @@ Then you have to add the following lines inside the root devicetree node on the label = "Backlight LEDs"; pwm_led_0 { pwms = <&pwm0 45>; - label = "Backlight LED 0"; + label = "Backlight LED 0"; }; }; }; @@ -182,7 +182,7 @@ Optionally, on Pro Micro compatible shields you can add a LED GPIO node to your label = "Backlight LEDs"; gpio_led_0 { gpios = <&pro_micro 20 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 0"; + label = "Backlight LED 0"; }; }; }; @@ -201,10 +201,10 @@ In order to do that, first you need to enable PWM for each pin: ``` &pwm0 { - status = "okay"; - ch0-pin = <45>; /* LED 0 */ - ch1-pin = <46>; /* LED 1 */ - ch2-pin = <47>; /* LED 2 */ + status = "okay"; + ch0-pin = <45>; /* LED 0 */ + ch1-pin = <46>; /* LED 1 */ + ch2-pin = <47>; /* LED 2 */ ... }; ``` diff --git a/docs/docs/features/combos.md b/docs/docs/features/combos.md index 09191896..44313cc1 100644 --- a/docs/docs/features/combos.md +++ b/docs/docs/features/combos.md @@ -12,14 +12,14 @@ Combos configured in your `.keymap` file, but are separate from the `keymap` nod ``` / { - combos { - compatible = "zmk,combos"; - combo_esc { - timeout-ms = <50>; - key-positions = <0 1>; - bindings = <&kp ESC>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_esc { + timeout-ms = <50>; + key-positions = <0 1>; + bindings = <&kp ESC>; + }; + }; }; ``` diff --git a/docs/docs/features/keymaps.md b/docs/docs/features/keymaps.md index 6d4e5f2c..93c2c825 100644 --- a/docs/docs/features/keymaps.md +++ b/docs/docs/features/keymaps.md @@ -113,10 +113,10 @@ Nested under the devicetree root, is the keymap node. The node _name_ itself is ``` keymap { - compatible = "zmk,keymap"; + compatible = "zmk,keymap"; // Layer nodes go here! - }; + }; ``` ### Layers diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index c1dc68d3..00d3aa0a 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -60,18 +60,18 @@ Here's an example on a definition that uses P0.06: #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { @@ -149,9 +149,9 @@ Once you have your `led_strip` properly defined you need to add it to the root d ``` / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; ``` diff --git a/docs/docs/keymap-example-file.md b/docs/docs/keymap-example-file.md index cb20cb6d..d8d201af 100644 --- a/docs/docs/keymap-example-file.md +++ b/docs/docs/keymap-example-file.md @@ -3,24 +3,24 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | CTRL+A | CTRL+C | | CTRL+V | CTRL+X | N | M | , | . | / | R CTRL | // | GUI | DEL | RETURN | SPACE | ESCAPE | | RETURN | SPACE | TAB | BSPC | R ALT | - bindings = < + bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHIFT &kp Z &kp X &kp C &kp V &kp B &kp LC(A) &kp LC(C) &kp LC(V) &kp LC(X) &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; }; ``` diff --git a/docs/docs/keymap-example.md b/docs/docs/keymap-example.md index 9d751f59..47d1c06b 100644 --- a/docs/docs/keymap-example.md +++ b/docs/docs/keymap-example.md @@ -1,21 +1,21 @@ ``` - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | CTRL+A | CTRL+C | | CTRL+V | CTRL+X | N | M | , | . | / | R CTRL | // | GUI | DEL | RETURN | SPACE | ESCAPE | | RETURN | SPACE | TAB | BSPC | R ALT | - bindings = < + bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHIFT &kp Z &kp X &kp C &kp V &kp B &kp LC(A) &kp LC(C) &kp LC(V) &kp LC(X) &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; ``` From 5b07c86d05a81a82d4fd72ad29d3daa846a2b458 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 00:00:12 -0500 Subject: [PATCH 210/289] chore: Update Prettier Added a workaround to select the latest version of Prettier with pre-commit, since the pre-commit mirror repo started tracking alpha releases and doesn't have anything beyond 2.7.1. --- .pre-commit-config.yaml | 3 +++ app/package-lock.json | 14 +++++++------- app/package.json | 2 +- docs/package-lock.json | 14 +++++++------- docs/package.json | 2 +- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1375a6ae..e0666ea8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,6 +15,9 @@ repos: rev: v2.7.1 hooks: - id: prettier + # Workaround for https://github.com/pre-commit/mirrors-prettier/issues/29 + additional_dependencies: + - prettier@2.8.7 - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: diff --git a/app/package-lock.json b/app/package-lock.json index ed8765f3..060fcba0 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -9,13 +9,13 @@ "version": "1.0.0", "license": "MIT", "devDependencies": { - "prettier": "^2.7.1" + "prettier": "^2.8.7" } }, "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -30,9 +30,9 @@ }, "dependencies": { "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true } } diff --git a/app/package.json b/app/package.json index 9ad28788..e1a7957f 100644 --- a/app/package.json +++ b/app/package.json @@ -18,6 +18,6 @@ }, "homepage": "https://zmk.dev/", "devDependencies": { - "prettier": "^2.7.1" + "prettier": "^2.8.7" } } diff --git a/docs/package-lock.json b/docs/package-lock.json index c7333cb3..2c8a7fba 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -39,7 +39,7 @@ "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", - "prettier": "^2.7.1", + "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", "typescript": "^4.6.3", "webpack": "^5.72.1" @@ -12201,9 +12201,9 @@ } }, "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -24678,9 +24678,9 @@ "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" }, "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true }, "pretty-error": { diff --git a/docs/package.json b/docs/package.json index 95d47b9f..70105b54 100644 --- a/docs/package.json +++ b/docs/package.json @@ -58,7 +58,7 @@ "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", - "prettier": "^2.7.1", + "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", "typescript": "^4.6.3", "webpack": "^5.72.1" From 7a352908eebdc84aca905a83a22e27748154ad0d Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 11:37:42 -0500 Subject: [PATCH 211/289] docs: Add pre-commit documentation --- docs/docs/development/pre-commit.md | 37 +++++++++++++++++++++++++++++ docs/sidebars.js | 1 + 2 files changed, 38 insertions(+) create mode 100644 docs/docs/development/pre-commit.md diff --git a/docs/docs/development/pre-commit.md b/docs/docs/development/pre-commit.md new file mode 100644 index 00000000..b4306fc9 --- /dev/null +++ b/docs/docs/development/pre-commit.md @@ -0,0 +1,37 @@ +--- +title: Pre-commit +--- + +ZMK uses [pre-commit](https://pre-commit.com/) to check for common errors and make sure the codebase is formatted consistently. + +Pre-commit is run on every pull request. You can also install it locally to get the same checks run on every commit you make _before_ you submit a pull request. + +## Installing pre-commit + +Open a terminal and run: + +```bash +pip3 install pre-commit +``` + +If this doesn't work, make sure [Python](https://www.python.org/) is installed and try again. + +## Enabling Commit Hooks + +Now that pre-commit is installed on your PC, you need to install it into the ZMK repo to enable it. Open a terminal to the ZMK repo directory and run: + +```bash +pre-commit install +``` + +This should print a message such as + +``` +pre-commit installed at .git\hooks\pre-commit +``` + +Pre-commit will now automatically check your changes whenever you run `git commit`. If it detects a problem, it will describe the problem and cancel the commit. For simple problems such as incorrect formatting, it will also automatically fix the files so you can just `git add` them and try again. + +## Automatically Enabling pre-commit + +Pre-commit can be configured to automatically install itself into any newly cloned repository, so you don't have to remember to run `pre-commit install`. See the [pre-commit documentation](https://pre-commit.com/#automatically-enabling-pre-commit-on-repositories) for instructions. diff --git a/docs/sidebars.js b/docs/sidebars.js index 21585747..43f17b41 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -71,6 +71,7 @@ module.exports = { ], Development: [ "development/clean-room", + "development/pre-commit", "development/documentation", "development/setup", "development/build-flash", From de152fe7419b8a02ca8a1723c3487dba69da3969 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 20 Apr 2023 23:51:40 -0700 Subject: [PATCH 212/289] fix(bluetooth): Revert to Legacy LLCP * Reports of constant/frequent disconnects, with HCI err 0x28, "instant passed", seem linked to newer LLCP that became default in Zephyr 3.2, so revert to the Legacy LLCP for now until a proper fix for new LLCP can be found. --- app/Kconfig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/Kconfig b/app/Kconfig index 25a99b55..32b708e8 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -120,6 +120,11 @@ menuconfig ZMK_BLE if ZMK_BLE +choice BT_LL_SW_LLCP_IMPL + default BT_LL_SW_LLCP_LEGACY + +endchoice + config SYSTEM_WORKQUEUE_STACK_SIZE default 4096 if SOC_RP2040 default 2048 From e52e734480816d269ecedb5bac6a3703577e6c02 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 25 Apr 2023 05:51:04 +0000 Subject: [PATCH 213/289] chore: Fix formatting of Kconfig setting. --- app/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 32b708e8..d1b6682f 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -121,7 +121,7 @@ menuconfig ZMK_BLE if ZMK_BLE choice BT_LL_SW_LLCP_IMPL - default BT_LL_SW_LLCP_LEGACY + default BT_LL_SW_LLCP_LEGACY endchoice From db08e041c64d1a2b232bca9f728c02cde3907860 Mon Sep 17 00:00:00 2001 From: ReFil <31960031+ReFil@users.noreply.github.com> Date: Tue, 25 Apr 2023 18:37:33 +0100 Subject: [PATCH 214/289] feat(boards): Polarity works CKP Series Adds support for the CKP family of boards BT60V2 ANSIHotswap, ISO Hotswap, ANSI Lowpro and soldered BT65 ANSI Hotswap, ISO Hotswap and soldered BT75 ANSI Hotswap and soldered The BT65 and BT75 are stylised as btXX_v1 in order to maintain compatibility with customers existing zmk-config setups in the same way the BT60 V1 was handled when merged into main. CKP boards have identical pinmapping between hotswap and soldered so there's only one set of defconfig, dts, keymap, yaml and yml files per size --- app/boards/arm/ckp/Kconfig | 8 + app/boards/arm/ckp/Kconfig.board | 16 ++ app/boards/arm/ckp/Kconfig.defconfig | 34 +++++ app/boards/arm/ckp/board.cmake | 4 + app/boards/arm/ckp/bt60_v2.dts | 71 +++++++++ app/boards/arm/ckp/bt60_v2.keymap | 177 ++++++++++++++++++++++ app/boards/arm/ckp/bt60_v2.yaml | 15 ++ app/boards/arm/ckp/bt60_v2.zmk.yml | 14 ++ app/boards/arm/ckp/bt60_v2_defconfig | 38 +++++ app/boards/arm/ckp/bt65_v1.dts | 71 +++++++++ app/boards/arm/ckp/bt65_v1.keymap | 177 ++++++++++++++++++++++ app/boards/arm/ckp/bt65_v1.yaml | 15 ++ app/boards/arm/ckp/bt65_v1.zmk.yml | 14 ++ app/boards/arm/ckp/bt65_v1_defconfig | 38 +++++ app/boards/arm/ckp/bt75_v1.dts | 61 ++++++++ app/boards/arm/ckp/bt75_v1.keymap | 148 ++++++++++++++++++ app/boards/arm/ckp/bt75_v1.yaml | 15 ++ app/boards/arm/ckp/bt75_v1.zmk.yml | 14 ++ app/boards/arm/ckp/bt75_v1_defconfig | 38 +++++ app/boards/arm/ckp/ckp-pinctrl.dtsi | 31 ++++ app/boards/arm/ckp/ckp.dtsi | 217 +++++++++++++++++++++++++++ 21 files changed, 1216 insertions(+) create mode 100644 app/boards/arm/ckp/Kconfig create mode 100644 app/boards/arm/ckp/Kconfig.board create mode 100644 app/boards/arm/ckp/Kconfig.defconfig create mode 100644 app/boards/arm/ckp/board.cmake create mode 100644 app/boards/arm/ckp/bt60_v2.dts create mode 100644 app/boards/arm/ckp/bt60_v2.keymap create mode 100644 app/boards/arm/ckp/bt60_v2.yaml create mode 100644 app/boards/arm/ckp/bt60_v2.zmk.yml create mode 100644 app/boards/arm/ckp/bt60_v2_defconfig create mode 100644 app/boards/arm/ckp/bt65_v1.dts create mode 100644 app/boards/arm/ckp/bt65_v1.keymap create mode 100644 app/boards/arm/ckp/bt65_v1.yaml create mode 100644 app/boards/arm/ckp/bt65_v1.zmk.yml create mode 100644 app/boards/arm/ckp/bt65_v1_defconfig create mode 100644 app/boards/arm/ckp/bt75_v1.dts create mode 100644 app/boards/arm/ckp/bt75_v1.keymap create mode 100644 app/boards/arm/ckp/bt75_v1.yaml create mode 100644 app/boards/arm/ckp/bt75_v1.zmk.yml create mode 100644 app/boards/arm/ckp/bt75_v1_defconfig create mode 100644 app/boards/arm/ckp/ckp-pinctrl.dtsi create mode 100644 app/boards/arm/ckp/ckp.dtsi diff --git a/app/boards/arm/ckp/Kconfig b/app/boards/arm/ckp/Kconfig new file mode 100644 index 00000000..7baf1486 --- /dev/null +++ b/app/boards/arm/ckp/Kconfig @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on BOARD_BT60_V2 || BOARD_BT65_V1 || BOARD_BT75_V1 diff --git a/app/boards/arm/ckp/Kconfig.board b/app/boards/arm/ckp/Kconfig.board new file mode 100644 index 00000000..a98a3167 --- /dev/null +++ b/app/boards/arm/ckp/Kconfig.board @@ -0,0 +1,16 @@ +# CKP boards configuration + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_BT60_V2 + bool "bt60_v2" + depends on SOC_NRF52840_QIAA + +config BOARD_BT65_V1 + bool "bt65_v1" + depends on SOC_NRF52840_QIAA + +config BOARD_BT75_V1 + bool "bt75_v1" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/ckp/Kconfig.defconfig b/app/boards/arm/ckp/Kconfig.defconfig new file mode 100644 index 00000000..d5bf4ded --- /dev/null +++ b/app/boards/arm/ckp/Kconfig.defconfig @@ -0,0 +1,34 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD + default "bt60_v2" if BOARD_BT60_V2 + default "bt65_v1" if BOARD_BT65_V1 + default "bt75_v1" if BOARD_BT75_V1 +config ZMK_KEYBOARD_NAME + default "BT60 V2" if BOARD_BT60_V2 + default "BT65" if BOARD_BT65_V1 + default "BT75" if BOARD_BT75_V1 + +if BOARD_BT60_V2 || BOARD_BT65_V1 || BOARD_BT75_V1 + +if USB + +config USB_NRFX + default y + +config USB_DEVICE_STACK + default y + +endif # USB + +config BT_CTLR + default BT + +config ZMK_BLE + default y + +config ZMK_USB + default y + +endif # BOARD_BT60_V2 || BOARD_BT65_V1 || BOARD_BT75_V1 diff --git a/app/boards/arm/ckp/board.cmake b/app/boards/arm/ckp/board.cmake new file mode 100644 index 00000000..b7feee2e --- /dev/null +++ b/app/boards/arm/ckp/board.cmake @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: MIT + +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/arm/ckp/bt60_v2.dts b/app/boards/arm/ckp/bt60_v2.dts new file mode 100644 index 00000000..19f92287 --- /dev/null +++ b/app/boards/arm/ckp/bt60_v2.dts @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2022 The ZMK Contributors +* +* SPDX-License-Identifier: MIT +*/ + +/dts-v1/; +#include "ckp.dtsi" + + +/ { + model = "BT60_V2"; + compatible = "polarityworks,bt60_v2"; + + chosen { + zmk,matrix_transform = &ansi_transform; + }; + + + ansi_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) + RC(4,0) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) + >; + }; + + iso_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) + >; + }; + + all_1u_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) + >; + }; + + hhkb_transform: keymap_transform_3 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) + RC(4,0) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,11) RC(5,12) RC(5,13) + >; + }; +}; diff --git a/app/boards/arm/ckp/bt60_v2.keymap b/app/boards/arm/ckp/bt60_v2.keymap new file mode 100644 index 00000000..eeb5c96e --- /dev/null +++ b/app/boards/arm/ckp/bt60_v2.keymap @@ -0,0 +1,177 @@ +#include +#include +#include +#include +#include + +#define ANSI +//#define ISO +//#define ALL_1U +//#define HHKB + +/ { + chosen { + #ifdef ANSI + zmk,matrix_transform = &ansi_transform; + #elif defined(ISO) + zmk,matrix_transform = &iso_transform; + #elif defined(ALL_1U) + zmk,matrix_transform = &all_1u_transform; + #elif defined(HHKB) + zmk,matrix_transform = &hhkb_transform; + #else + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60_v2.keymap" + #endif + }; + + keymap { + compatible = "zmk,keymap"; + #ifdef ANSI + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // ------------------------------------------------------------------------------------------ + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | + // | TAB | Q | UP | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | RGB_TOG| + // | CAPS | LEFT| DOWN|RIGHT| BRI | BRD | H | J | K | L | HOME| PGUP| BOOT | + // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | END | PGDN | BL_TOG | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | RESET | BT_CLR | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &trans &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &rgb_ug RGB_TOG + &trans &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &kp END &kp PG_DN &bl BL_TOG + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &sys_reset &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ISO) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | + // | SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT + &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET + &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // ------------------------------------------------------------------------------------------ + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | + // | TAB | Q | UP | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | | + // | CAPS | LEFT| DOWN|RIGHT| BRI | BRD | H | J | K | L | HOME| PGUP|RGB_TOG| BOOT | + // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| B | N | M | , | END | PGDN | BL_TOG | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | RESET |BT_CLR | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &trans &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK + &trans &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &rgb_ug RGB_TOG &bootloader + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &kp END &kp PG_DN &bl BL_TOG + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &sys_reset &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ALL_1U) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHFT |NONE| Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 | + // | CTL | WIN | ALT | SPACE | RALT| CTRL | LEFT | DOWN | RIGHT | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &none &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &mo 1 + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // ------------------------------------------------------------------------------------------ + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |BKSP | DEL | + // | TAB | Q | W | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | RGB_TOG | + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | HOME| PGUP| BOOT | + // | SHFT |NONE|VOLDN|VOLUP|MUTE|BLINC|BLDEC| N | M | , | END | PGDN | SHFT|BL_TOG| 1 | + // | BT_PRV| BT_NXT| ALT | SPACE | RALT| CTRL | LEFT |RESET| BT_CLR | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &rgb_ug RGB_TOG + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &trans &none &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &kp END &kp PG_DN &trans &bl BL_TOG &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &sys_reset &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(HHKB) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // ------------------------------------------------------------------------------------------ + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | + // | TAB | Q | UP | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | RGB_TOG| + // | CAPS | LEFT| DOWN|RIGHT| BRI | BRD | H | J | K | L | HOME| PGUP| BOOT | + // | SHFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | END | PGDN | BL_TOG | + // | BT_PRV | BT_NXT | ALT | SPACE | RESET | 1 | BT_CLR | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &trans &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &rgb_ug RGB_TOG + &trans &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &kp END &kp PG_DN &bl BL_TOG + &bt BT_PRV &bt BT_NXT &trans &trans &sys_reset &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #else + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60_v2.keymap" + #endif + + }; +}; diff --git a/app/boards/arm/ckp/bt60_v2.yaml b/app/boards/arm/ckp/bt60_v2.yaml new file mode 100644 index 00000000..2a3f3b47 --- /dev/null +++ b/app/boards/arm/ckp/bt60_v2.yaml @@ -0,0 +1,15 @@ +identifier: bt60_v2 +name: BT60 V2 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/ckp/bt60_v2.zmk.yml b/app/boards/arm/ckp/bt60_v2.zmk.yml new file mode 100644 index 00000000..faf64205 --- /dev/null +++ b/app/boards/arm/ckp/bt60_v2.zmk.yml @@ -0,0 +1,14 @@ +file_format: "1" +id: bt60_v2 +name: BT60 V2 +type: board +arch: arm +features: + - keys + - encoder + - underglow + - backlight +outputs: + - usb + - ble +url: https://polarityworks.com/btckp diff --git a/app/boards/arm/ckp/bt60_v2_defconfig b/app/boards/arm/ckp/bt60_v2_defconfig new file mode 100644 index 00000000..f6dc7e09 --- /dev/null +++ b/app/boards/arm/ckp/bt60_v2_defconfig @@ -0,0 +1,38 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_BT60_V2=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y +CONFIG_PINCTRL=y + +# encoder +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_PWM=y +CONFIG_LED_PWM=y +CONFIG_ZMK_BACKLIGHT=y +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=y +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=262 +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y + +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y diff --git a/app/boards/arm/ckp/bt65_v1.dts b/app/boards/arm/ckp/bt65_v1.dts new file mode 100644 index 00000000..97d80da2 --- /dev/null +++ b/app/boards/arm/ckp/bt65_v1.dts @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2022 The ZMK Contributors +* +* SPDX-License-Identifier: MIT +*/ + +/dts-v1/; +#include "ckp.dtsi" + + +/ { + model = "BT65_V1"; + compatible = "polarityworks,bt65_v1"; + + chosen { + zmk,matrix_transform = &ansi_transform; + }; + + + ansi_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,15) + RC(4,0) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; + + iso_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,15) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; + + all_1u_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,15) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; + + hhkb_transform: keymap_transform_3 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,15) + RC(4,0) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,11) RC(5,12) RC(5,13) RC(5,15) + >; + }; +}; diff --git a/app/boards/arm/ckp/bt65_v1.keymap b/app/boards/arm/ckp/bt65_v1.keymap new file mode 100644 index 00000000..27411a71 --- /dev/null +++ b/app/boards/arm/ckp/bt65_v1.keymap @@ -0,0 +1,177 @@ +#include +#include +#include +#include +#include + +#define ANSI +//#define ISO +//#define ALL_1U +//#define HHKB + +/ { + chosen { + #ifdef ANSI + zmk,matrix_transform = &ansi_transform; + #elif defined(ISO) + zmk,matrix_transform = &iso_transform; + #elif defined(ALL_1U) + zmk,matrix_transform = &all_1u_transform; + #elif defined(HHKB) + zmk,matrix_transform = &hhkb_transform; + #else + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt65_v1.keymap" + #endif + }; + + keymap { + compatible = "zmk,keymap"; + #ifdef ANSI + default_layer { + // ------------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | INS | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp INS + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | BL_TOG |RGB_TOG| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | RESET | PSCRN| + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' | BOOT | P_BRK| + // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / | SHIFT | HOME | END | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL | LEFT | DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bl BL_TOG &rgb_ug RGB_TOG + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &sys_reset &kp PSCRN + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &bootloader &kp PAUSE_BREAK + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &kp HOME &kp END + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ISO) + default_layer { + // ------------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | INS | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | PGUP| + // |SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp INS + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET &kp PG_UP + &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | BL_TOG |RGB_TOG| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | | PSCRN| + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' |RESET| BOOT | P_BRK| + // |SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| B | N | M | , | . | / | SHIFT | HOME | END | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL | LEFT | DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bl BL_TOG &rgb_ug RGB_TOG + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &kp PSCRN + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &kp PAUSE_BREAK + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &trans &kp HOME &kp END + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ALL_1U) + default_layer { + // ------------------------------------------------------------------------------------------------- + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL | HOME| + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | END | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| + // |SHIFT|NONE | Z | X | C | V | B | N | M | , | . | / |SHIFT|NONE | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------- + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL &kp HOME + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp END + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP + &kp LSHFT &none &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &none &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp LALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |BL_TOG|RGB_TOG|HOME| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | RESET | PSCRN| + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' | BOOT | P_BRK| + // |SHIFT| NONE|VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / |SHIFT| NONE| UP | INS | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL| LEFT| DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bl BL_TOG &rgb_ug RGB_TOG &trans + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &sys_reset &kp PSCRN + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &bootloader &kp PAUSE_BREAK + &trans &none &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &trans &trans &kp INS + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(HHKB) + default_layer { + // ------------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | HOME| + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | END | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | PGUP| + // | CTL | WIN | ALT | SPACE | ALT | 1 | CTRL | PGDN| + // ------------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp HOME + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp END + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp PG_UP + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL &kp PG_DN + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | BL_TOG |RGB_TOG| + // | TAB | Q | UP | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | RESET | PSCRN| + // | CAPS | LEFT| DOWN|RIGHT| BRI | BRD | H | J | K | L | ; | ' | BOOT | P_BRK| + // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / | SHIFT | INS | + // | BT_PRV | BT_NXT | ALT | SPACE | ALT | 1 | CTRL |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bl BL_TOG &rgb_ug RGB_TOG + &trans &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &sys_reset &kp PSCRN + &trans &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &bootloader &kp PAUSE_BREAK + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &kp INS + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #else + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt65_v1.keymap" + #endif + + }; +}; diff --git a/app/boards/arm/ckp/bt65_v1.yaml b/app/boards/arm/ckp/bt65_v1.yaml new file mode 100644 index 00000000..61edacce --- /dev/null +++ b/app/boards/arm/ckp/bt65_v1.yaml @@ -0,0 +1,15 @@ +identifier: bt65_v1 +name: BT65_V1 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/ckp/bt65_v1.zmk.yml b/app/boards/arm/ckp/bt65_v1.zmk.yml new file mode 100644 index 00000000..f82253b0 --- /dev/null +++ b/app/boards/arm/ckp/bt65_v1.zmk.yml @@ -0,0 +1,14 @@ +file_format: "1" +id: bt65_v1 +name: BT65 +type: board +arch: arm +features: + - keys + - encoder + - underglow + - backlight +outputs: + - usb + - ble +url: https://polarityworks.com/btckp diff --git a/app/boards/arm/ckp/bt65_v1_defconfig b/app/boards/arm/ckp/bt65_v1_defconfig new file mode 100644 index 00000000..e40ae2db --- /dev/null +++ b/app/boards/arm/ckp/bt65_v1_defconfig @@ -0,0 +1,38 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_BT65_V1=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y +CONFIG_PINCTRL=y + +# encoder +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_PWM=y +CONFIG_LED_PWM=y +CONFIG_ZMK_BACKLIGHT=y +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=y +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=262 +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y + +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y diff --git a/app/boards/arm/ckp/bt75_v1.dts b/app/boards/arm/ckp/bt75_v1.dts new file mode 100644 index 00000000..42aaf351 --- /dev/null +++ b/app/boards/arm/ckp/bt75_v1.dts @@ -0,0 +1,61 @@ +/* +* Copyright (c) 2022 The ZMK Contributors +* +* SPDX-License-Identifier: MIT +*/ + +/dts-v1/; +#include "ckp.dtsi" + + +/ { + model = "BT75_V1"; + compatible = "polarityworks,bt75_v1"; + + chosen { + zmk,matrix_transform = &ansi_transform; + }; + + + ansi_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <6>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,15) + RC(4,0) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; + + iso_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <6>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,15) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; + + all_1u_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <6>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,15) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; +}; diff --git a/app/boards/arm/ckp/bt75_v1.keymap b/app/boards/arm/ckp/bt75_v1.keymap new file mode 100644 index 00000000..5c95387a --- /dev/null +++ b/app/boards/arm/ckp/bt75_v1.keymap @@ -0,0 +1,148 @@ +#include +#include +#include +#include +#include + +#define ANSI +//#define ISO +//#define ALL_1U + +/ { + chosen { + #ifdef ANSI + zmk,matrix_transform = &ansi_transform; + #elif defined(ISO) + zmk,matrix_transform = &iso_transform; + #elif defined(ALL_1U) + zmk,matrix_transform = &all_1u_transform; + #else + #error "Layout not defined, please define a layout using by uncommenting the appropriate line in bt75_v1.keymap" + #endif + }; + + keymap { + compatible = "zmk,keymap"; + #ifdef ANSI + default_layer { + // ------------------------------------------------------------------------------------------------ + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN|HOME| END | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | INS | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PSCRN &kp HOME &kp END + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp INS + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN| HOME| END | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BL_TOG |RGB_TOG| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | RESET | P_BRK| + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' | BOOT | PG_UP| + // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / | SHIFT | UP | PG_DN| + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL | LEFT | DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &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 &bl BL_TOG &rgb_ug RGB_TOG + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &sys_reset &kp PAUSE_BREAK + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &bootloader &trans + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &trans &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ISO) + default_layer { + // ------------------------------------------------------------------------------------------------ + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN|HOME| END | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | INS | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | PGUP| + // |SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PSCRN &kp HOME &kp END + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp INS + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET &kp PG_UP + &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN|HOME| END | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BL_TOG |RGB_TOG| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | | P_BRK| + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' |RESET| BOOT | PG_UP| + // |SHIFT | \ |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / | SHIFT | UP | PG_DN| + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL | LEFT | DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &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 &bl BL_TOG &rgb_ug RGB_TOG + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &kp PAUSE_BREAK + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &trans + &trans &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &trans &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ALL_1U) + default_layer { + // ------------------------------------------------------------------------------------------------- + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN| P_B | INS | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL | HOME| + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | END | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| + // |SHIFT|NONE | Z | X | C | V | B | N | M | , | . | / |SHIFT|NONE | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------- + bindings = < + &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PSCRN &kp PAUSE_BREAK &kp INS + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL &kp HOME + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp END + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP + &kp LSHFT &none &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &none &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp LALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN| P_B | INS | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BL_TOG|RGB_TOG|HOME| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | RESET | END | + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' | BOOT | PGUP | + // |SHIFT| NONE|VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / |SHIFT| NONE| UP | PGDN | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL| LEFT| DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &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 &bl BL_TOG &rgb_ug RGB_TOG &trans + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &sys_reset &trans + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &bootloader &trans + &trans &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &trans &trans &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #else + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt75.keymap" + #endif + + }; +}; diff --git a/app/boards/arm/ckp/bt75_v1.yaml b/app/boards/arm/ckp/bt75_v1.yaml new file mode 100644 index 00000000..e4faa09f --- /dev/null +++ b/app/boards/arm/ckp/bt75_v1.yaml @@ -0,0 +1,15 @@ +identifier: bt75_v1 +name: BT75_V1 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/ckp/bt75_v1.zmk.yml b/app/boards/arm/ckp/bt75_v1.zmk.yml new file mode 100644 index 00000000..76e30047 --- /dev/null +++ b/app/boards/arm/ckp/bt75_v1.zmk.yml @@ -0,0 +1,14 @@ +file_format: "1" +id: bt75_v1 +name: BT75_V1 +type: board +arch: arm +features: + - keys + - encoder + - underglow + - backlight +outputs: + - usb + - ble +url: https://polarityworks.com/btckp diff --git a/app/boards/arm/ckp/bt75_v1_defconfig b/app/boards/arm/ckp/bt75_v1_defconfig new file mode 100644 index 00000000..510d6994 --- /dev/null +++ b/app/boards/arm/ckp/bt75_v1_defconfig @@ -0,0 +1,38 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_BT75_V1=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y +CONFIG_PINCTRL=y + +# encoder +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_PWM=y +CONFIG_LED_PWM=y +CONFIG_ZMK_BACKLIGHT=y +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=y +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=262 +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y + +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y diff --git a/app/boards/arm/ckp/ckp-pinctrl.dtsi b/app/boards/arm/ckp/ckp-pinctrl.dtsi new file mode 100644 index 00000000..87a8edc5 --- /dev/null +++ b/app/boards/arm/ckp/ckp-pinctrl.dtsi @@ -0,0 +1,31 @@ + +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; + pwm0_default: pwm0_default { + group1 { + psels = ; + }; + }; + pwm0_sleep: pwm0_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/ckp/ckp.dtsi b/app/boards/arm/ckp/ckp.dtsi new file mode 100644 index 00000000..6c52d620 --- /dev/null +++ b/app/boards/arm/ckp/ckp.dtsi @@ -0,0 +1,217 @@ +/* +* Copyright (c) 2022 The ZMK Contributors +* +* SPDX-License-Identifier: MIT +*/ + +/dts-v1/; +#include + +#include +#include + +#include "ckp-pinctrl.dtsi" + +/ { + model = "CKP"; + compatible = "polarityworks,ckp"; + + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zmk,kscan = &kscan0; + zmk,underglow = &led_strip; + zmk,backlight = &backlight; + zmk,battery = &vbatt; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder_1>; + }; + + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; + + col-gpios + = <&gpio1 11 GPIO_ACTIVE_HIGH> + , <&gpio1 10 GPIO_ACTIVE_HIGH> + , <&gpio1 13 GPIO_ACTIVE_HIGH> + , <&gpio1 15 GPIO_ACTIVE_HIGH> + , <&gpio0 3 GPIO_ACTIVE_HIGH> + , <&gpio0 2 GPIO_ACTIVE_HIGH> + , <&gpio0 28 GPIO_ACTIVE_HIGH> + , <&gpio0 29 GPIO_ACTIVE_HIGH> + , <&gpio0 30 GPIO_ACTIVE_HIGH> + , <&gpio0 31 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio1 6 GPIO_ACTIVE_HIGH> + ; + + row-gpios + = <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; + }; + + encoder_1: encoder_1 { + compatible = "alps,ec11"; + label = "ENCODER_ONE"; + a-gpios = <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; + + encoder_2: encoder_2 { + compatible = "alps,ec11"; + label = "ENCODER_TWO"; + a-gpios = <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; + + encoder_3: encoder_3 { + compatible = "alps,ec11"; + label = "encoder_3"; + a-gpios = <&gpio0 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpio0 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; + + backlight: pwmleds { + compatible = "pwm-leds"; + label = "Backlight LEDs"; + pwm_led_0 { + pwms = <&pwm0 0 10000 PWM_POLARITY_NORMAL>; + }; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "VBATT"; + io-channels = <&adc 2>; + output-ohms = <100000>; + full-ohms = <(100000 + 100000)>; + }; +}; + +&adc { + status = "okay"; +}; + +&pwm0 { + status = "okay"; + pinctrl-0 = <&pwm0_default>; + pinctrl-1 = <&pwm0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&usbd { + status = "okay"; +}; + + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; + + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; + + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <12>; /* number of LEDs */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; From 9bd171ede44c6178068d1b3970474783fddc799f Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Mon, 24 Apr 2023 12:16:09 -0500 Subject: [PATCH 215/289] fix(docs): Add key to interconnect tabs Added a key property to interconnect tabs list items to fix a React warning. --- docs/src/components/interconnect-tabs.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/components/interconnect-tabs.tsx b/docs/src/components/interconnect-tabs.tsx index c7912793..3ef69ebf 100644 --- a/docs/src/components/interconnect-tabs.tsx +++ b/docs/src/components/interconnect-tabs.tsx @@ -15,7 +15,7 @@ function mapInterconnect(interconnect: Interconnect) { let imageUrl = require(`@site/docs/assets/interconnects/${interconnect.id}/pinout.png`); return ( - + From a6787b08c762c8bbb5966464e944a09b50595774 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 8 Apr 2023 20:21:40 +0000 Subject: [PATCH 216/289] refactor(underglow): Tad more logging. --- app/src/rgb_underglow.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 048b58b4..7b649174 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -190,7 +190,10 @@ static void zmk_rgb_underglow_tick(struct k_work *work) { break; } - led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); + int err = led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); + if (err < 0) { + LOG_ERR("Failed to update the RGB strip (%d)", err); + } } K_WORK_DEFINE(underglow_work, zmk_rgb_underglow_tick); From ab65ffc11406cd693172d48d790ec5a43a9fc040 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 4 Nov 2022 15:50:41 -0700 Subject: [PATCH 217/289] refactor(boards): Fix Zen v2 DTS spacing inconsistencies --- app/boards/arm/corneish_zen/CMakeLists.txt | 4 +- app/boards/arm/corneish_zen/corneish_zen.dtsi | 5 +- .../arm/corneish_zen/corneish_zen.keymap | 71 ++++++++++--------- .../arm/corneish_zen/corneish_zen_v2_left.dts | 2 +- .../corneish_zen/corneish_zen_v2_right.dts | 13 ++-- 5 files changed, 47 insertions(+), 48 deletions(-) diff --git a/app/boards/arm/corneish_zen/CMakeLists.txt b/app/boards/arm/corneish_zen/CMakeLists.txt index 09820577..aedf38a7 100644 --- a/app/boards/arm/corneish_zen/CMakeLists.txt +++ b/app/boards/arm/corneish_zen/CMakeLists.txt @@ -4,7 +4,7 @@ if(CONFIG_ZMK_DISPLAY) target_sources_ifdef(CONFIG_CUSTOM_WIDGET_LAYER_STATUS app PRIVATE widgets/layer_status.c) target_sources_ifdef(CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS app PRIVATE widgets/peripheral_status.c) - add_subdirectory_ifdef(CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM widgets/icons) + add_subdirectory_ifdef(CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM widgets/icons) endif() zephyr_library() @@ -57,4 +57,4 @@ zephyr_library_include_directories(${ZEPHYR_BASE}/lib/gui/lvgl/) zephyr_library_sources_ifdef(CONFIG_ZMK_DISPLAY custom_status_screen.c) zephyr_library_sources(${ZEPHYR_BASE}/misc/empty_file.c) zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) -zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) \ No newline at end of file +zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) diff --git a/app/boards/arm/corneish_zen/corneish_zen.dtsi b/app/boards/arm/corneish_zen/corneish_zen.dtsi index 10be54cc..fe2bfa92 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.dtsi +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -50,7 +50,7 @@ // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) @@ -60,7 +60,6 @@ }; - &adc { status = "okay"; }; @@ -123,4 +122,4 @@ reg = <0x000f4000 0x0000c000>; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen.keymap b/app/boards/arm/corneish_zen/corneish_zen.keymap index 2b9eeb14..24c925e8 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.keymap +++ b/app/boards/arm/corneish_zen/corneish_zen.keymap @@ -10,58 +10,59 @@ #include / { - chosen { - zmk,matrix_transform = &default_transform; - //zmk,matrix_transform = &five_column_transform; - }; + chosen { + zmk,matrix_transform = &default_transform; + // zmk,matrix_transform = &five_column_transform; + }; }; / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - label = "QWERTY"; -// ----------------------------------------------------------------------------------------- + default_layer { + label = "QWERTY"; +// -------------------------------------------------------------------------------- // | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC | // | GUI | LWR | SPC | | ENT | RSE | ALT | - bindings = < - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC - &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp ESC - &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT - >; - }; - lower_layer { - label = "NUMBER"; + bindings = < +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC +&kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp ESC + &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT + >; + }; + + lower_layer { + label = "NUMBER"; // ----------------------------------------------------------------------------------------- // | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSP | // | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | // | SHFT | | | | | | | | | | | | | // | GUI | | SPC | | ENT | | ALT | - bindings = < - &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC - &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans - &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT - >; - }; + bindings = < +&kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans +&kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + >; + }; - raise_layer { - label = "SYMBOL"; + raise_layer { + label = "SYMBOL"; // ----------------------------------------------------------------------------------------- // | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BKSP | // | CTRL | | | | | | | - | = | [ | ] | \ | ` | // | SHFT | | | | | | | _ | + | { | } | "|" | ~ | // | GUI | | SPC | | ENT | | ALT | - bindings = < - &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC - &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE - &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT - >; - }; + bindings = < +&kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC +&kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE +&kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + >; }; -}; \ No newline at end of file + }; +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index 9f3dd73a..d7b66ab7 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -72,7 +72,7 @@ }; }; -&spi0 { +&spi0 { status = "okay"; compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts index 3cb7556f..4d444cae 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts @@ -33,16 +33,15 @@ , <&gpio1 9 GPIO_ACTIVE_HIGH> , <&gpio0 7 GPIO_ACTIVE_HIGH> ; - }; leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; + }; vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; @@ -56,6 +55,7 @@ &default_transform { col-offset = <6>; }; + &five_column_transform { col-offset = <6>; }; @@ -98,7 +98,6 @@ busy-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>; reset-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; pwr = [03 00 26 26]; - //softstart = [17 17 17 17]; cdi = <0xd2>; tcon = <0x22>; }; From 2c70048beeec6da864836f4981a6a8f954be95af Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 6 Nov 2022 14:19:27 -0800 Subject: [PATCH 218/289] refactor(boards): Remove duplicated Zen v2 Kconfigs and unused font size --- app/boards/arm/corneish_zen/Kconfig.defconfig | 1 - app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig | 4 ---- app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig | 4 ---- 3 files changed, 9 deletions(-) diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig index a161230c..28177f53 100644 --- a/app/boards/arm/corneish_zen/Kconfig.defconfig +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -44,7 +44,6 @@ endif # USB config ZMK_DISPLAY select LV_USE_CONT select LV_FONT_MONTSERRAT_26 - select LV_FONT_MONTSERRAT_20 select LV_FONT_MONTSERRAT_16 select LV_USE_LABEL select LV_USE_IMG diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig index 305ce72e..3b7b4d9e 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -6,7 +6,6 @@ CONFIG_SOC_SERIES_NRF52X=y CONFIG_SOC_NRF52840_QIAA=y CONFIG_BOARD_CORNEISH_ZEN_V2_LEFT=y -CONFIG_ZMK_SPLIT=y CONFIG_ZMK_SLEEP=y CONFIG_ZMK_DISPLAY=y @@ -20,7 +19,6 @@ CONFIG_PINCTRL=y CONFIG_GPIO=y # Enable SPI -CONFIG_SPI=y CONFIG_SPI_NRFX=y # Enable writing to flash @@ -40,8 +38,6 @@ CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y # enable display drivers CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 -CONFIG_SSD1306=n -CONFIG_IL0323=y CONFIG_LV_Z_BITS_PER_PIXEL=1 CONFIG_LV_COLOR_DEPTH_1=y CONFIG_LV_DPI_DEF=145 diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig index 0fd0fd6c..b361b08d 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -6,7 +6,6 @@ CONFIG_SOC_SERIES_NRF52X=y CONFIG_SOC_NRF52840_QIAA=y CONFIG_BOARD_CORNEISH_ZEN_V2_RIGHT=y -CONFIG_ZMK_SPLIT=y CONFIG_ZMK_SLEEP=y CONFIG_ZMK_DISPLAY=y @@ -20,7 +19,6 @@ CONFIG_PINCTRL=y CONFIG_GPIO=y # Enable SPI -CONFIG_SPI=y CONFIG_SPI_NRFX=y # Enable writing to flash @@ -40,8 +38,6 @@ CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y # enable display drivers CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 -CONFIG_SSD1306=n -CONFIG_IL0323=y CONFIG_LV_Z_BITS_PER_PIXEL=1 CONFIG_LV_COLOR_DEPTH_1=y CONFIG_LV_DPI_DEF=145 From 4a9c59317f33a1c29bce2f2d34eb3e653e43eb10 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 13 Nov 2022 21:47:13 -0800 Subject: [PATCH 219/289] refactor(boards): Add back default matrix transform to Zen v2 chosen node --- app/boards/arm/corneish_zen/corneish_zen.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/app/boards/arm/corneish_zen/corneish_zen.dtsi b/app/boards/arm/corneish_zen/corneish_zen.dtsi index fe2bfa92..daf58b31 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.dtsi +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -22,6 +22,7 @@ zmk,display = &epd; zmk,battery = &vbatt; zephyr,console = &cdc_acm_uart; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { From 39d7f86f7019b861fc6e84084a8ffd88ff63b064 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 16 Dec 2022 17:48:39 -0800 Subject: [PATCH 220/289] refactor(boards): Make Zen dtsi non-v2 specific --- app/boards/arm/corneish_zen/corneish_zen.dtsi | 5 ++--- app/boards/arm/corneish_zen/corneish_zen_v2_left.dts | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/boards/arm/corneish_zen/corneish_zen.dtsi b/app/boards/arm/corneish_zen/corneish_zen.dtsi index daf58b31..289c5e73 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.dtsi +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -11,8 +11,8 @@ #include / { - model = "corneish_zen_v2"; - compatible = "corneish_zen_v2"; + model = "Corne-ish Zen"; + compatible = "corneish_zen"; chosen { zephyr,code-partition = &code_partition; @@ -20,7 +20,6 @@ zephyr,flash = &flash0; zmk,kscan = &kscan0; zmk,display = &epd; - zmk,battery = &vbatt; zephyr,console = &cdc_acm_uart; zmk,matrix_transform = &default_transform; }; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index d7b66ab7..14d82e87 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -20,7 +20,7 @@ diode-direction = "col2row"; row-gpios = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; From 0239f18b6180bc604b432f3b48a0d29961dc0111 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 16 Dec 2022 17:39:24 -0800 Subject: [PATCH 221/289] feat(boards): Add Corne-ish Zen v1 --- app/boards/arm/corneish_zen/CMakeLists.txt | 2 +- app/boards/arm/corneish_zen/Kconfig | 10 ++ app/boards/arm/corneish_zen/Kconfig.board | 14 +- app/boards/arm/corneish_zen/Kconfig.defconfig | 15 +- .../arm/corneish_zen/corneish_zen_v1.zmk.yml | 15 ++ .../arm/corneish_zen/corneish_zen_v1_left.dts | 123 ++++++++++++++++ .../corneish_zen_v1_left_defconfig | 76 ++++++++++ .../corneish_zen/corneish_zen_v1_right.dts | 131 ++++++++++++++++++ .../corneish_zen_v1_right_defconfig | 75 ++++++++++ 9 files changed, 455 insertions(+), 6 deletions(-) create mode 100644 app/boards/arm/corneish_zen/Kconfig create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v1_left.dts create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v1_right.dts create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig diff --git a/app/boards/arm/corneish_zen/CMakeLists.txt b/app/boards/arm/corneish_zen/CMakeLists.txt index aedf38a7..afaaf6bf 100644 --- a/app/boards/arm/corneish_zen/CMakeLists.txt +++ b/app/boards/arm/corneish_zen/CMakeLists.txt @@ -47,7 +47,7 @@ if(CONFIG_ZMK_DISPLAY) zephyr_library_sources(widgets/icons/layers.c) zephyr_library_sources(widgets/icons/layers2.c) endif() - if(CONFIG_BOARD_CORNEISH_ZEN_V2_RIGHT) + if(NOT CONFIG_ZMK_SPLIT_ROLE_CENTRAL) zephyr_library_sources(widgets/icons/zenlogo.c) endif() endif() diff --git a/app/boards/arm/corneish_zen/Kconfig b/app/boards/arm/corneish_zen/Kconfig new file mode 100644 index 00000000..33d92609 --- /dev/null +++ b/app/boards/arm/corneish_zen/Kconfig @@ -0,0 +1,10 @@ +# +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT +# + +config BOARD_CORNEISH_ZEN_LEFT + bool + +config BOARD_CORNEISH_ZEN_RIGHT + bool diff --git a/app/boards/arm/corneish_zen/Kconfig.board b/app/boards/arm/corneish_zen/Kconfig.board index ca82e330..ffb3ab1f 100644 --- a/app/boards/arm/corneish_zen/Kconfig.board +++ b/app/boards/arm/corneish_zen/Kconfig.board @@ -3,10 +3,22 @@ # SPDX-License-Identifier: MIT # +config BOARD_CORNEISH_ZEN_V1_LEFT + bool "corneish zen left v1" + depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_LEFT + +config BOARD_CORNEISH_ZEN_V1_RIGHT + bool "corneish zen right v1" + depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_RIGHT + config BOARD_CORNEISH_ZEN_V2_LEFT bool "corneish zen left v2" depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_LEFT config BOARD_CORNEISH_ZEN_V2_RIGHT bool "corneish zen right v2" - depends on SOC_NRF52840_QIAA \ No newline at end of file + depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_RIGHT diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig index 28177f53..feab3eca 100644 --- a/app/boards/arm/corneish_zen/Kconfig.defconfig +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -3,7 +3,7 @@ # SPDX-License-Identifier: MIT # -if BOARD_CORNEISH_ZEN_V2_LEFT +if BOARD_CORNEISH_ZEN_LEFT config ZMK_KEYBOARD_NAME default "Corne-ish Zen" @@ -11,10 +11,10 @@ config ZMK_KEYBOARD_NAME config ZMK_SPLIT_ROLE_CENTRAL default y -endif # BOARD_CORNEISH_ZEN_V2_LEFT +endif # BOARD_CORNEISH_ZEN_LEFT -if BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT +if BOARD_CORNEISH_ZEN_LEFT || BOARD_CORNEISH_ZEN_RIGHT config BOARD default "corneish_zen" @@ -77,4 +77,11 @@ menuconfig CUSTOM_WIDGET_LAYER_STATUS menuconfig CUSTOM_WIDGET_PERIPHERAL_STATUS bool "custom peripheral status widget" -endif # BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT +endif # BOARD_CORNEISH_ZEN_LEFT || BOARD_CORNEISH_ZEN_RIGHT + +if BOARD_CORNEISH_ZEN_V1_LEFT || BOARD_CORNEISH_ZEN_V1_RIGHT + +config BQ274XX + default y + +endif # BOARD_CORNEISH_ZEN_V1_LEFT || BOARD_CORNEISH_ZEN_V1_RIGHT diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml b/app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml new file mode 100644 index 00000000..1f6be20d --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: corneish_zen_v1 +name: Corneish Zen v1 +url: https://lowprokb.ca/collections/keyboards/products/corne-ish-zen +type: board +arch: arm +features: + - keys + - display +outputs: + - usb + - ble +siblings: + - corneish_zen_v1_left + - corneish_zen_v1_right diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v1_left.dts new file mode 100644 index 00000000..399a564f --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_left.dts @@ -0,0 +1,123 @@ +/* +* +* Copyright (c) 2021 Darryl deHaan +* SPDX-License-Identifier: MIT +* +*/ + +#include "corneish_zen.dtsi" + +/{ + chosen { + zephyr,display = &epd; + zmk,battery = &fuelgauge; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + col-gpios + = <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + ; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; +}; + +&pinctrl { + spi2_default: spi2_default { + group1 { + psels = , + , + ; + }; + }; + + spi2_sleep: spi2_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; + +&i2c0 { + status = "okay"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; + clock-frequency = <100000>; + + fuelgauge: bq274xx@55 { + compatible = "ti,bq274xx"; + label = "BATTERY"; + reg = <0x55>; + design-voltage = <3700>; //Battery Design Volatge in mV + design-capacity = <180>; //Battery Design Capacity in mAh + taper-current = <2>; //Battery Taper current in mAh + terminate-voltage = <2750>; //Battery Terminate Voltage in mV + int-gpios = <&gpio1 14 GPIO_ACTIVE_LOW>; + }; +}; + +&spi2 { + status = "okay"; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi2_default>; + pinctrl-1 = <&spi2_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>; + + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 24 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + cdi = <0xd2>; + tcon = <0x22>; + }; +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig new file mode 100644 index 00000000..a71ac680 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig @@ -0,0 +1,76 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_CORNEISH_ZEN_V1_LEFT=y +CONFIG_ZMK_SLEEP=y +CONFIG_ZMK_DISPLAY=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable pinctrl +CONFIG_PINCTRL=y + +# enable GPIO +CONFIG_GPIO=y + +# Enable I2C +CONFIG_I2C=y +CONFIG_I2C_NRFX=y + +# Enable SPI +CONFIG_SPI_NRFX=y + +# Enable writing to flash +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y +CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y + +# enable display drivers +CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y +CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 +CONFIG_LV_Z_BITS_PER_PIXEL=1 +CONFIG_LV_COLOR_DEPTH_1=y +CONFIG_LV_DPI_DEF=145 +CONFIG_LV_Z_VDB_SIZE=100 +CONFIG_LV_USE_THEME_MONO=y +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y +CONFIG_LV_FONT_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y + +# custom status screens +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN=n +CONFIG_CUSTOM_WIDGET_BATTERY_STATUS=y +CONFIG_ZMK_WIDGET_BATTERY_STATUS=n +CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS=y +CONFIG_ZMK_WIDGET_OUTPUT_STATUS=n +CONFIG_CUSTOM_WIDGET_LAYER_STATUS=y +CONFIG_ZMK_WIDGET_LAYER_STATUS=n + +# Turn on logging, and set ZMK logging to debug output +#CONFIG_LOG=y +#CONFIG_ZMK_USB_LOGGING=y +#CONFIG_ZMK_LOG_LEVEL_DBG=y +#CONFIG_LOG_BUFFER_SIZE=65536 +#CONFIG_LOG_STRDUP_BUF_COUNT=160 +#CONFIG_I2C_LOG_LEVEL_DBG=y +#CONFIG_SPI_LOG_LEVEL_DBG=y +#CONFIG_DISPLAY_LOG_LEVEL_DBG=y +#CONFIG_LVGL_LOG_LEVEL_DBG=y +#CONFIG_LVGL_USE_DEBUG=y +#CONFIG_SENSOR_LOG_LEVEL_DBG=y diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v1_right.dts new file mode 100644 index 00000000..d5f6e588 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_right.dts @@ -0,0 +1,131 @@ +/* +* +* Copyright (c) 2021 Darryl deHaan +* SPDX-License-Identifier: MIT +* +*/ + +#include "corneish_zen.dtsi" + +/{ + chosen { + zephyr,display = &epd; + zmk,battery = &fuelgauge; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + col-gpios + = <&gpio0 19 GPIO_ACTIVE_HIGH> + , <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + ; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; +}; + +&default_transform { + col-offset = <6>; +}; + +&five_column_transform { + col-offset = <6>; +}; + +&pinctrl { + spi2_default: spi2_default { + group1 { + psels = , + , + ; + }; + }; + + spi2_sleep: spi2_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; + +&i2c0 { + status = "okay"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; + clock-frequency = <100000>; + + fuelgauge: bq274xx@55 { + compatible = "ti,bq274xx"; + label = "BATTERY"; + reg = <0x55>; + design-voltage = <3700>; //Battery Design Volatge in mV + design-capacity = <180>; //Battery Design Capacity in mAh + taper-current = <2>; //Battery Taper current in mAh 2.1 + terminate-voltage = <2750>; //Battery Terminate Voltage in mV + int-gpios = <&gpio1 5 GPIO_ACTIVE_LOW>; + }; +}; + +&spi2 { + status = "okay"; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi2_default>; + pinctrl-1 = <&spi2_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; + + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + cdi = <0xd2>; + tcon = <0x22>; + }; +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig new file mode 100644 index 00000000..f099392f --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig @@ -0,0 +1,75 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_CORNEISH_ZEN_V1_RIGHT=y +CONFIG_ZMK_SLEEP=y +CONFIG_ZMK_DISPLAY=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable pinctrl +CONFIG_PINCTRL=y + +# enable GPIO +CONFIG_GPIO=y + +# Enable I2C +CONFIG_I2C=y +CONFIG_I2C_NRFX=y + +# Enable SPI +CONFIG_SPI_NRFX=y + +# Enable writing to flash +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y +CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y + +# enable display drivers +CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y +CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 +CONFIG_LV_Z_BITS_PER_PIXEL=1 +CONFIG_LV_COLOR_DEPTH_1=y +CONFIG_LV_DPI_DEF=145 +CONFIG_LV_Z_VDB_SIZE=100 +CONFIG_LV_USE_THEME_MONO=y +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y +CONFIG_LV_FONT_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y + +# custom status screens +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN=n +CONFIG_CUSTOM_WIDGET_BATTERY_STATUS=y +CONFIG_ZMK_WIDGET_BATTERY_STATUS=n +CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS=y +CONFIG_ZMK_WIDGET_PERIPHERAL_STATUS=n + +# Turn on logging, and set ZMK logging to debug output +#CONFIG_LOG=y +#CONFIG_LOG_PROCESS_THREAD_STARTUP_DELAY_MS=8000 +#CONFIG_ZMK_USB_LOGGING=y +#CONFIG_ZMK_LOG_LEVEL_DBG=y +#CONFIG_LOG_BUFFER_SIZE=20000 +#CONFIG_LOG_STRDUP_BUF_COUNT=60 +#CONFIG_I2C_LOG_LEVEL_DBG=y +#CONFIG_SPI_LOG_LEVEL_DBG=y +#CONFIG_DISPLAY_LOG_LEVEL_DBG=y +#CONFIG_LVGL_LOG_LEVEL_DBG=y +#CONFIG_LVGL_USE_DEBUG=y +#CONFIG_SENSOR_LOG_LEVEL_DBG=y From 94789a092c6d8ddf5ab5ad88eb011a4ece6b5cee Mon Sep 17 00:00:00 2001 From: Alexander Krikun Date: Wed, 3 May 2023 23:16:33 +0400 Subject: [PATCH 222/289] fix(boards): unify board I2C configuration, use TWI driver --- app/boards/arm/bluemicro840/bluemicro840_v1.dts | 3 ++- app/boards/arm/nrfmicro/nrfmicro_11.dts | 3 ++- app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts | 3 ++- app/boards/arm/nrfmicro/nrfmicro_13.dts | 3 ++- app/boards/arm/nrfmicro/nrfmicro_13_52833.dts | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1.dts b/app/boards/arm/bluemicro840/bluemicro840_v1.dts index f1952601..05849001 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1.dts +++ b/app/boards/arm/bluemicro840/bluemicro840_v1.dts @@ -63,7 +63,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twim"; + compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -71,6 +71,7 @@ &uart0 { compatible = "nordic,nrf-uarte"; + current-speed = <115200>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11.dts b/app/boards/arm/nrfmicro/nrfmicro_11.dts index 68331edc..14b9adb9 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11.dts @@ -48,7 +48,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twim"; + compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -56,6 +56,7 @@ &uart0 { compatible = "nordic,nrf-uarte"; + current-speed = <115200>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts index 9977617c..874b67e2 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts @@ -48,7 +48,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twim"; + compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -56,6 +56,7 @@ &uart0 { compatible = "nordic,nrf-uarte"; + current-speed = <115200>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13.dts b/app/boards/arm/nrfmicro/nrfmicro_13.dts index 300838ff..65674132 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13.dts @@ -61,7 +61,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twim"; + compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -69,6 +69,7 @@ &uart0 { compatible = "nordic,nrf-uarte"; + current-speed = <115200>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts index 86bcb5e5..cfe77e37 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts @@ -61,7 +61,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twim"; + compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -69,6 +69,7 @@ &uart0 { compatible = "nordic,nrf-uarte"; + current-speed = <115200>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; From 48be2eedd09d4918d25d8bcb8bcb58e51eff6060 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Wed, 10 May 2023 12:21:24 +0800 Subject: [PATCH 223/289] fix(docs): Update QMK debounce references --- docs/docs/features/debouncing.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/docs/features/debouncing.md b/docs/docs/features/debouncing.md index 9629131d..40170739 100644 --- a/docs/docs/features/debouncing.md +++ b/docs/docs/features/debouncing.md @@ -99,8 +99,6 @@ one millisecond of latency but protects against short noise spikes. ZMK's default debouncing is similar to QMK's `sym_defer_pk` algorithm. -Setting `CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS=0` for eager debouncing would be similar -to QMK's (unimplemented as of this writing) `asym_eager_defer_pk`. +Setting `CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS=0` for eager debouncing would be similar to QMK's `asym_eager_defer_pk`. -See [QMK's Debounce API documentation](https://beta.docs.qmk.fm/using-qmk/software-features/feature_debounce_type) -for more information. +See [QMK's Debounce API documentation](https://docs.qmk.fm/#/feature_debounce_type) for more information. From d53cd1992936dd5604b84cd4c02cfdfad4d9944a Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 22 Apr 2023 23:47:42 -0500 Subject: [PATCH 224/289] refactor: Add format on save for VS Code Added settings to format various file types on save in VS Code. Added some recommended VS Code extensions: - Prettier for formatting various file types - Python for formatting Python files - C/C++ for formatting C files - Devicetree for syntax highlighting - CMake for syntax highlighting --- .vscode/extensions.json | 9 +++++++++ .vscode/settings.json | 18 +++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..0819f71e --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "esbenp.prettier-vscode", + "ms-python.python", + "ms-vscode.cpptools", + "plorefice.devicetree", + "twxs.cmake" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index aea29cf0..8bbff533 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,21 @@ "*.overlay": "dts", "*.keymap": "dts" }, - "python.formatting.provider": "black" + "python.formatting.provider": "black", + "[c]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "ms-vscode.cpptools" + }, + "[javascript][javascriptreact][typescript][typescriptreact]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[python]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "ms-python.python" + }, + "[css][json][jsonc][html][markdown][yaml]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" + } } From a1e0607a22deb72ce4ac64e442f0baa721e32b0b Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 14 May 2023 12:20:40 -0500 Subject: [PATCH 225/289] fix: Don't specify default C formatter Microsoft's C/C++ extension performs poorly on some systems, so this gives the option to use any other extension that supports formatting with clang-format. --- .vscode/settings.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 8bbff533..924d83b1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,8 +5,7 @@ }, "python.formatting.provider": "black", "[c]": { - "editor.formatOnSave": true, - "editor.defaultFormatter": "ms-vscode.cpptools" + "editor.formatOnSave": true }, "[javascript][javascriptreact][typescript][typescriptreact]": { "editor.formatOnSave": true, From b1ca9199de02dcb45d055a71807ff3894290fda7 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Wed, 17 May 2023 12:42:57 +0800 Subject: [PATCH 226/289] fix(ci): Refactor prepare variable step * Refactor workflow variables * Use quotes to avoid word splitting --- .github/workflows/build-user-config.yml | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index b1e0602d..5891ddc1 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -39,8 +39,8 @@ jobs: - name: Fetch Build Matrix run: | - echo "build_matrix=$(yaml2json ${{ inputs.build_matrix_path }} | jq -c .)" >> $GITHUB_ENV - yaml2json ${{ inputs.build_matrix_path }} | jq + echo "build_matrix=$(yaml2json '${{ inputs.build_matrix_path }}' | jq -c .)" >> $GITHUB_ENV + yaml2json "${{ inputs.build_matrix_path }}" | jq build: runs-on: ubuntu-latest @@ -54,18 +54,13 @@ jobs: steps: - name: Prepare variables shell: sh -x {0} + env: + shield: ${{ matrix.shield }} run: | - if [ -n "${{ matrix.shield }}" ] - then - echo "extra_cmake_args=-DSHIELD=\"${{ matrix.shield }}\"" >> $GITHUB_ENV - echo "artifact_name=${{ matrix.shield }}-${{ matrix.board }}-zmk" >> $GITHUB_ENV - echo "display_name=${{ matrix.shield }} - ${{ matrix.board }}" >> $GITHUB_ENV - else - echo "extra_cmake_args=" >> $GITHUB_ENV - echo "artifact_name=${{ matrix.board }}-zmk" >> $GITHUB_ENV - echo "display_name=${{ matrix.board }}" >> $GITHUB_ENV - fi echo "zephyr_version=${ZEPHYR_VERSION}" >> $GITHUB_ENV + echo "extra_cmake_args=${shield:+-DSHIELD=\"$shield\"}" >> $GITHUB_ENV + echo "display_name=${shield:+$shield - }${{ matrix.board }}" >> $GITHUB_ENV + echo "artifact_name=${shield:+$shield-}${{ matrix.board }}-zmk" >> $GITHUB_ENV - name: Checkout uses: actions/checkout@v3 @@ -89,7 +84,7 @@ jobs: ${{ runner.os }}- - name: West Init - run: west init -l ${{ inputs.config_path }} + run: west init -l "${{ inputs.config_path }}" - name: West Update run: west update @@ -99,7 +94,7 @@ jobs: - name: West Build (${{ env.display_name }}) shell: sh -x {0} - run: west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/${{ inputs.config_path }} ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} + run: west build -s zmk/app -b "${{ matrix.board }}" -- -DZMK_CONFIG="${GITHUB_WORKSPACE}/${{ inputs.config_path }}" ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} - name: ${{ env.display_name }} Kconfig file run: grep -v -e "^#" -e "^$" build/zephyr/.config | sort @@ -113,7 +108,7 @@ jobs: cp build/zephyr/zmk.uf2 "build/artifacts/${{ env.artifact_name }}.uf2" elif [ -f build/zephyr/zmk.${{ inputs.fallback_binary }} ] then - cp build/zephyr/zmk.${{ inputs.fallback_binary }} "build/artifacts/${{ env.artifact_name }}.${{ inputs.fallback_binary }}" + cp "build/zephyr/zmk.${{ inputs.fallback_binary }}" "build/artifacts/${{ env.artifact_name }}.${{ inputs.fallback_binary }}" fi - name: Archive (${{ env.display_name }}) From 89d71ed2c2c1af78c166a96dc65658e4f39743ab Mon Sep 17 00:00:00 2001 From: digger vermont Date: Thu, 18 May 2023 19:47:36 -0400 Subject: [PATCH 227/289] feat(boards): Add KBDfans Tofu65 2.0 board * Initial commit of Tofu65 2.0 board --------- Co-authored-by: Pete Johanson --- app/boards/arm/kbdfans_tofu65/Kconfig.board | 6 + .../arm/kbdfans_tofu65/Kconfig.defconfig | 15 +++ .../arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts | 125 ++++++++++++++++++ .../kbdfans_tofu65/kbdfans_tofu65_v2.keymap | 97 ++++++++++++++ .../arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml | 15 +++ .../kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml | 10 ++ .../kbdfans_tofu65_v2_defconfig | 20 +++ 7 files changed, 288 insertions(+) create mode 100644 app/boards/arm/kbdfans_tofu65/Kconfig.board create mode 100644 app/boards/arm/kbdfans_tofu65/Kconfig.defconfig create mode 100644 app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts create mode 100644 app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap create mode 100644 app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml create mode 100644 app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml create mode 100644 app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig diff --git a/app/boards/arm/kbdfans_tofu65/Kconfig.board b/app/boards/arm/kbdfans_tofu65/Kconfig.board new file mode 100644 index 00000000..954166b7 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/Kconfig.board @@ -0,0 +1,6 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_KBDFANS_TOFU65_V2 + bool "KBDfans Tofu65 2.0" + depends on SOC_RP2040 diff --git a/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig b/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig new file mode 100644 index 00000000..993d5142 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig @@ -0,0 +1,15 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_KBDFANS_TOFU65_V2 + +config ZMK_KEYBOARD_NAME + default "kbdfans tofu65" + +config RP2_FLASH_W25Q080 + default y + +config ZMK_USB + default y + +endif # BOARD_KBDFANS_TOFU65_V2 diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts new file mode 100644 index 00000000..261ffbf4 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; + +#include +#include + +/ { + + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zephyr,shell-uart = &cdc_acm_uart; + zephyr,code-partition = &code_partition; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + xtal_clk: xtal-clk { + compatible = "fixed-clock"; + clock-frequency = <12000000>; + #clock-cells = <0>; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + +// ------- Switch Matrix ---------- +// +// Column 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | +// ========================================================================================== +// Row 0 || S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | S10 | S11 | S12 | S13 | S14 | +// Row 1 || S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | S10 | S11 | S12 | S13 | S14 | +// Row 2 || S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | S10 | S11 | S12 | | S13 | +// Row 3 || S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | S10 | S11 | | S12 | S13 | +// Row 4 || S0 | S1 | S2 | | | | S3 | | S4 | S5 | S6 | | S7 | S8 | S9 | +// ----------------------------------------------------------------------------------- +// + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,14) +RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,8) RC(4,9) RC(4,10) RC(4,12) RC(4,13) RC(4,14) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&gpio0 29 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 28 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 27 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpio0 25 GPIO_ACTIVE_HIGH> + , <&gpio0 24 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 1 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 20 GPIO_ACTIVE_HIGH> + , <&gpio0 19 GPIO_ACTIVE_HIGH> + , <&gpio0 18 GPIO_ACTIVE_HIGH> + , <&gpio0 17 GPIO_ACTIVE_HIGH> + , <&gpio0 16 GPIO_ACTIVE_HIGH> + , <&gpio0 15 GPIO_ACTIVE_HIGH> + , <&gpio0 14 GPIO_ACTIVE_HIGH> + , <&gpio0 13 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + ; + }; +}; + +&flash0 { + reg = <0x10000000 DT_SIZE_M(16)>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Reserved memory for the second stage bootloader */ + second_stage_bootloader: partition@0 { + label = "second_stage_bootloader"; + reg = <0x00000000 0x100>; + read-only; + }; + + /* + * Usable flash. Starts at 0x100, after the bootloader. The partition + * size is 16MB minus the 0x100 bytes taken by the bootloader. + */ + code_partition: partition@100 { + label = "code"; + reg = <0x100 (DT_SIZE_M(16) - 0x100)>; + read-only; + }; + }; +}; + + +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + }; +}; + + +&gpio0 { + status = "okay"; +}; + diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap new file mode 100644 index 00000000..7eca7919 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap @@ -0,0 +1,97 @@ +// Copyright (c) 2023 The ZMK Contributors +// SPDX-License-Identifier: MIT + +#include +#include + +#define BASE 0 +#define FUNC 1 + +// +// ---------- Tofu65 2.0 key switch positions ---------- +// +// ------------------------------------------------------------------------------------------------- +// | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | +// ------------------------------------------------------------------------------------------------- +// | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 24 | 26 | 27 | 28 | 29 | +// ------------------------------------------------------------------------------------------------- +// | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | +// ------------------------------------------------------------------------------------------------- +// | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | +// ------------------------------------------------------------------------------------------------- +// | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | +// ------------------------------------------------------------------------------------------------- +// + + +/ { + combos { + compatible = "zmk,combos"; + + // BACKSPACE + LCTRL + LALT = &sys_reset + combo_bootloader { + timeout-ms = <100>; + key-positions = <13 58 60>; + bindings = <&sys_reset>; + }; + + // RETURN + LCTRL + LALT = &bootloader + combo_sys_reset { + timeout-ms = <100>; + key-positions = <42 58 60>; + bindings = <&bootloader>; + }; + }; + + + keymap { + compatible = "zmk,keymap"; + + base { + +// --------- Default QWERTY Layout --------- +// Layer 0 BASE +// ------------------------------------------------------------------------------------------------- +// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | HME | +// ------------------------------------------------------------------------------------------------- +// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | PGU | +// ------------------------------------------------------------------------------------------------- +// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGD | +// ------------------------------------------------------------------------------------------------- +// | LSHIFT | Z | X | C | V | B | N | M | , | . | / | RSHFT | ↑ | END | +// ------------------------------------------------------------------------------------------------- +// | LCTL | LGUI | LALT | SPACE | RALT | RGUI | RCTL | <- | ↓ | -> | +// ------------------------------------------------------------------------------------------------- + bindings = < +&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp HOME +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp PG_UP +&kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp ENTER &kp PG_DN +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp END +&kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT < FUNC K_APP &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + }; + + func { +// --------- Default QWERTY Layout --------- +// Layer 1 FUNC +// --------------------------------------------------------------------------------------------------- +// | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | HME | +// --------------------------------------------------------------------------------------------------- +// | --- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | scroll lock | pause | --- | PGU | +// --------------------------------------------------------------------------------------------------- +// | CAPS | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | --- | PGD | +// --------------------------------------------------------------------------------------------------- +// | LSHIFT | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | ----- | VOL UP | MUTE | +// --------------------------------------------------------------------------------------------------- +// | ---- | ---- | ---- | ---- | -- | MO 1 | -- | PREV | VOL DN | NEXT | +// --------------------------------------------------------------------------------------------------- + bindings = < +&kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp SLCK &kp PAUSE_BREAK &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 &kp C_VOL_UP &kp C_MUTE +&trans &trans &trans &trans &trans &trans &trans &kp C_PREV &kp C_VOL_DN &kp C_NEXT + >; + }; + }; +}; diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml new file mode 100644 index 00000000..e1089766 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml @@ -0,0 +1,15 @@ +identifier: kbdfans_tofu65_v2 +name: KBDfans Tofu65 2.0 +type: mcu +arch: arm +flash: 16384 +ram: 264 +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - gpio + - usb_device + - hwinfo + - pwm diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml new file mode 100644 index 00000000..382e7dd3 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: kbdfans_tofu65_v2 +name: KBDfans Tofu65 2.0 +type: board +arch: arm +features: + - keys +outputs: + - usb +url: https://kbdfans.com/collections/tofu65-2-0/products/tofu65-2-0 diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig new file mode 100644 index 00000000..cf546683 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig @@ -0,0 +1,20 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_RP2XXX=y +CONFIG_SOC_RP2040=y +CONFIG_BOARD_KBDFANS_TOFU65_V2=y + +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 + +# Enable USB CDC ACM logging for debugging +# CONFIG_ZMK_USB_LOGGING=y + +# Enable reset by default +CONFIG_RESET=y + +# Code partition needed to target the correct flash range +CONFIG_USE_DT_CODE_PARTITION=y + +# Output UF2 by default, native bootloader supports it. +CONFIG_BUILD_OUTPUT_UF2=y From d799560985b40a7f9526cfdedd88546b60cf3182 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 00:10:58 -0500 Subject: [PATCH 228/289] chore: Update typescript, eslint, webpack --- docs/package-lock.json | 978 +++++++++++++++++++++-------------------- docs/package.json | 10 +- 2 files changed, 503 insertions(+), 485 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 2c8a7fba..2d1e7a57 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -31,18 +31,18 @@ "@types/react": "^17.0.3", "@types/react-helmet": "^6.1.5", "@types/react-router-dom": "^5.1.7", - "eslint": "^8.0.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^8.39.0", + "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", - "eslint-plugin-react": "^7.30.0", + "eslint-plugin-react": "^7.32.2", "json-schema-to-typescript": "^10.1.5", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", - "typescript": "^4.6.3", - "webpack": "^5.72.1" + "typescript": "^5.0.4", + "webpack": "^5.80.0" } }, "node_modules/@algolia/autocomplete-core": { @@ -2583,16 +2583,40 @@ "node": ">=16.14" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "devOptional": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "devOptional": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "devOptional": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.5.1", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2607,9 +2631,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "devOptional": true, "dependencies": { "type-fest": "^0.20.2" @@ -2633,6 +2657,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/js": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "devOptional": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@fortawesome/fontawesome-common-types": { "version": "0.2.36", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", @@ -2692,14 +2725,14 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", - "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "devOptional": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" @@ -3706,133 +3739,133 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz", + "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz", + "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz", + "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz", + "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz", + "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz", + "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz", + "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz", + "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz", + "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz", + "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz", + "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/helper-wasm-section": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-opt": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5", + "@webassemblyjs/wast-printer": "1.11.5" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz", + "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz", + "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz", + "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz", + "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.5", "@xtuc/long": "4.2.2" } }, @@ -4117,15 +4150,15 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "node_modules/array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" }, "engines": { @@ -4144,14 +4177,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -4161,6 +4194,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -5991,9 +6037,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", + "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -6060,9 +6106,9 @@ } }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" }, "node_modules/es-shim-unscopables": { "version": "1.0.0", @@ -6171,13 +6217,16 @@ } }, "node_modules/eslint": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", - "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", "devOptional": true, "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -6186,17 +6235,16 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", @@ -6211,7 +6259,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -6227,9 +6274,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -6675,25 +6722,26 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.31.10", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", - "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", "dev": true, "dependencies": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", + "resolve": "^2.0.0-next.4", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" + "string.prototype.matchall": "^4.0.8" }, "engines": { "node": ">=4" @@ -6741,9 +6789,9 @@ } }, "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "devOptional": true, "dependencies": { "esrecurse": "^4.3.0", @@ -6751,42 +6799,21 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "devOptional": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "devOptional": true, - "engines": { - "node": ">=10" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "devOptional": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/glob-parent": { @@ -6802,9 +6829,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "devOptional": true, "dependencies": { "type-fest": "^0.20.2" @@ -6829,14 +6856,14 @@ } }, "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "devOptional": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6858,9 +6885,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "devOptional": true, "dependencies": { "estraverse": "^5.1.0" @@ -11077,28 +11104,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -11108,27 +11135,27 @@ } }, "node_modules/object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dev": true, "dependencies": { "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -12796,18 +12823,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "devOptional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/regexpu-core": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", @@ -13572,9 +13587,9 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dependencies": { "randombytes": "^2.1.0" } @@ -14024,18 +14039,18 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", + "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" }, "funding": { @@ -14311,9 +14326,9 @@ } }, "node_modules/terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", + "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -14328,15 +14343,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", + "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" }, "engines": { "node": ">= 10.13.0" @@ -14620,15 +14635,15 @@ } }, "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/ua-parser-js": { @@ -15360,21 +15375,21 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.80.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", + "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.13.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -15383,9 +15398,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -15676,11 +15691,6 @@ "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -15721,9 +15731,9 @@ } }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -17793,16 +17803,31 @@ "tslib": "^2.4.0" } }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "devOptional": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "devOptional": true + }, "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "devOptional": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.5.1", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -17811,9 +17836,9 @@ }, "dependencies": { "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "devOptional": true, "requires": { "type-fest": "^0.20.2" @@ -17827,6 +17852,12 @@ } } }, + "@eslint/js": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "devOptional": true + }, "@fortawesome/fontawesome-common-types": { "version": "0.2.36", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", @@ -17870,14 +17901,14 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", - "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "devOptional": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" } }, "@humanwhocodes/module-importer": { @@ -18668,133 +18699,133 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz", + "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==", "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz", + "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==" }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz", + "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==" }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz", + "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==" }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz", + "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==", "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz", + "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz", + "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz", + "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz", + "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz", + "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==" }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz", + "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/helper-wasm-section": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-opt": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5", + "@webassemblyjs/wast-printer": "1.11.5" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz", + "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz", + "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz", + "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz", + "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==", "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.5", "@xtuc/long": "4.2.2" } }, @@ -19015,15 +19046,15 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" } }, @@ -19033,17 +19064,30 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, "array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, + "array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -20352,9 +20396,9 @@ } }, "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", + "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -20406,9 +20450,9 @@ } }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" }, "es-shim-unscopables": { "version": "1.0.0", @@ -20495,13 +20539,16 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", - "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", "devOptional": true, "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -20510,17 +20557,16 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", @@ -20535,7 +20581,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -20551,9 +20596,9 @@ } }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "devOptional": true, "requires": { "type-fest": "^0.20.2" @@ -20568,9 +20613,9 @@ } }, "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", "dev": true, "requires": {} }, @@ -20881,25 +20926,26 @@ } }, "eslint-plugin-react": { - "version": "7.31.10", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", - "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", "dev": true, "requires": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", + "resolve": "^2.0.0-next.4", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" + "string.prototype.matchall": "^4.0.8" }, "dependencies": { "doctrine": { @@ -20931,47 +20977,30 @@ } }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "devOptional": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "devOptional": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "devOptional": true - } - } - }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "devOptional": true }, "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "devOptional": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" } }, "esprima": { @@ -20980,9 +21009,9 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "devOptional": true, "requires": { "estraverse": "^5.1.0" @@ -23944,46 +23973,46 @@ } }, "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dev": true, "requires": { "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "obuf": { @@ -25136,12 +25165,6 @@ "functions-have-names": "^1.2.2" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "devOptional": true - }, "regexpu-core": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", @@ -25709,9 +25732,9 @@ } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "requires": { "randombytes": "^2.1.0" } @@ -26067,18 +26090,18 @@ } }, "string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", + "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" } }, @@ -26272,9 +26295,9 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, "terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", + "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", "requires": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -26290,15 +26313,15 @@ } }, "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", + "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", "requires": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" }, "dependencies": { "jest-worker": { @@ -26500,9 +26523,9 @@ } }, "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==" + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==" }, "ua-parser-js": { "version": "0.7.32", @@ -26996,21 +27019,21 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.80.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", + "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.13.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -27019,18 +27042,13 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -27059,9 +27077,9 @@ } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", diff --git a/docs/package.json b/docs/package.json index 70105b54..dd4b3ff7 100644 --- a/docs/package.json +++ b/docs/package.json @@ -50,17 +50,17 @@ "@types/react": "^17.0.3", "@types/react-helmet": "^6.1.5", "@types/react-router-dom": "^5.1.7", - "eslint": "^8.0.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^8.39.0", + "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", - "eslint-plugin-react": "^7.30.0", + "eslint-plugin-react": "^7.32.2", "json-schema-to-typescript": "^10.1.5", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", - "typescript": "^4.6.3", - "webpack": "^5.72.1" + "typescript": "^5.0.4", + "webpack": "^5.80.0" } } From 4674215551b8c9bb0706e825742ba82b9d46ed3b Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 00:14:00 -0500 Subject: [PATCH 229/289] chore: Update json-schema-to-typescript --- docs/package-lock.json | 193 ++++++++++++++++++----------------------- docs/package.json | 2 +- 2 files changed, 85 insertions(+), 110 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 2d1e7a57..ba968736 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -35,7 +35,7 @@ "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", "eslint-plugin-react": "^7.32.2", - "json-schema-to-typescript": "^10.1.5", + "json-schema-to-typescript": "^12.0.0", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", @@ -202,18 +202,6 @@ "node": ">=6.0.0" } }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", - "dev": true, - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -1984,6 +1972,24 @@ "node": ">=6.9.0" } }, + "node_modules/@bcherny/json-schema-ref-parser": { + "version": "10.0.5-fork", + "resolved": "https://registry.npmjs.org/@bcherny/json-schema-ref-parser/-/json-schema-ref-parser-10.0.5-fork.tgz", + "integrity": "sha512-E/jKbPoca1tfUPj3iSbitDZTGnq6FUFjkH6L8U2oDwSuwK1WhnnVtCG7oFOTg/DDnyoXbQYUiUiGOibHqaGVnw==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -3487,9 +3493,9 @@ } }, "node_modules/@types/glob": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.0.0.tgz", - "integrity": "sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "dependencies": { "@types/minimatch": "*", @@ -4609,9 +4615,9 @@ } }, "node_modules/call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", "dev": true }, "node_modules/callsites": { @@ -7711,18 +7717,22 @@ } }, "node_modules/glob-promise": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", - "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz", + "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==", "dev": true, "dependencies": { - "@types/glob": "*" + "@types/glob": "^7.1.3" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/ahmadnassri" }, "peerDependencies": { - "glob": "*" + "glob": "^7.1.6" } }, "node_modules/glob-to-regexp": { @@ -9126,45 +9136,32 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "node_modules/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", - "dev": true, - "dependencies": { - "@apidevtools/json-schema-ref-parser": "9.0.9" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/json-schema-to-typescript": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-10.1.5.tgz", - "integrity": "sha512-X8bNNksfCQo6LhEuqNxmZr4eZpPjXZajmimciuk8eWXzZlif9Brq7WuMGD/SOhBKcRKP2SGVDNZbC28WQqx9Rg==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-12.0.0.tgz", + "integrity": "sha512-Uk/BDIAo8vqepPBhM86UhNMHgCv7JulicNj/BgnQPHE1fGCoej0UTtcEYzXU/uk6lSvbZCf7pccW+dnNMrr5rg==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.6", - "@types/lodash": "^4.14.168", - "@types/prettier": "^2.1.5", - "cli-color": "^2.0.0", + "@bcherny/json-schema-ref-parser": "10.0.5-fork", + "@types/json-schema": "^7.0.11", + "@types/lodash": "^4.14.182", + "@types/prettier": "^2.6.1", + "cli-color": "^2.0.2", "get-stdin": "^8.0.0", "glob": "^7.1.6", - "glob-promise": "^3.4.0", - "is-glob": "^4.0.1", - "json-schema-ref-parser": "^9.0.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.20", - "minimist": "^1.2.5", + "glob-promise": "^4.2.2", + "is-glob": "^4.0.3", + "lodash": "^4.17.21", + "minimist": "^1.2.6", "mkdirp": "^1.0.4", "mz": "^2.7.0", - "prettier": "^2.2.0" + "prettier": "^2.6.2" }, "bin": { "json2ts": "dist/src/cli.js" }, "engines": { - "node": ">=10.0.0" + "node": ">=12.0.0" } }, "node_modules/json-schema-traverse": { @@ -9178,12 +9175,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "devOptional": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -16152,18 +16143,6 @@ "@jridgewell/trace-mapping": "^0.3.9" } }, - "@apidevtools/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", - "dev": true, - "requires": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - } - }, "@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -17362,6 +17341,18 @@ "to-fast-properties": "^2.0.0" } }, + "@bcherny/json-schema-ref-parser": { + "version": "10.0.5-fork", + "resolved": "https://registry.npmjs.org/@bcherny/json-schema-ref-parser/-/json-schema-ref-parser-10.0.5-fork.tgz", + "integrity": "sha512-E/jKbPoca1tfUPj3iSbitDZTGnq6FUFjkH6L8U2oDwSuwK1WhnnVtCG7oFOTg/DDnyoXbQYUiUiGOibHqaGVnw==", + "dev": true, + "requires": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, "@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -18447,9 +18438,9 @@ } }, "@types/glob": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.0.0.tgz", - "integrity": "sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -19385,9 +19376,9 @@ } }, "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", "dev": true }, "callsites": { @@ -21622,12 +21613,12 @@ } }, "glob-promise": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", - "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz", + "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==", "dev": true, "requires": { - "@types/glob": "*" + "@types/glob": "^7.1.3" } }, "glob-to-regexp": { @@ -22632,36 +22623,26 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", - "dev": true, - "requires": { - "@apidevtools/json-schema-ref-parser": "9.0.9" - } - }, "json-schema-to-typescript": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-10.1.5.tgz", - "integrity": "sha512-X8bNNksfCQo6LhEuqNxmZr4eZpPjXZajmimciuk8eWXzZlif9Brq7WuMGD/SOhBKcRKP2SGVDNZbC28WQqx9Rg==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-12.0.0.tgz", + "integrity": "sha512-Uk/BDIAo8vqepPBhM86UhNMHgCv7JulicNj/BgnQPHE1fGCoej0UTtcEYzXU/uk6lSvbZCf7pccW+dnNMrr5rg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", - "@types/lodash": "^4.14.168", - "@types/prettier": "^2.1.5", - "cli-color": "^2.0.0", + "@bcherny/json-schema-ref-parser": "10.0.5-fork", + "@types/json-schema": "^7.0.11", + "@types/lodash": "^4.14.182", + "@types/prettier": "^2.6.1", + "cli-color": "^2.0.2", "get-stdin": "^8.0.0", "glob": "^7.1.6", - "glob-promise": "^3.4.0", - "is-glob": "^4.0.1", - "json-schema-ref-parser": "^9.0.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.20", - "minimist": "^1.2.5", + "glob-promise": "^4.2.2", + "is-glob": "^4.0.3", + "lodash": "^4.17.21", + "minimist": "^1.2.6", "mkdirp": "^1.0.4", "mz": "^2.7.0", - "prettier": "^2.2.0" + "prettier": "^2.6.2" } }, "json-schema-traverse": { @@ -22675,12 +22656,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "devOptional": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", diff --git a/docs/package.json b/docs/package.json index dd4b3ff7..918fd173 100644 --- a/docs/package.json +++ b/docs/package.json @@ -54,7 +54,7 @@ "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", "eslint-plugin-react": "^7.32.2", - "json-schema-to-typescript": "^10.1.5", + "json-schema-to-typescript": "^12.0.0", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", From da2599aa75875a67ea923b93d58b6591e0747a06 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 00:26:28 -0500 Subject: [PATCH 230/289] chore: Update docusaurus, react types --- docs/package-lock.json | 1536 +++++++++++++++++++++------------------- docs/package.json | 14 +- 2 files changed, 803 insertions(+), 747 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index ba968736..ac8c947e 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,8 +8,8 @@ "name": "docs", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "^2.1.0", - "@docusaurus/preset-classic": "^2.1.0", + "@docusaurus/core": "^2.4.0", + "@docusaurus/preset-classic": "^2.4.0", "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.1.18", @@ -24,12 +24,12 @@ "web-tree-sitter": "^0.19.4" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.1.0", - "@docusaurus/types": "^2.1.0", - "@tsconfig/docusaurus": "^1.0.5", + "@docusaurus/module-type-aliases": "^2.4.0", + "@docusaurus/types": "^2.4.0", + "@tsconfig/docusaurus": "^1.0.7", "@types/js-yaml": "^4.0.5", - "@types/react": "^17.0.3", - "@types/react-helmet": "^6.1.5", + "@types/react": "^17.0.58", + "@types/react-helmet": "^6.1.6", "@types/react-router-dom": "^5.1.7", "eslint": "^8.39.0", "eslint-config-prettier": "^8.8.0", @@ -46,19 +46,19 @@ } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz", - "integrity": "sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", + "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", "dependencies": { - "@algolia/autocomplete-shared": "1.7.2" + "@algolia/autocomplete-shared": "1.7.4" } }, "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz", - "integrity": "sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", + "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", "dependencies": { - "@algolia/autocomplete-shared": "1.7.2" + "@algolia/autocomplete-shared": "1.7.4" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -66,79 +66,79 @@ } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz", - "integrity": "sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==" + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", + "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==" }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", - "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", + "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", "dependencies": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.17.0" } }, "node_modules/@algolia/cache-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", - "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", + "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==" }, "node_modules/@algolia/cache-in-memory": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", - "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", + "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", "dependencies": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.17.0" } }, "node_modules/@algolia/client-account": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", - "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", + "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-analytics": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", - "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", + "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", - "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", + "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", "dependencies": { - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-personalization": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", - "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", + "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-search": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", - "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", + "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/events": { @@ -147,47 +147,47 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "node_modules/@algolia/logger-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", - "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", + "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==" }, "node_modules/@algolia/logger-console": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", - "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", + "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", "dependencies": { - "@algolia/logger-common": "4.14.2" + "@algolia/logger-common": "4.17.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", - "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", + "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", "dependencies": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.17.0" } }, "node_modules/@algolia/requester-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", - "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", + "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==" }, "node_modules/@algolia/requester-node-http": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", - "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", + "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", "dependencies": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.17.0" } }, "node_modules/@algolia/transporter": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", - "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", + "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", "dependencies": { - "@algolia/cache-common": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/requester-common": "4.14.2" + "@algolia/cache-common": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/requester-common": "4.17.0" } }, "node_modules/@ampproject/remapping": { @@ -1904,11 +1904,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", - "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" @@ -2000,18 +2000,18 @@ } }, "node_modules/@docsearch/css": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.0.tgz", - "integrity": "sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", + "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==" }, "node_modules/@docsearch/react": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.0.tgz", - "integrity": "sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", + "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", "dependencies": { - "@algolia/autocomplete-core": "1.7.2", - "@algolia/autocomplete-preset-algolia": "1.7.2", - "@docsearch/css": "3.3.0", + "@algolia/autocomplete-core": "1.7.4", + "@algolia/autocomplete-preset-algolia": "1.7.4", + "@docsearch/css": "3.3.3", "algoliasearch": "^4.0.0" }, "peerDependencies": { @@ -2032,9 +2032,9 @@ } }, "node_modules/@docusaurus/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", - "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.0.tgz", + "integrity": "sha512-J55/WEoIpRcLf3afO5POHPguVZosKmJEQWKBL+K7TAnfuE7i+Y0NPLlkKtnWCehagGsgTqClfQEexH/UT4kELA==", "dependencies": { "@babel/core": "^7.18.6", "@babel/generator": "^7.18.7", @@ -2046,13 +2046,13 @@ "@babel/runtime": "^7.18.6", "@babel/runtime-corejs3": "^7.18.6", "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/cssnano-preset": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", @@ -2073,7 +2073,7 @@ "del": "^6.1.1", "detect-port": "^1.3.0", "escape-html": "^1.0.3", - "eta": "^1.12.3", + "eta": "^2.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "html-minifier-terser": "^6.1.0", @@ -2120,9 +2120,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", - "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.0.tgz", + "integrity": "sha512-RmdiA3IpsLgZGXRzqnmTbGv43W4OD44PCo+6Q/aYjEM2V57vKCVqNzuafE94jv0z/PjHoXUrjr69SaRymBKYYw==", "dependencies": { "cssnano-preset-advanced": "^5.3.8", "postcss": "^8.4.14", @@ -2134,9 +2134,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", - "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.0.tgz", + "integrity": "sha512-T8+qR4APN+MjcC9yL2Es+xPJ2923S9hpzDmMtdsOcUGLqpCGBbU1vp3AAqDwXtVgFkq+NsEk7sHdVsfLWR/AXw==", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.4.0" @@ -2146,14 +2146,14 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", - "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.0.tgz", + "integrity": "sha512-GWoH4izZKOmFoC+gbI2/y8deH/xKLvzz/T5BsEexBye8EHQlwsA7FMrVa48N063bJBH4FUOiRRXxk5rq9cC36g==", "dependencies": { "@babel/parser": "^7.18.8", "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -2177,12 +2177,12 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", - "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.0.tgz", + "integrity": "sha512-YEQO2D3UXs72qCn8Cr+RlycSQXVGN9iEUyuHwTuK4/uL/HFomB2FHSU0vSDM23oLd+X/KibQ3Ez6nGjQLqXcHg==", "dependencies": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.1.0", + "@docusaurus/types": "2.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2196,17 +2196,17 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", - "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.0.tgz", + "integrity": "sha512-YwkAkVUxtxoBAIj/MCb4ohN0SCtHBs4AS75jMhPpf67qf3j+U/4n33cELq7567hwyZ6fMz2GPJcVmctzlGGThQ==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", @@ -2226,17 +2226,17 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", - "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.0.tgz", + "integrity": "sha512-ic/Z/ZN5Rk/RQo+Io6rUGpToOtNbtPloMR2JcGwC1xT2riMu6zzfSwmBi9tHJgdXH6CB5jG+0dOZZO8QS5tmDg==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", @@ -2256,15 +2256,15 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", - "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.0.tgz", + "integrity": "sha512-Pk2pOeOxk8MeU3mrTU0XLIgP9NZixbdcJmJ7RUFrZp1Aj42nd0RhIT14BGvXXyqb8yTQlk4DmYGAzqOfBsFyGw==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "fs-extra": "^10.1.0", "tslib": "^2.4.0", "webpack": "^5.73.0" @@ -2278,13 +2278,13 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", - "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.0.tgz", + "integrity": "sha512-KC56DdYjYT7Txyux71vXHXGYZuP6yYtqwClvYpjKreWIHWus5Zt6VNi23rMZv3/QKhOCrN64zplUbdfQMvddBQ==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" @@ -2298,13 +2298,13 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", - "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.0.tgz", + "integrity": "sha512-uGUzX67DOAIglygdNrmMOvEp8qG03X20jMWadeqVQktS6nADvozpSLGx4J0xbkblhJkUzN21WiilsP9iVP+zkw==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "tslib": "^2.4.0" }, "engines": { @@ -2316,13 +2316,31 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", - "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.0.tgz", + "integrity": "sha512-adj/70DANaQs2+TF/nRdMezDXFAV/O/pjAbUgmKBlyOTq5qoMe0Tk4muvQIwWUmiUQxFJe+sKlZGM771ownyOg==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.0.tgz", + "integrity": "sha512-E66uGcYs4l7yitmp/8kMEVQftFPwV9iC62ORh47Veqzs6ExwnhzBkJmwDnwIysHBF1vlxnzET0Fl2LfL5fRR3A==", + "dependencies": { + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "tslib": "^2.4.0" }, "engines": { @@ -2334,16 +2352,16 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", - "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.0.tgz", + "integrity": "sha512-pZxh+ygfnI657sN8a/FkYVIAmVv0CGk71QMKqJBOfMmDHNN1FeDeFkBjWP49ejBqpqAhjufkv5UWq3UOu2soCw==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" @@ -2357,22 +2375,23 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", - "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.0.tgz", + "integrity": "sha512-/5z5o/9bc6+P5ool2y01PbJhoGddEGsC0ej1MF6mCoazk8A+kW4feoUd68l7Bnv01rCnG3xy7kHUQP97Y0grUA==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/plugin-debug": "2.1.0", - "@docusaurus/plugin-google-analytics": "2.1.0", - "@docusaurus/plugin-google-gtag": "2.1.0", - "@docusaurus/plugin-sitemap": "2.1.0", - "@docusaurus/theme-classic": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-search-algolia": "2.1.0", - "@docusaurus/types": "2.1.0" + "@docusaurus/core": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/plugin-debug": "2.4.0", + "@docusaurus/plugin-google-analytics": "2.4.0", + "@docusaurus/plugin-google-gtag": "2.4.0", + "@docusaurus/plugin-google-tag-manager": "2.4.0", + "@docusaurus/plugin-sitemap": "2.4.0", + "@docusaurus/theme-classic": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-search-algolia": "2.4.0", + "@docusaurus/types": "2.4.0" }, "engines": { "node": ">=16.14" @@ -2395,26 +2414,26 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", - "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.0.tgz", + "integrity": "sha512-GMDX5WU6Z0OC65eQFgl3iNNEbI9IMJz9f6KnOyuMxNUR6q0qVLsKCNopFUDfFNJ55UU50o7P7o21yVhkwpfJ9w==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.42", + "infima": "0.2.0-alpha.43", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.14", @@ -2434,16 +2453,17 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", - "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.0.tgz", + "integrity": "sha512-IkG/l5f/FLY6cBIxtPmFnxpuPzc5TupuqlOx+XDN+035MdQcAh8wHXXZJAkTeYDeZ3anIUSUIvWa7/nRKoQEfg==", "dependencies": { - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2451,6 +2471,7 @@ "parse-numeric-range": "^1.3.0", "prism-react-renderer": "^1.3.5", "tslib": "^2.4.0", + "use-sync-external-store": "^1.2.0", "utility-types": "^3.10.0" }, "engines": { @@ -2462,22 +2483,22 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", - "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.0.tgz", + "integrity": "sha512-pPCJSCL1Qt4pu/Z0uxBAuke0yEBbxh0s4fOvimna7TEcBLPq0x06/K78AaABXrTVQM6S0vdocFl9EoNgU17hqA==", "dependencies": { "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "algoliasearch": "^4.13.1", "algoliasearch-helper": "^3.10.0", "clsx": "^1.2.1", - "eta": "^1.12.3", + "eta": "^2.0.0", "fs-extra": "^10.1.0", "lodash": "^4.17.21", "tslib": "^2.4.0", @@ -2492,9 +2513,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", - "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.0.tgz", + "integrity": "sha512-kEoITnPXzDPUMBHk3+fzEzbopxLD3fR5sDoayNH0vXkpUukA88/aDL1bqkhxWZHA3LOfJ3f0vJbOwmnXW5v85Q==", "dependencies": { "fs-extra": "^10.1.0", "tslib": "^2.4.0" @@ -2504,9 +2525,9 @@ } }, "node_modules/@docusaurus/types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", - "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.0.tgz", + "integrity": "sha512-xaBXr+KIPDkIaef06c+i2HeTqVNixB7yFut5fBXPGI2f1rrmEV2vLMznNGsFwvZ5XmA3Quuefd4OGRkdo97Dhw==", "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", @@ -2523,12 +2544,13 @@ } }, "node_modules/@docusaurus/utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", - "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.0.tgz", + "integrity": "sha512-89hLYkvtRX92j+C+ERYTuSUK6nF9bGM32QThcHPg2EDDHVw6FzYQXmX6/p+pU5SDyyx5nBlE4qXR92RxCAOqfg==", "dependencies": { - "@docusaurus/logger": "2.1.0", + "@docusaurus/logger": "2.4.0", "@svgr/webpack": "^6.2.1", + "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "github-slugger": "^1.4.0", @@ -2556,9 +2578,9 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", - "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.0.tgz", + "integrity": "sha512-zIMf10xuKxddYfLg5cS19x44zud/E9I7lj3+0bv8UIs0aahpErfNrGhijEfJpAfikhQ8tL3m35nH3hJ3sOG82A==", "dependencies": { "tslib": "^2.4.0" }, @@ -2575,12 +2597,12 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", - "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.0.tgz", + "integrity": "sha512-IrBsBbbAp6y7mZdJx4S4pIA7dUyWSA0GNosPk6ZJ0fX3uYIEQgcQSGIgTeSC+8xPEx3c16o03en1jSDpgQgz/w==", "dependencies": { - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" @@ -3382,9 +3404,9 @@ } }, "node_modules/@tsconfig/docusaurus": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.6.tgz", - "integrity": "sha512-1QxDaP54hpzM6bq9E+yFEo4F9WbWHhsDe4vktZXF/iDlc9FqGr9qlg+3X/nuKQXx8QxHV7ue8NXFazzajsxFBA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz", + "integrity": "sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg==", "dev": true }, "node_modules/@types/acorn": { @@ -3628,9 +3650,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "17.0.51", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.51.tgz", - "integrity": "sha512-YMddzAE+nSH04BiTJ5GydTxk0/3hckqyuOclg0s6zQYj/XzfRVNzHZAFwZb5SCSavkzTYUtcq/gwjLnvt2Y4cg==", + "version": "17.0.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", + "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3638,9 +3660,9 @@ } }, "node_modules/@types/react-helmet": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.5.tgz", - "integrity": "sha512-/ICuy7OHZxR0YCAZLNg9r7I9aijWUWvxaPR6uTuyxe8tAj5RL4Sw1+R6NhXUtOsarkGYPmaHdBDvuXh2DIN/uA==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.6.tgz", + "integrity": "sha512-ZKcoOdW/Tg+kiUbkFCBtvDw0k3nD4HJ/h/B9yWxN4uDO8OkRksWTO+EL+z/Qu3aHTeTll3Ro0Cc/8UhwBCMG5A==", "dev": true, "dependencies": { "@types/react": "*" @@ -4032,30 +4054,30 @@ } }, "node_modules/algoliasearch": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", - "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", + "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", "dependencies": { - "@algolia/cache-browser-local-storage": "4.14.2", - "@algolia/cache-common": "4.14.2", - "@algolia/cache-in-memory": "4.14.2", - "@algolia/client-account": "4.14.2", - "@algolia/client-analytics": "4.14.2", - "@algolia/client-common": "4.14.2", - "@algolia/client-personalization": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/logger-console": "4.14.2", - "@algolia/requester-browser-xhr": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/requester-node-http": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/cache-browser-local-storage": "4.17.0", + "@algolia/cache-common": "4.17.0", + "@algolia/cache-in-memory": "4.17.0", + "@algolia/client-account": "4.17.0", + "@algolia/client-analytics": "4.17.0", + "@algolia/client-common": "4.17.0", + "@algolia/client-personalization": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/logger-console": "4.17.0", + "@algolia/requester-browser-xhr": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/requester-node-http": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", - "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.12.0.tgz", + "integrity": "sha512-/j1U3PEwdan0n6P/QqSnSpNSLC5+cEMvyljd5CnmNmUjDlGrys+vFEOwjVEnqELIiAGMHEA/Nl3CiKVFBUYqyQ==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -4227,9 +4249,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.12", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", - "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "funding": [ { "type": "opencollective", @@ -4241,8 +4263,8 @@ } ], "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001407", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -4516,9 +4538,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "funding": [ { "type": "opencollective", @@ -4530,10 +4552,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" }, "bin": { "browserslist": "cli.js" @@ -4668,9 +4690,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001425", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz", - "integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==", + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==", "funding": [ { "type": "opencollective", @@ -4679,6 +4701,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -5121,9 +5147,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/copy-text-to-clipboard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", - "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz", + "integrity": "sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==", "engines": { "node": ">=12" }, @@ -5530,12 +5556,12 @@ } }, "node_modules/cssnano-preset-advanced": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz", - "integrity": "sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", "dependencies": { - "autoprefixer": "^10.3.7", - "cssnano-preset-default": "^5.2.12", + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", "postcss-discard-unused": "^5.1.0", "postcss-merge-idents": "^5.1.1", "postcss-reduce-idents": "^5.2.0", @@ -5549,24 +5575,24 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "dependencies": { - "css-declaration-sorter": "^6.3.0", + "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", + "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", @@ -5574,11 +5600,11 @@ "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-initial": "^5.1.2", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" @@ -6954,9 +6980,9 @@ } }, "node_modules/eta": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", - "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.0.1.tgz", + "integrity": "sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg==", "engines": { "node": ">=6.0.0" }, @@ -7398,9 +7424,9 @@ "devOptional": true }, "node_modules/flux": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", - "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", "dependencies": { "fbemitter": "^3.0.0", "fbjs": "^3.0.1" @@ -8300,9 +8326,9 @@ } }, "node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -8312,9 +8338,9 @@ ], "dependencies": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "node_modules/http-cache-semantics": { @@ -8495,9 +8521,9 @@ } }, "node_modules/infima": { - "version": "0.2.0-alpha.42", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", - "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==", + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", "engines": { "node": ">=12" } @@ -10957,9 +10983,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -11394,9 +11420,9 @@ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "node_modules/parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dependencies": { "entities": "^4.4.0" }, @@ -11661,11 +11687,11 @@ } }, "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" @@ -11678,11 +11704,11 @@ } }, "node_modules/postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "dependencies": { - "browserslist": "^4.20.3", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -11787,12 +11813,12 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "stylehacks": "^5.1.1" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -11802,11 +11828,11 @@ } }, "node_modules/postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" @@ -11849,11 +11875,11 @@ } }, "node_modules/postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, @@ -12015,11 +12041,11 @@ } }, "node_modules/postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -12088,11 +12114,11 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" }, "engines": { @@ -12129,9 +12155,9 @@ } }, "node_modules/postcss-sort-media-queries": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", - "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", "dependencies": { "sort-css-media-queries": "2.1.0" }, @@ -12690,11 +12716,11 @@ } }, "node_modules/react-textarea-autosize": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", - "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz", + "integrity": "sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==", "dependencies": { - "@babel/runtime": "^7.10.2", + "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" }, @@ -12785,9 +12811,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -14160,11 +14186,11 @@ } }, "node_modules/stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" }, "engines": { @@ -14532,7 +14558,8 @@ "node_modules/trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", + "deprecated": "Use String.prototype.trim() instead" }, "node_modules/trim-trailing-lines": { "version": "1.1.4", @@ -14638,9 +14665,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.32", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", - "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==", + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", "funding": [ { "type": "opencollective", @@ -15169,6 +15196,14 @@ } } }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -15994,95 +16029,95 @@ }, "dependencies": { "@algolia/autocomplete-core": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz", - "integrity": "sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", + "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", "requires": { - "@algolia/autocomplete-shared": "1.7.2" + "@algolia/autocomplete-shared": "1.7.4" } }, "@algolia/autocomplete-preset-algolia": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz", - "integrity": "sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", + "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", "requires": { - "@algolia/autocomplete-shared": "1.7.2" + "@algolia/autocomplete-shared": "1.7.4" } }, "@algolia/autocomplete-shared": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz", - "integrity": "sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==" + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", + "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==" }, "@algolia/cache-browser-local-storage": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", - "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", + "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", "requires": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.17.0" } }, "@algolia/cache-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", - "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", + "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==" }, "@algolia/cache-in-memory": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", - "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", + "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", "requires": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.17.0" } }, "@algolia/client-account": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", - "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", + "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "@algolia/client-analytics": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", - "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", + "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "@algolia/client-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", - "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", + "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", "requires": { - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "@algolia/client-personalization": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", - "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", + "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "@algolia/client-search": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", - "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", + "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "@algolia/events": { @@ -16091,47 +16126,47 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "@algolia/logger-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", - "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", + "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==" }, "@algolia/logger-console": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", - "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", + "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", "requires": { - "@algolia/logger-common": "4.14.2" + "@algolia/logger-common": "4.17.0" } }, "@algolia/requester-browser-xhr": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", - "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", + "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", "requires": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.17.0" } }, "@algolia/requester-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", - "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", + "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==" }, "@algolia/requester-node-http": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", - "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", + "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", "requires": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.17.0" } }, "@algolia/transporter": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", - "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", + "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", "requires": { - "@algolia/cache-common": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/requester-common": "4.14.2" + "@algolia/cache-common": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/requester-common": "4.17.0" } }, "@ampproject/remapping": { @@ -17288,11 +17323,11 @@ } }, "@babel/runtime": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", - "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@babel/runtime-corejs3": { @@ -17360,25 +17395,25 @@ "optional": true }, "@docsearch/css": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.0.tgz", - "integrity": "sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", + "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==" }, "@docsearch/react": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.0.tgz", - "integrity": "sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", + "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", "requires": { - "@algolia/autocomplete-core": "1.7.2", - "@algolia/autocomplete-preset-algolia": "1.7.2", - "@docsearch/css": "3.3.0", + "@algolia/autocomplete-core": "1.7.4", + "@algolia/autocomplete-preset-algolia": "1.7.4", + "@docsearch/css": "3.3.3", "algoliasearch": "^4.0.0" } }, "@docusaurus/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", - "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.0.tgz", + "integrity": "sha512-J55/WEoIpRcLf3afO5POHPguVZosKmJEQWKBL+K7TAnfuE7i+Y0NPLlkKtnWCehagGsgTqClfQEexH/UT4kELA==", "requires": { "@babel/core": "^7.18.6", "@babel/generator": "^7.18.7", @@ -17390,13 +17425,13 @@ "@babel/runtime": "^7.18.6", "@babel/runtime-corejs3": "^7.18.6", "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/cssnano-preset": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", @@ -17417,7 +17452,7 @@ "del": "^6.1.1", "detect-port": "^1.3.0", "escape-html": "^1.0.3", - "eta": "^1.12.3", + "eta": "^2.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "html-minifier-terser": "^6.1.0", @@ -17454,9 +17489,9 @@ } }, "@docusaurus/cssnano-preset": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", - "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.0.tgz", + "integrity": "sha512-RmdiA3IpsLgZGXRzqnmTbGv43W4OD44PCo+6Q/aYjEM2V57vKCVqNzuafE94jv0z/PjHoXUrjr69SaRymBKYYw==", "requires": { "cssnano-preset-advanced": "^5.3.8", "postcss": "^8.4.14", @@ -17465,23 +17500,23 @@ } }, "@docusaurus/logger": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", - "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.0.tgz", + "integrity": "sha512-T8+qR4APN+MjcC9yL2Es+xPJ2923S9hpzDmMtdsOcUGLqpCGBbU1vp3AAqDwXtVgFkq+NsEk7sHdVsfLWR/AXw==", "requires": { "chalk": "^4.1.2", "tslib": "^2.4.0" } }, "@docusaurus/mdx-loader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", - "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.0.tgz", + "integrity": "sha512-GWoH4izZKOmFoC+gbI2/y8deH/xKLvzz/T5BsEexBye8EHQlwsA7FMrVa48N063bJBH4FUOiRRXxk5rq9cC36g==", "requires": { "@babel/parser": "^7.18.8", "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -17498,12 +17533,12 @@ } }, "@docusaurus/module-type-aliases": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", - "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.0.tgz", + "integrity": "sha512-YEQO2D3UXs72qCn8Cr+RlycSQXVGN9iEUyuHwTuK4/uL/HFomB2FHSU0vSDM23oLd+X/KibQ3Ez6nGjQLqXcHg==", "requires": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.1.0", + "@docusaurus/types": "2.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -17513,17 +17548,17 @@ } }, "@docusaurus/plugin-content-blog": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", - "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.0.tgz", + "integrity": "sha512-YwkAkVUxtxoBAIj/MCb4ohN0SCtHBs4AS75jMhPpf67qf3j+U/4n33cELq7567hwyZ6fMz2GPJcVmctzlGGThQ==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", @@ -17536,17 +17571,17 @@ } }, "@docusaurus/plugin-content-docs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", - "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.0.tgz", + "integrity": "sha512-ic/Z/ZN5Rk/RQo+Io6rUGpToOtNbtPloMR2JcGwC1xT2riMu6zzfSwmBi9tHJgdXH6CB5jG+0dOZZO8QS5tmDg==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", @@ -17559,88 +17594,100 @@ } }, "@docusaurus/plugin-content-pages": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", - "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.0.tgz", + "integrity": "sha512-Pk2pOeOxk8MeU3mrTU0XLIgP9NZixbdcJmJ7RUFrZp1Aj42nd0RhIT14BGvXXyqb8yTQlk4DmYGAzqOfBsFyGw==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "fs-extra": "^10.1.0", "tslib": "^2.4.0", "webpack": "^5.73.0" } }, "@docusaurus/plugin-debug": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", - "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.0.tgz", + "integrity": "sha512-KC56DdYjYT7Txyux71vXHXGYZuP6yYtqwClvYpjKreWIHWus5Zt6VNi23rMZv3/QKhOCrN64zplUbdfQMvddBQ==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-analytics": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", - "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.0.tgz", + "integrity": "sha512-uGUzX67DOAIglygdNrmMOvEp8qG03X20jMWadeqVQktS6nADvozpSLGx4J0xbkblhJkUzN21WiilsP9iVP+zkw==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-gtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", - "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.0.tgz", + "integrity": "sha512-adj/70DANaQs2+TF/nRdMezDXFAV/O/pjAbUgmKBlyOTq5qoMe0Tk4muvQIwWUmiUQxFJe+sKlZGM771ownyOg==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "tslib": "^2.4.0" + } + }, + "@docusaurus/plugin-google-tag-manager": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.0.tgz", + "integrity": "sha512-E66uGcYs4l7yitmp/8kMEVQftFPwV9iC62ORh47Veqzs6ExwnhzBkJmwDnwIysHBF1vlxnzET0Fl2LfL5fRR3A==", + "requires": { + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "tslib": "^2.4.0" } }, "@docusaurus/plugin-sitemap": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", - "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.0.tgz", + "integrity": "sha512-pZxh+ygfnI657sN8a/FkYVIAmVv0CGk71QMKqJBOfMmDHNN1FeDeFkBjWP49ejBqpqAhjufkv5UWq3UOu2soCw==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" } }, "@docusaurus/preset-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", - "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.0.tgz", + "integrity": "sha512-/5z5o/9bc6+P5ool2y01PbJhoGddEGsC0ej1MF6mCoazk8A+kW4feoUd68l7Bnv01rCnG3xy7kHUQP97Y0grUA==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/plugin-debug": "2.1.0", - "@docusaurus/plugin-google-analytics": "2.1.0", - "@docusaurus/plugin-google-gtag": "2.1.0", - "@docusaurus/plugin-sitemap": "2.1.0", - "@docusaurus/theme-classic": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-search-algolia": "2.1.0", - "@docusaurus/types": "2.1.0" + "@docusaurus/core": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/plugin-debug": "2.4.0", + "@docusaurus/plugin-google-analytics": "2.4.0", + "@docusaurus/plugin-google-gtag": "2.4.0", + "@docusaurus/plugin-google-tag-manager": "2.4.0", + "@docusaurus/plugin-sitemap": "2.4.0", + "@docusaurus/theme-classic": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-search-algolia": "2.4.0", + "@docusaurus/types": "2.4.0" } }, "@docusaurus/react-loadable": { @@ -17653,26 +17700,26 @@ } }, "@docusaurus/theme-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", - "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.0.tgz", + "integrity": "sha512-GMDX5WU6Z0OC65eQFgl3iNNEbI9IMJz9f6KnOyuMxNUR6q0qVLsKCNopFUDfFNJ55UU50o7P7o21yVhkwpfJ9w==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.42", + "infima": "0.2.0-alpha.43", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.14", @@ -17685,16 +17732,17 @@ } }, "@docusaurus/theme-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", - "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.0.tgz", + "integrity": "sha512-IkG/l5f/FLY6cBIxtPmFnxpuPzc5TupuqlOx+XDN+035MdQcAh8wHXXZJAkTeYDeZ3anIUSUIvWa7/nRKoQEfg==", "requires": { - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -17702,26 +17750,27 @@ "parse-numeric-range": "^1.3.0", "prism-react-renderer": "^1.3.5", "tslib": "^2.4.0", + "use-sync-external-store": "^1.2.0", "utility-types": "^3.10.0" } }, "@docusaurus/theme-search-algolia": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", - "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.0.tgz", + "integrity": "sha512-pPCJSCL1Qt4pu/Z0uxBAuke0yEBbxh0s4fOvimna7TEcBLPq0x06/K78AaABXrTVQM6S0vdocFl9EoNgU17hqA==", "requires": { "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "algoliasearch": "^4.13.1", "algoliasearch-helper": "^3.10.0", "clsx": "^1.2.1", - "eta": "^1.12.3", + "eta": "^2.0.0", "fs-extra": "^10.1.0", "lodash": "^4.17.21", "tslib": "^2.4.0", @@ -17729,18 +17778,18 @@ } }, "@docusaurus/theme-translations": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", - "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.0.tgz", + "integrity": "sha512-kEoITnPXzDPUMBHk3+fzEzbopxLD3fR5sDoayNH0vXkpUukA88/aDL1bqkhxWZHA3LOfJ3f0vJbOwmnXW5v85Q==", "requires": { "fs-extra": "^10.1.0", "tslib": "^2.4.0" } }, "@docusaurus/types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", - "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.0.tgz", + "integrity": "sha512-xaBXr+KIPDkIaef06c+i2HeTqVNixB7yFut5fBXPGI2f1rrmEV2vLMznNGsFwvZ5XmA3Quuefd4OGRkdo97Dhw==", "requires": { "@types/history": "^4.7.11", "@types/react": "*", @@ -17753,12 +17802,13 @@ } }, "@docusaurus/utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", - "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.0.tgz", + "integrity": "sha512-89hLYkvtRX92j+C+ERYTuSUK6nF9bGM32QThcHPg2EDDHVw6FzYQXmX6/p+pU5SDyyx5nBlE4qXR92RxCAOqfg==", "requires": { - "@docusaurus/logger": "2.1.0", + "@docusaurus/logger": "2.4.0", "@svgr/webpack": "^6.2.1", + "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "github-slugger": "^1.4.0", @@ -17775,20 +17825,20 @@ } }, "@docusaurus/utils-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", - "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.0.tgz", + "integrity": "sha512-zIMf10xuKxddYfLg5cS19x44zud/E9I7lj3+0bv8UIs0aahpErfNrGhijEfJpAfikhQ8tL3m35nH3hJ3sOG82A==", "requires": { "tslib": "^2.4.0" } }, "@docusaurus/utils-validation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", - "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.0.tgz", + "integrity": "sha512-IrBsBbbAp6y7mZdJx4S4pIA7dUyWSA0GNosPk6ZJ0fX3uYIEQgcQSGIgTeSC+8xPEx3c16o03en1jSDpgQgz/w==", "requires": { - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" @@ -18327,9 +18377,9 @@ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, "@tsconfig/docusaurus": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.6.tgz", - "integrity": "sha512-1QxDaP54hpzM6bq9E+yFEo4F9WbWHhsDe4vktZXF/iDlc9FqGr9qlg+3X/nuKQXx8QxHV7ue8NXFazzajsxFBA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz", + "integrity": "sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg==", "dev": true }, "@types/acorn": { @@ -18573,9 +18623,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { - "version": "17.0.51", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.51.tgz", - "integrity": "sha512-YMddzAE+nSH04BiTJ5GydTxk0/3hckqyuOclg0s6zQYj/XzfRVNzHZAFwZb5SCSavkzTYUtcq/gwjLnvt2Y4cg==", + "version": "17.0.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", + "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -18583,9 +18633,9 @@ } }, "@types/react-helmet": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.5.tgz", - "integrity": "sha512-/ICuy7OHZxR0YCAZLNg9r7I9aijWUWvxaPR6uTuyxe8tAj5RL4Sw1+R6NhXUtOsarkGYPmaHdBDvuXh2DIN/uA==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.6.tgz", + "integrity": "sha512-ZKcoOdW/Tg+kiUbkFCBtvDw0k3nD4HJ/h/B9yWxN4uDO8OkRksWTO+EL+z/Qu3aHTeTll3Ro0Cc/8UhwBCMG5A==", "dev": true, "requires": { "@types/react": "*" @@ -18935,30 +18985,30 @@ "requires": {} }, "algoliasearch": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", - "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", + "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", "requires": { - "@algolia/cache-browser-local-storage": "4.14.2", - "@algolia/cache-common": "4.14.2", - "@algolia/cache-in-memory": "4.14.2", - "@algolia/client-account": "4.14.2", - "@algolia/client-analytics": "4.14.2", - "@algolia/client-common": "4.14.2", - "@algolia/client-personalization": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/logger-console": "4.14.2", - "@algolia/requester-browser-xhr": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/requester-node-http": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/cache-browser-local-storage": "4.17.0", + "@algolia/cache-common": "4.17.0", + "@algolia/cache-in-memory": "4.17.0", + "@algolia/client-account": "4.17.0", + "@algolia/client-analytics": "4.17.0", + "@algolia/client-common": "4.17.0", + "@algolia/client-personalization": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/logger-console": "4.17.0", + "@algolia/requester-browser-xhr": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/requester-node-http": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "algoliasearch-helper": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", - "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.12.0.tgz", + "integrity": "sha512-/j1U3PEwdan0n6P/QqSnSpNSLC5+cEMvyljd5CnmNmUjDlGrys+vFEOwjVEnqELIiAGMHEA/Nl3CiKVFBUYqyQ==", "requires": { "@algolia/events": "^4.0.1" } @@ -19090,12 +19140,12 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "autoprefixer": { - "version": "10.4.12", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", - "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001407", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -19312,14 +19362,14 @@ } }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" } }, "buffer-from": { @@ -19417,9 +19467,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001425", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz", - "integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==" + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==" }, "ccount": { "version": "1.1.0", @@ -19744,9 +19794,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "copy-text-to-clipboard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", - "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz", + "integrity": "sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==" }, "copy-to-clipboard": { "version": "3.3.2", @@ -20002,12 +20052,12 @@ } }, "cssnano-preset-advanced": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz", - "integrity": "sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", "requires": { - "autoprefixer": "^10.3.7", - "cssnano-preset-default": "^5.2.12", + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", "postcss-discard-unused": "^5.1.0", "postcss-merge-idents": "^5.1.1", "postcss-reduce-idents": "^5.2.0", @@ -20015,24 +20065,24 @@ } }, "cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "requires": { - "css-declaration-sorter": "^6.3.0", + "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", + "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", @@ -20040,11 +20090,11 @@ "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-initial": "^5.1.2", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" @@ -21043,9 +21093,9 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "eta": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", - "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.0.1.tgz", + "integrity": "sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg==" }, "etag": { "version": "1.8.1", @@ -21405,9 +21455,9 @@ "devOptional": true }, "flux": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", - "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", "requires": { "fbemitter": "^3.0.0", "fbjs": "^3.0.1" @@ -22059,14 +22109,14 @@ } }, "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "requires": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "http-cache-semantics": { @@ -22187,9 +22237,9 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, "infima": { - "version": "0.2.0-alpha.42", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", - "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==" + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==" }, "inflight": { "version": "1.0.6", @@ -23858,9 +23908,9 @@ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, "normalize-path": { "version": "3.0.0", @@ -24161,9 +24211,9 @@ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "requires": { "entities": "^4.4.0" } @@ -24350,22 +24400,22 @@ } }, "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" } }, "postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "requires": { - "browserslist": "^4.20.3", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -24421,20 +24471,20 @@ } }, "postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "requires": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "stylehacks": "^5.1.1" } }, "postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" @@ -24459,11 +24509,11 @@ } }, "postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } @@ -24555,11 +24605,11 @@ } }, "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -24598,11 +24648,11 @@ } }, "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" } }, @@ -24624,9 +24674,9 @@ } }, "postcss-sort-media-queries": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", - "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", "requires": { "sort-css-media-queries": "2.1.0" } @@ -25047,11 +25097,11 @@ } }, "react-textarea-autosize": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", - "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz", + "integrity": "sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==", "requires": { - "@babel/runtime": "^7.10.2", + "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" } @@ -25117,9 +25167,9 @@ } }, "regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regenerator-transform": { "version": "0.15.0", @@ -26162,11 +26212,11 @@ } }, "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" } }, @@ -26503,9 +26553,9 @@ "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==" }, "ua-parser-js": { - "version": "0.7.32", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", - "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==" + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==" }, "unbox-primitive": { "version": "1.0.2", @@ -26845,6 +26895,12 @@ "use-isomorphic-layout-effect": "^1.1.1" } }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/docs/package.json b/docs/package.json index 918fd173..33742311 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,8 +15,8 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "^2.1.0", - "@docusaurus/preset-classic": "^2.1.0", + "@docusaurus/core": "^2.4.0", + "@docusaurus/preset-classic": "^2.4.0", "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.1.18", @@ -43,12 +43,12 @@ ] }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.1.0", - "@docusaurus/types": "^2.1.0", - "@tsconfig/docusaurus": "^1.0.5", + "@docusaurus/module-type-aliases": "^2.4.0", + "@docusaurus/types": "^2.4.0", + "@tsconfig/docusaurus": "^1.0.7", "@types/js-yaml": "^4.0.5", - "@types/react": "^17.0.3", - "@types/react-helmet": "^6.1.5", + "@types/react": "^17.0.58", + "@types/react-helmet": "^6.1.6", "@types/react-router-dom": "^5.1.7", "eslint": "^8.39.0", "eslint-config-prettier": "^8.8.0", From c6bf95a901164e57d87d76cc65962434bba7b25d Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 00:41:08 -0500 Subject: [PATCH 231/289] chore: Update fontawesome --- docs/package-lock.json | 64 +++++++++++++++++++++--------------------- docs/package.json | 6 ++-- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index ac8c947e..6f2ab304 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -10,9 +10,9 @@ "dependencies": { "@docusaurus/core": "^2.4.0", "@docusaurus/preset-classic": "^2.4.0", - "@fortawesome/fontawesome-svg-core": "^1.2.32", - "@fortawesome/free-solid-svg-icons": "^5.15.3", - "@fortawesome/react-fontawesome": "^0.1.18", + "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@fortawesome/react-fontawesome": "^0.2.0", "@mdx-js/react": "^1.6.22", "classnames": "^2.2.6", "js-yaml": "^4.1.0", @@ -2695,48 +2695,48 @@ } }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", - "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "1.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", - "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", + "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.4.0" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", - "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.4.0" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/react-fontawesome": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", - "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", "dependencies": { "prop-types": "^15.8.1" }, "peerDependencies": { "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "react": ">=16.x" + "react": ">=16.3" } }, "node_modules/@hapi/hoek": { @@ -17900,30 +17900,30 @@ "devOptional": true }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", - "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==" + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", - "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", + "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.4.0" } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", - "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.4.0" } }, "@fortawesome/react-fontawesome": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", - "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", "requires": { "prop-types": "^15.8.1" } diff --git a/docs/package.json b/docs/package.json index 33742311..44274bec 100644 --- a/docs/package.json +++ b/docs/package.json @@ -17,9 +17,9 @@ "dependencies": { "@docusaurus/core": "^2.4.0", "@docusaurus/preset-classic": "^2.4.0", - "@fortawesome/fontawesome-svg-core": "^1.2.32", - "@fortawesome/free-solid-svg-icons": "^5.15.3", - "@fortawesome/react-fontawesome": "^0.1.18", + "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@fortawesome/react-fontawesome": "^0.2.0", "@mdx-js/react": "^1.6.22", "classnames": "^2.2.6", "js-yaml": "^4.1.0", From dae020787e5b29290e5cbd564fb5cdc4d29a0324 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 16:55:01 -0500 Subject: [PATCH 232/289] docs: Update tree-sitter Updated web-tree-sitter and the devicetree grammar. web-tree-sitter now supports a custom function to locate its .wasm file, so performing a string replace is no longer necessary to get it to work with Docusaurus' Webpack configuration. We now check when tree-sitter is locating its .wasm file and provide the Webpack-adjusted URL. --- docs/package-lock.json | 14 ++++---- docs/package.json | 2 +- .../docusaurus-tree-sitter-plugin/index.js | 30 ------------------ docs/src/keymap-upgrade.js | 15 ++++++++- docs/static/tree-sitter-devicetree.wasm | Bin 34601 -> 40229 bytes 5 files changed, 22 insertions(+), 39 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 6f2ab304..3183a51c 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -21,7 +21,7 @@ "react-copy-to-clipboard": "^5.0.3", "react-dom": "^17.0.2", "react-toastify": "^7.0.4", - "web-tree-sitter": "^0.19.4" + "web-tree-sitter": "^0.20.8" }, "devDependencies": { "@docusaurus/module-type-aliases": "^2.4.0", @@ -15391,9 +15391,9 @@ } }, "node_modules/web-tree-sitter": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.19.4.tgz", - "integrity": "sha512-8G0xBj05hqZybCqBtW7RPZ/hWEtP3DiLTauQzGJZuZYfVRgw7qj7iaZ+8djNqJ4VPrdOO+pS2dR1JsTbsLxdYg==" + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz", + "integrity": "sha512-weOVgZ3aAARgdnb220GqYuh7+rZU0Ka9k9yfKtGAzEYMa6GgiCzW9JjQRJyCJakvibQW+dfjJdihjInKuuCAUQ==" }, "node_modules/webidl-conversions": { "version": "3.0.1", @@ -27040,9 +27040,9 @@ "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" }, "web-tree-sitter": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.19.4.tgz", - "integrity": "sha512-8G0xBj05hqZybCqBtW7RPZ/hWEtP3DiLTauQzGJZuZYfVRgw7qj7iaZ+8djNqJ4VPrdOO+pS2dR1JsTbsLxdYg==" + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz", + "integrity": "sha512-weOVgZ3aAARgdnb220GqYuh7+rZU0Ka9k9yfKtGAzEYMa6GgiCzW9JjQRJyCJakvibQW+dfjJdihjInKuuCAUQ==" }, "webidl-conversions": { "version": "3.0.1", diff --git a/docs/package.json b/docs/package.json index 44274bec..15d5aa38 100644 --- a/docs/package.json +++ b/docs/package.json @@ -28,7 +28,7 @@ "react-copy-to-clipboard": "^5.0.3", "react-dom": "^17.0.2", "react-toastify": "^7.0.4", - "web-tree-sitter": "^0.19.4" + "web-tree-sitter": "^0.20.8" }, "browserslist": { "production": [ diff --git a/docs/src/docusaurus-tree-sitter-plugin/index.js b/docs/src/docusaurus-tree-sitter-plugin/index.js index e782aea8..a6952ce7 100644 --- a/docs/src/docusaurus-tree-sitter-plugin/index.js +++ b/docs/src/docusaurus-tree-sitter-plugin/index.js @@ -16,36 +16,6 @@ module.exports = function () { test: /web-tree-sitter/, loader: "null-loader", }); - } else { - // The way web-tree-sitter loads tree-sitter.wasm isn't something that - // Docusaurus/Webpack identify as an asset. There is currently no way to - // set location of the file other than patching web-tree-sitter. - // (see https://github.com/tree-sitter/tree-sitter/issues/559) - rules.push({ - test: /tree-sitter\.js$/, - loader: "string-replace-loader", - options: { - multiple: [ - // Replace the path to tree-sitter.wasm with a "new URL()" to clue - // Webpack in that it is an asset. - { - search: '"tree-sitter.wasm"', - replace: '(new URL("tree-sitter.wasm", import.meta.url)).href', - strict: true, - }, - // Webpack replaces "new URL()" with the full URL to the asset, but - // web-tree-sitter will still add a prefix to it unless there is a - // Module.locateFile() function. - { - search: "var Module=void 0!==Module?Module:{};", - replace: `var Module = { - locateFile: (path, prefix) => path.startsWith('http') ? path : prefix + path, - };`, - strict: true, - }, - ], - }, - }); } return { diff --git a/docs/src/keymap-upgrade.js b/docs/src/keymap-upgrade.js index 19a5d8e3..788ab31a 100644 --- a/docs/src/keymap-upgrade.js +++ b/docs/src/keymap-upgrade.js @@ -2,10 +2,23 @@ import Parser from "web-tree-sitter"; import { Codes, Behaviors } from "./data/keymap-upgrade"; +const TREE_SITTER_WASM_URL = new URL( + "/node_modules/web-tree-sitter/tree-sitter.wasm", + import.meta.url +); + let Devicetree; export async function initParser() { - await Parser.init(); + await Parser.init({ + locateFile: (path, prefix) => { + // When locating tree-sitter.wasm, use a path that Webpack can map to the correct URL. + if (path == "tree-sitter.wasm") { + return TREE_SITTER_WASM_URL.href; + } + return prefix + path; + }, + }); Devicetree = await Parser.Language.load("/tree-sitter-devicetree.wasm"); } diff --git a/docs/static/tree-sitter-devicetree.wasm b/docs/static/tree-sitter-devicetree.wasm index fbcb0f18a70a75cc57c24aa7ae0a4b00aad5a95b..cce5ac9656c93720f1840dd7d89cb23b19d6e66b 100644 GIT binary patch literal 40229 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 J66B|X{s#)Tb{_x$ literal 34601 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 VuYJt0y Date: Mon, 24 Apr 2023 20:22:42 -0500 Subject: [PATCH 233/289] fix(docs): Fix typescript error See https://github.com/facebook/docusaurus/issues/8226#issuecomment-1420620198 --- docs/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tsconfig.json b/docs/tsconfig.json index 589217e2..a9844e97 100644 --- a/docs/tsconfig.json +++ b/docs/tsconfig.json @@ -3,7 +3,7 @@ "include": ["src/"], "compilerOptions": { "types": ["node", "@docusaurus/theme-classic"], - "moduleResolution": "Node", + "moduleResolution": "Node16", "esModuleInterop": true, "resolveJsonModule": true, "strict": true, From b021d19255122883c4ccd1887ffa0bba5df076b0 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 14 May 2023 12:12:59 -0700 Subject: [PATCH 234/289] fix(display): Imply LVGL mono theme when display is enabled All displays currently used with ZMK are monochrome so it makes sense to enable the mono theme by default, which can be disabled by the user since we use the "imply" statement. Without this theme setting, the small font size selection for widgets at the bottom of the stock status screen does not work. --- app/src/display/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index 32be2a27..cb086b4c 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -9,6 +9,7 @@ menuconfig ZMK_DISPLAY select LV_THEMES select LV_THEME_MONO select LV_CONF_MINIMAL + imply LV_USE_THEME_MONO if ZMK_DISPLAY From 7e29166c6ce4987de58de2e8a5545dca68312dfd Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 14 May 2023 12:40:11 -0700 Subject: [PATCH 235/289] refactor(display): Clean up unused theme Kconfig --- app/src/display/Kconfig | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index cb086b4c..5f67bf11 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -6,8 +6,6 @@ menuconfig ZMK_DISPLAY default n select DISPLAY select LVGL - select LV_THEMES - select LV_THEME_MONO select LV_CONF_MINIMAL imply LV_USE_THEME_MONO From 864394b40a7599a1560782226168cd6e40244c5a Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 14 May 2023 12:20:24 -0700 Subject: [PATCH 236/289] feat(display): Add setting to invert display colors Add CONFIG_ZMK_DISPLAY_INVERT Kconfig to invert colors (black-on-white to white-on-black) on monochrome screens. Currently applies only if CONFIG_LV_USE_THEME_MONO is selected, which is the default unless user overrides it. --- app/src/display/Kconfig | 7 +++++++ app/src/display/main.c | 3 ++- docs/docs/config/displays.md | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index 5f67bf11..63ba968b 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -15,6 +15,13 @@ config ZMK_DISPLAY_BLANK_ON_IDLE bool "Blank display on idle" default y if SSD1306 +if LV_USE_THEME_MONO + +config ZMK_DISPLAY_INVERT + bool "Invert display colors" + +endif + choice LV_TXT_ENC default LV_TXT_ENC_UTF8 diff --git a/app/src/display/main.c b/app/src/display/main.c index e34f8a53..e15e2de0 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -91,7 +91,8 @@ int zmk_display_is_initialized() { return initialized; } static void initialize_theme() { #if IS_ENABLED(CONFIG_LV_USE_THEME_MONO) lv_disp_t *disp = lv_disp_get_default(); - lv_theme_t *theme = lv_theme_mono_init(disp, false, CONFIG_LV_FONT_DEFAULT); + lv_theme_t *theme = + lv_theme_mono_init(disp, IS_ENABLED(CONFIG_ZMK_DISPLAY_INVERT), CONFIG_LV_FONT_DEFAULT); theme->font_small = CONFIG_ZMK_LV_FONT_DEFAULT_SMALL; disp->theme = theme; diff --git a/docs/docs/config/displays.md b/docs/docs/config/displays.md index d126e38a..a68bf26a 100644 --- a/docs/docs/config/displays.md +++ b/docs/docs/config/displays.md @@ -17,12 +17,15 @@ Definition files: | Config | Type | Description | Default | | -------------------------------------------------- | ---- | -------------------------------------------------------------- | ------- | | `CONFIG_ZMK_DISPLAY` | bool | Enable support for displays | n | +| `CONFIG_ZMK_DISPLAY_INVERT` | bool | Invert display colors from black-on-white to white-on-black | n | | `CONFIG_ZMK_WIDGET_LAYER_STATUS` | bool | Enable a widget to show the highest, active layer | y | | `CONFIG_ZMK_WIDGET_BATTERY_STATUS` | bool | Enable a widget to show battery charge information | y | | `CONFIG_ZMK_WIDGET_BATTERY_STATUS_SHOW_PERCENTAGE` | bool | If battery widget is enabled, show percentage instead of icons | n | | `CONFIG_ZMK_WIDGET_OUTPUT_STATUS` | bool | Enable a widget to show the current output (USB/BLE) | y | | `CONFIG_ZMK_WIDGET_WPM_STATUS` | bool | Enable a widget to show words per minute | n | +Note that `CONFIG_ZMK_DISPLAY_INVERT` setting might not work as expected with custom status screens that utilize images. + If `CONFIG_ZMK_DISPLAY` is enabled, exactly zero or one of the following options must be set to `y`. The first option is used if none are set. | Config | Description | From 5aac2743b10c69be000038cd03e51f5a284fa6cc Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 5 May 2023 22:56:58 -0700 Subject: [PATCH 237/289] fix(bluetooth): Improved checking for conn status. * Check the actual connection status before considering a discovered connection as connected. --- app/src/ble.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/ble.c b/app/src/ble.c index a7037d0c..c7bdc401 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -118,6 +118,7 @@ void set_profile_address(uint8_t index, const bt_addr_le_t *addr) { bool zmk_ble_active_profile_is_connected() { struct bt_conn *conn; + struct bt_conn_info info; bt_addr_le_t *addr = zmk_ble_active_profile_addr(); if (!bt_addr_le_cmp(addr, BT_ADDR_LE_ANY)) { return false; @@ -125,9 +126,11 @@ bool zmk_ble_active_profile_is_connected() { return false; } + bt_conn_get_info(conn, &info); + bt_conn_unref(conn); - return true; + return info.state == BT_CONN_STATE_CONNECTED; } #define CHECKED_ADV_STOP() \ From 1adfcf92bf96cd6453e6bb3ae8cc3b2d1fa8caa4 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Mon, 29 May 2023 00:28:45 -0400 Subject: [PATCH 238/289] refactor(split): fix inconsistency in Kconfig names --- app/include/zmk/ble.h | 2 +- app/src/keymap.c | 2 +- app/src/split/bluetooth/Kconfig | 4 ++-- app/src/split/bluetooth/central.c | 12 ++++++------ docs/docs/config/system.md | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/include/zmk/ble.h b/app/include/zmk/ble.h index 4380a33a..1c84777d 100644 --- a/app/include/zmk/ble.h +++ b/app/include/zmk/ble.h @@ -15,7 +15,7 @@ #if ZMK_BLE_IS_CENTRAL #define ZMK_BLE_PROFILE_COUNT (CONFIG_BT_MAX_PAIRED - 1) -#define ZMK_BLE_SPLIT_PERIPHERAL_COUNT 1 +#define ZMK_SPLIT_BLE_PERIPHERAL_COUNT 1 #else #define ZMK_BLE_PROFILE_COUNT CONFIG_BT_MAX_PAIRED #endif diff --git a/app/src/keymap.c b/app/src/keymap.c index 909fd20d..da25fc09 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -218,7 +218,7 @@ int zmk_keymap_apply_position_state(uint8_t source, int layer, uint32_t position #endif case BEHAVIOR_LOCALITY_GLOBAL: #if ZMK_BLE_IS_CENTRAL - for (int i = 0; i < ZMK_BLE_SPLIT_PERIPHERAL_COUNT; i++) { + for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { zmk_split_bt_invoke_behavior(i, &binding, event, pressed); } #endif diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index 53119d82..005d75fd 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -21,11 +21,11 @@ config ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE int "Max number of key position state events to queue when received from peripherals" default 5 -config ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE +config ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_STACK_SIZE int "BLE split central write thread stack size" default 512 -config ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE +config ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_QUEUE_SIZE int "Max number of behavior run events to queue to send to the peripheral(s)" default 5 diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index ac073c59..a7c0d8a9 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -47,7 +47,7 @@ struct peripheral_slot { uint8_t changed_positions[POSITION_STATE_DATA_LEN]; }; -static struct peripheral_slot peripherals[ZMK_BLE_SPLIT_PERIPHERAL_COUNT]; +static struct peripheral_slot peripherals[ZMK_SPLIT_BLE_PERIPHERAL_COUNT]; static const struct bt_uuid_128 split_service_uuid = BT_UUID_INIT_128(ZMK_SPLIT_BT_SERVICE_UUID); @@ -65,7 +65,7 @@ void peripheral_event_work_callback(struct k_work *work) { K_WORK_DEFINE(peripheral_event_work, peripheral_event_work_callback); int peripheral_slot_index_for_conn(struct bt_conn *conn) { - for (int i = 0; i < ZMK_BLE_SPLIT_PERIPHERAL_COUNT; i++) { + for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { if (peripherals[i].conn == conn) { return i; } @@ -84,7 +84,7 @@ struct peripheral_slot *peripheral_slot_for_conn(struct bt_conn *conn) { } int release_peripheral_slot(int index) { - if (index < 0 || index >= ZMK_BLE_SPLIT_PERIPHERAL_COUNT) { + if (index < 0 || index >= ZMK_SPLIT_BLE_PERIPHERAL_COUNT) { return -EINVAL; } @@ -131,7 +131,7 @@ int release_peripheral_slot(int index) { } int reserve_peripheral_slot() { - for (int i = 0; i < ZMK_BLE_SPLIT_PERIPHERAL_COUNT; i++) { + for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { if (peripherals[i].state == PERIPHERAL_SLOT_STATE_OPEN) { // Be sure the slot is fully reinitialized. release_peripheral_slot(i); @@ -504,7 +504,7 @@ static struct bt_conn_cb conn_callbacks = { }; K_THREAD_STACK_DEFINE(split_central_split_run_q_stack, - CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE); + CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_STACK_SIZE); struct k_work_q split_central_split_run_q; @@ -515,7 +515,7 @@ struct zmk_split_run_behavior_payload_wrapper { K_MSGQ_DEFINE(zmk_split_central_split_run_msgq, sizeof(struct zmk_split_run_behavior_payload_wrapper), - CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE, 4); + CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_QUEUE_SIZE, 4); void split_central_split_run_callback(struct k_work *work) { struct zmk_split_run_behavior_payload_wrapper payload_wrapper; diff --git a/docs/docs/config/system.md b/docs/docs/config/system.md index a5347b96..5a5ae5a5 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -97,8 +97,8 @@ Following split keyboard settings are defined in [zmk/app/src/split/Kconfig](htt | `CONFIG_ZMK_SPLIT_BLE` | bool | Use BLE to communicate between split keyboard halves | y | | `CONFIG_ZMK_SPLIT_ROLE_CENTRAL` | bool | `y` for central device, `n` for peripheral | | | `CONFIG_ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue when received from peripherals | 5 | -| `CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE` | int | Stack size of the BLE split central write thread | 512 | -| `CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE` | int | Max number of behavior run events to queue to send to the peripheral(s) | 5 | +| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_STACK_SIZE` | int | Stack size of the BLE split central write thread | 512 | +| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_QUEUE_SIZE` | int | Max number of behavior run events to queue to send to the peripheral(s) | 5 | | `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE` | int | Stack size of the BLE split peripheral notify thread | 650 | | `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY` | int | Priority of the BLE split peripheral notify thread | 5 | | `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue to send to the central | 10 | From b276a3bfb074a869ca101bdaba924c936eeb04ec Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Tue, 6 Dec 2022 00:13:01 -0600 Subject: [PATCH 239/289] refactor(kscan): batch GPIO reads by port Changed the GPIO matrix and direct GPIO key scan drivers to do a single read per port instead of one read per pin. This is much more efficient for some types of GPIO drivers, such as I2C GPIO expanders. To accomplish this with minimal overhead, we now sort input pins by port at driver init. if we iterate through the pins in the sorted order, all pins on the same port are consecutive, so we only need to read each port once the first time we see it. --- app/drivers/kscan/CMakeLists.txt | 1 + app/drivers/kscan/kscan_gpio.c | 33 ++++++++ app/drivers/kscan/kscan_gpio.h | 61 ++++++++++++++ app/drivers/kscan/kscan_gpio_direct.c | 72 +++++++++-------- app/drivers/kscan/kscan_gpio_matrix.c | 110 +++++++++++++------------- 5 files changed, 188 insertions(+), 89 deletions(-) create mode 100644 app/drivers/kscan/kscan_gpio.c create mode 100644 app/drivers/kscan/kscan_gpio.h diff --git a/app/drivers/kscan/CMakeLists.txt b/app/drivers/kscan/CMakeLists.txt index ced31e6f..8fc7ed58 100644 --- a/app/drivers/kscan/CMakeLists.txt +++ b/app/drivers/kscan/CMakeLists.txt @@ -5,6 +5,7 @@ zephyr_library_named(zmk__drivers__kscan) zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DRIVER debounce.c) +zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DRIVER kscan_gpio.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_MATRIX kscan_gpio_matrix.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DIRECT kscan_gpio_direct.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DEMUX kscan_gpio_demux.c) diff --git a/app/drivers/kscan/kscan_gpio.c b/app/drivers/kscan/kscan_gpio.c new file mode 100644 index 00000000..4963f678 --- /dev/null +++ b/app/drivers/kscan/kscan_gpio.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "kscan_gpio.h" + +#include + +static int compare_ports(const void *a, const void *b) { + const struct kscan_gpio *gpio_a = a; + const struct kscan_gpio *gpio_b = b; + + return gpio_a->spec.port - gpio_b->spec.port; +} + +void kscan_gpio_list_sort_by_port(struct kscan_gpio_list *list) { + qsort(list->gpios, list->len, sizeof(list->gpios[0]), compare_ports); +} + +int kscan_gpio_pin_get(const struct kscan_gpio *gpio, struct kscan_gpio_port_state *state) { + if (gpio->spec.port != state->port) { + state->port = gpio->spec.port; + + const int err = gpio_port_get(state->port, &state->value); + if (err) { + return err; + } + } + + return (state->value & BIT(gpio->spec.pin)) != 0; +} diff --git a/app/drivers/kscan/kscan_gpio.h b/app/drivers/kscan/kscan_gpio.h new file mode 100644 index 00000000..39343136 --- /dev/null +++ b/app/drivers/kscan/kscan_gpio.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +struct kscan_gpio { + struct gpio_dt_spec spec; + /** The index of the GPIO in the devicetree *-gpios array. */ + size_t index; +}; + +/** GPIO_DT_SPEC_GET_BY_IDX(), but for a struct kscan_gpio. */ +#define KSCAN_GPIO_GET_BY_IDX(node_id, prop, idx) \ + ((struct kscan_gpio){.spec = GPIO_DT_SPEC_GET_BY_IDX(node_id, prop, idx), .index = idx}) + +struct kscan_gpio_list { + struct kscan_gpio *gpios; + size_t len; +}; + +/** Define a kscan_gpio_list from a compile-time GPIO array. */ +#define KSCAN_GPIO_LIST(gpio_array) \ + ((struct kscan_gpio_list){.gpios = gpio_array, .len = ARRAY_SIZE(gpio_array)}) + +struct kscan_gpio_port_state { + const struct device *port; + gpio_port_value_t value; +}; + +/** + * Sorts a GPIO list by port so it can be used with kscan_gpio_pin_get(). + */ +void kscan_gpio_list_sort_by_port(struct kscan_gpio_list *list); + +/** + * Get logical level of an input pin. + * + * This is equivalent to gpio_pin_get() except that, when iterating through the + * pins in a list which is sorted by kscan_gpio_list_sort_by_port(), it only + * performs one read per port instead of one read per pin. + * + * @param gpio The input pin to read. + * @param state An object to track state between reads. Must be zero-initialized before the first + * use. + * + * @retval 1 If pin logical value is 1 / active. + * @retval 0 If pin logical value is 0 / inactive. + * @retval -EIO I/O error when accessing an external GPIO chip. + * @retval -EWOULDBLOCK if operation would block. + */ +int kscan_gpio_pin_get(const struct kscan_gpio *gpio, struct kscan_gpio_port_state *state); diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/drivers/kscan/kscan_gpio_direct.c index 586e0d95..d43d716b 100644 --- a/app/drivers/kscan/kscan_gpio_direct.c +++ b/app/drivers/kscan/kscan_gpio_direct.c @@ -5,6 +5,7 @@ */ #include "debounce.h" +#include "kscan_gpio.h" #include #include @@ -41,7 +42,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define INST_INPUTS_LEN(n) DT_INST_PROP_LEN(n, input_gpios) #define KSCAN_DIRECT_INPUT_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), input_gpios, idx) + KSCAN_GPIO_GET_BY_IDX(DT_DRV_INST(inst_idx), input_gpios, idx) struct kscan_direct_irq_callback { const struct device *dev; @@ -50,6 +51,7 @@ struct kscan_direct_irq_callback { struct kscan_direct_data { const struct device *dev; + struct kscan_gpio_list inputs; kscan_callback_t callback; struct k_work_delayable work; #if USE_INTERRUPTS @@ -62,17 +64,7 @@ struct kscan_direct_data { struct debounce_state *pin_state; }; -struct kscan_gpio_list { - const struct gpio_dt_spec *gpios; - size_t len; -}; - -/** Define a kscan_gpio_list from a compile-time GPIO array. */ -#define KSCAN_GPIO_LIST(gpio_array) \ - ((struct kscan_gpio_list){.gpios = gpio_array, .len = ARRAY_SIZE(gpio_array)}) - struct kscan_direct_config { - struct kscan_gpio_list inputs; struct debounce_config debounce_config; int32_t debounce_scan_period_ms; int32_t poll_period_ms; @@ -81,10 +73,10 @@ struct kscan_direct_config { #if USE_INTERRUPTS static int kscan_direct_interrupt_configure(const struct device *dev, const gpio_flags_t flags) { - const struct kscan_direct_config *config = dev->config; + const struct kscan_direct_data *data = dev->data; - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; + for (int i = 0; i < data->inputs.len; i++) { + const struct gpio_dt_spec *gpio = &data->inputs.gpios[i].spec; int err = gpio_pin_interrupt_configure_dt(gpio, flags); if (err) { @@ -134,16 +126,16 @@ static gpio_flags_t kscan_gpio_get_extra_flags(const struct gpio_dt_spec *gpio, static int kscan_inputs_set_flags(const struct kscan_gpio_list *inputs, const struct gpio_dt_spec *active_gpio) { - gpio_flags_t extra_flags; for (int i = 0; i < inputs->len; i++) { - extra_flags = GPIO_INPUT | kscan_gpio_get_extra_flags(&inputs->gpios[i], - &inputs->gpios[i] == active_gpio); + const bool active = &inputs->gpios[i].spec == active_gpio; + const gpio_flags_t extra_flags = + GPIO_INPUT | kscan_gpio_get_extra_flags(&inputs->gpios[i].spec, active); LOG_DBG("Extra flags equal to: %d", extra_flags); - int err = gpio_pin_configure_dt(&inputs->gpios[i], extra_flags); + int err = gpio_pin_configure_dt(&inputs->gpios[i].spec, extra_flags); if (err) { - LOG_ERR("Unable to configure flags on pin %d on %s", inputs->gpios[i].pin, - inputs->gpios[i].port->name); + LOG_ERR("Unable to configure flags on pin %d on %s", inputs->gpios[i].spec.pin, + inputs->gpios[i].spec.port->name); return err; } } @@ -179,28 +171,35 @@ static int kscan_direct_read(const struct device *dev) { const struct kscan_direct_config *config = dev->config; // Read the inputs. - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; + struct kscan_gpio_port_state state = {0}; - const bool active = gpio_pin_get_dt(gpio); + for (int i = 0; i < data->inputs.len; i++) { + const struct kscan_gpio *gpio = &data->inputs.gpios[i]; - debounce_update(&data->pin_state[i], active, config->debounce_scan_period_ms, + const int active = kscan_gpio_pin_get(gpio, &state); + if (active < 0) { + LOG_ERR("Failed to read port %s: %i", gpio->spec.port->name, active); + return active; + } + + debounce_update(&data->pin_state[gpio->index], active, config->debounce_scan_period_ms, &config->debounce_config); } // Process the new state. bool continue_scan = false; - for (int i = 0; i < config->inputs.len; i++) { - struct debounce_state *state = &data->pin_state[i]; + for (int i = 0; i < data->inputs.len; i++) { + const struct kscan_gpio *gpio = &data->inputs.gpios[i]; + struct debounce_state *state = &data->pin_state[gpio->index]; if (debounce_get_changed(state)) { const bool pressed = debounce_is_pressed(state); - LOG_DBG("Sending event at 0,%i state %s", i, pressed ? "on" : "off"); - data->callback(dev, 0, i, pressed); + LOG_DBG("Sending event at 0,%i state %s", gpio->index, pressed ? "on" : "off"); + data->callback(dev, 0, gpio->index, pressed); if (config->toggle_mode && pressed) { - kscan_inputs_set_flags(&config->inputs, &config->inputs.gpios[i]); + kscan_inputs_set_flags(&data->inputs, &gpio->spec); } } @@ -289,10 +288,11 @@ static int kscan_direct_init_input_inst(const struct device *dev, const struct g } static int kscan_direct_init_inputs(const struct device *dev) { + const struct kscan_direct_data *data = dev->data; const struct kscan_direct_config *config = dev->config; - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; + for (int i = 0; i < data->inputs.len; i++) { + const struct gpio_dt_spec *gpio = &data->inputs.gpios[i].spec; int err = kscan_direct_init_input_inst(dev, gpio, i, config->toggle_mode); if (err) { return err; @@ -307,6 +307,9 @@ static int kscan_direct_init(const struct device *dev) { data->dev = dev; + // Sort inputs by port so we can read each port just once per scan. + kscan_gpio_list_sort_by_port(&data->inputs); + kscan_direct_init_inputs(dev); k_work_init_delayable(&data->work, kscan_direct_work_handler); @@ -326,7 +329,7 @@ static const struct kscan_driver_api kscan_direct_api = { BUILD_ASSERT(INST_DEBOUNCE_RELEASE_MS(n) <= DEBOUNCE_COUNTER_MAX, \ "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ - static const struct gpio_dt_spec kscan_direct_inputs_##n[] = { \ + static struct kscan_gpio kscan_direct_inputs_##n[] = { \ LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, (, ), n)}; \ \ static struct debounce_state kscan_direct_state_##n[INST_INPUTS_LEN(n)]; \ @@ -335,10 +338,11 @@ static const struct kscan_driver_api kscan_direct_api = { (static struct kscan_direct_irq_callback kscan_direct_irqs_##n[INST_INPUTS_LEN(n)];)) \ \ static struct kscan_direct_data kscan_direct_data_##n = { \ - .pin_state = kscan_direct_state_##n, COND_INTERRUPTS((.irqs = kscan_direct_irqs_##n, ))}; \ + .inputs = KSCAN_GPIO_LIST(kscan_direct_inputs_##n), \ + .pin_state = kscan_direct_state_##n, \ + COND_INTERRUPTS((.irqs = kscan_direct_irqs_##n, ))}; \ \ static struct kscan_direct_config kscan_direct_config_##n = { \ - .inputs = KSCAN_GPIO_LIST(kscan_direct_inputs_##n), \ .debounce_config = \ { \ .debounce_press_ms = INST_DEBOUNCE_PRESS_MS(n), \ diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index d2121273..b8e72044 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -5,6 +5,7 @@ */ #include "debounce.h" +#include "kscan_gpio.h" #include #include @@ -50,9 +51,9 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); COND_CODE_1(CONFIG_ZMK_KSCAN_MATRIX_POLLING, pollcode, intcode) #define KSCAN_GPIO_ROW_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), row_gpios, idx) + KSCAN_GPIO_GET_BY_IDX(DT_DRV_INST(inst_idx), row_gpios, idx) #define KSCAN_GPIO_COL_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), col_gpios, idx) + KSCAN_GPIO_GET_BY_IDX(DT_DRV_INST(inst_idx), col_gpios, idx) enum kscan_diode_direction { KSCAN_ROW2COL, @@ -66,6 +67,7 @@ struct kscan_matrix_irq_callback { struct kscan_matrix_data { const struct device *dev; + struct kscan_gpio_list inputs; kscan_callback_t callback; struct k_work_delayable work; #if USE_INTERRUPTS @@ -76,26 +78,16 @@ struct kscan_matrix_data { int64_t scan_time; /** * Current state of the matrix as a flattened 2D array of length - * (config->rows.len * config->cols.len) + * (config->rows * config->cols) */ struct debounce_state *matrix_state; }; -struct kscan_gpio_list { - const struct gpio_dt_spec *gpios; - size_t len; -}; - -/** Define a kscan_gpio_list from a compile-time GPIO array. */ -#define KSCAN_GPIO_LIST(gpio_array) \ - ((struct kscan_gpio_list){.gpios = gpio_array, .len = ARRAY_SIZE(gpio_array)}) - struct kscan_matrix_config { - struct kscan_gpio_list rows; - struct kscan_gpio_list cols; - struct kscan_gpio_list inputs; struct kscan_gpio_list outputs; struct debounce_config debounce_config; + size_t rows; + size_t cols; int32_t debounce_scan_period_ms; int32_t poll_period_ms; enum kscan_diode_direction diode_direction; @@ -105,10 +97,10 @@ struct kscan_matrix_config { * Get the index into a matrix state array from a row and column. */ static int state_index_rc(const struct kscan_matrix_config *config, const int row, const int col) { - __ASSERT(row < config->rows.len, "Invalid row %i", row); - __ASSERT(col < config->cols.len, "Invalid column %i", col); + __ASSERT(row < config->rows, "Invalid row %i", row); + __ASSERT(col < config->cols, "Invalid column %i", col); - return (col * config->rows.len) + row; + return (col * config->rows) + row; } /** @@ -125,7 +117,7 @@ static int kscan_matrix_set_all_outputs(const struct device *dev, const int valu const struct kscan_matrix_config *config = dev->config; for (int i = 0; i < config->outputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->outputs.gpios[i]; + const struct gpio_dt_spec *gpio = &config->outputs.gpios[i].spec; int err = gpio_pin_set_dt(gpio, value); if (err) { @@ -139,10 +131,10 @@ static int kscan_matrix_set_all_outputs(const struct device *dev, const int valu #if USE_INTERRUPTS static int kscan_matrix_interrupt_configure(const struct device *dev, const gpio_flags_t flags) { - const struct kscan_matrix_config *config = dev->config; + const struct kscan_matrix_data *data = dev->data; - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; + for (int i = 0; i < data->inputs.len; i++) { + const struct gpio_dt_spec *gpio = &data->inputs.gpios[i].spec; int err = gpio_pin_interrupt_configure_dt(gpio, flags); if (err) { @@ -226,32 +218,37 @@ static int kscan_matrix_read(const struct device *dev) { const struct kscan_matrix_config *config = dev->config; // Scan the matrix. - for (int o = 0; o < config->outputs.len; o++) { - const struct gpio_dt_spec *out_gpio = &config->outputs.gpios[o]; + for (int i = 0; i < config->outputs.len; i++) { + const struct kscan_gpio *out_gpio = &config->outputs.gpios[i]; - int err = gpio_pin_set_dt(out_gpio, 1); + int err = gpio_pin_set_dt(&out_gpio->spec, 1); if (err) { - LOG_ERR("Failed to set output %i active: %i", o, err); + LOG_ERR("Failed to set output %i active: %i", out_gpio->index, err); return err; } #if CONFIG_ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS > 0 k_busy_wait(CONFIG_ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS); #endif + struct kscan_gpio_port_state state = {0}; - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *in_gpio = &config->inputs.gpios[i]; + for (int j = 0; j < data->inputs.len; j++) { + const struct kscan_gpio *in_gpio = &data->inputs.gpios[j]; - const int index = state_index_io(config, i, o); - const bool active = gpio_pin_get_dt(in_gpio); + const int index = state_index_io(config, in_gpio->index, out_gpio->index); + const int active = kscan_gpio_pin_get(in_gpio, &state); + if (active < 0) { + LOG_ERR("Failed to read port %s: %i", in_gpio->spec.port->name, active); + return active; + } debounce_update(&data->matrix_state[index], active, config->debounce_scan_period_ms, &config->debounce_config); } - err = gpio_pin_set_dt(out_gpio, 0); + err = gpio_pin_set_dt(&out_gpio->spec, 0); if (err) { - LOG_ERR("Failed to set output %i inactive: %i", o, err); + LOG_ERR("Failed to set output %i inactive: %i", out_gpio->index, err); return err; } @@ -263,8 +260,8 @@ static int kscan_matrix_read(const struct device *dev) { // Process the new state. bool continue_scan = false; - for (int r = 0; r < config->rows.len; r++) { - for (int c = 0; c < config->cols.len; c++) { + for (int r = 0; r < config->rows; r++) { + for (int c = 0; c < config->cols; c++) { const int index = state_index_rc(config, r, c); struct debounce_state *state = &data->matrix_state[index]; @@ -329,28 +326,28 @@ static int kscan_matrix_disable(const struct device *dev) { #endif } -static int kscan_matrix_init_input_inst(const struct device *dev, const struct gpio_dt_spec *gpio, - const int index) { - if (!device_is_ready(gpio->port)) { - LOG_ERR("GPIO is not ready: %s", gpio->port->name); +static int kscan_matrix_init_input_inst(const struct device *dev, const struct kscan_gpio *gpio) { + if (!device_is_ready(gpio->spec.port)) { + LOG_ERR("GPIO is not ready: %s", gpio->spec.port->name); return -ENODEV; } - int err = gpio_pin_configure_dt(gpio, GPIO_INPUT); + int err = gpio_pin_configure_dt(&gpio->spec, GPIO_INPUT); if (err) { - LOG_ERR("Unable to configure pin %u on %s for input", gpio->pin, gpio->port->name); + LOG_ERR("Unable to configure pin %u on %s for input", gpio->spec.pin, + gpio->spec.port->name); return err; } - LOG_DBG("Configured pin %u on %s for input", gpio->pin, gpio->port->name); + LOG_DBG("Configured pin %u on %s for input", gpio->spec.pin, gpio->spec.port->name); #if USE_INTERRUPTS struct kscan_matrix_data *data = dev->data; - struct kscan_matrix_irq_callback *irq = &data->irqs[index]; + struct kscan_matrix_irq_callback *irq = &data->irqs[gpio->index]; irq->dev = dev; - gpio_init_callback(&irq->callback, kscan_matrix_irq_callback_handler, BIT(gpio->pin)); - err = gpio_add_callback(gpio->port, &irq->callback); + gpio_init_callback(&irq->callback, kscan_matrix_irq_callback_handler, BIT(gpio->spec.pin)); + err = gpio_add_callback(gpio->spec.port, &irq->callback); if (err) { LOG_ERR("Error adding the callback to the input device: %i", err); return err; @@ -361,11 +358,11 @@ static int kscan_matrix_init_input_inst(const struct device *dev, const struct g } static int kscan_matrix_init_inputs(const struct device *dev) { - const struct kscan_matrix_config *config = dev->config; + const struct kscan_matrix_data *data = dev->data; - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; - int err = kscan_matrix_init_input_inst(dev, gpio, i); + for (int i = 0; i < data->inputs.len; i++) { + const struct kscan_gpio *gpio = &data->inputs.gpios[i]; + int err = kscan_matrix_init_input_inst(dev, gpio); if (err) { return err; } @@ -396,7 +393,7 @@ static int kscan_matrix_init_outputs(const struct device *dev) { const struct kscan_matrix_config *config = dev->config; for (int i = 0; i < config->outputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->outputs.gpios[i]; + const struct gpio_dt_spec *gpio = &config->outputs.gpios[i].spec; int err = kscan_matrix_init_output_inst(dev, gpio); if (err) { return err; @@ -411,6 +408,9 @@ static int kscan_matrix_init(const struct device *dev) { data->dev = dev; + // Sort inputs by port so we can read each port just once per scan. + kscan_gpio_list_sort_by_port(&data->inputs); + kscan_matrix_init_inputs(dev); kscan_matrix_init_outputs(dev); kscan_matrix_set_all_outputs(dev, 0); @@ -432,10 +432,10 @@ static const struct kscan_driver_api kscan_matrix_api = { BUILD_ASSERT(INST_DEBOUNCE_RELEASE_MS(n) <= DEBOUNCE_COUNTER_MAX, \ "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ - static const struct gpio_dt_spec kscan_matrix_rows_##n[] = { \ + static struct kscan_gpio kscan_matrix_rows_##n[] = { \ LISTIFY(INST_ROWS_LEN(n), KSCAN_GPIO_ROW_CFG_INIT, (, ), n)}; \ \ - static const struct gpio_dt_spec kscan_matrix_cols_##n[] = { \ + static struct kscan_gpio kscan_matrix_cols_##n[] = { \ LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, (, ), n)}; \ \ static struct debounce_state kscan_matrix_state_##n[INST_MATRIX_LEN(n)]; \ @@ -444,14 +444,14 @@ static const struct kscan_driver_api kscan_matrix_api = { (static struct kscan_matrix_irq_callback kscan_matrix_irqs_##n[INST_INPUTS_LEN(n)];)) \ \ static struct kscan_matrix_data kscan_matrix_data_##n = { \ + .inputs = \ + KSCAN_GPIO_LIST(COND_DIODE_DIR(n, (kscan_matrix_cols_##n), (kscan_matrix_rows_##n))), \ .matrix_state = kscan_matrix_state_##n, \ COND_INTERRUPTS((.irqs = kscan_matrix_irqs_##n, ))}; \ \ static struct kscan_matrix_config kscan_matrix_config_##n = { \ - .rows = KSCAN_GPIO_LIST(kscan_matrix_rows_##n), \ - .cols = KSCAN_GPIO_LIST(kscan_matrix_cols_##n), \ - .inputs = \ - KSCAN_GPIO_LIST(COND_DIODE_DIR(n, (kscan_matrix_cols_##n), (kscan_matrix_rows_##n))), \ + .rows = ARRAY_SIZE(kscan_matrix_rows_##n), \ + .cols = ARRAY_SIZE(kscan_matrix_cols_##n), \ .outputs = \ KSCAN_GPIO_LIST(COND_DIODE_DIR(n, (kscan_matrix_rows_##n), (kscan_matrix_cols_##n))), \ .debounce_config = \ From a2af74f5ab4d2d7142791ae55cab11d59b29bc4d Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 29 May 2023 21:25:12 -0700 Subject: [PATCH 240/289] feat(docs): Add note on modifier functions to macros --- docs/docs/behaviors/macros.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/docs/behaviors/macros.md b/docs/docs/behaviors/macros.md index 1648892e..1628e0cb 100644 --- a/docs/docs/behaviors/macros.md +++ b/docs/docs/behaviors/macros.md @@ -33,7 +33,7 @@ A macro definition looks like: :::note The text before the colon (`:`) in the declaration of the macro node is the "node label", and is the text -used to reference the macro in your keymap +used to reference the macro in your keymap. ::: The macro can then be bound in your keymap by referencing it by the label `&zed_em_kay`, e.g.: @@ -44,6 +44,11 @@ The macro can then be bound in your keymap by referencing it by the label `&zed_ }; ``` +:::note +For use cases involving sending a single keycode with modifiers, for instance ctrl+tab, the [key press behavior](key-press.md) +with [modifier functions](../codes/modifiers.mdx#modifier-functions) can be used instead of a macro. +::: + ### Bindings Like [hold-taps](/docs/behaviors/hold-tap), macros are created by composing other behaviors, and any of those behaviors can From 0508718d6ce8b40adbe932b0bd9bb30ee5e0bbf5 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 29 May 2023 21:52:16 -0700 Subject: [PATCH 241/289] feat(docs): Add behavior types section for hold-tap --- docs/docs/behaviors/hold-tap.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index f0096606..2a8489a1 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -133,6 +133,23 @@ See the following example, which uses a hold-tap behavior definition, configured By default, `hold-trigger-key-positions` are evaluated upon the first _key press_ after the hold-tap. For homerow mods, this is not always ideal, because it prevents combining multiple modifiers unless they are included in `hold-trigger-key-positions`. To overwrite this behavior, one can set `hold-trigger-on-release`. If set to true, the evaluation of `hold-trigger-key-positions` gets delayed until _key release_. This allows combining multiple modifiers when the next key is _held_, while still deciding the hold-tap in favor of a tap when the next key is _tapped_. +#### Using different behavior types with hold-taps + +You can create instances of hold-taps invoking most [behavior types](../features/keymaps.md#behaviors) for hold or tap actions, by referencing their node labels in the `bindings` value. +The two parameters that are passed to the hold-tap in your keymap will be forwarded to the referred behaviors, first one to the hold behavior and second one to the tap. + +If you use behaviors that accept no parameters such as [mod-morphs](mod-morph.md) or [macros](macros.md), you can pass a dummy parameter value such as `0` to the hold-tap when you use it in your keymap. +For instance, a hold-tap with node label `caps` and `bindings = <&kp>, <&caps_word>;` can be used in the keymap as below to send the caps lock keycode on hold and invoke the [caps word behavior](caps-word.md) on tap: + +``` +&caps CAPS 0 +``` + +:::info +You cannot use behaviors that expect more than one parameter such as [`&bt`](bluetooth.md) and [`&rgb_ug`](underglow.md) with hold-taps, due to the limitations of the [devicetree keymap format](../config/index.md#devicetree-files). +One workaround is to create a [macro](macros.md) that invokes those behaviors and use the macro as the hold or tap action. +::: + ### Example Use-Cases Date: Mon, 29 May 2023 22:03:24 -0700 Subject: [PATCH 242/289] feat(docs): Add troubleshooting for Windows issue --- docs/docs/features/bluetooth.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md index f1a3e241..ff182398 100644 --- a/docs/docs/features/bluetooth.md +++ b/docs/docs/features/bluetooth.md @@ -57,3 +57,18 @@ If you attempt to pair a ZMK keyboard from macOS in a way that causes a bonding 1. Remove the keyboard from macOS using the Bluetooth control panel. 1. Invoke `&bt BT_CLR` on the keyboard while the profile associated with the macOS device is active, by pressing the correct keys for your particular keymap. 1. Try connecting again from macOS. + +### Windows Connected But Not Working + +Occasionally pairing the keyboard to a Windows device might result in a state where the keyboard is connected but does not send any key strokes. +If this occurs: + +1. Remove the keyboard from Windows using the Bluetooth settings. +1. Invoke `&bt BT_CLR` on the keyboard while the profile associated with the Windows device is active, by pressing the correct keys for your particular keymap. +1. Turn off Bluetooth from Windows settings, then turn it back on. +1. Pair the keyboard to the Windows device. + +If this doesn't help, try following the procedure above but replace step 3 with one of the following: + +- Restart the Windows device +- Open "Device Manager," turn on "Show hidden devices" from the "View" menu, then find and delete the keyboard under the "Bluetooth" item From 30ba4b08aed896d77fb7ade96ef0334d8f30af5d Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 29 May 2023 22:06:09 -0700 Subject: [PATCH 243/289] feat(docs): Add pointer to Bluetooth page in troubleshooting --- docs/docs/troubleshooting.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index 96f729b9..e8a05b6b 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -5,6 +5,8 @@ sidebar_title: Troubleshooting The following page provides suggestions for common errors that may occur during firmware compilation or other issues with keyboard usage. If the information provided is insufficient to resolve the issue, feel free to seek out help from the [ZMK Discord](https://zmk.dev/community/discord/invite). +Please also see [the troubleshooting section](features/bluetooth.md#troubleshooting) under the Bluetooth feature page. + ### File Transfer Error Variations of the warnings shown below occur when flashing the `.uf2` onto the microcontroller. This is because the microcontroller resets itself before the OS receives confirmation that the file transfer is complete. Errors like this are normal and can generally be ignored. Verification of a functional board can be done by attempting to pair your newly flashed keyboard to your computer via Bluetooth or plugging in a USB cable if `ZMK_USB` is enabled in your Kconfig.defconfig. From a9ad11f91e82e214d91cf9bf1586431060759f06 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 2 Jun 2023 18:42:50 -0700 Subject: [PATCH 244/289] refactor(docs): Move BT troubleshooting items to BT page --- docs/docs/features/bluetooth.md | 14 ++++++++++++++ docs/docs/troubleshooting.md | 16 +--------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md index ff182398..386ad70e 100644 --- a/docs/docs/features/bluetooth.md +++ b/docs/docs/features/bluetooth.md @@ -38,6 +38,20 @@ Management of the bluetooth in ZMK is accomplished using the [`&bt` behavior](.. ## Troubleshooting +### Connectivity Issues + +Some users may experience a poor connection between the keyboard and the host. This might be due to poor quality BLE hardware, a metal enclosure on the keyboard or host, or the distance between them. Increasing the transmit power of the keyboard's BLE radio may reduce the severity of this problem. To do this, set the `CONFIG_BT_CTLR_TX_PWR_PLUS_8` configuration value in the `.conf` file of your user config directory as such: + +``` +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y +``` + +For the `nRF52840`, the value `PLUS_8` can be set to any multiple of four between `MINUS_20` and `PLUS_8`. The default value for this config is `0`, but if you are having connection issues it is recommended to set it to `PLUS_8` because the power consumption difference is negligible. For more information on changing the transmit power of your BLE device, please refer to [the Zephyr docs.](https://docs.zephyrproject.org/latest/kconfig.html#CONFIG_BT_CTLR_TX_PWR) + +### Using bluetooth output with USB power + +If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../docs/behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. + ## Known Issues There are a few known issues related to BLE and ZMK: diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index e8a05b6b..d47671bc 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -5,7 +5,7 @@ sidebar_title: Troubleshooting The following page provides suggestions for common errors that may occur during firmware compilation or other issues with keyboard usage. If the information provided is insufficient to resolve the issue, feel free to seek out help from the [ZMK Discord](https://zmk.dev/community/discord/invite). -Please also see [the troubleshooting section](features/bluetooth.md#troubleshooting) under the Bluetooth feature page. +Please also see [the troubleshooting section](features/bluetooth.md#troubleshooting) under the Bluetooth feature page for issues related to bluetooth. ### File Transfer Error @@ -102,17 +102,3 @@ Perform the following steps to reset both halves of your split keyboard: 1. Flash the actual image for each half of the split keyboard (e.g `my_board_left.uf2` to the left half, `my_board_right.uf2` to the right half). After completing these steps, pair the halves of the split keyboard together by resetting them at the same time. Most commonly, this is done by grounding the reset pins for each of your keyboard's microcontrollers or pressing the reset buttons at the same time. - -### Connectivity Issues - -Some users may experience a poor connection between the keyboard and the host. This might be due to poor quality BLE hardware, a metal enclosure on the keyboard or host, or the distance between them. Increasing the transmit power of the keyboard's BLE radio may reduce the severity of this problem. To do this, set the `CONFIG_BT_CTLR_TX_PWR_PLUS_8` configuration value in the `.conf` file of your user config directory as such: - -``` -CONFIG_BT_CTLR_TX_PWR_PLUS_8=y -``` - -For the `nRF52840`, the value `PLUS_8` can be set to any multiple of four between `MINUS_20` and `PLUS_8`. The default value for this config is `0`, but if you are having connection issues it is recommended to set it to `PLUS_8` because the power consumption difference is negligible. For more information on changing the transmit power of your BLE device, please refer to [the Zephyr docs.](https://docs.zephyrproject.org/latest/kconfig.html#CONFIG_BT_CTLR_TX_PWR) - -### Other notes and warnings - -- If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../docs/behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. From 0682bc3aa6d9b9deac48b5aa6c781241075819b3 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 2 Jun 2023 18:45:15 -0700 Subject: [PATCH 245/289] feat(docs): Note split connectivity improvement with TX power --- docs/docs/features/bluetooth.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md index 386ad70e..9637c4d0 100644 --- a/docs/docs/features/bluetooth.md +++ b/docs/docs/features/bluetooth.md @@ -48,6 +48,10 @@ CONFIG_BT_CTLR_TX_PWR_PLUS_8=y For the `nRF52840`, the value `PLUS_8` can be set to any multiple of four between `MINUS_20` and `PLUS_8`. The default value for this config is `0`, but if you are having connection issues it is recommended to set it to `PLUS_8` because the power consumption difference is negligible. For more information on changing the transmit power of your BLE device, please refer to [the Zephyr docs.](https://docs.zephyrproject.org/latest/kconfig.html#CONFIG_BT_CTLR_TX_PWR) +:::info +This setting can also improve the connection strength between the keyboard halves for split keyboards. +::: + ### Using bluetooth output with USB power If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../docs/behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. From ace11e327fbfb4c4c894bb66328156d4d0b7eda0 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 2 Jun 2023 20:46:13 -0700 Subject: [PATCH 246/289] fix(docs): Fix broken link in BT troubleshooting --- docs/docs/features/bluetooth.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md index 9637c4d0..b75b8953 100644 --- a/docs/docs/features/bluetooth.md +++ b/docs/docs/features/bluetooth.md @@ -54,7 +54,7 @@ This setting can also improve the connection strength between the keyboard halve ### Using bluetooth output with USB power -If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../docs/behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. +If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. ## Known Issues From 19d883cdfe679977023116dcf689ce67a6ce548d Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 3 Jun 2023 02:53:20 +0000 Subject: [PATCH 247/289] fix(bluetooth): Passkey pairing improvements. * Capture the last 6 entered digits, and then require pressing Enter/Return to submit the entered digits. This matches the messaging shown on hosts regarding how to complete pairing. * Fix the wording on the Kconfig menu item to accurately describe the feature. --- app/Kconfig | 3 ++- app/src/ble.c | 47 +++++++++++++++++++++-------------- docs/docs/config/bluetooth.md | 7 +++--- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index d1b6682f..1537bd61 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -160,8 +160,9 @@ config BT_DEVICE_APPEARANCE default 961 config ZMK_BLE_PASSKEY_ENTRY - bool "Experimental: Requiring typing passkey from host to pair BLE connection" + bool "Require passkey entry on the keyboard to complete pairing" default n + select RING_BUFFER config BT_PERIPHERAL_PREF_MIN_INT default 6 diff --git a/app/src/ble.c b/app/src/ble.c index c7bdc401..383a727d 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -42,8 +43,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define PASSKEY_DIGITS 6 static struct bt_conn *auth_passkey_entry_conn; -static uint8_t passkey_entries[PASSKEY_DIGITS] = {}; -static uint8_t passkey_digit = 0; +RING_BUF_DECLARE(passkey_entries, PASSKEY_DIGITS); #endif /* IS_ENABLED(CONFIG_ZMK_BLE_PASSKEY_ENTRY) */ @@ -469,7 +469,7 @@ static void auth_passkey_entry(struct bt_conn *conn) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); LOG_DBG("Passkey entry requested for %s", addr); - passkey_digit = 0; + ring_buf_reset(&passkey_entries); auth_passkey_entry_conn = bt_conn_ref(conn); } @@ -486,7 +486,7 @@ static void auth_cancel(struct bt_conn *conn) { auth_passkey_entry_conn = NULL; } - passkey_digit = 0; + ring_buf_reset(&passkey_entries); #endif LOG_DBG("Pairing cancelled: %s", addr); @@ -605,7 +605,7 @@ static int zmk_ble_init(const struct device *_arg) { #if IS_ENABLED(CONFIG_ZMK_BLE_PASSKEY_ENTRY) static bool zmk_ble_numeric_usage_to_value(const zmk_key_t key, const zmk_key_t one, - const zmk_key_t zero, uint32_t *value) { + const zmk_key_t zero, uint8_t *value) { if (key < one || key > zero) { return false; } @@ -634,7 +634,23 @@ static int zmk_ble_handle_key_user(struct zmk_keycode_state_changed *event) { return ZMK_EV_EVENT_HANDLED; } - uint32_t val; + if (key == HID_USAGE_KEY_KEYBOARD_RETURN || key == HID_USAGE_KEY_KEYBOARD_RETURN_ENTER) { + uint8_t digits[PASSKEY_DIGITS]; + uint32_t count = ring_buf_get(&passkey_entries, digits, PASSKEY_DIGITS); + + uint32_t passkey = 0; + for (int i = 0; i < count; i++) { + passkey = (passkey * 10) + digits[i]; + } + + LOG_DBG("Final passkey: %d", passkey); + bt_conn_auth_passkey_entry(auth_passkey_entry_conn, passkey); + bt_conn_unref(auth_passkey_entry_conn); + auth_passkey_entry_conn = NULL; + return ZMK_EV_EVENT_HANDLED; + } + + uint8_t val; if (!(zmk_ble_numeric_usage_to_value(key, HID_USAGE_KEY_KEYBOARD_1_AND_EXCLAMATION, HID_USAGE_KEY_KEYBOARD_0_AND_RIGHT_PARENTHESIS, &val) || zmk_ble_numeric_usage_to_value(key, HID_USAGE_KEY_KEYPAD_1_AND_END, @@ -643,20 +659,13 @@ static int zmk_ble_handle_key_user(struct zmk_keycode_state_changed *event) { return ZMK_EV_EVENT_BUBBLE; } - passkey_entries[passkey_digit++] = val; - LOG_DBG("value entered: %d, digits collected so far: %d", val, passkey_digit); - - if (passkey_digit == PASSKEY_DIGITS) { - uint32_t passkey = 0; - for (int i = 0; i < PASSKEY_DIGITS; i++) { - passkey = (passkey * 10) + passkey_entries[i]; - } - - LOG_DBG("Final passkey: %d", passkey); - bt_conn_auth_passkey_entry(auth_passkey_entry_conn, passkey); - bt_conn_unref(auth_passkey_entry_conn); - auth_passkey_entry_conn = NULL; + if (ring_buf_space_get(&passkey_entries) <= 0) { + uint8_t discard_val; + ring_buf_get(&passkey_entries, &discard_val, 1); } + ring_buf_put(&passkey_entries, &val, 1); + LOG_DBG("value entered: %d, digits collected so far: %d", val, + ring_buf_size_get(&passkey_entries)); return ZMK_EV_EVENT_HANDLED; } diff --git a/docs/docs/config/bluetooth.md b/docs/docs/config/bluetooth.md index 420dd5c3..d2ddefdd 100644 --- a/docs/docs/config/bluetooth.md +++ b/docs/docs/config/bluetooth.md @@ -9,6 +9,7 @@ See [Configuration Overview](index.md) for instructions on how to change these s ## Kconfig -| Option | Type | Description | Default | -| ------------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------------- | ------- | -| `CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION` | bool | Low level setting for GATT subscriptions. Set to `n` to work around an annoying Windows bug with battery notifications. | y | +| Option | Type | Description | Default | +| ------------------------------------- | ---- | -------------------------------------------------------------------------------------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_BLE_PASSKEY_ENTRY` | bool | Enable passkey entry during pairing for enhanced security. (Note: After enabling this, you will need to re-pair all previously paired hosts) | n | +| `CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION` | bool | Low level setting for GATT subscriptions. Set to `n` to work around an annoying Windows bug with battery notifications. | y | From f08802eaa735b87fa089b81512a941a1bcc8ca4b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 5 Jun 2023 05:04:13 +0000 Subject: [PATCH 248/289] fix(boards): Proper i2c pinctrl for BlueMicro840 * Use the proper pin assignmets after the move to pinctrl for the Zephyr 3.2 migration. --- .../arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi index 15c48509..868d3c27 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi +++ b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi @@ -17,22 +17,22 @@ uart0_sleep: uart0_sleep { group1 { psels = , - ; + ; low-power-enable; }; }; i2c0_default: i2c0_default { group1 { - psels = , - ; + psels = , + ; }; }; i2c0_sleep: i2c0_sleep { group1 { - psels = , - ; + psels = , + ; low-power-enable; }; }; From 5d9ae8fffa869f36e3e0911bed92d41ed8640826 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 17 Jun 2022 17:44:31 -0400 Subject: [PATCH 249/289] feat(split): allow central to connect to multiple peripherals --- app/include/zmk/ble.h | 6 +- app/src/ble.c | 54 ++++++++---- app/src/split/bluetooth/Kconfig | 4 + app/src/split/bluetooth/central.c | 138 ++++++++++++++++++------------ 4 files changed, 130 insertions(+), 72 deletions(-) diff --git a/app/include/zmk/ble.h b/app/include/zmk/ble.h index 1c84777d..435fde49 100644 --- a/app/include/zmk/ble.h +++ b/app/include/zmk/ble.h @@ -14,8 +14,8 @@ IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL)) #if ZMK_BLE_IS_CENTRAL -#define ZMK_BLE_PROFILE_COUNT (CONFIG_BT_MAX_PAIRED - 1) -#define ZMK_SPLIT_BLE_PERIPHERAL_COUNT 1 +#define ZMK_BLE_PROFILE_COUNT (CONFIG_BT_MAX_PAIRED - CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS) +#define ZMK_SPLIT_BLE_PERIPHERAL_COUNT CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS #else #define ZMK_BLE_PROFILE_COUNT CONFIG_BT_MAX_PAIRED #endif @@ -34,5 +34,5 @@ char *zmk_ble_active_profile_name(); int zmk_ble_unpair_all(); #if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) -void zmk_ble_set_peripheral_addr(bt_addr_le_t *addr); +int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr); #endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) */ diff --git a/app/src/ble.c b/app/src/ble.c index 383a727d..ff82f3cf 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -47,12 +47,6 @@ RING_BUF_DECLARE(passkey_entries, PASSKEY_DIGITS); #endif /* IS_ENABLED(CONFIG_ZMK_BLE_PASSKEY_ENTRY) */ -#if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) -#define PROFILE_COUNT (CONFIG_BT_MAX_PAIRED - 1) -#else -#define PROFILE_COUNT CONFIG_BT_MAX_PAIRED -#endif - enum advertising_type { ZMK_ADV_NONE, ZMK_ADV_DIR, @@ -84,7 +78,7 @@ static const struct bt_data zmk_ble_ad[] = { #if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) -static bt_addr_le_t peripheral_addr; +static bt_addr_le_t peripheral_addrs[ZMK_SPLIT_BLE_PERIPHERAL_COUNT]; #endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) */ @@ -283,9 +277,34 @@ char *zmk_ble_active_profile_name() { return profiles[active_profile].name; } #if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) -void zmk_ble_set_peripheral_addr(bt_addr_le_t *addr) { - memcpy(&peripheral_addr, addr, sizeof(bt_addr_le_t)); - settings_save_one("ble/peripheral_address", addr, sizeof(bt_addr_le_t)); +int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr) { + for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { + // If the address is recognized and already stored in settings, return + // index and no additional action is necessary. + if (!bt_addr_le_cmp(&peripheral_addrs[i], addr)) { + return i; + } + + // If the peripheral address slot is open, store new peripheral in the + // slot and return index. This compares against BT_ADDR_LE_ANY as that + // is the zero value. + if (!bt_addr_le_cmp(&peripheral_addrs[i], BT_ADDR_LE_ANY)) { + char addr_str[BT_ADDR_LE_STR_LEN]; + bt_addr_le_to_str(addr, addr_str, sizeof(addr_str)); + LOG_DBG("Storing peripheral %s in slot %d", addr_str, i); + bt_addr_le_copy(&peripheral_addrs[i], addr); + + char setting_name[32]; + sprintf(setting_name, "ble/peripheral_addresses/%d", i); + settings_save_one(setting_name, addr, sizeof(bt_addr_le_t)); + + return i; + } + } + + // The peripheral does not match a known peripheral and there is no + // available slot. + return -ENOMEM; } #endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) */ @@ -340,15 +359,20 @@ static int ble_profiles_handle_set(const char *name, size_t len, settings_read_c } } #if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) - else if (settings_name_steq(name, "peripheral_address", &next) && !next) { + else if (settings_name_steq(name, "peripheral_addresses", &next) && next) { if (len != sizeof(bt_addr_le_t)) { return -EINVAL; } - int err = read_cb(cb_arg, &peripheral_addr, sizeof(bt_addr_le_t)); - if (err <= 0) { - LOG_ERR("Failed to handle peripheral address from settings (err %d)", err); - return err; + int i = atoi(next); + if (i < 0 || i >= ZMK_SPLIT_BLE_PERIPHERAL_COUNT) { + LOG_ERR("Failed to store peripheral address in memory"); + } else { + int err = read_cb(cb_arg, &peripheral_addrs[i], sizeof(bt_addr_le_t)); + if (err <= 0) { + LOG_ERR("Failed to handle peripheral address from settings (err %d)", err); + return err; + } } } #endif diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index 005d75fd..e2c8d5c3 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -17,6 +17,10 @@ config ZMK_SPLIT_ROLE_CENTRAL if ZMK_SPLIT_ROLE_CENTRAL +config ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS + int "Number of peripherals that will connect to the central." + default 1 + config ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE int "Max number of key position state events to queue when received from peripherals" default 5 diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index a7c0d8a9..53e61be6 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -26,7 +26,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -static int start_scan(void); +static int start_scanning(void); #define POSITION_STATE_DATA_LEN 16 @@ -49,6 +49,8 @@ struct peripheral_slot { static struct peripheral_slot peripherals[ZMK_SPLIT_BLE_PERIPHERAL_COUNT]; +static bool is_scanning = false; + static const struct bt_uuid_128 split_service_uuid = BT_UUID_INIT_128(ZMK_SPLIT_BT_SERVICE_UUID); K_MSGQ_DEFINE(peripheral_event_msgq, sizeof(struct zmk_position_state_changed), @@ -130,8 +132,9 @@ int release_peripheral_slot(int index) { return 0; } -int reserve_peripheral_slot() { - for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { +int reserve_peripheral_slot(const bt_addr_le_t *addr) { + int i = zmk_ble_put_peripheral_addr(addr); + if (i >= 0) { if (peripherals[i].state == PERIPHERAL_SLOT_STATE_OPEN) { // Be sure the slot is fully reinitialized. release_peripheral_slot(i); @@ -344,9 +347,54 @@ static void split_central_process_connection(struct bt_conn *conn) { LOG_DBG("New connection params: Interval: %d, Latency: %d, PHY: %d", info.le.interval, info.le.latency, info.le.phy->rx_phy); + + // Restart scanning if necessary. + start_scanning(); } -static bool split_central_eir_found(struct bt_data *data, void *user_data) { +static int stop_scanning() { + LOG_DBG("Stopping peripheral scanning"); + is_scanning = false; + + int err = bt_le_scan_stop(); + if (err < 0) { + LOG_ERR("Stop LE scan failed (err %d)", err); + return err; + } + + return 0; +} + +static bool split_central_eir_found(const bt_addr_le_t *addr) { + LOG_DBG("Found the split service"); + + // Stop scanning so we can connect to the peripheral device. + int err = stop_scanning(); + if (err < 0) { + return false; + } + + int slot_idx = reserve_peripheral_slot(addr); + if (slot_idx < 0) { + LOG_ERR("Failed to reserve peripheral slot (err %d)", slot_idx); + return false; + } + + struct peripheral_slot *slot = &peripherals[slot_idx]; + + LOG_DBG("Initiating new connnection"); + struct bt_le_conn_param *param = BT_LE_CONN_PARAM(0x0006, 0x0006, 30, 400); + err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, param, &slot->conn); + if (err < 0) { + LOG_ERR("Create conn failed (err %d) (create conn? 0x%04x)", err, BT_HCI_OP_LE_CREATE_CONN); + release_peripheral_slot(slot_idx); + start_scanning(); + } + + return false; +} + +static bool split_central_eir_parse(struct bt_data *data, void *user_data) { bt_addr_le_t *addr = user_data; int i; @@ -361,9 +409,7 @@ static bool split_central_eir_found(struct bt_data *data, void *user_data) { } for (i = 0; i < data->data_len; i += 16) { - struct bt_le_conn_param *param; struct bt_uuid_128 uuid; - int err; if (!bt_uuid_create(&uuid.uuid, &data->data[i], 16)) { LOG_ERR("Unable to load UUID"); @@ -381,46 +427,7 @@ static bool split_central_eir_found(struct bt_data *data, void *user_data) { continue; } - LOG_DBG("Found the split service"); - - zmk_ble_set_peripheral_addr(addr); - - err = bt_le_scan_stop(); - if (err) { - LOG_ERR("Stop LE scan failed (err %d)", err); - continue; - } - - uint8_t slot_idx = reserve_peripheral_slot(); - if (slot_idx < 0) { - LOG_ERR("Faild to reserve peripheral slot (err %d)", slot_idx); - continue; - } - - struct peripheral_slot *slot = &peripherals[slot_idx]; - - slot->conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, addr); - if (slot->conn) { - LOG_DBG("Found existing connection"); - split_central_process_connection(slot->conn); - err = bt_conn_le_phy_update(slot->conn, BT_CONN_LE_PHY_PARAM_2M); - if (err) { - LOG_ERR("Update phy conn failed (err %d)", err); - } - } else { - param = BT_LE_CONN_PARAM(0x0006, 0x0006, 30, 400); - - LOG_DBG("Initiating new connnection"); - - err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, param, &slot->conn); - if (err) { - LOG_ERR("Create conn failed (err %d) (create conn? 0x%04x)", err, - BT_HCI_OP_LE_CREATE_CONN); - start_scan(); - } - } - - return false; + return split_central_eir_found(addr); } } @@ -436,15 +443,34 @@ static void split_central_device_found(const bt_addr_le_t *addr, int8_t rssi, ui /* We're only interested in connectable events */ if (type == BT_GAP_ADV_TYPE_ADV_IND || type == BT_GAP_ADV_TYPE_ADV_DIRECT_IND) { - bt_data_parse(ad, split_central_eir_found, (void *)addr); + bt_data_parse(ad, split_central_eir_parse, (void *)addr); } } -static int start_scan(void) { - int err; +static int start_scanning(void) { + // No action is necessary if central is already scanning. + if (is_scanning) { + LOG_DBG("Scanning already running"); + return 0; + } - err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, split_central_device_found); - if (err) { + // If all the devices are connected, there is no need to scan. + bool has_unconnected = false; + for (int i = 0; i < CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS; i++) { + if (peripherals[i].conn == NULL) { + has_unconnected = true; + break; + } + } + if (!has_unconnected) { + LOG_DBG("All devices are connected, scanning is unnecessary"); + return 0; + } + + // Start scanning otherwise. + is_scanning = true; + int err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, split_central_device_found); + if (err < 0) { LOG_ERR("Scanning failed to start (err %d)", err); return err; } @@ -471,7 +497,7 @@ static void split_central_connected(struct bt_conn *conn, uint8_t conn_err) { release_peripheral_slot_for_conn(conn); - start_scan(); + start_scanning(); return; } @@ -495,7 +521,7 @@ static void split_central_disconnected(struct bt_conn *conn, uint8_t reason) { return; } - start_scan(); + start_scanning(); } static struct bt_conn_cb conn_callbacks = { @@ -527,6 +553,10 @@ void split_central_split_run_callback(struct k_work *work) { LOG_ERR("Source not connected"); continue; } + if (!peripherals[payload_wrapper.source].run_behavior_handle) { + LOG_ERR("Run behavior handle not found"); + continue; + } int err = bt_gatt_write_without_response( peripherals[payload_wrapper.source].conn, @@ -590,7 +620,7 @@ int zmk_split_bt_central_init(const struct device *_arg) { CONFIG_ZMK_BLE_THREAD_PRIORITY, NULL); bt_conn_cb_register(&conn_callbacks); - return start_scan(); + return start_scanning(); } SYS_INIT(zmk_split_bt_central_init, APPLICATION, CONFIG_ZMK_BLE_INIT_PRIORITY); From a5c57fa224ba410100dde4e64222505bfb2b89ea Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Tue, 6 Jun 2023 13:22:39 +0800 Subject: [PATCH 250/289] feat(docs): Add an example for combining just modifiers (#1826) Co-authored-by: Cem Aksoylar --- docs/docs/codes/modifiers.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/docs/codes/modifiers.mdx b/docs/docs/codes/modifiers.mdx index 483e34af..db88ee92 100644 --- a/docs/docs/codes/modifiers.mdx +++ b/docs/docs/codes/modifiers.mdx @@ -38,6 +38,8 @@ These functions take the form: `XX(code)` - `&kp LS(A)` = `LEFT_SHIFT`+`A` (a capitalized **A**). - They can be combined: - `&kp LC(RA(B))` = `LEFT_CONTROL`+`RIGHT_ALT`+`B` +- They can be applied to a modifier keycode to create combined modifier keys: + - `&kp LS(LALT)` = `LEFT_SHIFT` + `LEFT_ALT` - Some basic codes already include a modifier function in their definition: - `DOLLAR` = `LS(NUMBER_4)` - There are left- and right-handed versions of each modifier (also see table above): From 98524a95671fe9d819a65d1515f9bc37895efc3d Mon Sep 17 00:00:00 2001 From: kadoyau <11990327+kadoyau@users.noreply.github.com> Date: Sun, 11 Jun 2023 04:32:50 +0900 Subject: [PATCH 251/289] fix(docs): Fix INT6 keycode description --- docs/src/data/hid.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/data/hid.js b/docs/src/data/hid.js index 00d48f3f..45767172 100644 --- a/docs/src/data/hid.js +++ b/docs/src/data/hid.js @@ -3477,7 +3477,7 @@ export default [ }, { names: ["INTERNATIONAL_6", "INT6", "INT_KPJPCOMMA"], - description: ", [カソマ] (International 6)", + description: ", [カンマ] (International 6)", context: "Keyboard", clarify: false, usages: [ From 9d39a87f67668b4c083e09b04adf006d6fd1385d Mon Sep 17 00:00:00 2001 From: pixls Date: Sat, 10 Jun 2023 20:49:30 -0400 Subject: [PATCH 252/289] fix(docs): Change user-setup.md order to agree with order in setup script Fixes #1281 Co-authored-by: Cem Aksoylar --- docs/docs/user-setup.md | 47 +++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index a2e491b8..8faa72df 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -88,36 +88,41 @@ powershell -Command "iex ((New-Object System.Net.WebClient).DownloadString('http +### Keyboard Selection + +When prompted, enter the number for the corresponding keyboard you would like to target: + +``` +Keyboard Selection: + 1) 2% Milk 19) Ferris 0.2 37) Nibble + 2) A. Dux 20) Fourier Rev. 1 38) nice!60 + 3) BAT43 21) Helix 39) Osprette + 4) BDN9 Rev2 22) Hummingbird 40) Pancake + 5) BFO-9000 23) Iris 41) Planck Rev6 + 6) Boardsource 3x4 Macropad 24) etc... +Pick an keyboard: +``` + +:::note For a keyboard not in the included list: +If you are building firmware for a new keyboard that is not included in the built-in +list of keyboards, you can choose any keyboard from the list that is similar to yours (e.g. in terms of unibody/split and [onboard controller](hardware.mdx#onboard)/[composite](hardware.mdx#composite)) to generate the repository, +and edit / add necessary files. You can follow the [new shield guide](development/new-shield.md) if you are adding support for a composite keyboard. +::: + ### MCU Board Selection +If the keyboard selected uses an onboard controller you will skip this step. When prompted, enter the number for the corresponding MCU board you would like to target: ``` MCU Board Selection: -1) nice!nano -2) QMK Proton-C -3) Quit +1) BlueMicro840 v1 5) nRF52840 M.2 Module 9) QMK Proton-C +2) Mikoto 5.20 6) nRFMicro 1.1 (flipped) 10) Seeeduino XIAO +3) nice!nano v1 7) nRFMicro 1.1/1.2 11) Seeeduino XIAO BLE +4) nice!nano v2 8) nRFMicro 1.3/1.4 12) Quit Pick an MCU board: ``` -### Keyboard Shield Selection - -:::note -If you are building firmware for a new keyboard shield that is not included in the built-in -list of shields, you can choose any shield from the list that is similar to yours to generate the repository, -and edit / add necessary files according to the [guide for adding new keyboard shield](development/new-shield.md). -::: - -When prompted, enter the number for the corresponding keyboard shield you would like to target: - -``` -Keyboard Shield Selection: -1) Kyria -2) Lily58 -3) Quit -Pick an keyboard: -``` - ### Keymap Customization At the next prompt, you have an opportunity to decide if you want the stock keymap file copied in From 0be0d0763081de0c163dd26c29752d1085381dbb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Jun 2023 04:35:54 +0000 Subject: [PATCH 253/289] chore(deps): bump minimatch and serve-handler in /docs Bumps [minimatch](https://github.com/isaacs/minimatch) and [serve-handler](https://github.com/zeit/serve-handler). These dependencies needed to be updated together. Updates `minimatch` from 3.0.4 to 3.1.2 - [Release notes](https://github.com/isaacs/minimatch/releases) - [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2) Updates `serve-handler` from 6.1.3 to 6.1.5 - [Release notes](https://github.com/zeit/serve-handler/releases) - [Commits](https://github.com/zeit/serve-handler/compare/6.1.3...6.1.5) --- updated-dependencies: - dependency-name: minimatch dependency-type: indirect - dependency-name: serve-handler dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 35 ++++++++--------------------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 3183a51c..f0cd1fc8 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -13612,31 +13612,20 @@ } }, "node_modules/serve-handler": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", - "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", "fast-url-parser": "1.1.3", "mime-types": "2.1.18", - "minimatch": "3.0.4", + "minimatch": "3.1.2", "path-is-inside": "1.0.2", "path-to-regexp": "2.2.1", "range-parser": "1.2.0" } }, - "node_modules/serve-handler/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/serve-handler/node_modules/path-to-regexp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", @@ -25765,28 +25754,20 @@ } }, "serve-handler": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", - "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", "requires": { "bytes": "3.0.0", "content-disposition": "0.5.2", "fast-url-parser": "1.1.3", "mime-types": "2.1.18", - "minimatch": "3.0.4", + "minimatch": "3.1.2", "path-is-inside": "1.0.2", "path-to-regexp": "2.2.1", "range-parser": "1.2.0" }, "dependencies": { - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, "path-to-regexp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", From 9d714c0b69fee2098a010d29e534051aeca26386 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Jun 2023 06:47:34 +0000 Subject: [PATCH 254/289] chore(deps-dev): bump webpack from 5.80.0 to 5.86.0 in /docs Bumps [webpack](https://github.com/webpack/webpack) from 5.80.0 to 5.86.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.80.0...v5.86.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 46 +++++++++++++++++++++--------------------- docs/package.json | 2 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index f0cd1fc8..5badb07e 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -42,7 +42,7 @@ "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", "typescript": "^5.0.4", - "webpack": "^5.80.0" + "webpack": "^5.86.0" } }, "node_modules/@algolia/autocomplete-core": { @@ -3950,9 +3950,9 @@ } }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "peerDependencies": { "acorn": "^8" } @@ -6069,9 +6069,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", - "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -15390,9 +15390,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.80.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", - "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -15400,10 +15400,10 @@ "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.13.0", + "enhanced-resolve": "^5.14.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -18899,9 +18899,9 @@ "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" }, "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "requires": {} }, "acorn-jsx": { @@ -20426,9 +20426,9 @@ } }, "enhanced-resolve": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", - "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -27031,9 +27031,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "webpack": { - "version": "5.80.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", - "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -27041,10 +27041,10 @@ "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.13.0", + "enhanced-resolve": "^5.14.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", diff --git a/docs/package.json b/docs/package.json index 15d5aa38..d82e54ec 100644 --- a/docs/package.json +++ b/docs/package.json @@ -61,6 +61,6 @@ "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", "typescript": "^5.0.4", - "webpack": "^5.80.0" + "webpack": "^5.86.0" } } From 9ff1eaeb5a5f892d17ca87c38697466fd48fc301 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 14 May 2023 11:44:49 -0500 Subject: [PATCH 255/289] fix: Enable BT_TINYCRYPT_ECC when using HCI BT_TINYCRYPT_ECC is required for BT_SMP_SC_PAIR_ONLY to work on setups that use BT HCI like the nRF5340. --- app/Kconfig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/Kconfig b/app/Kconfig index 1537bd61..18ee473d 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -120,6 +120,10 @@ menuconfig ZMK_BLE if ZMK_BLE +# BT_TINYCRYPT_ECC is required for BT_SMP_SC_PAIR_ONLY when using HCI +config BT_TINYCRYPT_ECC + default y if BT_HCI && !BT_CTLR + choice BT_LL_SW_LLCP_IMPL default BT_LL_SW_LLCP_LEGACY From dcf5e75fa674184d9615793882db1c3f4c4194b9 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 14 May 2023 13:08:33 -0500 Subject: [PATCH 256/289] fix(boards): Bump nRF5340 DK I2C buffer size Increased the I2C buffer size again, since it needs to be at least 641 to support 128x64 displays. --- app/boards/nrf5340dk_nrf5340_cpuapp.overlay | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/nrf5340dk_nrf5340_cpuapp.overlay b/app/boards/nrf5340dk_nrf5340_cpuapp.overlay index 66d2332f..9427d9ca 100644 --- a/app/boards/nrf5340dk_nrf5340_cpuapp.overlay +++ b/app/boards/nrf5340dk_nrf5340_cpuapp.overlay @@ -6,5 +6,5 @@ &arduino_i2c { // Default buffer size is too small for use with displays. - zephyr,concat-buf-size = <512>; + zephyr,concat-buf-size = <1024>; }; From 2244bd3d81931753dfd170e804a90a487a205aa1 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 1 Sep 2021 03:49:18 +0000 Subject: [PATCH 257/289] refactor(sensors): Sensor event channel data, resolution tweaks. * Refactor sensor events to include channel data, necessary for prop split encoders, and avoiding duplicate calls, to fetch channel data twice, etc. * More consistent behavior driver API. * Allow setting triggers per resolution at the behavior level optionally. --- app/Kconfig | 20 +++ app/dts/bindings/zmk,keymap-sensors.yaml | 12 +- app/include/drivers/behavior.h | 26 ++-- app/include/zmk/events/sensor_event.h | 17 ++- app/include/zmk/sensors.h | 14 ++ app/include/zmk/virtual_key_position.h | 5 + app/src/behaviors/behavior_sensor_rotate.c | 8 +- .../behaviors/behavior_sensor_rotate_common.c | 59 +++++--- .../behaviors/behavior_sensor_rotate_common.h | 16 ++- .../behaviors/behavior_sensor_rotate_var.c | 6 +- app/src/keymap.c | 25 ++-- app/src/sensors.c | 133 +++++++++++++----- 12 files changed, 258 insertions(+), 83 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 18ee473d..1766bf07 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -194,6 +194,18 @@ rsource "src/split/Kconfig" #Basic Keyboard Setup endmenu +menu "Encoders" + +config ZMK_ENCODERS_DEFAULT_TRIGGERS_PER_ROTATION + int "Default behavior triggers per rotation" + help + Unless overridden for a specific behavior in the keymap/devicetree, this value + determines how many times to trigger the bound behavior per full rotation. + For tactile encoders with detents, this usually should match the number of + detents per rotation of the encoder. + default 30 + +endmenu menu "Display/LED Options" rsource "src/display/Kconfig" @@ -523,6 +535,14 @@ config ZMK_WPM config SENSOR default y +if ZMK_KEYMAP_SENSORS + +config ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION + int "Default triggers per rotation" + default 20 + +endif # ZMK_KEYMAP_SENSORS + choice CBPRINTF_IMPLEMENTATION default CBPRINTF_NANO diff --git a/app/dts/bindings/zmk,keymap-sensors.yaml b/app/dts/bindings/zmk,keymap-sensors.yaml index a879684f..5282f25b 100644 --- a/app/dts/bindings/zmk,keymap-sensors.yaml +++ b/app/dts/bindings/zmk,keymap-sensors.yaml @@ -9,4 +9,14 @@ compatible: "zmk,keymap-sensors" properties: sensors: type: phandles - required: true + required: false + triggers-per-rotation: + type: int + required: false + +child-binding: + description: Per-sensor configuration settings + properties: + triggers-per-rotation: + type: int + required: false diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index 380fc76f..0aa5d85e 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -12,6 +12,7 @@ #include #include #include +#include #include /** @@ -24,9 +25,10 @@ typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event); -typedef int (*behavior_sensor_keymap_binding_callback_t)(struct zmk_behavior_binding *binding, - const struct device *sensor, - struct zmk_behavior_binding_event event); +typedef int (*behavior_sensor_keymap_binding_callback_t)( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, size_t channel_data_size, + const struct zmk_sensor_channel_data channel_data[channel_data_size]); enum behavior_locality { BEHAVIOR_LOCALITY_CENTRAL, @@ -158,14 +160,15 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi * @retval 0 If successful. * @retval Negative errno code if failure. */ -__syscall int behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, - const struct device *sensor, - struct zmk_behavior_binding_event event); +__syscall int behavior_sensor_keymap_binding_triggered( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data); -static inline int -z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, - const struct device *sensor, - struct zmk_behavior_binding_event event) { +static inline int z_impl_behavior_sensor_keymap_binding_triggered( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data) { const struct device *dev = device_get_binding(binding->behavior_dev); if (dev == NULL) { @@ -178,7 +181,8 @@ z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *bin return -ENOTSUP; } - return api->sensor_binding_triggered(binding, sensor, event); + return api->sensor_binding_triggered(binding, event, sensor_config, channel_data_size, + channel_data); } /** diff --git a/app/include/zmk/events/sensor_event.h b/app/include/zmk/events/sensor_event.h index 9398bcbb..5a5aa3ac 100644 --- a/app/include/zmk/events/sensor_event.h +++ b/app/include/zmk/events/sensor_event.h @@ -6,12 +6,21 @@ #pragma once -#include + +#include #include -#include +#include +#include + +// TODO: Move to Kconfig when we need more than one channel +#define ZMK_SENSOR_EVENT_MAX_CHANNELS 1 + struct zmk_sensor_event { - uint8_t sensor_number; - const struct device *sensor; + uint8_t sensor_position; + + size_t channel_data_size; + struct zmk_sensor_channel_data channel_data[ZMK_SENSOR_EVENT_MAX_CHANNELS]; + int64_t timestamp; }; diff --git a/app/include/zmk/sensors.h b/app/include/zmk/sensors.h index 9e54695f..41061127 100644 --- a/app/include/zmk/sensors.h +++ b/app/include/zmk/sensors.h @@ -6,6 +6,9 @@ #pragma once +#include + +#define _SENSOR_CHILD_LEN(node) 1 + #define ZMK_KEYMAP_SENSORS_NODE DT_INST(0, zmk_keymap_sensors) #define ZMK_KEYMAP_HAS_SENSORS DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_NODE, okay) #define ZMK_KEYMAP_SENSORS_BY_IDX(idx) DT_PHANDLE_BY_IDX(ZMK_KEYMAP_SENSORS_NODE, sensors, idx) @@ -15,3 +18,14 @@ #else #define ZMK_KEYMAP_SENSORS_LEN 0 #endif + +const struct zmk_sensor_config *zmk_sensors_get_config_at_position(uint8_t sensor_position); + +struct zmk_sensor_config { + uint16_t triggers_per_rotation; +}; + +struct zmk_sensor_channel_data { + enum sensor_channel channel; + struct sensor_value value; +}; diff --git a/app/include/zmk/virtual_key_position.h b/app/include/zmk/virtual_key_position.h index 48deee5c..b8f20683 100644 --- a/app/include/zmk/virtual_key_position.h +++ b/app/include/zmk/virtual_key_position.h @@ -14,6 +14,11 @@ */ #define ZMK_VIRTUAL_KEY_POSITION_SENSOR(index) (ZMK_KEYMAP_LEN + (index)) +/** + * Gets the sensor number from the virtual key position. + */ +#define ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(vkp) ((vkp)-ZMK_KEYMAP_LEN) + /** * Gets the virtual key position to use for the combo with the given index. */ diff --git a/app/src/behaviors/behavior_sensor_rotate.c b/app/src/behaviors/behavior_sensor_rotate.c index e12278bb..86846d5b 100644 --- a/app/src/behaviors/behavior_sensor_rotate.c +++ b/app/src/behaviors/behavior_sensor_rotate.c @@ -33,8 +33,10 @@ static int behavior_sensor_rotate_init(const struct device *dev) { return 0; }; .tap_ms = DT_INST_PROP_OR(n, tap_ms, 5), \ .override_params = false, \ }; \ - DEVICE_DT_INST_DEFINE( \ - n, behavior_sensor_rotate_init, NULL, NULL, &behavior_sensor_rotate_config_##n, \ - APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sensor_rotate_driver_api); + static struct behavior_sensor_rotate_data behavior_sensor_rotate_data_##n = {}; \ + DEVICE_DT_INST_DEFINE(n, behavior_sensor_rotate_init, NULL, &behavior_sensor_rotate_data_##n, \ + &behavior_sensor_rotate_config_##n, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_sensor_rotate_driver_api); DT_INST_FOREACH_STATUS_OKAY(SENSOR_ROTATE_INST) diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index bd31170e..99e4e019 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -5,48 +5,75 @@ #include #include +#include #include "behavior_sensor_rotate_common.h" LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, - const struct device *sensor, - struct zmk_behavior_binding_event event) { + struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, + size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data) { const struct device *dev = device_get_binding(binding->behavior_dev); const struct behavior_sensor_rotate_config *cfg = dev->config; + struct behavior_sensor_rotate_data *data = dev->data; - struct sensor_value value; + const struct sensor_value value = channel_data[0].value; + int triggers; + int sensor_position = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); - const int err = sensor_channel_get(sensor, SENSOR_CHAN_ROTATION, &value); + // Some funky special casing for "old encoder behavior" where ticks where reported in val2 only, + // instead of rotational degrees in val1. + // REMOVE ME: Remove after a grace period of old ec11 sensor behavior + if (value.val1 == 0) { + triggers = value.val2; + } else { + struct sensor_value remainder = data->remainder[sensor_position]; - if (err < 0) { - LOG_WRN("Failed to get sensor rotation value: %d", err); - return err; + remainder.val1 += value.val1; + remainder.val2 += value.val2; + + if (remainder.val2 >= 1000000 || remainder.val2 <= 1000000) { + remainder.val1 += remainder.val2 / 1000000; + remainder.val2 %= 1000000; + } + + int trigger_degrees = 360 / sensor_config->triggers_per_rotation; + triggers = remainder.val1 / trigger_degrees; + remainder.val1 %= trigger_degrees; + + data->remainder[sensor_position] = remainder; } + LOG_DBG( + "val1: %d, val2: %d, remainder: %d/%d triggers: %d inc keycode 0x%02X dec keycode 0x%02X", + value.val1, value.val2, data->remainder[sensor_position].val1, + data->remainder[sensor_position].val2, triggers, binding->param1, binding->param2); + struct zmk_behavior_binding triggered_binding; - switch (value.val1) { - case 1: + if (triggers > 0) { triggered_binding = cfg->cw_binding; if (cfg->override_params) { triggered_binding.param1 = binding->param1; } - break; - case -1: + } else if (triggers < 0) { + triggers = -triggers; triggered_binding = cfg->ccw_binding; if (cfg->override_params) { triggered_binding.param1 = binding->param2; } - break; - default: - return -ENOTSUP; + } else { + return 0; } LOG_DBG("Sensor binding: %s", binding->behavior_dev); - zmk_behavior_queue_add(event.position, triggered_binding, true, cfg->tap_ms); - zmk_behavior_queue_add(event.position, triggered_binding, false, 0); + for (int i = 0; i < triggers; i++) { + zmk_behavior_queue_add(event.position, triggered_binding, true, cfg->tap_ms); + zmk_behavior_queue_add(event.position, triggered_binding, false, 0); + } return ZMK_BEHAVIOR_OPAQUE; } diff --git a/app/src/behaviors/behavior_sensor_rotate_common.h b/app/src/behaviors/behavior_sensor_rotate_common.h index 2d58218d..eab443a3 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.h +++ b/app/src/behaviors/behavior_sensor_rotate_common.h @@ -1,5 +1,11 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ #include +#include struct behavior_sensor_rotate_config { struct zmk_behavior_binding cw_binding; @@ -8,6 +14,12 @@ struct behavior_sensor_rotate_config { bool override_params; }; +struct behavior_sensor_rotate_data { + struct sensor_value remainder[ZMK_KEYMAP_SENSORS_LEN]; +}; + int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, - const struct device *sensor, - struct zmk_behavior_binding_event event); \ No newline at end of file + struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, + size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data); \ No newline at end of file diff --git a/app/src/behaviors/behavior_sensor_rotate_var.c b/app/src/behaviors/behavior_sensor_rotate_var.c index a82267a5..95bb9961 100644 --- a/app/src/behaviors/behavior_sensor_rotate_var.c +++ b/app/src/behaviors/behavior_sensor_rotate_var.c @@ -24,8 +24,10 @@ static int behavior_sensor_rotate_var_init(const struct device *dev) { return 0; .tap_ms = DT_INST_PROP(n, tap_ms), \ .override_params = true, \ }; \ + static struct behavior_sensor_rotate_data behavior_sensor_rotate_var_data_##n = {}; \ DEVICE_DT_INST_DEFINE( \ - n, behavior_sensor_rotate_var_init, NULL, NULL, &behavior_sensor_rotate_var_config_##n, \ - APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sensor_rotate_var_driver_api); + n, behavior_sensor_rotate_var_init, NULL, &behavior_sensor_rotate_var_data_##n, \ + &behavior_sensor_rotate_var_config_##n, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_sensor_rotate_var_driver_api); DT_INST_FOREACH_STATUS_OKAY(SENSOR_ROTATE_VAR_INST) diff --git a/app/src/keymap.c b/app/src/keymap.c index da25fc09..16543d37 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -252,27 +252,34 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr } #if ZMK_KEYMAP_HAS_SENSORS -int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sensor, - int64_t timestamp) { +int zmk_keymap_sensor_triggered( + uint8_t sensor_position, size_t channel_data_size, + const struct zmk_sensor_channel_data channel_data[channel_data_size], int64_t timestamp) { for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= _zmk_keymap_layer_default; layer--) { if (zmk_keymap_layer_active(layer)) { - struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_number]; + struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_position]; const struct device *behavior; int ret; - LOG_DBG("layer: %d sensor_number: %d, binding name: %s", layer, sensor_number, + LOG_DBG("layer: %d sensor_position: %d, binding name: %s", layer, sensor_position, binding->behavior_dev); behavior = device_get_binding(binding->behavior_dev); if (!behavior) { - LOG_DBG("No behavior assigned to %d on layer %d", sensor_number, layer); + LOG_DBG("No behavior assigned to %d on layer %d", sensor_position, layer); continue; } struct zmk_behavior_binding_event event = { - .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_number), .timestamp = timestamp}; - ret = behavior_sensor_keymap_binding_triggered(binding, sensor, event); + .layer = layer, + .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_position), + .timestamp = timestamp, + }; + + ret = behavior_sensor_keymap_binding_triggered( + binding, event, zmk_sensors_get_config_at_position(sensor_position), + channel_data_size, channel_data); if (ret > 0) { LOG_DBG("behavior processing to continue to next layer"); @@ -301,8 +308,8 @@ int keymap_listener(const zmk_event_t *eh) { #if ZMK_KEYMAP_HAS_SENSORS const struct zmk_sensor_event *sensor_ev; if ((sensor_ev = as_zmk_sensor_event(eh)) != NULL) { - return zmk_keymap_sensor_triggered(sensor_ev->sensor_number, sensor_ev->sensor, - sensor_ev->timestamp); + return zmk_keymap_sensor_triggered(sensor_ev->sensor_position, sensor_ev->channel_data_size, + sensor_ev->channel_data, sensor_ev->timestamp); } #endif /* ZMK_KEYMAP_HAS_SENSORS */ diff --git a/app/src/sensors.c b/app/src/sensors.c index 1b92147f..5f41c4f2 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -18,65 +18,128 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if ZMK_KEYMAP_HAS_SENSORS -struct sensors_data_item { - uint8_t sensor_number; +struct sensors_item_cfg { + uint8_t sensor_position; + const struct zmk_sensor_config *config; const struct device *dev; struct sensor_trigger trigger; }; -#define _SENSOR_ITEM(node) \ +#define _SENSOR_ITEM(idx, node) \ { \ - .dev = NULL, .trigger = {.type = SENSOR_TRIG_DELTA, .chan = SENSOR_CHAN_ROTATION } \ + .dev = DEVICE_DT_GET_OR_NULL(node), \ + .trigger = {.type = SENSOR_TRIG_DATA_READY, .chan = SENSOR_CHAN_ROTATION}, \ + .config = &configs[idx] \ + } +#define SENSOR_ITEM(idx, _i) _SENSOR_ITEM(idx, ZMK_KEYMAP_SENSORS_BY_IDX(idx)) + +#define PLUS_ONE(n) +1 +#define ZMK_KEYMAP_SENSORS_CHILD_COUNT (0 DT_FOREACH_CHILD(ZMK_KEYMAP_SENSORS_NODE, PLUS_ONE)) +#define SENSOR_CHILD_ITEM(node) \ + { \ + .triggers_per_rotation = \ + DT_PROP_OR(node, triggers_per_rotation, \ + DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, \ + CONFIG_ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION)) \ + } +#define SENSOR_CHILD_DEFAULTS(idx, arg) \ + { .triggers_per_rotation = DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, 20) } + +static struct zmk_sensor_config configs[] = { +#if ZMK_KEYMAP_SENSORS_CHILD_COUNT > 0 + DT_FOREACH_CHILD_SEP(ZMK_KEYMAP_SENSORS_NODE, SENSOR_CHILD_ITEM, (, )) +#else + LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_CHILD_DEFAULTS, (, ), 0) +#endif +}; + +static struct sensors_item_cfg sensors[] = {LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_ITEM, (, ), 0)}; + +static ATOMIC_DEFINE(pending_sensors, ZMK_KEYMAP_SENSORS_LEN); + +const struct zmk_sensor_config *zmk_sensors_get_config_at_position(uint8_t sensor_position) { + if (sensor_position > ARRAY_SIZE(configs)) { + return NULL; } -#define SENSOR_ITEM(idx, _node) \ - COND_CODE_1(DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_BY_IDX(idx), okay), \ - (_SENSOR_ITEM(ZMK_KEYMAP_SENSORS_BY_IDX(idx))), ({})) + return &configs[sensor_position]; +} -static struct sensors_data_item sensors[] = {LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_ITEM, (, ), 0)}; - -static void zmk_sensors_trigger_handler(const struct device *dev, - const struct sensor_trigger *trigger) { +static void trigger_sensor_data_for_position(uint32_t sensor_position) { int err; - const struct sensors_data_item *item = CONTAINER_OF(trigger, struct sensors_data_item, trigger); + const struct sensors_item_cfg *item = &sensors[sensor_position]; - LOG_DBG("sensor %d", item->sensor_number); - - err = sensor_sample_fetch(dev); + err = sensor_sample_fetch(item->dev); if (err) { LOG_WRN("Failed to fetch sample from device %d", err); return; } - ZMK_EVENT_RAISE(new_zmk_sensor_event((struct zmk_sensor_event){ - .sensor_number = item->sensor_number, .sensor = dev, .timestamp = k_uptime_get()})); -} + struct sensor_value value; + err = sensor_channel_get(item->dev, item->trigger.chan, &value); -static void zmk_sensors_init_item(const char *node, uint8_t i, uint8_t abs_i) { - LOG_DBG("Init %s at index %d with sensor_number %d", node, i, abs_i); - - sensors[i].dev = device_get_binding(node); - sensors[i].sensor_number = abs_i; - - if (!sensors[i].dev) { - LOG_WRN("Failed to find device for %s", node); + if (err) { + LOG_WRN("Failed to get channel data from device %d", err); return; } - sensor_trigger_set(sensors[i].dev, &sensors[i].trigger, zmk_sensors_trigger_handler); + ZMK_EVENT_RAISE(new_zmk_sensor_event( + (struct zmk_sensor_event){.sensor_position = item->sensor_position, + .channel_data = {(struct zmk_sensor_channel_data){ + .value = value, .channel = item->trigger.chan}}, + .timestamp = k_uptime_get()})); } -#define _SENSOR_INIT(node) \ - zmk_sensors_init_item(DT_PROP(node, label), local_index++, absolute_index++); -#define SENSOR_INIT(idx, _i) \ - COND_CODE_1(DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_BY_IDX(idx), okay), \ - (_SENSOR_INIT(ZMK_KEYMAP_SENSORS_BY_IDX(idx))), (absolute_index++;)) +static void run_sensors_data_trigger(struct k_work *work) { + for (int i = 0; i < ARRAY_SIZE(sensors); i++) { + if (atomic_test_and_clear_bit(pending_sensors, i)) { + trigger_sensor_data_for_position(i); + } + } +} + +K_WORK_DEFINE(sensor_data_work, run_sensors_data_trigger); + +static void zmk_sensors_trigger_handler(const struct device *dev, + const struct sensor_trigger *trigger) { + const struct sensors_item_cfg *test_item = + CONTAINER_OF(trigger, struct sensors_item_cfg, trigger); + int sensor_index = test_item - sensors; + + if (sensor_index < 0 || sensor_index >= ARRAY_SIZE(sensors)) { + LOG_ERR("Invalid sensor item triggered our callback"); + return; + } + + if (k_is_in_isr()) { + atomic_set_bit(pending_sensors, sensor_index); + k_work_submit(&sensor_data_work); + } else { + trigger_sensor_data_for_position(sensor_index); + } +} + +static void zmk_sensors_init_item(uint8_t i) { + LOG_DBG("Init sensor at index %d", i); + + sensors[i].sensor_position = i; + + if (!sensors[i].dev) { + LOG_DBG("No local device for %d", i); + return; + } + + int err = sensor_trigger_set(sensors[i].dev, &sensors[i].trigger, zmk_sensors_trigger_handler); + if (err) { + LOG_WRN("Failed to set sensor trigger (%d)", err); + } +} + +#define SENSOR_INIT(idx, _t) zmk_sensors_init_item(idx); static int zmk_sensors_init(const struct device *_arg) { - int local_index = 0; - int absolute_index = 0; - LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_INIT, (), 0) + return 0; } From 295ed83409ab0bede761eb2e51f4e4670e4dbf08 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 2 Dec 2021 15:07:29 +0000 Subject: [PATCH 258/289] refactor(sensors): ec11 rotation sensor value in degrees. * Add new `steps` property to the `aips,ec11` binding, to make the driver properly report degrees in the rotation delta channel. * Handle old sensor values in sensor rotate behavior. --- app/drivers/sensor/ec11/Kconfig | 2 ++ app/drivers/sensor/ec11/ec11.c | 33 +++++++++++++++---- app/drivers/sensor/ec11/ec11.h | 1 + .../zephyr/dts/bindings/sensor/alps,ec11.yaml | 5 +++ app/include/zmk/events/sensor_event.h | 4 +-- app/include/zmk/sensors.h | 2 +- 6 files changed, 38 insertions(+), 9 deletions(-) diff --git a/app/drivers/sensor/ec11/Kconfig b/app/drivers/sensor/ec11/Kconfig index e86d092a..5da32728 100644 --- a/app/drivers/sensor/ec11/Kconfig +++ b/app/drivers/sensor/ec11/Kconfig @@ -3,6 +3,8 @@ menuconfig EC11 bool "EC11 Incremental Encoder Sensor" + default y + depends on DT_HAS_ALPS_EC11_ENABLED depends on GPIO help Enable driver for EC11 incremental encoder sensors. diff --git a/app/drivers/sensor/ec11/ec11.c b/app/drivers/sensor/ec11/ec11.c index 7091f73e..ee8b41e7 100644 --- a/app/drivers/sensor/ec11/ec11.c +++ b/app/drivers/sensor/ec11/ec11.c @@ -16,6 +16,8 @@ #include "ec11.h" +#define FULL_ROTATION 360 + LOG_MODULE_REGISTER(EC11, CONFIG_SENSOR_LOG_LEVEL); static int ec11_get_ab_state(const struct device *dev) { @@ -59,9 +61,14 @@ static int ec11_sample_fetch(const struct device *dev, enum sensor_channel chan) drv_data->pulses += delta; drv_data->ab_state = val; - drv_data->ticks = drv_data->pulses / drv_cfg->resolution; - drv_data->delta = delta; - drv_data->pulses %= drv_cfg->resolution; + // TODO: Temporary code for backwards compatibility to support + // the sensor channel rotation reporting *ticks* instead of delta of degrees. + // REMOVE ME + if (drv_cfg->steps == 0) { + drv_data->ticks = drv_data->pulses / drv_cfg->resolution; + drv_data->delta = delta; + drv_data->pulses %= drv_cfg->resolution; + } return 0; } @@ -69,13 +76,26 @@ static int ec11_sample_fetch(const struct device *dev, enum sensor_channel chan) static int ec11_channel_get(const struct device *dev, enum sensor_channel chan, struct sensor_value *val) { struct ec11_data *drv_data = dev->data; + const struct ec11_config *drv_cfg = dev->config; + int32_t pulses = drv_data->pulses; if (chan != SENSOR_CHAN_ROTATION) { return -ENOTSUP; } - val->val1 = drv_data->ticks; - val->val2 = drv_data->delta; + drv_data->pulses = 0; + + if (drv_cfg->steps > 0) { + val->val1 = (pulses * FULL_ROTATION) / drv_cfg->steps; + val->val2 = (pulses * FULL_ROTATION) % drv_cfg->steps; + if (val->val2 != 0) { + val->val2 *= 1000000; + val->val2 /= drv_cfg->steps; + } + } else { + val->val1 = drv_data->ticks; + val->val2 = drv_data->delta; + } return 0; } @@ -132,7 +152,8 @@ int ec11_init(const struct device *dev) { const struct ec11_config ec11_cfg_##n = { \ .a = GPIO_DT_SPEC_INST_GET(n, a_gpios), \ .b = GPIO_DT_SPEC_INST_GET(n, b_gpios), \ - COND_CODE_0(DT_INST_NODE_HAS_PROP(n, resolution), (1), (DT_INST_PROP(n, resolution))), \ + .resolution = DT_INST_PROP_OR(n, resolution, 1), \ + .steps = DT_INST_PROP_OR(n, steps, 0), \ }; \ DEVICE_DT_INST_DEFINE(n, ec11_init, NULL, &ec11_data_##n, &ec11_cfg_##n, POST_KERNEL, \ CONFIG_SENSOR_INIT_PRIORITY, &ec11_driver_api); diff --git a/app/drivers/sensor/ec11/ec11.h b/app/drivers/sensor/ec11/ec11.h index 82c21572..4e2e5d26 100644 --- a/app/drivers/sensor/ec11/ec11.h +++ b/app/drivers/sensor/ec11/ec11.h @@ -14,6 +14,7 @@ struct ec11_config { const struct gpio_dt_spec a; const struct gpio_dt_spec b; + const uint16_t steps; const uint8_t resolution; }; diff --git a/app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml b/app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml index 5cbe77a2..3672ea30 100644 --- a/app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml +++ b/app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml @@ -18,4 +18,9 @@ properties: resolution: type: int description: Number of pulses per tick + deprecated: true + required: false + steps: + type: int + description: Number of pulses in one full rotation required: false diff --git a/app/include/zmk/events/sensor_event.h b/app/include/zmk/events/sensor_event.h index 5a5aa3ac..c5157447 100644 --- a/app/include/zmk/events/sensor_event.h +++ b/app/include/zmk/events/sensor_event.h @@ -6,11 +6,11 @@ #pragma once - +#include #include + #include #include -#include // TODO: Move to Kconfig when we need more than one channel #define ZMK_SENSOR_EVENT_MAX_CHANNELS 1 diff --git a/app/include/zmk/sensors.h b/app/include/zmk/sensors.h index 41061127..06fbc63e 100644 --- a/app/include/zmk/sensors.h +++ b/app/include/zmk/sensors.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #define _SENSOR_CHILD_LEN(node) 1 + #define ZMK_KEYMAP_SENSORS_NODE DT_INST(0, zmk_keymap_sensors) From f0f7e2081b5a4aa5bc35d7d8855b0e73e962319b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 26 May 2022 16:53:41 +0000 Subject: [PATCH 259/289] refactor(config): Select SENSOR as needed. * Don't force on SENSOR Kconfig setting unless needed based on the detected DT. --- app/Kconfig | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 1766bf07..5b313eff 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -532,8 +532,11 @@ config ZMK_WPM bool "Calculate WPM" default n -config SENSOR +config ZMK_KEYMAP_SENSORS + bool "Enable Keymap Sensors support" default y + depends on DT_HAS_ZMK_KEYMAP_SENSORS_ENABLED + select SENSOR if ZMK_KEYMAP_SENSORS From 621d946d2926f28aa866947f110182726fa9ca10 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 21 May 2023 21:27:41 -0700 Subject: [PATCH 260/289] refactor(bluetooth): Bump HoG stack size. * Bump the default stack size for the HoG processing thread to avoid issues w/ some pathways. --- app/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 5b313eff..a54ad389 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -135,7 +135,7 @@ config SYSTEM_WORKQUEUE_STACK_SIZE config ZMK_BLE_THREAD_STACK_SIZE int "BLE notify thread stack size" - default 512 + default 768 config ZMK_BLE_THREAD_PRIORITY int "BLE notify thread priority" From f8aaaff556e1c43c6646ea1c1ee7faa2907cdf51 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 16 Apr 2023 08:18:57 +0000 Subject: [PATCH 261/289] refactor(shields): Updated ZMK Uno encoder config. * Move to new steps/triggers-per-rotation config. * Leverage QDEC Nordic driver when used on Nordic DK. --- .../boards/nrf52840dk_nrf52840.overlay | 24 +++++++++ app/boards/shields/zmk_uno/zmk_uno.overlay | 49 ++++++++++--------- 2 files changed, 50 insertions(+), 23 deletions(-) create mode 100644 app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay diff --git a/app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay b/app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay new file mode 100644 index 00000000..5ac7af7c --- /dev/null +++ b/app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay @@ -0,0 +1,24 @@ + +/ { + // First, delete the existing basic GPIO based instance. + /delete-node/ encoder; +}; + +&pinctrl { + qdec_default: qdec_default { + group1 { + psels = , + ; + bias-pull-up; + }; + }; +}; + +// Set up the QDEC hardware based driver and give it the same label as the deleted node. +encoder: &qdec0 { + status = "okay"; + led-pre = <0>; + steps = <80>; + pinctrl-0 = <&qdec_default>; + pinctrl-names = "default"; +}; diff --git a/app/boards/shields/zmk_uno/zmk_uno.overlay b/app/boards/shields/zmk_uno/zmk_uno.overlay index 04332911..78f3b4a7 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.overlay +++ b/app/boards/shields/zmk_uno/zmk_uno.overlay @@ -40,10 +40,10 @@ // Commented out until we add more powerful power domain support // external_power { - // compatible = "zmk,ext-power-generic"; - // label = "EXT_POWER"; - // init-delay-ms = <200>; - // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; + // compatible = "zmk,ext-power-generic"; + // label = "EXT_POWER"; + // init-delay-ms = <200>; + // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; // }; rgb_power { @@ -128,14 +128,14 @@ diode-direction = "col2row"; col-gpios - = <&arduino_header 10 GPIO_ACTIVE_HIGH> - , <&arduino_header 9 GPIO_ACTIVE_HIGH> - ; + = <&arduino_header 10 GPIO_ACTIVE_HIGH> + , <&arduino_header 9 GPIO_ACTIVE_HIGH> + ; row-gpios - = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; }; @@ -144,11 +144,11 @@ status = "disabled"; input-gpios - = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; }; @@ -157,23 +157,26 @@ toggle-mode; input-gpios - = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; }; encoder: encoder { label = "ENCODER"; - resolution = <4>; + steps = <80>; compatible = "alps,ec11"; - a-gpios = <&arduino_header 14 GPIO_PULL_UP>; - b-gpios = <&arduino_header 15 GPIO_PULL_UP>; + a-gpios = <&arduino_header 15 GPIO_PULL_UP>; + b-gpios = <&arduino_header 14 GPIO_PULL_UP>; }; - sensors { compatible = "zmk,keymap-sensors"; sensors = <&encoder>; + triggers-per-rotation = <20>; + left { + triggers-per-rotation = <20>; + }; }; }; From d781ec795b9d9e053ce71c30450ba2b979eab43b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 18 Apr 2023 07:14:18 +0000 Subject: [PATCH 262/289] refactor(bluetooth): Add battery reporting config. * Add dedicated battery reporting Kconfig that is `imply`d by enabling ZMK_BLE. --- app/CMakeLists.txt | 4 ++-- app/Kconfig | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index a647e883..ea3b8f73 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -77,8 +77,8 @@ endif() target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW app PRIVATE src/behaviors/behavior_rgb_underglow.c) target_sources_ifdef(CONFIG_ZMK_BACKLIGHT app PRIVATE src/behaviors/behavior_backlight.c) -target_sources_ifdef(CONFIG_ZMK_BLE app PRIVATE src/events/battery_state_changed.c) -target_sources_ifdef(CONFIG_ZMK_BLE app PRIVATE src/battery.c) +target_sources_ifdef(CONFIG_ZMK_BATTERY_REPORTING app PRIVATE src/events/battery_state_changed.c) +target_sources_ifdef(CONFIG_ZMK_BATTERY_REPORTING app PRIVATE src/battery.c) target_sources_ifdef(CONFIG_ZMK_SPLIT app PRIVATE src/events/split_peripheral_status_changed.c) add_subdirectory(src/split) diff --git a/app/Kconfig b/app/Kconfig index a54ad389..9c0606b0 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -114,9 +114,9 @@ menuconfig ZMK_BLE select BT_SMP_APP_PAIRING_ACCEPT select BT_PERIPHERAL select BT_DIS - select BT_BAS select BT_SETTINGS select SETTINGS + imply ZMK_BATTERY_REPORTING if ZMK_BLE @@ -322,6 +322,12 @@ endmenu menu "Power Management" +config ZMK_BATTERY_REPORTING + bool "Battery level detection/reporting" + default n + select SENSOR + select BT_BAS if ZMK_BLE + config ZMK_IDLE_TIMEOUT int "Milliseconds of inactivity before entering idle state (OLED shutoff, etc)" default 30000 From 8b29f6d34556d98df60f529e84ee66e49e6bf0c0 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 4 May 2023 00:04:20 +0000 Subject: [PATCH 263/289] refactor(sensors): Split data handling from triggers. * All sensor behaviors should see sensor data, then selectively only have some trigger their behaviors. --- app/include/drivers/behavior.h | 59 ++++++++++++-- app/src/behaviors/behavior_sensor_rotate.c | 3 +- .../behaviors/behavior_sensor_rotate_common.c | 31 +++++-- .../behaviors/behavior_sensor_rotate_common.h | 13 ++- .../behaviors/behavior_sensor_rotate_var.c | 3 +- app/src/keymap.c | 81 +++++++++++-------- 6 files changed, 135 insertions(+), 55 deletions(-) diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index 0aa5d85e..d7e57d02 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -23,9 +23,17 @@ * (Internal use only.) */ +enum behavior_sensor_binding_process_mode { + BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER, + BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_DISCARD, +}; + typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event); -typedef int (*behavior_sensor_keymap_binding_callback_t)( +typedef int (*behavior_sensor_keymap_binding_process_callback_t)( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + enum behavior_sensor_binding_process_mode mode); +typedef int (*behavior_sensor_keymap_binding_data_callback_t)( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data channel_data[channel_data_size]); @@ -41,7 +49,8 @@ __subsystem struct behavior_driver_api { behavior_keymap_binding_callback_t binding_convert_central_state_dependent_params; behavior_keymap_binding_callback_t binding_pressed; behavior_keymap_binding_callback_t binding_released; - behavior_sensor_keymap_binding_callback_t sensor_binding_triggered; + behavior_sensor_keymap_binding_data_callback_t sensor_binding_data; + behavior_sensor_keymap_binding_process_callback_t sensor_binding_process; }; /** * @endcond @@ -151,7 +160,7 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi } /** - * @brief Handle the a sensor keymap binding being triggered + * @brief Handle the a sensor keymap binding processing any incoming data from the sensor * @param binding Sensor keymap binding which was triggered. * @param sensor Pointer to the sensor device structure for the sensor driver instance. * @param virtual_key_position ZMK_KEYMAP_LEN + sensor number @@ -160,12 +169,12 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi * @retval 0 If successful. * @retval Negative errno code if failure. */ -__syscall int behavior_sensor_keymap_binding_triggered( +__syscall int behavior_sensor_keymap_binding_data( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data *channel_data); -static inline int z_impl_behavior_sensor_keymap_binding_triggered( +static inline int z_impl_behavior_sensor_keymap_binding_data( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data *channel_data) { @@ -177,12 +186,46 @@ static inline int z_impl_behavior_sensor_keymap_binding_triggered( const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->api; - if (api->sensor_binding_triggered == NULL) { + if (api->sensor_binding_data == NULL) { return -ENOTSUP; } - return api->sensor_binding_triggered(binding, event, sensor_config, channel_data_size, - channel_data); + return api->sensor_binding_data(binding, event, sensor_config, channel_data_size, channel_data); +} + +/** + * @brief Handle the keymap sensor binding being triggered after updating any local data + * @param dev Pointer to the device structure for the driver instance. + * @param param1 User parameter specified at time of behavior binding. + * @param param2 User parameter specified at time of behavior binding. + * + * @retval 0 If successful. + * @retval Negative errno code if failure. + */ +// clang-format off +__syscall int behavior_sensor_keymap_binding_process( + struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, + enum behavior_sensor_binding_process_mode mode); +// clang-format on + +static inline int +z_impl_behavior_sensor_keymap_binding_process(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, + enum behavior_sensor_binding_process_mode mode) { + const struct device *dev = device_get_binding(binding->behavior_dev); + + if (dev == NULL) { + return -EINVAL; + } + + const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->api; + + if (api->sensor_binding_process == NULL) { + return -ENOTSUP; + } + + return api->sensor_binding_process(binding, event, mode); } /** diff --git a/app/src/behaviors/behavior_sensor_rotate.c b/app/src/behaviors/behavior_sensor_rotate.c index 86846d5b..3b5bef62 100644 --- a/app/src/behaviors/behavior_sensor_rotate.c +++ b/app/src/behaviors/behavior_sensor_rotate.c @@ -13,7 +13,8 @@ #include "behavior_sensor_rotate_common.h" static const struct behavior_driver_api behavior_sensor_rotate_driver_api = { - .sensor_binding_triggered = zmk_behavior_sensor_rotate_common_trigger}; + .sensor_binding_data = zmk_behavior_sensor_rotate_common_data, + .sensor_binding_process = zmk_behavior_sensor_rotate_common_process}; static int behavior_sensor_rotate_init(const struct device *dev) { return 0; }; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index 99e4e019..0a2b619d 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -11,13 +11,12 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event, - const struct zmk_sensor_config *sensor_config, - size_t channel_data_size, - const struct zmk_sensor_channel_data *channel_data) { +int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, + size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data) { const struct device *dev = device_get_binding(binding->behavior_dev); - const struct behavior_sensor_rotate_config *cfg = dev->config; struct behavior_sensor_rotate_data *data = dev->data; const struct sensor_value value = channel_data[0].value; @@ -52,6 +51,26 @@ int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *bindi value.val1, value.val2, data->remainder[sensor_position].val1, data->remainder[sensor_position].val2, triggers, binding->param1, binding->param2); + data->triggers[sensor_position] = triggers; + return 0; +} + +int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, + enum behavior_sensor_binding_process_mode mode) { + const struct device *dev = device_get_binding(binding->behavior_dev); + const struct behavior_sensor_rotate_config *cfg = dev->config; + struct behavior_sensor_rotate_data *data = dev->data; + + const int sensor_position = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); + + if (mode != BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER) { + data->triggers[sensor_position] = 0; + return 0; + } + + int triggers = data->triggers[sensor_position]; + struct zmk_behavior_binding triggered_binding; if (triggers > 0) { triggered_binding = cfg->cw_binding; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.h b/app/src/behaviors/behavior_sensor_rotate_common.h index eab443a3..d9d4d855 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.h +++ b/app/src/behaviors/behavior_sensor_rotate_common.h @@ -4,6 +4,7 @@ * SPDX-License-Identifier: MIT */ +#include #include #include @@ -16,10 +17,14 @@ struct behavior_sensor_rotate_config { struct behavior_sensor_rotate_data { struct sensor_value remainder[ZMK_KEYMAP_SENSORS_LEN]; + int triggers[ZMK_KEYMAP_SENSORS_LEN]; }; -int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, +int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, + size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data); +int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, - const struct zmk_sensor_config *sensor_config, - size_t channel_data_size, - const struct zmk_sensor_channel_data *channel_data); \ No newline at end of file + enum behavior_sensor_binding_process_mode mode); \ No newline at end of file diff --git a/app/src/behaviors/behavior_sensor_rotate_var.c b/app/src/behaviors/behavior_sensor_rotate_var.c index 95bb9961..3c2373b0 100644 --- a/app/src/behaviors/behavior_sensor_rotate_var.c +++ b/app/src/behaviors/behavior_sensor_rotate_var.c @@ -13,7 +13,8 @@ #include "behavior_sensor_rotate_common.h" static const struct behavior_driver_api behavior_sensor_rotate_var_driver_api = { - .sensor_binding_triggered = zmk_behavior_sensor_rotate_common_trigger}; + .sensor_binding_data = zmk_behavior_sensor_rotate_common_data, + .sensor_binding_process = zmk_behavior_sensor_rotate_common_process}; static int behavior_sensor_rotate_var_init(const struct device *dev) { return 0; }; diff --git a/app/src/keymap.c b/app/src/keymap.c index 16543d37..c8121176 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -252,48 +252,59 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr } #if ZMK_KEYMAP_HAS_SENSORS -int zmk_keymap_sensor_triggered( - uint8_t sensor_position, size_t channel_data_size, - const struct zmk_sensor_channel_data channel_data[channel_data_size], int64_t timestamp) { - for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= _zmk_keymap_layer_default; layer--) { - if (zmk_keymap_layer_active(layer)) { - struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_position]; - const struct device *behavior; - int ret; +int zmk_keymap_sensor_event(uint8_t sensor_position, size_t channel_data_size, + const struct zmk_sensor_channel_data channel_data[channel_data_size], + int64_t timestamp) { + bool opaque_response = false; - LOG_DBG("layer: %d sensor_position: %d, binding name: %s", layer, sensor_position, - binding->behavior_dev); + for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= 0; layer--) { + struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_position]; + const struct device *behavior; + int ret; - behavior = device_get_binding(binding->behavior_dev); + LOG_DBG("layer: %d sensor_position: %d, binding name: %s", layer, sensor_position, + binding->behavior_dev); - if (!behavior) { - LOG_DBG("No behavior assigned to %d on layer %d", sensor_position, layer); - continue; - } + behavior = device_get_binding(binding->behavior_dev); - struct zmk_behavior_binding_event event = { - .layer = layer, - .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_position), - .timestamp = timestamp, - }; + if (!behavior) { + LOG_DBG("No behavior assigned to %d on layer %d", sensor_position, layer); + continue; + } - ret = behavior_sensor_keymap_binding_triggered( - binding, event, zmk_sensors_get_config_at_position(sensor_position), - channel_data_size, channel_data); + struct zmk_behavior_binding_event event = { + .layer = layer, + .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_position), + .timestamp = timestamp, + }; - if (ret > 0) { - LOG_DBG("behavior processing to continue to next layer"); - continue; - } else if (ret < 0) { - LOG_DBG("Behavior returned error: %d", ret); - return ret; - } else { - return ret; - } + ret = behavior_sensor_keymap_binding_data( + binding, event, zmk_sensors_get_config_at_position(sensor_position), channel_data_size, + channel_data); + + if (ret > 0) { + LOG_DBG("behavior processing to continue to next layer"); + continue; + } + + enum behavior_sensor_binding_process_mode mode = + (!opaque_response && layer >= _zmk_keymap_layer_default && + zmk_keymap_layer_active(layer)) + ? BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER + : BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_DISCARD; + + ret = behavior_sensor_keymap_binding_process(binding, event, mode); + + if (ret == ZMK_BEHAVIOR_OPAQUE) { + LOG_DBG("sensor event processing complete, behavior response was opaque"); + opaque_response = true; + } else if (ret < 0) { + LOG_DBG("Behavior returned error: %d", ret); + return ret; } } - return -ENOTSUP; + return 0; } #endif /* ZMK_KEYMAP_HAS_SENSORS */ @@ -308,8 +319,8 @@ int keymap_listener(const zmk_event_t *eh) { #if ZMK_KEYMAP_HAS_SENSORS const struct zmk_sensor_event *sensor_ev; if ((sensor_ev = as_zmk_sensor_event(eh)) != NULL) { - return zmk_keymap_sensor_triggered(sensor_ev->sensor_position, sensor_ev->channel_data_size, - sensor_ev->channel_data, sensor_ev->timestamp); + return zmk_keymap_sensor_event(sensor_ev->sensor_position, sensor_ev->channel_data_size, + sensor_ev->channel_data, sensor_ev->timestamp); } #endif /* ZMK_KEYMAP_HAS_SENSORS */ From 3a91b325138dfba8ede743aec28e2cdbc85d17d2 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 16 May 2023 22:27:01 -0700 Subject: [PATCH 264/289] refactor(sensors): Use "sensor index" consistently --- app/include/drivers/behavior.h | 8 ++--- app/include/zmk/events/sensor_event.h | 4 +-- app/include/zmk/sensors.h | 3 +- .../behaviors/behavior_sensor_rotate_common.c | 18 +++++----- app/src/keymap.c | 33 +++++++++---------- app/src/sensors.c | 16 ++++----- 6 files changed, 40 insertions(+), 42 deletions(-) diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index d7e57d02..bf2843bb 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -33,7 +33,7 @@ typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *b typedef int (*behavior_sensor_keymap_binding_process_callback_t)( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, enum behavior_sensor_binding_process_mode mode); -typedef int (*behavior_sensor_keymap_binding_data_callback_t)( +typedef int (*behavior_sensor_keymap_binding_accept_data_callback_t)( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data channel_data[channel_data_size]); @@ -49,7 +49,7 @@ __subsystem struct behavior_driver_api { behavior_keymap_binding_callback_t binding_convert_central_state_dependent_params; behavior_keymap_binding_callback_t binding_pressed; behavior_keymap_binding_callback_t binding_released; - behavior_sensor_keymap_binding_data_callback_t sensor_binding_data; + behavior_sensor_keymap_binding_accept_data_callback_t sensor_binding_data; behavior_sensor_keymap_binding_process_callback_t sensor_binding_process; }; /** @@ -169,12 +169,12 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi * @retval 0 If successful. * @retval Negative errno code if failure. */ -__syscall int behavior_sensor_keymap_binding_data( +__syscall int behavior_sensor_keymap_binding_accept_data( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data *channel_data); -static inline int z_impl_behavior_sensor_keymap_binding_data( +static inline int z_impl_behavior_sensor_keymap_binding_accept_data( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data *channel_data) { diff --git a/app/include/zmk/events/sensor_event.h b/app/include/zmk/events/sensor_event.h index c5157447..f6d23ac7 100644 --- a/app/include/zmk/events/sensor_event.h +++ b/app/include/zmk/events/sensor_event.h @@ -16,12 +16,12 @@ #define ZMK_SENSOR_EVENT_MAX_CHANNELS 1 struct zmk_sensor_event { - uint8_t sensor_position; - size_t channel_data_size; struct zmk_sensor_channel_data channel_data[ZMK_SENSOR_EVENT_MAX_CHANNELS]; int64_t timestamp; + + uint8_t sensor_index; }; ZMK_EVENT_DECLARE(zmk_sensor_event); \ No newline at end of file diff --git a/app/include/zmk/sensors.h b/app/include/zmk/sensors.h index 06fbc63e..8ac1c283 100644 --- a/app/include/zmk/sensors.h +++ b/app/include/zmk/sensors.h @@ -8,7 +8,6 @@ #include -#define _SENSOR_CHILD_LEN(node) 1 + #define ZMK_KEYMAP_SENSORS_NODE DT_INST(0, zmk_keymap_sensors) #define ZMK_KEYMAP_HAS_SENSORS DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_NODE, okay) #define ZMK_KEYMAP_SENSORS_BY_IDX(idx) DT_PHANDLE_BY_IDX(ZMK_KEYMAP_SENSORS_NODE, sensors, idx) @@ -19,7 +18,7 @@ #define ZMK_KEYMAP_SENSORS_LEN 0 #endif -const struct zmk_sensor_config *zmk_sensors_get_config_at_position(uint8_t sensor_position); +const struct zmk_sensor_config *zmk_sensors_get_config_at_index(uint8_t sensor_index); struct zmk_sensor_config { uint16_t triggers_per_rotation; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index 0a2b619d..4ccfea0e 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -21,7 +21,7 @@ int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, const struct sensor_value value = channel_data[0].value; int triggers; - int sensor_position = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); + int sensor_index = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); // Some funky special casing for "old encoder behavior" where ticks where reported in val2 only, // instead of rotational degrees in val1. @@ -29,7 +29,7 @@ int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, if (value.val1 == 0) { triggers = value.val2; } else { - struct sensor_value remainder = data->remainder[sensor_position]; + struct sensor_value remainder = data->remainder[sensor_index]; remainder.val1 += value.val1; remainder.val2 += value.val2; @@ -43,15 +43,15 @@ int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, triggers = remainder.val1 / trigger_degrees; remainder.val1 %= trigger_degrees; - data->remainder[sensor_position] = remainder; + data->remainder[sensor_index] = remainder; } LOG_DBG( "val1: %d, val2: %d, remainder: %d/%d triggers: %d inc keycode 0x%02X dec keycode 0x%02X", - value.val1, value.val2, data->remainder[sensor_position].val1, - data->remainder[sensor_position].val2, triggers, binding->param1, binding->param2); + value.val1, value.val2, data->remainder[sensor_index].val1, + data->remainder[sensor_index].val2, triggers, binding->param1, binding->param2); - data->triggers[sensor_position] = triggers; + data->triggers[sensor_index] = triggers; return 0; } @@ -62,14 +62,14 @@ int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *bindi const struct behavior_sensor_rotate_config *cfg = dev->config; struct behavior_sensor_rotate_data *data = dev->data; - const int sensor_position = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); + const int sensor_index = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); if (mode != BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER) { - data->triggers[sensor_position] = 0; + data->triggers[sensor_index] = 0; return 0; } - int triggers = data->triggers[sensor_position]; + int triggers = data->triggers[sensor_index]; struct zmk_behavior_binding triggered_binding; if (triggers > 0) { diff --git a/app/src/keymap.c b/app/src/keymap.c index c8121176..020faf3f 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -252,38 +252,37 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr } #if ZMK_KEYMAP_HAS_SENSORS -int zmk_keymap_sensor_event(uint8_t sensor_position, size_t channel_data_size, - const struct zmk_sensor_channel_data channel_data[channel_data_size], - int64_t timestamp) { +int zmk_keymap_sensor_event(uint8_t sensor_index, + const struct zmk_sensor_channel_data *channel_data, + size_t channel_data_size, int64_t timestamp) { bool opaque_response = false; for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= 0; layer--) { - struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_position]; - const struct device *behavior; - int ret; + struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_index]; - LOG_DBG("layer: %d sensor_position: %d, binding name: %s", layer, sensor_position, + LOG_DBG("layer: %d sensor_index: %d, binding name: %s", layer, sensor_index, binding->behavior_dev); - behavior = device_get_binding(binding->behavior_dev); - + const struct device *behavior = device_get_binding(binding->behavior_dev); if (!behavior) { - LOG_DBG("No behavior assigned to %d on layer %d", sensor_position, layer); + LOG_DBG("No behavior assigned to %d on layer %d", sensor_index, layer); continue; } struct zmk_behavior_binding_event event = { .layer = layer, - .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_position), + .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_index), .timestamp = timestamp, }; - ret = behavior_sensor_keymap_binding_data( - binding, event, zmk_sensors_get_config_at_position(sensor_position), channel_data_size, + int ret = behavior_sensor_keymap_binding_accept_data( + binding, event, zmk_sensors_get_config_at_index(sensor_index), channel_data_size, channel_data); - if (ret > 0) { - LOG_DBG("behavior processing to continue to next layer"); + if (ret < 0) { + LOG_WRN("behavior data accept for behavior %s returned an error (%d). Processing to " + "continue to next layer", + binding->behavior_dev, ret); continue; } @@ -319,8 +318,8 @@ int keymap_listener(const zmk_event_t *eh) { #if ZMK_KEYMAP_HAS_SENSORS const struct zmk_sensor_event *sensor_ev; if ((sensor_ev = as_zmk_sensor_event(eh)) != NULL) { - return zmk_keymap_sensor_event(sensor_ev->sensor_position, sensor_ev->channel_data_size, - sensor_ev->channel_data, sensor_ev->timestamp); + return zmk_keymap_sensor_event(sensor_ev->sensor_index, sensor_ev->channel_data, + sensor_ev->channel_data_size, sensor_ev->timestamp); } #endif /* ZMK_KEYMAP_HAS_SENSORS */ diff --git a/app/src/sensors.c b/app/src/sensors.c index 5f41c4f2..3a34ca23 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -19,7 +19,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if ZMK_KEYMAP_HAS_SENSORS struct sensors_item_cfg { - uint8_t sensor_position; + uint8_t sensor_index; const struct zmk_sensor_config *config; const struct device *dev; struct sensor_trigger trigger; @@ -57,17 +57,17 @@ static struct sensors_item_cfg sensors[] = {LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENS static ATOMIC_DEFINE(pending_sensors, ZMK_KEYMAP_SENSORS_LEN); -const struct zmk_sensor_config *zmk_sensors_get_config_at_position(uint8_t sensor_position) { - if (sensor_position > ARRAY_SIZE(configs)) { +const struct zmk_sensor_config *zmk_sensors_get_config_at_index(uint8_t sensor_index) { + if (sensor_index > ARRAY_SIZE(configs)) { return NULL; } - return &configs[sensor_position]; + return &configs[sensor_index]; } -static void trigger_sensor_data_for_position(uint32_t sensor_position) { +static void trigger_sensor_data_for_position(uint32_t sensor_index) { int err; - const struct sensors_item_cfg *item = &sensors[sensor_position]; + const struct sensors_item_cfg *item = &sensors[sensor_index]; err = sensor_sample_fetch(item->dev); if (err) { @@ -84,7 +84,7 @@ static void trigger_sensor_data_for_position(uint32_t sensor_position) { } ZMK_EVENT_RAISE(new_zmk_sensor_event( - (struct zmk_sensor_event){.sensor_position = item->sensor_position, + (struct zmk_sensor_event){.sensor_index = item->sensor_index, .channel_data = {(struct zmk_sensor_channel_data){ .value = value, .channel = item->trigger.chan}}, .timestamp = k_uptime_get()})); @@ -122,7 +122,7 @@ static void zmk_sensors_trigger_handler(const struct device *dev, static void zmk_sensors_init_item(uint8_t i) { LOG_DBG("Init sensor at index %d", i); - sensors[i].sensor_position = i; + sensors[i].sensor_index = i; if (!sensors[i].dev) { LOG_DBG("No local device for %d", i); From 753802cd79ce12d2e5d86c72ced3a4cc76fe4564 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 18 Jun 2023 05:59:31 +0000 Subject: [PATCH 265/289] fix(sensors): Clean ups based on code review. --- app/Kconfig | 17 +++++------------ app/include/drivers/behavior.h | 7 ++++--- app/src/behaviors/behavior_sensor_rotate.c | 2 +- .../behaviors/behavior_sensor_rotate_common.c | 9 ++++----- .../behaviors/behavior_sensor_rotate_common.h | 9 ++++----- app/src/behaviors/behavior_sensor_rotate_var.c | 2 +- app/src/sensors.c | 9 +++++++-- 7 files changed, 26 insertions(+), 29 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 9c0606b0..92641c14 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -194,18 +194,6 @@ rsource "src/split/Kconfig" #Basic Keyboard Setup endmenu -menu "Encoders" - -config ZMK_ENCODERS_DEFAULT_TRIGGERS_PER_ROTATION - int "Default behavior triggers per rotation" - help - Unless overridden for a specific behavior in the keymap/devicetree, this value - determines how many times to trigger the bound behavior per full rotation. - For tactile encoders with detents, this usually should match the number of - detents per rotation of the encoder. - default 30 - -endmenu menu "Display/LED Options" rsource "src/display/Kconfig" @@ -548,6 +536,11 @@ if ZMK_KEYMAP_SENSORS config ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION int "Default triggers per rotation" + help + Unless overridden for a sensor in the board/shield/devicetree, this value + determines how many times to trigger the bound behavior per full rotation. + For tactile encoders with detents, this usually should match the number of + detents per rotation of the encoder. default 20 endif # ZMK_KEYMAP_SENSORS diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index bf2843bb..066cc723 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -49,7 +49,7 @@ __subsystem struct behavior_driver_api { behavior_keymap_binding_callback_t binding_convert_central_state_dependent_params; behavior_keymap_binding_callback_t binding_pressed; behavior_keymap_binding_callback_t binding_released; - behavior_sensor_keymap_binding_accept_data_callback_t sensor_binding_data; + behavior_sensor_keymap_binding_accept_data_callback_t sensor_binding_accept_data; behavior_sensor_keymap_binding_process_callback_t sensor_binding_process; }; /** @@ -186,11 +186,12 @@ static inline int z_impl_behavior_sensor_keymap_binding_accept_data( const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->api; - if (api->sensor_binding_data == NULL) { + if (api->sensor_binding_accept_data == NULL) { return -ENOTSUP; } - return api->sensor_binding_data(binding, event, sensor_config, channel_data_size, channel_data); + return api->sensor_binding_accept_data(binding, event, sensor_config, channel_data_size, + channel_data); } /** diff --git a/app/src/behaviors/behavior_sensor_rotate.c b/app/src/behaviors/behavior_sensor_rotate.c index 3b5bef62..822bc206 100644 --- a/app/src/behaviors/behavior_sensor_rotate.c +++ b/app/src/behaviors/behavior_sensor_rotate.c @@ -13,7 +13,7 @@ #include "behavior_sensor_rotate_common.h" static const struct behavior_driver_api behavior_sensor_rotate_driver_api = { - .sensor_binding_data = zmk_behavior_sensor_rotate_common_data, + .sensor_binding_accept_data = zmk_behavior_sensor_rotate_common_accept_data, .sensor_binding_process = zmk_behavior_sensor_rotate_common_process}; static int behavior_sensor_rotate_init(const struct device *dev) { return 0; }; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index 4ccfea0e..eea7bf48 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -11,11 +11,10 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event, - const struct zmk_sensor_config *sensor_config, - size_t channel_data_size, - const struct zmk_sensor_channel_data *channel_data) { +int zmk_behavior_sensor_rotate_common_accept_data( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data) { const struct device *dev = device_get_binding(binding->behavior_dev); struct behavior_sensor_rotate_data *data = dev->data; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.h b/app/src/behaviors/behavior_sensor_rotate_common.h index d9d4d855..d354b679 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.h +++ b/app/src/behaviors/behavior_sensor_rotate_common.h @@ -20,11 +20,10 @@ struct behavior_sensor_rotate_data { int triggers[ZMK_KEYMAP_SENSORS_LEN]; }; -int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event, - const struct zmk_sensor_config *sensor_config, - size_t channel_data_size, - const struct zmk_sensor_channel_data *channel_data); +int zmk_behavior_sensor_rotate_common_accept_data( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data); int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, enum behavior_sensor_binding_process_mode mode); \ No newline at end of file diff --git a/app/src/behaviors/behavior_sensor_rotate_var.c b/app/src/behaviors/behavior_sensor_rotate_var.c index 3c2373b0..e6d20cab 100644 --- a/app/src/behaviors/behavior_sensor_rotate_var.c +++ b/app/src/behaviors/behavior_sensor_rotate_var.c @@ -13,7 +13,7 @@ #include "behavior_sensor_rotate_common.h" static const struct behavior_driver_api behavior_sensor_rotate_var_driver_api = { - .sensor_binding_data = zmk_behavior_sensor_rotate_common_data, + .sensor_binding_accept_data = zmk_behavior_sensor_rotate_common_accept_data, .sensor_binding_process = zmk_behavior_sensor_rotate_common_process}; static int behavior_sensor_rotate_var_init(const struct device *dev) { return 0; }; diff --git a/app/src/sensors.c b/app/src/sensors.c index 3a34ca23..e339afe0 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -19,10 +19,10 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if ZMK_KEYMAP_HAS_SENSORS struct sensors_item_cfg { - uint8_t sensor_index; const struct zmk_sensor_config *config; const struct device *dev; struct sensor_trigger trigger; + uint8_t sensor_index; }; #define _SENSOR_ITEM(idx, node) \ @@ -43,7 +43,11 @@ struct sensors_item_cfg { CONFIG_ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION)) \ } #define SENSOR_CHILD_DEFAULTS(idx, arg) \ - { .triggers_per_rotation = DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, 20) } + { \ + .triggers_per_rotation = \ + DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, \ + CONFIG_ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION) \ + } static struct zmk_sensor_config configs[] = { #if ZMK_KEYMAP_SENSORS_CHILD_COUNT > 0 @@ -85,6 +89,7 @@ static void trigger_sensor_data_for_position(uint32_t sensor_index) { ZMK_EVENT_RAISE(new_zmk_sensor_event( (struct zmk_sensor_event){.sensor_index = item->sensor_index, + .channel_data_size = 1, .channel_data = {(struct zmk_sensor_channel_data){ .value = value, .channel = item->trigger.chan}}, .timestamp = k_uptime_get()})); From 5763558a02154ab599775c770fcf954931816e52 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 30 May 2023 02:38:28 +0000 Subject: [PATCH 266/289] feat(blog): Add post about sensor refactor. * Document changed configuration, support for other Zephyr drivers, next steps. Co-authored-by: Cem Aksoylar --- docs/blog/2023-06-18-encoder-refactors.md | 119 ++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 docs/blog/2023-06-18-encoder-refactors.md diff --git a/docs/blog/2023-06-18-encoder-refactors.md b/docs/blog/2023-06-18-encoder-refactors.md new file mode 100644 index 00000000..26f9cee8 --- /dev/null +++ b/docs/blog/2023-06-18-encoder-refactors.md @@ -0,0 +1,119 @@ +--- +title: "Major Encoder Refactor" +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 +tags: [firmware, zephyr, sensors, encoders] +--- + +Today, we merged a significant change to the low level sensor code that is used to support encoders. In particular, +this paves the way for completing the work on supporting split peripheral sensors/encoders, and other future sensors +like pointing devices. + +As part of the work, backwards compatibility for existing shields has been retained, but only for a grace period to allow out-of-tree shields to move to the new approach for encoders. + +Special thanks to [joelspadin] for the _thorough_ code review and testing throughout the development of the refactor. + +## Summary of Changes + +The following items have been merged: + +1. Split configuration of hardware details, and behavior configuration to allow more flexible functionality of sensors/encoders, in particular linear encoders that lack detents/"clicks" as they rotate. +2. Support for upstream Zephyr sensor drivers, including the NRFX QDEC driver that can be used on nRF52 based keyboards. +3. Sensor data handling changes that pave the way for split sensor handling easily. + +## Configuration Changes + +The major changes to configuration in the devicetree files relates to how the number of steps/triggers for a given encoder are set. In particular, the number of pulses/steps for a given encoder is configured first, allowing ZMK to determine the exact angular degrees of change that is represented by a single pulse on the data lines to that encoder. + +Once that angular degrees mapping is completed, now independently there is a configuration setting to control how many triggers of the behavior in the keymap should occur for each full rotation of the sensor. Another way to think of this is "how many degrees of rotation results in a triggering of the sensor behavior in your keymap layer". + +Splitting these two parts of the encoder configuration allows greater flexibility, and fine grained control of encoder behavior for linear encoders that don't have fixed detents. + +### Old Configuration + +Previously, an encoder configuration looked like: + +``` + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + }; +``` + +Here, the `resolution` property was used to indicate how many encoder pulses should trigger the sensor behavior one time. Next, the encoder is selected in the sensors node: + +``` + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; +``` + +That was the entirety of the configuration for encoders. + +### New Configuration + +``` + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + steps = <80>; + }; +``` + +Here, the `steps` property is now used to indicate how many encoder pulses there are in a single complete rotation of the encoder. Next, the encoder is selected in the sensors node as before, but an additional configuration is used to indicate how many times the encoder should trigger the behavior in your keymap per rotation: + +``` + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <20>; + }; +``` + +For tactile encoders that have detents, the `triggers-per-rotation` would match the number of detents on the encoder. For linear encoders, the value can be chosen to suit your needs. + +## Zephyr Sensor Drivers + +The configuration changes bring ZMK's code in line with how upstream Zephyr sensor drivers handle rotations. This has the added advantage of allowing us to leverage other sensor drivers. On Nordic MCUs, like nRF52840, the NRFX QDEC driver can be used, for example: + +``` +&pinctrl { + qdec_default: qdec_default { + group1 { + psels = , + ; + bias-pull-up; + }; + }; +}; + +// Set up the QDEC hardware based driver and give it the same label as the deleted node. +encoder: &qdec0 { + status = "okay"; + led-pre = <0>; + steps = <80>; + pinctrl-0 = <&qdec_default>; + pinctrl-names = "default"; +}; +``` + +The NRFX QDEC driver has the advantage of supporting optical encoders as well, and although it polls, it does so in hardware without waking the MCU core; initial basic power profiling is promising. + +## Split Sensor/Encoder Support + +In addition to the refactors for splitting the configuration, the changes merged included refactors designed to simplify and move forward with the long outstanding feature of supporting encoders on the peripheral side of split keyboards. That work is planned as a follow up. + +## Deprecation + +The old configuration will be supported for a period of one month, and then removed, giving users a grace period to complete the migration to the new separated configuration. + +[petejohanson]: https://github.com/petejohanson +[joelspadin]: https://github.com/joelspadin From e686fce4d917b708da7f2baba4115043d3f0deab Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 19 May 2023 18:41:08 -0400 Subject: [PATCH 267/289] refactor(split): allow central to define connection parameters Fixes #1614 --- app/src/split/bluetooth/Kconfig | 17 +++++++++++++++-- app/src/split/bluetooth/central.c | 4 +++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index e2c8d5c3..0610b667 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -33,6 +33,18 @@ config ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_QUEUE_SIZE int "Max number of behavior run events to queue to send to the peripheral(s)" default 5 +config ZMK_SPLIT_BLE_PREF_INT + int "Connection interval to use for split central/peripheral connection" + default 6 + +config ZMK_SPLIT_BLE_PREF_LATENCY + int "Latency to use for split central/peripheral connection" + default 30 + +config ZMK_SPLIT_BLE_PREF_TIMEOUT + int "Supervision timeout to use for split central/peripheral connection" + default 400 + endif # ZMK_SPLIT_ROLE_CENTRAL if !ZMK_SPLIT_ROLE_CENTRAL @@ -58,8 +70,9 @@ config BT_MAX_PAIRED config BT_MAX_CONN default 1 -config BT_PERIPHERAL_PREF_MAX_INT - default 6 +# Allow central to specify connection parameters. +config BT_GAP_AUTO_UPDATE_CONN_PARAMS + default n #!ZMK_SPLIT_ROLE_CENTRAL endif diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 53e61be6..147760ff 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -383,7 +383,9 @@ static bool split_central_eir_found(const bt_addr_le_t *addr) { struct peripheral_slot *slot = &peripherals[slot_idx]; LOG_DBG("Initiating new connnection"); - struct bt_le_conn_param *param = BT_LE_CONN_PARAM(0x0006, 0x0006, 30, 400); + struct bt_le_conn_param *param = + BT_LE_CONN_PARAM(CONFIG_ZMK_SPLIT_BLE_PREF_INT, CONFIG_ZMK_SPLIT_BLE_PREF_INT, + CONFIG_ZMK_SPLIT_BLE_PREF_LATENCY, CONFIG_ZMK_SPLIT_BLE_PREF_TIMEOUT); err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, param, &slot->conn); if (err < 0) { LOG_ERR("Create conn failed (err %d) (create conn? 0x%04x)", err, BT_HCI_OP_LE_CREATE_CONN); From 805dd4a53bc9ff7fe1f7eb5c9ea332a9affbc5f9 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 8 Apr 2022 15:38:46 +0000 Subject: [PATCH 268/289] feat(behaviors): Support parameterized macros. * Add two new compatibles for macros that take one or two parameters when bound in a keymap. * Use `¯o_param_1to1`, `¯o_param_1to2`, `¯o_param_2to1`, and `¯o_param_2to2` control entries in the bindings for the macro to have the next binding entry have it's values substituted. Co-authored-by: Cem Aksoylar --- app/CMakeLists.txt | 2 +- app/Kconfig.behaviors | 7 +- app/dts/behaviors/macros.dtsi | 55 ++++++++-- app/dts/bindings/behaviors/macro_base.yaml | 13 +++ .../zmk,behavior-macro-one-param.yaml | 8 ++ .../zmk,behavior-macro-two-param.yaml | 8 ++ .../behaviors/zmk,behavior-macro.yaml | 13 +-- .../bindings/macros/zmk,macro-param-1to1.yaml | 8 ++ .../bindings/macros/zmk,macro-param-1to2.yaml | 8 ++ .../bindings/macros/zmk,macro-param-2to1.yaml | 8 ++ .../bindings/macros/zmk,macro-param-2to2.yaml | 8 ++ app/src/behaviors/behavior_macro.c | 100 +++++++++++++----- .../place-holder-parameters/events.patterns | 1 + .../keycode_events.snapshot | 16 +++ .../native_posix_64.keymap | 63 +++++++++++ docs/docs/behaviors/macros.md | 40 +++++++ 16 files changed, 310 insertions(+), 48 deletions(-) create mode 100644 app/dts/bindings/behaviors/macro_base.yaml create mode 100644 app/dts/bindings/behaviors/zmk,behavior-macro-one-param.yaml create mode 100644 app/dts/bindings/behaviors/zmk,behavior-macro-two-param.yaml create mode 100644 app/dts/bindings/macros/zmk,macro-param-1to1.yaml create mode 100644 app/dts/bindings/macros/zmk,macro-param-1to2.yaml create mode 100644 app/dts/bindings/macros/zmk,macro-param-2to1.yaml create mode 100644 app/dts/bindings/macros/zmk,macro-param-2to2.yaml create mode 100644 app/tests/macros/place-holder-parameters/events.patterns create mode 100644 app/tests/macros/place-holder-parameters/keycode_events.snapshot create mode 100644 app/tests/macros/place-holder-parameters/native_posix_64.keymap diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index ea3b8f73..4c1c63c2 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -43,7 +43,7 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/behaviors/behavior_sticky_key.c) target_sources(app PRIVATE src/behaviors/behavior_caps_word.c) target_sources(app PRIVATE src/behaviors/behavior_key_repeat.c) - target_sources(app PRIVATE src/behaviors/behavior_macro.c) + target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_MACRO app PRIVATE src/behaviors/behavior_macro.c) target_sources(app PRIVATE src/behaviors/behavior_momentary_layer.c) target_sources(app PRIVATE src/behaviors/behavior_mod_morph.c) target_sources(app PRIVATE src/behaviors/behavior_outputs.c) diff --git a/app/Kconfig.behaviors b/app/Kconfig.behaviors index 17850eae..9e4a82b0 100644 --- a/app/Kconfig.behaviors +++ b/app/Kconfig.behaviors @@ -21,4 +21,9 @@ config ZMK_BEHAVIOR_SENSOR_ROTATE_VAR bool default y depends on DT_HAS_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR_ENABLED - select ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON \ No newline at end of file + select ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON + +config ZMK_BEHAVIOR_MACRO + bool + default y + depends on DT_HAS_ZMK_BEHAVIOR_MACRO_ENABLED || DT_HAS_ZMK_BEHAVIOR_MACRO_ONE_PARAM_ENABLED || DT_HAS_ZMK_BEHAVIOR_MACRO_TWO_PARAM_ENABLED \ No newline at end of file diff --git a/app/dts/behaviors/macros.dtsi b/app/dts/behaviors/macros.dtsi index 757c046e..36b4a8d3 100644 --- a/app/dts/behaviors/macros.dtsi +++ b/app/dts/behaviors/macros.dtsi @@ -4,16 +4,33 @@ * SPDX-License-Identifier: MIT */ +#define MACRO_PLACEHOLDER 0 #define ZMK_MACRO_STRINGIFY(x) #x #define ZMK_MACRO(name,...) \ - name: name { \ - label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ - compatible = "zmk,behavior-macro"; \ - #binding-cells = <0>; \ - __VA_ARGS__ \ - }; +name: name { \ + label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ + compatible = "zmk,behavior-macro"; \ + #binding-cells = <0>; \ + __VA_ARGS__ \ +}; - / { +#define ZMK_MACRO1(name,...) \ +name: name { \ + label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ + compatible = "zmk,behavior-macro-one-param"; \ + #binding-cells = <1>; \ + __VA_ARGS__ \ +}; + +#define ZMK_MACRO2(name,...) \ +name: name { \ + label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ + compatible = "zmk,behavior-macro-two-param"; \ + #binding-cells = <2>; \ + __VA_ARGS__ \ +}; + +/ { behaviors { macro_tap: macro_control_mode_tap { compatible = "zmk,macro-control-mode-tap"; @@ -50,5 +67,29 @@ label = "MAC_WAIT_REL"; #binding-cells = <0>; }; + + macro_param_1to1: macro_param_1to1 { + compatible = "zmk,macro-param-1to1"; + label = "MAC_PARAM_1TO1"; + #binding-cells = <0>; + }; + + macro_param_1to2: macro_param_1to2 { + compatible = "zmk,macro-param-1to2"; + label = "MAC_PARAM_1TO2"; + #binding-cells = <0>; + }; + + macro_param_2to1: macro_param_2to1 { + compatible = "zmk,macro-param-2to1"; + label = "MAC_PARAM_2TO1"; + #binding-cells = <0>; + }; + + macro_param_2to2: macro_param_2to2 { + compatible = "zmk,macro-param-2to2"; + label = "MAC_PARAM_2TO2"; + #binding-cells = <0>; + }; }; }; diff --git a/app/dts/bindings/behaviors/macro_base.yaml b/app/dts/bindings/behaviors/macro_base.yaml new file mode 100644 index 00000000..236ee33d --- /dev/null +++ b/app/dts/bindings/behaviors/macro_base.yaml @@ -0,0 +1,13 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +properties: + bindings: + type: phandle-array + required: true + wait-ms: + type: int + description: The default time to wait (in milliseconds) before triggering the next behavior in the macro bindings list. + tap-ms: + type: int + description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding diff --git a/app/dts/bindings/behaviors/zmk,behavior-macro-one-param.yaml b/app/dts/bindings/behaviors/zmk,behavior-macro-one-param.yaml new file mode 100644 index 00000000..4fe5a2fb --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-macro-one-param.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Behavior + +compatible: "zmk,behavior-macro-one-param" + +include: [one_param.yaml, macro_base.yaml] diff --git a/app/dts/bindings/behaviors/zmk,behavior-macro-two-param.yaml b/app/dts/bindings/behaviors/zmk,behavior-macro-two-param.yaml new file mode 100644 index 00000000..ab6e32b4 --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-macro-two-param.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Behavior + +compatible: "zmk,behavior-macro-two-param" + +include: [two_param.yaml, macro_base.yaml] diff --git a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml index e6f6757d..035dd943 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml @@ -5,15 +5,4 @@ description: Macro Behavior compatible: "zmk,behavior-macro" -include: zero_param.yaml - -properties: - bindings: - type: phandle-array - required: true - wait-ms: - type: int - description: The default time to wait (in milliseconds) before triggering the next behavior in the macro bindings list. - tap-ms: - type: int - description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding +include: [zero_param.yaml, macro_base.yaml] diff --git a/app/dts/bindings/macros/zmk,macro-param-1to1.yaml b/app/dts/bindings/macros/zmk,macro-param-1to1.yaml new file mode 100644 index 00000000..ae0d54df --- /dev/null +++ b/app/dts/bindings/macros/zmk,macro-param-1to1.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Parameter One Substituted Into Next Binding's First Parameter + +compatible: "zmk,macro-param-1to1" + +include: zero_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-param-1to2.yaml b/app/dts/bindings/macros/zmk,macro-param-1to2.yaml new file mode 100644 index 00000000..1018526c --- /dev/null +++ b/app/dts/bindings/macros/zmk,macro-param-1to2.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Parameter One Substituted Into Next Binding's Second Parameter + +compatible: "zmk,macro-param-1to2" + +include: zero_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-param-2to1.yaml b/app/dts/bindings/macros/zmk,macro-param-2to1.yaml new file mode 100644 index 00000000..3ebf8fc9 --- /dev/null +++ b/app/dts/bindings/macros/zmk,macro-param-2to1.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Parameter Two Substituted Into Next Binding's First Parameter + +compatible: "zmk,macro-param-2to1" + +include: zero_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-param-2to2.yaml b/app/dts/bindings/macros/zmk,macro-param-2to2.yaml new file mode 100644 index 00000000..e3ebe40f --- /dev/null +++ b/app/dts/bindings/macros/zmk,macro-param-2to2.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Parameter Two Substituted Into Next Binding's Second Parameter + +compatible: "zmk,macro-param-2to2" + +include: zero_param.yaml diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index e84f1fc8..c4728453 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -4,8 +4,6 @@ * SPDX-License-Identifier: MIT */ -#define DT_DRV_COMPAT zmk_behavior_macro - #include #include #include @@ -15,20 +13,22 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - enum behavior_macro_mode { MACRO_MODE_TAP, MACRO_MODE_PRESS, MACRO_MODE_RELEASE, }; +enum param_source { PARAM_SOURCE_BINDING, PARAM_SOURCE_MACRO_1ST, PARAM_SOURCE_MACRO_2ND }; + struct behavior_macro_trigger_state { uint32_t wait_ms; uint32_t tap_ms; enum behavior_macro_mode mode; uint16_t start_index; uint16_t count; + enum param_source param1_source; + enum param_source param2_source; }; struct behavior_macro_state { @@ -52,6 +52,11 @@ struct behavior_macro_config { #define WAIT_TIME DT_PROP(DT_INST(0, zmk_macro_control_wait_time), label) #define WAIT_REL DT_PROP(DT_INST(0, zmk_macro_pause_for_release), label) +#define P1TO1 DT_PROP(DT_INST(0, zmk_macro_param_1to1), label) +#define P1TO2 DT_PROP(DT_INST(0, zmk_macro_param_1to2), label) +#define P2TO1 DT_PROP(DT_INST(0, zmk_macro_param_2to1), label) +#define P2TO2 DT_PROP(DT_INST(0, zmk_macro_param_2to2), label) + #define ZM_IS_NODE_MATCH(a, b) (strcmp(a, b) == 0) #define IS_TAP_MODE(dev) ZM_IS_NODE_MATCH(dev, TAP_MODE) #define IS_PRESS_MODE(dev) ZM_IS_NODE_MATCH(dev, PRESS_MODE) @@ -61,6 +66,11 @@ struct behavior_macro_config { #define IS_WAIT_TIME(dev) ZM_IS_NODE_MATCH(dev, WAIT_TIME) #define IS_PAUSE(dev) ZM_IS_NODE_MATCH(dev, WAIT_REL) +#define IS_P1TO1(dev) ZM_IS_NODE_MATCH(dev, P1TO1) +#define IS_P1TO2(dev) ZM_IS_NODE_MATCH(dev, P1TO2) +#define IS_P2TO1(dev) ZM_IS_NODE_MATCH(dev, P2TO1) +#define IS_P2TO2(dev) ZM_IS_NODE_MATCH(dev, P2TO2) + static bool handle_control_binding(struct behavior_macro_trigger_state *state, const struct zmk_behavior_binding *binding) { if (IS_TAP_MODE(binding->behavior_dev)) { @@ -78,6 +88,18 @@ static bool handle_control_binding(struct behavior_macro_trigger_state *state, } else if (IS_WAIT_TIME(binding->behavior_dev)) { state->wait_ms = binding->param1; LOG_DBG("macro wait time set: %d", state->wait_ms); + } else if (IS_P1TO1(binding->behavior_dev)) { + state->param1_source = PARAM_SOURCE_MACRO_1ST; + LOG_DBG("macro param: 1to1"); + } else if (IS_P1TO2(binding->behavior_dev)) { + state->param2_source = PARAM_SOURCE_MACRO_1ST; + LOG_DBG("macro param: 1to2"); + } else if (IS_P2TO1(binding->behavior_dev)) { + state->param1_source = PARAM_SOURCE_MACRO_2ND; + LOG_DBG("macro param: 2to1"); + } else if (IS_P2TO2(binding->behavior_dev)) { + state->param2_source = PARAM_SOURCE_MACRO_2ND; + LOG_DBG("macro param: 2to2"); } else { return false; } @@ -110,21 +132,47 @@ static int behavior_macro_init(const struct device *dev) { return 0; }; +static uint32_t select_param(enum param_source param_source, uint32_t source_binding, + const struct zmk_behavior_binding *macro_binding) { + switch (param_source) { + case PARAM_SOURCE_MACRO_1ST: + return macro_binding->param1; + case PARAM_SOURCE_MACRO_2ND: + return macro_binding->param2; + default: + return source_binding; + } +}; + +static void replace_params(struct behavior_macro_trigger_state *state, + struct zmk_behavior_binding *binding, + const struct zmk_behavior_binding *macro_binding) { + binding->param1 = select_param(state->param1_source, binding->param1, macro_binding); + binding->param2 = select_param(state->param2_source, binding->param2, macro_binding); + + state->param1_source = PARAM_SOURCE_BINDING; + state->param2_source = PARAM_SOURCE_BINDING; +} + static void queue_macro(uint32_t position, const struct zmk_behavior_binding bindings[], - struct behavior_macro_trigger_state state) { + struct behavior_macro_trigger_state state, + const struct zmk_behavior_binding *macro_binding) { LOG_DBG("Iterating macro bindings - starting: %d, count: %d", state.start_index, state.count); for (int i = state.start_index; i < state.start_index + state.count; i++) { if (!handle_control_binding(&state, &bindings[i])) { + struct zmk_behavior_binding binding = bindings[i]; + replace_params(&state, &binding, macro_binding); + switch (state.mode) { case MACRO_MODE_TAP: - zmk_behavior_queue_add(position, bindings[i], true, state.tap_ms); - zmk_behavior_queue_add(position, bindings[i], false, state.wait_ms); + zmk_behavior_queue_add(position, binding, true, state.tap_ms); + zmk_behavior_queue_add(position, binding, false, state.wait_ms); break; case MACRO_MODE_PRESS: - zmk_behavior_queue_add(position, bindings[i], true, state.wait_ms); + zmk_behavior_queue_add(position, binding, true, state.wait_ms); break; case MACRO_MODE_RELEASE: - zmk_behavior_queue_add(position, bindings[i], false, state.wait_ms); + zmk_behavior_queue_add(position, binding, false, state.wait_ms); break; default: LOG_ERR("Unknown macro mode: %d", state.mode); @@ -145,7 +193,7 @@ static int on_macro_binding_pressed(struct zmk_behavior_binding *binding, .start_index = 0, .count = state->press_bindings_count}; - queue_macro(event.position, cfg->bindings, trigger_state); + queue_macro(event.position, cfg->bindings, trigger_state, binding); return ZMK_BEHAVIOR_OPAQUE; } @@ -156,7 +204,7 @@ static int on_macro_binding_released(struct zmk_behavior_binding *binding, const struct behavior_macro_config *cfg = dev->config; struct behavior_macro_state *state = dev->data; - queue_macro(event.position, cfg->bindings, state->release_state); + queue_macro(event.position, cfg->bindings, state->release_state, binding); return ZMK_BEHAVIOR_OPAQUE; } @@ -166,22 +214,20 @@ static const struct behavior_driver_api behavior_macro_driver_api = { .binding_released = on_macro_binding_released, }; -#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, DT_DRV_INST(drv_inst)) - #define TRANSFORMED_BEHAVIORS(n) \ - {LISTIFY(DT_PROP_LEN(DT_DRV_INST(n), bindings), BINDING_WITH_COMMA, (, ), n)}, + {LISTIFY(DT_PROP_LEN(n, bindings), ZMK_KEYMAP_EXTRACT_BINDING, (, ), n)}, -#define MACRO_INST(n) \ - static struct behavior_macro_state behavior_macro_state_##n = {}; \ - static struct behavior_macro_config behavior_macro_config_##n = { \ - .default_wait_ms = DT_INST_PROP_OR(n, wait_ms, CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS), \ - .default_tap_ms = DT_INST_PROP_OR(n, tap_ms, CONFIG_ZMK_MACRO_DEFAULT_TAP_MS), \ - .count = DT_INST_PROP_LEN(n, bindings), \ - .bindings = TRANSFORMED_BEHAVIORS(n)}; \ - DEVICE_DT_INST_DEFINE(n, behavior_macro_init, NULL, &behavior_macro_state_##n, \ - &behavior_macro_config_##n, APPLICATION, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_macro_driver_api); +#define MACRO_INST(inst) \ + static struct behavior_macro_state behavior_macro_state_##inst = {}; \ + static struct behavior_macro_config behavior_macro_config_##inst = { \ + .default_wait_ms = DT_PROP_OR(inst, wait_ms, CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS), \ + .default_tap_ms = DT_PROP_OR(inst, tap_ms, CONFIG_ZMK_MACRO_DEFAULT_TAP_MS), \ + .count = DT_PROP_LEN(inst, bindings), \ + .bindings = TRANSFORMED_BEHAVIORS(inst)}; \ + DEVICE_DT_DEFINE(inst, behavior_macro_init, NULL, &behavior_macro_state_##inst, \ + &behavior_macro_config_##inst, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_macro_driver_api); -DT_INST_FOREACH_STATUS_OKAY(MACRO_INST) - -#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ +DT_FOREACH_STATUS_OKAY(zmk_behavior_macro, MACRO_INST) +DT_FOREACH_STATUS_OKAY(zmk_behavior_macro_one_param, MACRO_INST) +DT_FOREACH_STATUS_OKAY(zmk_behavior_macro_two_param, MACRO_INST) diff --git a/app/tests/macros/place-holder-parameters/events.patterns b/app/tests/macros/place-holder-parameters/events.patterns new file mode 100644 index 00000000..3c9d3f83 --- /dev/null +++ b/app/tests/macros/place-holder-parameters/events.patterns @@ -0,0 +1 @@ +s/.*hid_listener_keycode/kp/p \ No newline at end of file diff --git a/app/tests/macros/place-holder-parameters/keycode_events.snapshot b/app/tests/macros/place-holder-parameters/keycode_events.snapshot new file mode 100644 index 00000000..f198a49b --- /dev/null +++ b/app/tests/macros/place-holder-parameters/keycode_events.snapshot @@ -0,0 +1,16 @@ +kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x38 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x38 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x34 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x34 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x34 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x34 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/macros/place-holder-parameters/native_posix_64.keymap b/app/tests/macros/place-holder-parameters/native_posix_64.keymap new file mode 100644 index 00000000..59d78b5e --- /dev/null +++ b/app/tests/macros/place-holder-parameters/native_posix_64.keymap @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include + +/ { + macros { + slash_macro: slash_macro { + #binding-cells = <2>; + label = "ZM_SLASH"; + compatible = "zmk,behavior-macro-two-param"; + wait-ms = <40>; + tap-ms = <40>; + bindings = < + ¯o_param_1to1 &kp MACRO_PLACEHOLDER + &kp SLASH + ¯o_param_2to1 &kp MACRO_PLACEHOLDER>; + }; + + to_second_macro: to_second_macro { + #binding-cells = <2>; + label = "ZMK_TO_SECOND"; + compatible = "zmk,behavior-macro-two-param"; + wait-ms = <40>; + tap-ms = <40>; + bindings = < + ¯o_param_1to2 &mt LSHIFT MACRO_PLACEHOLDER + ¯o_param_2to2 &mt RSHIFT MACRO_PLACEHOLDER>; + }; + + quote_letter_macro: quote_letter_macro { + #binding-cells = <1>; + label = "ZMK_QLET"; + compatible = "zmk,behavior-macro-one-param"; + wait-ms = <40>; + tap-ms = <40>; + bindings = < + &kp QUOT + ¯o_param_1to1 &kp MACRO_PLACEHOLDER + &kp QUOT>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; + + default_layer { + bindings = < + &slash_macro A B "e_letter_macro B + &to_second_macro E F &kp C>; + }; + }; +}; + +&kscan { + events = ; +}; \ No newline at end of file diff --git a/docs/docs/behaviors/macros.md b/docs/docs/behaviors/macros.md index 1628e0cb..40c333a9 100644 --- a/docs/docs/behaviors/macros.md +++ b/docs/docs/behaviors/macros.md @@ -49,6 +49,22 @@ For use cases involving sending a single keycode with modifiers, for instance ct with [modifier functions](../codes/modifiers.mdx#modifier-functions) can be used instead of a macro. ::: +### Parameterized Macros + +Macros can also be "parameterized", allowing them to be bound in your keymap with unique values passed into them, e.g.: + +``` + raise_layer { + bindings = <&my_cool_macro A> + }; +``` + +When defining a parameterized macro, a different `compatible` value will be used depending on how many parameters are passed into it: + +- `zmk,behavior-macro` - a parameter that takes no parameters. +- `zmk,behavior-macro-one-param` - a parameter that takes one parameter when used. +- `zmk,behavior-macro-two-param` - a parameter that takes two parameters when used. + ### Bindings Like [hold-taps](/docs/behaviors/hold-tap), macros are created by composing other behaviors, and any of those behaviors can @@ -67,6 +83,30 @@ bindings There are a set of special macro controls that can be included in the `bindings` list to modify the way the macro is processed. +### Parameters + +When creating a macro that takes parameter(s), there are macro controls that change when the parameters passed to the macro are used +within the macro itself. All of the controls are "one shot" and will change how the passed in parameters are used for the very next non-macro control behavior in the `bindings` list of the macro. + +For example, to pass the first parameter from the macro into a `&kp` used in the macro, you would use: + +``` +bindings + = <¯o_param_1to1> + , <&kp MACRO_PLACEHOLDER> + ; +``` + +Because `kp` takes one parameter, you can't simply make the second entry `<&kp>` in the `bindings` list. Whatever value you do pass in will be replaced when the macro is triggered, so you can put _any_ value there, e.g. `0`, `A` keycode, etc. To make it very obvious that the parameter there is not actually going to be used, you can use `MACRO_PLACEHOLDER` which is simply an alias for `0`. + +The available parameter controls are: + +- `¯o_param_1to1` - pass the first parameter of the macro into the first parameter of the next behavior in the `bindings` list. +- `¯o_param_1to2` - pass the first parameter of the macro into the second parameter of the next behavior in the `bindings` list. + +* `¯o_param_2to1` - pass the second parameter of the macro into the first parameter of the next behavior in the `bindings` list. +* `¯o_param_2to2` - pass the second parameter of the macro into the second parameter of the next behavior in the `bindings` list. + ### Binding Activation Mode Bindings in a macro are activated differently, depending on the current "activation mode" of the macro. From b259d5a22e423458b94bd1aba70fd62f327528c0 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 20 Jun 2023 22:23:06 +0000 Subject: [PATCH 269/289] fix(sensors): Sensor rotate behavior fix for layers. * Properly return transparent value when processing mode for higher disabled layers means the processing is ignored. --- app/src/behaviors/behavior_sensor_rotate_common.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index eea7bf48..586cac3f 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -65,7 +65,7 @@ int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *bindi if (mode != BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER) { data->triggers[sensor_index] = 0; - return 0; + return ZMK_BEHAVIOR_TRANSPARENT; } int triggers = data->triggers[sensor_index]; @@ -83,7 +83,7 @@ int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *bindi triggered_binding.param1 = binding->param2; } } else { - return 0; + return ZMK_BEHAVIOR_TRANSPARENT; } LOG_DBG("Sensor binding: %s", binding->behavior_dev); From 3772ecb04e777ec4d592711427211cfac26a712d Mon Sep 17 00:00:00 2001 From: Kyle McCreery Date: Wed, 5 Jul 2023 12:50:19 -0400 Subject: [PATCH 270/289] fix(boards): Update pillbug_defconfig to enable pinctrl --- app/boards/arm/pillbug/pillbug_defconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/boards/arm/pillbug/pillbug_defconfig b/app/boards/arm/pillbug/pillbug_defconfig index d71d9f62..9781cf99 100644 --- a/app/boards/arm/pillbug/pillbug_defconfig +++ b/app/boards/arm/pillbug/pillbug_defconfig @@ -8,6 +8,9 @@ CONFIG_BOARD_PILLBUG=y # Enable MPU CONFIG_ARM_MPU=y +# Use pinctrl +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y From bbb27ac02769c7bf5f20b76605f2b4e0f811e6e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF=E3=83=BC=E3=83=9A?= =?UTF-8?q?=E3=83=BC=E3=83=91=E3=83=BC?= <76888457+filterpaper@users.noreply.github.com> Date: Fri, 7 Jul 2023 01:39:08 +0800 Subject: [PATCH 271/289] feat(docs): Note that UF2 drive unmounts after flashing (#1859) Add a note about the UF2 drive that automatically unmounts itself to restart, which may surprise some new users. --- docs/docs/development/build-flash.md | 4 ++-- docs/docs/user-setup.md | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/docs/development/build-flash.md b/docs/docs/development/build-flash.md index 6f4ba84d..f57c4b5c 100644 --- a/docs/docs/development/build-flash.md +++ b/docs/docs/development/build-flash.md @@ -130,8 +130,8 @@ The above build commands generate a UF2 file in `build/zephyr` (or `build/left|right/zephyr` if you followed the instructions for splits) and is by default named `zmk.uf2`. If your board supports USB Flashing Format (UF2), copy that file onto the root of the USB mass storage device for your board. The -controller should flash your built firmware and automatically restart once -flashing is complete. +controller should flash your built firmware, unmount the USB storage device and +automatically restart once flashing is complete. Alternatively, if your board supports flashing and you're not developing from within a Dockerized environment, enable Device Firmware Upgrade (DFU) mode on diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index 8faa72df..9d04c347 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -198,8 +198,9 @@ To flash the firmware, first put your board into bootloader mode by double click or the one that is part of your keyboard). The controller should appear in your OS as a new USB storage device. Once this happens, copy the correct UF2 file (e.g. left or right if working on a split), and paste it onto the root of that USB mass -storage device. Once the flash is complete, the controller should automatically restart, and load your newly flashed firmware. It is -recommended that you test your keyboard works over USB first to rule out hardware issues, before trying to connect to it wirelessly. +storage device. Once the flash is complete, the controller should unmount the USB storage, automatically restart and load your newly +flashed firmware. It is recommended that you test your keyboard works over USB first to rule out hardware issues, before trying to +connect to it wirelessly. :::caution Split keyboards From aaf9958d865ac28659d16e1ea1ba356f7e742ea8 Mon Sep 17 00:00:00 2001 From: ClicketySplit <101202583+ClicketySplit@users.noreply.github.com> Date: Mon, 17 Jul 2023 15:26:27 -0600 Subject: [PATCH 272/289] feat(boards): Leeloo v2 and V2 Zephyr 3.2 fixes * Add Leeloo v2 * Leeloo-Micro v1 updates to support Zephyr 3.2 * Refactored for new Encoder Configuration Co-authored-by: Cem Aksoylar --- app/boards/shields/leeloo/Kconfig.defconfig | 15 +- app/boards/shields/leeloo/Kconfig.shield | 15 +- app/boards/shields/leeloo/README.md | 120 +++++++++++--- .../leeloo/boards/nice_nano_v2.overlay | 47 ++++++ app/boards/shields/leeloo/leeloo.conf | 11 +- app/boards/shields/leeloo/leeloo.dtsi | 85 +--------- app/boards/shields/leeloo/leeloo.keymap | 37 +++-- app/boards/shields/leeloo/leeloo_common.dtsi | 90 +++++++++++ app/boards/shields/leeloo/leeloo_left.overlay | 6 +- app/boards/shields/leeloo/leeloo_rev2.conf | 43 +++++ app/boards/shields/leeloo/leeloo_rev2.dtsi | 6 + app/boards/shields/leeloo/leeloo_rev2.keymap | 79 +++++++++ app/boards/shields/leeloo/leeloo_rev2.zmk.yml | 15 ++ .../shields/leeloo/leeloo_rev2_left.overlay | 21 +++ .../shields/leeloo/leeloo_rev2_right.overlay | 25 +++ .../shields/leeloo/leeloo_right.overlay | 6 +- .../shields/leeloo_micro/Kconfig.defconfig | 49 ++++++ .../shields/leeloo_micro/Kconfig.shield | 13 ++ app/boards/shields/leeloo_micro/README.md | 89 +++++++++++ .../leeloo_micro/boards/nice_nano_v2.overlay | 47 ++++++ .../shields/leeloo_micro/leeloo_micro.conf | 38 +++++ .../shields/leeloo_micro/leeloo_micro.dtsi | 88 ++++++++++ .../shields/leeloo_micro/leeloo_micro.keymap | 151 ++++++++++++++++++ .../shields/leeloo_micro/leeloo_micro.zmk.yml | 15 ++ .../leeloo_micro/leeloo_micro_left.overlay | 20 +++ .../leeloo_micro/leeloo_micro_right.overlay | 24 +++ 26 files changed, 1027 insertions(+), 128 deletions(-) create mode 100644 app/boards/shields/leeloo/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/leeloo/leeloo_common.dtsi create mode 100644 app/boards/shields/leeloo/leeloo_rev2.conf create mode 100644 app/boards/shields/leeloo/leeloo_rev2.dtsi create mode 100644 app/boards/shields/leeloo/leeloo_rev2.keymap create mode 100644 app/boards/shields/leeloo/leeloo_rev2.zmk.yml create mode 100644 app/boards/shields/leeloo/leeloo_rev2_left.overlay create mode 100644 app/boards/shields/leeloo/leeloo_rev2_right.overlay create mode 100644 app/boards/shields/leeloo_micro/Kconfig.defconfig create mode 100644 app/boards/shields/leeloo_micro/Kconfig.shield create mode 100644 app/boards/shields/leeloo_micro/README.md create mode 100644 app/boards/shields/leeloo_micro/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/leeloo_micro/leeloo_micro.conf create mode 100644 app/boards/shields/leeloo_micro/leeloo_micro.dtsi create mode 100644 app/boards/shields/leeloo_micro/leeloo_micro.keymap create mode 100644 app/boards/shields/leeloo_micro/leeloo_micro.zmk.yml create mode 100644 app/boards/shields/leeloo_micro/leeloo_micro_left.overlay create mode 100644 app/boards/shields/leeloo_micro/leeloo_micro_right.overlay diff --git a/app/boards/shields/leeloo/Kconfig.defconfig b/app/boards/shields/leeloo/Kconfig.defconfig index 7388a4b9..046bd49a 100644 --- a/app/boards/shields/leeloo/Kconfig.defconfig +++ b/app/boards/shields/leeloo/Kconfig.defconfig @@ -1,6 +1,16 @@ -# Copyright (c) 2022 The ZMK Contributors +# Copyright (c) 2023 The ZMK Contributors # SPDX-License-Identifier: MIT +if SHIELD_LEELOO_REV2_LEFT + +config ZMK_KEYBOARD_NAME + default "Leeloo v2" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif + if SHIELD_LEELOO_LEFT config ZMK_KEYBOARD_NAME @@ -11,7 +21,7 @@ config ZMK_SPLIT_ROLE_CENTRAL endif -if SHIELD_LEELOO_LEFT || SHIELD_LEELOO_RIGHT +if SHIELD_LEELOO config ZMK_SPLIT default y @@ -31,7 +41,6 @@ endif # ZMK_DISPLAY if LVGL - config LV_Z_VDB_SIZE default 64 diff --git a/app/boards/shields/leeloo/Kconfig.shield b/app/boards/shields/leeloo/Kconfig.shield index 46ea9640..1d784395 100644 --- a/app/boards/shields/leeloo/Kconfig.shield +++ b/app/boards/shields/leeloo/Kconfig.shield @@ -1,8 +1,21 @@ -# Copyright (c) 2022 The ZMK Contributors +# Copyright (c) 2023 The ZMK Contributors # SPDX-License-Identifier: MIT +config SHIELD_LEELOO + bool + config SHIELD_LEELOO_LEFT def_bool $(shields_list_contains,leeloo_left) + select SHIELD_LEELOO config SHIELD_LEELOO_RIGHT def_bool $(shields_list_contains,leeloo_right) + select SHIELD_LEELOO + +config SHIELD_LEELOO_REV2_LEFT + def_bool $(shields_list_contains,leeloo_rev2_left) + select SHIELD_LEELOO + +config SHIELD_LEELOO_REV2_RIGHT + def_bool $(shields_list_contains,leeloo_rev2_right) + select SHIELD_LEELOO \ No newline at end of file diff --git a/app/boards/shields/leeloo/README.md b/app/boards/shields/leeloo/README.md index a807843f..27d5e872 100644 --- a/app/boards/shields/leeloo/README.md +++ b/app/boards/shields/leeloo/README.md @@ -1,41 +1,123 @@ -# Clickety Split | Leeloo +# Clickety Split | Leeloo v2 -![Leeloo](https://cdn.shopify.com/s/files/1/0599/3460/5491/files/Leeloo-rev1.0-w.jpg?v=1646798726) +![Leeloo v2](https://github.com/ClicketySplit/build-guides/blob/main/leeloo/images/gallery/Leeloo-v2-ZMK.jpg) Keyboard Designer: [clicketysplit.ca](https://clicketysplit.ca) GitHub: [ClicketySplit](https://github.com/ClicketySplit) -Hardware Supported: Pro Micro, Elite-C, nice!nano v2 +Hardware Supported: Pro Micro, Elite-C, and nice!nano v2 -Albeit, there is no doubt where Leeloo's heritage is derived from—Lily58, and Corne. It is not a copy-paste-modify implementation. +Leeloo v2 has been designed from scratch—again. Everything from the wiring schematic to its case. Leeloo v2 still keeps the column stagger that it's known for, along with its low profile design. -Leeloo has been designed from scratch; everything from the schematic to its PCB footprints, and column stagger. There are some subtle differences that may not be apparent; however, its subtle changes enable an interesting future. +## Features/Differences from Leeloo v1 -Features: +- Support for Kailh Low Profile Choc switches with 18mm x 18mm spacing. + - A version for Kailh Box/MX switches with 19.05mm x 19.05mm spacing will be available in the future. +- All switch locations are socketed. +- Rotary encoder locations are socketed. + - One of two locations on each side can be used for a rotary encoder. +- OLED Displays and nice!view Displays are natively supported, socketed, and no extra wiring is required. +- Support for per-switch RGB underglow. +- Better location for 110mAh or 700mAh batteries. + - Different location for soldering battery leads. +- Support for Alps Alpine Micro On/off switches. + +# Leeloo v1 + +![Leeloo](https://github.com/ClicketySplit/build-guides/blob/main/leeloo/images/gallery/Leeloo-v1.jpg) + +## Features - 4x6x5m Split Keyboard -- Support for MX/Box or Low Profile Choc switches. -- 90% of the switches are socketed; with the exception to the rotary encoder positions—6 positions require soldering. -- Support for 128x32 OLED Displays. -- The option to select one of three positions for an EC11 rotary encoder on each half. -- Support for Alps Alpine Micro Switch -- Support for 3.7v 301230 LiPo Battery +- Support for both Low Profile Choc switches, and Box/MX switches; 19.05mm x 19.05mm spacing. +- 90% of the switches are socketed; with the exception to the rotary encoder positions. +- Support for Alps Alpine EC11 Rotary Encoders—one on each side, in one of three locations. +- Support for OLED Displays or nice!view Displays. + - nice!view displays require a wire to be soldered from the CS Pin on nice!view display to P0.22 or D4 on the nice!nano. +- Support for both 110mAh or 700mAh batteries. +- Solder pads for battery leads. +- Support for Alps Alpine Micro On/off switches. -# Building Your Firmware +# Building Leeloo's ZMK Firmware ZMK Firmware: [Introduction to ZMK](https://zmk.dev/docs/) Installation: [Installing ZMK](https://zmk.dev/docs/user-setup) Customization: [Customizing ZMK](https://zmk.dev/docs/customization) Development Environment: [Basic Setup](https://zmk.dev/docs/development/setup) -Build command for the default keymap of Leeloo: +Build commands for the default keymap of Leeloo v1: - west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_left - west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_right +``` +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_left +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_right +``` -Build command for your custom keymap of Leeloo: +Build commands for the default keymap of Leeloo v2: - west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_right -DZMK_CONFIG="C:/dev/zmk/[yourNmae]/leeloo/config" - west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo/config" +``` +west build -d build/left_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_left +west build -d build/right_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_right +``` + +Build commands for your custom keymap of Leeloo v1: + +``` +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_right -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo/config" +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo/config" +``` + +Build commands for your custom keymap of Leeloo v2: + +``` +west build -d build/right_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_right -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_v2/config" +west build -d build/left_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_v2/config" +``` + +## Building Leeloo's ZMK Firmware with nice!view Displays + +There are a couple of files that need to be adjusted before the build commands can be run. + +### Edit the leeloo[_rev2].keymap File + +Near the top 3rd of the leeloo[_rev2].keymap file, locate the following code block: + +``` +//nice_view_spi: &spi0 { +// cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>; +//}; +``` + +Remove the forward slashes to resemble the following: + +``` +nice_view_spi: &spi0 { + cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>; +}; +``` + +Save your changes and close the file. + +### Sample Build Commands for nice!view Displays + +Build commands for the default keymap of Leeloo v1: + +``` +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_left nice_view_adapter nice_view" +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_right nice_view_adapter nice_view" +``` + +Build commands for the default keymap of Leeloo v2: + +``` +west build -d build/left_v2 -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_left nice_view_adapter nice_view" +west build -d build/right_v2 -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_right nice_view_adapter nice_view" +``` + +Build commands for your custom keymap of Leeloo v2: + +``` +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_left nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_v2/config" +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_right nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_v2/config" +``` # Support diff --git a/app/boards/shields/leeloo/boards/nice_nano_v2.overlay b/app/boards/shields/leeloo/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..5c451b73 --- /dev/null +++ b/app/boards/shields/leeloo/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <37>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo.conf b/app/boards/shields/leeloo/leeloo.conf index a652bb65..466279a3 100644 --- a/app/boards/shields/leeloo/leeloo.conf +++ b/app/boards/shields/leeloo/leeloo.conf @@ -1,9 +1,16 @@ -# Copyright (c) 2022 The ZMK Contributors +# Copyright (c) 2023 The ZMK Contributors # SPDX-License-Identifier: MIT # Uncomment the following line to enable the OLED Display # CONFIG_ZMK_DISPLAY=y +# Uncomment to turn off WPM Status. +# CONFIG_ZMK_WIDGET_WPM_STATUS=n + +# Uncomment to invert colour when using nice!view Displays +# CONFIG_ZMK_DISPLAY_INVERT=y + + # Uncomment these two lines to add support for encoders # CONFIG_EC11=y -# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo.dtsi b/app/boards/shields/leeloo/leeloo.dtsi index 438f9a9d..dad05c55 100644 --- a/app/boards/shields/leeloo/leeloo.dtsi +++ b/app/boards/shields/leeloo/leeloo.dtsi @@ -1,87 +1,6 @@ /* - * Copyright (c) 2022 The ZMK Contributors - * + * Copyright (c) 2023 The ZMK Contributors * SPDX-License-Identifier: MIT */ -#include -/ { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; - - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <5>; -// | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | -// | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | -// | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | -// | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | SW29 | | SW29 | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | -// | SW25 | SW26 | SW27 | SW28 | | SW28 | SW27 | SW26 | SW25 | - map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) -RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) -RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) - >; - }; - - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - - diode-direction = "col2row"; - row-gpios - = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; - - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - }; - - right_encoder: encoder_right { - compatible = "alps,ec11"; - label = "RIGHT_ENCODER"; - a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - }; - - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; -}; - -&pro_micro_i2c { - status = "okay"; - - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; -}; +#include "leeloo_common.dtsi" \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo.keymap b/app/boards/shields/leeloo/leeloo.keymap index fc3b25e0..bdbf8988 100644 --- a/app/boards/shields/leeloo/leeloo.keymap +++ b/app/boards/shields/leeloo/leeloo.keymap @@ -1,17 +1,23 @@ /* - * Copyright (c) 2022 The ZMK Contributors - * + * Copyright (c) 2023 The ZMK Contributors * SPDX-License-Identifier: MIT */ + #include #include #include #include -// Layers -#define DEFAULT 0 // default_layer -#define LOWER 1 // lower_layer -#define RAISE 2 // raise_layer +/* + * Assign the cs-gpios pin to 4. + * Uncomment these next few lines if implementing nice!view Displays + * A wire from the nice!view CS display needs to be connected to the + * High Frequency P0.22, also known as D4 if you choose to refer to + * the pins with Arduino Labels. + */ +//nice_view_spi: &spi0 { +// cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>; +//}; / { @@ -19,40 +25,43 @@ compatible = "zmk,keymap"; default_layer { + label = " QWERTY"; bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSLH &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp GRAV &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT -&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LALT &kp LCTRL < 1 RET < 2 MINUS &kp LGUI &kp LGUI < 2 EQUAL < 1 SPACE &kp BSPC &kp DEL +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LGUI &kp LGUI &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LALT &kp LCTRL < 1 RET < 2 MINUS < 2 EQUAL < 1 SPACE &kp BSPC &kp DEL >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; }; lower_layer { + label = " Lower"; bindings = < &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &trans &trans &trans &trans &trans &trans &kp PG_UP &kp HOME &kp UP &kp END &trans &kp F12 &trans &trans &trans &trans &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &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 &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; }; raise_layer { + label = " Raise"; bindings = < &trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans -&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &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 &trans &trans &bt BT_CLR &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &bt BT_CLR &trans >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_common.dtsi b/app/boards/shields/leeloo/leeloo_common.dtsi new file mode 100644 index 00000000..6ce93504 --- /dev/null +++ b/app/boards/shields/leeloo/leeloo_common.dtsi @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <5>; +// | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | +// | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | +// | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | +// | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | SW29 | | SW29 | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | +// | SW25 | SW26 | SW27 | SW28 | | SW28 | SW27 | SW26 | SW25 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) + RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,7) RC(4,8) RC(4,9) RC(4,10) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + + row-gpios + = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; + + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + steps = <120>; + }; + + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + steps = <120>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <30>; + }; + +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_left.overlay b/app/boards/shields/leeloo/leeloo_left.overlay index 59fce1b0..4421e112 100644 --- a/app/boards/shields/leeloo/leeloo_left.overlay +++ b/app/boards/shields/leeloo/leeloo_left.overlay @@ -1,8 +1,8 @@ /* - * Copyright (c) 2022 The ZMK Contributors - * + * Copyright (c) 2023 The ZMK Contributors * SPDX-License-Identifier: MIT */ + #include "leeloo.dtsi" &kscan0 { @@ -18,4 +18,4 @@ &left_encoder { status = "okay"; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_rev2.conf b/app/boards/shields/leeloo/leeloo_rev2.conf new file mode 100644 index 00000000..8c1cf3ee --- /dev/null +++ b/app/boards/shields/leeloo/leeloo_rev2.conf @@ -0,0 +1,43 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +# Uncomment the following line to enable the OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment to turn off WPM Status. +# CONFIG_ZMK_WIDGET_WPM_STATUS=n + +# Uncomment to invert colour when using nice!view Displays +# CONFIG_ZMK_DISPLAY_INVERT=y + + +# Uncomment the following line to enable per-key lighting +# CONFIG_ZMK_RGB_UNDERGLOW=y + +# Use the STRIP config specific to the LEDs you're using +# CONFIG_WS2812_STRIP=y + +# Keep OLED or nice!view Displays on even when toggling off LEDs +# Change to y if you wish to toggle Displays on and off with LEDs +# CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=n + +# Turn off LEDs when idle. +# Change to n if you wish to keep LEDs on even when idle. +# CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE=y + +# When USB is disconnected, turn off LEDs +# Change to n if you wish to keep LEDs on even when USB is unpluged. +# CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB=y + +# Start LEDs off at 75% +# CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=75 + + +# Uncomment these two lines to add support for encoders +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + + +# Uncomment if you are experiencing connectivity issues; this +# configuration item boosts the BLE transmit power. +# CONFIG_BT_CTLR_TX_PWR_PLUS_8=y \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_rev2.dtsi b/app/boards/shields/leeloo/leeloo_rev2.dtsi new file mode 100644 index 00000000..dad05c55 --- /dev/null +++ b/app/boards/shields/leeloo/leeloo_rev2.dtsi @@ -0,0 +1,6 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include "leeloo_common.dtsi" \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_rev2.keymap b/app/boards/shields/leeloo/leeloo_rev2.keymap new file mode 100644 index 00000000..a66205b6 --- /dev/null +++ b/app/boards/shields/leeloo/leeloo_rev2.keymap @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +// Short versions +#define RGBON &rgb_ug RGB_ON +#define RGBOFF &rgb_ug RGB_OFF +#define RGBTOG &rgb_ug RGB_TOG +#define RGBHUI &rgb_ug RGB_HUI +#define RGBHUD &rgb_ug RGB_HUD +#define RGBSAI &rgb_ug RGB_SAI +#define RGBSAD &rgb_ug RGB_SAD +#define RGBBRI &rgb_ug RGB_BRI +#define RGBBRD &rgb_ug RGB_BRD +#define RGBEFF &rgb_ug RGB_EFF + + +/* + * Assign the cs-gpios pin to 4. + * Uncomment these next few lines if implementing nice!view Displays + */ +//nice_view_spi: &spi0 { +// cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>; +//}; + + +/ { + + keymap { + compatible = "zmk,keymap"; + + default_layer { + label = " QWERTY"; + bindings = < +&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSLH +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp GRAV +&kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LGUI &kp RGUI &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LALT &kp LCTRL < 1 RET < 2 MINUS < 2 EQUAL < 1 SPACE &kp BSPC &kp DEL + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + lower_layer { + label = " Lower"; + bindings = < +&trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 +&trans &trans &trans &trans &trans &trans &kp PG_UP &kp HOME &kp UP &kp END &trans &kp F12 +&trans &trans &trans &trans &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &trans &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + raise_layer { + label = " Raise"; + bindings = < +&trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader +RGBON RGBTOG RGBHUI RGBSAI RGBBRI &trans &trans &trans &trans &trans &trans &trans +RGBOFF RGBEFF RGBHUD RGBSAD RGBBRD &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &bt BT_CLR &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + }; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_rev2.zmk.yml b/app/boards/shields/leeloo/leeloo_rev2.zmk.yml new file mode 100644 index 00000000..5e0a4db3 --- /dev/null +++ b/app/boards/shields/leeloo/leeloo_rev2.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: leeloo_rev2 +name: Leeloo v2 +type: shield +url: https://clicketysplit.ca/pages/leeloo +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display + - encoder + - underglow +siblings: + - leeloo_rev2_left + - leeloo_rev2_right diff --git a/app/boards/shields/leeloo/leeloo_rev2_left.overlay b/app/boards/shields/leeloo/leeloo_rev2_left.overlay new file mode 100644 index 00000000..14ddc0ec --- /dev/null +++ b/app/boards/shields/leeloo/leeloo_rev2_left.overlay @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include "leeloo_rev2.dtsi" + +&kscan0 { + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; +}; + +&left_encoder { + status = "okay"; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_rev2_right.overlay b/app/boards/shields/leeloo/leeloo_rev2_right.overlay new file mode 100644 index 00000000..afca41b4 --- /dev/null +++ b/app/boards/shields/leeloo/leeloo_rev2_right.overlay @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include "leeloo_rev2.dtsi" + +&default_transform { + col-offset = <6>; +}; + +&kscan0 { + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; +}; + +&right_encoder { + status = "okay"; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_right.overlay b/app/boards/shields/leeloo/leeloo_right.overlay index 80e89529..b860c2ca 100644 --- a/app/boards/shields/leeloo/leeloo_right.overlay +++ b/app/boards/shields/leeloo/leeloo_right.overlay @@ -1,8 +1,8 @@ /* - * Copyright (c) 2022 The ZMK Contributors - * + * Copyright (c) 2023 The ZMK Contributors * SPDX-License-Identifier: MIT */ + #include "leeloo.dtsi" &default_transform { @@ -22,4 +22,4 @@ &right_encoder { status = "okay"; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/Kconfig.defconfig b/app/boards/shields/leeloo_micro/Kconfig.defconfig new file mode 100644 index 00000000..26256120 --- /dev/null +++ b/app/boards/shields/leeloo_micro/Kconfig.defconfig @@ -0,0 +1,49 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_LEELOO_MICRO_LEFT + +config ZMK_KEYBOARD_NAME + default "Leeloo-Micro" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif + +if SHIELD_LEELOO_MICRO + +config ZMK_SPLIT + default y + +if ZMK_DISPLAY + +config I2C + default y + +config SSD1306 + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LV_Z_VDB_SIZE + default 64 + +config LV_Z_DPI + default 148 + +config LV_Z_BITS_PER_PIXEL + default 1 + +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif diff --git a/app/boards/shields/leeloo_micro/Kconfig.shield b/app/boards/shields/leeloo_micro/Kconfig.shield new file mode 100644 index 00000000..c622f16d --- /dev/null +++ b/app/boards/shields/leeloo_micro/Kconfig.shield @@ -0,0 +1,13 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_LEELOO_MICRO + bool + +config SHIELD_LEELOO_MICRO_LEFT + def_bool $(shields_list_contains,leeloo_micro_left) + select SHIELD_LEELOO_MICRO + +config SHIELD_LEELOO_MICRO_RIGHT + def_bool $(shields_list_contains,leeloo_micro_right) + select SHIELD_LEELOO_MICRO \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/README.md b/app/boards/shields/leeloo_micro/README.md new file mode 100644 index 00000000..c1827f82 --- /dev/null +++ b/app/boards/shields/leeloo_micro/README.md @@ -0,0 +1,89 @@ +# Clickety Split | Leeloo-Micro + +![Leeloo-Micro v1 Wireless](https://github.com/ClicketySplit/build-guides/blob/main/leeloo/images/gallery/Leeloo-Micro-v1-ZMK.jpg) + +Keyboard Designer: [clicketysplit.ca](https://clicketysplit.ca) +GitHub: [ClicketySplit](https://github.com/ClicketySplit) +Hardware Supported: nice!nano v2, nice!view v1 + +Leeloo-Micro is a 3x5x5m derivative of Leeloo v2; inheriting the column stagger and modifiers row, yet, reducing the number of switches by removing the top row and outside columns. With Leeloo-Micro's inaugural release being wireless, it leverages nice!nanos and nice!views for its microcontrollers and displays. + +## Features + +- 3x5x5m Split Keyboard +- Support for Kailh Low Profile Choc switches with 18mm x 18mm spacing. +- All switch locations are socketed. +- Support for Alps Alpine EC11 Rotary Encoders—one on each side, in one of two locations. + - Rotary encoder locations are socketed. +- nice!view Displays are inherently supported, socketed, and no extra wiring is required. +- Support for per-switch RGB underglow. +- Support for both 110mAh or 700mAh batteries. +- Support for Alps Alpine Micro On/off switches. + +# Building Leeloo-Micro ZMK Firmware + +ZMK Firmware: [Introduction to ZMK](https://zmk.dev/docs/) +Installation: [Installing ZMK](https://zmk.dev/docs/user-setup) +Customization: [Customizing ZMK](https://zmk.dev/docs/customization) +Development Environment: [Basic Setup](https://zmk.dev/docs/development/setup) + +Build commands for the default keymap of Leeloo-Micro: + +``` +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_left +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_right +``` + +Build commands for your custom keymap of Leeloo-Micro: + +``` +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_right -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_micro/config" +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_micro/config" +``` + +## Building Leeloo-Micro's ZMK Firmware with nice!view Displays + +There are a couple of files that need to be adjusted before the build commands can be run. + +### Edit the leeloo_micro.keymap File + +Near the top 3rd of the leeloo_micro.keymap file, locate the following code block: + +``` +//nice_view_spi: &spi0 { +// cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>; +//}; +``` + +Remove the forward slashes to resemble the following: + +``` +nice_view_spi: &spi0 { + cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>; +}; +``` + +Save your changes and close the file. + +### Sample Build Commands for nice!view Displays + +Build commands for the default keymap of Leeloo-Micro: + +``` +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_left nice_view_adapter nice_view" +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_right nice_view_adapter nice_view" +``` + +Build commands for your custom keymap of Leeloo-Micro: + +``` +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_left nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_micro/config" +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_right nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_micro/config" +``` + +# Support + +If you have any questions with regards to Leeloo-Micro, please [Contact Us](https://clicketysplit.ca/pages/contact-us). + +Clickety Split +For the love of split keyboards. diff --git a/app/boards/shields/leeloo_micro/boards/nice_nano_v2.overlay b/app/boards/shields/leeloo_micro/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..be5dc54e --- /dev/null +++ b/app/boards/shields/leeloo_micro/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <20>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/leeloo_micro.conf b/app/boards/shields/leeloo_micro/leeloo_micro.conf new file mode 100644 index 00000000..02c1d605 --- /dev/null +++ b/app/boards/shields/leeloo_micro/leeloo_micro.conf @@ -0,0 +1,38 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +# Uncomment the following line to enable the OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment to turn off WPM Status. +# CONFIG_ZMK_WIDGET_WPM_STATUS=n + +# Uncomment to invert colour, if using nice!view Displays +# CONFIG_ZMK_DISPLAY_INVERT=y + + +# Uncomment the following line to enable per-key lighting +# CONFIG_ZMK_RGB_UNDERGLOW=y + +# Use the STRIP config specific to the LEDs you're using +# CONFIG_WS2812_STRIP=y + +# Keep OLED or nice!view Displays on even when toggling off LEDs +# Change to y if you wish to toggle Displays on and off with LEDs +# CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=n + +# Turn off LEDs when idle. +# Change to n if you wish to keep LEDs on even when idle. +# CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE=y + +# When USB is disconnected, turn off LEDs +# Change to n if you wish to keep LEDs on even when USB is unpluged. +# CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB=y + +# Start LEDs off at 75% +# CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=75 + + +# Uncomment these two lines to add support for encoders +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/leeloo_micro.dtsi b/app/boards/shields/leeloo_micro/leeloo_micro.dtsi new file mode 100644 index 00000000..afe16dfa --- /dev/null +++ b/app/boards/shields/leeloo_micro/leeloo_micro.dtsi @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; +// +// | SW1 | SW2 | SW3 | SW4 | SW5 | | SW15 | SW4 | SW3 | SW2 | SW1 | +// | SW6 | SW7 | SW8 | SW9 | SW10 | | SW10 | SW9 | SW8 | SW7 | SW6 | +// | SW11 | SW12 | SW13 | SW14 | SW15 | SW20 | | SW20 | SW15 | SW14 | SW13 | SW12 | SW11 | +// | SW16 | SW17 | SW18 | SW19 | | SW19 | SW18 | SW17 | SW16 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(3,4) RC(3,5) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,6) RC(3,7) RC(3,8) RC(3,9) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + + row-gpios + = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; + + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + steps = <120>; + }; + + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + steps = <120>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <30>; + }; + +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/leeloo_micro.keymap b/app/boards/shields/leeloo_micro/leeloo_micro.keymap new file mode 100644 index 00000000..8526f5ac --- /dev/null +++ b/app/boards/shields/leeloo_micro/leeloo_micro.keymap @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +// Layers +#define QW_M 0 // Main +#define QW_L 1 // Lower +#define QW_R 2 // Raise +#define QW_A 3 // Adjust + +#define QC_N 4 // Number Pad +#define QC_B 5 // Firmware + + +// Short versions +#define BT0 BT_SEL 0 +#define BT1 BT_SEL 1 +#define BT2 BT_SEL 2 +#define BT3 BT_SEL 3 +#define BT4 BT_SEL 4 + +#define BOOTLDR &bootloader + +#define RGBON &rgb_ug RGB_ON +#define RGBOFF &rgb_ug RGB_OFF +#define RGBTOG &rgb_ug RGB_TOG +#define RGBHUI &rgb_ug RGB_HUI +#define RGBHUD &rgb_ug RGB_HUD +#define RGBSAI &rgb_ug RGB_SAI +#define RGBSAD &rgb_ug RGB_SAD +#define RGBBRI &rgb_ug RGB_BRI +#define RGBBRD &rgb_ug RGB_BRD +#define RGBEFF &rgb_ug RGB_EFF + + +/* + * Assign the cs-gpios pin to 4. + * Uncomment these next few lines if implementing nice!view Displays. + */ +//nice_view_spi: &spi0 { +// cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>; +//}; + + +/ { + conditional_layers { + compatible = "zmk,conditional-layers"; + adjust_layer { + if-layers = ; + then-layer = ; + }; + }; + + combos { + compatible = "zmk,combos"; + + combo_esc { + timeout-ms = <50>; + key-positions = <0 1>; + layers = ; + bindings = <&kp ESC>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + label = " QWERTY"; + bindings = < +&kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P +&kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI +&mt LSFT Z &kp X &kp C &kp V &kp B &mo QC_N &kp RGUI &kp N &kp M &kp COMMA &kp DOT &mt RSFT FSLH + &kp LALT &kp LCTRL < 1 RET < 2 MINUS < 2 EQUAL < 1 SPACE &kp BSPC &mo QC_B + >; + + sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>; + }; + + lower_layer { + label = " Lower"; + bindings = < +&kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 +&trans &trans &trans &trans &trans &trans &trans &trans &trans &kp QUOT +&kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp RSHFT + &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>; + }; + + raise_layer { + label = " Raise"; + bindings = < +&kp TAB &trans &trans &trans &trans &kp PG_UP &kp HOME &kp UP &kp END &kp BSLH +&kp CAPS &trans &trans &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp GRAVE +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &mt RSFT TILDE + &trans &trans &trans &trans &trans &trans &kp DEL &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>; + }; + + adjust_layer { + label = " Adjust"; + bindings = < + +&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &trans &trans &trans &trans +&kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &trans &trans &trans &trans &trans +&kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>; + }; + + numpad_layer { + label = " NumPad"; + bindings = < + +&trans &none &none &none &none &kp SLASH &kp N7 &kp N8 &kp N9 &kp MINUS +RGBON RGBTOG RGBHUI RGBSAI RGBBRI &kp ASTRK &kp N4 &kp N5 &kp N6 &kp PLUS +RGBOFF RGBEFF RGBHUD RGBSAD RGBBRD &trans &trans &none &kp N1 &kp N2 &kp N3 &kp EQUAL + &trans &trans &trans &trans &trans &kp N0 &kp DOT &none + >; + + sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>; + }; + + ble_layer { + label = " BLE"; + bindings = < + +&bt BT0 &bt BT1 &bt BT2 &bt BT3 &bt BT4 &bt BT0 &bt BT1 &bt BT2 &bt BT3 &bt BT4 +BOOTLDR &sys_reset &trans &trans &trans &trans &trans &trans &sys_reset BOOTLDR +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &bt BT_CLR &trans &trans &trans &trans &bt BT_CLR &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>; + }; + + }; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/leeloo_micro.zmk.yml b/app/boards/shields/leeloo_micro/leeloo_micro.zmk.yml new file mode 100644 index 00000000..e78ce0a3 --- /dev/null +++ b/app/boards/shields/leeloo_micro/leeloo_micro.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: leeloo_micro +name: Leeloo-Micro +type: shield +url: https://clicketysplit.ca/pages/leeloo-micro +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display + - encoder + - underglow +siblings: + - leeloo_micro_left + - leeloo_micro_right diff --git a/app/boards/shields/leeloo_micro/leeloo_micro_left.overlay b/app/boards/shields/leeloo_micro/leeloo_micro_left.overlay new file mode 100644 index 00000000..d31fcf2c --- /dev/null +++ b/app/boards/shields/leeloo_micro/leeloo_micro_left.overlay @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include "leeloo_micro.dtsi" + +&kscan0 { + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + ; +}; + +&left_encoder { + status = "okay"; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/leeloo_micro_right.overlay b/app/boards/shields/leeloo_micro/leeloo_micro_right.overlay new file mode 100644 index 00000000..a3f347fb --- /dev/null +++ b/app/boards/shields/leeloo_micro/leeloo_micro_right.overlay @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include "leeloo_micro.dtsi" + +&default_transform { + col-offset = <5>; +}; + +&kscan0 { + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; +}; + +&right_encoder { + status = "okay"; +}; \ No newline at end of file From f3110d1d1ea195725551b4c997c542a4003e1452 Mon Sep 17 00:00:00 2001 From: NAHO <90870942+trueNAHO@users.noreply.github.com> Date: Tue, 18 Jul 2023 00:23:22 +0200 Subject: [PATCH 273/289] fix(docs): Fix README punctuation and add license link --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 50cb2817..f112b0f9 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,10 @@ [![Build](https://github.com/zmkfirmware/zmk/workflows/Build/badge.svg)](https://github.com/zmkfirmware/zmk/actions) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg)](CODE_OF_CONDUCT.md) -[ZMK Firmware](https://zmk.dev/) is an open source (MIT) keyboard firmware built on the [Zephyr™ Project](https://www.zephyrproject.org/) Real Time Operating System (RTOS). ZMK's goal is to provide a modern, wireless, and powerful firmware free of licensing issues. +[ZMK Firmware](https://zmk.dev/) is an open source ([MIT](LICENSE)) keyboard firmware built on the [Zephyr™ Project](https://www.zephyrproject.org/) Real Time Operating System (RTOS). ZMK's goal is to provide a modern, wireless, and powerful firmware free of licensing issues. -Check out the website to learn more: https://zmk.dev/ +Check out the website to learn more: https://zmk.dev/. -You can also come join our [ZMK Discord Server](https://zmk.dev/community/discord/invite) +You can also come join our [ZMK Discord Server](https://zmk.dev/community/discord/invite). To review features, check out the [feature overview](https://zmk.dev/docs/). ZMK is under active development, and new features are listed with the [enhancement label](https://github.com/zmkfirmware/zmk/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement) in GitHub. Please feel free to add 👍 to the issue description of any requests to upvote the feature. From 18a2b76bf085249e9d650d6664d32931c56dc7b7 Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Tue, 18 Jul 2023 16:43:30 -0500 Subject: [PATCH 274/289] feat(nice!view): Custom widgets --- app/boards/shields/nice_view/CMakeLists.txt | 13 + .../shields/nice_view/Kconfig.defconfig | 53 ++- app/boards/shields/nice_view/README.md | 14 +- .../shields/nice_view/custom_status_screen.c | 28 ++ app/boards/shields/nice_view/nice_view.conf | 3 +- app/boards/shields/nice_view/widgets/art.c | 229 ++++++++++++ app/boards/shields/nice_view/widgets/bolt.c | 45 +++ .../nice_view/widgets/peripheral_status.c | 128 +++++++ .../nice_view/widgets/peripheral_status.h | 22 ++ app/boards/shields/nice_view/widgets/status.c | 330 ++++++++++++++++++ app/boards/shields/nice_view/widgets/status.h | 24 ++ app/boards/shields/nice_view/widgets/util.c | 69 ++++ app/boards/shields/nice_view/widgets/util.h | 47 +++ 13 files changed, 986 insertions(+), 19 deletions(-) create mode 100644 app/boards/shields/nice_view/CMakeLists.txt create mode 100644 app/boards/shields/nice_view/custom_status_screen.c create mode 100644 app/boards/shields/nice_view/widgets/art.c create mode 100644 app/boards/shields/nice_view/widgets/bolt.c create mode 100644 app/boards/shields/nice_view/widgets/peripheral_status.c create mode 100644 app/boards/shields/nice_view/widgets/peripheral_status.h create mode 100644 app/boards/shields/nice_view/widgets/status.c create mode 100644 app/boards/shields/nice_view/widgets/status.h create mode 100644 app/boards/shields/nice_view/widgets/util.c create mode 100644 app/boards/shields/nice_view/widgets/util.h diff --git a/app/boards/shields/nice_view/CMakeLists.txt b/app/boards/shields/nice_view/CMakeLists.txt new file mode 100644 index 00000000..694242b2 --- /dev/null +++ b/app/boards/shields/nice_view/CMakeLists.txt @@ -0,0 +1,13 @@ +if(CONFIG_ZMK_DISPLAY AND CONFIG_NICE_VIEW_WIDGET_STATUS) + zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) + zephyr_library_sources(custom_status_screen.c) + zephyr_library_sources(widgets/bolt.c) + zephyr_library_sources(widgets/util.c) + + if(NOT CONFIG_ZMK_SPLIT OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) + zephyr_library_sources(widgets/status.c) + else() + zephyr_library_sources(widgets/art.c) + zephyr_library_sources(widgets/peripheral_status.c) + endif() +endif() diff --git a/app/boards/shields/nice_view/Kconfig.defconfig b/app/boards/shields/nice_view/Kconfig.defconfig index d2378409..53edc1cc 100644 --- a/app/boards/shields/nice_view/Kconfig.defconfig +++ b/app/boards/shields/nice_view/Kconfig.defconfig @@ -1,21 +1,13 @@ -# Copyright (c) 2022 The ZMK Contributors +# Copyright (c) 2023 The ZMK Contributors # SPDX-License-Identifier: MIT if SHIELD_NICE_VIEW -config ZMK_DISPLAY - select LV_FONT_MONTSERRAT_26 +config LV_Z_VDB_SIZE + default 100 -if ZMK_DISPLAY - -config SPI - default y - -config LS0XX - default y - -config ZMK_WIDGET_WPM_STATUS - default y if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL +config LV_Z_DPI + default 161 config LV_Z_BITS_PER_PIXEL default 1 @@ -24,6 +16,37 @@ choice LV_COLOR_DEPTH default LV_COLOR_DEPTH_1 endchoice -endif # ZMK_DISPLAY +choice ZMK_DISPLAY_WORK_QUEUE + default ZMK_DISPLAY_WORK_QUEUE_DEDICATED +endchoice -endif +choice ZMK_DISPLAY_STATUS_SCREEN + default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM +endchoice + +config ZMK_DISPLAY_STATUS_SCREEN_CUSTOM + imply NICE_VIEW_WIDGET_STATUS + +config NICE_VIEW_WIDGET_STATUS + bool "Custom nice!view status widget" + select LV_FONT_MONTSERRAT_16 + select LV_USE_IMG + select LV_USE_CANVAS + +config NICE_VIEW_WIDGET_INVERTED + bool "Invert custom status widget colors" + +if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL + +config NICE_VIEW_WIDGET_STATUS + select LV_FONT_MONTSERRAT_18 + select LV_FONT_MONTSERRAT_14 + select LV_FONT_UNSCII_8 + select ZMK_WPM + +endif # !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL + +config ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN + select LV_FONT_MONTSERRAT_26 + +endif # SHIELD_NICE_VIEW diff --git a/app/boards/shields/nice_view/README.md b/app/boards/shields/nice_view/README.md index e3dffa34..00abfbfa 100644 --- a/app/boards/shields/nice_view/README.md +++ b/app/boards/shields/nice_view/README.md @@ -1,5 +1,15 @@ # nice!view -The nice!view is a low power, high refresh rate display meant to replace I2C OLEDs traditionally used. +The nice!view is a low-power, high refresh rate display meant to replace I2C OLEDs traditionally used. -This shield requires that an `&nice_view_spi` labelled SPI bus is provided with _at least_ MOSI, SCK, and CS pins defined. +This shield requires that an `&nice_view_spi` labeled SPI bus is provided with _at least_ MOSI, SCK, and CS pins defined. + +## Disable custom widget + +The nice!view shield includes a custom vertical widget. To use the built-in ZMK one, add the following item to your `.conf` file: + +``` +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN=y +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y +``` diff --git a/app/boards/shields/nice_view/custom_status_screen.c b/app/boards/shields/nice_view/custom_status_screen.c new file mode 100644 index 00000000..c08da0eb --- /dev/null +++ b/app/boards/shields/nice_view/custom_status_screen.c @@ -0,0 +1,28 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#include "widgets/status.h" + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#if IS_ENABLED(CONFIG_NICE_VIEW_WIDGET_STATUS) +static struct zmk_widget_status status_widget; +#endif + +lv_obj_t *zmk_display_status_screen() { + + lv_obj_t *screen; + screen = lv_obj_create(NULL); + +#if IS_ENABLED(CONFIG_NICE_VIEW_WIDGET_STATUS) + zmk_widget_status_init(&status_widget, screen); + lv_obj_align(zmk_widget_status_obj(&status_widget), LV_ALIGN_TOP_LEFT, 0, 0); +#endif + + return screen; +} diff --git a/app/boards/shields/nice_view/nice_view.conf b/app/boards/shields/nice_view/nice_view.conf index ff57c07c..e6f9158f 100644 --- a/app/boards/shields/nice_view/nice_view.conf +++ b/app/boards/shields/nice_view/nice_view.conf @@ -1,5 +1,4 @@ # Enable nice!view CONFIG_ZMK_DISPLAY=y -CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26=y -CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y +# Disable idle blanking CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE=n diff --git a/app/boards/shields/nice_view/widgets/art.c b/app/boards/shields/nice_view/widgets/art.c new file mode 100644 index 00000000..56c89146 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/art.c @@ -0,0 +1,229 @@ +/* + * + * Copyright (c) 2023 Collin Hodge + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BALLOON +#define LV_ATTRIBUTE_IMG_BALLOON +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BALLOON uint8_t + balloon_map[] = { +#if CONFIG_NICE_VIEW_WIDGET_INVERTED + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ +#else + 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ + 0xff, 0xff, 0xff, 0xff, /*Color of index 1*/ +#endif + + 0xfe, 0xaa, 0x0a, 0x2a, 0x9f, 0xff, 0xff, 0xff, 0xfa, 0xea, 0xaa, 0xae, 0xba, 0xff, 0xff, + 0xfb, 0xff, 0xf0, 0xf1, 0x55, 0x05, 0x15, 0x47, 0xff, 0xff, 0xff, 0xf5, 0xd5, 0x55, 0x5f, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xa4, 0xaa, 0x8a, 0x8a, 0xa1, 0xff, 0xff, 0xfb, 0xea, + 0xaa, 0xaa, 0xbe, 0xbf, 0xef, 0xfb, 0xfb, 0xff, 0xf0, 0x54, 0x55, 0x05, 0x45, 0x54, 0xff, + 0xff, 0x7d, 0x55, 0xd5, 0x75, 0x7f, 0x7f, 0xdf, 0xff, 0xff, 0xff, 0xf0, 0xae, 0x2a, 0x82, + 0xa0, 0xaa, 0x3f, 0xff, 0xfe, 0xaa, 0xea, 0xbb, 0xfe, 0xbf, 0xff, 0xfb, 0xfb, 0xfe, 0xf0, + 0x5f, 0x55, 0x01, 0x50, 0x54, 0x1f, 0xff, 0x7f, 0x55, 0xd5, 0x7f, 0xff, 0x7f, 0xd7, 0xff, + 0xfd, 0xfd, 0xf0, 0x2f, 0xff, 0x20, 0x28, 0x00, 0x0f, 0xff, 0xae, 0xaa, 0xaa, 0xbf, 0xff, + 0xff, 0xeb, 0xfb, 0xff, 0xff, 0xf0, 0x0e, 0x01, 0x50, 0x14, 0x00, 0x3f, 0xff, 0x57, 0x55, + 0xd5, 0x7f, 0xff, 0x7f, 0xd7, 0xfd, 0xff, 0xfd, 0xf0, 0x1e, 0x01, 0xa8, 0x0a, 0x00, 0xff, + 0xff, 0xaf, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xf0, 0x1f, 0xf9, 0x50, + 0x01, 0x03, 0xff, 0xff, 0x57, 0x55, 0xd5, 0x7d, 0xff, 0x7f, 0xdf, 0xfd, 0xff, 0xfd, 0xf0, + 0x9f, 0xf9, 0xa8, 0x00, 0x8f, 0xff, 0xfe, 0xaf, 0xaa, 0xaa, 0xff, 0xff, 0xfd, 0xbf, 0xfb, + 0xff, 0xfb, 0xf0, 0x5a, 0x01, 0x54, 0x00, 0x3f, 0xff, 0xff, 0x7f, 0x5d, 0xd5, 0xfd, 0xff, + 0xfd, 0xdf, 0xfd, 0xff, 0xfd, 0xf0, 0x8e, 0x01, 0xaa, 0x00, 0x7f, 0xff, 0xfe, 0xbf, 0xae, + 0xef, 0xff, 0xff, 0xfb, 0xef, 0xfb, 0xff, 0xfa, 0xf0, 0xcf, 0xff, 0xf4, 0x00, 0xf7, 0xff, + 0xff, 0x7f, 0x5d, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xf0, 0xae, 0x01, 0x2a, + 0x00, 0xfb, 0xff, 0xff, 0xbf, 0xae, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfa, 0xf0, + 0xde, 0x01, 0x35, 0x01, 0xfb, 0xff, 0xff, 0x7f, 0x5d, 0xfd, 0xbf, 0xff, 0xff, 0xdf, 0xfd, + 0xff, 0xdd, 0xf0, 0xa7, 0xff, 0xea, 0x81, 0xfc, 0xff, 0x7f, 0xbe, 0xbe, 0xff, 0xe3, 0xff, + 0xff, 0xef, 0xff, 0xf9, 0x3e, 0xf0, 0x56, 0x01, 0x55, 0x41, 0xff, 0x7f, 0xff, 0xff, 0xfd, + 0xfd, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x7d, 0xf0, 0xa6, 0x01, 0x2a, 0x88, 0xfe, 0xff, + 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xe0, 0x03, 0xff, 0xff, 0xfc, 0xfe, 0xf0, 0x52, 0x79, 0x15, + 0x44, 0x7d, 0xff, 0xff, 0xfd, 0x7f, 0xbd, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xf8, 0xfd, 0xf0, + 0x22, 0x69, 0x2a, 0xa0, 0x3d, 0xff, 0xff, 0xfa, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xe2, 0x48, + 0xfa, 0xff, 0xf0, 0x42, 0x59, 0x15, 0x54, 0x1b, 0xff, 0xff, 0xf7, 0xff, 0xbd, 0xf7, 0xff, + 0xff, 0x95, 0x55, 0x37, 0x7d, 0xf0, 0x02, 0x69, 0x0a, 0xa2, 0x1f, 0xfe, 0xff, 0xee, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0x2a, 0x4a, 0x9f, 0xff, 0xf0, 0x03, 0xff, 0x55, 0x11, 0x4f, 0xff, + 0xff, 0x55, 0x7f, 0xfd, 0xff, 0x00, 0xfc, 0x55, 0x55, 0x4f, 0xff, 0xf0, 0x02, 0x01, 0xaa, + 0x88, 0x8f, 0xde, 0xff, 0xaa, 0xbf, 0xfe, 0xff, 0xff, 0x00, 0xa8, 0x02, 0xa7, 0xff, 0xf0, + 0x02, 0x01, 0x55, 0x55, 0x47, 0xff, 0x7f, 0xd5, 0x5f, 0xff, 0xff, 0xff, 0xc8, 0x47, 0x5c, + 0x53, 0xff, 0xf0, 0x82, 0x49, 0xaa, 0x8a, 0xa7, 0xfe, 0xff, 0xea, 0xbf, 0xff, 0xff, 0xff, + 0xb0, 0x3f, 0x5f, 0x89, 0xff, 0xf0, 0xc2, 0x49, 0x55, 0x45, 0x53, 0xff, 0xff, 0xf5, 0x5f, + 0xff, 0xff, 0xfe, 0x70, 0x7f, 0x5f, 0xe5, 0xff, 0xf0, 0xe2, 0x41, 0xa2, 0xa2, 0xab, 0xfe, + 0xfb, 0xfa, 0xaf, 0xef, 0xff, 0xf9, 0xe2, 0xbf, 0x5f, 0xfa, 0xff, 0xf0, 0xe2, 0x41, 0x51, + 0x51, 0x51, 0xff, 0x77, 0xfd, 0x57, 0xf9, 0xff, 0xe7, 0x85, 0x7f, 0x5f, 0xfc, 0xff, 0xf0, + 0xe3, 0xff, 0xf2, 0xa0, 0xa8, 0xff, 0xfb, 0xbe, 0xaf, 0xfe, 0x1e, 0x80, 0x6a, 0x80, 0x00, + 0x7e, 0xff, 0xb0, 0xe2, 0x60, 0x11, 0x50, 0x54, 0x7f, 0xff, 0xfd, 0x57, 0xff, 0xe0, 0x1f, + 0xc4, 0x15, 0x55, 0x06, 0x7f, 0x70, 0xee, 0x60, 0x18, 0xa8, 0x2a, 0x1f, 0xff, 0xfe, 0xaf, + 0xff, 0xe8, 0xf0, 0x00, 0x0a, 0x4a, 0xa8, 0x7f, 0xf0, 0xdf, 0xff, 0xf1, 0x54, 0x15, 0x43, + 0xff, 0xff, 0x5f, 0xff, 0xe8, 0x7b, 0xc0, 0x05, 0x55, 0x55, 0x7f, 0x70, 0xff, 0x81, 0x28, + 0xaa, 0x0a, 0xa1, 0xff, 0xfe, 0xbf, 0xf7, 0xea, 0x09, 0xe0, 0x0a, 0x4a, 0xaa, 0x7f, 0xf0, + 0xff, 0x81, 0x50, 0x54, 0x05, 0x54, 0x7f, 0xff, 0x7f, 0xfc, 0xe8, 0x4b, 0xc0, 0x05, 0x55, + 0x55, 0x7f, 0x70, 0xfe, 0x7f, 0x28, 0xaa, 0x00, 0xa8, 0xff, 0xfe, 0xbf, 0xff, 0x0a, 0xf0, + 0x00, 0x02, 0x4a, 0xa8, 0x7e, 0xb0, 0xfe, 0x7f, 0x14, 0x55, 0x00, 0x03, 0xff, 0xf7, 0x5f, + 0x7f, 0xe0, 0x1f, 0xc4, 0x01, 0x55, 0x06, 0x7f, 0x70, 0xff, 0x81, 0x08, 0x2a, 0x80, 0x07, + 0xff, 0xf6, 0xaf, 0xff, 0xfe, 0x80, 0x6a, 0x80, 0x00, 0x7e, 0xff, 0xb0, 0x7f, 0x81, 0x14, + 0x55, 0x40, 0x0f, 0xff, 0xed, 0x57, 0x7f, 0xff, 0xe7, 0x85, 0x55, 0x5f, 0xfc, 0xff, 0x70, + 0xbf, 0xff, 0xe8, 0x2a, 0xa8, 0x1f, 0xff, 0xf6, 0xae, 0xff, 0xff, 0xf9, 0xea, 0xaa, 0x5f, + 0xfa, 0xff, 0xf0, 0x5e, 0x01, 0x24, 0x15, 0x54, 0x3f, 0xff, 0xf5, 0x57, 0x7f, 0xfb, 0xfe, + 0xf0, 0x55, 0x5f, 0xe5, 0xff, 0x70, 0xbe, 0x01, 0x22, 0x2a, 0xa0, 0xff, 0xff, 0xba, 0xae, + 0xff, 0xfe, 0x1f, 0x30, 0x2a, 0x0f, 0x89, 0xbf, 0xf0, 0x5f, 0xff, 0xe5, 0x15, 0x41, 0xff, + 0xff, 0xd5, 0x57, 0x7f, 0xff, 0xe0, 0x48, 0x05, 0x54, 0x53, 0xff, 0xf0, 0xbe, 0x01, 0xa2, + 0x02, 0x03, 0xff, 0xff, 0xea, 0xaa, 0xbf, 0xff, 0xff, 0x80, 0x00, 0x02, 0xa7, 0xbf, 0xf0, + 0x5e, 0x01, 0x41, 0x00, 0x06, 0xfd, 0xff, 0xd5, 0x55, 0x5f, 0xff, 0xff, 0xfc, 0x00, 0x40, + 0x4f, 0xff, 0xf0, 0xbe, 0x49, 0x20, 0x80, 0x0f, 0x7f, 0xfe, 0xea, 0xaa, 0xbe, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x1f, 0xbf, 0xf0, 0x7e, 0x49, 0x50, 0x00, 0x0f, 0x7f, 0xff, 0xd5, 0x55, + 0x5f, 0x83, 0xff, 0xff, 0x80, 0x40, 0x3f, 0xff, 0xf0, 0xfe, 0x41, 0x28, 0x00, 0x0f, 0xbf, + 0xff, 0xeb, 0xaa, 0xbf, 0xfc, 0x00, 0x03, 0xe0, 0x00, 0xff, 0xbf, 0xf0, 0xfe, 0x41, 0x14, + 0x00, 0x1f, 0xdf, 0xff, 0xd5, 0xd5, 0x57, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xdf, 0xf0, + 0xff, 0xff, 0x08, 0x00, 0x1f, 0x3f, 0xdf, 0xeb, 0xaa, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xf0, 0xfe, 0x01, 0x14, 0x40, 0x3e, 0xff, 0xbf, 0xf5, 0x55, 0x57, 0xdf, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xdf, 0xf0, 0xfe, 0x01, 0x0a, 0x20, 0x3f, 0xff, 0xdf, 0xfa, 0xaa, + 0xab, 0xbf, 0xff, 0xf3, 0xff, 0xff, 0xdf, 0xbf, 0xf0, 0xde, 0x7f, 0x05, 0x10, 0x7f, 0xff, + 0xff, 0xfd, 0x55, 0x55, 0xdf, 0xff, 0xe4, 0xff, 0xff, 0xbf, 0x7f, 0xf0, 0xee, 0x7e, 0x02, + 0x88, 0x7f, 0xff, 0xff, 0xfa, 0xaa, 0xab, 0xbf, 0xff, 0xe3, 0xff, 0xbf, 0xbf, 0xbf, 0xf0, + 0xde, 0x05, 0x41, 0x54, 0x3f, 0xff, 0xff, 0xdd, 0x55, 0x55, 0xff, 0xff, 0xd7, 0xff, 0xdf, + 0x7f, 0x7f, 0xf0, 0xee, 0x06, 0xa2, 0xaa, 0x3f, 0xff, 0xff, 0xbe, 0xaa, 0xab, 0xbf, 0xff, + 0xf7, 0xff, 0xbf, 0x3f, 0xbf, 0xf0, 0xde, 0x7d, 0x55, 0x55, 0x1f, 0xfb, 0xff, 0xff, 0x55, + 0x55, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xbf, 0xff, 0xf0, 0xfe, 0x7f, 0xaa, 0xaa, 0x8f, 0xff, + 0xff, 0xba, 0xaa, 0xab, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xdf, 0xbf, 0xf0, 0xfe, 0x01, 0x55, + 0x55, 0x47, 0xff, 0xff, 0xf7, 0xd5, 0x57, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xfe, 0x01, 0xaa, 0xaa, 0xa1, 0xff, 0xff, 0xbf, 0xea, 0xab, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0x55, 0x55, 0x54, 0xff, 0xff, 0x5f, 0xf5, 0x57, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xda, 0xaa, 0xaa, 0xaa, 0x7f, 0xff, 0xbf, 0xfa, + 0xab, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0x9d, 0x55, 0x55, 0x00, 0xff, + 0xff, 0x7f, 0xfd, 0x57, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xbf, 0xa2, + 0xa8, 0x03, 0xff, 0xfb, 0xbf, 0xfa, 0xaa, 0xbf, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0x3f, 0xc0, 0x00, 0x07, 0xff, 0xff, 0x5f, 0xfd, 0x57, 0x57, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0x3f, 0x80, 0x00, 0x0f, 0xff, 0xfb, 0xaf, 0xfe, 0xae, 0xaa, 0xfb, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0xf6, 0x7f, 0xc0, 0x00, 0x0f, 0xff, 0xff, 0x57, 0xfd, + 0x55, 0x55, 0x77, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf0, +}; + +const lv_img_dsc_t balloon = { + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .header.always_zero = 0, + .header.reserved = 0, + .header.w = 140, + .header.h = 68, + .data_size = 1232, + .data = balloon_map, +}; + +#ifndef LV_ATTRIBUTE_IMG_MOUNTAIN +#define LV_ATTRIBUTE_IMG_MOUNTAIN +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_MOUNTAIN uint8_t + mountain_map[] = { +#if CONFIG_NICE_VIEW_WIDGET_INVERTED + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ +#else + 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ + 0xff, 0xff, 0xff, 0xff, /*Color of index 1*/ +#endif + + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x90, 0x00, 0x30, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xa0, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x10, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0x10, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x01, 0xfe, 0x03, 0xe0, 0x0f, 0x9e, 0x01, 0x90, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x00, 0xff, 0x07, 0xe0, 0x1f, + 0x9e, 0x00, 0x90, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x00, 0x00, 0x7f, + 0x8f, 0xe0, 0x1f, 0xbe, 0x00, 0x90, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x00, 0x00, 0x3f, 0xcf, 0xf0, 0x1f, 0xbc, 0x00, 0x90, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xcf, 0xf0, 0x3f, 0xbc, 0x00, 0x90, 0x80, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x1f, 0xe7, 0xf0, 0x7f, 0x3c, 0x00, 0x90, + 0x80, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x00, 0x00, 0x0f, 0xe7, 0xf8, 0x7f, + 0x78, 0x01, 0xb0, 0x80, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x00, 0x00, 0x00, 0x07, + 0xf3, 0xf8, 0x3f, 0x78, 0x03, 0xd0, 0x80, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc0, 0x00, + 0x00, 0x00, 0x07, 0xfb, 0xf8, 0x3f, 0xf8, 0x0f, 0x90, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xec, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfd, 0xfc, 0x3f, 0xf8, 0x0f, 0x10, 0xc0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x3f, 0xf0, 0x0e, 0x10, + 0xc0, 0x0c, 0x27, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x7f, + 0xf0, 0x1e, 0x30, 0xc0, 0x00, 0x1f, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0xfe, 0x7f, 0xf3, 0xfc, 0x50, 0xe0, 0x00, 0x3f, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x7f, 0xf7, 0xf8, 0x90, 0xe0, 0x00, 0x7f, 0xfe, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x7f, 0xe7, 0xf1, 0x90, 0xe0, 0x00, 0x7f, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x7f, 0xef, 0xe3, 0x90, + 0xf0, 0x00, 0x7f, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x7f, + 0xff, 0xe7, 0x90, 0xb0, 0x10, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0xff, 0xbf, 0xff, 0xcf, 0x90, 0xf0, 0x30, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xff, 0xf9, 0xff, 0x9f, 0x90, 0xb0, 0x30, 0xff, 0xff, 0xff, 0xf2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf6, 0xff, 0x3e, 0x90, 0xf8, 0x70, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf6, 0xfe, 0x7c, 0x90, + 0xf8, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf9, + 0xfe, 0xf8, 0x90, 0xa8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xff, 0xfd, 0xf3, 0x90, 0xdc, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfb, 0xef, 0x90, 0xf5, 0xac, 0xff, 0xff, 0xff, 0xfe, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x90, 0xff, 0xd6, 0x7f, + 0xff, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x90, + 0xff, 0xfa, 0x7f, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, + 0xff, 0xff, 0x90, 0xdd, 0xff, 0x7f, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xff, 0xff, 0xf0, 0xea, 0xbf, 0x3f, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x10, 0xff, 0x4f, 0xbf, 0xf5, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x10, 0xff, 0xff, 0x9f, + 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf0, + 0xff, 0xb0, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xff, 0xff, 0x90, 0xcd, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x1f, 0xff, 0xff, 0x90, 0xb2, 0xe0, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x7f, 0xff, 0xff, 0x90, 0xff, 0xc0, 0x3f, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xff, 0xff, 0xff, 0x90, 0xfe, 0xc0, 0x7f, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xff, 0xff, 0x7c, 0x90, + 0xfd, 0x80, 0xff, 0xfd, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc3, 0xff, + 0xff, 0xb8, 0x90, 0xff, 0x80, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x87, 0xff, 0xff, 0xc8, 0x90, 0x9f, 0x01, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0x1f, 0xff, 0xff, 0xe0, 0x90, 0x86, 0x01, 0xff, 0xff, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 0x3f, 0xff, 0xff, 0xe0, 0x90, 0x80, 0x01, 0xff, + 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, 0x19, 0x83, 0xfe, 0x7f, 0xff, 0xff, 0xf0, 0x90, + 0x80, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x7f, 0xc7, 0xee, 0x7f, 0xff, + 0xff, 0xf8, 0x90, 0x80, 0x1a, 0xbf, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x98, 0xff, 0xff, + 0xc6, 0x7f, 0xff, 0xff, 0xfc, 0x90, 0x80, 0x3f, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xf1, 0xff, 0xff, 0xc0, 0x7f, 0xff, 0xff, 0xfe, 0x90, 0x80, 0x3f, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xe3, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x90, 0x80, 0x7f, 0xfe, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc7, 0xff, 0xfe, 0x18, 0xff, 0xef, 0xff, 0xff, 0x90, + 0x80, 0x7f, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x8f, 0xff, 0xfc, 0x7f, 0xff, 0xef, + 0xfd, 0xff, 0x90, 0x80, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x9f, 0xff, 0xf8, + 0xff, 0xff, 0xef, 0xfc, 0xf7, 0x90, 0x80, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x3f, + 0x1f, 0xff, 0xf1, 0xff, 0xff, 0xcf, 0xfc, 0xe1, 0x90, 0x80, 0xff, 0xff, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x7f, 0x3f, 0xff, 0xe3, 0xff, 0xff, 0xcf, 0xfe, 0x60, 0x90, 0x81, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x00, 0x00, 0x7f, 0x3f, 0xff, 0xc7, 0xff, 0xff, 0xdf, 0xfe, 0x40, 0x90, + 0x81, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x01, 0xfe, 0x3f, 0xff, 0xcf, 0xbf, 0xff, 0xdf, + 0xfe, 0x00, 0x90, 0x81, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x07, 0xfe, 0x7f, 0xff, 0x8f, + 0x7f, 0xff, 0x9f, 0xfe, 0x00, 0x90, 0x80, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x1f, 0xfe, + 0x7f, 0xff, 0x1e, 0xff, 0xff, 0x91, 0xfe, 0x00, 0x90, 0x80, 0xff, 0xff, 0xfe, 0xc0, 0x00, + 0x00, 0x3f, 0xfc, 0x7f, 0xfe, 0x3c, 0xff, 0xff, 0x81, 0xff, 0x00, 0x90, 0x80, 0x7f, 0xff, + 0xec, 0x00, 0x00, 0x3c, 0xff, 0xf8, 0xff, 0xfc, 0x79, 0xfd, 0xff, 0x80, 0xff, 0x00, 0x90, + 0x80, 0x27, 0xff, 0x80, 0x00, 0x00, 0x7f, 0xff, 0xf9, 0xff, 0xfc, 0xf3, 0xfb, 0xff, 0x00, + 0xff, 0x00, 0x90, 0x80, 0x5f, 0xff, 0xd8, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xff, 0xc8, 0xe7, + 0xf3, 0xff, 0x00, 0x7f, 0x00, 0x90, 0x80, 0xff, 0xff, 0xfd, 0x80, 0x01, 0xff, 0xff, 0xe3, + 0xff, 0x81, 0xcf, 0xf7, 0xff, 0x00, 0x7f, 0x00, 0x90, 0x80, 0xff, 0xff, 0xff, 0xd8, 0x03, + 0xff, 0xff, 0x87, 0xff, 0x03, 0x8f, 0xe7, 0xff, 0x00, 0x3f, 0x81, 0x90, 0x81, 0xff, 0xff, + 0xff, 0xfe, 0x83, 0xff, 0xfe, 0x0f, 0xfe, 0x3f, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x80, 0x00, 0x00, 0x00, 0x2f, 0xc6, 0x00, 0x00, 0x38, 0x00, 0x60, 0x00, 0x48, 0x00, 0x00, + 0x00, 0x00, 0x10, 0xc0, 0x00, 0x00, 0x00, 0x17, 0xf4, 0x00, 0x00, 0xe0, 0x00, 0xc0, 0x00, + 0x88, 0x00, 0x00, 0x00, 0x00, 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, +}; + +const lv_img_dsc_t mountain = { + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .header.always_zero = 0, + .header.reserved = 0, + .header.w = 140, + .header.h = 68, + .data_size = 1232, + .data = mountain_map, +}; diff --git a/app/boards/shields/nice_view/widgets/bolt.c b/app/boards/shields/nice_view/widgets/bolt.c new file mode 100644 index 00000000..74dcc2b0 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/bolt.c @@ -0,0 +1,45 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BOLT +#define LV_ATTRIBUTE_IMG_BOLT +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BOLT uint8_t bolt_map[] = { +#if CONFIG_NICE_VIEW_WIDGET_INVERTED + 0x00, 0x00, 0x00, 0x00, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + 0xff, 0xff, 0xff, 0xff, /*Color of index 2*/ + 0x00, 0x00, 0x00, 0x00, /*Color of index 3*/ +#else + 0x00, 0x00, 0x00, 0x00, /*Color of index 0*/ + 0xff, 0xff, 0xff, 0xff, /*Color of index 1*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 2*/ + 0x00, 0x00, 0x00, 0x00, /*Color of index 3*/ +#endif + + 0x00, 0x14, 0x00, 0x00, 0x64, 0x00, 0x00, 0x64, 0x00, 0x01, 0xa4, 0x00, 0x01, 0xa4, + 0x00, 0x06, 0xa4, 0x00, 0x06, 0xa4, 0x00, 0x1a, 0xa5, 0x54, 0x1a, 0xaa, 0xa4, 0x6a, + 0xaa, 0x90, 0x55, 0x6a, 0x90, 0x00, 0x6a, 0x40, 0x00, 0x6a, 0x40, 0x00, 0x69, 0x00, + 0x00, 0x69, 0x00, 0x00, 0x64, 0x00, 0x00, 0x64, 0x00, 0x00, 0x50, 0x00, +}; + +const lv_img_dsc_t bolt = { + .header.cf = LV_IMG_CF_INDEXED_2BIT, + .header.always_zero = 0, + .header.reserved = 0, + .header.w = 11, + .header.h = 18, + .data_size = 70, + .data = bolt_map, +}; diff --git a/app/boards/shields/nice_view/widgets/peripheral_status.c b/app/boards/shields/nice_view/widgets/peripheral_status.c new file mode 100644 index 00000000..85c2a1d8 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/peripheral_status.c @@ -0,0 +1,128 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#include +#include +#include + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include "peripheral_status.h" +#include +#include +#include +#include +#include +#include +#include + +LV_IMG_DECLARE(balloon); +LV_IMG_DECLARE(mountain); + +static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); + +struct peripheral_status_state { + bool connected; +}; + +static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) { + lv_obj_t *canvas = lv_obj_get_child(widget, 0); + + lv_draw_label_dsc_t label_dsc; + init_label_dsc(&label_dsc, LVGL_FOREGROUND, &lv_font_montserrat_16, LV_TEXT_ALIGN_RIGHT); + lv_draw_rect_dsc_t rect_black_dsc; + init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND); + + // Fill background + lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); + + // Draw battery + draw_battery(canvas, state); + + // Draw output status + lv_canvas_draw_text(canvas, 0, 0, CANVAS_SIZE, &label_dsc, + state.connected ? LV_SYMBOL_WIFI : LV_SYMBOL_CLOSE); + + // Rotate canvas + rotate_canvas(canvas, cbuf); +} + +static void set_battery_status(struct zmk_widget_status *widget, + struct battery_status_state state) { +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + widget->state.charging = state.usb_present; +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + + widget->state.battery = state.level; + + draw_top(widget->obj, widget->cbuf, widget->state); +} + +static void battery_status_update_cb(struct battery_status_state state) { + struct zmk_widget_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_battery_status(widget, state); } +} + +static struct battery_status_state battery_status_get_state(const zmk_event_t *eh) { + return (struct battery_status_state) { + .level = bt_bas_get_battery_level(), +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + .usb_present = zmk_usb_is_powered(), +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + }; +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_battery_status, struct battery_status_state, + battery_status_update_cb, battery_status_get_state) + +ZMK_SUBSCRIPTION(widget_battery_status, zmk_battery_state_changed); +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) +ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + +static struct peripheral_status_state get_state(const zmk_event_t *_eh) { + return (struct peripheral_status_state){.connected = zmk_split_bt_peripheral_is_connected()}; +} + +static void set_connection_status(struct zmk_widget_status *widget, + struct peripheral_status_state state) { + widget->state.connected = state.connected; + + draw_top(widget->obj, widget->cbuf, widget->state); +} + +static void output_status_update_cb(struct peripheral_status_state state) { + struct zmk_widget_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_connection_status(widget, state); } +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_peripheral_status, struct peripheral_status_state, + output_status_update_cb, get_state) +ZMK_SUBSCRIPTION(widget_peripheral_status, zmk_split_peripheral_status_changed); + +int zmk_widget_status_init(struct zmk_widget_status *widget, lv_obj_t *parent) { + widget->obj = lv_obj_create(parent); + lv_obj_set_size(widget->obj, 160, 68); + lv_obj_t *top = lv_canvas_create(widget->obj); + lv_obj_align(top, LV_ALIGN_TOP_RIGHT, 0, 0); + lv_canvas_set_buffer(top, widget->cbuf, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR); + + lv_obj_t *art = lv_img_create(widget->obj); + bool random = sys_rand32_get() & 1; + lv_img_set_src(art, random ? &balloon : &mountain); + lv_obj_align(art, LV_ALIGN_TOP_LEFT, 0, 0); + + sys_slist_append(&widgets, &widget->node); + widget_battery_status_init(); + widget_peripheral_status_init(); + + return 0; +} + +lv_obj_t *zmk_widget_status_obj(struct zmk_widget_status *widget) { return widget->obj; } diff --git a/app/boards/shields/nice_view/widgets/peripheral_status.h b/app/boards/shields/nice_view/widgets/peripheral_status.h new file mode 100644 index 00000000..81596357 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/peripheral_status.h @@ -0,0 +1,22 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include +#include +#include "util.h" + +struct zmk_widget_status { + sys_snode_t node; + lv_obj_t *obj; + lv_color_t cbuf[CANVAS_SIZE * CANVAS_SIZE]; + struct status_state state; +}; + +int zmk_widget_status_init(struct zmk_widget_status *widget, lv_obj_t *parent); +lv_obj_t *zmk_widget_status_obj(struct zmk_widget_status *widget); diff --git a/app/boards/shields/nice_view/widgets/status.c b/app/boards/shields/nice_view/widgets/status.c new file mode 100644 index 00000000..1ad9e920 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/status.c @@ -0,0 +1,330 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#include +#include + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include "status.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); + +struct output_status_state { + enum zmk_endpoint selected_endpoint; + bool active_profile_connected; + bool active_profile_bonded; + uint8_t active_profile_index; +}; + +struct layer_status_state { + uint8_t index; + const char *label; +}; + +struct wpm_status_state { + uint8_t wpm; +}; + +static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) { + lv_obj_t *canvas = lv_obj_get_child(widget, 0); + + lv_draw_label_dsc_t label_dsc; + init_label_dsc(&label_dsc, LVGL_FOREGROUND, &lv_font_montserrat_16, LV_TEXT_ALIGN_RIGHT); + lv_draw_label_dsc_t label_dsc_wpm; + init_label_dsc(&label_dsc_wpm, LVGL_FOREGROUND, &lv_font_unscii_8, LV_TEXT_ALIGN_RIGHT); + lv_draw_rect_dsc_t rect_black_dsc; + init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND); + lv_draw_rect_dsc_t rect_white_dsc; + init_rect_dsc(&rect_white_dsc, LVGL_FOREGROUND); + lv_draw_line_dsc_t line_dsc; + init_line_dsc(&line_dsc, LVGL_FOREGROUND, 1); + + // Fill background + lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); + + // Draw battery + draw_battery(canvas, state); + + // Draw output status + char output_text[10] = {}; + + switch (state.selected_endpoint) { + case ZMK_ENDPOINT_USB: + strcat(output_text, LV_SYMBOL_USB); + break; + case ZMK_ENDPOINT_BLE: + if (state.active_profile_bonded) { + if (state.active_profile_connected) { + strcat(output_text, LV_SYMBOL_WIFI); + } else { + strcat(output_text, LV_SYMBOL_CLOSE); + } + } else { + strcat(output_text, LV_SYMBOL_SETTINGS); + } + break; + } + + lv_canvas_draw_text(canvas, 0, 0, CANVAS_SIZE, &label_dsc, output_text); + + // Draw WPM + lv_canvas_draw_rect(canvas, 0, 21, 68, 42, &rect_white_dsc); + lv_canvas_draw_rect(canvas, 1, 22, 66, 40, &rect_black_dsc); + + char wpm_text[6] = {}; + snprintf(wpm_text, sizeof(wpm_text), "%d", state.wpm[9]); + lv_canvas_draw_text(canvas, 42, 52, 24, &label_dsc_wpm, wpm_text); + + int max = 0; + int min = 256; + + for (int i = 0; i < 10; i++) { + if (state.wpm[i] > max) { + max = state.wpm[i]; + } + if (state.wpm[i] < min) { + min = state.wpm[i]; + } + } + + int range = max - min; + if (range == 0) { + range = 1; + } + + lv_point_t points[10]; + for (int i = 0; i < 10; i++) { + points[i].x = 2 + i * 7; + points[i].y = 60 - (state.wpm[i] - min) * 36 / range; + } + lv_canvas_draw_line(canvas, points, 10, &line_dsc); + + // Rotate canvas + rotate_canvas(canvas, cbuf); +} + +static void draw_middle(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) { + lv_obj_t *canvas = lv_obj_get_child(widget, 1); + + lv_draw_rect_dsc_t rect_black_dsc; + init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND); + lv_draw_rect_dsc_t rect_white_dsc; + init_rect_dsc(&rect_white_dsc, LVGL_FOREGROUND); + lv_draw_arc_dsc_t arc_dsc; + init_arc_dsc(&arc_dsc, LVGL_FOREGROUND, 2); + lv_draw_arc_dsc_t arc_dsc_filled; + init_arc_dsc(&arc_dsc_filled, LVGL_FOREGROUND, 9); + lv_draw_label_dsc_t label_dsc; + init_label_dsc(&label_dsc, LVGL_FOREGROUND, &lv_font_montserrat_18, LV_TEXT_ALIGN_CENTER); + lv_draw_label_dsc_t label_dsc_black; + init_label_dsc(&label_dsc_black, LVGL_BACKGROUND, &lv_font_montserrat_18, LV_TEXT_ALIGN_CENTER); + + // Fill background + lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); + + // Draw circles + int circle_offsets[5][2] = { + {13, 13}, {55, 13}, {34, 34}, {13, 55}, {55, 55}, + }; + + for (int i = 0; i < 5; i++) { + bool selected = state.active_profile_index == i; + + lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 13, 0, 359, + &arc_dsc); + + if (selected) { + lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 9, 0, 359, + &arc_dsc_filled); + } + + char label[2]; + snprintf(label, sizeof(label), "%d", i + 1); + lv_canvas_draw_text(canvas, circle_offsets[i][0] - 8, circle_offsets[i][1] - 10, 16, + (selected ? &label_dsc_black : &label_dsc), label); + } + + // Rotate canvas + rotate_canvas(canvas, cbuf); +} + +static void draw_bottom(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) { + lv_obj_t *canvas = lv_obj_get_child(widget, 2); + + lv_draw_rect_dsc_t rect_black_dsc; + init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND); + lv_draw_label_dsc_t label_dsc; + init_label_dsc(&label_dsc, LVGL_FOREGROUND, &lv_font_montserrat_14, LV_TEXT_ALIGN_CENTER); + + // Fill background + lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); + + // Draw layer + if (state.layer_label == NULL) { + char text[9] = {}; + + sprintf(text, "LAYER %i", state.layer_index); + + lv_canvas_draw_text(canvas, 0, 5, 68, &label_dsc, text); + } else { + lv_canvas_draw_text(canvas, 0, 5, 68, &label_dsc, state.layer_label); + } + + // Rotate canvas + rotate_canvas(canvas, cbuf); +} + +static void set_battery_status(struct zmk_widget_status *widget, + struct battery_status_state state) { +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + widget->state.charging = state.usb_present; +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + + widget->state.battery = state.level; + + draw_top(widget->obj, widget->cbuf, widget->state); +} + +static void battery_status_update_cb(struct battery_status_state state) { + struct zmk_widget_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_battery_status(widget, state); } +} + +static struct battery_status_state battery_status_get_state(const zmk_event_t *eh) { + return (struct battery_status_state) { + .level = bt_bas_get_battery_level(), +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + .usb_present = zmk_usb_is_powered(), +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + }; +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_battery_status, struct battery_status_state, + battery_status_update_cb, battery_status_get_state) + +ZMK_SUBSCRIPTION(widget_battery_status, zmk_battery_state_changed); +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) +ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + +static void set_output_status(struct zmk_widget_status *widget, struct output_status_state state) { + widget->state.selected_endpoint = state.selected_endpoint; + widget->state.active_profile_connected = state.active_profile_connected; + widget->state.active_profile_bonded = state.active_profile_bonded; + widget->state.active_profile_index = state.active_profile_index; + + draw_top(widget->obj, widget->cbuf, widget->state); + draw_middle(widget->obj, widget->cbuf2, widget->state); +} + +static void output_status_update_cb(struct output_status_state state) { + struct zmk_widget_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_output_status(widget, state); } +} + +static struct output_status_state output_status_get_state(const zmk_event_t *_eh) { + return (struct output_status_state){.selected_endpoint = zmk_endpoints_selected(), + .active_profile_connected = + zmk_ble_active_profile_is_connected(), + .active_profile_bonded = !zmk_ble_active_profile_is_open(), + .active_profile_index = zmk_ble_active_profile_index()}; + ; +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_output_status, struct output_status_state, + output_status_update_cb, output_status_get_state) +ZMK_SUBSCRIPTION(widget_output_status, zmk_endpoint_selection_changed); + +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) +ZMK_SUBSCRIPTION(widget_output_status, zmk_usb_conn_state_changed); +#endif +#if defined(CONFIG_ZMK_BLE) +ZMK_SUBSCRIPTION(widget_output_status, zmk_ble_active_profile_changed); +#endif + +static void set_layer_status(struct zmk_widget_status *widget, struct layer_status_state state) { + widget->state.layer_index = state.index; + widget->state.layer_label = state.label; + + draw_bottom(widget->obj, widget->cbuf3, widget->state); +} + +static void layer_status_update_cb(struct layer_status_state state) { + struct zmk_widget_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_layer_status(widget, state); } +} + +static struct layer_status_state layer_status_get_state(const zmk_event_t *eh) { + uint8_t index = zmk_keymap_highest_layer_active(); + return (struct layer_status_state){.index = index, .label = zmk_keymap_layer_label(index)}; +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_layer_status, struct layer_status_state, layer_status_update_cb, + layer_status_get_state) + +ZMK_SUBSCRIPTION(widget_layer_status, zmk_layer_state_changed); + +static void set_wpm_status(struct zmk_widget_status *widget, struct wpm_status_state state) { + for (int i = 0; i < 9; i++) { + widget->state.wpm[i] = widget->state.wpm[i + 1]; + } + widget->state.wpm[9] = state.wpm; + + draw_top(widget->obj, widget->cbuf, widget->state); +} + +static void wpm_status_update_cb(struct wpm_status_state state) { + struct zmk_widget_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_wpm_status(widget, state); } +} + +struct wpm_status_state wpm_status_get_state(const zmk_event_t *eh) { + return (struct wpm_status_state){.wpm = zmk_wpm_get_state()}; +}; + +ZMK_DISPLAY_WIDGET_LISTENER(widget_wpm_status, struct wpm_status_state, wpm_status_update_cb, + wpm_status_get_state) +ZMK_SUBSCRIPTION(widget_wpm_status, zmk_wpm_state_changed); + +int zmk_widget_status_init(struct zmk_widget_status *widget, lv_obj_t *parent) { + widget->obj = lv_obj_create(parent); + lv_obj_set_size(widget->obj, 160, 68); + lv_obj_t *top = lv_canvas_create(widget->obj); + lv_obj_align(top, LV_ALIGN_TOP_RIGHT, 0, 0); + lv_canvas_set_buffer(top, widget->cbuf, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR); + lv_obj_t *middle = lv_canvas_create(widget->obj); + lv_obj_align(middle, LV_ALIGN_TOP_LEFT, 24, 0); + lv_canvas_set_buffer(middle, widget->cbuf2, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR); + lv_obj_t *bottom = lv_canvas_create(widget->obj); + lv_obj_align(bottom, LV_ALIGN_TOP_LEFT, -44, 0); + lv_canvas_set_buffer(bottom, widget->cbuf3, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR); + + sys_slist_append(&widgets, &widget->node); + widget_battery_status_init(); + widget_output_status_init(); + widget_layer_status_init(); + widget_wpm_status_init(); + + return 0; +} + +lv_obj_t *zmk_widget_status_obj(struct zmk_widget_status *widget) { return widget->obj; } diff --git a/app/boards/shields/nice_view/widgets/status.h b/app/boards/shields/nice_view/widgets/status.h new file mode 100644 index 00000000..53a22518 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/status.h @@ -0,0 +1,24 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include +#include +#include "util.h" + +struct zmk_widget_status { + sys_snode_t node; + lv_obj_t *obj; + lv_color_t cbuf[CANVAS_SIZE * CANVAS_SIZE]; + lv_color_t cbuf2[CANVAS_SIZE * CANVAS_SIZE]; + lv_color_t cbuf3[CANVAS_SIZE * CANVAS_SIZE]; + struct status_state state; +}; + +int zmk_widget_status_init(struct zmk_widget_status *widget, lv_obj_t *parent); +lv_obj_t *zmk_widget_status_obj(struct zmk_widget_status *widget); diff --git a/app/boards/shields/nice_view/widgets/util.c b/app/boards/shields/nice_view/widgets/util.c new file mode 100644 index 00000000..9655f837 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/util.c @@ -0,0 +1,69 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#include +#include "util.h" + +LV_IMG_DECLARE(bolt); + +void rotate_canvas(lv_obj_t *canvas, lv_color_t cbuf[]) { + static lv_color_t cbuf_tmp[CANVAS_SIZE * CANVAS_SIZE]; + memcpy(cbuf_tmp, cbuf, sizeof(cbuf_tmp)); + lv_img_dsc_t img; + img.data = (void *)cbuf_tmp; + img.header.cf = LV_IMG_CF_TRUE_COLOR; + img.header.w = CANVAS_SIZE; + img.header.h = CANVAS_SIZE; + + lv_canvas_fill_bg(canvas, LVGL_BACKGROUND, LV_OPA_COVER); + lv_canvas_transform(canvas, &img, 900, LV_IMG_ZOOM_NONE, -1, 0, CANVAS_SIZE / 2, + CANVAS_SIZE / 2, true); +} + +void draw_battery(lv_obj_t *canvas, struct status_state state) { + lv_draw_rect_dsc_t rect_black_dsc; + init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND); + lv_draw_rect_dsc_t rect_white_dsc; + init_rect_dsc(&rect_white_dsc, LVGL_FOREGROUND); + + lv_canvas_draw_rect(canvas, 0, 2, 29, 12, &rect_white_dsc); + lv_canvas_draw_rect(canvas, 1, 3, 27, 10, &rect_black_dsc); + lv_canvas_draw_rect(canvas, 2, 4, (state.battery + 2) / 4, 8, &rect_white_dsc); + lv_canvas_draw_rect(canvas, 30, 5, 3, 6, &rect_white_dsc); + lv_canvas_draw_rect(canvas, 31, 6, 1, 4, &rect_black_dsc); + + if (state.charging) { + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + lv_canvas_draw_img(canvas, 9, -1, &bolt, &img_dsc); + } +} + +void init_label_dsc(lv_draw_label_dsc_t *label_dsc, lv_color_t color, const lv_font_t *font, + lv_text_align_t align) { + lv_draw_label_dsc_init(label_dsc); + label_dsc->color = color; + label_dsc->font = font; + label_dsc->align = align; +} + +void init_rect_dsc(lv_draw_rect_dsc_t *rect_dsc, lv_color_t bg_color) { + lv_draw_rect_dsc_init(rect_dsc); + rect_dsc->bg_color = bg_color; +} + +void init_line_dsc(lv_draw_line_dsc_t *line_dsc, lv_color_t color, uint8_t width) { + lv_draw_line_dsc_init(line_dsc); + line_dsc->color = color; + line_dsc->width = width; +} + +void init_arc_dsc(lv_draw_arc_dsc_t *arc_dsc, lv_color_t color, uint8_t width) { + lv_draw_arc_dsc_init(arc_dsc); + arc_dsc->color = color; + arc_dsc->width = width; +} diff --git a/app/boards/shields/nice_view/widgets/util.h b/app/boards/shields/nice_view/widgets/util.h new file mode 100644 index 00000000..e48c1082 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/util.h @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#include +#include + +#define CANVAS_SIZE 68 + +#define LVGL_BACKGROUND \ + IS_ENABLED(CONFIG_NICE_VIEW_WIDGET_INVERTED) ? lv_color_black() : lv_color_white() +#define LVGL_FOREGROUND \ + IS_ENABLED(CONFIG_NICE_VIEW_WIDGET_INVERTED) ? lv_color_white() : lv_color_black() + +struct status_state { + uint8_t battery; + bool charging; +#if !IS_ENABLED(CONFIG_ZMK_SPLIT) || IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) + enum zmk_endpoint selected_endpoint; + bool active_profile_connected; + bool active_profile_bonded; + uint8_t active_profile_index; + uint8_t layer_index; + const char *layer_label; + uint8_t wpm[10]; +#else + bool connected; +#endif +}; + +struct battery_status_state { + uint8_t level; +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + bool usb_present; +#endif +}; + +void rotate_canvas(lv_obj_t *canvas, lv_color_t cbuf[]); +void draw_battery(lv_obj_t *canvas, struct status_state state); +void init_label_dsc(lv_draw_label_dsc_t *label_dsc, lv_color_t color, const lv_font_t *font, + lv_text_align_t align); +void init_rect_dsc(lv_draw_rect_dsc_t *rect_dsc, lv_color_t bg_color); +void init_line_dsc(lv_draw_line_dsc_t *line_dsc, lv_color_t color, uint8_t width); +void init_arc_dsc(lv_draw_arc_dsc_t *arc_dsc, lv_color_t color, uint8_t width); From 51a4be89355550ccdc00833c18ceaba5ddabcb51 Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Tue, 18 Jul 2023 16:55:32 -0500 Subject: [PATCH 275/289] fix(displays): Don't enable built-in widget configs by default --- app/src/display/Kconfig | 6 +++++- app/src/display/widgets/Kconfig | 4 ---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index 63ba968b..a2029481 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -7,7 +7,6 @@ menuconfig ZMK_DISPLAY select DISPLAY select LVGL select LV_CONF_MINIMAL - imply LV_USE_THEME_MONO if ZMK_DISPLAY @@ -42,6 +41,11 @@ choice ZMK_DISPLAY_STATUS_SCREEN config ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN bool "Built in status screen" select LV_OBJ_LABEL + imply LV_USE_THEME_MONO + imply ZMK_WIDGET_LAYER_STATUS + imply ZMK_WIDGET_BATTERY_STATUS + imply ZMK_WIDGET_OUTPUT_STATUS + imply ZMK_WIDGET_PERIPHERAL_STATUS config ZMK_DISPLAY_STATUS_SCREEN_CUSTOM bool "Custom status screen" diff --git a/app/src/display/widgets/Kconfig b/app/src/display/widgets/Kconfig index 4c056cf5..7ec20c1f 100644 --- a/app/src/display/widgets/Kconfig +++ b/app/src/display/widgets/Kconfig @@ -5,14 +5,12 @@ menu "ZMK Display Widgets" config ZMK_WIDGET_LAYER_STATUS bool "Widget for highest, active layer using small icons" - default y depends on !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL select LV_USE_LABEL config ZMK_WIDGET_BATTERY_STATUS bool "Widget for battery charge information, using small icons" depends on BT - default y if BT select LV_USE_LABEL if ZMK_WIDGET_BATTERY_STATUS @@ -25,13 +23,11 @@ endif config ZMK_WIDGET_OUTPUT_STATUS bool "Widget for keyboard output status icons" depends on BT && (!ZMK_SPLIT_BLE || ZMK_SPLIT_ROLE_CENTRAL) - default y if BT && (!ZMK_SPLIT_BLE || ZMK_SPLIT_ROLE_CENTRAL) select LV_USE_LABEL config ZMK_WIDGET_PERIPHERAL_STATUS bool "Widget for split peripheral status icons" depends on BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL - default y if BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL select LV_USE_LABEL config ZMK_WIDGET_WPM_STATUS From ee1e13510410e9b482fd20acf112bc3f1466c362 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Tue, 18 Jul 2023 23:21:09 -0700 Subject: [PATCH 276/289] fix: Proper battery sensor Kconfig dependencies. Properly make the battery sensor Kconfig symbols depend on `SENSOR` config, and minor battery reporting Kconfig symbol dependency fix. --- app/Kconfig | 2 +- app/drivers/sensor/battery/Kconfig | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 92641c14..fe019918 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -500,7 +500,7 @@ config ZMK_SETTINGS_SAVE_DEBOUNCE endif config ZMK_BATTERY_REPORT_INTERVAL - depends on ZMK_BLE + depends on ZMK_BATTERY_REPORTING int "Battery level report interval in seconds" default 60 diff --git a/app/drivers/sensor/battery/Kconfig b/app/drivers/sensor/battery/Kconfig index a9d7189e..703adebd 100644 --- a/app/drivers/sensor/battery/Kconfig +++ b/app/drivers/sensor/battery/Kconfig @@ -14,6 +14,7 @@ config ZMK_BATTERY_NRF_VDDH default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_NRF_VDDH)) select ADC select ZMK_BATTERY + depends on SENSOR help Enable ZMK nRF VDDH voltage driver for battery monitoring. @@ -22,5 +23,6 @@ config ZMK_BATTERY_VOLTAGE_DIVIDER default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_VOLTAGE_DIVIDER)) select ADC select ZMK_BATTERY + depends on SENSOR help Enable ZMK battery voltage divider driver for battery monitoring. From cec2061dada6b18580ce20f0c1c70df38aa2a379 Mon Sep 17 00:00:00 2001 From: Maciej Konieczny aka narf Date: Wed, 19 Jul 2023 21:59:29 +0200 Subject: [PATCH 277/289] fix(docs): Fix typos in parameterized macros docs. --- docs/docs/behaviors/macros.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/docs/behaviors/macros.md b/docs/docs/behaviors/macros.md index 40c333a9..279d1356 100644 --- a/docs/docs/behaviors/macros.md +++ b/docs/docs/behaviors/macros.md @@ -61,9 +61,9 @@ Macros can also be "parameterized", allowing them to be bound in your keymap wit When defining a parameterized macro, a different `compatible` value will be used depending on how many parameters are passed into it: -- `zmk,behavior-macro` - a parameter that takes no parameters. -- `zmk,behavior-macro-one-param` - a parameter that takes one parameter when used. -- `zmk,behavior-macro-two-param` - a parameter that takes two parameters when used. +- `zmk,behavior-macro` - a macro that takes no parameters. +- `zmk,behavior-macro-one-param` - a macro that takes one parameter when used. +- `zmk,behavior-macro-two-param` - a macro that takes two parameters when used. ### Bindings From b945ffe943f1639bfe992ddb4bc12f968d3858f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Jul 2023 15:07:59 +0000 Subject: [PATCH 278/289] chore(deps): bump semver from 5.7.1 to 5.7.2 in /docs Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2) --- updated-dependencies: - dependency-name: semver dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 156 ++++++++++++++++++++--------------------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 5badb07e..b990f53c 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -251,9 +251,9 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -325,9 +325,9 @@ } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -384,9 +384,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -1634,9 +1634,9 @@ } }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -1846,9 +1846,9 @@ } }, "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -2959,9 +2959,9 @@ } }, "node_modules/@mdx-js/mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -4366,9 +4366,9 @@ } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -6812,9 +6812,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -9456,9 +9456,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -11353,9 +11353,9 @@ } }, "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -13008,9 +13008,9 @@ } }, "node_modules/remark-mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -13522,9 +13522,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -13547,9 +13547,9 @@ } }, "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -16203,9 +16203,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -16260,9 +16260,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -16303,9 +16303,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -17113,9 +17113,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -17270,9 +17270,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -18097,9 +18097,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, "source-map": { "version": "0.5.7", @@ -19210,9 +19210,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -20999,9 +20999,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -22887,9 +22887,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -24147,9 +24147,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -25310,9 +25310,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, "source-map": { "version": "0.5.7", @@ -25676,9 +25676,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -25692,9 +25692,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, From 73e1b526d56376be09908a3726fbe9553052e447 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 19 Jul 2023 14:59:40 +0000 Subject: [PATCH 279/289] fix(bluetooth): Properly clear peripheral slots * When the clear bonds Kconfig is set, also clear peripheral address slots addresses from settings as well. --- app/src/ble.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/ble.c b/app/src/ble.c index ff82f3cf..6607574c 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -606,7 +606,7 @@ static int zmk_ble_init(const struct device *_arg) { bt_unpair(BT_ID_DEFAULT, NULL); - for (int i = 0; i < ZMK_BLE_PROFILE_COUNT; i++) { + for (int i = 0; i < 8; i++) { char setting_name[15]; sprintf(setting_name, "ble/profiles/%d", i); @@ -615,7 +615,20 @@ static int zmk_ble_init(const struct device *_arg) { LOG_ERR("Failed to delete setting: %d", err); } } -#endif + + // Hardcoding a reasonable hardcoded value of peripheral addresses + // to clear so we properly clear a split central as well. + for (int i = 0; i < 8; i++) { + char setting_name[32]; + sprintf(setting_name, "ble/peripheral_addresses/%d", i); + + err = settings_delete(setting_name); + if (err) { + LOG_ERR("Failed to delete setting: %d", err); + } + } + +#endif // IS_ENABLED(CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START) bt_conn_cb_register(&conn_callbacks); bt_conn_auth_cb_register(&zmk_ble_auth_cb_display); From ed400c4feb7955bdc839fbf33b463a73c898a033 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 19 Jul 2023 16:21:06 +0000 Subject: [PATCH 280/289] fix(bluetooth): Corrected use of `bt_addr_le_cmp` * Properly compare to zero when comparing LE addresses. --- app/src/ble.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/ble.c b/app/src/ble.c index 6607574c..38a9833c 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -281,14 +281,14 @@ int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr) { for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { // If the address is recognized and already stored in settings, return // index and no additional action is necessary. - if (!bt_addr_le_cmp(&peripheral_addrs[i], addr)) { + if (bt_addr_le_cmp(&peripheral_addrs[i], addr) == 0) { return i; } // If the peripheral address slot is open, store new peripheral in the // slot and return index. This compares against BT_ADDR_LE_ANY as that // is the zero value. - if (!bt_addr_le_cmp(&peripheral_addrs[i], BT_ADDR_LE_ANY)) { + if (bt_addr_le_cmp(&peripheral_addrs[i], BT_ADDR_LE_ANY) == 0) { char addr_str[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(addr, addr_str, sizeof(addr_str)); LOG_DBG("Storing peripheral %s in slot %d", addr_str, i); From 54c2e8e155e9be71026251946c98e8e45c989388 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 20 Jul 2023 06:35:41 +0000 Subject: [PATCH 281/289] feat: Add more logging to peripheral settings. --- app/src/ble.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/ble.c b/app/src/ble.c index 38a9833c..483bc9d7 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -282,7 +282,12 @@ int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr) { // If the address is recognized and already stored in settings, return // index and no additional action is necessary. if (bt_addr_le_cmp(&peripheral_addrs[i], addr) == 0) { + LOG_DBG("Found existing peripheral address in slot %d", i); return i; + } else { + char addr_str[BT_ADDR_LE_STR_LEN]; + bt_addr_le_to_str(&peripheral_addrs[i], addr_str, sizeof(addr_str)); + LOG_DBG("peripheral slot %d occupied by %s", i, addr_str); } // If the peripheral address slot is open, store new peripheral in the From 5f6a13413bba84eeb1eb89c4ff2a5710ca552e6b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 20 Jul 2023 23:34:09 -0700 Subject: [PATCH 282/289] fix(bluetooth): Split improvements * Proper usage of bt_uuid_cmp. * Central's don't start scanning for peripherals if `ZMK_BLE_CLEAR_BONDS_ON_START` is enabled. * Split peripherals don't advertize if `ZMK_BLE_CLEAR_BONDS_ON_START` is enabled. --- app/src/split/bluetooth/central.c | 15 ++++++++------- app/src/split/bluetooth/peripheral.c | 4 ++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 147760ff..8a5e9d35 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -251,8 +251,8 @@ static uint8_t split_central_chrc_discovery_func(struct bt_conn *conn, LOG_DBG("[ATTRIBUTE] handle %u", attr->handle); - if (!bt_uuid_cmp(((struct bt_gatt_chrc *)attr->user_data)->uuid, - BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_POSITION_STATE_UUID))) { + if (bt_uuid_cmp(((struct bt_gatt_chrc *)attr->user_data)->uuid, + BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_POSITION_STATE_UUID)) == 0) { LOG_DBG("Found position state characteristic"); slot->discover_params.uuid = NULL; slot->discover_params.start_handle = attr->handle + 2; @@ -264,8 +264,8 @@ static uint8_t split_central_chrc_discovery_func(struct bt_conn *conn, slot->subscribe_params.notify = split_central_notify_func; slot->subscribe_params.value = BT_GATT_CCC_NOTIFY; split_central_subscribe(conn); - } else if (!bt_uuid_cmp(((struct bt_gatt_chrc *)attr->user_data)->uuid, - BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_RUN_BEHAVIOR_UUID))) { + } else if (bt_uuid_cmp(((struct bt_gatt_chrc *)attr->user_data)->uuid, + BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_RUN_BEHAVIOR_UUID)) == 0) { LOG_DBG("Found run behavior handle"); slot->run_behavior_handle = bt_gatt_attr_value_handle(attr); } @@ -292,7 +292,8 @@ static uint8_t split_central_service_discovery_func(struct bt_conn *conn, return BT_GATT_ITER_STOP; } - if (bt_uuid_cmp(slot->discover_params.uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SERVICE_UUID))) { + if (bt_uuid_cmp(slot->discover_params.uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SERVICE_UUID)) != + 0) { LOG_DBG("Found other service"); return BT_GATT_ITER_CONTINUE; } @@ -418,7 +419,7 @@ static bool split_central_eir_parse(struct bt_data *data, void *user_data) { continue; } - if (bt_uuid_cmp(&uuid.uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SERVICE_UUID))) { + if (bt_uuid_cmp(&uuid.uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SERVICE_UUID)) != 0) { char uuid_str[BT_UUID_STR_LEN]; char service_uuid_str[BT_UUID_STR_LEN]; @@ -622,7 +623,7 @@ int zmk_split_bt_central_init(const struct device *_arg) { CONFIG_ZMK_BLE_THREAD_PRIORITY, NULL); bt_conn_cb_register(&conn_callbacks); - return start_scanning(); + return IS_ENABLED(CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START) ? 0 : start_scanning(); } SYS_INIT(zmk_split_bt_central_init, APPLICATION, CONFIG_ZMK_BLE_INIT_PRIORITY); diff --git a/app/src/split/bluetooth/peripheral.c b/app/src/split/bluetooth/peripheral.c index 6b767baa..e053db8a 100644 --- a/app/src/split/bluetooth/peripheral.c +++ b/app/src/split/bluetooth/peripheral.c @@ -116,11 +116,11 @@ static int zmk_peripheral_ble_init(const struct device *_arg) { LOG_WRN("Clearing all existing BLE bond information from the keyboard"); bt_unpair(BT_ID_DEFAULT, NULL); -#endif - +#else bt_conn_cb_register(&conn_callbacks); start_advertising(); +#endif return 0; } From 147f7f23dca7a2eb5d7433d399948cfd51e068a9 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 20 Jul 2023 23:53:38 -0700 Subject: [PATCH 283/289] fix(shields): Make settings_reset more flexible. * Don't reference `pro_micro` nexus node in settings_reset so it can be used with other controllers. * Use mock kscan node instead. --- app/boards/shields/settings_reset/settings_reset.keymap | 4 +--- app/boards/shields/settings_reset/settings_reset.overlay | 8 ++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/boards/shields/settings_reset/settings_reset.keymap b/app/boards/shields/settings_reset/settings_reset.keymap index 0afdcc2b..1206ef1e 100644 --- a/app/boards/shields/settings_reset/settings_reset.keymap +++ b/app/boards/shields/settings_reset/settings_reset.keymap @@ -12,9 +12,7 @@ compatible = "zmk,keymap"; default_layer { - bindings = < - &sys_reset - >; + bindings = <&sys_reset>; }; }; }; diff --git a/app/boards/shields/settings_reset/settings_reset.overlay b/app/boards/shields/settings_reset/settings_reset.overlay index 77a9d858..48a5f223 100644 --- a/app/boards/shields/settings_reset/settings_reset.overlay +++ b/app/boards/shields/settings_reset/settings_reset.overlay @@ -12,12 +12,12 @@ }; kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; + compatible = "zmk,kscan-mock"; label = "KSCAN"; + columns = <1>; + rows = <0>; - input-gpios - = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + events = <>; }; }; From f743d57ff1d4d68f51fb11b99fc0217eeca42919 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 10 Jul 2023 22:44:44 -0700 Subject: [PATCH 284/289] feat(shields): Add splitkb.com Aurora Sofle * Add new shield for splitkb.com Aurora Sofle, supporting keys, encoder(s), displays, and RGB. Co-authored-by: Cem Aksoylar --- .../splitkb_aurora_sofle/Kconfig.defconfig | 53 +++++++++++++ .../splitkb_aurora_sofle/Kconfig.shield | 8 ++ .../boards/nice_nano.overlay | 46 +++++++++++ .../boards/nice_nano_v2.overlay | 46 +++++++++++ .../splitkb_aurora_sofle.conf | 9 +++ .../splitkb_aurora_sofle.dtsi | 79 +++++++++++++++++++ .../splitkb_aurora_sofle.keymap | 78 ++++++++++++++++++ .../splitkb_aurora_sofle.zmk.yml | 15 ++++ .../splitkb_aurora_sofle_left.overlay | 43 ++++++++++ .../splitkb_aurora_sofle_right.overlay | 45 +++++++++++ 10 files changed, 422 insertions(+) create mode 100644 app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig create mode 100644 app/boards/shields/splitkb_aurora_sofle/Kconfig.shield create mode 100644 app/boards/shields/splitkb_aurora_sofle/boards/nice_nano.overlay create mode 100644 app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.conf create mode 100644 app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.dtsi create mode 100644 app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap create mode 100644 app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.zmk.yml create mode 100644 app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_left.overlay create mode 100644 app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_right.overlay diff --git a/app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig new file mode 100644 index 00000000..b53c4c8d --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig @@ -0,0 +1,53 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_SPLITKB_AURORA_SOFLE_LEFT + +config ZMK_KEYBOARD_NAME + default "Aurora Sofle" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif # SHIELD_SPLITKB_AURORA_SOFLE_LEFT + +if SHIELD_SPLITKB_AURORA_SOFLE_LEFT || SHIELD_SPLITKB_AURORA_SOFLE_RIGHT + +config ZMK_SPLIT + default y + +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + +if ZMK_DISPLAY + +config SSD1306 + default y + +config I2C + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LV_Z_VDB_SIZE + default 64 + +config LV_DPI_DEF + default 148 + +config LV_Z_BITS_PER_PIXEL + default 1 + +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif # SHIELD_SPLITKB_AURORA_SOFLE_LEFT || SHIELD_SPLITKB_AURORA_SOFLE_RIGHT diff --git a/app/boards/shields/splitkb_aurora_sofle/Kconfig.shield b/app/boards/shields/splitkb_aurora_sofle/Kconfig.shield new file mode 100644 index 00000000..c72e95d9 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/Kconfig.shield @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_SPLITKB_AURORA_SOFLE_LEFT + def_bool $(shields_list_contains,splitkb_aurora_sofle_left) + +config SHIELD_SPLITKB_AURORA_SOFLE_RIGHT + def_bool $(shields_list_contains,splitkb_aurora_sofle_right) diff --git a/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano.overlay new file mode 100644 index 00000000..8f1629ce --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano.overlay @@ -0,0 +1,46 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..8f1629ce --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_v2.overlay @@ -0,0 +1,46 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.conf b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.conf new file mode 100644 index 00000000..d456100a --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.conf @@ -0,0 +1,9 @@ +# Uncomment these two line to add support for encoders to your firmware +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment the following lines to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.dtsi b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.dtsi new file mode 100644 index 00000000..798cd84e --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.dtsi @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; +// | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | +// | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | +// | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | +// | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | +// | SW30 | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | SW30 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) + >; + }; + + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "L_ENCODER"; + steps = <144>; + status = "disabled"; + + a-gpios = <&pro_micro 16 GPIO_PULL_UP>; + b-gpios = <&pro_micro 10 GPIO_PULL_UP>; + }; + + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "R_ENCODER"; + steps = <144>; + status = "disabled"; + + a-gpios = <&pro_micro 16 GPIO_PULL_UP>; + b-gpios = <&pro_micro 10 GPIO_PULL_UP>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <36>; + }; +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap new file mode 100644 index 00000000..23127416 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +/* Uncomment this block if using RGB +&led_strip { + chain-length = <6>; + // chain-length = <35>; // Uncomment if using both per-key and underglow LEDs + // chain-length = <29>; // Uncomment if using only per-key LEDs. +}; + */ + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { +// ------------------------------------------------------------------------------------------------------------ +// | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | +// | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | +// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | +// | SHIFT | Z | X | C | V | B | "[" | | "]" | N | M | , | . | / | SHIFT | +// |CTRL | ALT | GUI | LOWER| SPACE | | ENTER | RAISE| BSPC | GUI | RALT | + bindings = < +&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp GRAVE +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS +&kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp BSPC &kp RGUI &kp RALT + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + lower_layer { +// ------------------------------------------------------------------------------------------------------------ +// | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | +// | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | +// | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | ~ | +// | | | | | | | | | | | _ | + | { | } | "|" | +// | | | | | | | | | | | | + bindings = < +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans +&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 +&kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &kp TILDE +&trans &ext_power EP_ON &ext_power EP_OFF &ext_power EP_TOG &trans &trans &trans &trans &trans &kp MINUS &kp PLUS &kp LBRC &kp RBRC &kp PIPE + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + raise_layer { +// ------------------------------------------------------------------------------------------------------------ +// | | | | | | | | | | | | | | +// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | +// | F1 | F2 | F3 | F4 | F5 | F6 | | | <- | v | ^ | -> | | +// | F7 | F8 | F9 | F10 | F11 | F12 | | | | + | - | = | [ | ] | \ | +// | | | | | | | | | | | | + bindings = < +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans +&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans +&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans +&kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &kp KP_PLUS &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.zmk.yml b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.zmk.yml new file mode 100644 index 00000000..d832d3e1 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: splitkb_aurora_sofle +name: splitkb.com Aurora Sofle +type: shield +url: https://splitkb.com/products/aurora-sofle-pcb-kit +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display + - encoder + - underglow +siblings: + - splitkb_aurora_sofle_left + - splitkb_aurora_sofle_right diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_left.overlay b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_left.overlay new file mode 100644 index 00000000..1adaf401 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_left.overlay @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_sofle.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "col2row"; + + row-gpios + = <&pro_micro 20 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 19 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + ; + }; +}; + +&left_encoder { + status = "okay"; +}; + + diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_right.overlay b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_right.overlay new file mode 100644 index 00000000..3249b941 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_right.overlay @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_sofle.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "col2row"; + + row-gpios + = <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 19 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 20 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + + col-gpios + = <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + ; + }; +}; + +&right_encoder { + status = "okay"; +}; + +&default_transform { + col-offset = <6>; +}; From 9a963abfc8b27c6fdfb5b6b4b38e5905d6a360a7 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Mon, 17 Jul 2023 17:16:04 -0400 Subject: [PATCH 285/289] refactor: use low priority workqueue for underglow and battery reporting Blocking operations on the high priority system workqueue may result in deadlocks, particularly when Bluetooth is in use. --- app/CMakeLists.txt | 1 + app/Kconfig | 8 ++++++++ app/include/zmk/workqueue.h | 1 + app/src/battery.c | 14 +++++--------- app/src/rgb_underglow.c | 3 ++- app/src/workqueue.c | 27 +++++++++++++++++++++++++++ 6 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 app/include/zmk/workqueue.h create mode 100644 app/src/workqueue.c diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 4c1c63c2..efa34905 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -87,6 +87,7 @@ target_sources_ifdef(CONFIG_USB_DEVICE_STACK app PRIVATE src/usb.c) target_sources_ifdef(CONFIG_ZMK_USB app PRIVATE src/usb_hid.c) target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW app PRIVATE src/rgb_underglow.c) target_sources_ifdef(CONFIG_ZMK_BACKLIGHT app PRIVATE src/backlight.c) +target_sources(app PRIVATE src/workqueue.c) target_sources(app PRIVATE src/main.c) add_subdirectory(src/display/) diff --git a/app/Kconfig b/app/Kconfig index fe019918..89a128b5 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -504,6 +504,14 @@ config ZMK_BATTERY_REPORT_INTERVAL int "Battery level report interval in seconds" default 60 +config ZMK_LOW_PRIORITY_THREAD_STACK_SIZE + int "Low priority thread stack size" + default 768 + +config ZMK_LOW_PRIORITY_THREAD_PRIORITY + int "Low priority thread priority" + default 10 + #Advanced endmenu diff --git a/app/include/zmk/workqueue.h b/app/include/zmk/workqueue.h new file mode 100644 index 00000000..41e94580 --- /dev/null +++ b/app/include/zmk/workqueue.h @@ -0,0 +1 @@ +struct k_work_q *zmk_workqueue_lowprio_work_q(); diff --git a/app/src/battery.c b/app/src/battery.c index 540f7c3e..87a25e08 100644 --- a/app/src/battery.c +++ b/app/src/battery.c @@ -18,6 +18,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include +#include static uint8_t last_state_of_charge = 0; @@ -77,7 +78,9 @@ static void zmk_battery_work(struct k_work *work) { K_WORK_DEFINE(battery_work, zmk_battery_work); -static void zmk_battery_timer(struct k_timer *timer) { k_work_submit(&battery_work); } +static void zmk_battery_timer(struct k_timer *timer) { + k_work_submit_to_queue(zmk_workqueue_lowprio_work_q(), &battery_work); +} K_TIMER_DEFINE(battery_timer, zmk_battery_timer, NULL); @@ -97,14 +100,7 @@ static int zmk_battery_init(const struct device *_arg) { return -ENODEV; } - int rc = zmk_battery_update(battery); - - if (rc != 0) { - LOG_DBG("Failed to update battery value: %d.", rc); - return rc; - } - - k_timer_start(&battery_timer, K_MINUTES(1), K_SECONDS(CONFIG_ZMK_BATTERY_REPORT_INTERVAL)); + k_timer_start(&battery_timer, K_NO_WAIT, K_SECONDS(CONFIG_ZMK_BATTERY_REPORT_INTERVAL)); return 0; } diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 7b649174..08ba2fb2 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -24,6 +24,7 @@ #include #include #include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -203,7 +204,7 @@ static void zmk_rgb_underglow_tick_handler(struct k_timer *timer) { return; } - k_work_submit(&underglow_work); + k_work_submit_to_queue(zmk_workqueue_lowprio_work_q(), &underglow_work); } K_TIMER_DEFINE(underglow_tick, zmk_rgb_underglow_tick_handler, NULL); diff --git a/app/src/workqueue.c b/app/src/workqueue.c new file mode 100644 index 00000000..a9a8bce5 --- /dev/null +++ b/app/src/workqueue.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include + +#include + +K_THREAD_STACK_DEFINE(lowprio_q_stack, CONFIG_ZMK_LOW_PRIORITY_THREAD_STACK_SIZE); + +static struct k_work_q lowprio_work_q; + +struct k_work_q *zmk_workqueue_lowprio_work_q() { + return &lowprio_work_q; +} + +static int workqueue_init() { + static const struct k_work_queue_config queue_config = {.name = "Low Priority Work Queue"}; + k_work_queue_start(&lowprio_work_q, lowprio_q_stack, K_THREAD_STACK_SIZEOF(lowprio_q_stack), + CONFIG_ZMK_LOW_PRIORITY_THREAD_PRIORITY, &queue_config); + return 0; +} + +SYS_INIT(workqueue_init, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); From cb9c573b534dcb52ee8cf6b2cec6cb880e841301 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Mon, 17 Jul 2023 17:32:14 -0400 Subject: [PATCH 286/289] refactor(underglow): turn underglow off in low priority work queue --- app/src/rgb_underglow.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 08ba2fb2..b80d4039 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -197,14 +197,14 @@ static void zmk_rgb_underglow_tick(struct k_work *work) { } } -K_WORK_DEFINE(underglow_work, zmk_rgb_underglow_tick); +K_WORK_DEFINE(underglow_tick_work, zmk_rgb_underglow_tick); static void zmk_rgb_underglow_tick_handler(struct k_timer *timer) { if (!state.on) { return; } - k_work_submit_to_queue(zmk_workqueue_lowprio_work_q(), &underglow_work); + k_work_submit_to_queue(zmk_workqueue_lowprio_work_q(), &underglow_tick_work); } K_TIMER_DEFINE(underglow_tick, zmk_rgb_underglow_tick_handler, NULL); @@ -323,6 +323,16 @@ int zmk_rgb_underglow_on() { return zmk_rgb_underglow_save_state(); } +static void zmk_rgb_underglow_off_handler(struct k_work *work) { + for (int i = 0; i < STRIP_NUM_PIXELS; i++) { + pixels[i] = (struct led_rgb){r : 0, g : 0, b : 0}; + } + + led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); +} + +K_WORK_DEFINE(underglow_off_work, zmk_rgb_underglow_off_handler); + int zmk_rgb_underglow_off() { if (!led_strip) return -ENODEV; @@ -336,11 +346,7 @@ int zmk_rgb_underglow_off() { } #endif - for (int i = 0; i < STRIP_NUM_PIXELS; i++) { - pixels[i] = (struct led_rgb){r : 0, g : 0, b : 0}; - } - - led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); + k_work_submit_to_queue(zmk_workqueue_lowprio_work_q(), &underglow_off_work); k_timer_stop(&underglow_tick); state.on = false; From e65a7e3075a7a153ea478d4fd293ae65b31e33ed Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Thu, 20 Jul 2023 16:48:02 -0400 Subject: [PATCH 287/289] fix(battery): change nRF52 ADC gain With ADC pin, maximum 3.6V input needs gain 1/6 to be less than the 0.6V reference. With VDDHDIV5, maximum 6V input corresponds to 1.2V so gain 1/2 will be less than the 0.6V reference and be slightly more precise. --- app/drivers/sensor/battery/battery_nrf_vddh.c | 2 +- app/drivers/sensor/battery/battery_voltage_divider.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/drivers/sensor/battery/battery_nrf_vddh.c b/app/drivers/sensor/battery/battery_nrf_vddh.c index 3f230812..32c7c61e 100644 --- a/app/drivers/sensor/battery/battery_nrf_vddh.c +++ b/app/drivers/sensor/battery/battery_nrf_vddh.c @@ -93,7 +93,7 @@ static int vddh_init(const struct device *dev) { #ifdef CONFIG_ADC_NRFX_SAADC drv_data->acc = (struct adc_channel_cfg){ - .gain = ADC_GAIN_1_5, + .gain = ADC_GAIN_1_2, .reference = ADC_REF_INTERNAL, .acquisition_time = ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 40), .input_positive = SAADC_CH_PSELN_PSELN_VDDHDIV5, diff --git a/app/drivers/sensor/battery/battery_voltage_divider.c b/app/drivers/sensor/battery/battery_voltage_divider.c index 655af3db..62a02e9c 100644 --- a/app/drivers/sensor/battery/battery_voltage_divider.c +++ b/app/drivers/sensor/battery/battery_voltage_divider.c @@ -140,7 +140,7 @@ static int bvd_init(const struct device *dev) { #ifdef CONFIG_ADC_NRFX_SAADC drv_data->acc = (struct adc_channel_cfg){ - .gain = ADC_GAIN_1_5, + .gain = ADC_GAIN_1_6, .reference = ADC_REF_INTERNAL, .acquisition_time = ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 40), .input_positive = SAADC_CH_PSELP_PSELP_AnalogInput0 + drv_cfg->io_channel.channel, From d17c473d45b3bd01d80b8a5eab417986be0281da Mon Sep 17 00:00:00 2001 From: Jorge Villalobos Date: Wed, 2 Aug 2023 12:57:00 -0400 Subject: [PATCH 288/289] feat(docs): Improve parameterized macros docs --- docs/docs/behaviors/macros.md | 150 +++++++++++++++++++++++----------- docs/docs/config/behaviors.md | 37 +++++---- 2 files changed, 122 insertions(+), 65 deletions(-) diff --git a/docs/docs/behaviors/macros.md b/docs/docs/behaviors/macros.md index 279d1356..0757e735 100644 --- a/docs/docs/behaviors/macros.md +++ b/docs/docs/behaviors/macros.md @@ -49,22 +49,6 @@ For use cases involving sending a single keycode with modifiers, for instance ct with [modifier functions](../codes/modifiers.mdx#modifier-functions) can be used instead of a macro. ::: -### Parameterized Macros - -Macros can also be "parameterized", allowing them to be bound in your keymap with unique values passed into them, e.g.: - -``` - raise_layer { - bindings = <&my_cool_macro A> - }; -``` - -When defining a parameterized macro, a different `compatible` value will be used depending on how many parameters are passed into it: - -- `zmk,behavior-macro` - a macro that takes no parameters. -- `zmk,behavior-macro-one-param` - a macro that takes one parameter when used. -- `zmk,behavior-macro-two-param` - a macro that takes two parameters when used. - ### Bindings Like [hold-taps](/docs/behaviors/hold-tap), macros are created by composing other behaviors, and any of those behaviors can @@ -83,30 +67,6 @@ bindings There are a set of special macro controls that can be included in the `bindings` list to modify the way the macro is processed. -### Parameters - -When creating a macro that takes parameter(s), there are macro controls that change when the parameters passed to the macro are used -within the macro itself. All of the controls are "one shot" and will change how the passed in parameters are used for the very next non-macro control behavior in the `bindings` list of the macro. - -For example, to pass the first parameter from the macro into a `&kp` used in the macro, you would use: - -``` -bindings - = <¯o_param_1to1> - , <&kp MACRO_PLACEHOLDER> - ; -``` - -Because `kp` takes one parameter, you can't simply make the second entry `<&kp>` in the `bindings` list. Whatever value you do pass in will be replaced when the macro is triggered, so you can put _any_ value there, e.g. `0`, `A` keycode, etc. To make it very obvious that the parameter there is not actually going to be used, you can use `MACRO_PLACEHOLDER` which is simply an alias for `0`. - -The available parameter controls are: - -- `¯o_param_1to1` - pass the first parameter of the macro into the first parameter of the next behavior in the `bindings` list. -- `¯o_param_1to2` - pass the first parameter of the macro into the second parameter of the next behavior in the `bindings` list. - -* `¯o_param_2to1` - pass the second parameter of the macro into the first parameter of the next behavior in the `bindings` list. -* `¯o_param_2to2` - pass the second parameter of the macro into the second parameter of the next behavior in the `bindings` list. - ### Binding Activation Mode Bindings in a macro are activated differently, depending on the current "activation mode" of the macro. @@ -185,6 +145,70 @@ Macros use an internal queue to invoke each behavior in the bindings list when t To prevent issues with longer macros, you can change the size of this queue via the `CONFIG_ZMK_BEHAVIORS_QUEUE_SIZE` setting in your configuration, [typically through your `.conf` file](../config/index.md). For example, `CONFIG_ZMK_BEHAVIORS_QUEUE_SIZE=512` would allow your macro to type about 256 characters. +## Parameterized Macros + +Macros can also be "parameterized", allowing them to be bound in your keymap with unique values passed into them, e.g.: + +``` + raise_layer { + bindings = <&my_one_param_macro A> + }; +``` + +### Defining Parameterized Macros + +Parameterized macros must be defined using specific values for the `compatible` and `#binding-cells` properties, depending on how many parameters they require (up to a maximum of two): + +```dts +/ { + macros { + // 0 params macro + my_macro: my_macro { + // ... + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; // Must be 0 + bindings = /* ... */; + }; + + // 1 param macro + my_one_param_macro: my_one_param_macro { + // ... + compatible = "zmk,behavior-macro-one-param"; + #binding-cells = <1>; // Must be 1 + bindings = /* ... */; + }; + + // 2 params macro + my_two_param_macro: my_two_param_macro { + // ... + compatible = "zmk,behavior-macro-two-param"; + #binding-cells = <2>; // Must be 2 + bindings = /* ... */; + }; + }; +}; +``` + +### Parameters, Bindings and Controls + +There are special macro controls which must be used in order to forward received parameters to the macro's `bindings`. These controls are "one shot" and will determine how received parameters are used on the very next (non-macro control) behavior in the macro's `bindings` list. + +For example, to pass the first parameter received into a `&kp` binding, you would use: + +```dts +bindings = <¯o_param_1to1>, <&kp MACRO_PLACEHOLDER>; +``` + +Because `kp` takes one parameter, you can't simply make the second entry `<&kp>` in the `bindings` list. Whatever value you do pass in will be replaced when the macro is triggered, so you can put _any_ value there, e.g. `0`, `A` keycode, etc. To make it very obvious that the parameter there is not actually going to be used, you can use `MACRO_PLACEHOLDER` which is simply an alias for `0`. + +The available parameter controls are: + +- `¯o_param_1to1` - pass the first parameter of the macro into the first parameter of the next behavior in the `bindings` list. +- `¯o_param_1to2` - pass the first parameter of the macro into the second parameter of the next behavior in the `bindings` list. + +* `¯o_param_2to1` - pass the second parameter of the macro into the first parameter of the next behavior in the `bindings` list. +* `¯o_param_2to2` - pass the second parameter of the macro into the second parameter of the next behavior in the `bindings` list. + ## Common Patterns Below are some examples of how the macro behavior can be used for various useful functionality. @@ -198,12 +222,36 @@ To achieve this, a combination of a 0ms wait time and splitting the press and re #### Layer + Modifier -``` -wait-ms = <0>; -bindings - = <¯o_press &mo 1 &kp LSHFT> - , <¯o_pause_for_release> - , <¯o_release &mo 1 &kp LSHFT>; +```dts +/** + * Temporarily switches to a layer (`&mo`) while a modifier is held. + * Analogous to QMK's `LM()`, using a parameterized macro. + * + * Params: + * 1. Layer to switch to + * 2. Modifier to press while layer is active + * + * Example: + * `&lm NUM_LAYER LSHIFT` + */ +lm: lm { + label = "LAYER_MOD"; + compatible = "zmk,behavior-macro-two-param"; + wait-ms = <0>; + tap-ms = <0>; + #binding-cells = <2>; + bindings + = <¯o_param_1to1> + , <¯o_press &mo MACRO_PLACEHOLDER> + , <¯o_param_2to1> + , <¯o_press &kp MACRO_PLACEHOLDER> + , <¯o_pause_for_release> + , <¯o_param_2to1> + , <¯o_release &kp MACRO_PLACEHOLDER> + , <¯o_param_1to1> + , <¯o_release &mo MACRO_PLACEHOLDER> + ; +}; ``` #### Layer + Underglow Color @@ -252,20 +300,24 @@ bindings ## Convenience C Macro -To avoid repetition or possible typos when declaring a macro, a convenience _C_ macro, named `ZMK_MACRO(name, props)` can be used to simplify things: +To avoid repetition or possible typos when declaring a **zero parameter macro**, a convenience _C_ macro, named `ZMK_MACRO(name, props)` can be used to simplify things: ``` - ZMK_MACRO(my_macro, + ZMK_MACRO(my_zero_param_macro, wait-ms = <30>; tap-ms = <40>; bindings = <&kp Z &kp M &kp K>; ) ``` +:::note +`ZMK_MACRO()` **only supports declaring non-parameterized (zero parameter) macros**; parameterized declarations are not currently supported. +::: + This can be used instead of a complete macro definition. During the firmware build process, the example above would produce the complete macro definition below: ``` - my_macro: my_macro { + my_zero_param_macro: my_zero_param_macro { compatible = "zmk,behavior-macro"; label = "ZM_my_macro"; #binding-cells = <0>; diff --git a/docs/docs/config/behaviors.md b/docs/docs/config/behaviors.md index 2ff99d58..60e8b72a 100644 --- a/docs/docs/config/behaviors.md +++ b/docs/docs/config/behaviors.md @@ -131,26 +131,31 @@ See the [macro behavior](../behaviors/macros.md) documentation for more details Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-macro.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-macro.yaml) -Applies to: `compatible = "zmk,behavior-macro"` +| Property | Type | Description | Default | +| ---------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | +| `label` | string | Unique label for the node | | +| `compatible` | string | Macro type, **must be _one_ of**:
• `"zmk,behavior-macro"`
• `"zmk,behavior-macro-one-param"`
• `"zmk,behavior-macro-two-param"` | | +| `#binding-cells` | int | Number of params accepted (depends on `compatible` property), **must be _one_ of**:
• `<0>`
• `<1>`
• `<2>` | | +| `bindings` | phandle array | List of behaviors to trigger | | +| `wait-ms` | int | The default time to wait (in milliseconds) before triggering the next behavior. | `CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS` | +| `tap-ms` | int | The default time to wait (in milliseconds) between the press and release events of a tapped behavior. | `CONFIG_ZMK_MACRO_DEFAULT_TAP_MS` | -| Property | Type | Description | Default | -| ---------------- | ------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------- | -| `label` | string | Unique label for the node | | -| `#binding-cells` | int | Must be `<0>` | | -| `bindings` | phandle array | List of behaviors to trigger | | -| `wait-ms` | int | The default time to wait (in milliseconds) before triggering the next behavior. | `CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS` | -| `tap-ms` | int | The default time to wait (in milliseconds) between the press and release events of a tapped behavior. | `CONFIG_ZMK_MACRO_DEFAULT_TAP_MS` | +### Macro Control Behaviors The following macro-specific behaviors can be added at any point in the `bindings` list to change how the macro triggers subsequent behaviors. -| Behavior | Description | -| -------------------------- | ----------------------------------------------------------------------------------------------------- | -| `¯o_tap` | Switches to tap mode | -| `¯o_press` | Switches to press mode | -| `¯o_release` | Switches to release mode | -| `¯o_pause_for_release` | Pauses the macro until the macro key itself is released | -| `¯o_wait_time TIME` | Changes the time to wait (in milliseconds) before triggering the next behavior. | -| `¯o_tap_time TIME` | Changes the time to wait (in milliseconds) between the press and release events of a tapped behavior. | +| Behavior | Description | +| -------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `¯o_tap` | Switches to tap mode | +| `¯o_press` | Switches to press mode | +| `¯o_release` | Switches to release mode | +| `¯o_pause_for_release` | Pauses the macro until the macro key itself is released | +| `¯o_wait_time TIME` | Changes the time to wait (in milliseconds) before triggering the next behavior. | +| `¯o_tap_time TIME` | Changes the time to wait (in milliseconds) between the press and release events of a tapped behavior. | +| `¯o_param_1to1` | Forward the first parameter received by the macro to the first parameter of the next (non-macro control) behavior. | +| `¯o_param_1to2` | Forward the first parameter received by the macro to the second parameter of the next (non-macro control) behavior. | +| `¯o_param_2to1` | Forward the second parameter received by the macro to the first parameter of the next (non-macro control) behavior. | +| `¯o_param_2to2` | Forward the second parameter received by the macro to the second parameter of the next (non-macro control) behavior. | ## Mod-Morph From c957348e6187ffde3c073e8c367a60a7ee16b12c Mon Sep 17 00:00:00 2001 From: Seth Milliken Date: Tue, 8 Aug 2023 15:12:46 -0700 Subject: [PATCH 289/289] fix(docs): detail overriding the `led_strip` `chain-length` property Quite a few people have struggled with setting the correct `chain-length` for their `led_strip`. For some, this is their first time needing to change a pre-defined devicetree property, and so they aren't familiar with the technique. I commonly see folks adding a duplicate of the entire `*.overlay` file with only the `chain-length` value changed. Having clear documentation for this specific application of the property override technique could help forestall these problems, and give those of us helping out in Discord something to easily reference. --- docs/docs/features/underglow.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index 00d3aa0a..2b1400fc 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -39,6 +39,20 @@ use Kconfig. If your board or shield does not have RGB underglow configured, refer to [Adding RGB Underglow to a Board](#adding-rgb-underglow-to-a-board). +### Modifying the number of LEDs + +A common issue when enabling underglow is that some of the installed LEDs do not illuminate. This can happen when a board's default underglow configuration accounts only for either the downward facing LEDs or the upward facing LEDs under each key. On a split keyboard, a good sign that this may be the problem is that the unilluminated LEDs on each half are symmetrical. + +The number of underglow LEDs is controlled by the `chain-length` property in the `led_strip` node. You can [change the value of this property](../config/index.md#changing-devicetree-properties) in the `.keymap` file by adding a stanza like this one outside of any other node (i.e. above or below the `/` node): + +``` +&led_strip { + chain-length = <21>; +}; +``` + +where the value is the total count of LEDs (per half, for split keyboards). + ## Configuring RGB Underglow See [RGB underglow configuration](/docs/config/underglow).