Per-key LED effects trial. Better LED write

This commit is contained in:
Luke
2020-04-22 22:38:28 +12:00
parent ccefd30102
commit 3cc804d4a3
7 changed files with 641 additions and 115 deletions

View File

@@ -53,7 +53,7 @@ Currently if no options are supplied for the CLI mode selection then a default i
## Implemented
- [X] Setting/modifying built-in LED modes
- [ ] Per-key LED setting
- [X] Per-key LED setting (PARTIALLY COMPLETE)
- [ ] Fancy LED modes (custom programs)
- [X] Daemon mode
- [X] Saving settings for reload

View File

@@ -319,3 +319,259 @@ impl From<BuiltInModeByte> for u8 {
}
}
}
#[derive(Clone)]
pub struct KeyColourArray([[u8; 64]; 10]);
impl KeyColourArray {
pub fn new() -> Self {
let mut set = [[0u8; 64]; 10];
for (count, row) in set.iter_mut().enumerate() {
row[0] = 0x5d; // Report ID
row[1] = 0xbc; // Mode = custom??, 0xb3 is builtin
row[2] = 0x00;
row[3] = 0x01; // ??
row[4] = 0x01; // ??, 4,5,6 are normally RGB for builtin mode colours
row[5] = 0x01; // ??
row[6] = (count as u8) << 4; // Key group
row[7] = 0x10; // 0b00010000 addressing? flips for group a0
if count == 9 {
row[7] = 0x08; // 0b00001000
}
row[8] = 0x00;
}
KeyColourArray(set)
}
pub fn set(&mut self, key: Key, r: u8, g: u8, b: u8) {
let (rr, gg, bb) = self.key(key);
*rr = r;
*gg = g;
*bb = b;
}
pub fn key(&mut self, key: Key) -> (&mut u8, &mut u8, &mut u8) {
// Tuples are indexes in to array
let (row, col) = match key {
Key::VolUp => (0, 15),
Key::VolDown => (0, 18),
Key::MicMute => (0, 21),
Key::ROG => (0, 24),
//
Key::Esc => (1, 24),
Key::F1 => (1, 30),
Key::F2 => (1, 33),
Key::F3 => (1, 36),
Key::F4 => (1, 39),
Key::F5 => (1, 45),
Key::F6 => (1, 48),
Key::F7 => (1, 51),
Key::F8 => (1, 54),
//
Key::F9 => (2, 12),
Key::F10 => (2, 15),
Key::F11 => (2, 18),
Key::F12 => (2, 21),
Key::Del => (2, 24),
Key::Tilde => (2, 39),
Key::N1 => (2, 42),
Key::N2 => (2, 45),
Key::N3 => (2, 48),
Key::N4 => (2, 51),
Key::N5 => (2, 54),
//
Key::N6 => (3, 9),
Key::N7 => (3, 12),
Key::N8 => (3, 15),
Key::N9 => (3, 18),
Key::N0 => (3, 21),
Key::Hyphen => (3, 24),
Key::Equals => (3, 27),
Key::BkSpc1 => (3, 30),
Key::BkSpc2 => (3, 33),
Key::BkSpc3 => (3, 36),
Key::Home => (3, 39),
Key::Tab => (3, 54),
//
Key::Q => (4, 9),
Key::W => (4, 12),
Key::E => (4, 15),
Key::R => (4, 18),
Key::T => (4, 21),
Key::Y => (4, 24),
Key::U => (4, 27),
Key::I => (4, 30),
Key::O => (4, 33),
Key::P => (4, 36),
Key::LBracket => (4, 39),
Key::RBracket => (4, 42),
Key::BackSlash => (4, 45),
Key::PgUp => (4, 54),
//
Key::Caps => (5, 21),
Key::A => (5, 24),
Key::S => (5, 27),
Key::D => (5, 30),
Key::F => (5, 33),
Key::G => (5, 36),
Key::H => (5, 39),
Key::J => (5, 42),
Key::K => (5, 45),
Key::L => (5, 48),
Key::SemiColon => (5, 51),
Key::Quote => (5, 54),
//
Key::Ret1 => (6, 12),
Key::Ret2 => (6, 15),
Key::Ret3 => (6, 18),
Key::PgDn => (6, 21),
Key::LShift => (6, 36),
Key::Z => (6, 42),
Key::X => (6, 45),
Key::C => (6, 48),
Key::V => (6, 51),
Key::B => (6, 54),
//
Key::N => (7, 9),
Key::M => (7, 12),
Key::Comma => (7, 15),
Key::Period => (7, 18),
Key::FwdSlash => (7, 21),
Key::Rshift1 => (7, 27),
Key::Rshift2 => (7, 30),
Key::Rshift3 => (7, 33),
Key::End => (7, 36),
Key::LCtrl => (7, 51),
Key::LFn => (7, 54),
//
Key::Meta => (8, 9),
Key::LAlt => (8, 12),
Key::Space1 => (8, 15),
Key::Space2 => (8, 18),
Key::Space3 => (8, 21),
Key::Space4 => (8, 24),
Key::RAlt => (8, 30),
Key::PrtSc => (8, 33),
Key::RCtrl => (8, 36),
Key::Up => (8, 42),
Key::RFn => (8, 51),
//
Key::Left => (9, 54),
Key::Down => (10, 9),
Key::Right => (10, 12),
//_ => (0, 24),
};
// LOLOLOLOLOLOLOL! Look it's safe okay
unsafe {
(
&mut *(&mut self.0[row][col] as *mut u8),
&mut *(&mut self.0[row][col + 1] as *mut u8),
&mut *(&mut self.0[row][col + 2] as *mut u8),
)
}
}
pub fn get(&self) -> &[[u8; 64]; 10] {
&self.0
}
}
pub enum Key {
VolUp,
VolDown,
MicMute,
ROG,
Esc,
F1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
F10,
F11,
F12,
Del,
Tilde,
N1,
N2,
N3,
N4,
N5,
N6,
N7,
N8,
N9,
N0,
Hyphen,
Equals,
BkSpc1,
BkSpc2,
BkSpc3,
Home,
Tab,
Q,
W,
E,
R,
T,
Y,
U,
I,
O,
P,
LBracket,
RBracket,
BackSlash,
PgUp,
Caps,
A,
S,
D,
F,
G,
H,
J,
K,
L,
SemiColon,
Quote,
Ret1,
Ret2,
Ret3,
PgDn,
LShift,
Z,
X,
C,
V,
B,
N,
M,
Comma,
Period,
FwdSlash,
Rshift1,
Rshift2,
Rshift3,
End,
LCtrl,
LFn,
Meta,
LAlt,
Space1,
Space2,
Space3,
Space4,
RAlt,
PrtSc,
RCtrl,
Up,
Down,
Left,
Right,
RFn,
}

