packages feed

keymapp (empty) → 0.1.0

raw patch · 8 files changed

+4239/−0 lines, 8 filesdep +basedep +colourdep +directory

Dependencies added: base, colour, directory, exceptions, grapesy, keymapp, mtl, optparse-applicative, prettyprinter, proto-lens, proto-lens-runtime, text, unliftio-core

Files

+ CHANGELOG.md view
@@ -0,0 +1,19 @@+# Changelog++All notable changes to `haskell-keymapp` will be documented in this file.++The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),+and this project adheres to [Haskell Package Versioning Policy](https://pvp.haskell.org).++## [Unreleased]++## [0.1.0] - 25.06.2026++### Added++- A working client implementation for the Keymapp API+- A CLI based on [kontroll](https://github.com/zsa/kontroll)+- Full documentation and library examples++[unreleased]: https://github.com/fpringle/haskell-keymapp/compare/v0.1.0...HEAD+[0.1.0]: https://github.com/fpringle/haskell-keymapp/releases/tag/v0.1.0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2026, Frederick Pringle++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+      copyright notice, this list of conditions and the following+      disclaimer in the documentation and/or other materials provided+      with the distribution.++    * Neither the name of Frederick Pringle nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ README.md view
@@ -0,0 +1,24 @@+# Keymapp client library and CLI++This library provides a client for interacting with the [Keymapp](https://blog.zsa.io/keymapp) API to control a ZSA keyboard. It can be used as a Haskell library, or via the provided CLI executable, which is inspired by [Kontroll](https://github.com/zsa/kontroll).++For example library use, see the [examples](https://github.com/fpringle/haskell-keymapp/tree/main/examples) directory.++## Building and running the CLI++In the root directory, run `nix-shell` (or use [direnv](https://direnv.net/)) to load a development shell with `ghc`, `cabal etc`. Then just run the following to see a list of available commands:++```bash+$ cabal run keymapp --+...+$ cabal run keymapp -- status+version:   1.3.7+keyboard:+  name:    Moonlander MK1+  version: Mvvpr/orAw9d+  layer:   1+```++## LED mapping++Some of the commands require you to provide an LED index. See [this](https://github.com/fpringle/haskell-keymapp/blob/main/keymapp/led_mapping.md) table for a mapping of which keyboard keys correspond to which indices on a ZSA Moonlander MK1.
+ exe/Main.hs view
@@ -0,0 +1,271 @@+{-# LANGUAGE ApplicativeDo #-}+{-# LANGUAGE LambdaCase #-}++module Main where++import Control.Applicative ((<**>), (<|>))+import Control.Keymapp.Client+import Control.Monad (replicateM, unless)+import Control.Monad.IO.Class (liftIO)+import Data.Colour+import Data.Colour.SRGB (sRGB24reads)+import Data.Foldable (fold)+import qualified Data.Text as T+import qualified Data.Text.IO as T+import Network.GRPC.Client+import Network.GRPC.Common+import Numeric.Natural (Natural)+import qualified Options.Applicative as O+import qualified Options.Applicative.Help as O hiding (fullDesc)+import qualified Prettyprinter.Util as P+import System.Directory+import System.Exit (exitFailure)++data Command+  = GetStatus+  | GetKeyboards+  | ConnectKeyboard KeyboardId+  | ConnectAnyKeyboard+  | DisconnectKeyboard+  | SetLayer Layer+  | UnsetLayer Layer+  | SetRGBLed LED (Colour Double) Sustain+  | SetRGBAll (Colour Double) Sustain+  | RestoreRGBLeds+  | SetStatusLed LED On Sustain+  | SetStatusLedAll On Sustain+  | RestoreStatusLeds+  | IncreaseBrightness Natural+  | DecreaseBrightness Natural++getStatusP :: O.Parser Command+getStatusP = pure GetStatus++getKeyboardsP :: O.Parser Command+getKeyboardsP = pure GetKeyboards++connectKeyboardP :: O.Parser Command+connectKeyboardP =+  ConnectKeyboard+    <$> O.option (KeyboardId <$> O.auto) (O.long "index" <> O.short 'i' <> O.metavar "keyboard index")++connectAnyKeyboardP :: O.Parser Command+connectAnyKeyboardP = pure ConnectAnyKeyboard++disconnectKeyboardP :: O.Parser Command+disconnectKeyboardP = pure DisconnectKeyboard++setLayerP :: O.Parser Command+setLayerP =+  SetLayer+    <$> O.option (Layer <$> O.auto) (O.long "index" <> O.short 'i' <> O.metavar "INDEX")++unsetLayerP :: O.Parser Command+unsetLayerP =+  UnsetLayer+    <$> O.option (Layer <$> O.auto) (O.long "index" <> O.short 'i' <> O.metavar "INDEX")++setRGBLedP :: O.Parser Command+setRGBLedP =+  SetRGBLed+    <$> ledP+    <*> colourP+    <*> sustainP++colourP :: O.Parser (Colour Double)+colourP = O.option parseColour (O.long "colour" <> O.short 'c' <> O.metavar "COLOUR")+  where+    parseColour = O.eitherReader $ \s -> case sRGB24reads s of+      [(c, "")] -> pure c+      _ -> Left $ "Invalid colour: " <> show s++sustainP :: O.Parser Sustain+sustainP = Sustain <$> O.option O.auto (O.long "sustain" <> O.short 'c' <> O.metavar "SUSTAIN" <> O.value 0)++ledP :: O.Parser LED+ledP = O.option (LED <$> O.auto) (O.long "led" <> O.short 'l' <> O.metavar "LED")++onP :: O.Parser On+onP = O.flag (On True) (On False) (O.long "off" <> O.short 'o')++setRGBAllP :: O.Parser Command+setRGBAllP =+  SetRGBAll+    <$> colourP+    <*> sustainP++restoreRGBLedsP :: O.Parser Command+restoreRGBLedsP = pure RestoreRGBLeds++setStatusLedP :: O.Parser Command+setStatusLedP =+  SetStatusLed+    <$> ledP+    <*> onP+    <*> sustainP++setStatusLedAllP :: O.Parser Command+setStatusLedAllP =+  SetStatusLedAll+    <$> onP+    <*> sustainP++restoreStatusLedsP :: O.Parser Command+restoreStatusLedsP = pure RestoreStatusLeds++increaseBrightnessP :: O.Parser Command+increaseBrightnessP =+  IncreaseBrightness+    <$> stepsP++stepsP :: O.Parser Natural+stepsP = O.option O.auto (O.long "steps" <> O.short 's' <> O.metavar "STEPS" <> O.value 1)++decreaseBrightnessP :: O.Parser Command+decreaseBrightnessP =+  DecreaseBrightness+    <$> stepsP++commandP :: O.Parser Command+commandP =+  O.hsubparser+    ( O.command "status" (O.info getStatusP (O.progDesc "Get API status."))+        <> O.command "list" (O.info getKeyboardsP (O.progDesc "List all available keyboards."))+        <> O.command "connect" (O.info connectKeyboardP (O.progDesc "Connect to a keyboard given the index returned by the list command."))+        <> O.command "connect-any" (O.info connectAnyKeyboardP (O.progDesc "Connect to the first keyboard detected by keymapp."))+        <> O.command "disconnect" (O.info disconnectKeyboardP (O.progDesc "Disconnect from the currently connected keyboard."))+        <> O.command "set-layer" (O.info setLayerP (O.progDesc "Set the layer of the currently connected keyboard."))+        <> O.command "unset-layer" (O.info unsetLayerP (O.progDesc "Unset the layer of the currently connected keyboard."))+        <> O.command "set-rgb" (O.info setRGBLedP (O.progDesc "Sets the RGB color of a LED."))+        <> O.command "set-rgb-all" (O.info setRGBAllP (O.progDesc "Sets the RGB color of all LEDs."))+        <> O.command "restore-rgb-leds" (O.info restoreRGBLedsP (O.progDesc "Restores the RGB color of all LEDs to their default."))+        <> O.command "set-status-led" (O.info setStatusLedP (O.progDesc "Set / unset a status LED."))+        <> O.command "set-status-led-all" (O.info setStatusLedAllP (O.progDesc "Set / unset all status LEDs."))+        <> O.command "restore-status-leds" (O.info restoreStatusLedsP (O.progDesc "Restores all status LEDs to their default."))+        <> O.command "increase-brightness" (O.info increaseBrightnessP (O.progDesc "Increase the brightness of the keyboard's LEDs."))+        <> O.command "decrease-brightness" (O.info decreaseBrightnessP (O.progDesc "Decrease the brightness of the keyboard's LEDs."))+    )++addressP :: O.Parser Address+addressP = do+  addressHost <- O.option O.str (O.long "address-host" <> O.metavar "HOST")+  addressPort <- O.option O.auto (O.long "address-port" <> O.metavar "PORT")+  addressAuthority <- O.optional $ O.option O.str (O.long "address-authority" <> O.metavar "AUTH")+  pure Address {..}++globalOptsP :: O.Parser GlobalOptions+globalOptsP = do+  socketPath <- insecureP <|> socketP <|> pure DefaultSocket+  pure GlobalOptions {..}+  where+    insecureP, socketP :: O.Parser ServerOpt+    insecureP = Server . ServerInsecure <$> addressP+    socketP = Server . ServerUnix <$> O.option O.str (O.long "socket-path" <> O.short 's' <> O.metavar "PATH")++optsP :: O.Parser Opts+optsP = do+  globalOptions <- globalOptsP+  command <- commandP+  pure Opts {..}++data ServerOpt+  = DefaultSocket+  | Server Server++mkServer :: ServerOpt -> IO Server+mkServer = \case+  DefaultSocket -> ServerUnix <$> getXdgDirectory XdgConfig ".keymapp/keymapp.sock"+  Server server -> pure server++newtype GlobalOptions = GlobalOptions+  { socketPath :: ServerOpt+  }++data Opts = Opts+  { command :: Command+  , globalOptions :: GlobalOptions+  }++runOpts :: Opts -> IO ()+runOpts (Opts cmd GlobalOptions {..}) = do+  server <- mkServer socketPath+  Success success <- runClient def server $ case cmd of+    GetStatus -> getStatus >>= handleStatus+    GetKeyboards -> getKeyboards >>= handleKeyboards+    ConnectKeyboard keyboardId -> connectKeyboard keyboardId+    ConnectAnyKeyboard -> connectAnyKeyboard+    DisconnectKeyboard -> disconnectKeyboard+    SetLayer layer -> setLayer layer+    UnsetLayer layer -> unsetLayer layer+    SetRGBLed led colour sustain -> setRGBLed led colour sustain+    SetRGBAll colour sustain -> setRGBAll colour sustain+    RestoreRGBLeds -> restoreRGBLeds+    SetStatusLed led on sustain -> setStatusLed led on sustain+    SetStatusLedAll on sustain -> setStatusLedAll on sustain+    RestoreStatusLeds -> restoreStatusLeds+    IncreaseBrightness n -> fold <$> replicateM (fromIntegral n) increaseBrightness+    DecreaseBrightness n -> fold <$> replicateM (fromIntegral n) decreaseBrightness++  unless success $ do+    putStrLn "The Keymapp API reported a failure."+    exitFailure++printKeyboard :: Keyboard -> IO ()+printKeyboard (Keyboard (KeyboardId kId) name connected) = do+  T.putStrLn $ "- id:        " <> T.pack (show kId)+  T.putStrLn $ "  name:      " <> name+  T.putStrLn $ "  connected: " <> (if connected then "true" else "false")++handleKeyboards :: [Keyboard] -> KeymappClient IO Success+handleKeyboards keyboards = do+  liftIO $ traverse printKeyboard keyboards+  pure $ Success True++printStatus :: Status -> IO ()+printStatus (Status version connected) = do+  T.putStrLn $ "version:   " <> version+  case connected of+    Nothing -> T.putStrLn "keyboard:  none"+    Just ConnectedKeyboard {..} -> do+      let Layer layer = currentLayer+      T.putStrLn "keyboard:"+      T.putStrLn $ "  name:    " <> friendlyName+      T.putStrLn $ "  version: " <> firmwareVersion+      T.putStrLn $ "  layer:   " <> T.pack (show layer)++handleStatus :: Status -> KeymappClient IO Success+handleStatus status = do+  liftIO $ printStatus status+  pure $ Success True++footer :: O.Doc+footer =+  O.vsep+    [ "* Specifying server address"+    , P.reflow "By default the client will try connect to a Keymapp server running at the default Unix socket address ("+        <> "~/.config/keymapp/keymapp.socket"+        <> P.reflow ")."+          O.<+> P.reflow "However if you want to conenct to a server at another address, there are currently two ways to do so."+    , O.line+    , "** Different unix socket"+    , "  $ keymapp status --socket-path /tmp/keymapp.socket"+    , O.line+    , "** HTTP server"+    , "  $ keymapp status --address-host \"localhost\" --address-port \"3000\""+    ]++main :: IO ()+main = do+  let prefs =+        O.prefs $+          O.showHelpOnEmpty+            <> O.showHelpOnError+            <> O.columns 90+            <> O.helpShowGlobals+  opts <-+    O.customExecParser prefs $+      O.info (optsP <**> O.helper) $+        O.fullDesc+          <> O.header "Call a gRPC server running the Keymapp API in order to control your ZSA keyboard."+          <> O.footerDoc (Just footer)+  runOpts opts
+ generated/Proto/Keymapp.hs view
@@ -0,0 +1,3475 @@+{- This file was auto-generated from keymapp.proto by the proto-lens-protoc program. -}+{-# LANGUAGE ScopedTypeVariables, DataKinds, TypeFamilies, UndecidableInstances, GeneralizedNewtypeDeriving, MultiParamTypeClasses, FlexibleContexts, FlexibleInstances, PatternSynonyms, MagicHash, NoImplicitPrelude, DataKinds, BangPatterns, TypeApplications, OverloadedStrings, DerivingStrategies#-}+{-# OPTIONS_GHC -Wno-unused-imports#-}+{-# OPTIONS_GHC -Wno-duplicate-exports#-}+{-# OPTIONS_GHC -Wno-dodgy-exports#-}+module Proto.Keymapp (+        KeyboardService(..), BrightnessUpdateReply(),+        ConnectAnyKeyboardRequest(), ConnectKeyboardReply(),+        ConnectKeyboardRequest(), ConnectedKeyboard(),+        DecreaseBrightnessRequest(), DisconnectKeyboardReply(),+        DisconnectKeyboardRequest(), GetKeyboardsReply(),+        GetKeyboardsRequest(), GetStatusReply(), GetStatusRequest(),+        IncreaseBrightnessRequest(), Keyboard(), SetLayerReply(),+        SetLayerRequest(), SetRGBAllReply(), SetRGBAllRequest(),+        SetRGBLedReply(), SetRGBLedRequest(), SetStatusLedReply(),+        SetStatusLedRequest()+    ) where+import qualified Data.ProtoLens.Runtime.Control.DeepSeq as Control.DeepSeq+import qualified Data.ProtoLens.Runtime.Data.ProtoLens.Prism as Data.ProtoLens.Prism+import qualified Data.ProtoLens.Runtime.Prelude as Prelude+import qualified Data.ProtoLens.Runtime.Data.Int as Data.Int+import qualified Data.ProtoLens.Runtime.Data.Monoid as Data.Monoid+import qualified Data.ProtoLens.Runtime.Data.Word as Data.Word+import qualified Data.ProtoLens.Runtime.Data.ProtoLens as Data.ProtoLens+import qualified Data.ProtoLens.Runtime.Data.ProtoLens.Encoding.Bytes as Data.ProtoLens.Encoding.Bytes+import qualified Data.ProtoLens.Runtime.Data.ProtoLens.Encoding.Growing as Data.ProtoLens.Encoding.Growing+import qualified Data.ProtoLens.Runtime.Data.ProtoLens.Encoding.Parser.Unsafe as Data.ProtoLens.Encoding.Parser.Unsafe+import qualified Data.ProtoLens.Runtime.Data.ProtoLens.Encoding.Wire as Data.ProtoLens.Encoding.Wire+import qualified Data.ProtoLens.Runtime.Data.ProtoLens.Field as Data.ProtoLens.Field+import qualified Data.ProtoLens.Runtime.Data.ProtoLens.Message.Enum as Data.ProtoLens.Message.Enum+import qualified Data.ProtoLens.Runtime.Data.ProtoLens.Service.Types as Data.ProtoLens.Service.Types+import qualified Data.ProtoLens.Runtime.Lens.Family2 as Lens.Family2+import qualified Data.ProtoLens.Runtime.Lens.Family2.Unchecked as Lens.Family2.Unchecked+import qualified Data.ProtoLens.Runtime.Data.Text as Data.Text+import qualified Data.ProtoLens.Runtime.Data.Map as Data.Map+import qualified Data.ProtoLens.Runtime.Data.ByteString as Data.ByteString+import qualified Data.ProtoLens.Runtime.Data.ByteString.Char8 as Data.ByteString.Char8+import qualified Data.ProtoLens.Runtime.Data.Text.Encoding as Data.Text.Encoding+import qualified Data.ProtoLens.Runtime.Data.Vector as Data.Vector+import qualified Data.ProtoLens.Runtime.Data.Vector.Generic as Data.Vector.Generic+import qualified Data.ProtoLens.Runtime.Data.Vector.Unboxed as Data.Vector.Unboxed+import qualified Data.ProtoLens.Runtime.Text.Read as Text.Read+{- | Fields :+     +         * 'Proto.Keymapp_Fields.success' @:: Lens' BrightnessUpdateReply Prelude.Bool@ -}+data BrightnessUpdateReply+  = BrightnessUpdateReply'_constructor {_BrightnessUpdateReply'success :: !Prelude.Bool,+                                        _BrightnessUpdateReply'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show BrightnessUpdateReply where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField BrightnessUpdateReply "success" Prelude.Bool where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _BrightnessUpdateReply'success+           (\ x__ y__ -> x__ {_BrightnessUpdateReply'success = y__}))+        Prelude.id+instance Data.ProtoLens.Message BrightnessUpdateReply where+  messageName _ = Data.Text.pack "api.BrightnessUpdateReply"+  packedMessageDescriptor _+    = "\n\+      \\NAKBrightnessUpdateReply\DC2\CAN\n\+      \\asuccess\CAN\SOH \SOH(\bR\asuccess"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        success__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "success"+              (Data.ProtoLens.ScalarField Data.ProtoLens.BoolField ::+                 Data.ProtoLens.FieldTypeDescriptor Prelude.Bool)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"success")) ::+              Data.ProtoLens.FieldDescriptor BrightnessUpdateReply+      in+        Data.Map.fromList+          [(Data.ProtoLens.Tag 1, success__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _BrightnessUpdateReply'_unknownFields+        (\ x__ y__ -> x__ {_BrightnessUpdateReply'_unknownFields = y__})+  defMessage+    = BrightnessUpdateReply'_constructor+        {_BrightnessUpdateReply'success = Data.ProtoLens.fieldDefault,+         _BrightnessUpdateReply'_unknownFields = []}+  parseMessage+    = let+        loop ::+          BrightnessUpdateReply+          -> Data.ProtoLens.Encoding.Bytes.Parser BrightnessUpdateReply+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        8 -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          ((Prelude./=) 0) Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "success"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"success") y x)+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "BrightnessUpdateReply"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (let+                _v = Lens.Family2.view (Data.ProtoLens.Field.field @"success") _x+              in+                if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                    Data.Monoid.mempty+                else+                    (Data.Monoid.<>)+                      (Data.ProtoLens.Encoding.Bytes.putVarInt 8)+                      ((Prelude..)+                         Data.ProtoLens.Encoding.Bytes.putVarInt (\ b -> if b then 1 else 0)+                         _v))+             (Data.ProtoLens.Encoding.Wire.buildFieldSet+                (Lens.Family2.view Data.ProtoLens.unknownFields _x))+instance Control.DeepSeq.NFData BrightnessUpdateReply where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_BrightnessUpdateReply'_unknownFields x__)+             (Control.DeepSeq.deepseq (_BrightnessUpdateReply'success x__) ())+{- | Fields :+      -}+data ConnectAnyKeyboardRequest+  = ConnectAnyKeyboardRequest'_constructor {_ConnectAnyKeyboardRequest'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show ConnectAnyKeyboardRequest where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Message ConnectAnyKeyboardRequest where+  messageName _ = Data.Text.pack "api.ConnectAnyKeyboardRequest"+  packedMessageDescriptor _+    = "\n\+      \\EMConnectAnyKeyboardRequest"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag = let in Data.Map.fromList []+  unknownFields+    = Lens.Family2.Unchecked.lens+        _ConnectAnyKeyboardRequest'_unknownFields+        (\ x__ y__+           -> x__ {_ConnectAnyKeyboardRequest'_unknownFields = y__})+  defMessage+    = ConnectAnyKeyboardRequest'_constructor+        {_ConnectAnyKeyboardRequest'_unknownFields = []}+  parseMessage+    = let+        loop ::+          ConnectAnyKeyboardRequest+          -> Data.ProtoLens.Encoding.Bytes.Parser ConnectAnyKeyboardRequest+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "ConnectAnyKeyboardRequest"+  buildMessage+    = \ _x+        -> Data.ProtoLens.Encoding.Wire.buildFieldSet+             (Lens.Family2.view Data.ProtoLens.unknownFields _x)+instance Control.DeepSeq.NFData ConnectAnyKeyboardRequest where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_ConnectAnyKeyboardRequest'_unknownFields x__) ()+{- | Fields :+     +         * 'Proto.Keymapp_Fields.success' @:: Lens' ConnectKeyboardReply Prelude.Bool@ -}+data ConnectKeyboardReply+  = ConnectKeyboardReply'_constructor {_ConnectKeyboardReply'success :: !Prelude.Bool,+                                       _ConnectKeyboardReply'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show ConnectKeyboardReply where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField ConnectKeyboardReply "success" Prelude.Bool where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _ConnectKeyboardReply'success+           (\ x__ y__ -> x__ {_ConnectKeyboardReply'success = y__}))+        Prelude.id+instance Data.ProtoLens.Message ConnectKeyboardReply where+  messageName _ = Data.Text.pack "api.ConnectKeyboardReply"+  packedMessageDescriptor _+    = "\n\+      \\DC4ConnectKeyboardReply\DC2\CAN\n\+      \\asuccess\CAN\SOH \SOH(\bR\asuccess"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        success__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "success"+              (Data.ProtoLens.ScalarField Data.ProtoLens.BoolField ::+                 Data.ProtoLens.FieldTypeDescriptor Prelude.Bool)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"success")) ::+              Data.ProtoLens.FieldDescriptor ConnectKeyboardReply+      in+        Data.Map.fromList+          [(Data.ProtoLens.Tag 1, success__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _ConnectKeyboardReply'_unknownFields+        (\ x__ y__ -> x__ {_ConnectKeyboardReply'_unknownFields = y__})+  defMessage+    = ConnectKeyboardReply'_constructor+        {_ConnectKeyboardReply'success = Data.ProtoLens.fieldDefault,+         _ConnectKeyboardReply'_unknownFields = []}+  parseMessage+    = let+        loop ::+          ConnectKeyboardReply+          -> Data.ProtoLens.Encoding.Bytes.Parser ConnectKeyboardReply+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        8 -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          ((Prelude./=) 0) Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "success"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"success") y x)+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "ConnectKeyboardReply"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (let+                _v = Lens.Family2.view (Data.ProtoLens.Field.field @"success") _x+              in+                if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                    Data.Monoid.mempty+                else+                    (Data.Monoid.<>)+                      (Data.ProtoLens.Encoding.Bytes.putVarInt 8)+                      ((Prelude..)+                         Data.ProtoLens.Encoding.Bytes.putVarInt (\ b -> if b then 1 else 0)+                         _v))+             (Data.ProtoLens.Encoding.Wire.buildFieldSet+                (Lens.Family2.view Data.ProtoLens.unknownFields _x))+instance Control.DeepSeq.NFData ConnectKeyboardReply where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_ConnectKeyboardReply'_unknownFields x__)+             (Control.DeepSeq.deepseq (_ConnectKeyboardReply'success x__) ())+{- | Fields :+     +         * 'Proto.Keymapp_Fields.id' @:: Lens' ConnectKeyboardRequest Data.Int.Int32@ -}+data ConnectKeyboardRequest+  = ConnectKeyboardRequest'_constructor {_ConnectKeyboardRequest'id :: !Data.Int.Int32,+                                         _ConnectKeyboardRequest'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show ConnectKeyboardRequest where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField ConnectKeyboardRequest "id" Data.Int.Int32 where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _ConnectKeyboardRequest'id+           (\ x__ y__ -> x__ {_ConnectKeyboardRequest'id = y__}))+        Prelude.id+instance Data.ProtoLens.Message ConnectKeyboardRequest where+  messageName _ = Data.Text.pack "api.ConnectKeyboardRequest"+  packedMessageDescriptor _+    = "\n\+      \\SYNConnectKeyboardRequest\DC2\SO\n\+      \\STXid\CAN\SOH \SOH(\ENQR\STXid"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        id__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "id"+              (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"id")) ::+              Data.ProtoLens.FieldDescriptor ConnectKeyboardRequest+      in Data.Map.fromList [(Data.ProtoLens.Tag 1, id__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _ConnectKeyboardRequest'_unknownFields+        (\ x__ y__ -> x__ {_ConnectKeyboardRequest'_unknownFields = y__})+  defMessage+    = ConnectKeyboardRequest'_constructor+        {_ConnectKeyboardRequest'id = Data.ProtoLens.fieldDefault,+         _ConnectKeyboardRequest'_unknownFields = []}+  parseMessage+    = let+        loop ::+          ConnectKeyboardRequest+          -> Data.ProtoLens.Encoding.Bytes.Parser ConnectKeyboardRequest+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        8 -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          Prelude.fromIntegral+                                          Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "id"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"id") y x)+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "ConnectKeyboardRequest"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (let _v = Lens.Family2.view (Data.ProtoLens.Field.field @"id") _x+              in+                if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                    Data.Monoid.mempty+                else+                    (Data.Monoid.<>)+                      (Data.ProtoLens.Encoding.Bytes.putVarInt 8)+                      ((Prelude..)+                         Data.ProtoLens.Encoding.Bytes.putVarInt Prelude.fromIntegral _v))+             (Data.ProtoLens.Encoding.Wire.buildFieldSet+                (Lens.Family2.view Data.ProtoLens.unknownFields _x))+instance Control.DeepSeq.NFData ConnectKeyboardRequest where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_ConnectKeyboardRequest'_unknownFields x__)+             (Control.DeepSeq.deepseq (_ConnectKeyboardRequest'id x__) ())+{- | Fields :+     +         * 'Proto.Keymapp_Fields.friendlyName' @:: Lens' ConnectedKeyboard Data.Text.Text@+         * 'Proto.Keymapp_Fields.firmwareVersion' @:: Lens' ConnectedKeyboard Data.Text.Text@+         * 'Proto.Keymapp_Fields.currentLayer' @:: Lens' ConnectedKeyboard Data.Int.Int32@ -}+data ConnectedKeyboard+  = ConnectedKeyboard'_constructor {_ConnectedKeyboard'friendlyName :: !Data.Text.Text,+                                    _ConnectedKeyboard'firmwareVersion :: !Data.Text.Text,+                                    _ConnectedKeyboard'currentLayer :: !Data.Int.Int32,+                                    _ConnectedKeyboard'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show ConnectedKeyboard where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField ConnectedKeyboard "friendlyName" Data.Text.Text where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _ConnectedKeyboard'friendlyName+           (\ x__ y__ -> x__ {_ConnectedKeyboard'friendlyName = y__}))+        Prelude.id+instance Data.ProtoLens.Field.HasField ConnectedKeyboard "firmwareVersion" Data.Text.Text where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _ConnectedKeyboard'firmwareVersion+           (\ x__ y__ -> x__ {_ConnectedKeyboard'firmwareVersion = y__}))+        Prelude.id+instance Data.ProtoLens.Field.HasField ConnectedKeyboard "currentLayer" Data.Int.Int32 where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _ConnectedKeyboard'currentLayer+           (\ x__ y__ -> x__ {_ConnectedKeyboard'currentLayer = y__}))+        Prelude.id+instance Data.ProtoLens.Message ConnectedKeyboard where+  messageName _ = Data.Text.pack "api.ConnectedKeyboard"+  packedMessageDescriptor _+    = "\n\+      \\DC1ConnectedKeyboard\DC2#\n\+      \\rfriendly_name\CAN\SOH \SOH(\tR\ffriendlyName\DC2)\n\+      \\DLEfirmware_version\CAN\STX \SOH(\tR\SIfirmwareVersion\DC2#\n\+      \\rcurrent_layer\CAN\ETX \SOH(\ENQR\fcurrentLayer"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        friendlyName__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "friendly_name"+              (Data.ProtoLens.ScalarField Data.ProtoLens.StringField ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Text.Text)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional+                 (Data.ProtoLens.Field.field @"friendlyName")) ::+              Data.ProtoLens.FieldDescriptor ConnectedKeyboard+        firmwareVersion__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "firmware_version"+              (Data.ProtoLens.ScalarField Data.ProtoLens.StringField ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Text.Text)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional+                 (Data.ProtoLens.Field.field @"firmwareVersion")) ::+              Data.ProtoLens.FieldDescriptor ConnectedKeyboard+        currentLayer__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "current_layer"+              (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional+                 (Data.ProtoLens.Field.field @"currentLayer")) ::+              Data.ProtoLens.FieldDescriptor ConnectedKeyboard+      in+        Data.Map.fromList+          [(Data.ProtoLens.Tag 1, friendlyName__field_descriptor),+           (Data.ProtoLens.Tag 2, firmwareVersion__field_descriptor),+           (Data.ProtoLens.Tag 3, currentLayer__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _ConnectedKeyboard'_unknownFields+        (\ x__ y__ -> x__ {_ConnectedKeyboard'_unknownFields = y__})+  defMessage+    = ConnectedKeyboard'_constructor+        {_ConnectedKeyboard'friendlyName = Data.ProtoLens.fieldDefault,+         _ConnectedKeyboard'firmwareVersion = Data.ProtoLens.fieldDefault,+         _ConnectedKeyboard'currentLayer = Data.ProtoLens.fieldDefault,+         _ConnectedKeyboard'_unknownFields = []}+  parseMessage+    = let+        loop ::+          ConnectedKeyboard+          -> Data.ProtoLens.Encoding.Bytes.Parser ConnectedKeyboard+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        10+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (do len <- Data.ProtoLens.Encoding.Bytes.getVarInt+                                           Data.ProtoLens.Encoding.Bytes.getText+                                             (Prelude.fromIntegral len))+                                       "friendly_name"+                                loop+                                  (Lens.Family2.set+                                     (Data.ProtoLens.Field.field @"friendlyName") y x)+                        18+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (do len <- Data.ProtoLens.Encoding.Bytes.getVarInt+                                           Data.ProtoLens.Encoding.Bytes.getText+                                             (Prelude.fromIntegral len))+                                       "firmware_version"+                                loop+                                  (Lens.Family2.set+                                     (Data.ProtoLens.Field.field @"firmwareVersion") y x)+                        24+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          Prelude.fromIntegral+                                          Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "current_layer"+                                loop+                                  (Lens.Family2.set+                                     (Data.ProtoLens.Field.field @"currentLayer") y x)+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "ConnectedKeyboard"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (let+                _v+                  = Lens.Family2.view (Data.ProtoLens.Field.field @"friendlyName") _x+              in+                if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                    Data.Monoid.mempty+                else+                    (Data.Monoid.<>)+                      (Data.ProtoLens.Encoding.Bytes.putVarInt 10)+                      ((Prelude..)+                         (\ bs+                            -> (Data.Monoid.<>)+                                 (Data.ProtoLens.Encoding.Bytes.putVarInt+                                    (Prelude.fromIntegral (Data.ByteString.length bs)))+                                 (Data.ProtoLens.Encoding.Bytes.putBytes bs))+                         Data.Text.Encoding.encodeUtf8 _v))+             ((Data.Monoid.<>)+                (let+                   _v+                     = Lens.Family2.view+                         (Data.ProtoLens.Field.field @"firmwareVersion") _x+                 in+                   if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                       Data.Monoid.mempty+                   else+                       (Data.Monoid.<>)+                         (Data.ProtoLens.Encoding.Bytes.putVarInt 18)+                         ((Prelude..)+                            (\ bs+                               -> (Data.Monoid.<>)+                                    (Data.ProtoLens.Encoding.Bytes.putVarInt+                                       (Prelude.fromIntegral (Data.ByteString.length bs)))+                                    (Data.ProtoLens.Encoding.Bytes.putBytes bs))+                            Data.Text.Encoding.encodeUtf8 _v))+                ((Data.Monoid.<>)+                   (let+                      _v+                        = Lens.Family2.view (Data.ProtoLens.Field.field @"currentLayer") _x+                    in+                      if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                          Data.Monoid.mempty+                      else+                          (Data.Monoid.<>)+                            (Data.ProtoLens.Encoding.Bytes.putVarInt 24)+                            ((Prelude..)+                               Data.ProtoLens.Encoding.Bytes.putVarInt Prelude.fromIntegral _v))+                   (Data.ProtoLens.Encoding.Wire.buildFieldSet+                      (Lens.Family2.view Data.ProtoLens.unknownFields _x))))+instance Control.DeepSeq.NFData ConnectedKeyboard where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_ConnectedKeyboard'_unknownFields x__)+             (Control.DeepSeq.deepseq+                (_ConnectedKeyboard'friendlyName x__)+                (Control.DeepSeq.deepseq+                   (_ConnectedKeyboard'firmwareVersion x__)+                   (Control.DeepSeq.deepseq+                      (_ConnectedKeyboard'currentLayer x__) ())))+{- | Fields :+      -}+data DecreaseBrightnessRequest+  = DecreaseBrightnessRequest'_constructor {_DecreaseBrightnessRequest'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show DecreaseBrightnessRequest where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Message DecreaseBrightnessRequest where+  messageName _ = Data.Text.pack "api.DecreaseBrightnessRequest"+  packedMessageDescriptor _+    = "\n\+      \\EMDecreaseBrightnessRequest"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag = let in Data.Map.fromList []+  unknownFields+    = Lens.Family2.Unchecked.lens+        _DecreaseBrightnessRequest'_unknownFields+        (\ x__ y__+           -> x__ {_DecreaseBrightnessRequest'_unknownFields = y__})+  defMessage+    = DecreaseBrightnessRequest'_constructor+        {_DecreaseBrightnessRequest'_unknownFields = []}+  parseMessage+    = let+        loop ::+          DecreaseBrightnessRequest+          -> Data.ProtoLens.Encoding.Bytes.Parser DecreaseBrightnessRequest+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "DecreaseBrightnessRequest"+  buildMessage+    = \ _x+        -> Data.ProtoLens.Encoding.Wire.buildFieldSet+             (Lens.Family2.view Data.ProtoLens.unknownFields _x)+instance Control.DeepSeq.NFData DecreaseBrightnessRequest where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_DecreaseBrightnessRequest'_unknownFields x__) ()+{- | Fields :+     +         * 'Proto.Keymapp_Fields.success' @:: Lens' DisconnectKeyboardReply Prelude.Bool@ -}+data DisconnectKeyboardReply+  = DisconnectKeyboardReply'_constructor {_DisconnectKeyboardReply'success :: !Prelude.Bool,+                                          _DisconnectKeyboardReply'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show DisconnectKeyboardReply where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField DisconnectKeyboardReply "success" Prelude.Bool where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _DisconnectKeyboardReply'success+           (\ x__ y__ -> x__ {_DisconnectKeyboardReply'success = y__}))+        Prelude.id+instance Data.ProtoLens.Message DisconnectKeyboardReply where+  messageName _ = Data.Text.pack "api.DisconnectKeyboardReply"+  packedMessageDescriptor _+    = "\n\+      \\ETBDisconnectKeyboardReply\DC2\CAN\n\+      \\asuccess\CAN\SOH \SOH(\bR\asuccess"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        success__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "success"+              (Data.ProtoLens.ScalarField Data.ProtoLens.BoolField ::+                 Data.ProtoLens.FieldTypeDescriptor Prelude.Bool)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"success")) ::+              Data.ProtoLens.FieldDescriptor DisconnectKeyboardReply+      in+        Data.Map.fromList+          [(Data.ProtoLens.Tag 1, success__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _DisconnectKeyboardReply'_unknownFields+        (\ x__ y__ -> x__ {_DisconnectKeyboardReply'_unknownFields = y__})+  defMessage+    = DisconnectKeyboardReply'_constructor+        {_DisconnectKeyboardReply'success = Data.ProtoLens.fieldDefault,+         _DisconnectKeyboardReply'_unknownFields = []}+  parseMessage+    = let+        loop ::+          DisconnectKeyboardReply+          -> Data.ProtoLens.Encoding.Bytes.Parser DisconnectKeyboardReply+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        8 -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          ((Prelude./=) 0) Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "success"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"success") y x)+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "DisconnectKeyboardReply"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (let+                _v = Lens.Family2.view (Data.ProtoLens.Field.field @"success") _x+              in+                if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                    Data.Monoid.mempty+                else+                    (Data.Monoid.<>)+                      (Data.ProtoLens.Encoding.Bytes.putVarInt 8)+                      ((Prelude..)+                         Data.ProtoLens.Encoding.Bytes.putVarInt (\ b -> if b then 1 else 0)+                         _v))+             (Data.ProtoLens.Encoding.Wire.buildFieldSet+                (Lens.Family2.view Data.ProtoLens.unknownFields _x))+instance Control.DeepSeq.NFData DisconnectKeyboardReply where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_DisconnectKeyboardReply'_unknownFields x__)+             (Control.DeepSeq.deepseq (_DisconnectKeyboardReply'success x__) ())+{- | Fields :+      -}+data DisconnectKeyboardRequest+  = DisconnectKeyboardRequest'_constructor {_DisconnectKeyboardRequest'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show DisconnectKeyboardRequest where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Message DisconnectKeyboardRequest where+  messageName _ = Data.Text.pack "api.DisconnectKeyboardRequest"+  packedMessageDescriptor _+    = "\n\+      \\EMDisconnectKeyboardRequest"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag = let in Data.Map.fromList []+  unknownFields+    = Lens.Family2.Unchecked.lens+        _DisconnectKeyboardRequest'_unknownFields+        (\ x__ y__+           -> x__ {_DisconnectKeyboardRequest'_unknownFields = y__})+  defMessage+    = DisconnectKeyboardRequest'_constructor+        {_DisconnectKeyboardRequest'_unknownFields = []}+  parseMessage+    = let+        loop ::+          DisconnectKeyboardRequest+          -> Data.ProtoLens.Encoding.Bytes.Parser DisconnectKeyboardRequest+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "DisconnectKeyboardRequest"+  buildMessage+    = \ _x+        -> Data.ProtoLens.Encoding.Wire.buildFieldSet+             (Lens.Family2.view Data.ProtoLens.unknownFields _x)+instance Control.DeepSeq.NFData DisconnectKeyboardRequest where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_DisconnectKeyboardRequest'_unknownFields x__) ()+{- | Fields :+     +         * 'Proto.Keymapp_Fields.keyboards' @:: Lens' GetKeyboardsReply [Keyboard]@+         * 'Proto.Keymapp_Fields.vec'keyboards' @:: Lens' GetKeyboardsReply (Data.Vector.Vector Keyboard)@ -}+data GetKeyboardsReply+  = GetKeyboardsReply'_constructor {_GetKeyboardsReply'keyboards :: !(Data.Vector.Vector Keyboard),+                                    _GetKeyboardsReply'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show GetKeyboardsReply where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField GetKeyboardsReply "keyboards" [Keyboard] where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _GetKeyboardsReply'keyboards+           (\ x__ y__ -> x__ {_GetKeyboardsReply'keyboards = y__}))+        (Lens.Family2.Unchecked.lens+           Data.Vector.Generic.toList+           (\ _ y__ -> Data.Vector.Generic.fromList y__))+instance Data.ProtoLens.Field.HasField GetKeyboardsReply "vec'keyboards" (Data.Vector.Vector Keyboard) where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _GetKeyboardsReply'keyboards+           (\ x__ y__ -> x__ {_GetKeyboardsReply'keyboards = y__}))+        Prelude.id+instance Data.ProtoLens.Message GetKeyboardsReply where+  messageName _ = Data.Text.pack "api.GetKeyboardsReply"+  packedMessageDescriptor _+    = "\n\+      \\DC1GetKeyboardsReply\DC2+\n\+      \\tkeyboards\CAN\SOH \ETX(\v2\r.api.KeyboardR\tkeyboards"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        keyboards__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "keyboards"+              (Data.ProtoLens.MessageField Data.ProtoLens.MessageType ::+                 Data.ProtoLens.FieldTypeDescriptor Keyboard)+              (Data.ProtoLens.RepeatedField+                 Data.ProtoLens.Unpacked+                 (Data.ProtoLens.Field.field @"keyboards")) ::+              Data.ProtoLens.FieldDescriptor GetKeyboardsReply+      in+        Data.Map.fromList+          [(Data.ProtoLens.Tag 1, keyboards__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _GetKeyboardsReply'_unknownFields+        (\ x__ y__ -> x__ {_GetKeyboardsReply'_unknownFields = y__})+  defMessage+    = GetKeyboardsReply'_constructor+        {_GetKeyboardsReply'keyboards = Data.Vector.Generic.empty,+         _GetKeyboardsReply'_unknownFields = []}+  parseMessage+    = let+        loop ::+          GetKeyboardsReply+          -> Data.ProtoLens.Encoding.Growing.Growing Data.Vector.Vector Data.ProtoLens.Encoding.Growing.RealWorld Keyboard+             -> Data.ProtoLens.Encoding.Bytes.Parser GetKeyboardsReply+        loop x mutable'keyboards+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do frozen'keyboards <- Data.ProtoLens.Encoding.Parser.Unsafe.unsafeLiftIO+                                            (Data.ProtoLens.Encoding.Growing.unsafeFreeze+                                               mutable'keyboards)+                      (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t)+                           (Lens.Family2.set+                              (Data.ProtoLens.Field.field @"vec'keyboards") frozen'keyboards x))+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        10+                          -> do !y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                        (do len <- Data.ProtoLens.Encoding.Bytes.getVarInt+                                            Data.ProtoLens.Encoding.Bytes.isolate+                                              (Prelude.fromIntegral len)+                                              Data.ProtoLens.parseMessage)+                                        "keyboards"+                                v <- Data.ProtoLens.Encoding.Parser.Unsafe.unsafeLiftIO+                                       (Data.ProtoLens.Encoding.Growing.append mutable'keyboards y)+                                loop x v+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+                                  mutable'keyboards+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do mutable'keyboards <- Data.ProtoLens.Encoding.Parser.Unsafe.unsafeLiftIO+                                     Data.ProtoLens.Encoding.Growing.new+              loop Data.ProtoLens.defMessage mutable'keyboards)+          "GetKeyboardsReply"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (Data.ProtoLens.Encoding.Bytes.foldMapBuilder+                (\ _v+                   -> (Data.Monoid.<>)+                        (Data.ProtoLens.Encoding.Bytes.putVarInt 10)+                        ((Prelude..)+                           (\ bs+                              -> (Data.Monoid.<>)+                                   (Data.ProtoLens.Encoding.Bytes.putVarInt+                                      (Prelude.fromIntegral (Data.ByteString.length bs)))+                                   (Data.ProtoLens.Encoding.Bytes.putBytes bs))+                           Data.ProtoLens.encodeMessage _v))+                (Lens.Family2.view+                   (Data.ProtoLens.Field.field @"vec'keyboards") _x))+             (Data.ProtoLens.Encoding.Wire.buildFieldSet+                (Lens.Family2.view Data.ProtoLens.unknownFields _x))+instance Control.DeepSeq.NFData GetKeyboardsReply where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_GetKeyboardsReply'_unknownFields x__)+             (Control.DeepSeq.deepseq (_GetKeyboardsReply'keyboards x__) ())+{- | Fields :+      -}+data GetKeyboardsRequest+  = GetKeyboardsRequest'_constructor {_GetKeyboardsRequest'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show GetKeyboardsRequest where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Message GetKeyboardsRequest where+  messageName _ = Data.Text.pack "api.GetKeyboardsRequest"+  packedMessageDescriptor _+    = "\n\+      \\DC3GetKeyboardsRequest"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag = let in Data.Map.fromList []+  unknownFields+    = Lens.Family2.Unchecked.lens+        _GetKeyboardsRequest'_unknownFields+        (\ x__ y__ -> x__ {_GetKeyboardsRequest'_unknownFields = y__})+  defMessage+    = GetKeyboardsRequest'_constructor+        {_GetKeyboardsRequest'_unknownFields = []}+  parseMessage+    = let+        loop ::+          GetKeyboardsRequest+          -> Data.ProtoLens.Encoding.Bytes.Parser GetKeyboardsRequest+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "GetKeyboardsRequest"+  buildMessage+    = \ _x+        -> Data.ProtoLens.Encoding.Wire.buildFieldSet+             (Lens.Family2.view Data.ProtoLens.unknownFields _x)+instance Control.DeepSeq.NFData GetKeyboardsRequest where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_GetKeyboardsRequest'_unknownFields x__) ()+{- | Fields :+     +         * 'Proto.Keymapp_Fields.keymappVersion' @:: Lens' GetStatusReply Data.Text.Text@+         * 'Proto.Keymapp_Fields.connectedKeyboard' @:: Lens' GetStatusReply ConnectedKeyboard@+         * 'Proto.Keymapp_Fields.maybe'connectedKeyboard' @:: Lens' GetStatusReply (Prelude.Maybe ConnectedKeyboard)@ -}+data GetStatusReply+  = GetStatusReply'_constructor {_GetStatusReply'keymappVersion :: !Data.Text.Text,+                                 _GetStatusReply'connectedKeyboard :: !(Prelude.Maybe ConnectedKeyboard),+                                 _GetStatusReply'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show GetStatusReply where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField GetStatusReply "keymappVersion" Data.Text.Text where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _GetStatusReply'keymappVersion+           (\ x__ y__ -> x__ {_GetStatusReply'keymappVersion = y__}))+        Prelude.id+instance Data.ProtoLens.Field.HasField GetStatusReply "connectedKeyboard" ConnectedKeyboard where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _GetStatusReply'connectedKeyboard+           (\ x__ y__ -> x__ {_GetStatusReply'connectedKeyboard = y__}))+        (Data.ProtoLens.maybeLens Data.ProtoLens.defMessage)+instance Data.ProtoLens.Field.HasField GetStatusReply "maybe'connectedKeyboard" (Prelude.Maybe ConnectedKeyboard) where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _GetStatusReply'connectedKeyboard+           (\ x__ y__ -> x__ {_GetStatusReply'connectedKeyboard = y__}))+        Prelude.id+instance Data.ProtoLens.Message GetStatusReply where+  messageName _ = Data.Text.pack "api.GetStatusReply"+  packedMessageDescriptor _+    = "\n\+      \\SOGetStatusReply\DC2'\n\+      \\SIkeymapp_version\CAN\SOH \SOH(\tR\SOkeymappVersion\DC2E\n\+      \\DC2connected_keyboard\CAN\STX \SOH(\v2\SYN.api.ConnectedKeyboardR\DC1connectedKeyboard"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        keymappVersion__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "keymapp_version"+              (Data.ProtoLens.ScalarField Data.ProtoLens.StringField ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Text.Text)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional+                 (Data.ProtoLens.Field.field @"keymappVersion")) ::+              Data.ProtoLens.FieldDescriptor GetStatusReply+        connectedKeyboard__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "connected_keyboard"+              (Data.ProtoLens.MessageField Data.ProtoLens.MessageType ::+                 Data.ProtoLens.FieldTypeDescriptor ConnectedKeyboard)+              (Data.ProtoLens.OptionalField+                 (Data.ProtoLens.Field.field @"maybe'connectedKeyboard")) ::+              Data.ProtoLens.FieldDescriptor GetStatusReply+      in+        Data.Map.fromList+          [(Data.ProtoLens.Tag 1, keymappVersion__field_descriptor),+           (Data.ProtoLens.Tag 2, connectedKeyboard__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _GetStatusReply'_unknownFields+        (\ x__ y__ -> x__ {_GetStatusReply'_unknownFields = y__})+  defMessage+    = GetStatusReply'_constructor+        {_GetStatusReply'keymappVersion = Data.ProtoLens.fieldDefault,+         _GetStatusReply'connectedKeyboard = Prelude.Nothing,+         _GetStatusReply'_unknownFields = []}+  parseMessage+    = let+        loop ::+          GetStatusReply+          -> Data.ProtoLens.Encoding.Bytes.Parser GetStatusReply+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        10+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (do len <- Data.ProtoLens.Encoding.Bytes.getVarInt+                                           Data.ProtoLens.Encoding.Bytes.getText+                                             (Prelude.fromIntegral len))+                                       "keymapp_version"+                                loop+                                  (Lens.Family2.set+                                     (Data.ProtoLens.Field.field @"keymappVersion") y x)+                        18+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (do len <- Data.ProtoLens.Encoding.Bytes.getVarInt+                                           Data.ProtoLens.Encoding.Bytes.isolate+                                             (Prelude.fromIntegral len) Data.ProtoLens.parseMessage)+                                       "connected_keyboard"+                                loop+                                  (Lens.Family2.set+                                     (Data.ProtoLens.Field.field @"connectedKeyboard") y x)+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "GetStatusReply"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (let+                _v+                  = Lens.Family2.view+                      (Data.ProtoLens.Field.field @"keymappVersion") _x+              in+                if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                    Data.Monoid.mempty+                else+                    (Data.Monoid.<>)+                      (Data.ProtoLens.Encoding.Bytes.putVarInt 10)+                      ((Prelude..)+                         (\ bs+                            -> (Data.Monoid.<>)+                                 (Data.ProtoLens.Encoding.Bytes.putVarInt+                                    (Prelude.fromIntegral (Data.ByteString.length bs)))+                                 (Data.ProtoLens.Encoding.Bytes.putBytes bs))+                         Data.Text.Encoding.encodeUtf8 _v))+             ((Data.Monoid.<>)+                (case+                     Lens.Family2.view+                       (Data.ProtoLens.Field.field @"maybe'connectedKeyboard") _x+                 of+                   Prelude.Nothing -> Data.Monoid.mempty+                   (Prelude.Just _v)+                     -> (Data.Monoid.<>)+                          (Data.ProtoLens.Encoding.Bytes.putVarInt 18)+                          ((Prelude..)+                             (\ bs+                                -> (Data.Monoid.<>)+                                     (Data.ProtoLens.Encoding.Bytes.putVarInt+                                        (Prelude.fromIntegral (Data.ByteString.length bs)))+                                     (Data.ProtoLens.Encoding.Bytes.putBytes bs))+                             Data.ProtoLens.encodeMessage _v))+                (Data.ProtoLens.Encoding.Wire.buildFieldSet+                   (Lens.Family2.view Data.ProtoLens.unknownFields _x)))+instance Control.DeepSeq.NFData GetStatusReply where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_GetStatusReply'_unknownFields x__)+             (Control.DeepSeq.deepseq+                (_GetStatusReply'keymappVersion x__)+                (Control.DeepSeq.deepseq+                   (_GetStatusReply'connectedKeyboard x__) ()))+{- | Fields :+      -}+data GetStatusRequest+  = GetStatusRequest'_constructor {_GetStatusRequest'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show GetStatusRequest where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Message GetStatusRequest where+  messageName _ = Data.Text.pack "api.GetStatusRequest"+  packedMessageDescriptor _+    = "\n\+      \\DLEGetStatusRequest"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag = let in Data.Map.fromList []+  unknownFields+    = Lens.Family2.Unchecked.lens+        _GetStatusRequest'_unknownFields+        (\ x__ y__ -> x__ {_GetStatusRequest'_unknownFields = y__})+  defMessage+    = GetStatusRequest'_constructor+        {_GetStatusRequest'_unknownFields = []}+  parseMessage+    = let+        loop ::+          GetStatusRequest+          -> Data.ProtoLens.Encoding.Bytes.Parser GetStatusRequest+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "GetStatusRequest"+  buildMessage+    = \ _x+        -> Data.ProtoLens.Encoding.Wire.buildFieldSet+             (Lens.Family2.view Data.ProtoLens.unknownFields _x)+instance Control.DeepSeq.NFData GetStatusRequest where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_GetStatusRequest'_unknownFields x__) ()+{- | Fields :+      -}+data IncreaseBrightnessRequest+  = IncreaseBrightnessRequest'_constructor {_IncreaseBrightnessRequest'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show IncreaseBrightnessRequest where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Message IncreaseBrightnessRequest where+  messageName _ = Data.Text.pack "api.IncreaseBrightnessRequest"+  packedMessageDescriptor _+    = "\n\+      \\EMIncreaseBrightnessRequest"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag = let in Data.Map.fromList []+  unknownFields+    = Lens.Family2.Unchecked.lens+        _IncreaseBrightnessRequest'_unknownFields+        (\ x__ y__+           -> x__ {_IncreaseBrightnessRequest'_unknownFields = y__})+  defMessage+    = IncreaseBrightnessRequest'_constructor+        {_IncreaseBrightnessRequest'_unknownFields = []}+  parseMessage+    = let+        loop ::+          IncreaseBrightnessRequest+          -> Data.ProtoLens.Encoding.Bytes.Parser IncreaseBrightnessRequest+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "IncreaseBrightnessRequest"+  buildMessage+    = \ _x+        -> Data.ProtoLens.Encoding.Wire.buildFieldSet+             (Lens.Family2.view Data.ProtoLens.unknownFields _x)+instance Control.DeepSeq.NFData IncreaseBrightnessRequest where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_IncreaseBrightnessRequest'_unknownFields x__) ()+{- | Fields :+     +         * 'Proto.Keymapp_Fields.id' @:: Lens' Keyboard Data.Int.Int32@+         * 'Proto.Keymapp_Fields.friendlyName' @:: Lens' Keyboard Data.Text.Text@+         * 'Proto.Keymapp_Fields.isConnected' @:: Lens' Keyboard Prelude.Bool@ -}+data Keyboard+  = Keyboard'_constructor {_Keyboard'id :: !Data.Int.Int32,+                           _Keyboard'friendlyName :: !Data.Text.Text,+                           _Keyboard'isConnected :: !Prelude.Bool,+                           _Keyboard'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show Keyboard where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField Keyboard "id" Data.Int.Int32 where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _Keyboard'id (\ x__ y__ -> x__ {_Keyboard'id = y__}))+        Prelude.id+instance Data.ProtoLens.Field.HasField Keyboard "friendlyName" Data.Text.Text where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _Keyboard'friendlyName+           (\ x__ y__ -> x__ {_Keyboard'friendlyName = y__}))+        Prelude.id+instance Data.ProtoLens.Field.HasField Keyboard "isConnected" Prelude.Bool where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _Keyboard'isConnected+           (\ x__ y__ -> x__ {_Keyboard'isConnected = y__}))+        Prelude.id+instance Data.ProtoLens.Message Keyboard where+  messageName _ = Data.Text.pack "api.Keyboard"+  packedMessageDescriptor _+    = "\n\+      \\bKeyboard\DC2\SO\n\+      \\STXid\CAN\SOH \SOH(\ENQR\STXid\DC2#\n\+      \\rfriendly_name\CAN\STX \SOH(\tR\ffriendlyName\DC2!\n\+      \\fis_connected\CAN\ETX \SOH(\bR\visConnected"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        id__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "id"+              (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"id")) ::+              Data.ProtoLens.FieldDescriptor Keyboard+        friendlyName__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "friendly_name"+              (Data.ProtoLens.ScalarField Data.ProtoLens.StringField ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Text.Text)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional+                 (Data.ProtoLens.Field.field @"friendlyName")) ::+              Data.ProtoLens.FieldDescriptor Keyboard+        isConnected__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "is_connected"+              (Data.ProtoLens.ScalarField Data.ProtoLens.BoolField ::+                 Data.ProtoLens.FieldTypeDescriptor Prelude.Bool)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional+                 (Data.ProtoLens.Field.field @"isConnected")) ::+              Data.ProtoLens.FieldDescriptor Keyboard+      in+        Data.Map.fromList+          [(Data.ProtoLens.Tag 1, id__field_descriptor),+           (Data.ProtoLens.Tag 2, friendlyName__field_descriptor),+           (Data.ProtoLens.Tag 3, isConnected__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _Keyboard'_unknownFields+        (\ x__ y__ -> x__ {_Keyboard'_unknownFields = y__})+  defMessage+    = Keyboard'_constructor+        {_Keyboard'id = Data.ProtoLens.fieldDefault,+         _Keyboard'friendlyName = Data.ProtoLens.fieldDefault,+         _Keyboard'isConnected = Data.ProtoLens.fieldDefault,+         _Keyboard'_unknownFields = []}+  parseMessage+    = let+        loop :: Keyboard -> Data.ProtoLens.Encoding.Bytes.Parser Keyboard+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        8 -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          Prelude.fromIntegral+                                          Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "id"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"id") y x)+                        18+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (do len <- Data.ProtoLens.Encoding.Bytes.getVarInt+                                           Data.ProtoLens.Encoding.Bytes.getText+                                             (Prelude.fromIntegral len))+                                       "friendly_name"+                                loop+                                  (Lens.Family2.set+                                     (Data.ProtoLens.Field.field @"friendlyName") y x)+                        24+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          ((Prelude./=) 0) Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "is_connected"+                                loop+                                  (Lens.Family2.set (Data.ProtoLens.Field.field @"isConnected") y x)+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "Keyboard"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (let _v = Lens.Family2.view (Data.ProtoLens.Field.field @"id") _x+              in+                if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                    Data.Monoid.mempty+                else+                    (Data.Monoid.<>)+                      (Data.ProtoLens.Encoding.Bytes.putVarInt 8)+                      ((Prelude..)+                         Data.ProtoLens.Encoding.Bytes.putVarInt Prelude.fromIntegral _v))+             ((Data.Monoid.<>)+                (let+                   _v+                     = Lens.Family2.view (Data.ProtoLens.Field.field @"friendlyName") _x+                 in+                   if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                       Data.Monoid.mempty+                   else+                       (Data.Monoid.<>)+                         (Data.ProtoLens.Encoding.Bytes.putVarInt 18)+                         ((Prelude..)+                            (\ bs+                               -> (Data.Monoid.<>)+                                    (Data.ProtoLens.Encoding.Bytes.putVarInt+                                       (Prelude.fromIntegral (Data.ByteString.length bs)))+                                    (Data.ProtoLens.Encoding.Bytes.putBytes bs))+                            Data.Text.Encoding.encodeUtf8 _v))+                ((Data.Monoid.<>)+                   (let+                      _v+                        = Lens.Family2.view (Data.ProtoLens.Field.field @"isConnected") _x+                    in+                      if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                          Data.Monoid.mempty+                      else+                          (Data.Monoid.<>)+                            (Data.ProtoLens.Encoding.Bytes.putVarInt 24)+                            ((Prelude..)+                               Data.ProtoLens.Encoding.Bytes.putVarInt (\ b -> if b then 1 else 0)+                               _v))+                   (Data.ProtoLens.Encoding.Wire.buildFieldSet+                      (Lens.Family2.view Data.ProtoLens.unknownFields _x))))+instance Control.DeepSeq.NFData Keyboard where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_Keyboard'_unknownFields x__)+             (Control.DeepSeq.deepseq+                (_Keyboard'id x__)+                (Control.DeepSeq.deepseq+                   (_Keyboard'friendlyName x__)+                   (Control.DeepSeq.deepseq (_Keyboard'isConnected x__) ())))+{- | Fields :+     +         * 'Proto.Keymapp_Fields.success' @:: Lens' SetLayerReply Prelude.Bool@ -}+data SetLayerReply+  = SetLayerReply'_constructor {_SetLayerReply'success :: !Prelude.Bool,+                                _SetLayerReply'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show SetLayerReply where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField SetLayerReply "success" Prelude.Bool where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetLayerReply'success+           (\ x__ y__ -> x__ {_SetLayerReply'success = y__}))+        Prelude.id+instance Data.ProtoLens.Message SetLayerReply where+  messageName _ = Data.Text.pack "api.SetLayerReply"+  packedMessageDescriptor _+    = "\n\+      \\rSetLayerReply\DC2\CAN\n\+      \\asuccess\CAN\SOH \SOH(\bR\asuccess"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        success__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "success"+              (Data.ProtoLens.ScalarField Data.ProtoLens.BoolField ::+                 Data.ProtoLens.FieldTypeDescriptor Prelude.Bool)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"success")) ::+              Data.ProtoLens.FieldDescriptor SetLayerReply+      in+        Data.Map.fromList+          [(Data.ProtoLens.Tag 1, success__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _SetLayerReply'_unknownFields+        (\ x__ y__ -> x__ {_SetLayerReply'_unknownFields = y__})+  defMessage+    = SetLayerReply'_constructor+        {_SetLayerReply'success = Data.ProtoLens.fieldDefault,+         _SetLayerReply'_unknownFields = []}+  parseMessage+    = let+        loop ::+          SetLayerReply -> Data.ProtoLens.Encoding.Bytes.Parser SetLayerReply+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        8 -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          ((Prelude./=) 0) Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "success"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"success") y x)+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "SetLayerReply"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (let+                _v = Lens.Family2.view (Data.ProtoLens.Field.field @"success") _x+              in+                if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                    Data.Monoid.mempty+                else+                    (Data.Monoid.<>)+                      (Data.ProtoLens.Encoding.Bytes.putVarInt 8)+                      ((Prelude..)+                         Data.ProtoLens.Encoding.Bytes.putVarInt (\ b -> if b then 1 else 0)+                         _v))+             (Data.ProtoLens.Encoding.Wire.buildFieldSet+                (Lens.Family2.view Data.ProtoLens.unknownFields _x))+instance Control.DeepSeq.NFData SetLayerReply where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_SetLayerReply'_unknownFields x__)+             (Control.DeepSeq.deepseq (_SetLayerReply'success x__) ())+{- | Fields :+     +         * 'Proto.Keymapp_Fields.layer' @:: Lens' SetLayerRequest Data.Int.Int32@ -}+data SetLayerRequest+  = SetLayerRequest'_constructor {_SetLayerRequest'layer :: !Data.Int.Int32,+                                  _SetLayerRequest'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show SetLayerRequest where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField SetLayerRequest "layer" Data.Int.Int32 where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetLayerRequest'layer+           (\ x__ y__ -> x__ {_SetLayerRequest'layer = y__}))+        Prelude.id+instance Data.ProtoLens.Message SetLayerRequest where+  messageName _ = Data.Text.pack "api.SetLayerRequest"+  packedMessageDescriptor _+    = "\n\+      \\SISetLayerRequest\DC2\DC4\n\+      \\ENQlayer\CAN\SOH \SOH(\ENQR\ENQlayer"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        layer__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "layer"+              (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"layer")) ::+              Data.ProtoLens.FieldDescriptor SetLayerRequest+      in+        Data.Map.fromList [(Data.ProtoLens.Tag 1, layer__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _SetLayerRequest'_unknownFields+        (\ x__ y__ -> x__ {_SetLayerRequest'_unknownFields = y__})+  defMessage+    = SetLayerRequest'_constructor+        {_SetLayerRequest'layer = Data.ProtoLens.fieldDefault,+         _SetLayerRequest'_unknownFields = []}+  parseMessage+    = let+        loop ::+          SetLayerRequest+          -> Data.ProtoLens.Encoding.Bytes.Parser SetLayerRequest+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        8 -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          Prelude.fromIntegral+                                          Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "layer"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"layer") y x)+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "SetLayerRequest"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (let+                _v = Lens.Family2.view (Data.ProtoLens.Field.field @"layer") _x+              in+                if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                    Data.Monoid.mempty+                else+                    (Data.Monoid.<>)+                      (Data.ProtoLens.Encoding.Bytes.putVarInt 8)+                      ((Prelude..)+                         Data.ProtoLens.Encoding.Bytes.putVarInt Prelude.fromIntegral _v))+             (Data.ProtoLens.Encoding.Wire.buildFieldSet+                (Lens.Family2.view Data.ProtoLens.unknownFields _x))+instance Control.DeepSeq.NFData SetLayerRequest where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_SetLayerRequest'_unknownFields x__)+             (Control.DeepSeq.deepseq (_SetLayerRequest'layer x__) ())+{- | Fields :+     +         * 'Proto.Keymapp_Fields.success' @:: Lens' SetRGBAllReply Prelude.Bool@ -}+data SetRGBAllReply+  = SetRGBAllReply'_constructor {_SetRGBAllReply'success :: !Prelude.Bool,+                                 _SetRGBAllReply'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show SetRGBAllReply where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField SetRGBAllReply "success" Prelude.Bool where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetRGBAllReply'success+           (\ x__ y__ -> x__ {_SetRGBAllReply'success = y__}))+        Prelude.id+instance Data.ProtoLens.Message SetRGBAllReply where+  messageName _ = Data.Text.pack "api.SetRGBAllReply"+  packedMessageDescriptor _+    = "\n\+      \\SOSetRGBAllReply\DC2\CAN\n\+      \\asuccess\CAN\SOH \SOH(\bR\asuccess"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        success__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "success"+              (Data.ProtoLens.ScalarField Data.ProtoLens.BoolField ::+                 Data.ProtoLens.FieldTypeDescriptor Prelude.Bool)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"success")) ::+              Data.ProtoLens.FieldDescriptor SetRGBAllReply+      in+        Data.Map.fromList+          [(Data.ProtoLens.Tag 1, success__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _SetRGBAllReply'_unknownFields+        (\ x__ y__ -> x__ {_SetRGBAllReply'_unknownFields = y__})+  defMessage+    = SetRGBAllReply'_constructor+        {_SetRGBAllReply'success = Data.ProtoLens.fieldDefault,+         _SetRGBAllReply'_unknownFields = []}+  parseMessage+    = let+        loop ::+          SetRGBAllReply+          -> Data.ProtoLens.Encoding.Bytes.Parser SetRGBAllReply+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        8 -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          ((Prelude./=) 0) Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "success"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"success") y x)+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "SetRGBAllReply"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (let+                _v = Lens.Family2.view (Data.ProtoLens.Field.field @"success") _x+              in+                if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                    Data.Monoid.mempty+                else+                    (Data.Monoid.<>)+                      (Data.ProtoLens.Encoding.Bytes.putVarInt 8)+                      ((Prelude..)+                         Data.ProtoLens.Encoding.Bytes.putVarInt (\ b -> if b then 1 else 0)+                         _v))+             (Data.ProtoLens.Encoding.Wire.buildFieldSet+                (Lens.Family2.view Data.ProtoLens.unknownFields _x))+instance Control.DeepSeq.NFData SetRGBAllReply where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_SetRGBAllReply'_unknownFields x__)+             (Control.DeepSeq.deepseq (_SetRGBAllReply'success x__) ())+{- | Fields :+     +         * 'Proto.Keymapp_Fields.red' @:: Lens' SetRGBAllRequest Data.Int.Int32@+         * 'Proto.Keymapp_Fields.green' @:: Lens' SetRGBAllRequest Data.Int.Int32@+         * 'Proto.Keymapp_Fields.blue' @:: Lens' SetRGBAllRequest Data.Int.Int32@+         * 'Proto.Keymapp_Fields.sustain' @:: Lens' SetRGBAllRequest Data.Int.Int32@ -}+data SetRGBAllRequest+  = SetRGBAllRequest'_constructor {_SetRGBAllRequest'red :: !Data.Int.Int32,+                                   _SetRGBAllRequest'green :: !Data.Int.Int32,+                                   _SetRGBAllRequest'blue :: !Data.Int.Int32,+                                   _SetRGBAllRequest'sustain :: !Data.Int.Int32,+                                   _SetRGBAllRequest'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show SetRGBAllRequest where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField SetRGBAllRequest "red" Data.Int.Int32 where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetRGBAllRequest'red+           (\ x__ y__ -> x__ {_SetRGBAllRequest'red = y__}))+        Prelude.id+instance Data.ProtoLens.Field.HasField SetRGBAllRequest "green" Data.Int.Int32 where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetRGBAllRequest'green+           (\ x__ y__ -> x__ {_SetRGBAllRequest'green = y__}))+        Prelude.id+instance Data.ProtoLens.Field.HasField SetRGBAllRequest "blue" Data.Int.Int32 where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetRGBAllRequest'blue+           (\ x__ y__ -> x__ {_SetRGBAllRequest'blue = y__}))+        Prelude.id+instance Data.ProtoLens.Field.HasField SetRGBAllRequest "sustain" Data.Int.Int32 where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetRGBAllRequest'sustain+           (\ x__ y__ -> x__ {_SetRGBAllRequest'sustain = y__}))+        Prelude.id+instance Data.ProtoLens.Message SetRGBAllRequest where+  messageName _ = Data.Text.pack "api.SetRGBAllRequest"+  packedMessageDescriptor _+    = "\n\+      \\DLESetRGBAllRequest\DC2\DLE\n\+      \\ETXred\CAN\SOH \SOH(\ENQR\ETXred\DC2\DC4\n\+      \\ENQgreen\CAN\STX \SOH(\ENQR\ENQgreen\DC2\DC2\n\+      \\EOTblue\CAN\ETX \SOH(\ENQR\EOTblue\DC2\CAN\n\+      \\asustain\CAN\EOT \SOH(\ENQR\asustain"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        red__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "red"+              (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"red")) ::+              Data.ProtoLens.FieldDescriptor SetRGBAllRequest+        green__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "green"+              (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"green")) ::+              Data.ProtoLens.FieldDescriptor SetRGBAllRequest+        blue__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "blue"+              (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"blue")) ::+              Data.ProtoLens.FieldDescriptor SetRGBAllRequest+        sustain__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "sustain"+              (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"sustain")) ::+              Data.ProtoLens.FieldDescriptor SetRGBAllRequest+      in+        Data.Map.fromList+          [(Data.ProtoLens.Tag 1, red__field_descriptor),+           (Data.ProtoLens.Tag 2, green__field_descriptor),+           (Data.ProtoLens.Tag 3, blue__field_descriptor),+           (Data.ProtoLens.Tag 4, sustain__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _SetRGBAllRequest'_unknownFields+        (\ x__ y__ -> x__ {_SetRGBAllRequest'_unknownFields = y__})+  defMessage+    = SetRGBAllRequest'_constructor+        {_SetRGBAllRequest'red = Data.ProtoLens.fieldDefault,+         _SetRGBAllRequest'green = Data.ProtoLens.fieldDefault,+         _SetRGBAllRequest'blue = Data.ProtoLens.fieldDefault,+         _SetRGBAllRequest'sustain = Data.ProtoLens.fieldDefault,+         _SetRGBAllRequest'_unknownFields = []}+  parseMessage+    = let+        loop ::+          SetRGBAllRequest+          -> Data.ProtoLens.Encoding.Bytes.Parser SetRGBAllRequest+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        8 -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          Prelude.fromIntegral+                                          Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "red"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"red") y x)+                        16+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          Prelude.fromIntegral+                                          Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "green"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"green") y x)+                        24+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          Prelude.fromIntegral+                                          Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "blue"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"blue") y x)+                        32+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          Prelude.fromIntegral+                                          Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "sustain"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"sustain") y x)+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "SetRGBAllRequest"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (let _v = Lens.Family2.view (Data.ProtoLens.Field.field @"red") _x+              in+                if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                    Data.Monoid.mempty+                else+                    (Data.Monoid.<>)+                      (Data.ProtoLens.Encoding.Bytes.putVarInt 8)+                      ((Prelude..)+                         Data.ProtoLens.Encoding.Bytes.putVarInt Prelude.fromIntegral _v))+             ((Data.Monoid.<>)+                (let+                   _v = Lens.Family2.view (Data.ProtoLens.Field.field @"green") _x+                 in+                   if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                       Data.Monoid.mempty+                   else+                       (Data.Monoid.<>)+                         (Data.ProtoLens.Encoding.Bytes.putVarInt 16)+                         ((Prelude..)+                            Data.ProtoLens.Encoding.Bytes.putVarInt Prelude.fromIntegral _v))+                ((Data.Monoid.<>)+                   (let _v = Lens.Family2.view (Data.ProtoLens.Field.field @"blue") _x+                    in+                      if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                          Data.Monoid.mempty+                      else+                          (Data.Monoid.<>)+                            (Data.ProtoLens.Encoding.Bytes.putVarInt 24)+                            ((Prelude..)+                               Data.ProtoLens.Encoding.Bytes.putVarInt Prelude.fromIntegral _v))+                   ((Data.Monoid.<>)+                      (let+                         _v = Lens.Family2.view (Data.ProtoLens.Field.field @"sustain") _x+                       in+                         if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                             Data.Monoid.mempty+                         else+                             (Data.Monoid.<>)+                               (Data.ProtoLens.Encoding.Bytes.putVarInt 32)+                               ((Prelude..)+                                  Data.ProtoLens.Encoding.Bytes.putVarInt Prelude.fromIntegral _v))+                      (Data.ProtoLens.Encoding.Wire.buildFieldSet+                         (Lens.Family2.view Data.ProtoLens.unknownFields _x)))))+instance Control.DeepSeq.NFData SetRGBAllRequest where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_SetRGBAllRequest'_unknownFields x__)+             (Control.DeepSeq.deepseq+                (_SetRGBAllRequest'red x__)+                (Control.DeepSeq.deepseq+                   (_SetRGBAllRequest'green x__)+                   (Control.DeepSeq.deepseq+                      (_SetRGBAllRequest'blue x__)+                      (Control.DeepSeq.deepseq (_SetRGBAllRequest'sustain x__) ()))))+{- | Fields :+     +         * 'Proto.Keymapp_Fields.success' @:: Lens' SetRGBLedReply Prelude.Bool@ -}+data SetRGBLedReply+  = SetRGBLedReply'_constructor {_SetRGBLedReply'success :: !Prelude.Bool,+                                 _SetRGBLedReply'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show SetRGBLedReply where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField SetRGBLedReply "success" Prelude.Bool where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetRGBLedReply'success+           (\ x__ y__ -> x__ {_SetRGBLedReply'success = y__}))+        Prelude.id+instance Data.ProtoLens.Message SetRGBLedReply where+  messageName _ = Data.Text.pack "api.SetRGBLedReply"+  packedMessageDescriptor _+    = "\n\+      \\SOSetRGBLedReply\DC2\CAN\n\+      \\asuccess\CAN\SOH \SOH(\bR\asuccess"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        success__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "success"+              (Data.ProtoLens.ScalarField Data.ProtoLens.BoolField ::+                 Data.ProtoLens.FieldTypeDescriptor Prelude.Bool)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"success")) ::+              Data.ProtoLens.FieldDescriptor SetRGBLedReply+      in+        Data.Map.fromList+          [(Data.ProtoLens.Tag 1, success__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _SetRGBLedReply'_unknownFields+        (\ x__ y__ -> x__ {_SetRGBLedReply'_unknownFields = y__})+  defMessage+    = SetRGBLedReply'_constructor+        {_SetRGBLedReply'success = Data.ProtoLens.fieldDefault,+         _SetRGBLedReply'_unknownFields = []}+  parseMessage+    = let+        loop ::+          SetRGBLedReply+          -> Data.ProtoLens.Encoding.Bytes.Parser SetRGBLedReply+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        8 -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          ((Prelude./=) 0) Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "success"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"success") y x)+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "SetRGBLedReply"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (let+                _v = Lens.Family2.view (Data.ProtoLens.Field.field @"success") _x+              in+                if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                    Data.Monoid.mempty+                else+                    (Data.Monoid.<>)+                      (Data.ProtoLens.Encoding.Bytes.putVarInt 8)+                      ((Prelude..)+                         Data.ProtoLens.Encoding.Bytes.putVarInt (\ b -> if b then 1 else 0)+                         _v))+             (Data.ProtoLens.Encoding.Wire.buildFieldSet+                (Lens.Family2.view Data.ProtoLens.unknownFields _x))+instance Control.DeepSeq.NFData SetRGBLedReply where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_SetRGBLedReply'_unknownFields x__)+             (Control.DeepSeq.deepseq (_SetRGBLedReply'success x__) ())+{- | Fields :+     +         * 'Proto.Keymapp_Fields.led' @:: Lens' SetRGBLedRequest Data.Int.Int32@+         * 'Proto.Keymapp_Fields.red' @:: Lens' SetRGBLedRequest Data.Int.Int32@+         * 'Proto.Keymapp_Fields.green' @:: Lens' SetRGBLedRequest Data.Int.Int32@+         * 'Proto.Keymapp_Fields.blue' @:: Lens' SetRGBLedRequest Data.Int.Int32@+         * 'Proto.Keymapp_Fields.sustain' @:: Lens' SetRGBLedRequest Data.Int.Int32@ -}+data SetRGBLedRequest+  = SetRGBLedRequest'_constructor {_SetRGBLedRequest'led :: !Data.Int.Int32,+                                   _SetRGBLedRequest'red :: !Data.Int.Int32,+                                   _SetRGBLedRequest'green :: !Data.Int.Int32,+                                   _SetRGBLedRequest'blue :: !Data.Int.Int32,+                                   _SetRGBLedRequest'sustain :: !Data.Int.Int32,+                                   _SetRGBLedRequest'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show SetRGBLedRequest where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField SetRGBLedRequest "led" Data.Int.Int32 where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetRGBLedRequest'led+           (\ x__ y__ -> x__ {_SetRGBLedRequest'led = y__}))+        Prelude.id+instance Data.ProtoLens.Field.HasField SetRGBLedRequest "red" Data.Int.Int32 where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetRGBLedRequest'red+           (\ x__ y__ -> x__ {_SetRGBLedRequest'red = y__}))+        Prelude.id+instance Data.ProtoLens.Field.HasField SetRGBLedRequest "green" Data.Int.Int32 where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetRGBLedRequest'green+           (\ x__ y__ -> x__ {_SetRGBLedRequest'green = y__}))+        Prelude.id+instance Data.ProtoLens.Field.HasField SetRGBLedRequest "blue" Data.Int.Int32 where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetRGBLedRequest'blue+           (\ x__ y__ -> x__ {_SetRGBLedRequest'blue = y__}))+        Prelude.id+instance Data.ProtoLens.Field.HasField SetRGBLedRequest "sustain" Data.Int.Int32 where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetRGBLedRequest'sustain+           (\ x__ y__ -> x__ {_SetRGBLedRequest'sustain = y__}))+        Prelude.id+instance Data.ProtoLens.Message SetRGBLedRequest where+  messageName _ = Data.Text.pack "api.SetRGBLedRequest"+  packedMessageDescriptor _+    = "\n\+      \\DLESetRGBLedRequest\DC2\DLE\n\+      \\ETXled\CAN\SOH \SOH(\ENQR\ETXled\DC2\DLE\n\+      \\ETXred\CAN\STX \SOH(\ENQR\ETXred\DC2\DC4\n\+      \\ENQgreen\CAN\ETX \SOH(\ENQR\ENQgreen\DC2\DC2\n\+      \\EOTblue\CAN\EOT \SOH(\ENQR\EOTblue\DC2\CAN\n\+      \\asustain\CAN\ENQ \SOH(\ENQR\asustain"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        led__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "led"+              (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"led")) ::+              Data.ProtoLens.FieldDescriptor SetRGBLedRequest+        red__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "red"+              (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"red")) ::+              Data.ProtoLens.FieldDescriptor SetRGBLedRequest+        green__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "green"+              (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"green")) ::+              Data.ProtoLens.FieldDescriptor SetRGBLedRequest+        blue__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "blue"+              (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"blue")) ::+              Data.ProtoLens.FieldDescriptor SetRGBLedRequest+        sustain__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "sustain"+              (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"sustain")) ::+              Data.ProtoLens.FieldDescriptor SetRGBLedRequest+      in+        Data.Map.fromList+          [(Data.ProtoLens.Tag 1, led__field_descriptor),+           (Data.ProtoLens.Tag 2, red__field_descriptor),+           (Data.ProtoLens.Tag 3, green__field_descriptor),+           (Data.ProtoLens.Tag 4, blue__field_descriptor),+           (Data.ProtoLens.Tag 5, sustain__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _SetRGBLedRequest'_unknownFields+        (\ x__ y__ -> x__ {_SetRGBLedRequest'_unknownFields = y__})+  defMessage+    = SetRGBLedRequest'_constructor+        {_SetRGBLedRequest'led = Data.ProtoLens.fieldDefault,+         _SetRGBLedRequest'red = Data.ProtoLens.fieldDefault,+         _SetRGBLedRequest'green = Data.ProtoLens.fieldDefault,+         _SetRGBLedRequest'blue = Data.ProtoLens.fieldDefault,+         _SetRGBLedRequest'sustain = Data.ProtoLens.fieldDefault,+         _SetRGBLedRequest'_unknownFields = []}+  parseMessage+    = let+        loop ::+          SetRGBLedRequest+          -> Data.ProtoLens.Encoding.Bytes.Parser SetRGBLedRequest+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        8 -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          Prelude.fromIntegral+                                          Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "led"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"led") y x)+                        16+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          Prelude.fromIntegral+                                          Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "red"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"red") y x)+                        24+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          Prelude.fromIntegral+                                          Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "green"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"green") y x)+                        32+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          Prelude.fromIntegral+                                          Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "blue"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"blue") y x)+                        40+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          Prelude.fromIntegral+                                          Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "sustain"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"sustain") y x)+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "SetRGBLedRequest"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (let _v = Lens.Family2.view (Data.ProtoLens.Field.field @"led") _x+              in+                if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                    Data.Monoid.mempty+                else+                    (Data.Monoid.<>)+                      (Data.ProtoLens.Encoding.Bytes.putVarInt 8)+                      ((Prelude..)+                         Data.ProtoLens.Encoding.Bytes.putVarInt Prelude.fromIntegral _v))+             ((Data.Monoid.<>)+                (let _v = Lens.Family2.view (Data.ProtoLens.Field.field @"red") _x+                 in+                   if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                       Data.Monoid.mempty+                   else+                       (Data.Monoid.<>)+                         (Data.ProtoLens.Encoding.Bytes.putVarInt 16)+                         ((Prelude..)+                            Data.ProtoLens.Encoding.Bytes.putVarInt Prelude.fromIntegral _v))+                ((Data.Monoid.<>)+                   (let+                      _v = Lens.Family2.view (Data.ProtoLens.Field.field @"green") _x+                    in+                      if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                          Data.Monoid.mempty+                      else+                          (Data.Monoid.<>)+                            (Data.ProtoLens.Encoding.Bytes.putVarInt 24)+                            ((Prelude..)+                               Data.ProtoLens.Encoding.Bytes.putVarInt Prelude.fromIntegral _v))+                   ((Data.Monoid.<>)+                      (let _v = Lens.Family2.view (Data.ProtoLens.Field.field @"blue") _x+                       in+                         if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                             Data.Monoid.mempty+                         else+                             (Data.Monoid.<>)+                               (Data.ProtoLens.Encoding.Bytes.putVarInt 32)+                               ((Prelude..)+                                  Data.ProtoLens.Encoding.Bytes.putVarInt Prelude.fromIntegral _v))+                      ((Data.Monoid.<>)+                         (let+                            _v = Lens.Family2.view (Data.ProtoLens.Field.field @"sustain") _x+                          in+                            if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                                Data.Monoid.mempty+                            else+                                (Data.Monoid.<>)+                                  (Data.ProtoLens.Encoding.Bytes.putVarInt 40)+                                  ((Prelude..)+                                     Data.ProtoLens.Encoding.Bytes.putVarInt Prelude.fromIntegral+                                     _v))+                         (Data.ProtoLens.Encoding.Wire.buildFieldSet+                            (Lens.Family2.view Data.ProtoLens.unknownFields _x))))))+instance Control.DeepSeq.NFData SetRGBLedRequest where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_SetRGBLedRequest'_unknownFields x__)+             (Control.DeepSeq.deepseq+                (_SetRGBLedRequest'led x__)+                (Control.DeepSeq.deepseq+                   (_SetRGBLedRequest'red x__)+                   (Control.DeepSeq.deepseq+                      (_SetRGBLedRequest'green x__)+                      (Control.DeepSeq.deepseq+                         (_SetRGBLedRequest'blue x__)+                         (Control.DeepSeq.deepseq (_SetRGBLedRequest'sustain x__) ())))))+{- | Fields :+     +         * 'Proto.Keymapp_Fields.success' @:: Lens' SetStatusLedReply Prelude.Bool@ -}+data SetStatusLedReply+  = SetStatusLedReply'_constructor {_SetStatusLedReply'success :: !Prelude.Bool,+                                    _SetStatusLedReply'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show SetStatusLedReply where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField SetStatusLedReply "success" Prelude.Bool where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetStatusLedReply'success+           (\ x__ y__ -> x__ {_SetStatusLedReply'success = y__}))+        Prelude.id+instance Data.ProtoLens.Message SetStatusLedReply where+  messageName _ = Data.Text.pack "api.SetStatusLedReply"+  packedMessageDescriptor _+    = "\n\+      \\DC1SetStatusLedReply\DC2\CAN\n\+      \\asuccess\CAN\SOH \SOH(\bR\asuccess"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        success__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "success"+              (Data.ProtoLens.ScalarField Data.ProtoLens.BoolField ::+                 Data.ProtoLens.FieldTypeDescriptor Prelude.Bool)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"success")) ::+              Data.ProtoLens.FieldDescriptor SetStatusLedReply+      in+        Data.Map.fromList+          [(Data.ProtoLens.Tag 1, success__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _SetStatusLedReply'_unknownFields+        (\ x__ y__ -> x__ {_SetStatusLedReply'_unknownFields = y__})+  defMessage+    = SetStatusLedReply'_constructor+        {_SetStatusLedReply'success = Data.ProtoLens.fieldDefault,+         _SetStatusLedReply'_unknownFields = []}+  parseMessage+    = let+        loop ::+          SetStatusLedReply+          -> Data.ProtoLens.Encoding.Bytes.Parser SetStatusLedReply+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        8 -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          ((Prelude./=) 0) Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "success"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"success") y x)+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "SetStatusLedReply"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (let+                _v = Lens.Family2.view (Data.ProtoLens.Field.field @"success") _x+              in+                if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                    Data.Monoid.mempty+                else+                    (Data.Monoid.<>)+                      (Data.ProtoLens.Encoding.Bytes.putVarInt 8)+                      ((Prelude..)+                         Data.ProtoLens.Encoding.Bytes.putVarInt (\ b -> if b then 1 else 0)+                         _v))+             (Data.ProtoLens.Encoding.Wire.buildFieldSet+                (Lens.Family2.view Data.ProtoLens.unknownFields _x))+instance Control.DeepSeq.NFData SetStatusLedReply where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_SetStatusLedReply'_unknownFields x__)+             (Control.DeepSeq.deepseq (_SetStatusLedReply'success x__) ())+{- | Fields :+     +         * 'Proto.Keymapp_Fields.led' @:: Lens' SetStatusLedRequest Data.Int.Int32@+         * 'Proto.Keymapp_Fields.on' @:: Lens' SetStatusLedRequest Prelude.Bool@+         * 'Proto.Keymapp_Fields.sustain' @:: Lens' SetStatusLedRequest Data.Int.Int32@ -}+data SetStatusLedRequest+  = SetStatusLedRequest'_constructor {_SetStatusLedRequest'led :: !Data.Int.Int32,+                                      _SetStatusLedRequest'on :: !Prelude.Bool,+                                      _SetStatusLedRequest'sustain :: !Data.Int.Int32,+                                      _SetStatusLedRequest'_unknownFields :: !Data.ProtoLens.FieldSet}+  deriving stock (Prelude.Eq, Prelude.Ord)+instance Prelude.Show SetStatusLedRequest where+  showsPrec _ __x __s+    = Prelude.showChar+        '{'+        (Prelude.showString+           (Data.ProtoLens.showMessageShort __x) (Prelude.showChar '}' __s))+instance Data.ProtoLens.Field.HasField SetStatusLedRequest "led" Data.Int.Int32 where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetStatusLedRequest'led+           (\ x__ y__ -> x__ {_SetStatusLedRequest'led = y__}))+        Prelude.id+instance Data.ProtoLens.Field.HasField SetStatusLedRequest "on" Prelude.Bool where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetStatusLedRequest'on+           (\ x__ y__ -> x__ {_SetStatusLedRequest'on = y__}))+        Prelude.id+instance Data.ProtoLens.Field.HasField SetStatusLedRequest "sustain" Data.Int.Int32 where+  fieldOf _+    = (Prelude..)+        (Lens.Family2.Unchecked.lens+           _SetStatusLedRequest'sustain+           (\ x__ y__ -> x__ {_SetStatusLedRequest'sustain = y__}))+        Prelude.id+instance Data.ProtoLens.Message SetStatusLedRequest where+  messageName _ = Data.Text.pack "api.SetStatusLedRequest"+  packedMessageDescriptor _+    = "\n\+      \\DC3SetStatusLedRequest\DC2\DLE\n\+      \\ETXled\CAN\SOH \SOH(\ENQR\ETXled\DC2\SO\n\+      \\STXon\CAN\STX \SOH(\bR\STXon\DC2\CAN\n\+      \\asustain\CAN\ETX \SOH(\ENQR\asustain"+  packedFileDescriptor _ = packedFileDescriptor+  fieldsByTag+    = let+        led__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "led"+              (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"led")) ::+              Data.ProtoLens.FieldDescriptor SetStatusLedRequest+        on__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "on"+              (Data.ProtoLens.ScalarField Data.ProtoLens.BoolField ::+                 Data.ProtoLens.FieldTypeDescriptor Prelude.Bool)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"on")) ::+              Data.ProtoLens.FieldDescriptor SetStatusLedRequest+        sustain__field_descriptor+          = Data.ProtoLens.FieldDescriptor+              "sustain"+              (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::+                 Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)+              (Data.ProtoLens.PlainField+                 Data.ProtoLens.Optional (Data.ProtoLens.Field.field @"sustain")) ::+              Data.ProtoLens.FieldDescriptor SetStatusLedRequest+      in+        Data.Map.fromList+          [(Data.ProtoLens.Tag 1, led__field_descriptor),+           (Data.ProtoLens.Tag 2, on__field_descriptor),+           (Data.ProtoLens.Tag 3, sustain__field_descriptor)]+  unknownFields+    = Lens.Family2.Unchecked.lens+        _SetStatusLedRequest'_unknownFields+        (\ x__ y__ -> x__ {_SetStatusLedRequest'_unknownFields = y__})+  defMessage+    = SetStatusLedRequest'_constructor+        {_SetStatusLedRequest'led = Data.ProtoLens.fieldDefault,+         _SetStatusLedRequest'on = Data.ProtoLens.fieldDefault,+         _SetStatusLedRequest'sustain = Data.ProtoLens.fieldDefault,+         _SetStatusLedRequest'_unknownFields = []}+  parseMessage+    = let+        loop ::+          SetStatusLedRequest+          -> Data.ProtoLens.Encoding.Bytes.Parser SetStatusLedRequest+        loop x+          = do end <- Data.ProtoLens.Encoding.Bytes.atEnd+               if end then+                   do (let missing = []+                       in+                         if Prelude.null missing then+                             Prelude.return ()+                         else+                             Prelude.fail+                               ((Prelude.++)+                                  "Missing required fields: "+                                  (Prelude.show (missing :: [Prelude.String]))))+                      Prelude.return+                        (Lens.Family2.over+                           Data.ProtoLens.unknownFields (\ !t -> Prelude.reverse t) x)+               else+                   do tag <- Data.ProtoLens.Encoding.Bytes.getVarInt+                      case tag of+                        8 -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          Prelude.fromIntegral+                                          Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "led"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"led") y x)+                        16+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          ((Prelude./=) 0) Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "on"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"on") y x)+                        24+                          -> do y <- (Data.ProtoLens.Encoding.Bytes.<?>)+                                       (Prelude.fmap+                                          Prelude.fromIntegral+                                          Data.ProtoLens.Encoding.Bytes.getVarInt)+                                       "sustain"+                                loop (Lens.Family2.set (Data.ProtoLens.Field.field @"sustain") y x)+                        wire+                          -> do !y <- Data.ProtoLens.Encoding.Wire.parseTaggedValueFromWire+                                        wire+                                loop+                                  (Lens.Family2.over+                                     Data.ProtoLens.unknownFields (\ !t -> (:) y t) x)+      in+        (Data.ProtoLens.Encoding.Bytes.<?>)+          (do loop Data.ProtoLens.defMessage) "SetStatusLedRequest"+  buildMessage+    = \ _x+        -> (Data.Monoid.<>)+             (let _v = Lens.Family2.view (Data.ProtoLens.Field.field @"led") _x+              in+                if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                    Data.Monoid.mempty+                else+                    (Data.Monoid.<>)+                      (Data.ProtoLens.Encoding.Bytes.putVarInt 8)+                      ((Prelude..)+                         Data.ProtoLens.Encoding.Bytes.putVarInt Prelude.fromIntegral _v))+             ((Data.Monoid.<>)+                (let _v = Lens.Family2.view (Data.ProtoLens.Field.field @"on") _x+                 in+                   if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                       Data.Monoid.mempty+                   else+                       (Data.Monoid.<>)+                         (Data.ProtoLens.Encoding.Bytes.putVarInt 16)+                         ((Prelude..)+                            Data.ProtoLens.Encoding.Bytes.putVarInt (\ b -> if b then 1 else 0)+                            _v))+                ((Data.Monoid.<>)+                   (let+                      _v = Lens.Family2.view (Data.ProtoLens.Field.field @"sustain") _x+                    in+                      if (Prelude.==) _v Data.ProtoLens.fieldDefault then+                          Data.Monoid.mempty+                      else+                          (Data.Monoid.<>)+                            (Data.ProtoLens.Encoding.Bytes.putVarInt 24)+                            ((Prelude..)+                               Data.ProtoLens.Encoding.Bytes.putVarInt Prelude.fromIntegral _v))+                   (Data.ProtoLens.Encoding.Wire.buildFieldSet+                      (Lens.Family2.view Data.ProtoLens.unknownFields _x))))+instance Control.DeepSeq.NFData SetStatusLedRequest where+  rnf+    = \ x__+        -> Control.DeepSeq.deepseq+             (_SetStatusLedRequest'_unknownFields x__)+             (Control.DeepSeq.deepseq+                (_SetStatusLedRequest'led x__)+                (Control.DeepSeq.deepseq+                   (_SetStatusLedRequest'on x__)+                   (Control.DeepSeq.deepseq (_SetStatusLedRequest'sustain x__) ())))+data KeyboardService = KeyboardService {}+instance Data.ProtoLens.Service.Types.Service KeyboardService where+  type ServiceName KeyboardService = "KeyboardService"+  type ServicePackage KeyboardService = "api"+  type ServiceMethods KeyboardService = '["connectAnyKeyboard",+                                          "connectKeyboard",+                                          "decreaseBrightness",+                                          "disconnectKeyboard",+                                          "getKeyboards",+                                          "getStatus",+                                          "increaseBrightness",+                                          "setLayer",+                                          "setRGBAll",+                                          "setRGBLed",+                                          "setStatusLed",+                                          "unsetLayer"]+  packedServiceDescriptor _+    = "\n\+      \\SIKeyboardService\DC29\n\+      \\tGetStatus\DC2\NAK.api.GetStatusRequest\SUB\DC3.api.GetStatusReply\"\NUL\DC2B\n\+      \\fGetKeyboards\DC2\CAN.api.GetKeyboardsRequest\SUB\SYN.api.GetKeyboardsReply\"\NUL\DC2K\n\+      \\SIConnectKeyboard\DC2\ESC.api.ConnectKeyboardRequest\SUB\EM.api.ConnectKeyboardReply\"\NUL\DC2Q\n\+      \\DC2ConnectAnyKeyboard\DC2\RS.api.ConnectAnyKeyboardRequest\SUB\EM.api.ConnectKeyboardReply\"\NUL\DC2T\n\+      \\DC2DisconnectKeyboard\DC2\RS.api.DisconnectKeyboardRequest\SUB\FS.api.DisconnectKeyboardReply\"\NUL\DC26\n\+      \\bSetLayer\DC2\DC4.api.SetLayerRequest\SUB\DC2.api.SetLayerReply\"\NUL\DC28\n\+      \\n\+      \UnsetLayer\DC2\DC4.api.SetLayerRequest\SUB\DC2.api.SetLayerReply\"\NUL\DC29\n\+      \\tSetRGBLed\DC2\NAK.api.SetRGBLedRequest\SUB\DC3.api.SetRGBLedReply\"\NUL\DC29\n\+      \\tSetRGBAll\DC2\NAK.api.SetRGBAllRequest\SUB\DC3.api.SetRGBAllReply\"\NUL\DC2B\n\+      \\fSetStatusLed\DC2\CAN.api.SetStatusLedRequest\SUB\SYN.api.SetStatusLedReply\"\NUL\DC2R\n\+      \\DC2IncreaseBrightness\DC2\RS.api.IncreaseBrightnessRequest\SUB\SUB.api.BrightnessUpdateReply\"\NUL\DC2R\n\+      \\DC2DecreaseBrightness\DC2\RS.api.DecreaseBrightnessRequest\SUB\SUB.api.BrightnessUpdateReply\"\NUL"+instance Data.ProtoLens.Service.Types.HasMethodImpl KeyboardService "getStatus" where+  type MethodName KeyboardService "getStatus" = "GetStatus"+  type MethodInput KeyboardService "getStatus" = GetStatusRequest+  type MethodOutput KeyboardService "getStatus" = GetStatusReply+  type MethodStreamingType KeyboardService "getStatus" = 'Data.ProtoLens.Service.Types.NonStreaming+instance Data.ProtoLens.Service.Types.HasMethodImpl KeyboardService "getKeyboards" where+  type MethodName KeyboardService "getKeyboards" = "GetKeyboards"+  type MethodInput KeyboardService "getKeyboards" = GetKeyboardsRequest+  type MethodOutput KeyboardService "getKeyboards" = GetKeyboardsReply+  type MethodStreamingType KeyboardService "getKeyboards" = 'Data.ProtoLens.Service.Types.NonStreaming+instance Data.ProtoLens.Service.Types.HasMethodImpl KeyboardService "connectKeyboard" where+  type MethodName KeyboardService "connectKeyboard" = "ConnectKeyboard"+  type MethodInput KeyboardService "connectKeyboard" = ConnectKeyboardRequest+  type MethodOutput KeyboardService "connectKeyboard" = ConnectKeyboardReply+  type MethodStreamingType KeyboardService "connectKeyboard" = 'Data.ProtoLens.Service.Types.NonStreaming+instance Data.ProtoLens.Service.Types.HasMethodImpl KeyboardService "connectAnyKeyboard" where+  type MethodName KeyboardService "connectAnyKeyboard" = "ConnectAnyKeyboard"+  type MethodInput KeyboardService "connectAnyKeyboard" = ConnectAnyKeyboardRequest+  type MethodOutput KeyboardService "connectAnyKeyboard" = ConnectKeyboardReply+  type MethodStreamingType KeyboardService "connectAnyKeyboard" = 'Data.ProtoLens.Service.Types.NonStreaming+instance Data.ProtoLens.Service.Types.HasMethodImpl KeyboardService "disconnectKeyboard" where+  type MethodName KeyboardService "disconnectKeyboard" = "DisconnectKeyboard"+  type MethodInput KeyboardService "disconnectKeyboard" = DisconnectKeyboardRequest+  type MethodOutput KeyboardService "disconnectKeyboard" = DisconnectKeyboardReply+  type MethodStreamingType KeyboardService "disconnectKeyboard" = 'Data.ProtoLens.Service.Types.NonStreaming+instance Data.ProtoLens.Service.Types.HasMethodImpl KeyboardService "setLayer" where+  type MethodName KeyboardService "setLayer" = "SetLayer"+  type MethodInput KeyboardService "setLayer" = SetLayerRequest+  type MethodOutput KeyboardService "setLayer" = SetLayerReply+  type MethodStreamingType KeyboardService "setLayer" = 'Data.ProtoLens.Service.Types.NonStreaming+instance Data.ProtoLens.Service.Types.HasMethodImpl KeyboardService "unsetLayer" where+  type MethodName KeyboardService "unsetLayer" = "UnsetLayer"+  type MethodInput KeyboardService "unsetLayer" = SetLayerRequest+  type MethodOutput KeyboardService "unsetLayer" = SetLayerReply+  type MethodStreamingType KeyboardService "unsetLayer" = 'Data.ProtoLens.Service.Types.NonStreaming+instance Data.ProtoLens.Service.Types.HasMethodImpl KeyboardService "setRGBLed" where+  type MethodName KeyboardService "setRGBLed" = "SetRGBLed"+  type MethodInput KeyboardService "setRGBLed" = SetRGBLedRequest+  type MethodOutput KeyboardService "setRGBLed" = SetRGBLedReply+  type MethodStreamingType KeyboardService "setRGBLed" = 'Data.ProtoLens.Service.Types.NonStreaming+instance Data.ProtoLens.Service.Types.HasMethodImpl KeyboardService "setRGBAll" where+  type MethodName KeyboardService "setRGBAll" = "SetRGBAll"+  type MethodInput KeyboardService "setRGBAll" = SetRGBAllRequest+  type MethodOutput KeyboardService "setRGBAll" = SetRGBAllReply+  type MethodStreamingType KeyboardService "setRGBAll" = 'Data.ProtoLens.Service.Types.NonStreaming+instance Data.ProtoLens.Service.Types.HasMethodImpl KeyboardService "setStatusLed" where+  type MethodName KeyboardService "setStatusLed" = "SetStatusLed"+  type MethodInput KeyboardService "setStatusLed" = SetStatusLedRequest+  type MethodOutput KeyboardService "setStatusLed" = SetStatusLedReply+  type MethodStreamingType KeyboardService "setStatusLed" = 'Data.ProtoLens.Service.Types.NonStreaming+instance Data.ProtoLens.Service.Types.HasMethodImpl KeyboardService "increaseBrightness" where+  type MethodName KeyboardService "increaseBrightness" = "IncreaseBrightness"+  type MethodInput KeyboardService "increaseBrightness" = IncreaseBrightnessRequest+  type MethodOutput KeyboardService "increaseBrightness" = BrightnessUpdateReply+  type MethodStreamingType KeyboardService "increaseBrightness" = 'Data.ProtoLens.Service.Types.NonStreaming+instance Data.ProtoLens.Service.Types.HasMethodImpl KeyboardService "decreaseBrightness" where+  type MethodName KeyboardService "decreaseBrightness" = "DecreaseBrightness"+  type MethodInput KeyboardService "decreaseBrightness" = DecreaseBrightnessRequest+  type MethodOutput KeyboardService "decreaseBrightness" = BrightnessUpdateReply+  type MethodStreamingType KeyboardService "decreaseBrightness" = 'Data.ProtoLens.Service.Types.NonStreaming+packedFileDescriptor :: Data.ByteString.ByteString+packedFileDescriptor+  = "\n\+    \\rkeymapp.proto\DC2\ETXapi\"b\n\+    \\bKeyboard\DC2\SO\n\+    \\STXid\CAN\SOH \SOH(\ENQR\STXid\DC2#\n\+    \\rfriendly_name\CAN\STX \SOH(\tR\ffriendlyName\DC2!\n\+    \\fis_connected\CAN\ETX \SOH(\bR\visConnected\"\136\SOH\n\+    \\DC1ConnectedKeyboard\DC2#\n\+    \\rfriendly_name\CAN\SOH \SOH(\tR\ffriendlyName\DC2)\n\+    \\DLEfirmware_version\CAN\STX \SOH(\tR\SIfirmwareVersion\DC2#\n\+    \\rcurrent_layer\CAN\ETX \SOH(\ENQR\fcurrentLayer\"\DC2\n\+    \\DLEGetStatusRequest\"\128\SOH\n\+    \\SOGetStatusReply\DC2'\n\+    \\SIkeymapp_version\CAN\SOH \SOH(\tR\SOkeymappVersion\DC2E\n\+    \\DC2connected_keyboard\CAN\STX \SOH(\v2\SYN.api.ConnectedKeyboardR\DC1connectedKeyboard\"\NAK\n\+    \\DC3GetKeyboardsRequest\"@\n\+    \\DC1GetKeyboardsReply\DC2+\n\+    \\tkeyboards\CAN\SOH \ETX(\v2\r.api.KeyboardR\tkeyboards\"\ESC\n\+    \\EMConnectAnyKeyboardRequest\"(\n\+    \\SYNConnectKeyboardRequest\DC2\SO\n\+    \\STXid\CAN\SOH \SOH(\ENQR\STXid\"0\n\+    \\DC4ConnectKeyboardReply\DC2\CAN\n\+    \\asuccess\CAN\SOH \SOH(\bR\asuccess\"\ESC\n\+    \\EMDisconnectKeyboardRequest\"3\n\+    \\ETBDisconnectKeyboardReply\DC2\CAN\n\+    \\asuccess\CAN\SOH \SOH(\bR\asuccess\"'\n\+    \\SISetLayerRequest\DC2\DC4\n\+    \\ENQlayer\CAN\SOH \SOH(\ENQR\ENQlayer\")\n\+    \\rSetLayerReply\DC2\CAN\n\+    \\asuccess\CAN\SOH \SOH(\bR\asuccess\"z\n\+    \\DLESetRGBLedRequest\DC2\DLE\n\+    \\ETXled\CAN\SOH \SOH(\ENQR\ETXled\DC2\DLE\n\+    \\ETXred\CAN\STX \SOH(\ENQR\ETXred\DC2\DC4\n\+    \\ENQgreen\CAN\ETX \SOH(\ENQR\ENQgreen\DC2\DC2\n\+    \\EOTblue\CAN\EOT \SOH(\ENQR\EOTblue\DC2\CAN\n\+    \\asustain\CAN\ENQ \SOH(\ENQR\asustain\"*\n\+    \\SOSetRGBLedReply\DC2\CAN\n\+    \\asuccess\CAN\SOH \SOH(\bR\asuccess\"h\n\+    \\DLESetRGBAllRequest\DC2\DLE\n\+    \\ETXred\CAN\SOH \SOH(\ENQR\ETXred\DC2\DC4\n\+    \\ENQgreen\CAN\STX \SOH(\ENQR\ENQgreen\DC2\DC2\n\+    \\EOTblue\CAN\ETX \SOH(\ENQR\EOTblue\DC2\CAN\n\+    \\asustain\CAN\EOT \SOH(\ENQR\asustain\"*\n\+    \\SOSetRGBAllReply\DC2\CAN\n\+    \\asuccess\CAN\SOH \SOH(\bR\asuccess\"Q\n\+    \\DC3SetStatusLedRequest\DC2\DLE\n\+    \\ETXled\CAN\SOH \SOH(\ENQR\ETXled\DC2\SO\n\+    \\STXon\CAN\STX \SOH(\bR\STXon\DC2\CAN\n\+    \\asustain\CAN\ETX \SOH(\ENQR\asustain\"-\n\+    \\DC1SetStatusLedReply\DC2\CAN\n\+    \\asuccess\CAN\SOH \SOH(\bR\asuccess\"\ESC\n\+    \\EMIncreaseBrightnessRequest\"\ESC\n\+    \\EMDecreaseBrightnessRequest\"1\n\+    \\NAKBrightnessUpdateReply\DC2\CAN\n\+    \\asuccess\CAN\SOH \SOH(\bR\asuccess2\218\ACK\n\+    \\SIKeyboardService\DC29\n\+    \\tGetStatus\DC2\NAK.api.GetStatusRequest\SUB\DC3.api.GetStatusReply\"\NUL\DC2B\n\+    \\fGetKeyboards\DC2\CAN.api.GetKeyboardsRequest\SUB\SYN.api.GetKeyboardsReply\"\NUL\DC2K\n\+    \\SIConnectKeyboard\DC2\ESC.api.ConnectKeyboardRequest\SUB\EM.api.ConnectKeyboardReply\"\NUL\DC2Q\n\+    \\DC2ConnectAnyKeyboard\DC2\RS.api.ConnectAnyKeyboardRequest\SUB\EM.api.ConnectKeyboardReply\"\NUL\DC2T\n\+    \\DC2DisconnectKeyboard\DC2\RS.api.DisconnectKeyboardRequest\SUB\FS.api.DisconnectKeyboardReply\"\NUL\DC26\n\+    \\bSetLayer\DC2\DC4.api.SetLayerRequest\SUB\DC2.api.SetLayerReply\"\NUL\DC28\n\+    \\n\+    \UnsetLayer\DC2\DC4.api.SetLayerRequest\SUB\DC2.api.SetLayerReply\"\NUL\DC29\n\+    \\tSetRGBLed\DC2\NAK.api.SetRGBLedRequest\SUB\DC3.api.SetRGBLedReply\"\NUL\DC29\n\+    \\tSetRGBAll\DC2\NAK.api.SetRGBAllRequest\SUB\DC3.api.SetRGBAllReply\"\NUL\DC2B\n\+    \\fSetStatusLed\DC2\CAN.api.SetStatusLedRequest\SUB\SYN.api.SetStatusLedReply\"\NUL\DC2R\n\+    \\DC2IncreaseBrightness\DC2\RS.api.IncreaseBrightnessRequest\SUB\SUB.api.BrightnessUpdateReply\"\NUL\DC2R\n\+    \\DC2DecreaseBrightness\DC2\RS.api.DecreaseBrightnessRequest\SUB\SUB.api.BrightnessUpdateReply\"\NULB\FSZ\SUBgithub.com/zsa/keymapp/apiJ\147\ESC\n\+    \\ACK\DC2\EOT\NUL\NULu\SOH\n\+    \\b\n\+    \\SOH\f\DC2\ETX\NUL\NUL\DC2\n\+    \\b\n\+    \\SOH\b\DC2\ETX\STX\NUL1\n\+    \\t\n\+    \\STX\b\v\DC2\ETX\STX\NUL1\n\+    \\b\n\+    \\SOH\STX\DC2\ETX\ETX\NUL\f\n\+    \\n\+    \\n\+    \\STX\EOT\NUL\DC2\EOT\ENQ\NUL\t\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\NUL\SOH\DC2\ETX\ENQ\b\DLE\n\+    \\v\n\+    \\EOT\EOT\NUL\STX\NUL\DC2\ETX\ACK\EOT\DC1\n\+    \\f\n\+    \\ENQ\EOT\NUL\STX\NUL\ENQ\DC2\ETX\ACK\EOT\t\n\+    \\f\n\+    \\ENQ\EOT\NUL\STX\NUL\SOH\DC2\ETX\ACK\n\+    \\f\n\+    \\f\n\+    \\ENQ\EOT\NUL\STX\NUL\ETX\DC2\ETX\ACK\SI\DLE\n\+    \\v\n\+    \\EOT\EOT\NUL\STX\SOH\DC2\ETX\a\EOT\GS\n\+    \\f\n\+    \\ENQ\EOT\NUL\STX\SOH\ENQ\DC2\ETX\a\EOT\n\+    \\n\+    \\f\n\+    \\ENQ\EOT\NUL\STX\SOH\SOH\DC2\ETX\a\v\CAN\n\+    \\f\n\+    \\ENQ\EOT\NUL\STX\SOH\ETX\DC2\ETX\a\ESC\FS\n\+    \\v\n\+    \\EOT\EOT\NUL\STX\STX\DC2\ETX\b\EOT\SUB\n\+    \\f\n\+    \\ENQ\EOT\NUL\STX\STX\ENQ\DC2\ETX\b\EOT\b\n\+    \\f\n\+    \\ENQ\EOT\NUL\STX\STX\SOH\DC2\ETX\b\t\NAK\n\+    \\f\n\+    \\ENQ\EOT\NUL\STX\STX\ETX\DC2\ETX\b\CAN\EM\n\+    \\n\+    \\n\+    \\STX\EOT\SOH\DC2\EOT\v\NUL\SI\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\SOH\SOH\DC2\ETX\v\b\EM\n\+    \\v\n\+    \\EOT\EOT\SOH\STX\NUL\DC2\ETX\f\EOT\GS\n\+    \\f\n\+    \\ENQ\EOT\SOH\STX\NUL\ENQ\DC2\ETX\f\EOT\n\+    \\n\+    \\f\n\+    \\ENQ\EOT\SOH\STX\NUL\SOH\DC2\ETX\f\v\CAN\n\+    \\f\n\+    \\ENQ\EOT\SOH\STX\NUL\ETX\DC2\ETX\f\ESC\FS\n\+    \\v\n\+    \\EOT\EOT\SOH\STX\SOH\DC2\ETX\r\EOT \n\+    \\f\n\+    \\ENQ\EOT\SOH\STX\SOH\ENQ\DC2\ETX\r\EOT\n\+    \\n\+    \\f\n\+    \\ENQ\EOT\SOH\STX\SOH\SOH\DC2\ETX\r\v\ESC\n\+    \\f\n\+    \\ENQ\EOT\SOH\STX\SOH\ETX\DC2\ETX\r\RS\US\n\+    \\v\n\+    \\EOT\EOT\SOH\STX\STX\DC2\ETX\SO\EOT\FS\n\+    \\f\n\+    \\ENQ\EOT\SOH\STX\STX\ENQ\DC2\ETX\SO\EOT\t\n\+    \\f\n\+    \\ENQ\EOT\SOH\STX\STX\SOH\DC2\ETX\SO\n\+    \\ETB\n\+    \\f\n\+    \\ENQ\EOT\SOH\STX\STX\ETX\DC2\ETX\SO\SUB\ESC\n\+    \\t\n\+    \\STX\EOT\STX\DC2\ETX\DC1\NUL\ESC\n\+    \\n\+    \\n\+    \\ETX\EOT\STX\SOH\DC2\ETX\DC1\b\CAN\n\+    \\n\+    \\n\+    \\STX\EOT\ETX\DC2\EOT\DC2\NUL\NAK\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\ETX\SOH\DC2\ETX\DC2\b\SYN\n\+    \\v\n\+    \\EOT\EOT\ETX\STX\NUL\DC2\ETX\DC3\EOT\US\n\+    \\f\n\+    \\ENQ\EOT\ETX\STX\NUL\ENQ\DC2\ETX\DC3\EOT\n\+    \\n\+    \\f\n\+    \\ENQ\EOT\ETX\STX\NUL\SOH\DC2\ETX\DC3\v\SUB\n\+    \\f\n\+    \\ENQ\EOT\ETX\STX\NUL\ETX\DC2\ETX\DC3\GS\RS\n\+    \\v\n\+    \\EOT\EOT\ETX\STX\SOH\DC2\ETX\DC4\EOT-\n\+    \\f\n\+    \\ENQ\EOT\ETX\STX\SOH\ACK\DC2\ETX\DC4\EOT\NAK\n\+    \\f\n\+    \\ENQ\EOT\ETX\STX\SOH\SOH\DC2\ETX\DC4\SYN(\n\+    \\f\n\+    \\ENQ\EOT\ETX\STX\SOH\ETX\DC2\ETX\DC4+,\n\+    \\t\n\+    \\STX\EOT\EOT\DC2\ETX\ETB\NUL\RS\n\+    \\n\+    \\n\+    \\ETX\EOT\EOT\SOH\DC2\ETX\ETB\b\ESC\n\+    \\n\+    \\n\+    \\STX\EOT\ENQ\DC2\EOT\CAN\NUL\SUB\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\ENQ\SOH\DC2\ETX\CAN\b\EM\n\+    \\v\n\+    \\EOT\EOT\ENQ\STX\NUL\DC2\ETX\EM\EOT$\n\+    \\f\n\+    \\ENQ\EOT\ENQ\STX\NUL\EOT\DC2\ETX\EM\EOT\f\n\+    \\f\n\+    \\ENQ\EOT\ENQ\STX\NUL\ACK\DC2\ETX\EM\r\NAK\n\+    \\f\n\+    \\ENQ\EOT\ENQ\STX\NUL\SOH\DC2\ETX\EM\SYN\US\n\+    \\f\n\+    \\ENQ\EOT\ENQ\STX\NUL\ETX\DC2\ETX\EM\"#\n\+    \\t\n\+    \\STX\EOT\ACK\DC2\ETX\FS\NUL$\n\+    \\n\+    \\n\+    \\ETX\EOT\ACK\SOH\DC2\ETX\FS\b!\n\+    \\n\+    \\n\+    \\STX\EOT\a\DC2\EOT\RS\NUL \SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\a\SOH\DC2\ETX\RS\b\RS\n\+    \\v\n\+    \\EOT\EOT\a\STX\NUL\DC2\ETX\US\EOT\DC1\n\+    \\f\n\+    \\ENQ\EOT\a\STX\NUL\ENQ\DC2\ETX\US\EOT\t\n\+    \\f\n\+    \\ENQ\EOT\a\STX\NUL\SOH\DC2\ETX\US\n\+    \\f\n\+    \\f\n\+    \\ENQ\EOT\a\STX\NUL\ETX\DC2\ETX\US\SI\DLE\n\+    \\n\+    \\n\+    \\STX\EOT\b\DC2\EOT!\NUL#\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\b\SOH\DC2\ETX!\b\FS\n\+    \\v\n\+    \\EOT\EOT\b\STX\NUL\DC2\ETX\"\EOT\NAK\n\+    \\f\n\+    \\ENQ\EOT\b\STX\NUL\ENQ\DC2\ETX\"\EOT\b\n\+    \\f\n\+    \\ENQ\EOT\b\STX\NUL\SOH\DC2\ETX\"\t\DLE\n\+    \\f\n\+    \\ENQ\EOT\b\STX\NUL\ETX\DC2\ETX\"\DC3\DC4\n\+    \\n\+    \\n\+    \\STX\EOT\t\DC2\EOT%\NUL&\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\t\SOH\DC2\ETX%\b!\n\+    \\n\+    \\n\+    \\STX\EOT\n\+    \\DC2\EOT(\NUL*\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\n\+    \\SOH\DC2\ETX(\b\US\n\+    \\v\n\+    \\EOT\EOT\n\+    \\STX\NUL\DC2\ETX)\EOT\NAK\n\+    \\f\n\+    \\ENQ\EOT\n\+    \\STX\NUL\ENQ\DC2\ETX)\EOT\b\n\+    \\f\n\+    \\ENQ\EOT\n\+    \\STX\NUL\SOH\DC2\ETX)\t\DLE\n\+    \\f\n\+    \\ENQ\EOT\n\+    \\STX\NUL\ETX\DC2\ETX)\DC3\DC4\n\+    \\n\+    \\n\+    \\STX\EOT\v\DC2\EOT,\NUL.\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\v\SOH\DC2\ETX,\b\ETB\n\+    \\v\n\+    \\EOT\EOT\v\STX\NUL\DC2\ETX-\EOT\DC4\n\+    \\f\n\+    \\ENQ\EOT\v\STX\NUL\ENQ\DC2\ETX-\EOT\t\n\+    \\f\n\+    \\ENQ\EOT\v\STX\NUL\SOH\DC2\ETX-\n\+    \\SI\n\+    \\f\n\+    \\ENQ\EOT\v\STX\NUL\ETX\DC2\ETX-\DC2\DC3\n\+    \\n\+    \\n\+    \\STX\EOT\f\DC2\EOT/\NUL1\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\f\SOH\DC2\ETX/\b\NAK\n\+    \\v\n\+    \\EOT\EOT\f\STX\NUL\DC2\ETX0\EOT\NAK\n\+    \\f\n\+    \\ENQ\EOT\f\STX\NUL\ENQ\DC2\ETX0\EOT\b\n\+    \\f\n\+    \\ENQ\EOT\f\STX\NUL\SOH\DC2\ETX0\t\DLE\n\+    \\f\n\+    \\ENQ\EOT\f\STX\NUL\ETX\DC2\ETX0\DC3\DC4\n\+    \\n\+    \\n\+    \\STX\EOT\r\DC2\EOT3\NUL9\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\r\SOH\DC2\ETX3\b\CAN\n\+    \\v\n\+    \\EOT\EOT\r\STX\NUL\DC2\ETX4\EOT\DC2\n\+    \\f\n\+    \\ENQ\EOT\r\STX\NUL\ENQ\DC2\ETX4\EOT\t\n\+    \\f\n\+    \\ENQ\EOT\r\STX\NUL\SOH\DC2\ETX4\n\+    \\r\n\+    \\f\n\+    \\ENQ\EOT\r\STX\NUL\ETX\DC2\ETX4\DLE\DC1\n\+    \\v\n\+    \\EOT\EOT\r\STX\SOH\DC2\ETX5\EOT\DC2\n\+    \\f\n\+    \\ENQ\EOT\r\STX\SOH\ENQ\DC2\ETX5\EOT\t\n\+    \\f\n\+    \\ENQ\EOT\r\STX\SOH\SOH\DC2\ETX5\n\+    \\r\n\+    \\f\n\+    \\ENQ\EOT\r\STX\SOH\ETX\DC2\ETX5\DLE\DC1\n\+    \\v\n\+    \\EOT\EOT\r\STX\STX\DC2\ETX6\EOT\DC4\n\+    \\f\n\+    \\ENQ\EOT\r\STX\STX\ENQ\DC2\ETX6\EOT\t\n\+    \\f\n\+    \\ENQ\EOT\r\STX\STX\SOH\DC2\ETX6\n\+    \\SI\n\+    \\f\n\+    \\ENQ\EOT\r\STX\STX\ETX\DC2\ETX6\DC2\DC3\n\+    \\v\n\+    \\EOT\EOT\r\STX\ETX\DC2\ETX7\EOT\DC3\n\+    \\f\n\+    \\ENQ\EOT\r\STX\ETX\ENQ\DC2\ETX7\EOT\t\n\+    \\f\n\+    \\ENQ\EOT\r\STX\ETX\SOH\DC2\ETX7\n\+    \\SO\n\+    \\f\n\+    \\ENQ\EOT\r\STX\ETX\ETX\DC2\ETX7\DC1\DC2\n\+    \\v\n\+    \\EOT\EOT\r\STX\EOT\DC2\ETX8\EOT\SYN\n\+    \\f\n\+    \\ENQ\EOT\r\STX\EOT\ENQ\DC2\ETX8\EOT\t\n\+    \\f\n\+    \\ENQ\EOT\r\STX\EOT\SOH\DC2\ETX8\n\+    \\DC1\n\+    \\f\n\+    \\ENQ\EOT\r\STX\EOT\ETX\DC2\ETX8\DC4\NAK\n\+    \\n\+    \\n\+    \\STX\EOT\SO\DC2\EOT:\NUL<\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\SO\SOH\DC2\ETX:\b\SYN\n\+    \\v\n\+    \\EOT\EOT\SO\STX\NUL\DC2\ETX;\EOT\NAK\n\+    \\f\n\+    \\ENQ\EOT\SO\STX\NUL\ENQ\DC2\ETX;\EOT\b\n\+    \\f\n\+    \\ENQ\EOT\SO\STX\NUL\SOH\DC2\ETX;\t\DLE\n\+    \\f\n\+    \\ENQ\EOT\SO\STX\NUL\ETX\DC2\ETX;\DC3\DC4\n\+    \\n\+    \\n\+    \\STX\EOT\SI\DC2\EOT>\NULC\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\SI\SOH\DC2\ETX>\b\CAN\n\+    \\v\n\+    \\EOT\EOT\SI\STX\NUL\DC2\ETX?\EOT\DC2\n\+    \\f\n\+    \\ENQ\EOT\SI\STX\NUL\ENQ\DC2\ETX?\EOT\t\n\+    \\f\n\+    \\ENQ\EOT\SI\STX\NUL\SOH\DC2\ETX?\n\+    \\r\n\+    \\f\n\+    \\ENQ\EOT\SI\STX\NUL\ETX\DC2\ETX?\DLE\DC1\n\+    \\v\n\+    \\EOT\EOT\SI\STX\SOH\DC2\ETX@\EOT\DC4\n\+    \\f\n\+    \\ENQ\EOT\SI\STX\SOH\ENQ\DC2\ETX@\EOT\t\n\+    \\f\n\+    \\ENQ\EOT\SI\STX\SOH\SOH\DC2\ETX@\n\+    \\SI\n\+    \\f\n\+    \\ENQ\EOT\SI\STX\SOH\ETX\DC2\ETX@\DC2\DC3\n\+    \\v\n\+    \\EOT\EOT\SI\STX\STX\DC2\ETXA\EOT\DC3\n\+    \\f\n\+    \\ENQ\EOT\SI\STX\STX\ENQ\DC2\ETXA\EOT\t\n\+    \\f\n\+    \\ENQ\EOT\SI\STX\STX\SOH\DC2\ETXA\n\+    \\SO\n\+    \\f\n\+    \\ENQ\EOT\SI\STX\STX\ETX\DC2\ETXA\DC1\DC2\n\+    \\v\n\+    \\EOT\EOT\SI\STX\ETX\DC2\ETXB\EOT\SYN\n\+    \\f\n\+    \\ENQ\EOT\SI\STX\ETX\ENQ\DC2\ETXB\EOT\t\n\+    \\f\n\+    \\ENQ\EOT\SI\STX\ETX\SOH\DC2\ETXB\n\+    \\DC1\n\+    \\f\n\+    \\ENQ\EOT\SI\STX\ETX\ETX\DC2\ETXB\DC4\NAK\n\+    \\n\+    \\n\+    \\STX\EOT\DLE\DC2\EOTE\NULG\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\DLE\SOH\DC2\ETXE\b\SYN\n\+    \\v\n\+    \\EOT\EOT\DLE\STX\NUL\DC2\ETXF\EOT\NAK\n\+    \\f\n\+    \\ENQ\EOT\DLE\STX\NUL\ENQ\DC2\ETXF\EOT\b\n\+    \\f\n\+    \\ENQ\EOT\DLE\STX\NUL\SOH\DC2\ETXF\t\DLE\n\+    \\f\n\+    \\ENQ\EOT\DLE\STX\NUL\ETX\DC2\ETXF\DC3\DC4\n\+    \\n\+    \\n\+    \\STX\EOT\DC1\DC2\EOTI\NULM\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\DC1\SOH\DC2\ETXI\b\ESC\n\+    \\v\n\+    \\EOT\EOT\DC1\STX\NUL\DC2\ETXJ\EOT\DC2\n\+    \\f\n\+    \\ENQ\EOT\DC1\STX\NUL\ENQ\DC2\ETXJ\EOT\t\n\+    \\f\n\+    \\ENQ\EOT\DC1\STX\NUL\SOH\DC2\ETXJ\n\+    \\r\n\+    \\f\n\+    \\ENQ\EOT\DC1\STX\NUL\ETX\DC2\ETXJ\DLE\DC1\n\+    \\v\n\+    \\EOT\EOT\DC1\STX\SOH\DC2\ETXK\EOT\DLE\n\+    \\f\n\+    \\ENQ\EOT\DC1\STX\SOH\ENQ\DC2\ETXK\EOT\b\n\+    \\f\n\+    \\ENQ\EOT\DC1\STX\SOH\SOH\DC2\ETXK\t\v\n\+    \\f\n\+    \\ENQ\EOT\DC1\STX\SOH\ETX\DC2\ETXK\SO\SI\n\+    \\v\n\+    \\EOT\EOT\DC1\STX\STX\DC2\ETXL\EOT\SYN\n\+    \\f\n\+    \\ENQ\EOT\DC1\STX\STX\ENQ\DC2\ETXL\EOT\t\n\+    \\f\n\+    \\ENQ\EOT\DC1\STX\STX\SOH\DC2\ETXL\n\+    \\DC1\n\+    \\f\n\+    \\ENQ\EOT\DC1\STX\STX\ETX\DC2\ETXL\DC4\NAK\n\+    \\n\+    \\n\+    \\STX\EOT\DC2\DC2\EOTO\NULQ\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\DC2\SOH\DC2\ETXO\b\EM\n\+    \\v\n\+    \\EOT\EOT\DC2\STX\NUL\DC2\ETXP\EOT\NAK\n\+    \\f\n\+    \\ENQ\EOT\DC2\STX\NUL\ENQ\DC2\ETXP\EOT\b\n\+    \\f\n\+    \\ENQ\EOT\DC2\STX\NUL\SOH\DC2\ETXP\t\DLE\n\+    \\f\n\+    \\ENQ\EOT\DC2\STX\NUL\ETX\DC2\ETXP\DC3\DC4\n\+    \\n\+    \\n\+    \\STX\EOT\DC3\DC2\EOTS\NULT\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\DC3\SOH\DC2\ETXS\b!\n\+    \\n\+    \\n\+    \\STX\EOT\DC4\DC2\EOTV\NULW\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\DC4\SOH\DC2\ETXV\b!\n\+    \\n\+    \\n\+    \\STX\EOT\NAK\DC2\EOTY\NUL[\SOH\n\+    \\n\+    \\n\+    \\ETX\EOT\NAK\SOH\DC2\ETXY\b\GS\n\+    \\v\n\+    \\EOT\EOT\NAK\STX\NUL\DC2\ETXZ\EOT\NAK\n\+    \\f\n\+    \\ENQ\EOT\NAK\STX\NUL\ENQ\DC2\ETXZ\EOT\b\n\+    \\f\n\+    \\ENQ\EOT\NAK\STX\NUL\SOH\DC2\ETXZ\t\DLE\n\+    \\f\n\+    \\ENQ\EOT\NAK\STX\NUL\ETX\DC2\ETXZ\DC3\DC4\n\+    \\n\+    \\n\+    \\STX\ACK\NUL\DC2\EOT]\NULu\SOH\n\+    \\n\+    \\n\+    \\ETX\ACK\NUL\SOH\DC2\ETX]\b\ETB\n\+    \\v\n\+    \\EOT\ACK\NUL\STX\NUL\DC2\ETX^\EOT@\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\NUL\SOH\DC2\ETX^\b\DC1\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\NUL\STX\DC2\ETX^\DC3#\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\NUL\ETX\DC2\ETX^.<\n\+    \8\n\+    \\EOT\ACK\NUL\STX\SOH\DC2\ETX`\EOTI\SUB+ Returns a list of all detected keyboards.\n\+    \\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\SOH\SOH\DC2\ETX`\b\DC4\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\SOH\STX\DC2\ETX`\SYN)\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\SOH\ETX\DC2\ETX`4E\n\+    \T\n\+    \\EOT\ACK\NUL\STX\STX\DC2\ETXb\EOTR\SUBG Connects to a keyboard using given an id retrieved from GetKeyboards.\n\+    \\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\STX\SOH\DC2\ETXb\b\ETB\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\STX\STX\DC2\ETXb\EM/\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\STX\ETX\DC2\ETXb:N\n\+    \8\n\+    \\EOT\ACK\NUL\STX\ETX\DC2\ETXd\EOTX\SUB+ Connects to the first available keyboard.\n\+    \\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\ETX\SOH\DC2\ETXd\b\SUB\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\ETX\STX\DC2\ETXd\FS5\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\ETX\ETX\DC2\ETXd@T\n\+    \W\n\+    \\EOT\ACK\NUL\STX\EOT\DC2\ETXf\EOT[\SUBJ Disconnects to a keyboard using given an id retrieved from GetKeyboards.\n\+    \\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\EOT\SOH\DC2\ETXf\b\SUB\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\EOT\STX\DC2\ETXf\FS5\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\EOT\ETX\DC2\ETXf@W\n\+    \=\n\+    \\EOT\ACK\NUL\STX\ENQ\DC2\ETXh\EOT=\SUB0 Sets the active layer of a connected keyboard.\n\+    \\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\ENQ\SOH\DC2\ETXh\b\DLE\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\ENQ\STX\DC2\ETXh\DC2!\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\ENQ\ETX\DC2\ETXh,9\n\+    \-\n\+    \\EOT\ACK\NUL\STX\ACK\DC2\ETXj\EOT?\SUB  Unsets a previously set layer.\n\+    \\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\ACK\SOH\DC2\ETXj\b\DC2\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\ACK\STX\DC2\ETXj\DC4#\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\ACK\ETX\DC2\ETXj.;\n\+    \@\n\+    \\EOT\ACK\NUL\STX\a\DC2\ETXl\EOT@\SUB3 Sets the color of a specific LED on the keyboard.\n\+    \\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\a\SOH\DC2\ETXl\b\DC1\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\a\STX\DC2\ETXl\DC3#\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\a\ETX\DC2\ETXl.<\n\+    \:\n\+    \\EOT\ACK\NUL\STX\b\DC2\ETXn\EOT@\SUB- Sets the color of all LEDs on the keyboard.\n\+    \\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\b\SOH\DC2\ETXn\b\DC1\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\b\STX\DC2\ETXn\DC3#\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\b\ETX\DC2\ETXn.<\n\+    \3\n\+    \\EOT\ACK\NUL\STX\t\DC2\ETXp\EOTI\SUB& Sets the status LED on the keyboard.\n\+    \\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\t\SOH\DC2\ETXp\b\DC4\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\t\STX\DC2\ETXp\SYN)\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\t\ETX\DC2\ETXp4E\n\+    \8\n\+    \\EOT\ACK\NUL\STX\n\+    \\DC2\ETXr\EOTY\SUB+ Increases the brightness of the keyboard.\n\+    \\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\n\+    \\SOH\DC2\ETXr\b\SUB\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\n\+    \\STX\DC2\ETXr\FS5\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\n\+    \\ETX\DC2\ETXr@U\n\+    \8\n\+    \\EOT\ACK\NUL\STX\v\DC2\ETXt\EOTY\SUB+ Decreases the brightness of the keyboard.\n\+    \\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\v\SOH\DC2\ETXt\b\SUB\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\v\STX\DC2\ETXt\FS5\n\+    \\f\n\+    \\ENQ\ACK\NUL\STX\v\ETX\DC2\ETXt@Ub\ACKproto3"
+ keymapp.cabal view
@@ -0,0 +1,71 @@+cabal-version:      3.0+name:               keymapp+version:            0.1.0+synopsis:           gRPC client for the Keymapp API+description:        This library provides a client for interacting with the [Keymapp](https://blog.zsa.io/keymapp) API.+                    It can be used as a Haskell library, or via the provided CLI executable, which is inspired by [Kontroll](https://github.com/zsa/kontroll).+license:            BSD-3-Clause+license-file:       LICENSE+author:             Frederick Pringle+maintainer:         frederick.pringle@fpringle.com+copyright:          Copyright(c) Frederick Pringle 2026+homepage:           https://github.com/fpringle/keymapp+build-type:         Simple+category:           Control+extra-doc-files:    CHANGELOG.md+                    README.md++common warnings+  ghc-options: -Wall -Wno-unused-do-bind++common deps+  build-depends:+    , base               >= 4 && < 5+    , grapesy            >= 1.0 && < 1.2+    , proto-lens         >= 0.7 && < 0.8+    , proto-lens-runtime >= 0.7 && < 0.8+    , text               >= 1.2 && < 2.2+    , mtl                >= 2.2 && < 2.4+    , directory          >= 1.2.3 && < 1.4+    , colour             >= 2.3 && < 2.4+    , unliftio-core      >= 0.1.1 && < 0.3+    , exceptions         >= 0.10 && < 0.11++common extensions+  default-extensions:+    BangPatterns+    DerivingVia+    DataKinds+    GeneralizedNewtypeDeriving+    OverloadedStrings+    RecordWildCards+    TypeApplications+    TypeFamilies++library+  import:+      warnings+    , deps+    , extensions+  ghc-options: -Wunused-packages+  exposed-modules:+      Control.Keymapp.API+      Control.Keymapp.Client+  other-modules:+      Proto.Keymapp+  hs-source-dirs:   src, generated+  default-language: Haskell2010++executable keymapp+  import:+      warnings+    , deps+    , extensions+  main-is:          Main.hs+  build-depends:+    , keymapp+    , optparse-applicative >= 0.18 && < 0.20+    , prettyprinter >= 1.7 && < 1.8++  hs-source-dirs:   exe+  default-language: Haskell2010
+ src/Control/Keymapp/API.hs view
@@ -0,0 +1,25 @@+{-# OPTIONS_GHC -Wno-orphans #-}++{- | A Haskell description of the Keymapp API.++This module is automatically generated from [keymapp.proto](https://github.com/zsa/kontroll/blob/main/proto/keymapp.proto)+using [protoc](https://protobuf.dev/) and [proto-lens-protoc](https://hackage.haskell.org/package/proto-lens-protoc).+-}+module Control.Keymapp.API+  ( module Proto.Keymapp+  )+where++import Data.ProtoLens.Labels ()+import Network.GRPC.Common+import Network.GRPC.Common.Protobuf+import Proto.Keymapp++------------------------------------------------------------+-- Metadata++type instance RequestMetadata (Protobuf KeyboardService meth) = NoMetadata++type instance ResponseInitialMetadata (Protobuf KeyboardService meth) = NoMetadata++type instance ResponseTrailingMetadata (Protobuf KeyboardService meth) = NoMetadata
+ src/Control/Keymapp/Client.hs view
@@ -0,0 +1,324 @@+{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE OverloadedLabels #-}++{- | This module provides a monad for interacting with the Keymapp API, and functions for calling its+endpoints via gRPC.+-}+module Control.Keymapp.Client+  ( -- * Monad transformer+    KeymappClient+  , runClient++    -- * Core commands++    {- | These functions are more or less a one-to-one-translation from the+    [protobuf specification](https://github.com/zsa/kontroll/blob/main/proto/keymapp.proto) of the API.+    -}+  , getStatus+  , getKeyboards+  , connectKeyboard+  , connectAnyKeyboard+  , disconnectKeyboard+  , setLayer+  , unsetLayer+  , setRGBLed+  , setRGBAll+  , setStatusLed+  , increaseBrightness+  , decreaseBrightness++    -- ** Derived commands++    {- | These operations aren't defined by the Keymapp API, but are provided for convenience+    and mostly inspired by functions in [Kontroll](https://github.com/zsa/kontroll).+    -}+  , restoreRGBLeds+  , restoreStatusLeds+  , setStatusLedAll++    -- * Types+  , Keyboard (..)+  , ConnectedKeyboard (..)+  , Status (..)+  , Success (..)+  , On (..)+  , KeyboardId (..)+  , LED (..)+  , Layer (..)+  , Sustain (..)++    -- * Utils+  , defaultKeymappSocket+  )+where++import Control.Keymapp.API hiding (ConnectedKeyboard, Keyboard)+import Control.Monad.Catch (MonadCatch, MonadMask, MonadThrow)+import Control.Monad.IO.Class (MonadIO (..))+import Control.Monad.IO.Unlift (MonadUnliftIO (..))+import Control.Monad.Reader (ReaderT (..), mapReaderT)+import Data.Colour.Names (white)+import Data.Colour.SRGB+import Data.Foldable (fold)+import Data.Int (Int32)+import Data.ProtoLens.Labels ()+import Data.Semigroup (All (..))+import Data.Text (Text)+import Data.Traversable (for)+import Network.GRPC.Client (ConnParams, Connection, Server (..), rpc, withConnection)+import Network.GRPC.Client.StreamType.CanCallRPC+import Network.GRPC.Common.Protobuf+import qualified Proto.Keymapp as Proto+import System.Directory++{- | Most of the Keymapp server endpoints return a boolean success value without any additional information.++We derive 'Semigroup' and 'Monoid' instances via t'All'. In other words if we do a bunch of operations,+we define the overall operation to be a success only if all of the operations succeeded.+-}+newtype Success = Success {asBool :: Bool}+  deriving (Show, Eq)+  deriving (Semigroup, Monoid) via All++-- | Boolean newtype used by the 'setStatusLed'* functions. Indicates whether a status LED should be turned on or off.+newtype On = On {asBool :: Bool}+  deriving (Show, Eq)++-- | The ID of a keyboard, as returned by the list endpoints ('getKeyboards').+newtype KeyboardId = KeyboardId {asInt32 :: Int32}+  deriving (Show, Eq, Ord, Enum, Num)++{- | The index of an LED.++Mapping on a ZSA Moonlander MK1:+++----+----+----+----+----+----+----+---+----+----+----+----+----+----+----++| 0  | 1  | 2  | 3  | 4  | 5  | 6  |   | 36 | 37 | 38 | 39 | 40 | 41 | 42 |++----+----+----+----+----+----+----+---+----+----+----+----+----+----+----++| 7  | 8  | 9  | 10 | 11 | 12 | 13 |   | 43 | 44 | 45 | 46 | 47 | 48 | 49 |++----+----+----+----+----+----+----+---+----+----+----+----+----+----+----++| 14 | 15 | 16 | 17 | 18 | 19 | 20 |   | 50 | 51 | 52 | 53 | 54 | 55 | 56 |++----+----+----+----+----+----+----+---+----+----+----+----+----+----+----++| 21 | 22 | 23 | 24 | 25 | 26 |    |   |    | 57 | 58 | 59 | 60 | 61 | 62 |++----+----+----+----+----+----+----+---+----+----+----+----+----+----+----++| 27 | 28 | 29 | 30 | 31 |    |    |   |    |    | 63 | 64 | 65 | 66 | 67 |++----+----+----+----+----+----+----+---+----+----+----+----+----+----+----++|    |    |    |    |    | 32 |    |   |    | 68 |    |    |    |    |    |++----+----+----+----+----+----+----+---+----+----+----+----+----+----+----++|    |    |    |    | 33 | 34 | 35 |   | 69 | 70 | 71 |    |    |    |    |++----+----+----+----+----+----+----+---+----+----+----+----+----+----+----++-}+newtype LED = LED {asInt32 :: Int32}+  deriving (Show, Eq, Ord, Enum, Num)++-- | The index of a layer.+newtype Layer = Layer {asInt32 :: Int32}+  deriving (Show, Eq, Ord, Enum, Num)++{- | Delay in milliseconds. This is used for most of the endpoints that change lights and colours -+if the sustain is set to 0, the change is permanent; otherwise, a sustain of X means the change will+last for X milliseconds and then revert.+-}+newtype Sustain = Sustain {asInt32 :: Int32}+  deriving (Show, Eq, Ord, Enum, Num)++-- | Details of a keyboard as returned by the 'getKeyboards' endpoint.+data Keyboard = Keyboard+  { id :: !KeyboardId+  , friendlyName :: !Text+  , isConnected :: !Bool+  }+  deriving (Show, Eq)++decodeKeyboard :: Proto Proto.Keyboard -> Keyboard+decodeKeyboard keyboard =+  Keyboard+    { id = KeyboardId $ keyboard ^. #id+    , friendlyName = keyboard ^. #friendlyName+    , isConnected = keyboard ^. #isConnected+    }++-- | Details of the connected keyboard as returned by the 'getStatus' endpoint.+data ConnectedKeyboard = ConnectedKeyboard+  { friendlyName :: !Text+  , firmwareVersion :: !Text+  , currentLayer :: !Layer+  }+  deriving (Show, Eq)++decodeConnectedKeyboard :: Proto Proto.ConnectedKeyboard -> ConnectedKeyboard+decodeConnectedKeyboard keyboard =+  ConnectedKeyboard+    { friendlyName = keyboard ^. #friendlyName+    , firmwareVersion = keyboard ^. #firmwareVersion+    , currentLayer = Layer $ keyboard ^. #currentLayer+    }++-- | Status of the API as returned by the 'getStatus' endpoint.+data Status = Status+  { keymappVersion :: !Text+  , connectedKeyboard :: !(Maybe ConnectedKeyboard)+  }+  deriving (Show, Eq)++decodeGetStatusReply :: Proto GetStatusReply -> Status+decodeGetStatusReply reply =+  Status+    { keymappVersion = reply ^. #keymappVersion+    , connectedKeyboard = decodeConnectedKeyboard <$> reply ^. #maybe'connectedKeyboard+    }++decodeGetKeyboardsReply :: Proto GetKeyboardsReply -> [Keyboard]+decodeGetKeyboardsReply reply = fmap decodeKeyboard $ reply ^. #keyboards++decodeConnectKeyboardReply :: Proto ConnectKeyboardReply -> Success+decodeConnectKeyboardReply reply = Success $ reply ^. #success++decodeDisconnectKeyboardReply :: Proto DisconnectKeyboardReply -> Success+decodeDisconnectKeyboardReply reply = Success $ reply ^. #success++decodeSetLayerReply :: Proto SetLayerReply -> Success+decodeSetLayerReply reply = Success $ reply ^. #success++decodeSetRGBLedReply :: Proto SetRGBLedReply -> Success+decodeSetRGBLedReply reply = Success $ reply ^. #success++decodeSetRGBAllReply :: Proto SetRGBAllReply -> Success+decodeSetRGBAllReply reply = Success $ reply ^. #success++decodeSetStatusLedReply :: Proto SetStatusLedReply -> Success+decodeSetStatusLedReply reply = Success $ reply ^. #success++decodeBrightnessUpdateReply :: Proto BrightnessUpdateReply -> Success+decodeBrightnessUpdateReply reply = Success $ reply ^. #success++------------------------------------------------------------++-- | Get the status of the Keymapp API, including the connected keyboard.+getStatus :: (CanCallRPC m) => m Status+getStatus = decodeGetStatusReply <$> nonStreaming (rpc @(Protobuf KeyboardService "getStatus")) defMessage++-- | List all the keyboards connected to your computer that the Keymapp server can talk to.+getKeyboards :: (CanCallRPC m) => m [Keyboard]+getKeyboards = decodeGetKeyboardsReply <$> nonStreaming (rpc @(Protobuf KeyboardService "getKeyboards")) defMessage++-- | Connect to a specific keyboard. The t'KeyboardId' is an index from the list that 'getKeyboards' returns.+connectKeyboard :: (CanCallRPC m) => KeyboardId -> m Success+connectKeyboard (KeyboardId keyboardId) = decodeConnectKeyboardReply <$> nonStreaming (rpc @(Protobuf KeyboardService "connectKeyboard")) (defMessage & #id .~ keyboardId)++-- | Connect to the first keyboard detected by the Keymapp server.+connectAnyKeyboard :: (CanCallRPC m) => m Success+connectAnyKeyboard = decodeConnectKeyboardReply <$> nonStreaming (rpc @(Protobuf KeyboardService "connectAnyKeyboard")) defMessage++-- | Disconnect from the currently connected keyboard.+disconnectKeyboard :: (CanCallRPC m) => m Success+disconnectKeyboard = decodeDisconnectKeyboardReply <$> nonStreaming (rpc @(Protobuf KeyboardService "disconnectKeyboard")) defMessage++-- | Set the layer of the currently connected keyboard.+setLayer :: (CanCallRPC m) => Layer -> m Success+setLayer (Layer layerId) = decodeSetLayerReply <$> nonStreaming (rpc @(Protobuf KeyboardService "setLayer")) (defMessage & #layer .~ layerId)++-- | Unset the layer of the currently connected keyboard.+unsetLayer :: (CanCallRPC m) => Layer -> m Success+unsetLayer (Layer layerId) = decodeSetLayerReply <$> nonStreaming (rpc @(Protobuf KeyboardService "unsetLayer")) (defMessage & #layer .~ layerId)++-- | Sets the RGB color of a LED.+setRGBLed :: (CanCallRPC m) => LED -> Colour Double -> Sustain -> m Success+setRGBLed (LED led) colour (Sustain sustain) = do+  let RGB r g b = toSRGB24 colour+  decodeSetRGBLedReply+    <$> nonStreaming+      (rpc @(Protobuf KeyboardService "setRGBLed"))+      ( defMessage+          & #led .~ led+          & #sustain .~ sustain+          & #red .~ fromIntegral r+          & #green .~ fromIntegral g+          & #blue .~ fromIntegral b+      )++-- | Sets the RGB color of all LEDs.+setRGBAll :: (CanCallRPC m) => Colour Double -> Sustain -> m Success+setRGBAll colour (Sustain sustain) = do+  let RGB r g b = toSRGB24 colour+  decodeSetRGBAllReply+    <$> nonStreaming+      (rpc @(Protobuf KeyboardService "setRGBAll"))+      ( defMessage+          & #sustain .~ sustain+          & #red .~ fromIntegral r+          & #green .~ fromIntegral g+          & #blue .~ fromIntegral b+      )++-- | Restores the RGB color of all LEDs to their default.+restoreRGBLeds :: (CanCallRPC m) => m Success+restoreRGBLeds = setRGBAll white (Sustain 1)++-- | Set / unset a status LED.+setStatusLed :: (CanCallRPC m) => LED -> On -> Sustain -> m Success+setStatusLed (LED led) (On on) (Sustain sustain) =+  decodeSetStatusLedReply+    <$> nonStreaming+      (rpc @(Protobuf KeyboardService "setStatusLed"))+      ( defMessage+          & #led .~ led+          & #on .~ on+          & #sustain .~ sustain+      )++-- | Set / unset all status LEDs.+setStatusLedAll :: (CanCallRPC m) => On -> Sustain -> m Success+setStatusLedAll on sustain =+  fmap fold . for [0 .. 2] $ \led -> setStatusLed (LED led) on sustain++-- | Restores all status LEDs to their default.+restoreStatusLeds :: (CanCallRPC m) => m Success+restoreStatusLeds = setStatusLed (LED 0) (On False) (Sustain 1)++-- | Increase the brightness of the keyboard's LEDs.+increaseBrightness :: (CanCallRPC m) => m Success+increaseBrightness = decodeBrightnessUpdateReply <$> nonStreaming (rpc @(Protobuf KeyboardService "increaseBrightness")) defMessage++-- | Decrease the brightness of the keyboard's LEDs.+decreaseBrightness :: (CanCallRPC m) => m Success+decreaseBrightness = decodeBrightnessUpdateReply <$> nonStreaming (rpc @(Protobuf KeyboardService "decreaseBrightness")) defMessage++------------------------------------------------------------+-- Monad transformer++{- | A monad transformer for calling the Keymapp API.+Basically just hides the details of the connection to the gRPC server.++TODO: catch errors?+-}+newtype KeymappClient m a = KeymappClient (ReaderT Connection m a)+  deriving newtype+    ( Functor+    , Applicative+    , Monad+    , MonadIO+    , MonadUnliftIO+    , MonadFail+    , MonadThrow+    , MonadCatch+    , MonadMask+    , CanCallRPC+    )++{- | Run a t'KeymappClient' action using gRPC connection details (see the grapesy documentation for more details).++To get the standard 'Server' details, see 'defaultKeymappSocket'.+-}+runClient :: (MonadUnliftIO m) => ConnParams -> Server -> KeymappClient m a -> m a+runClient params server (KeymappClient rma) =+  withRunInIO $ \unlift ->+    withConnection params server $+      runReaderT (mapReaderT unlift rma)++------------------------------------------------------------+-- Utils++-- | The default Keymapp server runs at @~/.config/keymapp/keymapp.socket@+defaultKeymappSocket :: (MonadIO m) => m Server+defaultKeymappSocket = liftIO $ ServerUnix <$> getXdgDirectory XdgConfig ".keymapp/keymapp.sock"