intermediate checkin
parent
9bb6198878
commit
f70568c1c0
|
@ -42,8 +42,6 @@ typedef struct {
|
|||
uint16_t release_value;
|
||||
} kb__key_t;
|
||||
|
||||
typedef const kb__key_t * const PROGMEM kb__key_pointer_t
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// controller
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2013 Ben Blazak <benblazak.dev@gmail.com>
|
||||
* Released under The MIT License (see "license.md")
|
||||
* Project located at <https://github.com/benblazak/ergodox-firmware>
|
||||
* ------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* - description: |
|
||||
* A place for all things common to the other default files, including
|
||||
* `#include`s. Other code (especially functions defined in this directory)
|
||||
* may break if you change things defined here, so be careful if you do.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__COMMON_H
|
||||
#define ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__COMMON_H
|
||||
// ----------------------------------------------------------------------------
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <avr/eeprom.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include "../../../../../firmware/keyboard.h"
|
||||
#include "../../../../../firmware/lib/layout/key-functions.h"
|
||||
#include "../../../../../firmware/lib/usb/usage-page/keyboard.h"
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
typedef const kb__key_t * const PROGMEM key_t
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// ----------------------------------------------------------------------------
|
||||
#endif // ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__COMMON_H
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2013 Ben Blazak <benblazak.dev@gmail.com>
|
||||
* Released under The MIT License (see "license.md")
|
||||
* Project located at <https://github.com/benblazak/ergodox-firmware>
|
||||
* ------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* - description: |
|
||||
* A default way to execute keys. Meant to be included by the layout using
|
||||
* it (and nowhere else, since it's actual code).
|
||||
*
|
||||
* Note: This oddish setup is used to allow layouts to easily change some
|
||||
* default things without having to deal with all of them.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__EXEC_KEY_C_H
|
||||
#define ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__EXEC_KEY_C_H
|
||||
// ----------------------------------------------------------------------------
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "./common.h"
|
||||
|
||||
extern key_t layout[][KB__ROWS][KB__COLUMNS];
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void kb__layout__exec_key( bool pressed,
|
||||
int8_t layer,
|
||||
int8_t row,
|
||||
int8_t column ) {
|
||||
// TODO
|
||||
// - check for key redefinition in the EEPROM
|
||||
// - if there is one, execute it, according to the appropriate rules
|
||||
// - lookup key in PROGMEM
|
||||
// - if it's transparent, look up the one below it, and so on
|
||||
// - NULL key pointers are transparent
|
||||
// - { NULL, 0, NULL, 0 } keys do nothing; this is the default, if no
|
||||
// key can be found
|
||||
// - call the press or release function, with the appropriate argument
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// ----------------------------------------------------------------------------
|
||||
#endif // ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__EXEC_KEY_C_H
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2013 Ben Blazak <benblazak.dev@gmail.com>
|
||||
* Released under The MIT License (see "license.md")
|
||||
* Project located at <https://github.com/benblazak/ergodox-firmware>
|
||||
* ------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* - description: |
|
||||
* Extended (from the definitions in ".../lib/layout/keys.h") default key
|
||||
* definitions. Feel free not to use them, if they're not convenient.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__KEYS_H
|
||||
#define ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__KEYS_H
|
||||
// ----------------------------------------------------------------------------
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "./common.h"
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// `keys__` macros (needed by ".../lib/layout/keys.h")
|
||||
|
||||
#define KEYS__DEFAULT(name, value) \
|
||||
key_t name = { \
|
||||
.press_function = &kf__press, \
|
||||
.press_value = value, \
|
||||
.release_function = &kf__release, \
|
||||
.release_value = value, \
|
||||
}
|
||||
|
||||
#define KEYS__SHIFTED(name, value) \
|
||||
const uint16_t PROGMEM name##__press[] = { \
|
||||
2, &kf__press, KEY__LeftShift, \
|
||||
&kf__press, value }; \
|
||||
const uint16_t PROGMEM name##__release[] = { \
|
||||
2, &kf__release, KEY__LeftShift, \
|
||||
&kf__release, value }; \
|
||||
key_t name = { &kf__macro__progmem, &name##__press, \
|
||||
&kf__macro__progmem, &name##__release }
|
||||
|
||||
|
||||
// default key definitions
|
||||
#include "../../../../firmware/lib/layout/keys.h"
|
||||
|
||||
|
||||
// other `keys__` macros (in the `keys__` namespace for consistency)
|
||||
|
||||
#define KEYS__TWO_KEYS_CAPSLOCK_PRESS_RELEASE(name, value) \
|
||||
const uint16_t PROGMEM name##__press[] = { \
|
||||
2, &kf__two_keys_capslock, 1, \
|
||||
&kf__press, value }; \
|
||||
const uint16_t PROGMEM name##__release[] = { \
|
||||
2, &kf__two_keys_capslock, 0, \
|
||||
&kf__release, value }; \
|
||||
key_t name = { &kf__macro__progmem, &name##__press, \
|
||||
&kf__macro__progmem, &name##release }
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// special meaning
|
||||
|
||||
key_t Transp = NULL; // transparent
|
||||
key_t NA = { NULL, 0, NULL, 0 }; // do nothing
|
||||
|
||||
|
||||
// special keycode
|
||||
|
||||
KEYS__DEFAULT( Power, KEY__Power );
|
||||
KEYS__DEFAULT( VolumeU, KEY__VolumeUp );
|
||||
KEYS__DEFAULT( VolumeD, KEY__VolumeDown );
|
||||
KEYS__DEFAULT( Mute, KEY__Mute );
|
||||
|
||||
|
||||
// special function
|
||||
|
||||
// --- Sh2KCapL
|
||||
KEYS__TWO_KEYS_CAPSLOCK_PRESS_RELEASE( Sh2KCapL, KEY__LeftShift );
|
||||
|
||||
// --- Sh2KCapR
|
||||
KEYS__TWO_KEYS_CAPSLOCK_PRESS_RELEASE( Sh2KCapR, KEY__RightShift );
|
||||
|
||||
// --- Btldr
|
||||
key_t Btldr = { &kf__jump_to_bootloader, 0, NULL, 0 };
|
||||
|
||||
// --- NumPush
|
||||
const uint16_t PROGMEM NumPush__press[] = {
|
||||
2, &kf__layer__push, 0x0203,
|
||||
&kf__press, KEY__LockingNumLock };
|
||||
key_t NumPush = { &kf__macro__progmem, &NumPush__press,
|
||||
&kf__release, KEY__LockingNumLock };
|
||||
|
||||
// --- NumPop
|
||||
const uint16_t PROGMEM NumPop__press[] = {
|
||||
2, &kf__layer__pop, 0x02,
|
||||
&kf__press, KEY__LockingNumLock };
|
||||
key_t NumPop = { &kf__macro__progmem, &NumPop__press,
|
||||
&kf__release, KEY__LockingNumLock };
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// ----------------------------------------------------------------------------
|
||||
#endif // ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__KEYS_H
|
||||
|
|
@ -6,7 +6,8 @@
|
|||
|
||||
/**
|
||||
* - description: |
|
||||
* A QWERTY layout adapted from the default Kinesis layout.
|
||||
* A QWERTY layout adapted from the default Kinesis layout. The position of
|
||||
* the symbol keys on the function layer was taken from the Arensito layout.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -18,72 +19,61 @@
|
|||
#include "../../../../firmware/keyboard/ergodox/matrix.h"
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// matrix control
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#include "./default/exec_key.c.h"
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// LED control
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void kb__led__logical_on(char led) {
|
||||
switch led {
|
||||
case 'N': kb__led__on(1); break; // numlock
|
||||
case 'C': kb__led__on(2); break; // capslock
|
||||
case 'S': kb__led__on(3); break; // scroll lock
|
||||
case 'O': break; // compose
|
||||
case 'K': break; // kana
|
||||
};
|
||||
}
|
||||
|
||||
void kb__led__logical_off(char led) {
|
||||
switch led {
|
||||
case 'N': kb__led__off(1); break; // numlock
|
||||
case 'C': kb__led__off(2); break; // capslock
|
||||
case 'S': kb__led__off(3); break; // scroll lock
|
||||
case 'O': break; // compose
|
||||
case 'K': break; // kana
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// keys
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#include "./default/keys.h"
|
||||
|
||||
// layer
|
||||
key_t L0pu1 = { &kf__layer__push, 0x0001, NULL, 0 };
|
||||
key_t L0po = { &kf__layer__pop, 0x00, NULL, 0 };
|
||||
key_t L0pu1po = { &kf__layer__push, 0x0001, &kf__layer__pop, 0x00 };
|
||||
key_t L1pu2po = { &kf__layer__push, 0x0102, &kf__layer__pop, 0x01 };
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// layout
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#define KEY_T const kb__key_t * const PROGMEM
|
||||
|
||||
// needed by ".../lib/layout/keys.h"
|
||||
#define KEYS__DEFAULT(name, value) \
|
||||
KEY_T name = { \
|
||||
.press_function = &kf__press, \
|
||||
.press_value = value, \
|
||||
.release_function = &kf__release, \
|
||||
.release_value = value, \
|
||||
}
|
||||
|
||||
// needed by ".../lib/layout/keys.h"
|
||||
#define KEYS__SHIFTED(name, value) \
|
||||
const uint16_t PROGMEM name##__press[] = { 2, \
|
||||
&kf__press, KEY__LeftShift, \
|
||||
&kf__press, value }; \
|
||||
const uint16_t PROGMEM name##__release[] = { 2, \
|
||||
&kf__release, KEY__LeftShift, \
|
||||
&kf__release, value }; \
|
||||
KEY_T name = { &kf__macro, &name##__press, \
|
||||
&kf__macro, &name##__release }
|
||||
key_t layout[][KB__ROWS][KB__COLUMNS] = {
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// TODO
|
||||
// - finish transcribing layout
|
||||
|
||||
// include default key definitions
|
||||
#include "../../../../firmware/lib/layout/keys.h"
|
||||
|
||||
// special meaning
|
||||
KEY_T Transp = NULL; // transparent
|
||||
KEY_T NA = { NULL, 0, NULL, 0 }; // do nothing
|
||||
// special keycode
|
||||
KEYS__DEFAULT( Power, KEY__Power );
|
||||
KEYS__DEFAULT( VolumeU, KEY__VolumeUp );
|
||||
KEYS__DEFAULT( VolumeD, KEY__VolumeDown );
|
||||
KEYS__DEFAULT( Mute, KEY__Mute );
|
||||
// special function
|
||||
#define TWO_KEYS_CAPSLOCK kf__two_keys_capslock_press_release
|
||||
KEY_T Sh2KCapL = { &TWO_KEYS_CAPSLOCK, (1<<8)|KEY__LeftShift,
|
||||
&TWO_KEYS_CAPSLOCK, (0<<8)|KEY__LeftShift };
|
||||
KEY_T Sh2KCapR = { &TWO_KEYS_CAPSLOCK, (1<<8)|KEY__RightShift,
|
||||
&TWO_KEYS_CAPSLOCK, (0<<8)|KEY__RightShift };
|
||||
#undef TWO_KEYS_CAPSLOCK
|
||||
KEY_T Btldr = { &kf__jump_to_bootloader, 0, NULL, 0 };
|
||||
// TODO
|
||||
KEY_T NumPush = { &kf__layer__push, 0x23, NULL, 0 };
|
||||
KEY_T NumPop = { &kf__layer__pop, 0x2, NULL, 0 };
|
||||
// /TODO
|
||||
// layer
|
||||
KEY_T L0pu1 = { &kf__layer__push, 0x01, NULL, 0 };
|
||||
KEY_T L0po = { &kf__layer__pop, 0x0, NULL, 0 };
|
||||
KEY_T L0pu1po = { &kf__layer__push, 0x01, &kf__layer__pop, 0x0 };
|
||||
KEY_T L1pu2po = { &kf__layer__push, 0x12, &kf__layer__pop, 0x1 };
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
KEY_T layout[][KB__ROWS][KB__COLUMNS] = {
|
||||
// ----------------------------------------------------------------------------
|
||||
MATRIX__LAYER( // layer 0 : default
|
||||
|
||||
// unused
|
||||
NA,
|
||||
// left hand ...... ......... ......... ......... ......... ......... .........
|
||||
|
@ -98,50 +88,85 @@ Sh2KCapL, Z, X, C, V, B, L0pu1po,
|
|||
// right hand ..... ......... ......... ......... ......... ......... .........
|
||||
NumPush, K6, K7, K8, K9, K0, Dash,
|
||||
BrktL, Y, U, I, O, P, BrktR,
|
||||
H, J, K, L, Semicol, Slash,
|
||||
H, J, K, L, Semicol, Quote,
|
||||
L0pu1po, N, M, Comma, Period, Slash, Sh2KCapR,
|
||||
ArrowL, ArrowD, ArrowU, ArrowR, GUIR,
|
||||
AltR, CtrlR,
|
||||
PageU, Nothing, NA,
|
||||
PageU, NA, NA,
|
||||
PageD, Enter, Space ),
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
MATRIX__LAYER( // layer 1 : function and symbol keys
|
||||
// TODO: still checking this, especially for shifted keys
|
||||
// unused
|
||||
NA,
|
||||
// left hand ...... ......... ......... ......... ......... ......... .........
|
||||
NA, F1, F2, F3, F4, F5, F11,
|
||||
Transp, BraceL, BraceR, BrktL, BrktR, NA, L0po,
|
||||
Transp, Semicol, Slash, Dash, KP0, Semicol,
|
||||
Transp, KP6, KP7, KP8, KP9, Equal, L1pu2po,
|
||||
Transp, Semicol, Slash, Dash, KP0, Colon,
|
||||
Transp, KP6, KP7, KP8, KP9, Plus, L1pu2po,
|
||||
Transp, Transp, Transp, Transp, Transp,
|
||||
Transp, Transp,
|
||||
Transp, Transp, Transp,
|
||||
Transp, Transp, Transp,
|
||||
// right hand ..... ......... ......... ......... ......... ......... .........
|
||||
F12, F6, F7, F8, F9, F10, Power,
|
||||
Transp, NA, Dash, Comma, Period, Dollar, VolumeU,
|
||||
F12, F6, F7, F8, F9, F10, Power,
|
||||
Transp, NA, Undersc, LessThan, GrtrThan, Dollar, VolumeU,
|
||||
Bkslash, KP1, ParenL, ParenR, Equal, VolumeD,
|
||||
L1pu2po, Asterisk, KP2, KP3, KP4, KP5, Mute,
|
||||
Transp, Transp, Transp, Transp, Transp,
|
||||
Transp, Transp,
|
||||
Transp, Transp, Transp,
|
||||
Transp, Transp, Transp ),
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
MATRIX__LAYER( // layer 2 : keyboard functions
|
||||
// unused
|
||||
NA,
|
||||
// left hand ...... ......... ......... ......... ......... ......... .........
|
||||
Btldr, NA, NA, NA, NA, NA, NA,
|
||||
NA, NA, NA, NA, NA, NA, NA,
|
||||
NA, NA, NA, NA, NA, NA,
|
||||
NA, NA, NA, NA, NA, NA, NA,
|
||||
NA, NA, NA, NA, NA,
|
||||
NA, NA,
|
||||
NA, NA, NA,
|
||||
NA, NA, NA,
|
||||
// right hand ..... ......... ......... ......... ......... ......... .........
|
||||
NA, NA, NA, NA, NA, NA, NA,
|
||||
NA, NA, NA, NA, NA, NA, NA,
|
||||
NA, NA, NA, NA, NA, NA,
|
||||
NA, NA, NA, NA, NA, NA, NA,
|
||||
NA, NA, NA, NA, NA,
|
||||
NA, NA,
|
||||
NA, NA, NA,
|
||||
NA, NA, NA ),
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
MATRIX__LAYER( // layer 3 : numpad
|
||||
// unused
|
||||
NA,
|
||||
// left hand ...... ......... ......... ......... ......... ......... .........
|
||||
Transp, Transp, Transp, Transp, Transp, Transp, Transp,
|
||||
Transp, Transp, Transp, Transp, Transp, Transp, Transp,
|
||||
Transp, Transp, Transp, Transp, Transp, Transp,
|
||||
Transp, Transp, Transp, Transp, Transp, Transp, Transp,
|
||||
Transp, Ins, Transp, Transp, Transp,
|
||||
Transp, Transp,
|
||||
Transp, Transp, Transp,
|
||||
Transp, Transp, Transp,
|
||||
// right hand ..... ......... ......... ......... ......... ......... .........
|
||||
NumPop, Transp, NumPop, Equal, KPDiv, KPMul,
|
||||
Transp, Transp, KP7, KP8, KP9, KPSub, Transp,
|
||||
Transp, KP4, KP5, KP6, KPAdd, Transp,
|
||||
Transp, Transp, KP1, KP2, KP3, KPEnter, Transp,
|
||||
Transp, Transp, Period, KPEnter, Transp,
|
||||
Transp, Transp,
|
||||
Transp, Transp, Transp,
|
||||
Transp, Transp, KP0 ),
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
};
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// LED control
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// TODO
|
||||
// - also, should this be moved to its own file?
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// matrix control
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// TODO
|
||||
// - also, should this be moved to its own file?
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
* ----------------------------------------------------
|
||||
* ```
|
||||
*/
|
||||
#define MATRIX__LAYER( \
|
||||
#define MATRIX__LAYER( \
|
||||
/* for unused positions */ \
|
||||
na, \
|
||||
\
|
||||
|
|
|
@ -26,19 +26,20 @@ typedef void (*kf__function_pointer_t)(uint16_t value);
|
|||
// ----------------------------------------------------------------------------
|
||||
|
||||
// basic
|
||||
void kf__press (uint16_t value);
|
||||
void kf__release (uint16_t value);
|
||||
void kf__send (uint16_t value);
|
||||
void kf__toggle (uint16_t value);
|
||||
void kf__macro (uint16_t value);
|
||||
void kf__layer__push (uint16_t value);
|
||||
void kf__layer__pop (uint16_t value);
|
||||
void kf__press (uint16_t keycode);
|
||||
void kf__release (uint16_t keycode);
|
||||
void kf__send (uint16_t ignore);
|
||||
void kf__toggle (uint16_t keycode);
|
||||
void kf__layer__push (uint16_t layer_stack_id__layer_number);
|
||||
void kf__layer__pop (uint16_t layer_stack_id);
|
||||
void kf__macro__progmem (uint16_t pointer);
|
||||
void kf__macro__eeprom (uint16_t pointer);
|
||||
|
||||
// device
|
||||
void kf__jump_to_bootloader (uint16_t value);
|
||||
void kf__jump_to_bootloader (uint16_t ignore);
|
||||
|
||||
// special
|
||||
void kf__two_keys_capslock_press_release (uint16_t value);
|
||||
void kf__two_keys_capslock (uint16_t pressed);
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2013 Ben Blazak <benblazak.dev@gmail.com>
|
||||
* Released under The MIT License (see "license.md")
|
||||
* Project located at <https://github.com/benblazak/ergodox-firmware>
|
||||
* ------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* - description: |
|
||||
* Things kept track of by `main()` that need to be accessible to other parts
|
||||
* of the program.
|
||||
*
|
||||
* Prefix: `main__`
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ERGODOX_FIRMWARE__FIRMWARE__MAIN_H
|
||||
#define ERGODOX_FIRMWARE__FIRMWARE__MAIN_H
|
||||
// ----------------------------------------------------------------------------
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
uint8_t main__layer_stack__peek (uint8_t offset);
|
||||
uint8_t main__layer_stack__push (uint8_t layer_id, uint8_t layer_number);
|
||||
uint8_t main__layer_stack__pop_id (uint8_t layer_id);
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// ----------------------------------------------------------------------------
|
||||
#endif // ERGODOX_FIRMWARE__FIRMWARE__MAIN_H
|
||||
|
||||
|
||||
// TODO
|
||||
/** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# documentation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **/
|
||||
|
Loading…
Reference in New Issue