View File

@@ -1,7 +1,7 @@
// Return show-stopping errors, otherwise map error to a log level
use crate::{
aura::{aura_brightness_bytes, BuiltInModeByte},
aura::{aura_brightness_bytes, BuiltInModeByte, KeyColourArray},
config::Config,
error::AuraError,
laptops::*,
@@ -52,15 +52,12 @@ impl RogCore {
let dev_config = dev_handle.device().config_descriptor(0).unwrap();
// Interface with outputs
let mut led_interface_num = 0;
let mut keys_interface_num = 0;
let mut interface = 0;
for iface in dev_config.interfaces() {
for desc in iface.descriptors() {
for endpoint in desc.endpoint_descriptors() {
if endpoint.address() == laptop.key_endpoint() {
keys_interface_num = desc.interface_number();
} else if endpoint.address() == laptop.led_endpoint() {
led_interface_num = desc.interface_number();
interface = desc.interface_number();
break;
}
}
@@ -69,13 +66,13 @@ impl RogCore {
dev_handle.set_auto_detach_kernel_driver(true).unwrap();
dev_handle
.claim_interface(keys_interface_num)
.claim_interface(interface)
.map_err(|err| AuraError::UsbError(err))?;
Ok(RogCore {
handle: dev_handle,
initialised: false,
led_endpoint: led_interface_num,
led_endpoint: laptop.led_endpoint(),
keys_endpoint: laptop.key_endpoint(),
config: Config::default().read(),
virt_keys: VirtKeys::new(),
@@ -101,16 +98,12 @@ impl RogCore {
fn aura_write(&mut self, message: &[u8]) -> Result<(), AuraError> {
self.handle
.write_control(0x21, 0x09, 0x035D, 0, message, Duration::new(0, 5))
.map_err(|err| AuraError::UsbError(err))?;
.write_interrupt(self.led_endpoint, message, Duration::from_micros(1))
.unwrap();
Ok(())
}
fn aura_write_messages(&mut self, messages: &[&[u8]]) -> Result<(), AuraError> {
self.handle
.claim_interface(self.led_endpoint)
.map_err(|err| AuraError::UsbError(err))?;
if !self.initialised {
self.aura_write(&LED_INIT1)?;
self.aura_write(LED_INIT2.as_bytes())?;
@@ -126,10 +119,29 @@ impl RogCore {
}
// Changes won't persist unless apply is set
self.aura_write(&LED_APPLY)?;
Ok(())
}
self.handle
.release_interface(self.led_endpoint)
.map_err(|err| AuraError::UsbError(err))?;
/// Initialise and clear the keyboard for custom effects
pub fn aura_effect_init(&mut self) -> Result<(), AuraError> {
let mut init = [0u8; 64];
init[0] = 0x5d; // Report ID
init[1] = 0xbc; // Mode = custom??, 0xb3 is builtin
self.aura_write(&init)?;
self.initialised = true;
Ok(())
}
/// Write an effect block
///
/// `aura_effect_init` must be called any effect routine, and called only once.
pub fn aura_write_effect(&mut self, effect: &[KeyColourArray]) -> Result<(), AuraError> {
for key_colours in effect {
for row in key_colours.get() {
self.aura_write(row)?;
}
}
Ok(())
}

203
src/laptops/gx502gw.rs Normal file
View File

@@ -0,0 +1,203 @@
use crate::aura::{BuiltInModeByte, Key, KeyColourArray};
use crate::core::{Backlight, RogCore};
use crate::error::AuraError;
use crate::virt_device::ConsumerKeys;
//use keycode::{KeyMap, KeyMappingId, KeyState, KeyboardState};
use super::Laptop;
use log::info;
pub(super) struct LaptopGX502GW {
usb_vendor: u16,
usb_product: u16,
board_name: &'static str,
prod_family: &'static str,
report_filter_bytes: [u8; 2],
min_led_bright: u8,
max_led_bright: u8,
led_endpoint: u8,
key_endpoint: u8,
supported_modes: [BuiltInModeByte; 12],
backlight: Backlight,
per_key_led: Vec<KeyColourArray>,
}
impl LaptopGX502GW {
pub(super) fn new() -> Self {
// Setting up a sample effect to run when ROG pressed
let mut per_key_led = Vec::new();
let mut key_colours = KeyColourArray::new();
key_colours.set(Key::ROG, 255, 0, 0);
key_colours.set(Key::L, 255, 0, 0);
key_colours.set(Key::I, 255, 0, 0);
key_colours.set(Key::N, 255, 0, 0);
key_colours.set(Key::U, 255, 0, 0);
key_colours.set(Key::X, 255, 0, 0);
per_key_led.push(key_colours.clone());
for _ in 0..3 {
for _ in 0..50 {
*key_colours.key(Key::ROG).0 -= 5;
*key_colours.key(Key::L).0 -= 5;
*key_colours.key(Key::I).0 -= 5;
*key_colours.key(Key::N).0 -= 5;
*key_colours.key(Key::U).0 -= 5;
*key_colours.key(Key::X).0 -= 5;
per_key_led.push(key_colours.clone());
}
for _ in 0..50 {
*key_colours.key(Key::ROG).0 += 5;
*key_colours.key(Key::L).0 += 5;
*key_colours.key(Key::I).0 += 5;
*key_colours.key(Key::N).0 += 5;
*key_colours.key(Key::U).0 += 5;
*key_colours.key(Key::X).0 += 5;
per_key_led.push(key_colours.clone());
}
}
// Find backlight
LaptopGX502GW {
usb_vendor: 0x0B05,
usb_product: 0x1866,
// from `cat /sys/class/dmi/id/board_name`
board_name: "GX502GW",
// from `cat /sys/class/dmi/id/product_family`
prod_family: "Zephyrus S",
report_filter_bytes: [0x5a, 0x02],
min_led_bright: 0x00,
max_led_bright: 0x03,
//from `lsusb -vd 0b05:1866`
led_endpoint: 0x04,
//from `lsusb -vd 0b05:1866`
key_endpoint: 0x83,
supported_modes: [
BuiltInModeByte::Stable,
BuiltInModeByte::Breathe,
BuiltInModeByte::Cycle,
BuiltInModeByte::Rainbow,
BuiltInModeByte::Rain,
BuiltInModeByte::Random,
BuiltInModeByte::Highlight,
BuiltInModeByte::Laser,
BuiltInModeByte::Ripple,
BuiltInModeByte::Pulse,
BuiltInModeByte::ThinZoomy,
BuiltInModeByte::WideZoomy,
],
backlight: Backlight::new("intel_backlight").unwrap(),
per_key_led,
}
}
}
impl LaptopGX502GW {
fn do_keypress_actions(&self, rogcore: &mut RogCore) -> Result<(), AuraError> {
if let Some(key_buf) = rogcore.poll_keyboard(&self.report_filter_bytes) {
match GX502GWKeys::from(key_buf[1]) {
GX502GWKeys::LedBrightUp => {
rogcore.aura_bright_inc(&self.supported_modes, self.max_led_bright)?;
}
GX502GWKeys::LedBrightDown => {
rogcore.aura_bright_dec(&self.supported_modes, self.min_led_bright)?;
}
GX502GWKeys::AuraNext => rogcore.aura_mode_next(&self.supported_modes)?,
GX502GWKeys::AuraPrevious => rogcore.aura_mode_prev(&self.supported_modes)?,
GX502GWKeys::ScreenBrightUp => self.backlight.step_up(),
GX502GWKeys::ScreenBrightDown => self.backlight.step_down(),
GX502GWKeys::Sleep => rogcore.suspend_with_systemd(),
GX502GWKeys::AirplaneMode => rogcore.toggle_airplane_mode(),
GX502GWKeys::MicToggle => {}
GX502GWKeys::Fan => {}
GX502GWKeys::ScreenToggle => {
rogcore.virt_keys().press(ConsumerKeys::BacklightTog.into());
}
GX502GWKeys::TouchPadToggle => {
let mut key = [0u8; 32];
key[0] = 0x01;
key[3] = 0x070;
rogcore.virt_keys().press(key);
}
GX502GWKeys::Rog => {
rogcore.aura_effect_init()?;
rogcore.aura_write_effect(&self.per_key_led)?;
// let mut key = [0u8; 32];
// key[0] = 0x01;
// key[3] = 0x68; // XF86Tools? F13
// rogcore.virt_keys().press(key);
}
GX502GWKeys::None => {
if key_buf[0] != 0x5A {
info!("Unmapped key, attempt passthrough: {:X?}", &key_buf[1]);
rogcore.virt_keys().press(key_buf);
}
}
}
}
Ok(())
}
}
impl Laptop for LaptopGX502GW {
fn run(&self, rogcore: &mut RogCore) -> Result<(), AuraError> {
self.do_keypress_actions(rogcore)
}
fn led_endpoint(&self) -> u8 {
self.led_endpoint
}
fn key_endpoint(&self) -> u8 {
self.key_endpoint
}
fn usb_vendor(&self) -> u16 {
self.usb_vendor
}
fn usb_product(&self) -> u16 {
self.usb_product
}
fn supported_modes(&self) -> &[BuiltInModeByte] {
&self.supported_modes
}
fn board_name(&self) -> &str {
&self.board_name
}
fn prod_family(&self) -> &str {
&self.prod_family
}
}
enum GX502GWKeys {
Rog = 0x38,
MicToggle = 0x7C,
Fan = 0xAE,
ScreenToggle = 0x35,
ScreenBrightDown = 0x10,
ScreenBrightUp = 0x20,
TouchPadToggle = 0x6b,
Sleep = 0x6C,
AirplaneMode = 0x88,
LedBrightUp = 0xC4,
LedBrightDown = 0xC5,
AuraPrevious = 0xB2,
AuraNext = 0xB3,
None,
}
impl From<u8> for GX502GWKeys {
fn from(byte: u8) -> Self {
match byte {
0x38 => GX502GWKeys::Rog,
0x7C => GX502GWKeys::MicToggle,
0xAE => GX502GWKeys::Fan,
0x35 => GX502GWKeys::ScreenToggle,
0x10 => GX502GWKeys::ScreenBrightDown,
0x20 => GX502GWKeys::ScreenBrightUp,
0x6b => GX502GWKeys::TouchPadToggle,
0x6C => GX502GWKeys::Sleep,
0x88 => GX502GWKeys::AirplaneMode,
0xC4 => GX502GWKeys::LedBrightUp,
0xC5 => GX502GWKeys::LedBrightDown,
0xB2 => GX502GWKeys::AuraPrevious,
0xB3 => GX502GWKeys::AuraNext,
_ => GX502GWKeys::None,
}
}
}

45
src/laptops/mod.rs Normal file
View File

@@ -0,0 +1,45 @@
use crate::aura::BuiltInModeByte;
use crate::core::RogCore;
use crate::error::AuraError;
//use keycode::{KeyMap, KeyMappingId, KeyState, KeyboardState};
use log::info;
mod gx502gw;
use gx502gw::LaptopGX502GW;
pub(crate) fn match_laptop() -> Box<dyn Laptop> {
let dmi = sysfs_class::DmiId::default();
let board_name = dmi.board_name().unwrap();
match board_name.as_str() {
// The hell does it have a \n for anyway?
"GX502GW\n" => {
info!("Found GX502GW");
Box::new(LaptopGX502GW::new())
}
_ => {
panic!("could not match laptop");
}
}
}
/// All laptop models should implement this trait. The role of a `Laptop` is to
/// "drive" the `RogCore`.
///
/// `do_hotkey_action` is passed the byte that a hotkey emits, and is expected to
/// perform whichever action matches that. For now the only key bytes passed in are
/// the ones which match `byte[0] == hotkey_group_byte`. On the GX502GW the keyboard
/// has 3 explicit groups: main, vol+media, and the ones that the Linux kernel doesn't
/// map.
///
/// If using the `keycode` crate to build keyboard input, the report must be prefixed
/// with the report ID (usually `0x01` for the virtual keyboard).
pub(crate) trait Laptop {
fn board_name(&self) -> &str;
fn prod_family(&self) -> &str;
fn run(&self, core: &mut RogCore) -> Result<(), AuraError>;
fn led_endpoint(&self) -> u8;
fn key_endpoint(&self) -> u8;
fn usb_vendor(&self) -> u16;
fn usb_product(&self) -> u16;
fn supported_modes(&self) -> &[BuiltInModeByte];
}

View File

@@ -1,97 +1,107 @@
VOL_DN = 5dbc00010101001000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
VOL_UP = 5dbc00010101001000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
MIC = 5dbc00010101001000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000
ROG = 5dbc00010101001000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000
ESC = 5dbc00010101101000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000
F1 = 5dbc00010101101000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000
F2 = 5dbc00010101101000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000
F3 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000
F4 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000
F5 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000
F6 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000
F7 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000
F8 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000
F9 = 5dbc00010101201000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
F10 = 5dbc00010101201000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
F11 = 5dbc00010101201000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
F12 = 5dbc00010101201000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000
Del = 5dbc00010101201000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000
~ = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000
1 = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000
2 = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000
3 = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000
4 = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000
5 = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000
6 = 5dbc00010101301000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7 = 5dbc00010101301000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
8 = 5dbc00010101301000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
9 = 5dbc00010101301000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0 = 5dbc00010101301000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000
- = 5dbc00010101301000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000
= = 5dbc00010101301000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000
BkSpc1 = 5dbc00010101301000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000
BkSpc2 = 5dbc00010101301000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000
BkSpc3 = 5dbc00010101301000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000
Home = 5dbc00010101301000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000
Tab = 5dbc00010101301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000
Q = 5dbc00010101401000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
W = 5dbc00010101401000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
E = 5dbc00010101401000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
R = 5dbc00010101401000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
T = 5dbc00010101401000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000
Y = 5dbc00010101401000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000
U = 5dbc00010101401000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000
I = 5dbc00010101401000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000
O = 5dbc00010101401000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000
P = 5dbc00010101401000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000
[ = 5dbc00010101401000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000
] = 5dbc00010101401000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000
\ = 5dbc00010101401000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000
PgUp = 5dbc00010101401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000
Caps = 5dbc00010101501000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000
A = 5dbc00010101501000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000
S = 5dbc00010101501000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000
D = 5dbc00010101501000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000
F = 5dbc00010101501000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000
G = 5dbc00010101501000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000
H = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000
J = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000
K = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000
L = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000
; = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000
' = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000
Enter1 = 5dbc00010101601000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Enter2 = 5dbc00010101601000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Enter3 = 5dbc00010101601000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
PgDn = 5dbc00010101601000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000
LShfit = 5dbc00010101601000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000
Z = 5dbc00010101601000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000
X = 5dbc00010101601000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000
C = 5dbc00010101601000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000
V = 5dbc00010101601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000
B = 5dbc00010101601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000
N = 5dbc00010101701000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
M = 5dbc00010101701000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
, = 5dbc00010101701000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
. = 5dbc00010101701000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
/ = 5dbc00010101701000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000
Rshft1 = 5dbc00010101701000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000
Rshft1 = 5dbc00010101701000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000
Rshft1 = 5dbc00010101701000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000
End = 5dbc00010101701000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000
Ctrl = 5dbc00010101701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000
LFn = 5dbc00010101701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000
Meta = 5dbc00010101801000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
LAlt = 5dbc00010101801000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Space1 = 5dbc00010101801000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Space2 = 5dbc00010101801000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Space3 = 5dbc00010101801000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000
Space4 = 5dbc00010101801000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000
RAlt = 5dbc00010101801000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000
PrtScn = 5dbc00010101801000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000
RCtrl = 5dbc00010101801000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000
Up = 5dbc00010101801000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000
RFn = 5dbc00010101801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000
Left = 5dbc00010101901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000
Down = 5dbc00010101a00800ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Right = 5dbc00010101a00800000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
VOL_DN = 5d,bc,00,01,01,01,00,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
VOL_UP = 5d,bc,00,01,01,01,00,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
MIC = 5d,bc,00,01,01,01,00,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
ROG = 5d,bc,00,01,01,01,00,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
ESC = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
F1 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
F2 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
F3 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
F4 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
F5 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
F6 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,
F7 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,
F8 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,
F9 = 5d,bc,00,01,01,01,20,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
F10 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
F11 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
F12 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Del = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
~ = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
1 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
2 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
3 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,
4 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,
5 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,
6 = 5d,bc,00,01,01,01,30,10,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
7 = 5d,bc,00,01,01,01,30,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
8 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
9 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
0 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
- = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
= = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
BkSpc1 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
BkSpc2 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
BkSpc3 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Home = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Tab = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,
Q = 5d,bc,00,01,01,01,40,10,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
W = 5d,bc,00,01,01,01,40,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
E = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
R = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
T = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Y = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
U = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
I = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
O = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
P = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
[ = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
] = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
\ = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
PgUp = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,
Caps = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
A = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
S = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
D = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
F = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
G = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
H = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
J = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
K = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
L = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,
; = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,
' = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,
Enter1 = 5d,bc,00,01,01,01,60,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Enter2 = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Enter3 = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
PgDn = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
LShfit = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Z = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
X = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
C = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,
V = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,
B = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,
N = 5d,bc,00,01,01,01,70,10,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
M = 5d,bc,00,01,01,01,70,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
, = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
. = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
/ = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Rshft1 = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Rshft1 = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Rshft1 = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
End = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Ctrl = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,
LFn = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,
Meta = 5d,bc,00,01,01,01,80,10,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
LAlt = 5d,bc,00,01,01,01,80,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Space1 = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Space2 = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Space3 = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Space4 = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
RAlt = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
PrtScn = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
RCtrl = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Up = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
RFn = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,
Left = 5d,bc,00,01,01,01,90,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,
Down = 5d,bc,00,01,01,01,a0,08,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
Right = 5d,bc,00,01,01,01,a0,08,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,

Binary file not shown.