diff --git a/.gitignore b/.gitignore index 1efe8cd..116b49d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,4 @@ dist*/ elm-stuff*/ .ghc.environment.* cabal.project.local* -haskell/rsc result diff --git a/README.md b/README.md index 3ddcf22..21f3976 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,15 @@ Run `./build.sh`* to build. The first time you run this, it could take a while, \* On Windows, it's `.\build.ps1`. Though you may need `powershell.exe -executionpolicy bypass -file .\build.ps1` due to permissions issues. I don't personally know a thing about Windows permissions, so if anyone has a better idea please let me know. +## Cross-compiling + +If we're on x86-64 Linux, we can use `nix develop` to enter a shell from which we can cross-compile: +```sh +~/.ghcup/bin/runghc Build.hs --target=x86_64-w64-mingw32 +~/.ghcup/bin/runghc Build.hs --target=x86_64-unknown-linux-musl +~/.ghcup/bin/runghc Build.hs --target=aarch64-unknown-linux-gnu +``` + # Run Run `./dist/monpad` to start the server (you can pass the `-h` flag to see all options). diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..69008b2 --- /dev/null +++ b/flake.lock @@ -0,0 +1,866 @@ +{ + "nodes": { + "HTTP": { + "flake": false, + "locked": { + "lastModified": 1451647621, + "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", + "owner": "phadej", + "repo": "HTTP", + "rev": "9bc0996d412fef1787449d841277ef663ad9a915", + "type": "github" + }, + "original": { + "owner": "phadej", + "repo": "HTTP", + "type": "github" + } + }, + "blank": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "cabal-32": { + "flake": false, + "locked": { + "lastModified": 1603716527, + "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", + "owner": "haskell", + "repo": "cabal", + "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", + "type": "github" + }, + "original": { + "owner": "haskell", + "ref": "3.2", + "repo": "cabal", + "type": "github" + } + }, + "cabal-34": { + "flake": false, + "locked": { + "lastModified": 1640353650, + "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", + "owner": "haskell", + "repo": "cabal", + "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", + "type": "github" + }, + "original": { + "owner": "haskell", + "ref": "3.4", + "repo": "cabal", + "type": "github" + } + }, + "cabal-36": { + "flake": false, + "locked": { + "lastModified": 1641652457, + "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", + "owner": "haskell", + "repo": "cabal", + "rev": "f27667f8ec360c475027dcaee0138c937477b070", + "type": "github" + }, + "original": { + "owner": "haskell", + "ref": "3.6", + "repo": "cabal", + "type": "github" + } + }, + "cardano-shell": { + "flake": false, + "locked": { + "lastModified": 1608537748, + "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", + "owner": "input-output-hk", + "repo": "cardano-shell", + "rev": "9392c75087cb9a3d453998f4230930dea3a95725", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "cardano-shell", + "type": "github" + } + }, + "devshell": { + "inputs": { + "flake-utils": [ + "haskellNix", + "tullia", + "std", + "flake-utils" + ], + "nixpkgs": [ + "haskellNix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1663445644, + "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "owner": "numtide", + "repo": "devshell", + "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "dmerge": { + "inputs": { + "nixlib": [ + "haskellNix", + "tullia", + "std", + "nixpkgs" + ], + "yants": [ + "haskellNix", + "tullia", + "std", + "yants" + ] + }, + "locked": { + "lastModified": 1659548052, + "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", + "owner": "divnix", + "repo": "data-merge", + "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "data-merge", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1635892615, + "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", + "owner": "input-output-hk", + "repo": "flake-compat", + "rev": "eca47d3377946315596da653862d341ee5341318", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_5": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "ghc-8.6.5-iohk": { + "flake": false, + "locked": { + "lastModified": 1600920045, + "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", + "owner": "input-output-hk", + "repo": "ghc", + "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "ref": "release/8.6.5-iohk", + "repo": "ghc", + "type": "github" + } + }, + "gomod2nix": { + "inputs": { + "nixpkgs": "nixpkgs_2", + "utils": "utils" + }, + "locked": { + "lastModified": 1655245309, + "narHash": "sha256-d/YPoQ/vFn1+GTmSdvbSBSTOai61FONxB4+Lt6w/IVI=", + "owner": "tweag", + "repo": "gomod2nix", + "rev": "40d32f82fc60d66402eb0972e6e368aeab3faf58", + "type": "github" + }, + "original": { + "owner": "tweag", + "repo": "gomod2nix", + "type": "github" + } + }, + "hackage": { + "flake": false, + "locked": { + "lastModified": 1669338728, + "narHash": "sha256-a+/QK3TeSgzLnL1z/EkqROo3cwB6VXV3BmvkvvGPSzM=", + "owner": "input-output-hk", + "repo": "hackage.nix", + "rev": "d044e9fd6eb02330eda094e3b7a61d4d23f8544a", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "hackage.nix", + "type": "github" + } + }, + "haskellNix": { + "inputs": { + "HTTP": "HTTP", + "cabal-32": "cabal-32", + "cabal-34": "cabal-34", + "cabal-36": "cabal-36", + "cardano-shell": "cardano-shell", + "flake-compat": "flake-compat", + "flake-utils": "flake-utils_2", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk", + "hackage": "hackage", + "hpc-coveralls": "hpc-coveralls", + "hydra": "hydra", + "nixpkgs": [ + "haskellNix", + "nixpkgs-unstable" + ], + "nixpkgs-2003": "nixpkgs-2003", + "nixpkgs-2105": "nixpkgs-2105", + "nixpkgs-2111": "nixpkgs-2111", + "nixpkgs-2205": "nixpkgs-2205", + "nixpkgs-unstable": "nixpkgs-unstable", + "old-ghc-nix": "old-ghc-nix", + "stackage": "stackage", + "tullia": "tullia" + }, + "locked": { + "lastModified": 1669513894, + "narHash": "sha256-5M1fCapnM6uto7CTX74+b8yutU9pQfEwO5dlI4L9HX0=", + "owner": "input-output-hk", + "repo": "haskell.nix", + "rev": "bf469ed05a2bb7dce8d491e12cb6816465406057", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "haskell.nix", + "type": "github" + } + }, + "hpc-coveralls": { + "flake": false, + "locked": { + "lastModified": 1607498076, + "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", + "owner": "sevanspowell", + "repo": "hpc-coveralls", + "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", + "type": "github" + }, + "original": { + "owner": "sevanspowell", + "repo": "hpc-coveralls", + "type": "github" + } + }, + "hydra": { + "inputs": { + "nix": "nix", + "nixpkgs": [ + "haskellNix", + "hydra", + "nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1646878427, + "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", + "owner": "NixOS", + "repo": "hydra", + "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", + "type": "github" + }, + "original": { + "id": "hydra", + "type": "indirect" + } + }, + "lowdown-src": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "mdbook-kroki-preprocessor": { + "flake": false, + "locked": { + "lastModified": 1661755005, + "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", + "type": "github" + }, + "original": { + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "type": "github" + } + }, + "n2c": { + "inputs": { + "flake-utils": "flake-utils_5", + "nixpkgs": [ + "haskellNix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1665039323, + "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "nix": { + "inputs": { + "lowdown-src": "lowdown-src", + "nixpkgs": "nixpkgs", + "nixpkgs-regression": "nixpkgs-regression" + }, + "locked": { + "lastModified": 1643066034, + "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", + "owner": "NixOS", + "repo": "nix", + "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "2.6.0", + "repo": "nix", + "type": "github" + } + }, + "nix-nomad": { + "inputs": { + "flake-compat": "flake-compat_2", + "flake-utils": [ + "haskellNix", + "tullia", + "nix2container", + "flake-utils" + ], + "gomod2nix": "gomod2nix", + "nixpkgs": [ + "haskellNix", + "tullia", + "nixpkgs" + ], + "nixpkgs-lib": [ + "haskellNix", + "tullia", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1658277770, + "narHash": "sha256-T/PgG3wUn8Z2rnzfxf2VqlR1CBjInPE0l1yVzXxPnt0=", + "owner": "tristanpemble", + "repo": "nix-nomad", + "rev": "054adcbdd0a836ae1c20951b67ed549131fd2d70", + "type": "github" + }, + "original": { + "owner": "tristanpemble", + "repo": "nix-nomad", + "type": "github" + } + }, + "nix2container": { + "inputs": { + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1658567952, + "narHash": "sha256-XZ4ETYAMU7XcpEeAFP3NOl9yDXNuZAen/aIJ84G+VgA=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "60bb43d405991c1378baf15a40b5811a53e32ffa", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "nixago": { + "inputs": { + "flake-utils": [ + "haskellNix", + "tullia", + "std", + "flake-utils" + ], + "nixago-exts": [ + "haskellNix", + "tullia", + "std", + "blank" + ], + "nixpkgs": [ + "haskellNix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1661824785, + "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", + "owner": "nix-community", + "repo": "nixago", + "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-21.05-small", + "type": "indirect" + } + }, + "nixpkgs-2003": { + "locked": { + "lastModified": 1620055814, + "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-20.03-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2105": { + "locked": { + "lastModified": 1659914493, + "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2111": { + "locked": { + "lastModified": 1659446231, + "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-21.11-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2205": { + "locked": { + "lastModified": 1663981975, + "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-22.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-regression": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "indirect" + } + }, + "nixpkgs-unstable": { + "locked": { + "lastModified": 1663905476, + "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1653581809, + "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1654807842, + "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1665087388, + "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "old-ghc-nix": { + "flake": false, + "locked": { + "lastModified": 1631092763, + "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", + "owner": "angerman", + "repo": "old-ghc-nix", + "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", + "type": "github" + }, + "original": { + "owner": "angerman", + "ref": "master", + "repo": "old-ghc-nix", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "haskellNix": "haskellNix", + "nixpkgs": [ + "haskellNix", + "nixpkgs-unstable" + ] + } + }, + "stackage": { + "flake": false, + "locked": { + "lastModified": 1669338854, + "narHash": "sha256-D9WBn+cC8t8Xu+z+H0nDGoeOCcqsbDGXHsaO7qY45O4=", + "owner": "input-output-hk", + "repo": "stackage.nix", + "rev": "e9c817e14342ebef9fcf433f6ba3aa00c6df3e3f", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "stackage.nix", + "type": "github" + } + }, + "std": { + "inputs": { + "blank": "blank", + "devshell": "devshell", + "dmerge": "dmerge", + "flake-utils": "flake-utils_4", + "makes": [ + "haskellNix", + "tullia", + "std", + "blank" + ], + "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor", + "microvm": [ + "haskellNix", + "tullia", + "std", + "blank" + ], + "n2c": "n2c", + "nixago": "nixago", + "nixpkgs": "nixpkgs_4", + "yants": "yants" + }, + "locked": { + "lastModified": 1665513321, + "narHash": "sha256-D6Pacw9yf/HMs84KYuCxHXnNDL7v43gtcka5URagFqE=", + "owner": "divnix", + "repo": "std", + "rev": "94a90eedb9cfc115b12ae8f6622d9904788559e4", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "std", + "type": "github" + } + }, + "tullia": { + "inputs": { + "nix-nomad": "nix-nomad", + "nix2container": "nix2container", + "nixpkgs": [ + "haskellNix", + "nixpkgs" + ], + "std": "std" + }, + "locked": { + "lastModified": 1666200256, + "narHash": "sha256-cJPS8zBu30SMhxMe7I8DWutwqMuhPsEez87y9gxMKc4=", + "owner": "input-output-hk", + "repo": "tullia", + "rev": "575362c2244498e8d2c97f72861510fa72e75d44", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "tullia", + "type": "github" + } + }, + "utils": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "yants": { + "inputs": { + "nixpkgs": [ + "haskellNix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660507851, + "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "owner": "divnix", + "repo": "yants", + "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..4bb1b05 --- /dev/null +++ b/flake.nix @@ -0,0 +1,33 @@ +{ + description = "monpad"; + inputs = { + haskellNix.url = "github:input-output-hk/haskell.nix"; + nixpkgs.follows = "haskellNix/nixpkgs-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + outputs = { self, nixpkgs, flake-utils, haskellNix }: + flake-utils.lib.eachSystem [ "x86_64-linux" ] (system: + let + crossPlatforms = p: [ p.mingwW64 p.musl64 ]; + overlays = [ + haskellNix.overlay + (final: prev: { + myHaskellProject = + final.haskell-nix.cabalProject' ({ + src = ./haskell; + compiler-nix-name = "ghc924"; + shell.tools = { cabal = { }; }; + shell = { inherit crossPlatforms; }; + configureArgs = "-frelease"; + }); + }) + + haskellNix.overlay + (final: prev: prev.lib.optionalAttrs prev.stdenv.hostPlatform.isMusl { + libevdev = prev.libevdev.overrideAttrs (_: { dontDisableStatic = true; }); + }) + ]; + pkgs = import nixpkgs { inherit system overlays; inherit (haskellNix) config; }; + in + pkgs.myHaskellProject.flake { inherit crossPlatforms; }); +} diff --git a/haskell/rsc/app.css b/haskell/rsc/app.css new file mode 100644 index 0000000..e465053 --- /dev/null +++ b/haskell/rsc/app.css @@ -0,0 +1,4 @@ +body { + /*TODO this may be redundant (except on iOS?) since we also disable scaling via the `viewport` meta tag */ + touch-action: none +} diff --git a/haskell/rsc/common.css b/haskell/rsc/common.css new file mode 100644 index 0000000..5cdf9e2 --- /dev/null +++ b/haskell/rsc/common.css @@ -0,0 +1,6 @@ +body { + background-color: rgb(207, 231, 247); + overflow: hidden; + padding: 0; + margin: 0; +} diff --git a/haskell/rsc/default.dhall b/haskell/rsc/default.dhall new file mode 100644 index 0000000..e14db20 --- /dev/null +++ b/haskell/rsc/default.dhall @@ -0,0 +1,32376 @@ +{ toLinux = + λ ( e + : { backgroundColour : + { alpha : Double, blue : Double, green : Double, red : Double } + , elements : + List + { element : + < Button : + { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + , name : Text + , viewBox : { h : Natural, w : Natural, x : Integer, y : Integer } + } + ) → + e + ⫽ { elements = + List/fold + { element : + < Button : + { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + e.elements + ( List + { element : + < Button : + { buttonData : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , stickDataY : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) + ( λ ( _ + : { element : + < Button : + { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) → + λ ( _ + : List + { element : + < Button : + { buttonData : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , stickDataY : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) → + [ _@1 + ⫽ { element = + merge + { Button = + λ ( button + : { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + ) → + < Button : + { buttonData : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , stickDataY : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + } + >.Button + ( button + ⫽ { buttonData = button.buttonData.linux + } + ) + , Empty = + < Button : + { buttonData : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , stickDataY : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + } + >.Empty + , Indicator = + < Button : + { buttonData : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , stickDataY : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + } + >.Indicator + , Input = + < Button : + { buttonData : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , stickDataY : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + } + >.Input + , Slider = + λ ( slider + : { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + ) → + < Button : + { buttonData : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , stickDataY : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + } + >.Slider + ( slider + ⫽ { sliderData = slider.sliderData.linux + } + ) + , Stick = + λ ( stick + : { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + ) → + < Button : + { buttonData : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , stickDataY : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + } + >.Stick + ( stick + ⫽ { stickDataX = stick.stickDataX.linux + , stickDataY = stick.stickDataY.linux + } + ) + } + _@1.element + } + ] + # _ + ) + ( [] : List + { element : + < Button : + { buttonData : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , stickDataY : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) + } +, toMac = + λ ( e + : { backgroundColour : + { alpha : Double, blue : Double, green : Double, red : Double } + , elements : + List + { element : + < Button : + { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + , name : Text + , viewBox : { h : Natural, w : Natural, x : Integer, y : Integer } + } + ) → + e + ⫽ { elements = + List/fold + { element : + < Button : + { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + e.elements + ( List + { element : + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) + ( λ ( _ + : { element : + < Button : + { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) → + λ ( _ + : List + { element : + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) → + [ _@1 + ⫽ { element = + merge + { Button = + λ ( button + : { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + ) → + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Button + ( button + ⫽ { buttonData = button.buttonData.mac } + ) + , Empty = + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Empty + , Indicator = + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Indicator + , Input = + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Input + , Slider = + λ ( slider + : { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + ) → + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Slider + ( slider + ⫽ { sliderData = slider.sliderData.mac } + ) + , Stick = + λ ( stick + : { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + ) → + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Stick + ( stick + ⫽ { stickDataX = stick.stickDataX.mac + , stickDataY = stick.stickDataY.mac + } + ) + } + _@1.element + } + ] + # _ + ) + ( [] : List + { element : + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) + } +, toWindows = + λ ( e + : { backgroundColour : + { alpha : Double, blue : Double, green : Double, red : Double } + , elements : + List + { element : + < Button : + { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + , name : Text + , viewBox : { h : Natural, w : Natural, x : Integer, y : Integer } + } + ) → + e + ⫽ { elements = + List/fold + { element : + < Button : + { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + e.elements + ( List + { element : + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) + ( λ ( _ + : { element : + < Button : + { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) → + λ ( _ + : List + { element : + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) → + [ _@1 + ⫽ { element = + merge + { Button = + λ ( button + : { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + ) → + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Button + ( button + ⫽ { buttonData = + button.buttonData.windows + } + ) + , Empty = + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Empty + , Indicator = + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Indicator + , Input = + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Input + , Slider = + λ ( slider + : { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + ) → + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Slider + ( slider + ⫽ { sliderData = + slider.sliderData.windows + } + ) + , Stick = + λ ( stick + : { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + ) → + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Stick + ( stick + ⫽ { stickDataX = + stick.stickDataX.windows + , stickDataY = + stick.stickDataY.windows + } + ) + } + _@1.element + } + ] + # _ + ) + ( [] : List + { element : + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) + } +, void = + λ ( e + : { backgroundColour : + { alpha : Double, blue : Double, green : Double, red : Double } + , elements : + List + { element : + < Button : + { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + , name : Text + , viewBox : { h : Natural, w : Natural, x : Integer, y : Integer } + } + ) → + e + ⫽ { elements = + List/fold + { element : + < Button : + { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + e.elements + ( List + { element : + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) + ( λ ( _ + : { element : + < Button : + { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) → + λ ( _ + : List + { element : + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) → + [ _@1 + ⫽ { element = + merge + { Button = + λ ( button + : { buttonData : + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + ) → + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Button + (button ⫽ { buttonData = {=} }) + , Empty = + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Empty + , Indicator = + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Indicator + , Input = + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Input + , Slider = + λ ( slider + : { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , width : Natural + } + ) → + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Slider + (slider ⫽ { sliderData = {=} }) + , Stick = + λ ( stick + : { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , stickDataY : + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + } + ) → + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + >.Stick + ( stick + ⫽ { stickDataX = {=}, stickDataY = {=} } + ) + } + _@1.element + } + ] + # _ + ) + ( [] : List + { element : + < Button : + { buttonData : {} + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : {} + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : {} + , stickDataY : {} + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) + } +}.toLinux + ( let AllOS = + { Axis = + { linux : + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , mac : {} + , windows : {} + } + , AxisLinux = + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , AxisMac = {} + , AxisWindows = {} + , Button = + { linux : + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , mac : {} + , windows : {} + } + , ButtonLinux = + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , ButtonMac = {} + , ButtonWindows = {} + } + + let monpad = + ( λ(a : Type) → + λ(b : Type) → + { Button = + { buttonData : b + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + , Colour = + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , Elem = + { Type = + { element : + < Button : + { buttonData : b + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a + , stickDataY : a + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + , default = + { hidden = False + , image = None { url : Text } + , text = + None + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + } + , Element = + < Button : + { buttonData : b + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a + , stickDataY : a + } + > + , FullElement = + { element : + < Button : + { buttonData : b + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a + , stickDataY : a + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + , Image = { url : Text } + , Indicator = + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + , Input = + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + , InputType = + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , Layout = + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , elements : + List + { element : + < Button : + { buttonData : b + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a + , stickDataY : a + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + , name : Text + , viewBox : + { h : Natural, w : Natural, x : Integer, y : Integer } + } + , NumberInput = + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + , PosX = < Centre | Left | Right > + , PosY = < Bottom | Middle | Top > + , Shape = + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + , Slider = + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a + , width : Natural + } + , Stick = + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a + , stickDataY : a + } + , TextBox = + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + , TextInput = + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + , TextShadow = + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , TextStyle = + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , V2 = λ(a : Type) → { x : a, y : a } + , ViewBox = { h : Natural, w : Natural, x : Integer, y : Integer } + , cols = + { black = { alpha = 1.0, blue = 0.0, green = 0.0, red = 0.0 } + , blue = { alpha = 1.0, blue = 0.85, green = 0.28, red = 0.28 } + , green = { alpha = 1.0, blue = 0.2, green = 0.72, red = 0.2 } + , grey = { alpha = 1.0, blue = 0.4, green = 0.35, red = 0.35 } + , pastelBlue = + { alpha = 1.0, blue = 0.97, green = 0.91, red = 0.81 } + , red = { alpha = 1.0, blue = 0.28, green = 0.28, red = 0.85 } + , white = { alpha = 1.0, blue = 1.0, green = 1.0, red = 1.0 } + , yellow = + { alpha = 1.0, blue = 0.33, green = 0.95, red = 0.94 } + } + , defaultTextStyle = + { align = < Centre | Left | Right >.Centre + , bold = True + , colour = + { alpha = 1.0, blue = 0.28, green = 0.28, red = 0.85 } + , font = "sans-serif" + , italic = True + , rotation = 0.0 + , shadow = + [] : List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size = 30 + , underline = False + } + , mapLayout = + λ(a1 : Type) → + λ(b1 : Type) → + λ(fa : a → a1) → + λ(fb : b → b1) → + λ ( e + : { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , elements : + List + { element : + < Button : + { buttonData : b + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a + , stickDataY : a + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + , name : Text + , viewBox : + { h : Natural, w : Natural, x : Integer, y : Integer } + } + ) → + e + ⫽ { elements = + List/fold + { element : + < Button : + { buttonData : b + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a + , stickDataY : a + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + e.elements + ( List + { element : + < Button : + { buttonData : b1 + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a1 + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a1 + , stickDataY : a1 + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) + ( λ ( _ + : { element : + < Button : + { buttonData : b + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : + { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a + , stickDataY : a + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) → + λ ( _ + : List + { element : + < Button : + { buttonData : b1 + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : + { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : + Optional Natural + , minLength : + Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : + { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a1 + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a1 + , stickDataY : a1 + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) → + [ _@1 + ⫽ { element = + merge + { Button = + λ ( button + : { buttonData : b + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural + , y : Natural + } + > + } + ) → + < Button : + { buttonData : b1 + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural + , y : Natural + } + > + } + | Empty : + { x : Natural + , y : Natural + } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : + { x : Double + , y : Double + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural + , y : Natural + } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : + Optional + Double + , min : + Optional + Double + , step : + Optional + Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , font : Text + , italic : + Bool + , rotation : + Double + , shadow : + List + { blur : + Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , offset : + { x : + Integer + , y : + Integer + } + } + , size : + Natural + , underline : + Bool + } + } + | Text : + { maxLength : + Optional + Natural + , minLength : + Optional + Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , font : Text + , italic : + Bool + , rotation : + Double + , shadow : + List + { blur : + Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , offset : + { x : + Integer + , y : + Integer + } + } + , size : + Natural + , underline : + Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : + { x : Integer + , y : Integer + } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a1 + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a1 + , stickDataY : a1 + } + >.Button + ( button + ⫽ { buttonData = + fb button.buttonData + } + ) + , Empty = + < Button : + { buttonData : b1 + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural + , y : Natural + } + > + } + | Empty : + { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : + { x : Double + , y : Double + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural + , y : Natural + } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : + Optional Double + , min : + Optional Double + , step : + Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , font : Text + , italic : Bool + , rotation : + Double + , shadow : + List + { blur : + Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , offset : + { x : + Integer + , y : + Integer + } + } + , size : Natural + , underline : + Bool + } + } + | Text : + { maxLength : + Optional Natural + , minLength : + Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , font : Text + , italic : Bool + , rotation : + Double + , shadow : + List + { blur : + Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , offset : + { x : + Integer + , y : + Integer + } + } + , size : Natural + , underline : + Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : + { x : Integer + , y : Integer + } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a1 + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a1 + , stickDataY : a1 + } + >.Empty + , Indicator = + < Button : + { buttonData : b1 + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural + , y : Natural + } + > + } + | Empty : + { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : + { x : Double + , y : Double + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural + , y : Natural + } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : + Optional Double + , min : + Optional Double + , step : + Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , font : Text + , italic : Bool + , rotation : + Double + , shadow : + List + { blur : + Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , offset : + { x : + Integer + , y : + Integer + } + } + , size : Natural + , underline : + Bool + } + } + | Text : + { maxLength : + Optional Natural + , minLength : + Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , font : Text + , italic : Bool + , rotation : + Double + , shadow : + List + { blur : + Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , offset : + { x : + Integer + , y : + Integer + } + } + , size : Natural + , underline : + Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : + { x : Integer + , y : Integer + } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a1 + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a1 + , stickDataY : a1 + } + >.Indicator + , Input = + < Button : + { buttonData : b1 + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural + , y : Natural + } + > + } + | Empty : + { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : + { x : Double + , y : Double + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural + , y : Natural + } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : + Optional Double + , min : + Optional Double + , step : + Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , font : Text + , italic : Bool + , rotation : + Double + , shadow : + List + { blur : + Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , offset : + { x : + Integer + , y : + Integer + } + } + , size : Natural + , underline : + Bool + } + } + | Text : + { maxLength : + Optional Natural + , minLength : + Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , font : Text + , italic : Bool + , rotation : + Double + , shadow : + List + { blur : + Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , offset : + { x : + Integer + , y : + Integer + } + } + , size : Natural + , underline : + Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : + { x : Integer + , y : Integer + } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a1 + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a1 + , stickDataY : a1 + } + >.Input + , Slider = + λ ( slider + : { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : + { x : Integer + , y : Integer + } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a + , width : Natural + } + ) → + < Button : + { buttonData : b1 + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural + , y : Natural + } + > + } + | Empty : + { x : Natural + , y : Natural + } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : + { x : Double + , y : Double + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural + , y : Natural + } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : + Optional + Double + , min : + Optional + Double + , step : + Optional + Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , font : Text + , italic : + Bool + , rotation : + Double + , shadow : + List + { blur : + Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , offset : + { x : + Integer + , y : + Integer + } + } + , size : + Natural + , underline : + Bool + } + } + | Text : + { maxLength : + Optional + Natural + , minLength : + Optional + Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , font : Text + , italic : + Bool + , rotation : + Double + , shadow : + List + { blur : + Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , offset : + { x : + Integer + , y : + Integer + } + } + , size : + Natural + , underline : + Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : + { x : Integer + , y : Integer + } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a1 + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a1 + , stickDataY : a1 + } + >.Slider + ( slider + ⫽ { sliderData = + fa slider.sliderData + } + ) + , Stick = + λ ( stick + : { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a + , stickDataY : a + } + ) → + < Button : + { buttonData : b1 + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural + , y : Natural + } + > + } + | Empty : + { x : Natural + , y : Natural + } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : + { x : Double + , y : Double + } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural + , y : Natural + } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : + Optional + Double + , min : + Optional + Double + , step : + Optional + Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , font : Text + , italic : + Bool + , rotation : + Double + , shadow : + List + { blur : + Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , offset : + { x : + Integer + , y : + Integer + } + } + , size : + Natural + , underline : + Bool + } + } + | Text : + { maxLength : + Optional + Natural + , minLength : + Optional + Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , font : Text + , italic : + Bool + , rotation : + Double + , shadow : + List + { blur : + Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , offset : + { x : + Integer + , y : + Integer + } + } + , size : + Natural + , underline : + Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : + { x : Integer + , y : Integer + } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a1 + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a1 + , stickDataY : a1 + } + >.Stick + ( stick + ⫽ { stickDataX = + fa stick.stickDataX + , stickDataY = + fa stick.stickDataY + } + ) + } + _@1.element + } + ] + # _ + ) + ( [] : List + { element : + < Button : + { buttonData : b1 + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : + { x : Natural + , y : Natural + } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : + { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : + { x : Natural + , y : Natural + } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : + Optional Natural + , minLength : + Optional Natural + , textStyle : + { align : + < Centre + | Left + | Right + > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : + Double + , blue : + Double + , green : + Double + , red : + Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : + { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a1 + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a1 + , stickDataY : a1 + } + > + , hidden : Bool + , image : Optional { url : Text } + , location : { x : Integer, y : Integer } + , name : Text + , text : + Optional + { alignX : < Centre | Left | Right > + , alignY : < Bottom | Middle | Top > + , style : + { align : + < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer + , y : Integer + } + } + , size : Natural + , underline : Bool + } + , text : Text + } + } + ) + } + , noTextStyle = + { align = < Centre | Left | Right >.Centre + , bold = False + , colour = { alpha = 1.0, blue = 0.0, green = 0.0, red = 0.0 } + , font = "sans-serif" + , italic = False + , rotation = 0.0 + , shadow = + [] : List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : { x : Integer, y : Integer } + } + , size = 30 + , underline = False + } + , simpleSlider = + λ ( s + : { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , length : Natural + , radius : Natural + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a + , vertical : Bool + , width : Natural + } + ) → + < Button : + { buttonData : b + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Empty : { x : Natural, y : Natural } + | Indicator : + { arcEnd : Double + , arcStart : Double + , centre : { x : Double, y : Double } + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , hollowness : Double + , shape : + < Circle : Natural + | Rectangle : { x : Natural, y : Natural } + > + } + | Input : + { height : Natural + , inputType : + < CheckBox + | Number : + { max : Optional Double + , min : Optional Double + , step : Optional Double + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + | Text : + { maxLength : Optional Natural + , minLength : Optional Natural + , textStyle : + { align : < Centre | Left | Right > + , bold : Bool + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , font : Text + , italic : Bool + , rotation : Double + , shadow : + List + { blur : Natural + , colour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , offset : + { x : Integer, y : Integer } + } + , size : Natural + , underline : Bool + } + } + > + , width : Natural + } + | Slider : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , initialPosition : Double + , offset : { x : Integer, y : Integer } + , radius : Natural + , resetOnRelease : Bool + , sliderColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , sliderData : a + , width : Natural + } + | Stick : + { backgroundColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , radius : Natural + , range : Natural + , stickColour : + { alpha : Double + , blue : Double + , green : Double + , red : Double + } + , stickDataX : a + , stickDataY : a + } + >.Slider + ( s + ∧ { initialPosition = 0.5 + , offset = + if s.vertical + then { x = +0, y = Natural/toInteger s.length } + else { x = Natural/toInteger s.length, y = +0 } + , resetOnRelease = True + } + ).{ backgroundColour + , initialPosition + , offset + , radius + , resetOnRelease + , sliderColour + , sliderData + , width + } + } + ) + AllOS.Axis + AllOS.Button + + let Evdev = + { AbsAxis = + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + , Axis = + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , AxisInfo = + { axis : + < Abs : + < AbsBrake + | AbsDistance + | AbsGas + | AbsHat0x + | AbsHat0y + | AbsHat1x + | AbsHat1y + | AbsHat2x + | AbsHat2y + | AbsHat3x + | AbsHat3y + | AbsMisc + | AbsMtBlobId + | AbsMtDistance + | AbsMtOrientation + | AbsMtPositionX + | AbsMtPositionY + | AbsMtPressure + | AbsMtSlot + | AbsMtToolType + | AbsMtToolX + | AbsMtToolY + | AbsMtTouchMajor + | AbsMtTouchMinor + | AbsMtTrackingId + | AbsMtWidthMajor + | AbsMtWidthMinor + | AbsPressure + | AbsReserved + | AbsRudder + | AbsRx + | AbsRy + | AbsRz + | AbsThrottle + | AbsTiltX + | AbsTiltY + | AbsToolWidth + | AbsVolume + | AbsWheel + | AbsX + | AbsY + | AbsZ + > + | Rel : + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + > + , multiplier : Integer + } + , Key = + < Btn0 + | Btn1 + | Btn2 + | Btn3 + | Btn4 + | Btn5 + | Btn6 + | Btn7 + | Btn8 + | Btn9 + | BtnA + | BtnB + | BtnBack + | BtnBase + | BtnBase2 + | BtnBase3 + | BtnBase4 + | BtnBase5 + | BtnBase6 + | BtnC + | BtnDead + | BtnDigi + | BtnDpadDown + | BtnDpadLeft + | BtnDpadRight + | BtnDpadUp + | BtnEast + | BtnExtra + | BtnForward + | BtnGamepad + | BtnGearDown + | BtnGearUp + | BtnJoystick + | BtnLeft + | BtnMiddle + | BtnMisc + | BtnMode + | BtnMouse + | BtnNorth + | BtnPinkie + | BtnRight + | BtnSelect + | BtnSide + | BtnSouth + | BtnStart + | BtnStylus + | BtnStylus2 + | BtnTask + | BtnThumb + | BtnThumb2 + | BtnThumbl + | BtnThumbr + | BtnTl + | BtnTl2 + | BtnToolAirbrush + | BtnToolBrush + | BtnToolDoubletap + | BtnToolFinger + | BtnToolLens + | BtnToolMouse + | BtnToolPen + | BtnToolPencil + | BtnToolQuadtap + | BtnToolQuinttap + | BtnToolRubber + | BtnToolTripletap + | BtnTop + | BtnTop2 + | BtnTouch + | BtnTr + | BtnTr2 + | BtnTrigger + | BtnTriggerHappy + | BtnTriggerHappy1 + | BtnTriggerHappy10 + | BtnTriggerHappy11 + | BtnTriggerHappy12 + | BtnTriggerHappy13 + | BtnTriggerHappy14 + | BtnTriggerHappy15 + | BtnTriggerHappy16 + | BtnTriggerHappy17 + | BtnTriggerHappy18 + | BtnTriggerHappy19 + | BtnTriggerHappy2 + | BtnTriggerHappy20 + | BtnTriggerHappy21 + | BtnTriggerHappy22 + | BtnTriggerHappy23 + | BtnTriggerHappy24 + | BtnTriggerHappy25 + | BtnTriggerHappy26 + | BtnTriggerHappy27 + | BtnTriggerHappy28 + | BtnTriggerHappy29 + | BtnTriggerHappy3 + | BtnTriggerHappy30 + | BtnTriggerHappy31 + | BtnTriggerHappy32 + | BtnTriggerHappy33 + | BtnTriggerHappy34 + | BtnTriggerHappy35 + | BtnTriggerHappy36 + | BtnTriggerHappy37 + | BtnTriggerHappy38 + | BtnTriggerHappy39 + | BtnTriggerHappy4 + | BtnTriggerHappy40 + | BtnTriggerHappy5 + | BtnTriggerHappy6 + | BtnTriggerHappy7 + | BtnTriggerHappy8 + | BtnTriggerHappy9 + | BtnWest + | BtnWheel + | BtnX + | BtnY + | BtnZ + | Key0 + | Key1 + | Key102nd + | Key10channelsdown + | Key10channelsup + | Key2 + | Key3 + | Key4 + | Key5 + | Key6 + | Key7 + | Key8 + | Key9 + | KeyA + | KeyAb + | KeyAddressbook + | KeyAgain + | KeyAlsToggle + | KeyAlterase + | KeyAngle + | KeyApostrophe + | KeyAppselect + | KeyArchive + | KeyAttendantOff + | KeyAttendantOn + | KeyAttendantToggle + | KeyAudio + | KeyAux + | KeyB + | KeyBack + | KeyBackslash + | KeyBackspace + | KeyBassboost + | KeyBattery + | KeyBlue + | KeyBluetooth + | KeyBookmarks + | KeyBreak + | KeyBrightnessAuto + | KeyBrightnessCycle + | KeyBrightnessMax + | KeyBrightnessMin + | KeyBrightnessToggle + | KeyBrightnessZero + | KeyBrightnessdown + | KeyBrightnessup + | KeyBrlDot1 + | KeyBrlDot10 + | KeyBrlDot2 + | KeyBrlDot3 + | KeyBrlDot4 + | KeyBrlDot5 + | KeyBrlDot6 + | KeyBrlDot7 + | KeyBrlDot8 + | KeyBrlDot9 + | KeyButtonconfig + | KeyC + | KeyCalc + | KeyCalendar + | KeyCamera + | KeyCameraDown + | KeyCameraFocus + | KeyCameraLeft + | KeyCameraRight + | KeyCameraUp + | KeyCameraZoomin + | KeyCameraZoomout + | KeyCancel + | KeyCapslock + | KeyCd + | KeyChannel + | KeyChanneldown + | KeyChannelup + | KeyChat + | KeyClear + | KeyClose + | KeyClosecd + | KeyCoffee + | KeyComma + | KeyCompose + | KeyComputer + | KeyConfig + | KeyConnect + | KeyContextMenu + | KeyControlpanel + | KeyCopy + | KeyCut + | KeyCyclewindows + | KeyD + | KeyDashboard + | KeyDatabase + | KeyDelEol + | KeyDelEos + | KeyDelLine + | KeyDelete + | KeyDeletefile + | KeyDigits + | KeyDirection + | KeyDirectory + | KeyDisplayOff + | KeyDisplaytoggle + | KeyDocuments + | KeyDollar + | KeyDot + | KeyDown + | KeyDvd + | KeyE + | KeyEdit + | KeyEditor + | KeyEjectcd + | KeyEjectclosecd + | KeyEmail + | KeyEnd + | KeyEnter + | KeyEpg + | KeyEqual + | KeyEsc + | KeyEuro + | KeyExit + | KeyF + | KeyF1 + | KeyF10 + | KeyF11 + | KeyF12 + | KeyF13 + | KeyF14 + | KeyF15 + | KeyF16 + | KeyF17 + | KeyF18 + | KeyF19 + | KeyF2 + | KeyF20 + | KeyF21 + | KeyF22 + | KeyF23 + | KeyF24 + | KeyF3 + | KeyF4 + | KeyF5 + | KeyF6 + | KeyF7 + | KeyF8 + | KeyF9 + | KeyFastforward + | KeyFavorites + | KeyFile + | KeyFinance + | KeyFind + | KeyFirst + | KeyFn + | KeyFn1 + | KeyFn2 + | KeyFnB + | KeyFnD + | KeyFnE + | KeyFnEsc + | KeyFnF + | KeyFnF1 + | KeyFnF10 + | KeyFnF11 + | KeyFnF12 + | KeyFnF2 + | KeyFnF3 + | KeyFnF4 + | KeyFnF5 + | KeyFnF6 + | KeyFnF7 + | KeyFnF8 + | KeyFnF9 + | KeyFnS + | KeyForward + | KeyForwardmail + | KeyFrameback + | KeyFrameforward + | KeyFront + | KeyG + | KeyGames + | KeyGoto + | KeyGraphicseditor + | KeyGrave + | KeyGreen + | KeyH + | KeyHangeul + | KeyHanguel + | KeyHanja + | KeyHelp + | KeyHenkan + | KeyHiragana + | KeyHome + | KeyHomepage + | KeyHp + | KeyI + | KeyImages + | KeyInfo + | KeyInsLine + | KeyInsert + | KeyIso + | KeyJ + | KeyJournal + | KeyK + | KeyKatakana + | KeyKatakanahiragana + | KeyKbdillumdown + | KeyKbdillumtoggle + | KeyKbdillumup + | KeyKbdinputassistAccept + | KeyKbdinputassistCancel + | KeyKbdinputassistNext + | KeyKbdinputassistNextgroup + | KeyKbdinputassistPrev + | KeyKbdinputassistPrevgroup + | KeyKeyboard + | KeyKp0 + | KeyKp1 + | KeyKp2 + | KeyKp3 + | KeyKp4 + | KeyKp5 + | KeyKp6 + | KeyKp7 + | KeyKp8 + | KeyKp9 + | KeyKpasterisk + | KeyKpcomma + | KeyKpdot + | KeyKpenter + | KeyKpequal + | KeyKpjpcomma + | KeyKpleftparen + | KeyKpminus + | KeyKpplus + | KeyKpplusminus + | KeyKprightparen + | KeyKpslash + | KeyL + | KeyLanguage + | KeyLast + | KeyLeft + | KeyLeftalt + | KeyLeftbrace + | KeyLeftctrl + | KeyLeftmeta + | KeyLeftshift + | KeyLightsToggle + | KeyLinefeed + | KeyList + | KeyLogoff + | KeyM + | KeyMacro + | KeyMail + | KeyMedia + | KeyMediaRepeat + | KeyMemo + | KeyMenu + | KeyMessenger + | KeyMhp + | KeyMicmute + | KeyMinus + | KeyMode + | KeyMove + | KeyMp3 + | KeyMsdos + | KeyMuhenkan + | KeyMute + | KeyN + | KeyNew + | KeyNews + | KeyNext + | KeyNextsong + | KeyNumeric0 + | KeyNumeric1 + | KeyNumeric2 + | KeyNumeric3 + | KeyNumeric4 + | KeyNumeric5 + | KeyNumeric6 + | KeyNumeric7 + | KeyNumeric8 + | KeyNumeric9 + | KeyNumericA + | KeyNumericB + | KeyNumericC + | KeyNumericD + | KeyNumericPound + | KeyNumericStar + | KeyNumlock + | KeyO + | KeyOk + | KeyOpen + | KeyOption + | KeyP + | KeyPagedown + | KeyPageup + | KeyPaste + | KeyPause + | KeyPausecd + | KeyPc + | KeyPhone + | KeyPlay + | KeyPlaycd + | KeyPlayer + | KeyPlaypause + | KeyPower + | KeyPower2 + | KeyPresentation + | KeyPrevious + | KeyPrevioussong + | KeyPrint + | KeyProg1 + | KeyProg2 + | KeyProg3 + | KeyProg4 + | KeyProgram + | KeyProps + | KeyPvr + | KeyQ + | KeyQuestion + | KeyR + | KeyRadio + | KeyRecord + | KeyRed + | KeyRedo + | KeyRefresh + | KeyReply + | KeyReserved + | KeyRestart + | KeyRewind + | KeyRfkill + | KeyRight + | KeyRightalt + | KeyRightbrace + | KeyRightctrl + | KeyRightmeta + | KeyRightshift + | KeyRo + | KeyRotateDisplay + | KeyS + | KeySat + | KeySat2 + | KeySave + | KeyScale + | KeyScreen + | KeyScreenlock + | KeyScreensaver + | KeyScrolldown + | KeyScrolllock + | KeyScrollup + | KeySearch + | KeySelect + | KeySemicolon + | KeySend + | KeySendfile + | KeySetup + | KeyShop + | KeyShuffle + | KeySlash + | KeySleep + | KeySlow + | KeySound + | KeySpace + | KeySpellcheck + | KeySport + | KeySpreadsheet + | KeyStop + | KeyStopcd + | KeySubtitle + | KeySuspend + | KeySwitchvideomode + | KeySysrq + | KeyT + | KeyTab + | KeyTape + | KeyTaskmanager + | KeyTeen + | KeyText + | KeyTime + | KeyTitle + | KeyTouchpadOff + | KeyTouchpadOn + | KeyTouchpadToggle + | KeyTuner + | KeyTv + | KeyTv2 + | KeyTwen + | KeyU + | KeyUndo + | KeyUnknown + | KeyUp + | KeyUwb + | KeyV + | KeyVcr + | KeyVcr2 + | KeyVendor + | KeyVideo + | KeyVideoNext + | KeyVideoPrev + | KeyVideophone + | KeyVoicecommand + | KeyVoicemail + | KeyVolumedown + | KeyVolumeup + | KeyW + | KeyWakeup + | KeyWimax + | KeyWlan + | KeyWordprocessor + | KeyWpsButton + | KeyWwan + | KeyWww + | KeyX + | KeyXfer + | KeyY + | KeyYellow + | KeyYen + | KeyZ + | KeyZenkakuhankaku + | KeyZoom + | KeyZoomin + | KeyZoomout + | KeyZoomreset + > + , RelAxis = + < RelDial + | RelHwheel + | RelMisc + | RelRx + | RelRy + | RelRz + | RelWheel + | RelX + | RelY + | RelZ + > + } + + let ButtonL = AllOS.ButtonLinux + + let ButtonW = {} + + let axis = + λ(a : Evdev.AbsAxis) → + λ(multiplier : Integer) → + { linux = { axis = Evdev.Axis.Abs a, multiplier } + , windows = {=} + , mac = {=} + } + + let button = + λ(x : Integer) → + λ(y : Integer) → + λ(linux : ButtonL) → + λ(windows : ButtonW) → + λ(name : Text) → + λ(colour : monpad.Colour) → + monpad.Elem::{ + , element = + monpad.Element.Button + { buttonData = { linux, windows, mac = {=} } + , colour + , shape = monpad.Shape.Circle 120 + } + , location = { x, y } + , name + } + + in { elements = + [ button +250 +0 ButtonL.BtnWest {=} "Blue" monpad.cols.blue + , button +500 -250 ButtonL.BtnSouth {=} "Green" monpad.cols.green + , button +750 +0 ButtonL.BtnEast {=} "Red" monpad.cols.red + , button +500 +250 ButtonL.BtnNorth {=} "Yellow" monpad.cols.yellow + , monpad.Elem::{ + , element = + monpad.Element.Button + { buttonData = + { linux = ButtonL.BtnMode, windows = {=}, mac = {=} } + , colour = monpad.cols.white + , shape = monpad.Shape.Circle 80 + } + , location = { x = +0, y = -300 } + , name = "Menu" + , text = Some + { text = "M" + , style = monpad.defaultTextStyle + , alignX = monpad.PosX.Centre + , alignY = monpad.PosY.Middle + } + } + , monpad.Elem::{ + , element = + monpad.Element.Stick + { radius = 130 + , range = 340 + , stickColour = monpad.cols.white + , backgroundColour = monpad.cols.grey + , stickDataX = axis Evdev.AbsAxis.AbsX +255 + , stickDataY = axis Evdev.AbsAxis.AbsY -255 + } + , location = { x = -500, y = +0 } + , name = "Stick" + } + ] + , viewBox = { x = -1000, y = -500, w = 2000, h = 1000 } + , backgroundColour = monpad.cols.pastelBlue + , name = "gamepad" + } + : monpad.Layout + ) \ No newline at end of file diff --git a/haskell/rsc/elm.js b/haskell/rsc/elm.js new file mode 100644 index 0000000..00feff6 --- /dev/null +++ b/haskell/rsc/elm.js @@ -0,0 +1,143 @@ +(function(scope){'use strict';function F(arity,fun,wrapper){wrapper.a=arity;wrapper.f=fun;return wrapper} +function F2(fun){return F(2,fun,function(a){return function(b){return fun(a,b)}})} +function F3(fun){return F(3,fun,function(a){return function(b){return function(c){return fun(a,b,c)}}})} +function F4(fun){return F(4,fun,function(a){return function(b){return function(c){return function(d){return fun(a,b,c,d)}}}})} +function F5(fun){return F(5,fun,function(a){return function(b){return function(c){return function(d){return function(e){return fun(a,b,c,d,e)}}}}})} +function F6(fun){return F(6,fun,function(a){return function(b){return function(c){return function(d){return function(e){return function(f){return fun(a,b,c,d,e,f)}}}}}})} +function F7(fun){return F(7,fun,function(a){return function(b){return function(c){return function(d){return function(e){return function(f){return function(g){return fun(a,b,c,d,e,f,g)}}}}}}})} +function F8(fun){return F(8,fun,function(a){return function(b){return function(c){return function(d){return function(e){return function(f){return function(g){return function(h){return fun(a,b,c,d,e,f,g,h)}}}}}}}})} +function F9(fun){return F(9,fun,function(a){return function(b){return function(c){return function(d){return function(e){return function(f){return function(g){return function(h){return function(i){return fun(a,b,c,d,e,f,g,h,i)}}}}}}}}})} +function A2(fun,a,b){return fun.a===2?fun.f(a,b):fun(a)(b)} +function A3(fun,a,b,c){return fun.a===3?fun.f(a,b,c):fun(a)(b)(c)} +function A4(fun,a,b,c,d){return fun.a===4?fun.f(a,b,c,d):fun(a)(b)(c)(d)} +function A5(fun,a,b,c,d,e){return fun.a===5?fun.f(a,b,c,d,e):fun(a)(b)(c)(d)(e)} +function A6(fun,a,b,c,d,e,f){return fun.a===6?fun.f(a,b,c,d,e,f):fun(a)(b)(c)(d)(e)(f)} +function A7(fun,a,b,c,d,e,f,g){return fun.a===7?fun.f(a,b,c,d,e,f,g):fun(a)(b)(c)(d)(e)(f)(g)} +function A8(fun,a,b,c,d,e,f,g,h){return fun.a===8?fun.f(a,b,c,d,e,f,g,h):fun(a)(b)(c)(d)(e)(f)(g)(h)} +function A9(fun,a,b,c,d,e,f,g,h,i){return fun.a===9?fun.f(a,b,c,d,e,f,g,h,i):fun(a)(b)(c)(d)(e)(f)(g)(h)(i)};var _JsArray_empty=[];function _JsArray_singleton(value){return[value]} +function _JsArray_length(array){return array.length};var _JsArray_initialize=F3(function(size,offset,func){var result=new Array(size);for(var i=0;i=0;i--)acc=A2(func,array[i],acc);return acc}),_JsArray_map=F2(function(func,array){var length=array.length,result=new Array(length);for(var i=0;isource.length)itemsToCopy=source.length;var size=destLen+itemsToCopy,result=new Array(size);for(var i=0;i'} +function _Debug_toString_UNUSED(value){return _Debug_toAnsiString(false,value)} +function _Debug_toAnsiString(ansi,value){if(typeof value==='function')return _Debug_internalColor(ansi,'');if(typeof value==='boolean')return _Debug_ctorColor(ansi,value?'True':'False');if(typeof value==='number')return _Debug_numberColor(ansi,value+'');if(value instanceof String)return _Debug_charColor(ansi,"'"+_Debug_addSlashes(value,true)+"'");if(typeof value==='string')return _Debug_stringColor(ansi,'"'+_Debug_addSlashes(value,false)+'"');if(typeof value==='object'&&'$' in value){var tag=value.$;if(typeof tag==='number')return _Debug_internalColor(ansi,'');if(tag[0]==='#'){var output=[];for(var k in value){if(k==='$')continue;output.push(_Debug_toAnsiString(ansi,value[k]))};return'('+output.join(',')+')'};if(tag==='Set_elm_builtin')return _Debug_ctorColor(ansi,'Set')+_Debug_fadeColor(ansi,'.fromList')+' '+_Debug_toAnsiString(ansi,$elm$core$Set$toList(value));if(tag==='RBNode_elm_builtin'||tag==='RBEmpty_elm_builtin')return _Debug_ctorColor(ansi,'Dict')+_Debug_fadeColor(ansi,'.fromList')+' '+_Debug_toAnsiString(ansi,$elm$core$Dict$toList(value));if(tag==='Array_elm_builtin')return _Debug_ctorColor(ansi,'Array')+_Debug_fadeColor(ansi,'.fromList')+' '+_Debug_toAnsiString(ansi,$elm$core$Array$toList(value));if(tag==='::'||tag==='[]'){var output='[';value.b&&(output+=_Debug_toAnsiString(ansi,value.a),value=value.b);for(;value.b;value=value.b)output+=','+_Debug_toAnsiString(ansi,value.a);return output+']'};var output='';for(var i in value){if(i==='$')continue;var str=_Debug_toAnsiString(ansi,value[i]),c0=str[0],parenless=c0==='{'||c0==='('||c0==='['||c0==='<'||c0==='"'||str.indexOf(' ')<0;output+=' '+(parenless?str:'('+str+')')};return _Debug_ctorColor(ansi,tag)+output};if(typeof DataView==='function'&&value instanceof DataView)return _Debug_stringColor(ansi,'<'+value.byteLength+' bytes>');if(typeof File!=='undefined'&&value instanceof File)return _Debug_internalColor(ansi,'<'+value.name+'>');if(typeof value==='object'){var output=[];for(var key in value){var field=key[0]==='_'?key.slice(1):key;output.push(_Debug_fadeColor(ansi,field)+' = '+_Debug_toAnsiString(ansi,value[key]))};if(output.length===0)return'{}';return'{ '+output.join(', ')+' }'};return _Debug_internalColor(ansi,'')} +function _Debug_addSlashes(str,isChar){var s=str.replace(/\\/g,'\\\\').replace(/\n/g,'\\n').replace(/\t/g,'\\t').replace(/\r/g,'\\r').replace(/\v/g,'\\v').replace(/\0/g,'\\0');if(isChar){return s.replace(/\'/g,'\\\'')}else return s.replace(/\"/g,'\\"')} +function _Debug_ctorColor(ansi,string){return ansi?'\x1b[96m'+string+'\x1b[0m':string} +function _Debug_numberColor(ansi,string){return ansi?'\x1b[95m'+string+'\x1b[0m':string} +function _Debug_stringColor(ansi,string){return ansi?'\x1b[93m'+string+'\x1b[0m':string} +function _Debug_charColor(ansi,string){return ansi?'\x1b[92m'+string+'\x1b[0m':string} +function _Debug_fadeColor(ansi,string){return ansi?'\x1b[37m'+string+'\x1b[0m':string} +function _Debug_internalColor(ansi,string){return ansi?'\x1b[36m'+string+'\x1b[0m':string} +function _Debug_toHexDigit(n){return String.fromCharCode(n<10?48+n:55+n)} +function _Debug_crash(identifier){throw new Error('https://github.com/elm/core/blob/1.0.0/hints/'+identifier+'.md')} +function _Debug_crash_UNUSED(identifier,fact1,fact2,fact3,fact4){switch(identifier){case 0:throw new Error('What node should I take over? In JavaScript I need something like:\n\n Elm.Main.init({\n node: document.getElementById("elm-node")\n })\n\nYou need to do this with any Browser.sandbox or Browser.element program.');case 1:throw new Error('Browser.application programs cannot handle URLs like this:\n\n '+document.location.href+'\n\nWhat is the root? The root of your file system? Try looking at this program with `elm reactor` or some other server.');case 2:var jsonErrorString=fact1;throw new Error('Problem with the flags given to your Elm program on initialization.\n\n'+jsonErrorString);case 3:var portName=fact1;throw new Error('There can only be one port named `'+portName+'`, but your program has multiple.');case 4:var portName=fact1,problem=fact2;throw new Error('Trying to send an unexpected type of value through port `'+portName+'`:\n'+problem);case 5:throw new Error('Trying to use `(==)` on functions.\nThere is no way to know if functions are "the same" in the Elm sense.\nRead more about this at https://package.elm-lang.org/packages/elm/core/latest/Basics#== which describes why it is this way and what the better version will look like.');case 6:var moduleName=fact1;throw new Error('Your page is loading multiple Elm scripts with a module named '+moduleName+'. Maybe a duplicate script is getting loaded accidentally? If not, rename one of them so I know which is which!');case 8:var moduleName=fact1,region=fact2,message=fact3;throw new Error('TODO in module `'+moduleName+'` '+_Debug_regionToString(region)+'\n\n'+message);case 9:var moduleName=fact1,region=fact2,value=fact3,message=fact4;throw new Error('TODO in module `'+moduleName+'` from the `case` expression '+_Debug_regionToString(region)+'\n\nIt received the following value:\n\n '+_Debug_toString(value).replace('\n','\n ')+'\n\nBut the branch that handles it says:\n\n '+message.replace('\n','\n '));case 10:throw new Error('Bug in https://github.com/elm/virtual-dom/issues');case 11:throw new Error('Cannot perform mod 0. Division by zero error.')}} +function _Debug_regionToString(region){if(region.ap.Q===region.aB.Q)return'on line '+region.ap.Q;return'on lines '+region.ap.Q+' through '+region.aB.Q} +function _Utils_eq(x,y){for(var pair,stack=[],isEqual=_Utils_eqHelp(x,y,0,stack);isEqual&&(pair=stack.pop());isEqual=_Utils_eqHelp(pair.a,pair.b,0,stack)){};return isEqual} +function _Utils_eqHelp(x,y,depth,stack){if(x===y)return true;if(typeof x!=='object'||x===null||y===null){typeof x==='function'&&_Debug_crash(5);return false};if(depth>100){stack.push(_Utils_Tuple2(x,y));return true};if(x.$<0){x=$elm$core$Dict$toList(x);y=$elm$core$Dict$toList(y)};for(var key in x)if(!_Utils_eqHelp(x[key],y[key],depth+1,stack))return false;return true};var _Utils_equal=F2(_Utils_eq),_Utils_notEqual=F2(function(a,b){return!_Utils_eq(a,b)});function _Utils_cmp(x,y,ord){if(typeof x!=='object')return x===y?0:x0}),_Utils_ge=F2(function(a,b){return _Utils_cmp(a,b)>=0}),_Utils_compare=F2(function(x,y){var n=_Utils_cmp(x,y);return n<0?$elm$core$Basics$LT:n?$elm$core$Basics$GT:$elm$core$Basics$EQ}),_Utils_Tuple0=0,_Utils_Tuple0_UNUSED={$:'#0'};function _Utils_Tuple2(a,b){return{a:a,b:b}} +function _Utils_Tuple2_UNUSED(a,b){return{$:'#2',a:a,b:b}} +function _Utils_Tuple3(a,b,c){return{a:a,b:b,c:c}} +function _Utils_Tuple3_UNUSED(a,b,c){return{$:'#3',a:a,b:b,c:c}} +function _Utils_chr(c){return c} +function _Utils_chr_UNUSED(c){return new String(c)} +function _Utils_update(oldRecord,updatedFields){var newRecord={};for(var key in oldRecord)newRecord[key]=oldRecord[key];for(var key in updatedFields)newRecord[key]=updatedFields[key];return newRecord};var _Utils_append=F2(_Utils_ap);function _Utils_ap(xs,ys){if(typeof xs==='string')return xs+ys;if(!xs.b)return ys;var root=_List_Cons(xs.a,ys);xs=xs.b;for(var curr=root;xs.b;xs=xs.b)curr=curr.b=_List_Cons(xs.a,ys);return root};var _List_Nil={$:0},_List_Nil_UNUSED={$:'[]'};function _List_Cons(hd,tl){return{$:1,a:hd,b:tl}} +function _List_Cons_UNUSED(hd,tl){return{$:'::',a:hd,b:tl}};var _List_cons=F2(_List_Cons);function _List_fromArray(arr){var out=_List_Nil;for(var i=arr.length;i--;)out=_List_Cons(arr[i],out);return out} +function _List_toArray(xs){for(var out=[];xs.b;xs=xs.b)out.push(xs.a);return out};var _List_map2=F3(function(f,xs,ys){for(var arr=[];xs.b&&ys.b;xs=xs.b,ys=ys.b)arr.push(A2(f,xs.a,ys.a));return _List_fromArray(arr)}),_List_map3=F4(function(f,xs,ys,zs){for(var arr=[];xs.b&&ys.b&&zs.b;xs=xs.b,ys=ys.b,zs=zs.b)arr.push(A3(f,xs.a,ys.a,zs.a));return _List_fromArray(arr)}),_List_map4=F5(function(f,ws,xs,ys,zs){for(var arr=[];ws.b&&xs.b&&ys.b&&zs.b;ws=ws.b,xs=xs.b,ys=ys.b,zs=zs.b)arr.push(A4(f,ws.a,xs.a,ys.a,zs.a));return _List_fromArray(arr)}),_List_map5=F6(function(f,vs,ws,xs,ys,zs){for(var arr=[];vs.b&&ws.b&&xs.b&&ys.b&&zs.b;vs=vs.b,ws=ws.b,xs=xs.b,ys=ys.b,zs=zs.b)arr.push(A5(f,vs.a,ws.a,xs.a,ys.a,zs.a));return _List_fromArray(arr)}),_List_sortBy=F2(function(f,xs){return _List_fromArray(_List_toArray(xs).sort(function(a,b){return _Utils_cmp(f(a),f(b))}))}),_List_sortWith=F2(function(f,xs){return _List_fromArray(_List_toArray(xs).sort(function(a,b){var ord=A2(f,a,b);return ord===$elm$core$Basics$EQ?0:ord===$elm$core$Basics$LT?-1:1}))}),_Basics_add=F2(function(a,b){return a+b}),_Basics_sub=F2(function(a,b){return a-b}),_Basics_mul=F2(function(a,b){return a*b}),_Basics_fdiv=F2(function(a,b){return a/b}),_Basics_idiv=F2(function(a,b){return(a/b)|0}),_Basics_pow=F2(Math.pow),_Basics_remainderBy=F2(function(b,a){return a%b}),_Basics_modBy=F2(function(modulus,x){var answer=x%modulus;return modulus===0?_Debug_crash(11):((answer>0&&modulus<0)||(answer<0&&modulus>0))?answer+modulus:answer}),_Basics_pi=Math.PI,_Basics_e=Math.E,_Basics_cos=Math.cos,_Basics_sin=Math.sin,_Basics_tan=Math.tan,_Basics_acos=Math.acos,_Basics_asin=Math.asin,_Basics_atan=Math.atan,_Basics_atan2=F2(Math.atan2);function _Basics_toFloat(x){return x} +function _Basics_truncate(n){return n|0} +function _Basics_isInfinite(n){return n===Infinity||n===-Infinity};var _Basics_ceiling=Math.ceil,_Basics_floor=Math.floor,_Basics_round=Math.round,_Basics_sqrt=Math.sqrt,_Basics_log=Math.log,_Basics_isNaN=isNaN;function _Basics_not(bool){return!bool};var _Basics_and=F2(function(a,b){return a&&b}),_Basics_or=F2(function(a,b){return a||b}),_Basics_xor=F2(function(a,b){return a!==b}),_String_cons=F2(function(chr,str){return chr+str});function _String_uncons(string){var word=string.charCodeAt(0);return!isNaN(word)?$elm$core$Maybe$Just(0xD800<=word&&word<=0xDBFF?_Utils_Tuple2(_Utils_chr(string[0]+string[1]),string.slice(2)):_Utils_Tuple2(_Utils_chr(string[0]),string.slice(1))):$elm$core$Maybe$Nothing};var _String_append=F2(function(a,b){return a+b});function _String_length(str){return str.length};var _String_map=F2(function(func,string){var len=string.length,array=new Array(len),i=0;while(i-1}),_String_startsWith=F2(function(sub,str){return str.indexOf(sub)===0}),_String_endsWith=F2(function(sub,str){return str.length>=sub.length&&str.lastIndexOf(sub)===str.length-sub.length}),_String_indexes=F2(function(sub,str){var subLen=sub.length;if(subLen<1)return _List_Nil;var i=0,is=[];while((i=str.indexOf(sub,i))>-1){is.push(i);i=i+subLen};return _List_fromArray(is)});function _String_fromNumber(number){return number+''} +function _String_toInt(str){var total=0,code0=str.charCodeAt(0),start=code0==0x2B||code0==0x2D?1:0;for(var i=start;i=value.length)return _Json_expecting('a LONGER array. Need index '+index+' but only see '+value.length+' entries',value);var result=_Json_runHelp(decoder.b,value[index]);return($elm$core$Result$isOk(result))?result:$elm$core$Result$Err(A2($elm$json$Json$Decode$Index,index,result.a));case 8:if(typeof value!=='object'||value===null||_Json_isArray(value))return _Json_expecting('an OBJECT',value);var keyValuePairs=_List_Nil;for(var key in value)if(value.hasOwnProperty(key)){var result=_Json_runHelp(decoder.b,value[key]);if(!$elm$core$Result$isOk(result))return $elm$core$Result$Err(A2($elm$json$Json$Decode$Field,key,result.a));keyValuePairs=_List_Cons(_Utils_Tuple2(key,result.a),keyValuePairs)};return $elm$core$Result$Ok($elm$core$List$reverse(keyValuePairs));case 9:var answer=decoder.f,decoders=decoder.g;for(var i=0;i=0)subs.splice(index,1)};return{subscribe:subscribe,unsubscribe:unsubscribe}} +function _Platform_incomingPort(name,converter){_Platform_checkPortName(name);_Platform_effectManagers[name]={f:_Platform_incomingPortMap,u:converter,a:_Platform_setupIncomingPort};return _Platform_leaf(name)};var _Platform_incomingPortMap=F2(function(tagger,finalTagger){return function(value){return tagger(finalTagger(value))}});function _Platform_setupIncomingPort(name,sendToApp){var subs=_List_Nil,converter=_Platform_effectManagers[name].u,init=_Scheduler_succeed(null);_Platform_effectManagers[name].b=init;_Platform_effectManagers[name].c=F3(function(router,subList,state){subs=subList;return init});function send(incomingValue){var result=A2(_Json_run,converter,_Json_wrap(incomingValue));$elm$core$Result$isOk(result)||_Debug_crash(4,name,result.a);var value=result.a;for(var temp=subs;temp.b;temp=temp.b)sendToApp(temp.a(value))};return{send:send}} +function _Platform_export(exports){scope['Elm']?_Platform_mergeExportsProd(scope['Elm'],exports):scope['Elm']=exports} +function _Platform_mergeExportsProd(obj,exports){for(var name in exports)(name in obj)?(name=='init')?_Debug_crash(6):_Platform_mergeExportsProd(obj[name],exports[name]):(obj[name]=exports[name])} +function _Platform_export_UNUSED(exports){scope['Elm']?_Platform_mergeExportsDebug('Elm',scope['Elm'],exports):scope['Elm']=exports} +function _Platform_mergeExportsDebug(moduleName,obj,exports){for(var name in exports)(name in obj)?(name=='init')?_Debug_crash(6,moduleName):_Platform_mergeExportsDebug(moduleName+'.'+name,obj[name],exports[name]):(obj[name]=exports[name])};var _MJS_v2=F2(function(x,y){return new Float64Array([x,y])}),_MJS_v2getX=function(a){return a[0]},_MJS_v2getY=function(a){return a[1]},_MJS_v2setX=F2(function(x,a){return new Float64Array([x,a[1]])}),_MJS_v2setY=F2(function(y,a){return new Float64Array([a[0],y])}),_MJS_v2toRecord=function(a){return{dh:a[0],di:a[1]}},_MJS_v2fromRecord=function(r){return new Float64Array([r.dh,r.di])},_MJS_v2add=F2(function(a,b){var r=new Float64Array(2);r[0]=a[0]+b[0];r[1]=a[1]+b[1];return r}),_MJS_v2sub=F2(function(a,b){var r=new Float64Array(2);r[0]=a[0]-b[0];r[1]=a[1]-b[1];return r}),_MJS_v2negate=function(a){var r=new Float64Array(2);r[0]=-a[0];r[1]=-a[1];return r},_MJS_v2direction=F2(function(a,b){var r=new Float64Array(2);r[0]=a[0]-b[0];r[1]=a[1]-b[1];var im=1.0/_MJS_v2lengthLocal(r);r[0]=r[0]*im;r[1]=r[1]*im;return r});function _MJS_v2lengthLocal(a){return Math.sqrt(a[0]*a[0]+a[1]*a[1])};var _MJS_v2length=_MJS_v2lengthLocal,_MJS_v2lengthSquared=function(a){return a[0]*a[0]+a[1]*a[1]},_MJS_v2distance=F2(function(a,b){var dx=a[0]-b[0],dy=a[1]-b[1];return Math.sqrt(dx*dx+dy*dy)}),_MJS_v2distanceSquared=F2(function(a,b){var dx=a[0]-b[0],dy=a[1]-b[1];return dx*dx+dy*dy}),_MJS_v2normalize=function(a){var r=new Float64Array(2),im=1.0/_MJS_v2lengthLocal(a);r[0]=a[0]*im;r[1]=a[1]*im;return r},_MJS_v2scale=F2(function(k,a){var r=new Float64Array(2);r[0]=a[0]*k;r[1]=a[1]*k;return r}),_MJS_v2dot=F2(function(a,b){return a[0]*b[0]+a[1]*b[1]}),_MJS_v3temp1Local=new Float64Array(3),_MJS_v3temp2Local=new Float64Array(3),_MJS_v3temp3Local=new Float64Array(3),_MJS_v3=F3(function(x,y,z){return new Float64Array([x,y,z])}),_MJS_v3getX=function(a){return a[0]},_MJS_v3getY=function(a){return a[1]},_MJS_v3getZ=function(a){return a[2]},_MJS_v3setX=F2(function(x,a){return new Float64Array([x,a[1],a[2]])}),_MJS_v3setY=F2(function(y,a){return new Float64Array([a[0],y,a[2]])}),_MJS_v3setZ=F2(function(z,a){return new Float64Array([a[0],a[1],z])}),_MJS_v3toRecord=function(a){return{dh:a[0],di:a[1],ad:a[2]}},_MJS_v3fromRecord=function(r){return new Float64Array([r.dh,r.di,r.ad])},_MJS_v3add=F2(function(a,b){var r=new Float64Array(3);r[0]=a[0]+b[0];r[1]=a[1]+b[1];r[2]=a[2]+b[2];return r});function _MJS_v3subLocal(a,b,r){if(r===undefined)r=new Float64Array(3);r[0]=a[0]-b[0];r[1]=a[1]-b[1];r[2]=a[2]-b[2];return r};var _MJS_v3sub=F2(_MJS_v3subLocal),_MJS_v3negate=function(a){var r=new Float64Array(3);r[0]=-a[0];r[1]=-a[1];r[2]=-a[2];return r};function _MJS_v3directionLocal(a,b,r){if(r===undefined)r=new Float64Array(3);return _MJS_v3normalizeLocal(_MJS_v3subLocal(a,b,r),r)};var _MJS_v3direction=F2(_MJS_v3directionLocal);function _MJS_v3lengthLocal(a){return Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2])};var _MJS_v3length=_MJS_v3lengthLocal,_MJS_v3lengthSquared=function(a){return a[0]*a[0]+a[1]*a[1]+a[2]*a[2]},_MJS_v3distance=F2(function(a,b){var dx=a[0]-b[0],dy=a[1]-b[1],dz=a[2]-b[2];return Math.sqrt(dx*dx+dy*dy+dz*dz)}),_MJS_v3distanceSquared=F2(function(a,b){var dx=a[0]-b[0],dy=a[1]-b[1],dz=a[2]-b[2];return dx*dx+dy*dy+dz*dz});function _MJS_v3normalizeLocal(a,r){if(r===undefined)r=new Float64Array(3);var im=1.0/_MJS_v3lengthLocal(a);r[0]=a[0]*im;r[1]=a[1]*im;r[2]=a[2]*im;return r};var _MJS_v3normalize=_MJS_v3normalizeLocal,_MJS_v3scale=F2(function(k,a){return new Float64Array([a[0]*k,a[1]*k,a[2]*k])}),_MJS_v3dotLocal=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]},_MJS_v3dot=F2(_MJS_v3dotLocal);function _MJS_v3crossLocal(a,b,r){if(r===undefined)r=new Float64Array(3);r[0]=a[1]*b[2]-a[2]*b[1];r[1]=a[2]*b[0]-a[0]*b[2];r[2]=a[0]*b[1]-a[1]*b[0];return r};var _MJS_v3cross=F2(_MJS_v3crossLocal),_MJS_v3mul4x4=F2(function(m,v){var w,tmp=_MJS_v3temp1Local,r=new Float64Array(3);tmp[0]=m[3];tmp[1]=m[7];tmp[2]=m[11];w=_MJS_v3dotLocal(v,tmp)+m[15];tmp[0]=m[0];tmp[1]=m[4];tmp[2]=m[8];r[0]=(_MJS_v3dotLocal(v,tmp)+m[12])/w;tmp[0]=m[1];tmp[1]=m[5];tmp[2]=m[9];r[1]=(_MJS_v3dotLocal(v,tmp)+m[13])/w;tmp[0]=m[2];tmp[1]=m[6];tmp[2]=m[10];r[2]=(_MJS_v3dotLocal(v,tmp)+m[14])/w;return r}),_MJS_v4=F4(function(x,y,z,w){return new Float64Array([x,y,z,w])}),_MJS_v4getX=function(a){return a[0]},_MJS_v4getY=function(a){return a[1]},_MJS_v4getZ=function(a){return a[2]},_MJS_v4getW=function(a){return a[3]},_MJS_v4setX=F2(function(x,a){return new Float64Array([x,a[1],a[2],a[3]])}),_MJS_v4setY=F2(function(y,a){return new Float64Array([a[0],y,a[2],a[3]])}),_MJS_v4setZ=F2(function(z,a){return new Float64Array([a[0],a[1],z,a[3]])}),_MJS_v4setW=F2(function(w,a){return new Float64Array([a[0],a[1],a[2],w])}),_MJS_v4toRecord=function(a){return{dh:a[0],di:a[1],ad:a[2],dd:a[3]}},_MJS_v4fromRecord=function(r){return new Float64Array([r.dh,r.di,r.ad,r.dd])},_MJS_v4add=F2(function(a,b){var r=new Float64Array(4);r[0]=a[0]+b[0];r[1]=a[1]+b[1];r[2]=a[2]+b[2];r[3]=a[3]+b[3];return r}),_MJS_v4sub=F2(function(a,b){var r=new Float64Array(4);r[0]=a[0]-b[0];r[1]=a[1]-b[1];r[2]=a[2]-b[2];r[3]=a[3]-b[3];return r}),_MJS_v4negate=function(a){var r=new Float64Array(4);r[0]=-a[0];r[1]=-a[1];r[2]=-a[2];r[3]=-a[3];return r},_MJS_v4direction=F2(function(a,b){var r=new Float64Array(4);r[0]=a[0]-b[0];r[1]=a[1]-b[1];r[2]=a[2]-b[2];r[3]=a[3]-b[3];var im=1.0/_MJS_v4lengthLocal(r);r[0]=r[0]*im;r[1]=r[1]*im;r[2]=r[2]*im;r[3]=r[3]*im;return r});function _MJS_v4lengthLocal(a){return Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+a[3]*a[3])};var _MJS_v4length=_MJS_v4lengthLocal,_MJS_v4lengthSquared=function(a){return a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+a[3]*a[3]},_MJS_v4distance=F2(function(a,b){var dx=a[0]-b[0],dy=a[1]-b[1],dz=a[2]-b[2],dw=a[3]-b[3];return Math.sqrt(dx*dx+dy*dy+dz*dz+dw*dw)}),_MJS_v4distanceSquared=F2(function(a,b){var dx=a[0]-b[0],dy=a[1]-b[1],dz=a[2]-b[2],dw=a[3]-b[3];return dx*dx+dy*dy+dz*dz+dw*dw}),_MJS_v4normalize=function(a){var r=new Float64Array(4),im=1.0/_MJS_v4lengthLocal(a);r[0]=a[0]*im;r[1]=a[1]*im;r[2]=a[2]*im;r[3]=a[3]*im;return r},_MJS_v4scale=F2(function(k,a){var r=new Float64Array(4);r[0]=a[0]*k;r[1]=a[1]*k;r[2]=a[2]*k;r[3]=a[3]*k;return r}),_MJS_v4dot=F2(function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]}),_MJS_m4x4temp1Local=new Float64Array(16),_MJS_m4x4temp2Local=new Float64Array(16),_MJS_m4x4identity=new Float64Array([1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0]),_MJS_m4x4fromRecord=function(r){var m=new Float64Array(16);m[0]=r.aL;m[1]=r.aP;m[2]=r.aT;m[3]=r.aX;m[4]=r.aM;m[5]=r.aQ;m[6]=r.aU;m[7]=r.aY;m[8]=r.aN;m[9]=r.aR;m[10]=r.aV;m[11]=r.aZ;m[12]=r.aO;m[13]=r.aS;m[14]=r.aW;m[15]=r.a_;return m},_MJS_m4x4toRecord=function(m){return{aL:m[0],aP:m[1],aT:m[2],aX:m[3],aM:m[4],aQ:m[5],aU:m[6],aY:m[7],aN:m[8],aR:m[9],aV:m[10],aZ:m[11],aO:m[12],aS:m[13],aW:m[14],a_:m[15]}},_MJS_m4x4inverse=function(m){var r=new Float64Array(16);r[0]=m[5]*m[10]*m[15]-m[5]*m[11]*m[14]-m[9]*m[6]*m[15]+m[9]*m[7]*m[14]+m[13]*m[6]*m[11]-m[13]*m[7]*m[10];r[4]=-m[4]*m[10]*m[15]+m[4]*m[11]*m[14]+m[8]*m[6]*m[15]-m[8]*m[7]*m[14]-m[12]*m[6]*m[11]+m[12]*m[7]*m[10];r[8]=m[4]*m[9]*m[15]-m[4]*m[11]*m[13]-m[8]*m[5]*m[15]+m[8]*m[7]*m[13]+m[12]*m[5]*m[11]-m[12]*m[7]*m[9];r[12]=-m[4]*m[9]*m[14]+m[4]*m[10]*m[13]+m[8]*m[5]*m[14]-m[8]*m[6]*m[13]-m[12]*m[5]*m[10]+m[12]*m[6]*m[9];r[1]=-m[1]*m[10]*m[15]+m[1]*m[11]*m[14]+m[9]*m[2]*m[15]-m[9]*m[3]*m[14]-m[13]*m[2]*m[11]+m[13]*m[3]*m[10];r[5]=m[0]*m[10]*m[15]-m[0]*m[11]*m[14]-m[8]*m[2]*m[15]+m[8]*m[3]*m[14]+m[12]*m[2]*m[11]-m[12]*m[3]*m[10];r[9]=-m[0]*m[9]*m[15]+m[0]*m[11]*m[13]+m[8]*m[1]*m[15]-m[8]*m[3]*m[13]-m[12]*m[1]*m[11]+m[12]*m[3]*m[9];r[13]=m[0]*m[9]*m[14]-m[0]*m[10]*m[13]-m[8]*m[1]*m[14]+m[8]*m[2]*m[13]+m[12]*m[1]*m[10]-m[12]*m[2]*m[9];r[2]=m[1]*m[6]*m[15]-m[1]*m[7]*m[14]-m[5]*m[2]*m[15]+m[5]*m[3]*m[14]+m[13]*m[2]*m[7]-m[13]*m[3]*m[6];r[6]=-m[0]*m[6]*m[15]+m[0]*m[7]*m[14]+m[4]*m[2]*m[15]-m[4]*m[3]*m[14]-m[12]*m[2]*m[7]+m[12]*m[3]*m[6];r[10]=m[0]*m[5]*m[15]-m[0]*m[7]*m[13]-m[4]*m[1]*m[15]+m[4]*m[3]*m[13]+m[12]*m[1]*m[7]-m[12]*m[3]*m[5];r[14]=-m[0]*m[5]*m[14]+m[0]*m[6]*m[13]+m[4]*m[1]*m[14]-m[4]*m[2]*m[13]-m[12]*m[1]*m[6]+m[12]*m[2]*m[5];r[3]=-m[1]*m[6]*m[11]+m[1]*m[7]*m[10]+m[5]*m[2]*m[11]-m[5]*m[3]*m[10]-m[9]*m[2]*m[7]+m[9]*m[3]*m[6];r[7]=m[0]*m[6]*m[11]-m[0]*m[7]*m[10]-m[4]*m[2]*m[11]+m[4]*m[3]*m[10]+m[8]*m[2]*m[7]-m[8]*m[3]*m[6];r[11]=-m[0]*m[5]*m[11]+m[0]*m[7]*m[9]+m[4]*m[1]*m[11]-m[4]*m[3]*m[9]-m[8]*m[1]*m[7]+m[8]*m[3]*m[5];r[15]=m[0]*m[5]*m[10]-m[0]*m[6]*m[9]-m[4]*m[1]*m[10]+m[4]*m[2]*m[9]+m[8]*m[1]*m[6]-m[8]*m[2]*m[5];var det=m[0]*r[0]+m[1]*r[4]+m[2]*r[8]+m[3]*r[12];if(det===0)return $elm$core$Maybe$Nothing;det=1.0/det;for(var i=0;i<16;i=i+1)r[i]=r[i]*det;return $elm$core$Maybe$Just(r)},_MJS_m4x4inverseOrthonormal=function(m){var r=_MJS_m4x4transposeLocal(m),t=[m[12],m[13],m[14]];r[3]=r[7]=r[11]=0;r[12]=-_MJS_v3dotLocal([r[0],r[4],r[8]],t);r[13]=-_MJS_v3dotLocal([r[1],r[5],r[9]],t);r[14]=-_MJS_v3dotLocal([r[2],r[6],r[10]],t);return r};function _MJS_m4x4makeFrustumLocal(left,right,bottom,top,znear,zfar){var r=new Float64Array(16);r[0]=2*znear/(right-left);r[1]=0;r[2]=0;r[3]=0;r[4]=0;r[5]=2*znear/(top-bottom);r[6]=0;r[7]=0;r[8]=(right+left)/(right-left);r[9]=(top+bottom)/(top-bottom);r[10]=-(zfar+znear)/(zfar-znear);r[11]=-1;r[12]=0;r[13]=0;r[14]=-2*zfar*znear/(zfar-znear);r[15]=0;return r};var _MJS_m4x4makeFrustum=F6(_MJS_m4x4makeFrustumLocal),_MJS_m4x4makePerspective=F4(function(fovy,aspect,znear,zfar){var ymax=znear*Math.tan(fovy*Math.PI/360.0),ymin=-ymax,xmin=ymin*aspect,xmax=ymax*aspect;return _MJS_m4x4makeFrustumLocal(xmin,xmax,ymin,ymax,znear,zfar)});function _MJS_m4x4makeOrthoLocal(left,right,bottom,top,znear,zfar){var r=new Float64Array(16);r[0]=2/(right-left);r[1]=0;r[2]=0;r[3]=0;r[4]=0;r[5]=2/(top-bottom);r[6]=0;r[7]=0;r[8]=0;r[9]=0;r[10]=-2/(zfar-znear);r[11]=0;r[12]=-(right+left)/(right-left);r[13]=-(top+bottom)/(top-bottom);r[14]=-(zfar+znear)/(zfar-znear);r[15]=1;return r};var _MJS_m4x4makeOrtho=F6(_MJS_m4x4makeOrthoLocal),_MJS_m4x4makeOrtho2D=F4(function(left,right,bottom,top){return _MJS_m4x4makeOrthoLocal(left,right,bottom,top,-1,1)});function _MJS_m4x4mulLocal(a,b){var r=new Float64Array(16),a11=a[0],a21=a[1],a31=a[2],a41=a[3],a12=a[4],a22=a[5],a32=a[6],a42=a[7],a13=a[8],a23=a[9],a33=a[10],a43=a[11],a14=a[12],a24=a[13],a34=a[14],a44=a[15],b11=b[0],b21=b[1],b31=b[2],b41=b[3],b12=b[4],b22=b[5],b32=b[6],b42=b[7],b13=b[8],b23=b[9],b33=b[10],b43=b[11],b14=b[12],b24=b[13],b34=b[14],b44=b[15];r[0]=a11*b11+a12*b21+a13*b31+a14*b41;r[1]=a21*b11+a22*b21+a23*b31+a24*b41;r[2]=a31*b11+a32*b21+a33*b31+a34*b41;r[3]=a41*b11+a42*b21+a43*b31+a44*b41;r[4]=a11*b12+a12*b22+a13*b32+a14*b42;r[5]=a21*b12+a22*b22+a23*b32+a24*b42;r[6]=a31*b12+a32*b22+a33*b32+a34*b42;r[7]=a41*b12+a42*b22+a43*b32+a44*b42;r[8]=a11*b13+a12*b23+a13*b33+a14*b43;r[9]=a21*b13+a22*b23+a23*b33+a24*b43;r[10]=a31*b13+a32*b23+a33*b33+a34*b43;r[11]=a41*b13+a42*b23+a43*b33+a44*b43;r[12]=a11*b14+a12*b24+a13*b34+a14*b44;r[13]=a21*b14+a22*b24+a23*b34+a24*b44;r[14]=a31*b14+a32*b24+a33*b34+a34*b44;r[15]=a41*b14+a42*b24+a43*b34+a44*b44;return r};var _MJS_m4x4mul=F2(_MJS_m4x4mulLocal),_MJS_m4x4mulAffine=F2(function(a,b){var r=new Float64Array(16),a11=a[0],a21=a[1],a31=a[2],a12=a[4],a22=a[5],a32=a[6],a13=a[8],a23=a[9],a33=a[10],a14=a[12],a24=a[13],a34=a[14],b11=b[0],b21=b[1],b31=b[2],b12=b[4],b22=b[5],b32=b[6],b13=b[8],b23=b[9],b33=b[10],b14=b[12],b24=b[13],b34=b[14];r[0]=a11*b11+a12*b21+a13*b31;r[1]=a21*b11+a22*b21+a23*b31;r[2]=a31*b11+a32*b21+a33*b31;r[3]=0;r[4]=a11*b12+a12*b22+a13*b32;r[5]=a21*b12+a22*b22+a23*b32;r[6]=a31*b12+a32*b22+a33*b32;r[7]=0;r[8]=a11*b13+a12*b23+a13*b33;r[9]=a21*b13+a22*b23+a23*b33;r[10]=a31*b13+a32*b23+a33*b33;r[11]=0;r[12]=a11*b14+a12*b24+a13*b34+a14;r[13]=a21*b14+a22*b24+a23*b34+a24;r[14]=a31*b14+a32*b24+a33*b34+a34;r[15]=1;return r}),_MJS_m4x4makeRotate=F2(function(angle,axis){var r=new Float64Array(16);axis=_MJS_v3normalizeLocal(axis,_MJS_v3temp1Local);var x=axis[0],y=axis[1],z=axis[2],c=Math.cos(angle),c1=1-c,s=Math.sin(angle);r[0]=x*x*c1+c;r[1]=y*x*c1+z*s;r[2]=z*x*c1-y*s;r[3]=0;r[4]=x*y*c1-z*s;r[5]=y*y*c1+c;r[6]=y*z*c1+x*s;r[7]=0;r[8]=x*z*c1+y*s;r[9]=y*z*c1-x*s;r[10]=z*z*c1+c;r[11]=0;r[12]=0;r[13]=0;r[14]=0;r[15]=1;return r}),_MJS_m4x4rotate=F3(function(angle,axis,m){var r=new Float64Array(16),im=1.0/_MJS_v3lengthLocal(axis),x=axis[0]*im,y=axis[1]*im,z=axis[2]*im,c=Math.cos(angle),c1=1-c,s=Math.sin(angle),xs=x*s,ys=y*s,zs=z*s,xyc1=x*y*c1,xzc1=x*z*c1,yzc1=y*z*c1,t11=x*x*c1+c,t21=xyc1+zs,t31=xzc1-ys,t12=xyc1-zs,t22=y*y*c1+c,t32=yzc1+xs,t13=xzc1+ys,t23=yzc1-xs,t33=z*z*c1+c,m11=m[0],m21=m[1],m31=m[2],m41=m[3],m12=m[4],m22=m[5],m32=m[6],m42=m[7],m13=m[8],m23=m[9],m33=m[10],m43=m[11],m14=m[12],m24=m[13],m34=m[14],m44=m[15];r[0]=m11*t11+m12*t21+m13*t31;r[1]=m21*t11+m22*t21+m23*t31;r[2]=m31*t11+m32*t21+m33*t31;r[3]=m41*t11+m42*t21+m43*t31;r[4]=m11*t12+m12*t22+m13*t32;r[5]=m21*t12+m22*t22+m23*t32;r[6]=m31*t12+m32*t22+m33*t32;r[7]=m41*t12+m42*t22+m43*t32;r[8]=m11*t13+m12*t23+m13*t33;r[9]=m21*t13+m22*t23+m23*t33;r[10]=m31*t13+m32*t23+m33*t33;r[11]=m41*t13+m42*t23+m43*t33;r[12]=m14,r[13]=m24;r[14]=m34;r[15]=m44;return r});function _MJS_m4x4makeScale3Local(x,y,z){var r=new Float64Array(16);r[0]=x;r[1]=0;r[2]=0;r[3]=0;r[4]=0;r[5]=y;r[6]=0;r[7]=0;r[8]=0;r[9]=0;r[10]=z;r[11]=0;r[12]=0;r[13]=0;r[14]=0;r[15]=1;return r};var _MJS_m4x4makeScale3=F3(_MJS_m4x4makeScale3Local),_MJS_m4x4makeScale=function(v){return _MJS_m4x4makeScale3Local(v[0],v[1],v[2])},_MJS_m4x4scale3=F4(function(x,y,z,m){var r=new Float64Array(16);r[0]=m[0]*x;r[1]=m[1]*x;r[2]=m[2]*x;r[3]=m[3]*x;r[4]=m[4]*y;r[5]=m[5]*y;r[6]=m[6]*y;r[7]=m[7]*y;r[8]=m[8]*z;r[9]=m[9]*z;r[10]=m[10]*z;r[11]=m[11]*z;r[12]=m[12];r[13]=m[13];r[14]=m[14];r[15]=m[15];return r}),_MJS_m4x4scale=F2(function(v,m){var r=new Float64Array(16),x=v[0],y=v[1],z=v[2];r[0]=m[0]*x;r[1]=m[1]*x;r[2]=m[2]*x;r[3]=m[3]*x;r[4]=m[4]*y;r[5]=m[5]*y;r[6]=m[6]*y;r[7]=m[7]*y;r[8]=m[8]*z;r[9]=m[9]*z;r[10]=m[10]*z;r[11]=m[11]*z;r[12]=m[12];r[13]=m[13];r[14]=m[14];r[15]=m[15];return r});function _MJS_m4x4makeTranslate3Local(x,y,z){var r=new Float64Array(16);r[0]=1;r[1]=0;r[2]=0;r[3]=0;r[4]=0;r[5]=1;r[6]=0;r[7]=0;r[8]=0;r[9]=0;r[10]=1;r[11]=0;r[12]=x;r[13]=y;r[14]=z;r[15]=1;return r};var _MJS_m4x4makeTranslate3=F3(_MJS_m4x4makeTranslate3Local),_MJS_m4x4makeTranslate=function(v){return _MJS_m4x4makeTranslate3Local(v[0],v[1],v[2])},_MJS_m4x4translate3=F4(function(x,y,z,m){var r=new Float64Array(16),m11=m[0],m21=m[1],m31=m[2],m41=m[3],m12=m[4],m22=m[5],m32=m[6],m42=m[7],m13=m[8],m23=m[9],m33=m[10],m43=m[11];r[0]=m11;r[1]=m21;r[2]=m31;r[3]=m41;r[4]=m12;r[5]=m22;r[6]=m32;r[7]=m42;r[8]=m13;r[9]=m23;r[10]=m33;r[11]=m43;r[12]=m11*x+m12*y+m13*z+m[12];r[13]=m21*x+m22*y+m23*z+m[13];r[14]=m31*x+m32*y+m33*z+m[14];r[15]=m41*x+m42*y+m43*z+m[15];return r}),_MJS_m4x4translate=F2(function(v,m){var r=new Float64Array(16),x=v[0],y=v[1],z=v[2],m11=m[0],m21=m[1],m31=m[2],m41=m[3],m12=m[4],m22=m[5],m32=m[6],m42=m[7],m13=m[8],m23=m[9],m33=m[10],m43=m[11];r[0]=m11;r[1]=m21;r[2]=m31;r[3]=m41;r[4]=m12;r[5]=m22;r[6]=m32;r[7]=m42;r[8]=m13;r[9]=m23;r[10]=m33;r[11]=m43;r[12]=m11*x+m12*y+m13*z+m[12];r[13]=m21*x+m22*y+m23*z+m[13];r[14]=m31*x+m32*y+m33*z+m[14];r[15]=m41*x+m42*y+m43*z+m[15];return r}),_MJS_m4x4makeLookAt=F3(function(eye,center,up){var z=_MJS_v3directionLocal(eye,center,_MJS_v3temp1Local),x=_MJS_v3normalizeLocal(_MJS_v3crossLocal(up,z,_MJS_v3temp2Local),_MJS_v3temp2Local),y=_MJS_v3normalizeLocal(_MJS_v3crossLocal(z,x,_MJS_v3temp3Local),_MJS_v3temp3Local),tm1=_MJS_m4x4temp1Local,tm2=_MJS_m4x4temp2Local;tm1[0]=x[0];tm1[1]=y[0];tm1[2]=z[0];tm1[3]=0;tm1[4]=x[1];tm1[5]=y[1];tm1[6]=z[1];tm1[7]=0;tm1[8]=x[2];tm1[9]=y[2];tm1[10]=z[2];tm1[11]=0;tm1[12]=0;tm1[13]=0;tm1[14]=0;tm1[15]=1;tm2[0]=1;tm2[1]=0;tm2[2]=0;tm2[3]=0;tm2[4]=0;tm2[5]=1;tm2[6]=0;tm2[7]=0;tm2[8]=0;tm2[9]=0;tm2[10]=1;tm2[11]=0;tm2[12]=-eye[0];tm2[13]=-eye[1];tm2[14]=-eye[2];tm2[15]=1;return _MJS_m4x4mulLocal(tm1,tm2)});function _MJS_m4x4transposeLocal(m){var r=new Float64Array(16);r[0]=m[0];r[1]=m[4];r[2]=m[8];r[3]=m[12];r[4]=m[1];r[5]=m[5];r[6]=m[9];r[7]=m[13];r[8]=m[2];r[9]=m[6];r[10]=m[10];r[11]=m[14];r[12]=m[3];r[13]=m[7];r[14]=m[11];r[15]=m[15];return r};var _MJS_m4x4transpose=_MJS_m4x4transposeLocal,_MJS_m4x4makeBasis=F3(function(vx,vy,vz){var r=new Float64Array(16);r[0]=vx[0];r[1]=vx[1];r[2]=vx[2];r[3]=0;r[4]=vy[0];r[5]=vy[1];r[6]=vy[2];r[7]=0;r[8]=vz[0];r[9]=vz[1];r[10]=vz[2];r[11]=0;r[12]=0;r[13]=0;r[14]=0;r[15]=1;return r}),_VirtualDom_divertHrefToApp,_VirtualDom_doc=typeof document!=='undefined'?document:{};function _VirtualDom_appendChild(parent,child){parent.appendChild(child)};var _VirtualDom_init=F4(function(virtualNode,flagDecoder,debugMetadata,args){var node=args['node'];node.parentNode.replaceChild(_VirtualDom_render(virtualNode,function(){}),node);return{}});function _VirtualDom_text(string){return{$:0,a:string}};var _VirtualDom_nodeNS=F2(function(namespace,tag){return F2(function(factList,kidList){for(var kids=[],descendantsCount=0;kidList.b;kidList=kidList.b){var kid=kidList.a;descendantsCount+=(kid.b||0);kids.push(kid)};descendantsCount+=kids.length;return{$:1,c:tag,d:_VirtualDom_organizeFacts(factList),e:kids,f:namespace,b:descendantsCount}})}),_VirtualDom_node=_VirtualDom_nodeNS(undefined),_VirtualDom_keyedNodeNS=F2(function(namespace,tag){return F2(function(factList,kidList){for(var kids=[],descendantsCount=0;kidList.b;kidList=kidList.b){var kid=kidList.a;descendantsCount+=(kid.b.b||0);kids.push(kid)};descendantsCount+=kids.length;return{$:2,c:tag,d:_VirtualDom_organizeFacts(factList),e:kids,f:namespace,b:descendantsCount}})}),_VirtualDom_keyedNode=_VirtualDom_keyedNodeNS(undefined);function _VirtualDom_custom(factList,model,render,diff){return{$:3,d:_VirtualDom_organizeFacts(factList),g:model,h:render,i:diff}};var _VirtualDom_map=F2(function(tagger,node){return{$:4,j:tagger,k:node,b:1+(node.b||0)}});function _VirtualDom_thunk(refs,thunk){return{$:5,l:refs,m:thunk,k:undefined}};var _VirtualDom_lazy=F2(function(func,a){return _VirtualDom_thunk([func,a],function(){return func(a)})}),_VirtualDom_lazy2=F3(function(func,a,b){return _VirtualDom_thunk([func,a,b],function(){return A2(func,a,b)})}),_VirtualDom_lazy3=F4(function(func,a,b,c){return _VirtualDom_thunk([func,a,b,c],function(){return A3(func,a,b,c)})}),_VirtualDom_lazy4=F5(function(func,a,b,c,d){return _VirtualDom_thunk([func,a,b,c,d],function(){return A4(func,a,b,c,d)})}),_VirtualDom_lazy5=F6(function(func,a,b,c,d,e){return _VirtualDom_thunk([func,a,b,c,d,e],function(){return A5(func,a,b,c,d,e)})}),_VirtualDom_lazy6=F7(function(func,a,b,c,d,e,f){return _VirtualDom_thunk([func,a,b,c,d,e,f],function(){return A6(func,a,b,c,d,e,f)})}),_VirtualDom_lazy7=F8(function(func,a,b,c,d,e,f,g){return _VirtualDom_thunk([func,a,b,c,d,e,f,g],function(){return A7(func,a,b,c,d,e,f,g)})}),_VirtualDom_lazy8=F9(function(func,a,b,c,d,e,f,g,h){return _VirtualDom_thunk([func,a,b,c,d,e,f,g,h],function(){return A8(func,a,b,c,d,e,f,g,h)})}),_VirtualDom_on=F2(function(key,handler){return{$:'a0',n:key,o:handler}}),_VirtualDom_style=F2(function(key,value){return{$:'a1',n:key,o:value}}),_VirtualDom_property=F2(function(key,value){return{$:'a2',n:key,o:value}}),_VirtualDom_attribute=F2(function(key,value){return{$:'a3',n:key,o:value}}),_VirtualDom_attributeNS=F3(function(namespace,key,value){return{$:'a4',n:key,o:{f:namespace,o:value}}});function _VirtualDom_noScript(tag){return tag=='script'?'p':tag} +function _VirtualDom_noOnOrFormAction(key){return/^(on|formAction$)/i.test(key)?'data-'+key:key} +function _VirtualDom_noInnerHtmlOrFormAction(key){return key=='innerHTML'||key=='formAction'?'data-'+key:key} +function _VirtualDom_noJavaScriptUri(value){return/^javascript:/i.test(value.replace(/\s/g,''))?'':value} +function _VirtualDom_noJavaScriptUri_UNUSED(value){return/^javascript:/i.test(value.replace(/\s/g,''))?'javascript:alert("This is an XSS vector. Please use ports or web components instead.")':value} +function _VirtualDom_noJavaScriptOrHtmlUri(value){return/^\s*(javascript:|data:text\/html)/i.test(value)?'':value} +function _VirtualDom_noJavaScriptOrHtmlUri_UNUSED(value){return/^\s*(javascript:|data:text\/html)/i.test(value)?'javascript:alert("This is an XSS vector. Please use ports or web components instead.")':value};var _VirtualDom_mapAttribute=F2(function(func,attr){return(attr.$==='a0')?A2(_VirtualDom_on,attr.n,_VirtualDom_mapHandler(func,attr.o)):attr});function _VirtualDom_mapHandler(func,handler){var tag=$elm$virtual_dom$VirtualDom$toHandlerInt(handler);return{$:handler.$,a:!tag?A2($elm$json$Json$Decode$map,func,handler.a):A3($elm$json$Json$Decode$map2,tag<3?_VirtualDom_mapEventTuple:_VirtualDom_mapEventRecord,$elm$json$Json$Decode$succeed(func),handler.a)}};var _VirtualDom_mapEventTuple=F2(function(func,tuple){return _Utils_Tuple2(func(tuple.a),tuple.b)}),_VirtualDom_mapEventRecord=F2(function(func,record){return{u:func(record.u),aq:record.aq,an:record.an}});function _VirtualDom_organizeFacts(factList){for(var facts={};factList.b;factList=factList.b){var entry=factList.a,tag=entry.$,key=entry.n,value=entry.o;if(tag==='a2'){(key==='className')?_VirtualDom_addClass(facts,key,_Json_unwrap(value)):facts[key]=_Json_unwrap(value);continue};var subFacts=facts[tag]||(facts[tag]={});(tag==='a3'&&key==='class')?_VirtualDom_addClass(subFacts,key,value):subFacts[key]=value};return facts} +function _VirtualDom_addClass(object,key,newClass){var classes=object[key];object[key]=classes?classes+' '+newClass:newClass} +function _VirtualDom_render(vNode,eventNode){var tag=vNode.$;if(tag===5)return _VirtualDom_render(vNode.k||(vNode.k=vNode.m()),eventNode);if(tag===0)return _VirtualDom_doc.createTextNode(vNode.a);if(tag===4){var subNode=vNode.k,tagger=vNode.j;while(subNode.$===4){typeof tagger!=='object'?tagger=[tagger,subNode.j]:tagger.push(subNode.j);subNode=subNode.k};var subEventRoot={j:tagger,p:eventNode},domNode=_VirtualDom_render(subNode,subEventRoot);domNode.elm_event_node_ref=subEventRoot;return domNode};if(tag===3){var domNode=vNode.h(vNode.g);_VirtualDom_applyFacts(domNode,eventNode,vNode.d);return domNode};var domNode=vNode.f?_VirtualDom_doc.createElementNS(vNode.f,vNode.c):_VirtualDom_doc.createElement(vNode.c);if(_VirtualDom_divertHrefToApp&&vNode.c=='a')domNode.addEventListener('click',_VirtualDom_divertHrefToApp(domNode));_VirtualDom_applyFacts(domNode,eventNode,vNode.d);for(var kids=vNode.e,i=0;i0&&_VirtualDom_pushPatch(patches,1,index,subPatches);return;case 4:var xTaggers=x.j,yTaggers=y.j,nesting=false,xSubNode=x.k;while(xSubNode.$===4){nesting=true;typeof xTaggers!=='object'?xTaggers=[xTaggers,xSubNode.j]:xTaggers.push(xSubNode.j);xSubNode=xSubNode.k};var ySubNode=y.k;while(ySubNode.$===4){nesting=true;typeof yTaggers!=='object'?yTaggers=[yTaggers,ySubNode.j]:yTaggers.push(ySubNode.j);ySubNode=ySubNode.k};if(nesting&&xTaggers.length!==yTaggers.length){_VirtualDom_pushPatch(patches,0,index,y);return};if(nesting?!_VirtualDom_pairwiseRefEqual(xTaggers,yTaggers):xTaggers!==yTaggers)_VirtualDom_pushPatch(patches,2,index,yTaggers);_VirtualDom_diffHelp(xSubNode,ySubNode,patches,index+1);return;case 0:if(x.a!==y.a)_VirtualDom_pushPatch(patches,3,index,y.a);return;case 1:_VirtualDom_diffNodes(x,y,patches,index,_VirtualDom_diffKids);return;case 2:_VirtualDom_diffNodes(x,y,patches,index,_VirtualDom_diffKeyedKids);return;case 3:if(x.h!==y.h){_VirtualDom_pushPatch(patches,0,index,y);return};var factsDiff=_VirtualDom_diffFacts(x.d,y.d);factsDiff&&_VirtualDom_pushPatch(patches,4,index,factsDiff);var patch=y.i(x.g,y.g);patch&&_VirtualDom_pushPatch(patches,5,index,patch);return}} +function _VirtualDom_pairwiseRefEqual(as,bs){for(var i=0;iyLen){_VirtualDom_pushPatch(patches,6,index,{v:yLen,i:xLen-yLen})}else if(xLen0||inserts.length>0||endInserts)_VirtualDom_pushPatch(patches,8,rootIndex,{w:localPatches,x:inserts,y:endInserts})};var _VirtualDom_POSTFIX='_elmW6BL';function _VirtualDom_insertNode(changes,localPatches,key,vnode,yIndex,inserts){var entry=changes[key];if(!entry){entry={c:0,z:vnode,r:yIndex,s:undefined};inserts.push({r:yIndex,A:entry});changes[key]=entry;return};if(entry.c===1){inserts.push({r:yIndex,A:entry});entry.c=2;var subPatches=[];_VirtualDom_diffHelp(entry.z,vnode,subPatches,entry.r);entry.r=yIndex;entry.s.s={w:subPatches,A:entry};return};_VirtualDom_insertNode(changes,localPatches,key+_VirtualDom_POSTFIX,vnode,yIndex,inserts)} +function _VirtualDom_removeNode(changes,localPatches,key,vnode,index){var entry=changes[key];if(!entry){var patch=_VirtualDom_pushPatch(localPatches,9,index,undefined);changes[key]={c:1,z:vnode,r:index,s:patch};return};if(entry.c===0){entry.c=2;var subPatches=[];_VirtualDom_diffHelp(vnode,entry.z,subPatches,index);_VirtualDom_pushPatch(localPatches,9,index,{w:subPatches,A:entry});return};_VirtualDom_removeNode(changes,localPatches,key+_VirtualDom_POSTFIX,vnode,index)} +function _VirtualDom_addDomNodes(domNode,vNode,patches,eventNode){_VirtualDom_addDomNodesHelp(domNode,vNode,patches,0,0,vNode.b,eventNode)} +function _VirtualDom_addDomNodesHelp(domNode,vNode,patches,i,low,high,eventNode){var patch=patches[i],index=patch.r;while(index===low){var patchType=patch.$;if(patchType===1){_VirtualDom_addDomNodes(domNode,vNode.k,patch.s,eventNode)}else if(patchType===8){patch.t=domNode;patch.u=eventNode;var subPatches=patch.s.w;if(subPatches.length>0)_VirtualDom_addDomNodesHelp(domNode,vNode,subPatches,0,low,high,eventNode)}else if(patchType===9){patch.t=domNode;patch.u=eventNode;var data=patch.s;if(data){data.A.s=domNode;var subPatches=data.w;if(subPatches.length>0)_VirtualDom_addDomNodesHelp(domNode,vNode,subPatches,0,low,high,eventNode)}}else{patch.t=domNode;patch.u=eventNode};i++;if(!(patch=patches[i])||(index=patch.r)>high)return i};var tag=vNode.$;if(tag===4){var subNode=vNode.k;while(subNode.$===4)subNode=subNode.k;return _VirtualDom_addDomNodesHelp(domNode,subNode,patches,i,low+1,high,domNode.elm_event_node_ref)};var vKids=vNode.e,childNodes=domNode.childNodes;for(var j=0;jhigh)return i};low=nextLow};return i} +function _VirtualDom_applyPatches(rootDomNode,oldVirtualNode,patches,eventNode){if(patches.length===0)return rootDomNode;_VirtualDom_addDomNodes(rootDomNode,oldVirtualNode,patches,eventNode);return _VirtualDom_applyPatchesHelp(rootDomNode,patches)} +function _VirtualDom_applyPatchesHelp(rootDomNode,patches){for(var i=0;i>>6&0x1F)<<8|code&0x3F),2):(code<0xD800||0xDBFF>>12&0xF)<<8|code>>>6&0x3F),mb.setUint8(offset+2,0x80|code&0x3F),3):(code=(code-0xD800)*0x400+string.charCodeAt(++i)-0xDC00+0x10000,mb.setUint32(offset,0xF0808080|(code>>>18&0x7)<<24|(code>>>12&0x3F)<<16|(code>>>6&0x3F)<<8|code&0x3F),4)};return offset}),_Bytes_decode=F2(function(decoder,bytes){try{return $elm$core$Maybe$Just(A2(decoder,bytes,0).b)}catch(e){return $elm$core$Maybe$Nothing}}),_Bytes_read_i8=F2(function(bytes,offset){return _Utils_Tuple2(offset+1,bytes.getInt8(offset))}),_Bytes_read_i16=F3(function(isLE,bytes,offset){return _Utils_Tuple2(offset+2,bytes.getInt16(offset,isLE))}),_Bytes_read_i32=F3(function(isLE,bytes,offset){return _Utils_Tuple2(offset+4,bytes.getInt32(offset,isLE))}),_Bytes_read_u8=F2(function(bytes,offset){return _Utils_Tuple2(offset+1,bytes.getUint8(offset))}),_Bytes_read_u16=F3(function(isLE,bytes,offset){return _Utils_Tuple2(offset+2,bytes.getUint16(offset,isLE))}),_Bytes_read_u32=F3(function(isLE,bytes,offset){return _Utils_Tuple2(offset+4,bytes.getUint32(offset,isLE))}),_Bytes_read_f32=F3(function(isLE,bytes,offset){return _Utils_Tuple2(offset+4,bytes.getFloat32(offset,isLE))}),_Bytes_read_f64=F3(function(isLE,bytes,offset){return _Utils_Tuple2(offset+8,bytes.getFloat64(offset,isLE))}),_Bytes_read_bytes=F3(function(len,bytes,offset){return _Utils_Tuple2(offset+len,new DataView(bytes.buffer,bytes.byteOffset+offset,len))}),_Bytes_read_string=F3(function(len,bytes,offset){var string='',end=offset+len;for(;offset>offset}),_Bitwise_shiftRightZfBy=F2(function(offset,a){return a>>>offset}),$elm$core$List$cons=_List_cons,$elm$core$Elm$JsArray$foldr=_JsArray_foldr,$elm$core$Array$foldr=F3(function(func,baseCase,_v0){var tree=_v0.c,tail=_v0.d,helper=F2(function(node,acc){if(!node.$){var subTree=node.a;return A3($elm$core$Elm$JsArray$foldr,helper,acc,subTree)}else{var values=node.a;return A3($elm$core$Elm$JsArray$foldr,func,acc,values)}});return A3($elm$core$Elm$JsArray$foldr,helper,A3($elm$core$Elm$JsArray$foldr,func,baseCase,tail),tree)}),$elm$core$Array$toList=function(array){return A3($elm$core$Array$foldr,$elm$core$List$cons,_List_Nil,array)},$elm$core$Dict$foldr=F3(function(func,acc,t){foldr:while(true)if(t.$===-2){return acc}else{var key=t.b,value=t.c,left=t.d,right=t.e,$temp$func=func,$temp$acc=A3(func,key,value,A3($elm$core$Dict$foldr,func,acc,right)),$temp$t=left;func=$temp$func;acc=$temp$acc;t=$temp$t;continue foldr}}),$elm$core$Dict$toList=function(dict){return A3($elm$core$Dict$foldr,F3(function(key,value,list){return A2($elm$core$List$cons,_Utils_Tuple2(key,value),list)}),_List_Nil,dict)},$elm$core$Dict$keys=function(dict){return A3($elm$core$Dict$foldr,F3(function(key,value,keyList){return A2($elm$core$List$cons,key,keyList)}),_List_Nil,dict)},$elm$core$Set$toList=function(_v0){var dict=_v0;return $elm$core$Dict$keys(dict)},$elm$core$Basics$EQ=1,$elm$core$Basics$GT=2,$elm$core$Basics$LT=0,$author$project$Main$FullscreenChange=function(a){return{$:6,a:a}},$author$project$Main$JsonError=function(a){return{$:0,a:a}},$elm$core$Maybe$Just=function(a){return{$:0,a:a}},$elm$core$Maybe$Nothing={$:1},$author$project$Main$Resized=function(a){return{$:4,a:a}},$author$project$Main$ServerUpdate=function(a){return{$:1,a:a}},$elm$core$Basics$always=F2(function(a,_v0){return a}),$elm$core$Basics$apL=F2(function(f,x){return f(x)}),$elm$core$Basics$apR=F2(function(x,f){return f(x)}),$elm$core$Result$Err=function(a){return{$:1,a:a}},$elm$json$Json$Decode$Failure=F2(function(a,b){return{$:3,a:a,b:b}}),$elm$json$Json$Decode$Field=F2(function(a,b){return{$:0,a:a,b:b}}),$elm$json$Json$Decode$Index=F2(function(a,b){return{$:1,a:a,b:b}}),$elm$core$Result$Ok=function(a){return{$:0,a:a}},$elm$json$Json$Decode$OneOf=function(a){return{$:2,a:a}},$elm$core$Basics$False=1,$elm$core$Basics$add=_Basics_add,$elm$core$String$all=_String_all,$elm$core$Basics$and=_Basics_and,$elm$core$Basics$append=_Utils_append,$elm$json$Json$Encode$encode=_Json_encode,$elm$core$String$fromInt=_String_fromNumber,$elm$core$String$join=F2(function(sep,chunks){return A2(_String_join,sep,_List_toArray(chunks))}),$elm$core$String$split=F2(function(sep,string){return _List_fromArray(A2(_String_split,sep,string))}),$elm$json$Json$Decode$indent=function(str){return A2($elm$core$String$join,'\n ',A2($elm$core$String$split,'\n',str))},$elm$core$List$foldl=F3(function(func,acc,list){foldl:while(true)if(!list.b){return acc}else{var x=list.a,xs=list.b,$temp$func=func,$temp$acc=A2(func,x,acc),$temp$list=xs;func=$temp$func;acc=$temp$acc;list=$temp$list;continue foldl}}),$elm$core$List$length=function(xs){return A3($elm$core$List$foldl,F2(function(_v0,i){return i+1}),0,xs)},$elm$core$List$map2=_List_map2,$elm$core$Basics$le=_Utils_le,$elm$core$Basics$sub=_Basics_sub,$elm$core$List$rangeHelp=F3(function(lo,hi,list){rangeHelp:while(true)if(_Utils_cmp(lo,hi)<1){var $temp$lo=lo,$temp$hi=hi-1,$temp$list=A2($elm$core$List$cons,hi,list);lo=$temp$lo;hi=$temp$hi;list=$temp$list;continue rangeHelp}else return list}),$elm$core$List$range=F2(function(lo,hi){return A3($elm$core$List$rangeHelp,lo,hi,_List_Nil)}),$elm$core$List$indexedMap=F2(function(f,xs){return A3($elm$core$List$map2,f,A2($elm$core$List$range,0,$elm$core$List$length(xs)-1),xs)}),$elm$core$Char$toCode=_Char_toCode,$elm$core$Char$isLower=function(_char){var code=$elm$core$Char$toCode(_char);return(97<=code)&&(code<=122)},$elm$core$Char$isUpper=function(_char){var code=$elm$core$Char$toCode(_char);return(code<=90)&&(65<=code)},$elm$core$Basics$or=_Basics_or,$elm$core$Char$isAlpha=function(_char){return $elm$core$Char$isLower(_char)||$elm$core$Char$isUpper(_char)},$elm$core$Char$isDigit=function(_char){var code=$elm$core$Char$toCode(_char);return(code<=57)&&(48<=code)},$elm$core$Char$isAlphaNum=function(_char){return $elm$core$Char$isLower(_char)||($elm$core$Char$isUpper(_char)||$elm$core$Char$isDigit(_char))},$elm$core$List$reverse=function(list){return A3($elm$core$List$foldl,$elm$core$List$cons,_List_Nil,list)},$elm$core$String$uncons=_String_uncons,$elm$json$Json$Decode$errorOneOf=F2(function(i,error){return'\n\n('+($elm$core$String$fromInt(i+1)+(') '+$elm$json$Json$Decode$indent($elm$json$Json$Decode$errorToString(error))))}),$elm$json$Json$Decode$errorToString=function(error){return A2($elm$json$Json$Decode$errorToStringHelp,error,_List_Nil)},$elm$json$Json$Decode$errorToStringHelp=F2(function(error,context){errorToStringHelp:while(true)switch(error.$){case 0:var f=error.a,err=error.b,isSimple=function(){var _v1=$elm$core$String$uncons(f);if(_v1.$===1){return false}else{var _v2=_v1.a,_char=_v2.a,rest=_v2.b;return $elm$core$Char$isAlpha(_char)&&A2($elm$core$String$all,$elm$core$Char$isAlphaNum,rest)}}(),fieldName=isSimple?('.'+f):('[\''+(f+'\']')),$temp$error=err,$temp$context=A2($elm$core$List$cons,fieldName,context);error=$temp$error;context=$temp$context;continue errorToStringHelp;case 1:var i=error.a,err=error.b,indexName='['+($elm$core$String$fromInt(i)+']'),$temp$error=err,$temp$context=A2($elm$core$List$cons,indexName,context);error=$temp$error;context=$temp$context;continue errorToStringHelp;case 2:var errors=error.a;if(!errors.b){return'Ran into a Json.Decode.oneOf with no possibilities'+function(){if(!context.b){return'!'}else return' at json'+A2($elm$core$String$join,'',$elm$core$List$reverse(context))}()}else if(!errors.b.b){var err=errors.a,$temp$error=err,$temp$context=context;error=$temp$error;context=$temp$context;continue errorToStringHelp}else{var starter=function(){if(!context.b){return'Json.Decode.oneOf'}else return'The Json.Decode.oneOf at json'+A2($elm$core$String$join,'',$elm$core$List$reverse(context))}(),introduction=starter+(' failed in the following '+($elm$core$String$fromInt($elm$core$List$length(errors))+' ways:'));return A2($elm$core$String$join,'\n\n',A2($elm$core$List$cons,introduction,A2($elm$core$List$indexedMap,$elm$json$Json$Decode$errorOneOf,errors)))};default:var msg=error.a,json=error.b,introduction=function(){if(!context.b){return'Problem with the given value:\n\n'}else return'Problem with the value at json'+(A2($elm$core$String$join,'',$elm$core$List$reverse(context))+':\n\n ')}();return introduction+($elm$json$Json$Decode$indent(A2($elm$json$Json$Encode$encode,4,json))+('\n\n'+msg))}}),$elm$core$Array$branchFactor=32,$elm$core$Array$Array_elm_builtin=F4(function(a,b,c,d){return{$:0,a:a,b:b,c:c,d:d}}),$elm$core$Elm$JsArray$empty=_JsArray_empty,$elm$core$Basics$ceiling=_Basics_ceiling,$elm$core$Basics$fdiv=_Basics_fdiv,$elm$core$Basics$logBase=F2(function(base,number){return _Basics_log(number)/_Basics_log(base)}),$elm$core$Basics$toFloat=_Basics_toFloat,$elm$core$Array$shiftStep=$elm$core$Basics$ceiling(A2($elm$core$Basics$logBase,2,$elm$core$Array$branchFactor)),$elm$core$Array$empty=A4($elm$core$Array$Array_elm_builtin,0,$elm$core$Array$shiftStep,$elm$core$Elm$JsArray$empty,$elm$core$Elm$JsArray$empty),$elm$core$Elm$JsArray$initialize=_JsArray_initialize,$elm$core$Array$Leaf=function(a){return{$:1,a:a}},$elm$core$Basics$eq=_Utils_equal,$elm$core$Basics$floor=_Basics_floor,$elm$core$Elm$JsArray$length=_JsArray_length,$elm$core$Basics$gt=_Utils_gt,$elm$core$Basics$max=F2(function(x,y){return(_Utils_cmp(x,y)>0)?x:y}),$elm$core$Basics$mul=_Basics_mul,$elm$core$Array$SubTree=function(a){return{$:0,a:a}},$elm$core$Elm$JsArray$initializeFromList=_JsArray_initializeFromList,$elm$core$Array$compressNodes=F2(function(nodes,acc){compressNodes:while(true){var _v0=A2($elm$core$Elm$JsArray$initializeFromList,$elm$core$Array$branchFactor,nodes),node=_v0.a,remainingNodes=_v0.b,newAcc=A2($elm$core$List$cons,$elm$core$Array$SubTree(node),acc);if(!remainingNodes.b){return $elm$core$List$reverse(newAcc)}else{var $temp$nodes=remainingNodes,$temp$acc=newAcc;nodes=$temp$nodes;acc=$temp$acc;continue compressNodes}}}),$elm$core$Tuple$first=function(_v0){var x=_v0.a;return x},$elm$core$Array$treeFromBuilder=F2(function(nodeList,nodeListSize){treeFromBuilder:while(true){var newNodeSize=$elm$core$Basics$ceiling(nodeListSize/$elm$core$Array$branchFactor);if(newNodeSize===1){return A2($elm$core$Elm$JsArray$initializeFromList,$elm$core$Array$branchFactor,nodeList).a}else{var $temp$nodeList=A2($elm$core$Array$compressNodes,nodeList,_List_Nil),$temp$nodeListSize=newNodeSize;nodeList=$temp$nodeList;nodeListSize=$temp$nodeListSize;continue treeFromBuilder}}}),$elm$core$Array$builderToArray=F2(function(reverseNodeList,builder){if(!builder.b){return A4($elm$core$Array$Array_elm_builtin,$elm$core$Elm$JsArray$length(builder.d),$elm$core$Array$shiftStep,$elm$core$Elm$JsArray$empty,builder.d)}else{var treeLen=builder.b*$elm$core$Array$branchFactor,depth=$elm$core$Basics$floor(A2($elm$core$Basics$logBase,$elm$core$Array$branchFactor,treeLen-1)),correctNodeList=reverseNodeList?$elm$core$List$reverse(builder.e):builder.e,tree=A2($elm$core$Array$treeFromBuilder,correctNodeList,builder.b);return A4($elm$core$Array$Array_elm_builtin,$elm$core$Elm$JsArray$length(builder.d)+treeLen,A2($elm$core$Basics$max,5,depth*$elm$core$Array$shiftStep),tree,builder.d)}}),$elm$core$Basics$idiv=_Basics_idiv,$elm$core$Basics$lt=_Utils_lt,$elm$core$Array$initializeHelp=F5(function(fn,fromIndex,len,nodeList,tail){initializeHelp:while(true)if(fromIndex<0){return A2($elm$core$Array$builderToArray,false,{e:nodeList,b:(len/$elm$core$Array$branchFactor)|0,d:tail})}else{var leaf=$elm$core$Array$Leaf(A3($elm$core$Elm$JsArray$initialize,$elm$core$Array$branchFactor,fromIndex,fn)),$temp$fn=fn,$temp$fromIndex=fromIndex-$elm$core$Array$branchFactor,$temp$len=len,$temp$nodeList=A2($elm$core$List$cons,leaf,nodeList),$temp$tail=tail;fn=$temp$fn;fromIndex=$temp$fromIndex;len=$temp$len;nodeList=$temp$nodeList;tail=$temp$tail;continue initializeHelp}}),$elm$core$Basics$remainderBy=_Basics_remainderBy,$elm$core$Array$initialize=F2(function(len,fn){if(len<=0){return $elm$core$Array$empty}else{var tailLen=len%$elm$core$Array$branchFactor,tail=A3($elm$core$Elm$JsArray$initialize,tailLen,len-tailLen,fn),initialFromIndex=(len-tailLen)-$elm$core$Array$branchFactor;return A5($elm$core$Array$initializeHelp,fn,initialFromIndex,len,_List_Nil,tail)}}),$elm$core$Basics$True=0,$elm$core$Result$isOk=function(result){if(!result.$){return true}else return false},$elm$core$Platform$Cmd$batch=_Platform_batch,$elm$core$Platform$Sub$batch=_Platform_batch,$elm$core$Basics$composeL=F3(function(g,f,x){return g(f(x))}),$author$project$Auto$ElmFlags$ElmFlags=F4(function(layouts,username,encoding,supportsFullscreen){return{bV:encoding,cg:layouts,c$:supportsFullscreen,da:username}}),$elm$json$Json$Decode$bool=_Json_decodeBool,$author$project$Auto$Encoding$BinaryEncoding=1,$author$project$Auto$Encoding$JSONEncoding=0,$elm$json$Json$Decode$andThen=_Json_andThen,$elm$json$Json$Decode$fail=_Json_fail,$elm$json$Json$Decode$string=_Json_decodeString,$elm$json$Json$Decode$succeed=_Json_succeed,$author$project$Auto$Encoding$decode=A2($elm$json$Json$Decode$andThen,function(a){switch(a){case'JSONEncoding':return $elm$json$Json$Decode$succeed(0);case'BinaryEncoding':return $elm$json$Json$Decode$succeed(1);default:return $elm$json$Json$Decode$fail('No matching constructor')}},$elm$json$Json$Decode$string),$author$project$Auto$Layout$Layout=F4(function(elements,viewBox,backgroundColour,name){return{bz:backgroundColour,bU:elements,cs:name,dc:viewBox}}),$author$project$Auto$Colour$Colour=F4(function(red,green,blue,alpha){return{bu:alpha,bA:blue,b$:green,cE:red}}),$elm$json$Json$Decode$float=_Json_decodeFloat,$elm$json$Json$Decode$map2=_Json_map2,$NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom=$elm$json$Json$Decode$map2($elm$core$Basics$apR),$elm$json$Json$Decode$field=_Json_decodeField,$NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required=F3(function(key,valDecoder,decoder){return A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$field,key,valDecoder),decoder)}),$author$project$Auto$Colour$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'alpha',$elm$json$Json$Decode$float,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'blue',$elm$json$Json$Decode$float,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'green',$elm$json$Json$Decode$float,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'red',$elm$json$Json$Decode$float,$elm$json$Json$Decode$succeed($author$project$Auto$Colour$Colour))))),$author$project$Auto$FullElement$FullElement=F6(function(element,location,name,text,image,hidden){return{bT:element,b5:hidden,b8:image,ck:location,cs:name,c1:text}}),$author$project$Auto$Element$Button=function(a){return{$:1,a:a}},$author$project$Auto$Element$Empty=function(a){return{$:5,a:a}},$author$project$Auto$Element$Indicator=function(a){return{$:3,a:a}},$author$project$Auto$Element$Input=function(a){return{$:4,a:a}},$author$project$Auto$Element$Slider=function(a){return{$:2,a:a}},$author$project$Auto$Element$Stick=function(a){return{$:0,a:a}},$author$project$Auto$Button$Button=F3(function(shape,colour,buttonData){return{bF:buttonData,bM:colour,cO:shape}}),$author$project$Auto$Shape$Circle=function(a){return{$:0,a:a}},$author$project$Auto$Shape$Rectangle=function(a){return{$:1,a:a}},$author$project$Auto$IntVec2$IntVec2=F2(function(x,y){return{dh:x,di:y}}),$elm$json$Json$Decode$int=_Json_decodeInt,$author$project$Auto$IntVec2$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'y',$elm$json$Json$Decode$int,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'x',$elm$json$Json$Decode$int,$elm$json$Json$Decode$succeed($author$project$Auto$IntVec2$IntVec2))),$elm$json$Json$Decode$oneOf=_Json_oneOf,$author$project$Auto$Shape$decode=$elm$json$Json$Decode$oneOf(_List_fromArray([A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'Circle',$elm$json$Json$Decode$int,$elm$json$Json$Decode$succeed($author$project$Auto$Shape$Circle)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'Rectangle',$author$project$Auto$IntVec2$decode,$elm$json$Json$Decode$succeed($author$project$Auto$Shape$Rectangle))])),$author$project$Auto$Button$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'buttonData',$elm$json$Json$Decode$succeed(0),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'colour',$author$project$Auto$Colour$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'shape',$author$project$Auto$Shape$decode,$elm$json$Json$Decode$succeed($author$project$Auto$Button$Button)))),$author$project$Auto$Indicator$Indicator=F6(function(hollowness,arcStart,arcEnd,centre,colour,shape){return{bw:arcEnd,bx:arcStart,bH:centre,bM:colour,b6:hollowness,cO:shape}}),$elm_explorations$linear_algebra$Math$Vector2$vec2=_MJS_v2,$author$project$Util$decodeVec2=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'y',$elm$json$Json$Decode$float,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'x',$elm$json$Json$Decode$float,$elm$json$Json$Decode$succeed($elm_explorations$linear_algebra$Math$Vector2$vec2))),$author$project$Auto$Indicator$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'shape',$author$project$Auto$Shape$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'colour',$author$project$Auto$Colour$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'centre',$author$project$Util$decodeVec2,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'arcEnd',$elm$json$Json$Decode$float,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'arcStart',$elm$json$Json$Decode$float,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'hollowness',$elm$json$Json$Decode$float,$elm$json$Json$Decode$succeed($author$project$Auto$Indicator$Indicator))))))),$author$project$Auto$Input$Input=F3(function(width,height,inputType){return{b3:height,cc:inputType,df:width}}),$author$project$Auto$InputType$CheckBox=function(a){return{$:0,a:a}},$author$project$Auto$InputType$Number=function(a){return{$:1,a:a}},$author$project$Auto$InputType$Text=function(a){return{$:2,a:a}},$author$project$Auto$NumberInput$NumberInput=F4(function(textStyle,min,max,step){return{cm:max,co:min,cT:step,c2:textStyle}}),$author$project$Auto$TextStyle$TextStyle=F9(function(size,colour,bold,italic,underline,shadow,rotation,align,font){return{br:align,bD:bold,bM:colour,b_:font,ce:italic,cI:rotation,cN:shadow,cQ:size,c7:underline}}),$author$project$Auto$PosX$Centre=1,$author$project$Auto$PosX$Left=0,$author$project$Auto$PosX$Right=2,$author$project$Auto$PosX$decode=A2($elm$json$Json$Decode$andThen,function(a){switch(a){case'Left':return $elm$json$Json$Decode$succeed(0);case'Centre':return $elm$json$Json$Decode$succeed(1);case'Right':return $elm$json$Json$Decode$succeed(2);default:return $elm$json$Json$Decode$fail('No matching constructor')}},$elm$json$Json$Decode$string),$author$project$Auto$TextShadow$TextShadow=F3(function(offset,blur,colour){return{bC:blur,bM:colour,cu:offset}}),$author$project$Auto$TextShadow$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'colour',$author$project$Auto$Colour$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'blur',$elm$json$Json$Decode$int,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'offset',$author$project$Auto$IntVec2$decode,$elm$json$Json$Decode$succeed($author$project$Auto$TextShadow$TextShadow)))),$elm$json$Json$Decode$list=_Json_decodeList,$author$project$Auto$TextStyle$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'font',$elm$json$Json$Decode$string,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'align',$author$project$Auto$PosX$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'rotation',$elm$json$Json$Decode$float,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'shadow',$elm$json$Json$Decode$list($author$project$Auto$TextShadow$decode),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'underline',$elm$json$Json$Decode$bool,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'italic',$elm$json$Json$Decode$bool,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'bold',$elm$json$Json$Decode$bool,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'colour',$author$project$Auto$Colour$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'size',$elm$json$Json$Decode$int,$elm$json$Json$Decode$succeed($author$project$Auto$TextStyle$TextStyle)))))))))),$elm$json$Json$Decode$map=_Json_map1,$elm$json$Json$Decode$null=_Json_decodeNull,$elm$json$Json$Decode$nullable=function(decoder){return $elm$json$Json$Decode$oneOf(_List_fromArray([$elm$json$Json$Decode$null($elm$core$Maybe$Nothing),A2($elm$json$Json$Decode$map,$elm$core$Maybe$Just,decoder)]))},$author$project$Auto$NumberInput$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'step',$elm$json$Json$Decode$nullable($elm$json$Json$Decode$float),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'max',$elm$json$Json$Decode$nullable($elm$json$Json$Decode$float),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'min',$elm$json$Json$Decode$nullable($elm$json$Json$Decode$float),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'textStyle',$author$project$Auto$TextStyle$decode,$elm$json$Json$Decode$succeed($author$project$Auto$NumberInput$NumberInput))))),$author$project$Auto$TextInput$TextInput=F3(function(textStyle,minLength,maxLength){return{cn:maxLength,cp:minLength,c2:textStyle}}),$author$project$Auto$TextInput$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'maxLength',$elm$json$Json$Decode$nullable($elm$json$Json$Decode$int),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'minLength',$elm$json$Json$Decode$nullable($elm$json$Json$Decode$int),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'textStyle',$author$project$Auto$TextStyle$decode,$elm$json$Json$Decode$succeed($author$project$Auto$TextInput$TextInput)))),$author$project$Auto$InputType$decode=$elm$json$Json$Decode$oneOf(_List_fromArray([A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'CheckBox',$elm$json$Json$Decode$succeed(0),$elm$json$Json$Decode$succeed($author$project$Auto$InputType$CheckBox)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'Number',$author$project$Auto$NumberInput$decode,$elm$json$Json$Decode$succeed($author$project$Auto$InputType$Number)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'Text',$author$project$Auto$TextInput$decode,$elm$json$Json$Decode$succeed($author$project$Auto$InputType$Text))])),$author$project$Auto$Input$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'inputType',$author$project$Auto$InputType$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'height',$elm$json$Json$Decode$int,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'width',$elm$json$Json$Decode$int,$elm$json$Json$Decode$succeed($author$project$Auto$Input$Input)))),$author$project$Auto$Slider$Slider=F8(function(radius,offset,width,initialPosition,resetOnRelease,sliderColour,backgroundColour,sliderData){return{bz:backgroundColour,cb:initialPosition,cu:offset,cC:radius,cG:resetOnRelease,cR:sliderColour,cS:sliderData,df:width}}),$author$project$Auto$Slider$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'sliderData',$elm$json$Json$Decode$succeed(0),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'backgroundColour',$author$project$Auto$Colour$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'sliderColour',$author$project$Auto$Colour$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'resetOnRelease',$elm$json$Json$Decode$bool,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'initialPosition',$elm$json$Json$Decode$float,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'width',$elm$json$Json$Decode$int,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'offset',$author$project$Auto$IntVec2$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'radius',$elm$json$Json$Decode$int,$elm$json$Json$Decode$succeed($author$project$Auto$Slider$Slider))))))))),$author$project$Auto$Stick$Stick=F6(function(radius,range,stickColour,backgroundColour,stickDataX,stickDataY){return{bz:backgroundColour,cC:radius,cD:range,cV:stickColour,cW:stickDataX,cX:stickDataY}}),$author$project$Auto$Stick$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'stickDataY',$elm$json$Json$Decode$succeed(0),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'stickDataX',$elm$json$Json$Decode$succeed(0),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'backgroundColour',$author$project$Auto$Colour$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'stickColour',$author$project$Auto$Colour$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'range',$elm$json$Json$Decode$int,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'radius',$elm$json$Json$Decode$int,$elm$json$Json$Decode$succeed($author$project$Auto$Stick$Stick))))))),$author$project$Auto$Element$decode=$elm$json$Json$Decode$oneOf(_List_fromArray([A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'Stick',$author$project$Auto$Stick$decode,$elm$json$Json$Decode$succeed($author$project$Auto$Element$Stick)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'Button',$author$project$Auto$Button$decode,$elm$json$Json$Decode$succeed($author$project$Auto$Element$Button)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'Slider',$author$project$Auto$Slider$decode,$elm$json$Json$Decode$succeed($author$project$Auto$Element$Slider)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'Indicator',$author$project$Auto$Indicator$decode,$elm$json$Json$Decode$succeed($author$project$Auto$Element$Indicator)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'Input',$author$project$Auto$Input$decode,$elm$json$Json$Decode$succeed($author$project$Auto$Element$Input)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'Empty',$author$project$Auto$IntVec2$decode,$elm$json$Json$Decode$succeed($author$project$Auto$Element$Empty))])),$author$project$Auto$Image$Image=function(url){return{c9:url}},$author$project$Auto$Image$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'url',$elm$json$Json$Decode$string,$elm$json$Json$Decode$succeed($author$project$Auto$Image$Image)),$author$project$Auto$TextBox$TextBox=F4(function(text,style,alignX,alignY){return{bs:alignX,bt:alignY,cY:style,c1:text}}),$author$project$Auto$PosY$Bottom=2,$author$project$Auto$PosY$Middle=1,$author$project$Auto$PosY$Top=0,$author$project$Auto$PosY$decode=A2($elm$json$Json$Decode$andThen,function(a){switch(a){case'Top':return $elm$json$Json$Decode$succeed(0);case'Middle':return $elm$json$Json$Decode$succeed(1);case'Bottom':return $elm$json$Json$Decode$succeed(2);default:return $elm$json$Json$Decode$fail('No matching constructor')}},$elm$json$Json$Decode$string),$author$project$Auto$TextBox$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'alignY',$author$project$Auto$PosY$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'alignX',$author$project$Auto$PosX$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'style',$author$project$Auto$TextStyle$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'text',$elm$json$Json$Decode$string,$elm$json$Json$Decode$succeed($author$project$Auto$TextBox$TextBox))))),$author$project$Auto$FullElement$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'hidden',$elm$json$Json$Decode$bool,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'image',$elm$json$Json$Decode$nullable($author$project$Auto$Image$decode),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'text',$elm$json$Json$Decode$nullable($author$project$Auto$TextBox$decode),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'name',$elm$json$Json$Decode$string,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'location',$author$project$Auto$IntVec2$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'element',$author$project$Auto$Element$decode,$elm$json$Json$Decode$succeed($author$project$Auto$FullElement$FullElement))))))),$author$project$Auto$ViewBox$ViewBox=F4(function(x,y,w,h){return{b1:h,dd:w,dh:x,di:y}}),$author$project$Auto$ViewBox$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'h',$elm$json$Json$Decode$int,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'w',$elm$json$Json$Decode$int,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'y',$elm$json$Json$Decode$int,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'x',$elm$json$Json$Decode$int,$elm$json$Json$Decode$succeed($author$project$Auto$ViewBox$ViewBox))))),$author$project$Auto$Layout$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'name',$elm$json$Json$Decode$string,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'backgroundColour',$author$project$Auto$Colour$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'viewBox',$author$project$Auto$ViewBox$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'elements',$elm$json$Json$Decode$list($author$project$Auto$FullElement$decode),$elm$json$Json$Decode$succeed($author$project$Auto$Layout$Layout))))),$author$project$Auto$ElmFlags$decode=A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'supportsFullscreen',$elm$json$Json$Decode$bool,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'encoding',$author$project$Auto$Encoding$decode,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'username',$elm$json$Json$Decode$string,A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'layouts',$elm$json$Json$Decode$list($author$project$Auto$Layout$decode),$elm$json$Json$Decode$succeed($author$project$Auto$ElmFlags$ElmFlags))))),$elm$json$Json$Decode$decodeValue=_Json_run,$elm$core$Task$fail=_Scheduler_fail,$elm_community$basics_extra$Basics$Extra$flip=F3(function(f,b,a){return A2(f,a,b)}),$elm$json$Json$Decode$value=_Json_decodeValue,$author$project$Ports$fullscreenChangePort=_Platform_incomingPort('fullscreenChangePort',$elm$json$Json$Decode$value),$author$project$Ports$fullscreenChanges=$author$project$Ports$fullscreenChangePort($elm$json$Json$Decode$decodeValue($elm$json$Json$Decode$bool)),$author$project$Main$OtherError=function(a){return{$:1,a:a}},$elm$core$Task$andThen=_Scheduler_andThen,$elm$core$Dict$RBEmpty_elm_builtin={$:-2},$elm$core$Dict$empty=$elm$core$Dict$RBEmpty_elm_builtin,$elm$core$Dict$Black=1,$elm$core$Dict$RBNode_elm_builtin=F5(function(a,b,c,d,e){return{$:-1,a:a,b:b,c:c,d:d,e:e}}),$elm$core$Dict$Red=0,$elm$core$Dict$balance=F5(function(color,key,value,left,right){if((right.$===-1)&&(!right.a)){var _v1=right.a,rK=right.b,rV=right.c,rLeft=right.d,rRight=right.e;if((left.$===-1)&&(!left.a)){var _v3=left.a,lK=left.b,lV=left.c,lLeft=left.d,lRight=left.e;return A5($elm$core$Dict$RBNode_elm_builtin,0,key,value,A5($elm$core$Dict$RBNode_elm_builtin,1,lK,lV,lLeft,lRight),A5($elm$core$Dict$RBNode_elm_builtin,1,rK,rV,rLeft,rRight))}else return A5($elm$core$Dict$RBNode_elm_builtin,color,rK,rV,A5($elm$core$Dict$RBNode_elm_builtin,0,key,value,left,rLeft),rRight)}else if((((left.$===-1)&&(!left.a))&&(left.d.$===-1))&&(!left.d.a)){var _v5=left.a,lK=left.b,lV=left.c,_v6=left.d,_v7=_v6.a,llK=_v6.b,llV=_v6.c,llLeft=_v6.d,llRight=_v6.e,lRight=left.e;return A5($elm$core$Dict$RBNode_elm_builtin,0,lK,lV,A5($elm$core$Dict$RBNode_elm_builtin,1,llK,llV,llLeft,llRight),A5($elm$core$Dict$RBNode_elm_builtin,1,key,value,lRight,right))}else return A5($elm$core$Dict$RBNode_elm_builtin,color,key,value,left,right)}),$elm$core$Basics$compare=_Utils_compare,$elm$core$Dict$insertHelp=F3(function(key,value,dict){if(dict.$===-2){return A5($elm$core$Dict$RBNode_elm_builtin,0,key,value,$elm$core$Dict$RBEmpty_elm_builtin,$elm$core$Dict$RBEmpty_elm_builtin)}else{var nColor=dict.a,nKey=dict.b,nValue=dict.c,nLeft=dict.d,nRight=dict.e,_v1=A2($elm$core$Basics$compare,key,nKey);switch(_v1){case 0:return A5($elm$core$Dict$balance,nColor,nKey,nValue,A3($elm$core$Dict$insertHelp,key,value,nLeft),nRight);case 1:return A5($elm$core$Dict$RBNode_elm_builtin,nColor,nKey,value,nLeft,nRight);default:return A5($elm$core$Dict$balance,nColor,nKey,nValue,nLeft,A3($elm$core$Dict$insertHelp,key,value,nRight))}}}),$elm$core$Dict$insert=F3(function(key,value,dict){var _v0=A3($elm$core$Dict$insertHelp,key,value,dict);if((_v0.$===-1)&&(!_v0.a)){var _v1=_v0.a,k=_v0.b,v=_v0.c,l=_v0.d,r=_v0.e;return A5($elm$core$Dict$RBNode_elm_builtin,1,k,v,l,r)}else{var x=_v0;return x}}),$elm$core$Dict$fromList=function(assocs){return A3($elm$core$List$foldl,F2(function(_v0,dict){var key=_v0.a,value=_v0.b;return A3($elm$core$Dict$insert,key,value,dict)}),$elm$core$Dict$empty,assocs)},$elm$virtual_dom$VirtualDom$toHandlerInt=function(handler){switch(handler.$){case 0:return 0;case 1:return 1;case 2:return 2;default:return 3}},$elm$browser$Browser$External=function(a){return{$:1,a:a}},$elm$browser$Browser$Internal=function(a){return{$:0,a:a}},$elm$core$Basics$identity=function(x){return x},$elm$browser$Browser$Dom$NotFound=$elm$core$Basics$identity,$elm$url$Url$Http=0,$elm$url$Url$Https=1,$elm$url$Url$Url=F6(function(protocol,host,port_,path,query,fragment){return{aD:fragment,aE:host,a6:path,a9:port_,bc:protocol,bd:query}}),$elm$core$String$contains=_String_contains,$elm$core$String$length=_String_length,$elm$core$String$slice=_String_slice,$elm$core$String$dropLeft=F2(function(n,string){return(n<1)?string:A3($elm$core$String$slice,n,$elm$core$String$length(string),string)}),$elm$core$String$indexes=_String_indexes,$elm$core$String$isEmpty=function(string){return string===''},$elm$core$String$left=F2(function(n,string){return(n<1)?'':A3($elm$core$String$slice,0,n,string)}),$elm$core$String$toInt=_String_toInt,$elm$url$Url$chompBeforePath=F5(function(protocol,path,params,frag,str){if($elm$core$String$isEmpty(str)||A2($elm$core$String$contains,'@',str)){return $elm$core$Maybe$Nothing}else{var _v0=A2($elm$core$String$indexes,':',str);if(!_v0.b){return $elm$core$Maybe$Just(A6($elm$url$Url$Url,protocol,str,$elm$core$Maybe$Nothing,path,params,frag))}else if(!_v0.b.b){var i=_v0.a,_v1=$elm$core$String$toInt(A2($elm$core$String$dropLeft,i+1,str));if(_v1.$===1){return $elm$core$Maybe$Nothing}else{var port_=_v1;return $elm$core$Maybe$Just(A6($elm$url$Url$Url,protocol,A2($elm$core$String$left,i,str),port_,path,params,frag))}}else return $elm$core$Maybe$Nothing}}),$elm$url$Url$chompBeforeQuery=F4(function(protocol,params,frag,str){if($elm$core$String$isEmpty(str)){return $elm$core$Maybe$Nothing}else{var _v0=A2($elm$core$String$indexes,'/',str);if(!_v0.b){return A5($elm$url$Url$chompBeforePath,protocol,'/',params,frag,str)}else{var i=_v0.a;return A5($elm$url$Url$chompBeforePath,protocol,A2($elm$core$String$dropLeft,i,str),params,frag,A2($elm$core$String$left,i,str))}}}),$elm$url$Url$chompBeforeFragment=F3(function(protocol,frag,str){if($elm$core$String$isEmpty(str)){return $elm$core$Maybe$Nothing}else{var _v0=A2($elm$core$String$indexes,'?',str);if(!_v0.b){return A4($elm$url$Url$chompBeforeQuery,protocol,$elm$core$Maybe$Nothing,frag,str)}else{var i=_v0.a;return A4($elm$url$Url$chompBeforeQuery,protocol,$elm$core$Maybe$Just(A2($elm$core$String$dropLeft,i+1,str)),frag,A2($elm$core$String$left,i,str))}}}),$elm$url$Url$chompAfterProtocol=F2(function(protocol,str){if($elm$core$String$isEmpty(str)){return $elm$core$Maybe$Nothing}else{var _v0=A2($elm$core$String$indexes,'#',str);if(!_v0.b){return A3($elm$url$Url$chompBeforeFragment,protocol,$elm$core$Maybe$Nothing,str)}else{var i=_v0.a;return A3($elm$url$Url$chompBeforeFragment,protocol,$elm$core$Maybe$Just(A2($elm$core$String$dropLeft,i+1,str)),A2($elm$core$String$left,i,str))}}}),$elm$core$String$startsWith=_String_startsWith,$elm$url$Url$fromString=function(str){return A2($elm$core$String$startsWith,'http://',str)?A2($elm$url$Url$chompAfterProtocol,0,A2($elm$core$String$dropLeft,7,str)):(A2($elm$core$String$startsWith,'https://',str)?A2($elm$url$Url$chompAfterProtocol,1,A2($elm$core$String$dropLeft,8,str)):$elm$core$Maybe$Nothing)},$elm$core$Basics$never=function(_v0){never:while(true){var nvr=_v0,$temp$_v0=nvr;_v0=$temp$_v0;continue never}},$elm$core$Task$Perform=$elm$core$Basics$identity,$elm$core$Task$succeed=_Scheduler_succeed,$elm$core$Task$init=$elm$core$Task$succeed(0),$elm$core$List$foldrHelper=F4(function(fn,acc,ctr,ls){if(!ls.b){return acc}else{var a=ls.a,r1=ls.b;if(!r1.b){return A2(fn,a,acc)}else{var b=r1.a,r2=r1.b;if(!r2.b){return A2(fn,a,A2(fn,b,acc))}else{var c=r2.a,r3=r2.b;if(!r3.b){return A2(fn,a,A2(fn,b,A2(fn,c,acc)))}else{var d=r3.a,r4=r3.b,res=(ctr>500)?A3($elm$core$List$foldl,fn,acc,$elm$core$List$reverse(r4)):A4($elm$core$List$foldrHelper,fn,acc,ctr+1,r4);return A2(fn,a,A2(fn,b,A2(fn,c,A2(fn,d,res))))}}}}}),$elm$core$List$foldr=F3(function(fn,acc,ls){return A4($elm$core$List$foldrHelper,fn,acc,0,ls)}),$elm$core$List$map=F2(function(f,xs){return A3($elm$core$List$foldr,F2(function(x,acc){return A2($elm$core$List$cons,f(x),acc)}),_List_Nil,xs)}),$elm$core$Task$map=F2(function(func,taskA){return A2($elm$core$Task$andThen,function(a){return $elm$core$Task$succeed(func(a))},taskA)}),$elm$core$Task$map2=F3(function(func,taskA,taskB){return A2($elm$core$Task$andThen,function(a){return A2($elm$core$Task$andThen,function(b){return $elm$core$Task$succeed(A2(func,a,b))},taskB)},taskA)}),$elm$core$Task$sequence=function(tasks){return A3($elm$core$List$foldr,$elm$core$Task$map2($elm$core$List$cons),$elm$core$Task$succeed(_List_Nil),tasks)},$elm$core$Platform$sendToApp=_Platform_sendToApp,$elm$core$Task$spawnCmd=F2(function(router,_v0){var task=_v0;return _Scheduler_spawn(A2($elm$core$Task$andThen,$elm$core$Platform$sendToApp(router),task))}),$elm$core$Task$onEffects=F3(function(router,commands,state){return A2($elm$core$Task$map,function(_v0){return 0},$elm$core$Task$sequence(A2($elm$core$List$map,$elm$core$Task$spawnCmd(router),commands)))}),$elm$core$Task$onSelfMsg=F3(function(_v0,_v1,_v2){return $elm$core$Task$succeed(0)}),$elm$core$Task$cmdMap=F2(function(tagger,_v0){var task=_v0;return A2($elm$core$Task$map,tagger,task)});_Platform_effectManagers['Task']=_Platform_createManager($elm$core$Task$init,$elm$core$Task$onEffects,$elm$core$Task$onSelfMsg,$elm$core$Task$cmdMap);var $elm$core$Task$command=_Platform_leaf('Task'),$elm$core$Task$perform=F2(function(toMessage,task){return $elm$core$Task$command(A2($elm$core$Task$map,toMessage,task))}),$elm$browser$Browser$Dom$getViewport=_Browser_withWindow(_Browser_getViewport),$elm$core$Basics$round=_Basics_round,$author$project$Util$getViewportSize=A2($elm$core$Task$map,function(viewport){return{dh:$elm$core$Basics$round(viewport.bp.df),di:$elm$core$Basics$round(viewport.bp.b3)}},$elm$browser$Browser$Dom$getViewport),$elm$core$Set$Set_elm_builtin=$elm$core$Basics$identity,$elm$core$Set$empty=$elm$core$Dict$empty,$author$project$Main$loadLayout=function(layout){return{a:layout,w:$elm$core$Dict$empty,i:$elm$core$Set$empty,n:$elm$core$Dict$empty,E:$elm$core$Dict$empty}},$elm$core$Dict$map=F2(function(func,dict){if(dict.$===-2){return $elm$core$Dict$RBEmpty_elm_builtin}else{var color=dict.a,key=dict.b,value=dict.c,left=dict.d,right=dict.e;return A5($elm$core$Dict$RBNode_elm_builtin,color,key,A2(func,key,value),A2($elm$core$Dict$map,func,left),A2($elm$core$Dict$map,func,right))}}),$elm$time$Time$Name=function(a){return{$:0,a:a}},$elm$time$Time$Offset=function(a){return{$:1,a:a}},$elm$time$Time$Zone=F2(function(a,b){return{$:0,a:a,b:b}}),$elm$time$Time$customZone=$elm$time$Time$Zone,$elm$time$Time$Posix=$elm$core$Basics$identity,$elm$time$Time$millisToPosix=$elm$core$Basics$identity,$elm$time$Time$now=_Time_now($elm$time$Time$millisToPosix),$elm$json$Json$Encode$null=_Json_encodeNull,$author$project$Ports$initPort=_Platform_outgoingPort('initPort',function($){return $elm$json$Json$Encode$null}),$author$project$Ports$sendInit=$author$project$Ports$initPort(0),$author$project$Main$load=function(flags){return A2($elm$core$Task$andThen,function(startTime){return A2($elm$core$Task$andThen,function(viewport){var _v0=flags.cg;if(!_v0.b){return $elm$core$Task$fail($author$project$Main$OtherError('layout list is empty'))}else{var layout=_v0.a,layouts1=_v0.b,layouts=$elm$core$Dict$fromList(A2($elm$core$List$map,function(x){return _Utils_Tuple2(x.cs,$author$project$Main$loadLayout(x))},A2($elm$core$List$cons,layout,layouts1)));return $elm$core$Task$succeed(_Utils_Tuple2({bV:flags.bV,Y:false,aj:A2($elm$core$Dict$map,$elm$core$Basics$always(function(x){return x.a}),layouts),a:$author$project$Main$loadLayout(layout),cg:layouts,bl:startTime,c$:flags.c$,da:flags.da,O:viewport},$author$project$Ports$sendInit))}},$author$project$Util$getViewportSize)},$elm$time$Time$now)},$elm$core$Tuple$mapSecond=F2(function(func,_v0){var x=_v0.a,y=_v0.b;return _Utils_Tuple2(x,func(y))}),$elm$browser$Browser$Events$Window=1,$elm$browser$Browser$Events$MySub=F3(function(a,b,c){return{$:0,a:a,b:b,c:c}}),$elm$browser$Browser$Events$State=F2(function(subs,pids){return{a7:pids,bm:subs}}),$elm$browser$Browser$Events$init=$elm$core$Task$succeed(A2($elm$browser$Browser$Events$State,_List_Nil,$elm$core$Dict$empty)),$elm$browser$Browser$Events$nodeToKey=function(node){if(!node){return'd_'}else return'w_'},$elm$browser$Browser$Events$addKey=function(sub){var node=sub.a,name=sub.b;return _Utils_Tuple2(_Utils_ap($elm$browser$Browser$Events$nodeToKey(node),name),sub)},$elm$core$Process$kill=_Scheduler_kill,$elm$core$Dict$foldl=F3(function(func,acc,dict){foldl:while(true)if(dict.$===-2){return acc}else{var key=dict.b,value=dict.c,left=dict.d,right=dict.e,$temp$func=func,$temp$acc=A3(func,key,value,A3($elm$core$Dict$foldl,func,acc,left)),$temp$dict=right;func=$temp$func;acc=$temp$acc;dict=$temp$dict;continue foldl}}),$elm$core$Dict$merge=F6(function(leftStep,bothStep,rightStep,leftDict,rightDict,initialResult){var stepState=F3(function(rKey,rValue,_v0){stepState:while(true){var list=_v0.a,result=_v0.b;if(!list.b){return _Utils_Tuple2(list,A3(rightStep,rKey,rValue,result))}else{var _v2=list.a,lKey=_v2.a,lValue=_v2.b,rest=list.b;if(_Utils_cmp(lKey,rKey)<0){var $temp$rKey=rKey,$temp$rValue=rValue,$temp$_v0=_Utils_Tuple2(rest,A3(leftStep,lKey,lValue,result));rKey=$temp$rKey;rValue=$temp$rValue;_v0=$temp$_v0;continue stepState}else if(_Utils_cmp(lKey,rKey)>0){return _Utils_Tuple2(list,A3(rightStep,rKey,rValue,result))}else return _Utils_Tuple2(rest,A4(bothStep,lKey,lValue,rValue,result))}}}),_v3=A3($elm$core$Dict$foldl,stepState,_Utils_Tuple2($elm$core$Dict$toList(leftDict),initialResult),rightDict),leftovers=_v3.a,intermediateResult=_v3.b;return A3($elm$core$List$foldl,F2(function(_v4,result){var k=_v4.a,v=_v4.b;return A3(leftStep,k,v,result)}),intermediateResult,leftovers)}),$elm$browser$Browser$Events$Event=F2(function(key,event){return{aC:event,aI:key}}),$elm$core$Platform$sendToSelf=_Platform_sendToSelf,$elm$browser$Browser$Events$spawn=F3(function(router,key,_v0){var node=_v0.a,name=_v0.b,actualNode=function(){if(!node){return _Browser_doc}else return _Browser_window}();return A2($elm$core$Task$map,function(value){return _Utils_Tuple2(key,value)},A3(_Browser_on,actualNode,name,function(event){return A2($elm$core$Platform$sendToSelf,router,A2($elm$browser$Browser$Events$Event,key,event))}))}),$elm$core$Dict$union=F2(function(t1,t2){return A3($elm$core$Dict$foldl,$elm$core$Dict$insert,t2,t1)}),$elm$browser$Browser$Events$onEffects=F3(function(router,subs,state){var stepRight=F3(function(key,sub,_v6){var deads=_v6.a,lives=_v6.b,news=_v6.c;return _Utils_Tuple3(deads,lives,A2($elm$core$List$cons,A3($elm$browser$Browser$Events$spawn,router,key,sub),news))}),stepLeft=F3(function(_v4,pid,_v5){var deads=_v5.a,lives=_v5.b,news=_v5.c;return _Utils_Tuple3(A2($elm$core$List$cons,pid,deads),lives,news)}),stepBoth=F4(function(key,pid,_v2,_v3){var deads=_v3.a,lives=_v3.b,news=_v3.c;return _Utils_Tuple3(deads,A3($elm$core$Dict$insert,key,pid,lives),news)}),newSubs=A2($elm$core$List$map,$elm$browser$Browser$Events$addKey,subs),_v0=A6($elm$core$Dict$merge,stepLeft,stepBoth,stepRight,state.a7,$elm$core$Dict$fromList(newSubs),_Utils_Tuple3(_List_Nil,$elm$core$Dict$empty,_List_Nil)),deadPids=_v0.a,livePids=_v0.b,makeNewPids=_v0.c;return A2($elm$core$Task$andThen,function(pids){return $elm$core$Task$succeed(A2($elm$browser$Browser$Events$State,newSubs,A2($elm$core$Dict$union,livePids,$elm$core$Dict$fromList(pids))))},A2($elm$core$Task$andThen,function(_v1){return $elm$core$Task$sequence(makeNewPids)},$elm$core$Task$sequence(A2($elm$core$List$map,$elm$core$Process$kill,deadPids))))}),$elm$core$List$maybeCons=F3(function(f,mx,xs){var _v0=f(mx);if(!_v0.$){var x=_v0.a;return A2($elm$core$List$cons,x,xs)}else return xs}),$elm$core$List$filterMap=F2(function(f,xs){return A3($elm$core$List$foldr,$elm$core$List$maybeCons(f),_List_Nil,xs)}),$elm$browser$Browser$Events$onSelfMsg=F3(function(router,_v0,state){var key=_v0.aI,event=_v0.aC,toMessage=function(_v2){var subKey=_v2.a,_v3=_v2.b,node=_v3.a,name=_v3.b,decoder=_v3.c;return _Utils_eq(subKey,key)?A2(_Browser_decodeEvent,decoder,event):$elm$core$Maybe$Nothing},messages=A2($elm$core$List$filterMap,toMessage,state.bm);return A2($elm$core$Task$andThen,function(_v1){return $elm$core$Task$succeed(state)},$elm$core$Task$sequence(A2($elm$core$List$map,$elm$core$Platform$sendToApp(router),messages)))}),$elm$browser$Browser$Events$subMap=F2(function(func,_v0){var node=_v0.a,name=_v0.b,decoder=_v0.c;return A3($elm$browser$Browser$Events$MySub,node,name,A2($elm$json$Json$Decode$map,func,decoder))});_Platform_effectManagers['Browser.Events']=_Platform_createManager($elm$browser$Browser$Events$init,$elm$browser$Browser$Events$onEffects,$elm$browser$Browser$Events$onSelfMsg,0,$elm$browser$Browser$Events$subMap);var $elm$browser$Browser$Events$subscription=_Platform_leaf('Browser.Events'),$elm$browser$Browser$Events$on=F3(function(node,name,decoder){return $elm$browser$Browser$Events$subscription(A3($elm$browser$Browser$Events$MySub,node,name,decoder))}),$elm$browser$Browser$Events$onResize=function(func){return A3($elm$browser$Browser$Events$on,1,'resize',A2($elm$json$Json$Decode$field,'target',A3($elm$json$Json$Decode$map2,func,A2($elm$json$Json$Decode$field,'innerWidth',$elm$json$Json$Decode$int),A2($elm$json$Json$Decode$field,'innerHeight',$elm$json$Json$Decode$int))))},$elm$html$Html$pre=_VirtualDom_node('pre'),$author$project$Auto$ServerUpdate$AddElement=function(a){return{$:20,a:a}},$author$project$Auto$ServerUpdate$AddImage=F2(function(a,b){return{$:3,a:a,b:b}}),$author$project$Auto$ServerUpdate$AddText=F2(function(a,b){return{$:14,a:a,b:b}}),$author$project$Auto$ServerUpdate$DeleteImage=function(a){return{$:4,a:a}},$author$project$Auto$ServerUpdate$DeleteText=function(a){return{$:15,a:a}},$author$project$Auto$ServerUpdate$HideElement=function(a){return{$:18,a:a}},$author$project$Auto$ServerUpdate$Ping=function(a){return{$:33,a:a}},$author$project$Auto$ServerUpdate$PlayAudioURL=function(a){return{$:0,a:a}},$author$project$Auto$ServerUpdate$RemoveElement=function(a){return{$:21,a:a}},$author$project$Auto$ServerUpdate$ResetLayout=function(a){return{$:32,a:a}},$author$project$Auto$ServerUpdate$SetBackgroundColour=function(a){return{$:22,a:a}},$author$project$Auto$ServerUpdate$SetButtonColour=F2(function(a,b){return{$:30,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetButtonPressed=F2(function(a,b){return{$:31,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetImageURL=F2(function(a,b){return{$:2,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetIndicatorArcEnd=F2(function(a,b){return{$:25,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetIndicatorArcStart=F2(function(a,b){return{$:24,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetIndicatorCentre=F2(function(a,b){return{$:27,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetIndicatorColour=F2(function(a,b){return{$:28,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetIndicatorHollowness=F2(function(a,b){return{$:23,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetIndicatorShape=F2(function(a,b){return{$:26,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetLayout=function(a){return{$:16,a:a}},$author$project$Auto$ServerUpdate$SetSliderPosition=F2(function(a,b){return{$:29,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetText=F2(function(a,b){return{$:5,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetTextBold=F2(function(a,b){return{$:9,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetTextColour=F2(function(a,b){return{$:8,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetTextFont=F2(function(a,b){return{$:13,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetTextItalic=F2(function(a,b){return{$:10,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetTextShadow=F2(function(a,b){return{$:12,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetTextSize=F2(function(a,b){return{$:7,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetTextStyle=F2(function(a,b){return{$:6,a:a,b:b}}),$author$project$Auto$ServerUpdate$SetTextUnderline=F2(function(a,b){return{$:11,a:a,b:b}}),$author$project$Auto$ServerUpdate$ShowElement=function(a){return{$:19,a:a}},$author$project$Auto$ServerUpdate$SwitchLayout=function(a){return{$:17,a:a}},$author$project$Auto$ServerUpdate$Vibrate=function(a){return{$:1,a:a}},$author$project$Auto$ResetLayout$FullReset=1,$author$project$Auto$ResetLayout$StateReset=0,$author$project$Auto$ResetLayout$decode=A2($elm$json$Json$Decode$andThen,function(a){switch(a){case'StateReset':return $elm$json$Json$Decode$succeed(0);case'FullReset':return $elm$json$Json$Decode$succeed(1);default:return $elm$json$Json$Decode$fail('No matching constructor')}},$elm$json$Json$Decode$string),$elm$json$Json$Decode$index=_Json_decodeIndex,$author$project$Auto$ServerUpdate$decode=$elm$json$Json$Decode$oneOf(_List_fromArray([A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'PlayAudioURL',$elm$json$Json$Decode$string,$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$PlayAudioURL)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'Vibrate',$elm$json$Json$Decode$list($elm$json$Json$Decode$int),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$Vibrate)),A2($elm$json$Json$Decode$field,'SetImageURL',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$elm$json$Json$Decode$string),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetImageURL)))),A2($elm$json$Json$Decode$field,'AddImage',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$author$project$Auto$Image$decode),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$AddImage)))),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'DeleteImage',$elm$json$Json$Decode$string,$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$DeleteImage)),A2($elm$json$Json$Decode$field,'SetText',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$elm$json$Json$Decode$string),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetText)))),A2($elm$json$Json$Decode$field,'SetTextStyle',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$author$project$Auto$TextStyle$decode),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetTextStyle)))),A2($elm$json$Json$Decode$field,'SetTextSize',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$elm$json$Json$Decode$int),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetTextSize)))),A2($elm$json$Json$Decode$field,'SetTextColour',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$author$project$Auto$Colour$decode),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetTextColour)))),A2($elm$json$Json$Decode$field,'SetTextBold',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$elm$json$Json$Decode$bool),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetTextBold)))),A2($elm$json$Json$Decode$field,'SetTextItalic',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$elm$json$Json$Decode$bool),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetTextItalic)))),A2($elm$json$Json$Decode$field,'SetTextUnderline',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$elm$json$Json$Decode$bool),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetTextUnderline)))),A2($elm$json$Json$Decode$field,'SetTextShadow',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$elm$json$Json$Decode$list($author$project$Auto$TextShadow$decode)),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetTextShadow)))),A2($elm$json$Json$Decode$field,'SetTextFont',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$elm$json$Json$Decode$string),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetTextFont)))),A2($elm$json$Json$Decode$field,'AddText',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$author$project$Auto$TextBox$decode),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$AddText)))),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'DeleteText',$elm$json$Json$Decode$string,$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$DeleteText)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'SetLayout',$author$project$Auto$Layout$decode,$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetLayout)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'SwitchLayout',$elm$json$Json$Decode$string,$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SwitchLayout)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'HideElement',$elm$json$Json$Decode$string,$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$HideElement)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'ShowElement',$elm$json$Json$Decode$string,$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$ShowElement)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'AddElement',$author$project$Auto$FullElement$decode,$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$AddElement)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'RemoveElement',$elm$json$Json$Decode$string,$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$RemoveElement)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'SetBackgroundColour',$author$project$Auto$Colour$decode,$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetBackgroundColour)),A2($elm$json$Json$Decode$field,'SetIndicatorHollowness',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$elm$json$Json$Decode$float),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetIndicatorHollowness)))),A2($elm$json$Json$Decode$field,'SetIndicatorArcStart',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$elm$json$Json$Decode$float),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetIndicatorArcStart)))),A2($elm$json$Json$Decode$field,'SetIndicatorArcEnd',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$elm$json$Json$Decode$float),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetIndicatorArcEnd)))),A2($elm$json$Json$Decode$field,'SetIndicatorShape',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$author$project$Auto$Shape$decode),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetIndicatorShape)))),A2($elm$json$Json$Decode$field,'SetIndicatorCentre',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$author$project$Util$decodeVec2),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetIndicatorCentre)))),A2($elm$json$Json$Decode$field,'SetIndicatorColour',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$author$project$Auto$Colour$decode),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetIndicatorColour)))),A2($elm$json$Json$Decode$field,'SetSliderPosition',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$elm$json$Json$Decode$float),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetSliderPosition)))),A2($elm$json$Json$Decode$field,'SetButtonColour',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$author$project$Auto$Colour$decode),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetButtonColour)))),A2($elm$json$Json$Decode$field,'SetButtonPressed',A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,1,$elm$json$Json$Decode$bool),A2($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom,A2($elm$json$Json$Decode$index,0,$elm$json$Json$Decode$string),$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$SetButtonPressed)))),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'ResetLayout',$author$project$Auto$ResetLayout$decode,$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$ResetLayout)),A3($NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required,'Ping',$elm$json$Json$Decode$string,$elm$json$Json$Decode$succeed($author$project$Auto$ServerUpdate$Ping))])),$elm$core$List$singleton=function(value){return _List_fromArray([value])},$author$project$Ports$decodeUpdates=$elm$json$Json$Decode$oneOf(_List_fromArray([A2($elm$json$Json$Decode$map,$elm$core$List$singleton,$author$project$Auto$ServerUpdate$decode),$elm$json$Json$Decode$list($author$project$Auto$ServerUpdate$decode)])),$author$project$Ports$receiveUpdatePort=_Platform_incomingPort('receiveUpdatePort',$elm$json$Json$Decode$value),$author$project$Ports$receiveUpdates=$author$project$Ports$receiveUpdatePort($elm$json$Json$Decode$decodeValue($author$project$Ports$decodeUpdates)),$author$project$Main$ConsoleLog=function(a){return{$:8,a:a}},$author$project$Util$either=F3(function(f,g,x){if(x.$===1){var x1=x.a;return f(x1)}else{var x1=x.a;return g(x1)}}),$elm$core$Platform$Sub$map=_Platform_map,$author$project$Main$subLogErrors=F2(function(s,f){return $elm$core$Platform$Sub$map(A2($author$project$Util$either,function(err){return _List_fromArray([$author$project$Main$ConsoleLog('Failed to decode '+(s+(': '+$elm$json$Json$Decode$errorToString(err))))])},f))}),$elm$virtual_dom$VirtualDom$text=_VirtualDom_text,$elm$html$Html$text=$elm$virtual_dom$VirtualDom$text,$elm$json$Json$Encode$string=_Json_wrap,$author$project$Ports$logPort=_Platform_outgoingPort('logPort',$elm$json$Json$Encode$string),$author$project$Ports$consoleLog=$author$project$Ports$logPort,$elm$core$Dict$get=F2(function(targetKey,dict){get:while(true)if(dict.$===-2){return $elm$core$Maybe$Nothing}else{var key=dict.b,value=dict.c,left=dict.d,right=dict.e,_v1=A2($elm$core$Basics$compare,targetKey,key);switch(_v1){case 0:var $temp$targetKey=targetKey,$temp$dict=left;targetKey=$temp$targetKey;dict=$temp$dict;continue get;case 1:return $elm$core$Maybe$Just(value);default:var $temp$targetKey=targetKey,$temp$dict=right;targetKey=$temp$targetKey;dict=$temp$dict;continue get}}}),$author$project$Ports$fullscreenPort=_Platform_outgoingPort('fullscreenPort',function($){return $elm$json$Json$Encode$null}),$author$project$Ports$goFullscreen=$author$project$Ports$fullscreenPort(0),$elm$core$Set$insert=F2(function(key,_v0){var dict=_v0;return A3($elm$core$Dict$insert,key,0,dict)}),$author$project$Util$maybe=F3(function(e,f,x){if(!x.$){var x1=x.a;return f(x1)}else return e}),$elm$core$Platform$Cmd$none=$elm$core$Platform$Cmd$batch(_List_Nil),$author$project$Util$performCmd=A2($elm$core$Basics$composeL,$elm$core$Task$perform($elm$core$Basics$identity),$elm$core$Task$succeed),$elm$core$Dict$getMin=function(dict){getMin:while(true)if((dict.$===-1)&&(dict.d.$===-1)){var left=dict.d,$temp$dict=left;dict=$temp$dict;continue getMin}else return dict},$elm$core$Dict$moveRedLeft=function(dict){if(((dict.$===-1)&&(dict.d.$===-1))&&(dict.e.$===-1)){if((dict.e.d.$===-1)&&(!dict.e.d.a)){var clr=dict.a,k=dict.b,v=dict.c,_v1=dict.d,lClr=_v1.a,lK=_v1.b,lV=_v1.c,lLeft=_v1.d,lRight=_v1.e,_v2=dict.e,rClr=_v2.a,rK=_v2.b,rV=_v2.c,rLeft=_v2.d,_v3=rLeft.a,rlK=rLeft.b,rlV=rLeft.c,rlL=rLeft.d,rlR=rLeft.e,rRight=_v2.e;return A5($elm$core$Dict$RBNode_elm_builtin,0,rlK,rlV,A5($elm$core$Dict$RBNode_elm_builtin,1,k,v,A5($elm$core$Dict$RBNode_elm_builtin,0,lK,lV,lLeft,lRight),rlL),A5($elm$core$Dict$RBNode_elm_builtin,1,rK,rV,rlR,rRight))}else{var clr=dict.a,k=dict.b,v=dict.c,_v4=dict.d,lClr=_v4.a,lK=_v4.b,lV=_v4.c,lLeft=_v4.d,lRight=_v4.e,_v5=dict.e,rClr=_v5.a,rK=_v5.b,rV=_v5.c,rLeft=_v5.d,rRight=_v5.e;if(clr===1){return A5($elm$core$Dict$RBNode_elm_builtin,1,k,v,A5($elm$core$Dict$RBNode_elm_builtin,0,lK,lV,lLeft,lRight),A5($elm$core$Dict$RBNode_elm_builtin,0,rK,rV,rLeft,rRight))}else return A5($elm$core$Dict$RBNode_elm_builtin,1,k,v,A5($elm$core$Dict$RBNode_elm_builtin,0,lK,lV,lLeft,lRight),A5($elm$core$Dict$RBNode_elm_builtin,0,rK,rV,rLeft,rRight))}}else return dict},$elm$core$Dict$moveRedRight=function(dict){if(((dict.$===-1)&&(dict.d.$===-1))&&(dict.e.$===-1)){if((dict.d.d.$===-1)&&(!dict.d.d.a)){var clr=dict.a,k=dict.b,v=dict.c,_v1=dict.d,lClr=_v1.a,lK=_v1.b,lV=_v1.c,_v2=_v1.d,_v3=_v2.a,llK=_v2.b,llV=_v2.c,llLeft=_v2.d,llRight=_v2.e,lRight=_v1.e,_v4=dict.e,rClr=_v4.a,rK=_v4.b,rV=_v4.c,rLeft=_v4.d,rRight=_v4.e;return A5($elm$core$Dict$RBNode_elm_builtin,0,lK,lV,A5($elm$core$Dict$RBNode_elm_builtin,1,llK,llV,llLeft,llRight),A5($elm$core$Dict$RBNode_elm_builtin,1,k,v,lRight,A5($elm$core$Dict$RBNode_elm_builtin,0,rK,rV,rLeft,rRight)))}else{var clr=dict.a,k=dict.b,v=dict.c,_v5=dict.d,lClr=_v5.a,lK=_v5.b,lV=_v5.c,lLeft=_v5.d,lRight=_v5.e,_v6=dict.e,rClr=_v6.a,rK=_v6.b,rV=_v6.c,rLeft=_v6.d,rRight=_v6.e;if(clr===1){return A5($elm$core$Dict$RBNode_elm_builtin,1,k,v,A5($elm$core$Dict$RBNode_elm_builtin,0,lK,lV,lLeft,lRight),A5($elm$core$Dict$RBNode_elm_builtin,0,rK,rV,rLeft,rRight))}else return A5($elm$core$Dict$RBNode_elm_builtin,1,k,v,A5($elm$core$Dict$RBNode_elm_builtin,0,lK,lV,lLeft,lRight),A5($elm$core$Dict$RBNode_elm_builtin,0,rK,rV,rLeft,rRight))}}else return dict},$elm$core$Dict$removeHelpPrepEQGT=F7(function(targetKey,dict,color,key,value,left,right){if((left.$===-1)&&(!left.a)){var _v1=left.a,lK=left.b,lV=left.c,lLeft=left.d,lRight=left.e;return A5($elm$core$Dict$RBNode_elm_builtin,color,lK,lV,lLeft,A5($elm$core$Dict$RBNode_elm_builtin,0,key,value,lRight,right))}else{_v2$2:while(true)if((right.$===-1)&&(right.a===1)){if(right.d.$===-1){if(right.d.a===1){var _v3=right.a,_v4=right.d,_v5=_v4.a;return $elm$core$Dict$moveRedRight(dict)}else break _v2$2}else{var _v6=right.a,_v7=right.d;return $elm$core$Dict$moveRedRight(dict)}}else break _v2$2;return dict}}),$elm$core$Dict$removeMin=function(dict){if((dict.$===-1)&&(dict.d.$===-1)){var color=dict.a,key=dict.b,value=dict.c,left=dict.d,lColor=left.a,lLeft=left.d,right=dict.e;if(lColor===1){if((lLeft.$===-1)&&(!lLeft.a)){var _v3=lLeft.a;return A5($elm$core$Dict$RBNode_elm_builtin,color,key,value,$elm$core$Dict$removeMin(left),right)}else{var _v4=$elm$core$Dict$moveRedLeft(dict);if(_v4.$===-1){var nColor=_v4.a,nKey=_v4.b,nValue=_v4.c,nLeft=_v4.d,nRight=_v4.e;return A5($elm$core$Dict$balance,nColor,nKey,nValue,$elm$core$Dict$removeMin(nLeft),nRight)}else return $elm$core$Dict$RBEmpty_elm_builtin}}else return A5($elm$core$Dict$RBNode_elm_builtin,color,key,value,$elm$core$Dict$removeMin(left),right)}else return $elm$core$Dict$RBEmpty_elm_builtin},$elm$core$Dict$removeHelp=F2(function(targetKey,dict){if(dict.$===-2){return $elm$core$Dict$RBEmpty_elm_builtin}else{var color=dict.a,key=dict.b,value=dict.c,left=dict.d,right=dict.e;if(_Utils_cmp(targetKey,key)<0){if((left.$===-1)&&(left.a===1)){var _v4=left.a,lLeft=left.d;if((lLeft.$===-1)&&(!lLeft.a)){var _v6=lLeft.a;return A5($elm$core$Dict$RBNode_elm_builtin,color,key,value,A2($elm$core$Dict$removeHelp,targetKey,left),right)}else{var _v7=$elm$core$Dict$moveRedLeft(dict);if(_v7.$===-1){var nColor=_v7.a,nKey=_v7.b,nValue=_v7.c,nLeft=_v7.d,nRight=_v7.e;return A5($elm$core$Dict$balance,nColor,nKey,nValue,A2($elm$core$Dict$removeHelp,targetKey,nLeft),nRight)}else return $elm$core$Dict$RBEmpty_elm_builtin}}else return A5($elm$core$Dict$RBNode_elm_builtin,color,key,value,A2($elm$core$Dict$removeHelp,targetKey,left),right)}else return A2($elm$core$Dict$removeHelpEQGT,targetKey,A7($elm$core$Dict$removeHelpPrepEQGT,targetKey,dict,color,key,value,left,right))}}),$elm$core$Dict$removeHelpEQGT=F2(function(targetKey,dict){if(dict.$===-1){var color=dict.a,key=dict.b,value=dict.c,left=dict.d,right=dict.e;if(_Utils_eq(targetKey,key)){var _v1=$elm$core$Dict$getMin(right);if(_v1.$===-1){var minKey=_v1.b,minValue=_v1.c;return A5($elm$core$Dict$balance,color,minKey,minValue,left,$elm$core$Dict$removeMin(right))}else return $elm$core$Dict$RBEmpty_elm_builtin}else return A5($elm$core$Dict$balance,color,key,value,left,A2($elm$core$Dict$removeHelp,targetKey,right))}else return $elm$core$Dict$RBEmpty_elm_builtin}),$elm$core$Dict$remove=F2(function(key,dict){var _v0=A2($elm$core$Dict$removeHelp,key,dict);if((_v0.$===-1)&&(!_v0.a)){var _v1=_v0.a,k=_v0.b,v=_v0.c,l=_v0.d,r=_v0.e;return A5($elm$core$Dict$RBNode_elm_builtin,1,k,v,l,r)}else{var x=_v0;return x}}),$elm$core$Set$remove=F2(function(key,_v0){var dict=_v0;return A2($elm$core$Dict$remove,key,dict)}),$author$project$Ports$resetFormPort=_Platform_outgoingPort('resetFormPort',$elm$json$Json$Encode$string),$author$project$Ports$resetForm=$author$project$Ports$resetFormPort,$elm$bytes$Bytes$Decode$Done=function(a){return{$:1,a:a}},$elm$bytes$Bytes$Decode$Loop=function(a){return{$:0,a:a}},$elm$bytes$Bytes$Encode$getWidth=function(builder){switch(builder.$){case 0:return 1;case 1:return 2;case 2:return 4;case 3:return 1;case 4:return 2;case 5:return 4;case 6:return 4;case 7:return 8;case 8:var w=builder.a;return w;case 9:var w=builder.a;return w;default:var bs=builder.a;return _Bytes_width(bs)}},$elm$bytes$Bytes$LE=0,$elm$bytes$Bytes$Encode$write=F3(function(builder,mb,offset){switch(builder.$){case 0:var n=builder.a;return A3(_Bytes_write_i8,mb,offset,n);case 1:var e=builder.a,n=builder.b;return A4(_Bytes_write_i16,mb,offset,n,!e);case 2:var e=builder.a,n=builder.b;return A4(_Bytes_write_i32,mb,offset,n,!e);case 3:var n=builder.a;return A3(_Bytes_write_u8,mb,offset,n);case 4:var e=builder.a,n=builder.b;return A4(_Bytes_write_u16,mb,offset,n,!e);case 5:var e=builder.a,n=builder.b;return A4(_Bytes_write_u32,mb,offset,n,!e);case 6:var e=builder.a,n=builder.b;return A4(_Bytes_write_f32,mb,offset,n,!e);case 7:var e=builder.a,n=builder.b;return A4(_Bytes_write_f64,mb,offset,n,!e);case 8:var bs=builder.b;return A3($elm$bytes$Bytes$Encode$writeSequence,bs,mb,offset);case 9:var s=builder.b;return A3(_Bytes_write_string,mb,offset,s);default:var bs=builder.a;return A3(_Bytes_write_bytes,mb,offset,bs)}}),$elm$bytes$Bytes$Encode$writeSequence=F3(function(builders,mb,offset){writeSequence:while(true)if(!builders.b){return offset}else{var b=builders.a,bs=builders.b,$temp$builders=bs,$temp$mb=mb,$temp$offset=A3($elm$bytes$Bytes$Encode$write,b,mb,offset);builders=$temp$builders;mb=$temp$mb;offset=$temp$offset;continue writeSequence}}),$elm$bytes$Bytes$Decode$decode=F2(function(_v0,bs){var decoder=_v0;return A2(_Bytes_decode,decoder,bs)}),$elm$bytes$Bytes$Decode$Decoder=$elm$core$Basics$identity,$elm$bytes$Bytes$Decode$loopHelp=F4(function(state,callback,bites,offset){loopHelp:while(true){var _v0=callback(state),decoder=_v0,_v1=A2(decoder,bites,offset),newOffset=_v1.a,step=_v1.b;if(!step.$){var newState=step.a,$temp$state=newState,$temp$callback=callback,$temp$bites=bites,$temp$offset=newOffset;state=$temp$state;callback=$temp$callback;bites=$temp$bites;offset=$temp$offset;continue loopHelp}else{var result=step.a;return _Utils_Tuple2(newOffset,result)}}}),$elm$bytes$Bytes$Decode$loop=F2(function(state,callback){return A2($elm$bytes$Bytes$Decode$loopHelp,state,callback)}),$elm$bytes$Bytes$Decode$map=F2(function(func,_v0){var decodeA=_v0;return F2(function(bites,offset){var _v1=A2(decodeA,bites,offset),aOffset=_v1.a,a=_v1.b;return _Utils_Tuple2(aOffset,func(a))})}),$elm$bytes$Bytes$Decode$succeed=function(a){return F2(function(_v0,offset){return _Utils_Tuple2(offset,a)})},$elm$bytes$Bytes$Decode$unsignedInt8=_Bytes_read_u8,$elm$bytes$Bytes$width=_Bytes_width,$elm$core$Maybe$withDefault=F2(function(_default,maybe){if(!maybe.$){var value=maybe.a;return value}else return _default}),$author$project$Util$EncodeBytes$bytesToList=function(bs){var listStep=F2(function(decoder,_v0){var n=_v0.a,xs=_v0.b;return(n<=0)?$elm$bytes$Bytes$Decode$succeed($elm$bytes$Bytes$Decode$Done(xs)):A2($elm$bytes$Bytes$Decode$map,function(x){return $elm$bytes$Bytes$Decode$Loop(_Utils_Tuple2(n-1,A2($elm$core$List$cons,x,xs)))},decoder)}),bytesListDecode=F2(function(decoder,len){return A2($elm$bytes$Bytes$Decode$loop,_Utils_Tuple2(len,_List_Nil),listStep(decoder))}),listDecode=A2(bytesListDecode,$elm$bytes$Bytes$Decode$unsignedInt8,$elm$bytes$Bytes$width(bs));return $elm$core$List$reverse(A2($elm$core$Maybe$withDefault,_List_Nil,A2($elm$bytes$Bytes$Decode$decode,listDecode,bs)))},$elm$bytes$Bytes$Encode$F64=F2(function(a,b){return{$:7,a:a,b:b}}),$elm$bytes$Bytes$Encode$float64=$elm$bytes$Bytes$Encode$F64,$elm_explorations$linear_algebra$Math$Vector2$getX=_MJS_v2getX,$elm_explorations$linear_algebra$Math$Vector2$getY=_MJS_v2getY,$robinheghan$murmur3$Murmur3$HashData=F4(function(shift,seed,hash,charsProcessed){return{J:charsProcessed,L:hash,D:seed,cP:shift}}),$robinheghan$murmur3$Murmur3$c1=3432918353,$robinheghan$murmur3$Murmur3$c2=461845907,$elm$core$Bitwise$and=_Bitwise_and,$elm$core$Bitwise$shiftLeftBy=_Bitwise_shiftLeftBy,$elm$core$Bitwise$shiftRightZfBy=_Bitwise_shiftRightZfBy,$robinheghan$murmur3$Murmur3$multiplyBy=F2(function(b,a){return((a&65535)*b)+((((a>>>16)*b)&65535)<<16)}),$elm$core$Basics$neq=_Utils_notEqual,$elm$core$Bitwise$or=_Bitwise_or,$robinheghan$murmur3$Murmur3$rotlBy=F2(function(b,a){return(a<>>(32-b))}),$elm$core$Bitwise$xor=_Bitwise_xor,$robinheghan$murmur3$Murmur3$finalize=function(data){var acc=(!(!data.L))?(data.D^A2($robinheghan$murmur3$Murmur3$multiplyBy,$robinheghan$murmur3$Murmur3$c2,A2($robinheghan$murmur3$Murmur3$rotlBy,15,A2($robinheghan$murmur3$Murmur3$multiplyBy,$robinheghan$murmur3$Murmur3$c1,data.L)))):data.D,h0=acc^data.J,h1=A2($robinheghan$murmur3$Murmur3$multiplyBy,2246822507,h0^(h0>>>16)),h2=A2($robinheghan$murmur3$Murmur3$multiplyBy,3266489909,h1^(h1>>>13));return(h2^(h2>>>16))>>>0},$elm$core$String$foldl=_String_foldl,$robinheghan$murmur3$Murmur3$mix=F2(function(h1,k1){return A2($robinheghan$murmur3$Murmur3$multiplyBy,5,A2($robinheghan$murmur3$Murmur3$rotlBy,13,h1^A2($robinheghan$murmur3$Murmur3$multiplyBy,$robinheghan$murmur3$Murmur3$c2,A2($robinheghan$murmur3$Murmur3$rotlBy,15,A2($robinheghan$murmur3$Murmur3$multiplyBy,$robinheghan$murmur3$Murmur3$c1,k1)))))+3864292196}),$robinheghan$murmur3$Murmur3$hashFold=F2(function(c,data){var res=data.L|((255&$elm$core$Char$toCode(c))<4.045e-2)?A2($elm$core$Basics$pow,(ch+5.5e-2)/1.055,2.4):(ch/12.92);return ch_*100},_v0=$avh4$elm_color$Color$toRgba(cl),red=_v0.cE,green=_v0.b$,blue=_v0.bA,b=c(blue),g=c(green),r=c(red);return{dh:((r*0.4124)+(g*0.3576))+(b*0.1805),di:((r*0.2126)+(g*0.7152))+(b*7.22e-2),ad:((r*1.93e-2)+(g*0.1192))+(b*0.9505)}},$noahzgordon$elm_color_extra$Color$Convert$xyzToLab=function(_v0){var x=_v0.dh,y=_v0.di,z=_v0.ad,c=function(ch){return(ch>8.856e-3)?A2($elm$core$Basics$pow,ch,1/3):((7.787*ch)+(16/116))},x_=c(x/95.047),y_=c(y/100),z_=c(z/108.883);return{ae:500*(x_-y_),af:200*(y_-z_),ak:(116*y_)-16}},$noahzgordon$elm_color_extra$Color$Convert$colorToLab=A2($elm$core$Basics$composeR,$noahzgordon$elm_color_extra$Color$Convert$colorToXyz,$noahzgordon$elm_color_extra$Color$Convert$xyzToLab),$elm$core$Basics$degrees=function(angleInDegrees){return(angleInDegrees*$elm$core$Basics$pi)/180},$noahzgordon$elm_color_extra$Color$Interpolate$degree180=$elm$core$Basics$degrees(180),$noahzgordon$elm_color_extra$Color$Interpolate$degree360=$elm$core$Basics$degrees(360),$avh4$elm_color$Color$hsla=F4(function(hue,sat,light,alpha){var _v0=_Utils_Tuple3(hue,sat,light),h=_v0.a,s=_v0.b,l=_v0.c,m2=(l<=0.5)?(l*(s+1)):((l+s)-(l*s)),m1=(l*2)-m2,hueToRgb=function(h__){var h_=(h__<0)?(h__+1):((h__>1)?(h__-1):h__);return((h_*6)<1)?(m1+(((m2-m1)*h_)*6)):(((h_*2)<1)?m2:(((h_*3)<2)?(m1+(((m2-m1)*((2/3)-h_))*6)):m1))},b=hueToRgb(h-(1/3)),g=hueToRgb(h),r=hueToRgb(h+(1/3));return A4($avh4$elm_color$Color$RgbaSpace,r,g,b,alpha)}),$noahzgordon$elm_color_extra$Color$Convert$labToXyz=function(_v0){var l=_v0.ak,a=_v0.ae,b=_v0.af,y=(l+16)/116,c=function(ch){var ch_=(ch*ch)*ch;return(ch_>8.856e-3)?ch_:((ch-(16/116))/7.787)};return{dh:c(y+(a/500))*95.047,di:c(y)*100,ad:c(y-(b/200))*108.883}},$elm$core$Basics$clamp=F3(function(low,high,number){return(_Utils_cmp(number,low)<0)?low:((_Utils_cmp(number,high)>0)?high:number)}),$noahzgordon$elm_color_extra$Color$Convert$xyzToColor=function(_v0){var x=_v0.dh,y=_v0.di,z=_v0.ad,z_=z/100,y_=y/100,x_=x/100,r=((x_*3.2404542)+(y_*(-1.5371385)))+(z_*(-0.4986)),g=((x_*(-0.969266))+(y_*1.8760108))+(z_*4.1556e-2),c=function(ch){var ch_=(ch>3.1308e-3)?((1.055*A2($elm$core$Basics$pow,ch,1/2.4))-5.5e-2):(12.92*ch);return A3($elm$core$Basics$clamp,0,1,ch_)},b=((x_*5.56434e-2)+(y_*(-0.2040259)))+(z_*1.0572252);return A3($avh4$elm_color$Color$rgb,c(r),c(g),c(b))},$noahzgordon$elm_color_extra$Color$Convert$labToColor=A2($elm$core$Basics$composeR,$noahzgordon$elm_color_extra$Color$Convert$labToXyz,$noahzgordon$elm_color_extra$Color$Convert$xyzToColor),$noahzgordon$elm_color_extra$Color$Interpolate$linear=F3(function(t,i1,i2){return i1+((i2-i1)*t)}),$avh4$elm_color$Color$rgba=F4(function(r,g,b,a){return A4($avh4$elm_color$Color$RgbaSpace,r,g,b,a)}),$elm$core$Basics$isNaN=_Basics_isNaN,$avh4$elm_color$Color$toHsla=function(_v0){var r=_v0.a,g=_v0.b,b=_v0.c,a=_v0.d,minColor=A2($elm$core$Basics$min,r,A2($elm$core$Basics$min,g,b)),maxColor=A2($elm$core$Basics$max,r,A2($elm$core$Basics$max,g,b)),l=(minColor+maxColor)/2,s=_Utils_eq(minColor,maxColor)?0:((l<0.5)?((maxColor-minColor)/(maxColor+minColor)):((maxColor-minColor)/((2-maxColor)-minColor))),h1=_Utils_eq(maxColor,r)?((g-b)/(maxColor-minColor)):(_Utils_eq(maxColor,g)?(2+((b-r)/(maxColor-minColor))):(4+((r-g)/(maxColor-minColor)))),h2=h1*(1/6),h3=$elm$core$Basics$isNaN(h2)?0:((h2<0)?(h2+1):h2);return{bu:a,aF:h3,aJ:l,bg:s}},$noahzgordon$elm_color_extra$Color$Interpolate$interpolate=F4(function(space,cl1,cl2,t){var i=$noahzgordon$elm_color_extra$Color$Interpolate$linear(t);switch(space){case 0:var cl2_=$avh4$elm_color$Color$toRgba(cl2),cl1_=$avh4$elm_color$Color$toRgba(cl1);return A4($avh4$elm_color$Color$rgba,A2(i,cl1_.cE,cl2_.cE),A2(i,cl1_.b$,cl2_.b$),A2(i,cl1_.bA,cl2_.bA),A2(i,cl1_.bu,cl2_.bu));case 1:var cl2_=$avh4$elm_color$Color$toHsla(cl2),h2=cl2_.aF,cl1_=$avh4$elm_color$Color$toHsla(cl1),h1=cl1_.aF,dH=((_Utils_cmp(h2,h1)>0)&&(_Utils_cmp(h2-h1,$noahzgordon$elm_color_extra$Color$Interpolate$degree180)>0))?((h2-h1)+$noahzgordon$elm_color_extra$Color$Interpolate$degree360):(((_Utils_cmp(h2,h1)<0)&&(_Utils_cmp(h1-h2,$noahzgordon$elm_color_extra$Color$Interpolate$degree180)>0))?((h2+$noahzgordon$elm_color_extra$Color$Interpolate$degree360)-h1):(h2-h1));return A4($avh4$elm_color$Color$hsla,h1+(t*dH),A2(i,cl1_.bg,cl2_.bg),A2(i,cl1_.aJ,cl2_.aJ),A2(i,cl1_.bu,cl2_.bu));default:var lab2=$noahzgordon$elm_color_extra$Color$Convert$colorToLab(cl2),lab1=$noahzgordon$elm_color_extra$Color$Convert$colorToLab(cl1);return $noahzgordon$elm_color_extra$Color$Convert$labToColor({ae:A2(i,lab1.ae,lab2.ae),af:A2(i,lab1.af,lab2.af),ak:A2(i,lab1.ak,lab2.ak)})}}),$author$project$Util$darkColor=function(c){return A4($noahzgordon$elm_color_extra$Color$Interpolate$interpolate,0,c,$avh4$elm_color$Color$black,0.6)},$author$project$Main$PointerDown=F2(function(a,b){return{$:2,a:a,b:b}}),$timjs$elm_collage$Collage$Events$on=F3(function(event,decoder,collage){return _Utils_update(collage,{b2:A2($elm$core$List$cons,_Utils_Tuple2(event,decoder),collage.b2)})}),$author$project$Main$onPointerDown=F2(function(f,y){return A2($timjs$elm_collage$Collage$Events$on,'pointerdown',A2($elm$json$Json$Decode$map,function(x){return _List_fromArray([A2($author$project$Main$PointerDown,x.ac,y),$author$project$Main$ClientUpdate(f(x))])},$mpizenberg$elm_pointer_events$Html$Events$Extra$Pointer$eventDecoder))}),$timjs$elm_collage$Collage$Core$Rectangle=F3(function(a,b,c){return{$:1,a:a,b:b,c:c}}),$timjs$elm_collage$Collage$roundedRectangle=$timjs$elm_collage$Collage$Core$Rectangle,$timjs$elm_collage$Collage$rectangle=F2(function(w,h){return A3($timjs$elm_collage$Collage$roundedRectangle,w,h,0)}),$timjs$elm_collage$Collage$Flat=0,$timjs$elm_collage$Collage$Sharp=1,$timjs$elm_collage$Collage$thin=2.0,$timjs$elm_collage$Collage$uniform=$timjs$elm_collage$Collage$Core$Uniform,$timjs$elm_collage$Collage$defaultLineStyle={av:0,ag:_List_Nil,ay:0,ai:$timjs$elm_collage$Collage$uniform($avh4$elm_color$Color$black),aH:1,ar:$timjs$elm_collage$Collage$thin},$timjs$elm_collage$Collage$broken=F3(function(dashes,thickness,fill){return _Utils_update($timjs$elm_collage$Collage$defaultLineStyle,{ag:dashes,ai:fill,ar:thickness})}),$timjs$elm_collage$Collage$solid=$timjs$elm_collage$Collage$broken(_List_Nil),$timjs$elm_collage$Collage$Core$Shape=F2(function(a,b){return{$:0,a:a,b:b}}),$timjs$elm_collage$Collage$styled=function(style){return A2($elm$core$Basics$composeL,$timjs$elm_collage$Collage$Core$collage,$timjs$elm_collage$Collage$Core$Shape(style))},$timjs$elm_collage$Collage$thick=4.0,$author$project$Main$viewButton=F3(function(name,button,pressed){var shape=function(){var _v0=button.cO;if(!_v0.$){var r=_v0.a;return $timjs$elm_collage$Collage$circle(r)}else{var v=_v0.a;return A2($timjs$elm_collage$Collage$rectangle,v.dh,v.di)}}();return A3($author$project$Main$onPointerDown,$elm$core$Basics$always($author$project$Auto$ClientUpdate$ButtonDown(name)),{R:$elm$core$Basics$always(_List_Nil),S:_List_fromArray([$author$project$Main$ClientUpdate($author$project$Auto$ClientUpdate$ButtonUp(name))])},A2($timjs$elm_collage$Collage$styled,_Utils_Tuple2($timjs$elm_collage$Collage$uniform(A3($author$project$Util$applyWhen,pressed,$author$project$Util$darkColor,$avh4$elm_color$Color$fromRgba(button.bM))),A2($timjs$elm_collage$Collage$solid,$timjs$elm_collage$Collage$thick,$timjs$elm_collage$Collage$uniform($avh4$elm_color$Color$black))),shape))}),$author$project$Util$both=F2(function(f,_v0){var x=_v0.a,y=_v0.b;return _Utils_Tuple2(f(x),f(y))}),$elm$html$Html$Attributes$height=function(n){return A2(_VirtualDom_attribute,'height',$elm$core$String$fromInt(n))},$timjs$elm_collage$Collage$Core$Html=F3(function(a,b,c){return{$:4,a:a,b:b,c:c}}),$timjs$elm_collage$Collage$html=F2(function(dims,attrs){return A2($elm$core$Basics$composeL,$timjs$elm_collage$Collage$Core$collage,A2($timjs$elm_collage$Collage$Core$Html,dims,attrs))}),$elm$html$Html$img=_VirtualDom_node('img'),$elm$html$Html$Attributes$stringProperty=F2(function(key,string){return A2(_VirtualDom_property,key,$elm$json$Json$Encode$string(string))}),$elm$html$Html$Attributes$src=function(url){return A2($elm$html$Html$Attributes$stringProperty,'src',_VirtualDom_noJavaScriptOrHtmlUri(url))},$elm$html$Html$Attributes$width=function(n){return A2(_VirtualDom_attribute,'width',$elm$core$String$fromInt(n))},$author$project$Main$viewImage=F2(function(size,img){return A3($timjs$elm_collage$Collage$html,A2($author$project$Util$both,$elm$core$Basics$toFloat,_Utils_Tuple2(size.dh,size.di)),_List_fromArray([A2($elm$html$Html$Attributes$style,'pointer-events','none')]),A2($elm$html$Html$img,_List_fromArray([$elm$html$Html$Attributes$src(img.c9),$elm$html$Html$Attributes$width(size.dh),$elm$html$Html$Attributes$height(size.di)]),_List_Nil))}),$elm$core$Basics$abs=function(n){return(n<0)?(-n):n},$elm$core$Basics$cos=_Basics_cos,$elm_community$list_extra$List$Extra$dropWhile=F2(function(predicate,list){dropWhile:while(true)if(!list.b){return _List_Nil}else{var x=list.a,xs=list.b;if(predicate(x)){var $temp$predicate=predicate,$temp$list=xs;predicate=$temp$predicate;list=$temp$list;continue dropWhile}else return list}}),$timjs$elm_collage$Collage$Core$Polygon=function(a){return{$:0,a:a}},$timjs$elm_collage$Collage$polygon=$timjs$elm_collage$Collage$Core$Polygon,$author$project$Util$scaleVec2=F2(function(factors,v){return A2($elm_explorations$linear_algebra$Math$Vector2$vec2,factors.cL*$elm_explorations$linear_algebra$Math$Vector2$getX(v),factors.cM*$elm_explorations$linear_algebra$Math$Vector2$getY(v))}),$elm$core$Basics$sin=_Basics_sin,$author$project$Main$styled1=function(c){return $timjs$elm_collage$Collage$styled(_Utils_Tuple2($timjs$elm_collage$Collage$uniform($avh4$elm_color$Color$fromRgba(c)),$timjs$elm_collage$Collage$defaultLineStyle))},$elm_community$list_extra$List$Extra$takeWhile=function(predicate){var takeWhileMemo=F2(function(memo,list){takeWhileMemo:while(true)if(!list.b){return $elm$core$List$reverse(memo)}else{var x=list.a,xs=list.b;if(predicate(x)){var $temp$memo=A2($elm$core$List$cons,x,memo),$temp$list=xs;memo=$temp$memo;list=$temp$list;continue takeWhileMemo}else return $elm$core$List$reverse(memo)}});return takeWhileMemo(_List_Nil)},$author$project$Main$viewIndicator=F2(function(_v0,ind){var scale=function(){var _v3=ind.cO;if(_v3.$===1){var v=_v3.a;return $author$project$Util$scaleVec2({cL:v.dh/2,cM:v.di/2})}else{var r=_v3.a;return $elm_explorations$linear_algebra$Math$Vector2$scale(r)}}(),b=(_Utils_cmp(ind.bw,ind.bx)<0)?(ind.bw+1):ind.bw,a=ind.bx,angles=A2($elm_community$list_extra$List$Extra$takeWhile,function(x){return _Utils_cmp(x,b)<0},A2($elm_community$list_extra$List$Extra$dropWhile,function(x){return _Utils_cmp(x,a)<0},function(){var _v2=ind.cO;if(_v2.$===1){return A2($elm$core$List$map,function(x){return(((2*x)+1)*1)/8},A2($elm$core$List$range,0,7))}else{var nPoints=256;return A2($elm$core$List$map,function(x){return x/nPoints},A2($elm$core$List$range,0,(2*nPoints)-1))}}())),outer=A2($elm$core$List$map,function(t){var _v1=ind.cO;if(_v1.$===1){var mod1=function(x){return x-$elm$core$Basics$floor(x)},f=function(x){return A3($elm$core$Basics$clamp,-1,1,(($elm$core$Basics$abs(mod1(x)-0.5)*2)-0.5)*4)};return A2($elm_explorations$linear_algebra$Math$Vector2$vec2,f(t),f(t-0.25))}else{var t1=(t*2)*$elm$core$Basics$pi;return A2($elm_explorations$linear_algebra$Math$Vector2$vec2,$elm$core$Basics$cos(t1),$elm$core$Basics$sin(t1))}},A2($elm$core$List$cons,a,_Utils_ap(angles,_List_fromArray([b])))),inner=(_Utils_eq(b,a+1)&&(!ind.b6))?_List_Nil:A2($elm$core$List$map,A2($elm$core$Basics$composeL,A2($elm$core$Basics$composeL,$elm_explorations$linear_algebra$Math$Vector2$add(ind.bH),$elm_explorations$linear_algebra$Math$Vector2$scale(ind.b6)),A2($elm_community$basics_extra$Basics$Extra$flip,$elm_explorations$linear_algebra$Math$Vector2$sub,ind.bH)),outer);return A2($author$project$Main$styled1,ind.bM,$timjs$elm_collage$Collage$polygon(A2($elm$core$List$map,A2($elm$core$Basics$composeL,$author$project$Util$unVec2,scale),_Utils_ap($elm$core$List$reverse(outer),inner))))}),$author$project$Auto$ClientUpdate$InputBool=F2(function(a,b){return{$:4,a:a,b:b}}),$author$project$Auto$ClientUpdate$InputNumber=F2(function(a,b){return{$:5,a:a,b:b}}),$author$project$Auto$ClientUpdate$InputText=F2(function(a,b){return{$:6,a:a,b:b}}),$author$project$Main$ResetForm=function(a){return{$:7,a:a}},$author$project$Auto$ClientUpdate$SubmitInput=function(a){return{$:7,a:a}},$elm$html$Html$form=_VirtualDom_node('form'),$elm$html$Html$Attributes$id=$elm$html$Html$Attributes$stringProperty('id'),$elm$html$Html$input=_VirtualDom_node('input'),$elm$virtual_dom$VirtualDom$mapAttribute=_VirtualDom_mapAttribute,$elm$html$Html$Attributes$map=$elm$virtual_dom$VirtualDom$mapAttribute,$elm$html$Html$Attributes$max=$elm$html$Html$Attributes$stringProperty('max'),$elm$html$Html$Attributes$maxlength=function(n){return A2(_VirtualDom_attribute,'maxlength',$elm$core$String$fromInt(n))},$elm$html$Html$Attributes$min=$elm$html$Html$Attributes$stringProperty('min'),$elm$html$Html$Attributes$minlength=function(n){return A2(_VirtualDom_attribute,'minLength',$elm$core$String$fromInt(n))},$elm$json$Json$Decode$at=F2(function(fields,decoder){return A3($elm$core$List$foldr,$elm$json$Json$Decode$field,decoder,fields)}),$elm$html$Html$Events$targetChecked=A2($elm$json$Json$Decode$at,_List_fromArray(['target','checked']),$elm$json$Json$Decode$bool),$elm$html$Html$Events$onCheck=function(tagger){return A2($elm$html$Html$Events$on,'change',A2($elm$json$Json$Decode$map,tagger,$elm$html$Html$Events$targetChecked))},$elm$html$Html$Events$alwaysStop=function(x){return _Utils_Tuple2(x,true)},$elm$virtual_dom$VirtualDom$MayStopPropagation=function(a){return{$:1,a:a}},$elm$html$Html$Events$stopPropagationOn=F2(function(event,decoder){return A2($elm$virtual_dom$VirtualDom$on,event,$elm$virtual_dom$VirtualDom$MayStopPropagation(decoder))}),$elm$html$Html$Events$targetValue=A2($elm$json$Json$Decode$at,_List_fromArray(['target','value']),$elm$json$Json$Decode$string),$elm$html$Html$Events$onInput=function(tagger){return A2($elm$html$Html$Events$stopPropagationOn,'input',A2($elm$json$Json$Decode$map,$elm$html$Html$Events$alwaysStop,A2($elm$json$Json$Decode$map,tagger,$elm$html$Html$Events$targetValue)))},$elm$html$Html$Events$alwaysPreventDefault=function(msg){return _Utils_Tuple2(msg,true)},$elm$virtual_dom$VirtualDom$MayPreventDefault=function(a){return{$:2,a:a}},$elm$html$Html$Events$preventDefaultOn=F2(function(event,decoder){return A2($elm$virtual_dom$VirtualDom$on,event,$elm$virtual_dom$VirtualDom$MayPreventDefault(decoder))}),$elm$html$Html$Events$onSubmit=function(msg){return A2($elm$html$Html$Events$preventDefaultOn,'submit',A2($elm$json$Json$Decode$map,$elm$html$Html$Events$alwaysPreventDefault,$elm$json$Json$Decode$succeed(msg)))},$elm$html$Html$Attributes$step=function(n){return A2($elm$html$Html$Attributes$stringProperty,'step',n)},$author$project$Util$bool=F3(function(f,t,x){return x?t:f}),$elm$core$List$isEmpty=function(xs){if(!xs.b){return true}else return false},$author$project$Main$textStyle=function(s){return _Utils_ap(_List_fromArray([A2($elm$html$Html$Attributes$style,'font-size',$elm$core$String$fromInt(s.cQ)+'px'),A2($elm$html$Html$Attributes$style,'font-weight',A3($author$project$Util$bool,'normal','bold',s.bD)),A2($elm$html$Html$Attributes$style,'font-style',A3($author$project$Util$bool,'normal','italic',s.ce)),A2($elm$html$Html$Attributes$style,'text-decoration',A3($author$project$Util$bool,'none','underline',s.c7)),A2($elm$html$Html$Attributes$style,'color',$avh4$elm_color$Color$toCssString($avh4$elm_color$Color$fromRgba(s.bM))),A2($elm$html$Html$Attributes$style,'font-family',s.b_),A2($elm$html$Html$Attributes$style,'text-align',function(){var _v0=s.br;switch(_v0){case 0:return'left';case 1:return'center';default:return'right'}}()),A2($elm$html$Html$Attributes$style,'margin','0'),A2($elm$html$Html$Attributes$style,'transform','rotate('+($elm$core$String$fromFloat(s.cI)+'rad)'))]),$elm$core$List$isEmpty(s.cN)?_List_Nil:_List_fromArray([A2($elm$html$Html$Attributes$style,'text-shadow',A2($elm$core$String$join,', ',A2($elm$core$List$map,function(shadow){return A2($elm$core$String$join,' ',_List_fromArray([$elm$core$String$fromInt(shadow.cu.dh)+'px',$elm$core$String$fromInt(-shadow.cu.di)+'px',$elm$core$String$fromInt(shadow.bC)+'px',$avh4$elm_color$Color$toCssString($avh4$elm_color$Color$fromRgba(shadow.bM))]))},s.cN)))]))},$elm$html$Html$Attributes$type_=$elm$html$Html$Attributes$stringProperty('type'),$elm_community$maybe_extra$Maybe$Extra$unwrap=F3(function(_default,f,m){if(m.$===1){return _default}else{var a=m.a;return f(a)}}),$author$project$Main$viewInput=F2(function(name,inp){var padding=function(ts){var size=$elm$core$String$fromInt((ts.cQ/2)|0)+'px';return _List_fromArray([A2($elm$html$Html$Attributes$style,'padding-left',size),A2($elm$html$Html$Attributes$style,'padding-right',size)])},id='form-'+name;return A3($timjs$elm_collage$Collage$html,A2($author$project$Util$both,$elm$core$Basics$toFloat,_Utils_Tuple2(inp.df,inp.b3)),_List_Nil,A2($elm$html$Html$form,_List_fromArray([A2($elm$html$Html$Attributes$style,'display','flex'),A2($elm$html$Html$Attributes$style,'justify-content','center'),A2($elm$html$Html$Attributes$style,'width','100%'),A2($elm$html$Html$Attributes$style,'height','100%'),$elm$html$Html$Events$onSubmit(_List_fromArray([$author$project$Main$ClientUpdate($author$project$Auto$ClientUpdate$SubmitInput(name)),$author$project$Main$ResetForm(id)])),$elm$html$Html$Attributes$id(id)]),_List_fromArray([A2($elm$html$Html$input,_Utils_ap(_List_fromArray([$elm$html$Html$Attributes$type_(function(){var _v0=inp.cc;switch(_v0.$){case 0:return'checkbox';case 1:return'number';default:return'text'}}()),A2($elm$html$Html$Attributes$style,'flex','auto'),A2($elm$html$Html$Attributes$style,'width','100%'),A2($elm$html$Html$Attributes$style,'height','100%'),A2($elm$html$Html$Attributes$map,$elm$core$List$singleton,function(){var _v1=inp.cc;switch(_v1.$){case 0:return $elm$html$Html$Events$onCheck(A2($elm$core$Basics$composeL,$author$project$Main$ClientUpdate,$author$project$Auto$ClientUpdate$InputBool(name)));case 1:return $elm$html$Html$Events$onInput(function(s){var _v2=$elm$core$String$toInt(s);if(!_v2.$){var f=_v2.a;return $author$project$Main$ClientUpdate(A2($author$project$Auto$ClientUpdate$InputNumber,name,f))}else return $author$project$Main$ConsoleLog('Failed to decode number input: '+s)});default:return $elm$html$Html$Events$onInput(A2($elm$core$Basics$composeL,$author$project$Main$ClientUpdate,$author$project$Auto$ClientUpdate$InputText(name)))}}())]),function(){var _v3=inp.cc;switch(_v3.$){case 0:return _List_Nil;case 1:var opts=_v3.a;return A2($elm$core$List$cons,$elm$html$Html$Attributes$step(A3($elm_community$maybe_extra$Maybe$Extra$unwrap,'any',$elm$core$String$fromFloat,opts.cT)),_Utils_ap(padding(opts.c2),_Utils_ap($author$project$Main$textStyle(opts.c2),_Utils_ap(A3($elm_community$maybe_extra$Maybe$Extra$unwrap,_List_Nil,A2($elm$core$Basics$composeL,A2($elm$core$Basics$composeL,$elm$core$List$singleton,$elm$html$Html$Attributes$min),$elm$core$String$fromFloat),opts.co),A3($elm_community$maybe_extra$Maybe$Extra$unwrap,_List_Nil,A2($elm$core$Basics$composeL,A2($elm$core$Basics$composeL,$elm$core$List$singleton,$elm$html$Html$Attributes$max),$elm$core$String$fromFloat),opts.cm)))));default:var opts=_v3.a;return _Utils_ap(padding(opts.c2),_Utils_ap($author$project$Main$textStyle(opts.c2),_Utils_ap(A3($elm_community$maybe_extra$Maybe$Extra$unwrap,_List_Nil,A2($elm$core$Basics$composeL,$elm$core$List$singleton,$elm$html$Html$Attributes$minlength),opts.cp),A3($elm_community$maybe_extra$Maybe$Extra$unwrap,_List_Nil,A2($elm$core$Basics$composeL,$elm$core$List$singleton,$elm$html$Html$Attributes$maxlength),opts.cn))))}}()),_List_Nil)])))}),$author$project$Auto$ClientUpdate$SliderMove=F2(function(a,b){return{$:3,a:a,b:b}}),$elm$core$Basics$atan=_Basics_atan,$author$project$Util$angleVec2=function(v){return $elm$core$Basics$atan($elm_explorations$linear_algebra$Math$Vector2$getY(v)/$elm_explorations$linear_algebra$Math$Vector2$getX(v))},$elm_explorations$linear_algebra$Math$Vector2$length=_MJS_v2length,$elm_explorations$linear_algebra$Math$Vector2$lengthSquared=_MJS_v2lengthSquared,$timjs$elm_collage$Collage$rotate=F2(function(t,collage){return _Utils_update(collage,{cI:collage.cI+t})}),$elm_explorations$linear_algebra$Math$Vector2$toRecord=_MJS_v2toRecord,$author$project$Main$viewSlider=F4(function(name,slider,toOffset,pos){var width=slider.df,v=$author$project$Util$vec2FromIntRecord(slider.cu),rad=slider.cC,stick=A2($author$project$Main$styled1,slider.cR,$timjs$elm_collage$Collage$circle(rad)),getOffset=function(event){var _v0=$elm_explorations$linear_algebra$Math$Vector2$toRecord(toOffset(A2($elm_community$basics_extra$Basics$Extra$uncurry,$elm_explorations$linear_algebra$Math$Vector2$vec2,event.a8.a5))),x=_v0.dh,y=_v0.di;return A3($elm$core$Basics$clamp,0,1,(($elm_explorations$linear_algebra$Math$Vector2$getX(v)*x)+($elm_explorations$linear_algebra$Math$Vector2$getY(v)*y))/$elm_explorations$linear_algebra$Math$Vector2$lengthSquared(v))},background=A2($timjs$elm_collage$Collage$shift,$author$project$Util$unVec2(A2($elm_explorations$linear_algebra$Math$Vector2$scale,1/2,v)),A2($timjs$elm_collage$Collage$rotate,$author$project$Util$angleVec2(v)-($elm$core$Basics$pi/2),A2($author$project$Main$styled1,slider.bz,A3($timjs$elm_collage$Collage$roundedRectangle,width,$elm_explorations$linear_algebra$Math$Vector2$length(v)+width,width/2))));return A3($author$project$Main$onPointerDown,A2($elm$core$Basics$composeL,$author$project$Auto$ClientUpdate$SliderMove(name),getOffset),{R:function(event){return _List_fromArray([$author$project$Main$ClientUpdate(A2($author$project$Auto$ClientUpdate$SliderMove,name,getOffset(event)))])},S:slider.cG?_List_fromArray([$author$project$Main$ClientUpdate(A2($author$project$Auto$ClientUpdate$SliderMove,name,slider.cb))]):_List_Nil},A2($timjs$elm_collage$Collage$Layout$impose,A2($timjs$elm_collage$Collage$shift,$author$project$Util$unVec2(A2($elm_explorations$linear_algebra$Math$Vector2$scale,pos,v)),stick),background))}),$author$project$Auto$ClientUpdate$StickMove=F2(function(a,b){return{$:2,a:a,b:b}}),$elm_explorations$linear_algebra$Math$Vector2$normalize=_MJS_v2normalize,$author$project$Main$viewStick=F4(function(name,stick,toOffset,stickPos){var range=stick.cD,rad=stick.cC,small=A2($author$project$Main$styled1,stick.cV,$timjs$elm_collage$Collage$circle(rad)),getOffset=function(event){var v0=toOffset(A2($elm_community$basics_extra$Basics$Extra$uncurry,$elm_explorations$linear_algebra$Math$Vector2$vec2,event.a8.a5)),length=A2($elm$core$Basics$min,range,$elm_explorations$linear_algebra$Math$Vector2$length(v0));return(!length)?A2($elm_explorations$linear_algebra$Math$Vector2$vec2,0,0):A2($elm_explorations$linear_algebra$Math$Vector2$scale,length/range,$elm_explorations$linear_algebra$Math$Vector2$normalize(v0))},big=A2($author$project$Main$styled1,stick.bz,$timjs$elm_collage$Collage$circle(range));return A3($author$project$Main$onPointerDown,A2($elm$core$Basics$composeL,$author$project$Auto$ClientUpdate$StickMove(name),getOffset),{R:function(event){return _List_fromArray([$author$project$Main$ClientUpdate(A2($author$project$Auto$ClientUpdate$StickMove,name,getOffset(event)))])},S:_List_fromArray([$author$project$Main$ClientUpdate(A2($author$project$Auto$ClientUpdate$StickMove,name,A2($elm_explorations$linear_algebra$Math$Vector2$vec2,0,0)))])},A2($timjs$elm_collage$Collage$Layout$impose,A2($timjs$elm_collage$Collage$shift,$author$project$Util$unVec2(A2($elm_explorations$linear_algebra$Math$Vector2$scale,range,stickPos)),small),big))}),$elm$html$Html$div=_VirtualDom_node('div'),$author$project$Main$viewText=F2(function(size,x){return A3($timjs$elm_collage$Collage$html,A2($author$project$Util$both,$elm$core$Basics$toFloat,_Utils_Tuple2(size.dh,size.di)),_List_fromArray([A2($elm$html$Html$Attributes$style,'pointer-events','none')]),A2($elm$html$Html$div,_List_fromArray([A2($elm$html$Html$Attributes$style,'display','flex'),A2($elm$html$Html$Attributes$style,'justify-content',function(){var _v0=x.bs;switch(_v0){case 0:return'left';case 1:return'center';default:return'right'}}()),A2($elm$html$Html$Attributes$style,'align-items',function(){var _v1=x.bt;switch(_v1){case 0:return'start';case 1:return'center';default:return'end'}}()),A2($elm$html$Html$Attributes$style,'height','100%'),A2($elm$html$Html$Attributes$style,'user-select','none')]),_List_fromArray([A2($elm$html$Html$pre,$author$project$Main$textStyle(x.cY),_List_fromArray([$elm$html$Html$text(x.c1)]))])))}),$author$project$Util$zeroVec2=A2($elm_explorations$linear_algebra$Math$Vector2$vec2,0,0),$author$project$Main$viewElement=F2(function(model,element){if(element.b5){return $timjs$elm_collage$Collage$Layout$stack(_List_Nil)}else{var toOffset=function(){var w=$author$project$Util$vec2FromIntRecord(model.O),v=A2($elm_explorations$linear_algebra$Math$Vector2$vec2,model.a.a.dc.dd,model.a.a.dc.b1),sf=A2($elm$core$Basics$min,$elm_explorations$linear_algebra$Math$Vector2$getX(w)/$elm_explorations$linear_algebra$Math$Vector2$getX(v),$elm_explorations$linear_algebra$Math$Vector2$getY(w)/$elm_explorations$linear_algebra$Math$Vector2$getY(v)),invertPagePos=A2($elm$core$Basics$composeR,$author$project$Util$mapY($elm$core$Basics$negate),$elm_explorations$linear_algebra$Math$Vector2$add(A2($elm_explorations$linear_algebra$Math$Vector2$vec2,0,$elm_explorations$linear_algebra$Math$Vector2$getY(w)))),pageToSvg=A2($elm$core$Basics$composeR,invertPagePos,A2($elm$core$Basics$composeR,$elm_explorations$linear_algebra$Math$Vector2$scale(1/sf),A2($elm$core$Basics$composeR,$elm_explorations$linear_algebra$Math$Vector2$add(A2($elm_explorations$linear_algebra$Math$Vector2$scale,1/2,A2($elm_explorations$linear_algebra$Math$Vector2$sub,v,A2($elm_explorations$linear_algebra$Math$Vector2$scale,1/sf,w)))),$elm_explorations$linear_algebra$Math$Vector2$add($author$project$Util$vec2FromIntRecord(model.a.a.dc)))));return A2($elm$core$Basics$composeL,A2($elm_community$basics_extra$Basics$Extra$flip,$elm_explorations$linear_algebra$Math$Vector2$sub,$author$project$Util$vec2FromIntRecord(element.ck)),pageToSvg)}();return A2($timjs$elm_collage$Collage$shift,_Utils_Tuple2(element.ck.dh,element.ck.di),A4($author$project$Util$maybe,$elm$core$Basics$identity,A2($elm$core$Basics$composeL,$timjs$elm_collage$Collage$Layout$impose,$author$project$Main$viewText($author$project$Main$elementSize(element.bT))),element.c1,A4($author$project$Util$maybe,$elm$core$Basics$identity,A2($elm$core$Basics$composeL,$timjs$elm_collage$Collage$Layout$impose,$author$project$Main$viewImage($author$project$Main$elementSize(element.bT))),element.b8,function(){var _v0=element.bT;switch(_v0.$){case 1:var x=_v0.a;return A3($author$project$Main$viewButton,element.cs,x,A2($elm$core$Set$member,element.cs,model.a.i));case 0:var x=_v0.a;return A4($author$project$Main$viewStick,element.cs,x,toOffset,A2($elm$core$Maybe$withDefault,$author$project$Util$zeroVec2,A2($elm$core$Dict$get,element.cs,model.a.E)));case 2:var x=_v0.a;return A4($author$project$Main$viewSlider,element.cs,x,toOffset,A2($elm$core$Maybe$withDefault,x.cb,A2($elm$core$Dict$get,element.cs,model.a.n)));case 3:var x=_v0.a;return A2($author$project$Main$viewIndicator,element.cs,x);case 4:var x=_v0.a;return A2($author$project$Main$viewInput,element.cs,x);default:return $timjs$elm_collage$Collage$Layout$stack(_List_Nil)}}())))}}),$author$project$Main$GoFullscreen={$:5},$elm_community$list_extra$List$Extra$scanl=F3(function(f,b,xs){var scan1=F2(function(x,accAcc){if(accAcc.b){var acc=accAcc.a;return A2($elm$core$List$cons,A2(f,x,acc),accAcc)}else return _List_Nil});return $elm$core$List$reverse(A3($elm$core$List$foldl,scan1,_List_fromArray([b]),xs))}),$avh4$elm_color$Color$white=A4($avh4$elm_color$Color$RgbaSpace,255/255,255/255,255/255,1.0),$author$project$Main$viewFullscreenButton=function(vb){var scale=1/6,size=A2($elm$core$Basics$min,vb.dd,vb.b1)*scale,arrow=function(){var width=0.16,shaft=0.2,head=0.4,gap=0.2;return A2($author$project$Main$styled1,$avh4$elm_color$Color$toRgba($avh4$elm_color$Color$white),$timjs$elm_collage$Collage$polygon(A2($elm$core$List$map,A2($elm$core$Basics$composeL,$author$project$Util$unVec2,$elm_explorations$linear_algebra$Math$Vector2$scale(size)),A3($elm_community$list_extra$List$Extra$scanl,$elm_explorations$linear_algebra$Math$Vector2$add,A2($elm_explorations$linear_algebra$Math$Vector2$vec2,gap,(-width)/2),_List_fromArray([A2($elm_explorations$linear_algebra$Math$Vector2$vec2,0,width),A2($elm_explorations$linear_algebra$Math$Vector2$vec2,shaft,0),A2($elm_explorations$linear_algebra$Math$Vector2$vec2,0,(head-width)/2),A2($elm_explorations$linear_algebra$Math$Vector2$vec2,head/2,(-head)/2),A2($elm_explorations$linear_algebra$Math$Vector2$vec2,(-head)/2,(-head)/2),A2($elm_explorations$linear_algebra$Math$Vector2$vec2,0,(head-width)/2)])))))}(),arrows=$timjs$elm_collage$Collage$Layout$stack(A2($elm$core$List$map,function(x){return A2($timjs$elm_collage$Collage$rotate,((x+0.5)*$elm$core$Basics$pi)/2,arrow)},A2($elm$core$List$range,0,3)));return A3($timjs$elm_collage$Collage$Events$on,'pointerdown',$elm$json$Json$Decode$succeed(_List_fromArray([$author$project$Main$GoFullscreen])),A2($timjs$elm_collage$Collage$shift,_Utils_Tuple2(vb.dh+(size/2),(vb.b1+vb.di)-(size/2)),A2($timjs$elm_collage$Collage$Layout$impose,arrows,A2($author$project$Main$styled1,$avh4$elm_color$Color$toRgba($avh4$elm_color$Color$black),A2($timjs$elm_collage$Collage$rectangle,size,size)))))},$author$project$Main$view=function(model){return{au:function(){var _v0=model.a.a.dc,x=_v0.dh,y=_v0.di,w=_v0.dd,h=_v0.b1;return _List_fromArray([A2($timjs$elm_collage$Collage$Render$svgExplicit,_List_fromArray([A4($author$project$Util$viewBox,x,-(h+y),w,h),$mpizenberg$elm_pointer_events$Html$Events$Extra$Pointer$onMove(function(event){return A3($author$project$Util$maybe,_List_Nil,function(c){return c.R(event)},A2($elm$core$Dict$get,event.ac,model.a.w))}),$mpizenberg$elm_pointer_events$Html$Events$Extra$Pointer$onLeave(A2($elm$core$Basics$composeL,$elm$core$List$singleton,$author$project$Main$PointerUp)),A2($elm$html$Html$Attributes$style,'width',$elm$core$String$fromInt(model.O.dh)+'px'),A2($elm$html$Html$Attributes$style,'height',$elm$core$String$fromInt(model.O.di)+'px'),A2($elm$html$Html$Attributes$style,'background-color',$avh4$elm_color$Color$toCssString($avh4$elm_color$Color$fromRgba(model.a.a.bz)))]),$timjs$elm_collage$Collage$Layout$stack(A3($author$project$Util$applyWhen,(!model.Y)&&model.c$,function(es){return A2($elm$core$List$cons,$author$project$Main$viewFullscreenButton(model.a.a.dc),es)},A2($elm$core$List$map,$author$project$Main$viewElement(model),model.a.a.bU))))])}(),bo:'monpad'}},$author$project$Main$app={bW:$elm$core$Maybe$Just(function(e){return{au:_List_fromArray([$elm$html$Html$text('Monpad failed to start. If you\'re using \"elm reactor\", try Scratch.elm instead.'),A2($elm$html$Html$pre,_List_Nil,_List_fromArray([$elm$html$Html$text(function(){if(!e.$){var err=e.a;return $elm$json$Json$Decode$errorToString(err)}else{var s=e.a;return s}}())]))]),bo:'Whoops'}}),bY:$elm$core$Maybe$Nothing,ci:F3(function(f,_v1,_v2){var _v3=A2($elm$json$Json$Decode$decodeValue,$author$project$Auto$ElmFlags$decode,f);if(_v3.$===1){var e=_v3.a;return $elm$core$Task$fail($author$project$Main$JsonError(e))}else{var flags=_v3.a;return $author$project$Main$load(flags)}}),cj:$elm$core$Maybe$Nothing,cw:$elm$core$Basics$always(_List_Nil),cx:$elm$core$Basics$always(_List_Nil),c_:$elm$core$Basics$always($elm$core$Platform$Sub$batch(_List_fromArray([A3($author$project$Main$subLogErrors,'update message',$elm$core$List$map($author$project$Main$ServerUpdate),$author$project$Ports$receiveUpdates),A3($author$project$Main$subLogErrors,'fullscreen change',A2($elm$core$Basics$composeL,$elm$core$List$singleton,$author$project$Main$FullscreenChange),$author$project$Ports$fullscreenChanges),$elm$browser$Browser$Events$onResize(F2(function(w,h){return _List_fromArray([$author$project$Main$Resized({dh:w,di:h})])}))]))),c8:$elm_community$basics_extra$Basics$Extra$flip(function(model){return A2($elm$core$Basics$composeL,$elm$core$Tuple$mapSecond($elm$core$Platform$Cmd$batch),A2($elm$core$List$foldl,F2(function(msg,_v4){var m=_v4.a,cs=_v4.b;return A2($elm$core$Tuple$mapSecond,function(c){return A2($elm$core$List$cons,c,cs)},A2($author$project$Main$update,msg,m))}),_Utils_Tuple2(model,_List_Nil)))}),db:$author$project$Main$view},$alex_tan$loadable$Loadable$Types$ToInner=function(a){return{$:2,a:a}},$elm$browser$Browser$application=_Browser_application,$alex_tan$loadable$Loadable$Types$Loading=function(a){return{$:0,a:a}},$elm$core$Task$onError=_Scheduler_onError,$elm$core$Task$attempt=F2(function(resultToMessage,task){return $elm$core$Task$command(A2($elm$core$Task$onError,A2($elm$core$Basics$composeL,A2($elm$core$Basics$composeL,$elm$core$Task$succeed,resultToMessage),$elm$core$Result$Err),A2($elm$core$Task$andThen,A2($elm$core$Basics$composeL,A2($elm$core$Basics$composeL,$elm$core$Task$succeed,resultToMessage),$elm$core$Result$Ok),task)))}),$alex_tan$loadable$Loadable$Types$LoadError=function(a){return{$:1,a:a}},$alex_tan$loadable$Loadable$Types$LoadSuccess=F2(function(a,b){return{$:0,a:a,b:b}}),$alex_tan$loadable$Loadable$Types$resultToMsg=function(result){if(!result.$){var _v1=result.a,innerModel=_v1.a,innerInitialMsg=_v1.b;return A2($alex_tan$loadable$Loadable$Types$LoadSuccess,innerModel,innerInitialMsg)}else{var e=result.a;return $alex_tan$loadable$Loadable$Types$LoadError(e)}},$alex_tan$loadable$Loadable$Application$init=F4(function(load,flags,url,key){return _Utils_Tuple2($alex_tan$loadable$Loadable$Types$Loading(flags),A2($elm$core$Task$attempt,$alex_tan$loadable$Loadable$Types$resultToMsg,A3(load,flags,url,key)))}),$elm$core$Platform$Sub$none=$elm$core$Platform$Sub$batch(_List_Nil),$alex_tan$loadable$Loadable$Element$subscriptions=F2(function(innerSubscriptions,outerModel){if(outerModel.$===1){var model=outerModel.a;return A2($elm$core$Platform$Sub$map,$alex_tan$loadable$Loadable$Types$ToInner,innerSubscriptions(model))}else return $elm$core$Platform$Sub$none}),$alex_tan$loadable$Loadable$Types$Error=function(a){return{$:2,a:a}},$alex_tan$loadable$Loadable$Types$Loaded=function(a){return{$:1,a:a}},$elm$core$Platform$Cmd$map=_Platform_map,$alex_tan$loadable$Loadable$Element$update=F4(function(innerUpdate,failCmd,msg,outerModel){var _v0=_Utils_Tuple2(outerModel,msg);_v0$3:while(true)switch(_v0.b.$){case 1:var e=_v0.b.a,f=A2($elm$core$Maybe$withDefault,$elm$core$Basics$always($elm$core$Platform$Cmd$none),failCmd);return _Utils_Tuple2($alex_tan$loadable$Loadable$Types$Error(e),f(e));case 0:if(!_v0.a.$){var flags=_v0.a.a,_v1=_v0.b,load=_v1.a,innerInitialMsg=_v1.b;return _Utils_Tuple2($alex_tan$loadable$Loadable$Types$Loaded(load),A2($elm$core$Platform$Cmd$map,$alex_tan$loadable$Loadable$Types$ToInner,innerInitialMsg))}else break _v0$3;default:if(_v0.a.$===1){var model=_v0.a.a,msg_=_v0.b.a,_v2=A2(innerUpdate,msg_,model),newModel=_v2.a,cmd=_v2.b;return _Utils_Tuple2($alex_tan$loadable$Loadable$Types$Loaded(newModel),A2($elm$core$Platform$Cmd$map,$alex_tan$loadable$Loadable$Types$ToInner,cmd))}else break _v0$3};return _Utils_Tuple2(outerModel,$elm$core$Platform$Cmd$none)}),$elm$virtual_dom$VirtualDom$map=_VirtualDom_map,$elm$html$Html$map=$elm$virtual_dom$VirtualDom$map,$alex_tan$loadable$Loadable$Application$view=F4(function(loadingView,errorView,innerView,outerModel){switch(outerModel.$){case 0:var flags=outerModel.a;return A3($elm$core$Maybe$withDefault,function(_v1){return{au:_List_Nil,bo:'Loading...'}},loadingView,flags);case 2:var e=outerModel.a;return A3($elm$core$Maybe$withDefault,function(_v2){return{au:_List_Nil,bo:'Error'}},errorView,e);default:var model=outerModel.a,_v3=innerView(model),title=_v3.bo,body=_v3.au;return{au:A2($elm$core$List$map,$elm$html$Html$map($alex_tan$loadable$Loadable$Types$ToInner),body),bo:title}}}),$alex_tan$loadable$Loadable$application=function(_v0){var update=_v0.c8,view=_v0.db,subscriptions=_v0.c_,load=_v0.ci,failCmd=_v0.bY,loadingView=_v0.cj,errorView=_v0.bW,onUrlRequest=_v0.cx,onUrlChange=_v0.cw;return $elm$browser$Browser$application({aG:$alex_tan$loadable$Loadable$Application$init(load),cw:A2($elm$core$Basics$composeR,onUrlChange,$alex_tan$loadable$Loadable$Types$ToInner),cx:A2($elm$core$Basics$composeR,onUrlRequest,$alex_tan$loadable$Loadable$Types$ToInner),c_:$alex_tan$loadable$Loadable$Element$subscriptions(subscriptions),c8:A2($alex_tan$loadable$Loadable$Element$update,update,failCmd),db:A3($alex_tan$loadable$Loadable$Application$view,loadingView,errorView,view)})},$author$project$Main$main=$alex_tan$loadable$Loadable$application($author$project$Main$app);_Platform_export({'Main':{'init':$author$project$Main$main($elm$json$Json$Decode$value)(0)}})}(this)) \ No newline at end of file diff --git a/haskell/rsc/login.css b/haskell/rsc/login.css new file mode 100644 index 0000000..dbeecc0 --- /dev/null +++ b/haskell/rsc/login.css @@ -0,0 +1,28 @@ +body { + height: 100vh; + background-position: center center; + background-repeat: no-repeat; + background-size: cover; + font-family: Helvetica, Arial, sans-serif; +} + +form { + padding: 0.5em; + text-align: center; + font-size: 5vw; +} + +input { + font-size: inherit; +} + +.colours { + display: flex; + flex-direction: row; +} + +.colour { + flex-grow: 1; + margin: 3vh; + height: 10vh; +} diff --git a/haskell/rsc/main.js b/haskell/rsc/main.js new file mode 100644 index 0000000..272b01a --- /dev/null +++ b/haskell/rsc/main.js @@ -0,0 +1,72 @@ +const attr = s => document.currentScript.attributes.getNamedItem(s).value + +const params = new URLSearchParams(window.location.search) +const username = params.get("username") + +const wsAddress = "ws://" + location.hostname + ":" + attr("wsPort") + "?" + params +const ws = new WebSocket(wsAddress) +ws.onclose = event => { + console.log(event) + alert("Connection lost. See console for details.") +} + +const layouts = JSON.parse(attr("layouts")) +const encoding = JSON.parse(attr("encoding")) + +ws.onopen = _event => { + // Elm + elmInitialised = false + const app = Elm.Main.init({ + flags: { + username, layouts, encoding, + supportsFullscreen: document.documentElement.requestFullscreen != null + } + }) + //TODO this (waiting for an initialisation message) + // is all just a workaround for the fact that Elm has no built-in way of signalling that 'init' has finished + app.ports.initPort.subscribe(() => { + elmInitialised = true + dispatchEvent(new Event("elmInit")) + }) + + // fullscreen + app.ports.fullscreenPort.subscribe(() => { + document.documentElement.requestFullscreen() + }) + document.onfullscreenchange = _event => { + app.ports.fullscreenChangePort.send( + !(document.fullscreenElement == null) + ) + } + + // update messages + app.ports.sendUpdatePortJSON.subscribe(message => ws.send(JSON.stringify(message))) + app.ports.sendUpdatePortBinary.subscribe(message => ws.send(Uint8Array.from(message))) + ws.addEventListener("message", event => { + const send = () => app.ports.receiveUpdatePort.send(JSON.parse(event.data)) + if (elmInitialised) { + send() + } else { + addEventListener("elmInit", () => { + setTimeout(send, 0) + }) + } + }) + + // reset form + app.ports.resetFormPort.subscribe(id => document.getElementById(id).reset()) + + // audio + app.ports.audioPort.subscribe(url => { + audio = new Audio(url) + audio.play() + }) + + // vibration + app.ports.vibratePort.subscribe(intervals => { + window.navigator.vibrate(intervals) + }) + + // logging + app.ports.logPort.subscribe(console.log) +} diff --git a/haskell/src/Util.hs b/haskell/src/Util.hs index 247e647..20b63e5 100644 --- a/haskell/src/Util.hs +++ b/haskell/src/Util.hs @@ -33,11 +33,8 @@ import Dhall.Parser qualified as D import Dhall.TypeCheck qualified as D import Network.HostName (getHostName) import Network.Socket ( - AddrInfo (addrAddress), HostAddress, HostName, - SockAddr (SockAddrInet), - getAddrInfo, hostAddressToTuple, ) import Streamly.Prelude qualified as SP @@ -53,16 +50,9 @@ data Logger = Logger zipEndo :: Endo a -> Endo b -> Endo (a, b) zipEndo (Endo sf1) (Endo sf2) = Endo $ sf1 *** sf2 +--TODO work out why Musl build fails at startup in `getAddrInfo` getLocalIp :: IO (Maybe HostAddress) -getLocalIp = do - h <- getHostName' - sockAddrs <- map addrAddress <$> getAddrInfo Nothing (Just $ h <> ".local") Nothing - pure . find bitOfAHack $ flip mapMaybe sockAddrs \case - SockAddrInet _ a -> Just a - _ -> Nothing - where - --TODO - bitOfAHack = (== 192) . fst4 . hostAddressToTuple +getLocalIp = pure Nothing -- adapted from an internal function of the same name in Network.Socket.Info showHostAddress :: HostAddress -> Text