[
  {
    "path": ".cargo/config",
    "content": "[target.'cfg(target_os = \"macos\")']\nrustflags = [\"-C\", \"link-args=-headerpad_max_install_names\"]\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "on:\n  push:\n    branches: '**'\n    tags-ignore: '**'\n  pull_request:\n  release:\n    types: [published]\n\nname: ci\n\nenv:\n  RELEASE: ${{ github.event_name == 'release' && '--release' || '' }}\njobs:\n  run-tests:\n    runs-on: ubuntu-latest\n    steps:\n    - run: sudo apt-get update && sudo apt-get install libgtk-3-dev libhidapi-dev libudev-dev\n    - uses: actions/checkout@v4\n    - run: rustup component add rustfmt\n    - run: cargo test --all\n    - run: cargo fmt -- --check\n\n  linux-x86_64:\n    runs-on: ubuntu-22.04\n    steps:\n    - run: sudo apt-get update && sudo apt-get install cargo libgtk-3-dev libhidapi-dev libudev-dev patchelf\n    - uses: actions/checkout@v4\n    - run: cd linux && ./build.py $RELEASE\n    - uses: actions/upload-artifact@v4\n      with:\n        if-no-files-found: error\n        name: keyboard-configurator-linux-x86_64-${{ github.sha }}\n        path: linux/keyboard-configurator-x86_64.AppImage\n\n  linux-x86_64-test:\n    runs-on: ubuntu-latest\n    needs: linux-x86_64\n    steps:\n    - run: sudo apt-get install xvfb libfuse2\n    - uses: actions/download-artifact@v4\n      with:\n        name: keyboard-configurator-linux-x86_64-${{ github.sha }}\n    - run: chmod +x keyboard-configurator-x86_64.AppImage\n    - run: xvfb-run ./keyboard-configurator-x86_64.AppImage --help-gtk\n\n  linux-arm64:\n    runs-on: ubuntu-22.04-arm\n    steps:\n    - uses: actions/checkout@v4\n    - run: sudo apt-get update && sudo apt-get install cargo libgtk-3-dev libhidapi-dev libudev-dev patchelf libfuse2\n    - run: cd linux && ./build.py --arm64 $RELEASE\n    - uses: actions/upload-artifact@v4\n      with:\n        if-no-files-found: error\n        name: keyboard-configurator-linux-aarch64-${{ github.sha }}\n        path: linux/keyboard-configurator-aarch64.AppImage\n\n  linux-arm64-test:\n    runs-on: ubuntu-22.04-arm\n    needs: linux-arm64\n    steps:\n    - run: sudo apt-get install xvfb libfuse2\n    - uses: actions/download-artifact@v4\n      with:\n        name: keyboard-configurator-linux-aarch64-${{ github.sha }}\n    - run: chmod +x keyboard-configurator-aarch64.AppImage\n    - run: xvfb-run ./keyboard-configurator-aarch64.AppImage --help-gtk\n\n  windows-mingw32:\n    runs-on: windows-latest\n    steps:\n    - uses: msys2/setup-msys2@v2\n      with:\n        msystem: MINGW32\n        install: mingw-w64-i686-gtk3 mingw-w64-i686-rust mingw-w64-i686-toolchain mingw-w64-i686-ntldd mingw-w64-x86_64-imagemagick\n    - uses: actions/checkout@v4\n    - name: Build and package\n      shell: msys2 {0}\n      env:\n        SSL_COM_USERNAME: ${{ github.event_name == 'release' && secrets.SSL_COM_USERNAME || '' }}\n        SSL_COM_PASSWORD: ${{ github.event_name == 'release' && secrets.SSL_COM_PASSWORD || '' }}\n        SSL_COM_CREDENTIAL_ID: ${{ github.event_name == 'release' && secrets.SSL_COM_CREDENTIAL_ID || '' }}\n        SSL_COM_TOTP_SECRET: ${{ github.event_name == 'release' && secrets.SSL_COM_TOTP_SECRET || '' }}\n        MSYS2_ENV_CONV_EXCL: SSL_COM_TOTP_SECRET\n        SIGN: ${{ github.event_name == 'release' && '--sign' || '' }}\n      run: cd windows && python build.py $RELEASE $SIGN\n    - uses: actions/upload-artifact@v4\n      with:\n        if-no-files-found: error\n        name: keyboard-configurator-mingw32-${{ github.sha }}\n        path: windows/keyboard-configurator.msi\n\n  windows-mingw32-test:\n    runs-on: windows-latest\n    needs: windows-mingw32\n    steps:\n    - uses: actions/download-artifact@v4\n      with:\n        name: keyboard-configurator-mingw32-${{ github.sha }}\n    - run: msiexec /i keyboard-configurator.msi /qb\n    - run: Start-Sleep 10\n    - run: '& \"C:\\Program Files (x86)\\System76\\Keyboard Configurator\\system76-keyboard-configurator.exe\" --help-gtk'\n\n  macos:\n    runs-on: macos-14-large # Intel\n    steps:\n    - run: brew install gtk+3 imagemagick librsvg adwaita-icon-theme\n    - run: npm install -g appdmg\n    - run: echo \"$HOME/.local/bin\" >> $GITHUB_PATH\n    - uses: actions/checkout@v4\n    - env:\n        AC_PASSWORD: ${{ github.event_name == 'release' && secrets.AC_PASSWORD || '' }}\n        AC_USERNAME: ${{ github.event_name == 'release' && secrets.AC_USERNAME || '' }}\n        MACOS_CERTIFICATE: ${{ github.event_name == 'release' && secrets.MACOS_CERTIFICATE || '' }}\n        MACOS_SCRIPT: ${{ github.event_name == 'release' && 'bash ./signing.sh' || 'python3 ./build.py' }}\n      run: cd macos && $MACOS_SCRIPT $RELEASE\n    - uses: actions/upload-artifact@v4\n      with:\n        if-no-files-found: error\n        name: keyboard-configurator-macos-${{ github.sha }}\n        path: macos/keyboard-configurator.dmg\n\n  macos-test:\n    runs-on: macos-14-large # Intel\n    needs: macos\n    steps:\n    - uses: actions/download-artifact@v4\n      with:\n        name: keyboard-configurator-macos-${{ github.sha }}\n    - run: mkdir mnt && hdiutil attach keyboard-configurator.dmg -mountpoint $PWD/mnt\n    - run: '\"./mnt/System76 Keyboard Configurator.app/Contents/MacOS/keyboard-configurator\" --help-gtk'\n    - run: 'open \"mnt/System76 Keyboard Configurator.app\" --args --help-gtk'\n\n  macos-arm64:\n    runs-on: macos-14 # arm64\n    steps:\n    - run: brew install gtk+3 imagemagick librsvg adwaita-icon-theme\n    - run: npm install -g appdmg\n    - run: echo \"$HOME/.local/bin\" >> $GITHUB_PATH\n    - uses: actions/checkout@v4\n    - env:\n        AC_PASSWORD: ${{ github.event_name == 'release' && secrets.AC_PASSWORD || '' }}\n        AC_USERNAME: ${{ github.event_name == 'release' && secrets.AC_USERNAME || '' }}\n        MACOS_CERTIFICATE: ${{ github.event_name == 'release' && secrets.MACOS_CERTIFICATE || '' }}\n        MACOS_SCRIPT: ${{ github.event_name == 'release' && 'bash ./signing.sh' || 'python3 ./build.py' }}\n      run: cd macos && $MACOS_SCRIPT $RELEASE\n    - run: mv macos/keyboard-configurator.dmg macos/keyboard-configurator-arm64.dmg\n    - uses: actions/upload-artifact@v4\n      with:\n        if-no-files-found: error\n        name: keyboard-configurator-macos-arm64-${{ github.sha }}\n        path: macos/keyboard-configurator-arm64.dmg\n\n  macos-arm64-test:\n    runs-on: macos-14 # arm64\n    needs: macos-arm64\n    steps:\n    - uses: actions/download-artifact@v4\n      with:\n        name: keyboard-configurator-macos-arm64-${{ github.sha }}\n    - run: mkdir mnt && hdiutil attach keyboard-configurator-arm64.dmg -mountpoint $PWD/mnt\n    - run: '\"./mnt/System76 Keyboard Configurator.app/Contents/MacOS/keyboard-configurator\" --help-gtk'\n    - run: 'open \"mnt/System76 Keyboard Configurator.app\" --args --help-gtk'\n\n\n\n  upload-to-release:\n    if: github.event_name == 'release'\n    runs-on: ubuntu-latest\n    needs: [linux-x86_64, linux-arm64, windows-mingw32, macos, macos-arm64]\n    steps:\n    - uses: actions/checkout@v4\n    - run: echo VERSION=$(./.github/workflows/version.py) > $GITHUB_ENV\n    - uses: actions/download-artifact@v4\n    - uses: actions/upload-release-asset@v1\n      env:\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      with:\n        upload_url: ${{ github.event.release.upload_url }}\n        asset_path: keyboard-configurator-linux-x86_64-${{ github.sha }}/keyboard-configurator-x86_64.AppImage\n        asset_name: keyboard-configurator-${{ env.VERSION }}-x86_64.AppImage\n        asset_content_type: application/vnd.appimage\n    - uses: actions/upload-release-asset@v1\n      env:\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      with:\n        upload_url: ${{ github.event.release.upload_url }}\n        asset_path: keyboard-configurator-linux-aarch64-${{ github.sha }}/keyboard-configurator-aarch64.AppImage\n        asset_name: keyboard-configurator-${{ env.VERSION }}-aarch64.AppImage\n        asset_content_type: application/vnd.appimage\n    - uses: actions/upload-release-asset@v1\n      env:\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      with:\n        upload_url: ${{ github.event.release.upload_url }}\n        asset_path: keyboard-configurator-mingw32-${{ github.sha }}/keyboard-configurator.msi\n        asset_name: keyboard-configurator-${{ env.VERSION }}.msi\n        asset_content_type: application/x-msi\n    - uses: actions/upload-release-asset@v1\n      env:\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      with:\n        upload_url: ${{ github.event.release.upload_url }}\n        asset_path: keyboard-configurator-macos-${{ github.sha }}/keyboard-configurator.dmg\n        asset_name: keyboard-configurator-${{ env.VERSION }}.dmg\n        asset_content_type: application/x-apple-diskimage\n    - uses: actions/upload-release-asset@v1\n      env:\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      with:\n        upload_url: ${{ github.event.release.upload_url }}\n        asset_path: keyboard-configurator-macos-arm64-${{ github.sha }}/keyboard-configurator-arm64.dmg\n        asset_name: keyboard-configurator-arm64-${{ env.VERSION }}.dmg\n        asset_content_type: application/x-apple-diskimage\n"
  },
  {
    "path": ".github/workflows/version.py",
    "content": "#!/usr/bin/env python3\n\nimport json\nimport subprocess\n\nmeta_str = subprocess.check_output([\"cargo\", \"metadata\", \"--format-version\", \"1\", \"--no-deps\"])\nmeta = json.loads(meta_str)\npackage = next(i for i in meta['packages'] if i['name'] == 'system76-keyboard-configurator')\nprint(package['version'])\n"
  },
  {
    "path": ".gitignore",
    "content": "/result\n/target\n/linux/system76-keyboard-configurator\n/windows/out\n/windows/sign\n/windows/libraries.wxi\n/windows/*.png\n/windows/*.bmp\n/macos/Info.plist\n/macos/background.png\n/macos/keyboard-configurator\n*.AppDir\n*.AppImage\n*.msi\n*.wixobj\n*.wixpdb\n*.dmg\n*.icns\n*.app\n.DS_Store\n__pycache__\nvendor\nvendor.tar\ngschemas.compiled\ndebian/.debhelper/\ndebian/debhelper-build-stamp\ndebian/files\ndebian/libsystem76-keyboard-configurator-dev.debhelper.log\ndebian/libsystem76-keyboard-configurator-dev.substvars\ndebian/libsystem76-keyboard-configurator-dev/\ndebian/libsystem76-keyboard-configurator.debhelper.log\ndebian/libsystem76-keyboard-configurator.substvars\ndebian/libsystem76-keyboard-configurator/\ndebian/system76-keyboard-configurator.debhelper.log\ndebian/system76-keyboard-configurator.substvars\ndebian/system76-keyboard-configurator/\ndebian/tmp/\n"
  },
  {
    "path": "Cargo.toml",
    "content": "[package]\nname = \"system76-keyboard-configurator\"\nversion = \"1.3.13\"\nauthors = [\"Ian Douglas Scott <idscott@system76.com>\", \"Jeremy Soller <jeremy@system76.com>\"]\nlicense = \"GPL-3.0-or-later\"\nedition = \"2021\"\nrust-version = \"1.64\"\n\n[workspace]\nmembers = [ \"tools\", \"ffi\", \"backend\", \"widgets\" ]\n\n[dependencies]\ncascade = \"1\"\nfutures = \"0.3.13\"\ngtk = { version = \"0.18.0\" }\nlibc = \"0.2\"\nonce_cell = \"1.4\"\npangocairo = \"0.18.0\"\nserde = { version = \"1.0\", features = [\"derive\"] }\nserde_json = \"1.0\"\nlog = \"0.4.0\"\nenv_logger = \"0.10\"\nbackend = { package = \"system76-keyboard-configurator-backend\", path = \"backend\" }\nwidgets = { package = \"system76-keyboard-configurator-widgets\", path = \"widgets\" }\n\n# Translation support\ni18n-embed = { version = \"0.13.0\", features = [\"fluent-system\", \"desktop-requester\"] }\ni18n-embed-fl = \"0.6.0\"\nrust-embed = { version = \"6.2.0\", features = [\"debug-embed\"] }\n\n[build-dependencies]\nglib-build-tools = \"0.18.0\"\n\n[target.'cfg(target_os = \"windows\")'.dependencies]\nwinreg = \"0.8\"\n\n[features]\nappimage = [\"backend/appimage\"]\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "Makefile",
    "content": "prefix ?= /usr/local\nbindir = $(prefix)/bin\nlibdir = $(prefix)/lib\nincludedir = $(prefix)/include\ndatarootdir = $(prefix)/share\ndatadir = $(datarootdir)\n\nTARGET = debug\nDEBUG ?= 0\nifeq ($(DEBUG),0)\n\tTARGET = release\n\tARGS += --release\nendif\n\nVENDOR ?= 0\nifneq ($(VENDOR),0)\n\tARGS += --frozen\nendif\n\nPACKAGE = system76_keyboard_configurator\nAPPID = \"com.system76.keyboardconfigurator\"\nPKGCONFIG = $(PACKAGE).pc\nBIN = system76-keyboard-configurator\nFFI = lib$(PACKAGE).so\nAPPDATA = $(APPID).appdata.xml\nDESKTOP = $(APPID).desktop\nICON = data/icons/scalable/apps/$(APPID).svg\n\nall: $(BIN) $(PKGCONFIG)\n\nclean:\n\trm -rf target\n\ndistclean: clean\n\trm -rf .cargo vendor vendor.tar\n\n$(BIN): Cargo.toml Cargo.lock src/main.rs vendor-check\n\tcargo build $(ARGS)\n\n$(FFI): Cargo.toml Cargo.lock ffi/src/lib.rs vendor-check\n\tcargo build $(ARGS) --manifest-path ffi/Cargo.toml\n\ninstall:\n\tinstall -Dm0755 target/$(TARGET)/$(BIN) $(DESTDIR)$(bindir)/$(BIN)\n\tinstall -Dm0644 target/$(TARGET)/$(FFI) \"$(DESTDIR)$(libdir)/$(FFI)\"\n\tinstall -Dm0644 target/$(PKGCONFIG) \"$(DESTDIR)$(libdir)/pkgconfig/$(PKGCONFIG)\"\n\tinstall -Dm0644 ffi/$(PACKAGE).h \"$(DESTDIR)$(includedir)/$(PACKAGE).h\"\n\tinstall -Dm0644 \"linux/$(DESKTOP)\" \"$(DESTDIR)$(datadir)/applications/$(DESKTOP)\"\n\tinstall -Dm0644 \"linux/$(APPDATA)\" \"$(DESTDIR)$(datadir)/metainfo/$(APPDATA)\"\n\tinstall -Dm0644 $(ICON) \"$(DESTDIR)$(datadir)/icons/hicolor/scalable/apps/$(APPID).svg\"\n\n$(PKGCONFIG): $(FFI) tools/src/pkgconfig.rs\n\tcargo run -p tools --bin pkgconfig $(DESKTOP_ARGS) -- \\\n\t\t$(PACKAGE) $(libdir) $(includedir)\n\n## Cargo Vendoring\n\nvendor:\n\trm .cargo -rf\n\tmkdir -p .cargo\n\tcargo vendor | head -n -1 > .cargo/config\n\techo 'directory = \"vendor\"' >> .cargo/config\n\ttar cf vendor.tar vendor\n\trm -rf vendor\n\nvendor-check:\nifeq ($(VENDOR),1)\n\trm vendor -rf && tar xf vendor.tar\nendif\n"
  },
  {
    "path": "README.md",
    "content": "# System76 Keyboard Configurator\n\nTool for configuring System76 keyboards, internal and external, with support for changing the keymap and LED settings.\n\nThis requires a System76 laptop with recent open EC firmware, or a Launch keyboard. Note that LED settings are not currently persisted on internal keyboards.\n\n\n## Releases\nSee [releases](https://github.com/pop-os/keyboard-configurator/releases) page for pre-built binaries of the latest tagged release.\n\n\n## Building\n\n```\n# Install dependencies if necessary\nsudo apt-get install cargo libgtk-3-dev libhidapi-dev libudev-dev\n\n# Clone keyboard-configurator if necessary\ngit clone https://github.com/pop-os/keyboard-configurator\n\n# Make sure it is up to date\ncd keyboard-configurator\ngit pull\n\n# Build and run the configurator\ncargo run --release\n```\n\n## Translators\n\nTranslators are welcome to submit translations directly as a pull request to this project. It is generally expected that your pull requests will contain a single commit for each language that was added or improved, using a syntax like so:\n\n```\ni18n(eo): Add Esperanto language support\n```\n\n```\ni18n(pl): Improvements to Polish language support\n```\n\nTranslation files can be found [here](./i18n/). We are using [Project Fluent](https://projectfluent.org) for our translations, which should be easier than working with gettext.\n"
  },
  {
    "path": "RELEASING.md",
    "content": "# Releasing\n\n* Make sure all builds and tests are passing on CI.\n* Update version in `Cargo.toml`.\n* Add new release to `debian/changelog`.\n* No change is needed in `windows/keyboard-configurator.wxs` or `macos/Info.plist`\n  - `windows/build.py` and `macos/build.py` populate the version from `Cargo.toml`\n  - `UpgradeCode` should **not** be changed between releases.\n* Create a release on Github\n  - Github Actions will automatically build artifacts in release mode, and attach them to the release.\n* Deploy release to Pop!\\_OS repos.\n"
  },
  {
    "path": "backend/Cargo.toml",
    "content": "[package]\nname = \"system76-keyboard-configurator-backend\"\nversion = \"0.1.0\"\nauthors = [\"Ian Douglas Scott <idscott@system76.com>\", \"Jeremy Soller <jeremy@system76.com>\"]\nlicense = \"GPL-3.0-or-later\"\nedition = \"2021\"\n\n[dependencies]\nasync-process = \"1.7.0\"\ncascade = \"1\"\nfutures = { version = \"0.3.13\", features = [\"thread-pool\"] }\nfutures-timer = \"3.0.2\"\nglib = { version = \"0.18.0\", optional = true }\nhidapi = { version = \"1.2\", default-features = false, features = [\"linux-shared-hidraw\"] }\nlibc = \"0.2\"\nonce_cell = \"1.4\"\nordered-float = { version = \"3.0\", features = [\"serde\"] }\npalette = \"0.5\"\nregex = \"1\"\nserde = { version = \"1.0\", features = [\"derive\"] }\nserde_json = \"1.0\"\nlog = \"0.4.0\"\nuuid = { version = \"1\", features = [\"v4\"] }\ni18n-embed = { version = \"0.13.0\", features = [\"fluent-system\", \"desktop-requester\"] }\ni18n-embed-fl = \"0.6.0\"\nrust-embed = { version = \"6.2.0\", features = [\"debug-embed\"] }\n\n[dependencies.system76_ectool]\nversion = \"0.3.8\"\nfeatures = [\"hidapi\", \"std\"]\n\n[target.'cfg(target_os = \"linux\")'.dependencies]\nzbus = \"3\"\n\n[build-dependencies]\nserde_json = \"1.0\"\n\n[dev-dependencies]\nlibc = \"0.2\"\n\n[features]\nappimage = []\n"
  },
  {
    "path": "backend/build.rs",
    "content": "use std::{\n    env,\n    fs::{self, File},\n    io::Write,\n    path::Path,\n};\n\nfn main() {\n    let out_dir = env::var_os(\"OUT_DIR\").unwrap();\n    let mut outfile = File::create(Path::new(&out_dir).join(\"keyboards.rs\")).unwrap();\n\n    writeln!(outfile, \"keyboards![\").unwrap();\n\n    println!(\"cargo:rerun-if-changed=../layouts/system76\");\n    for i in fs::read_dir(\"../layouts/system76\").unwrap() {\n        let i = i.unwrap();\n\n        let path = i.path().join(\"meta.json\");\n        let meta = serde_json::from_reader::<_, serde_json::Map<_, _>>(File::open(&path).unwrap())\n            .unwrap();\n        let file_name = i.file_name().into_string().unwrap();\n        let keyboard = meta\n            .get(\"keyboard\")\n            .and_then(|x| x.as_str())\n            .unwrap_or_else(|| {\n                panic!(\"'keyboard:' not found in {}\", path.display());\n            });\n        let is_qmk = meta\n            .get(\"is_qmk\")\n            .and_then(|v| v.as_bool())\n            .unwrap_or(false);\n\n        writeln!(\n            outfile,\n            \"    (\\\"system76/{}\\\", \\\"{}\\\", {}),\",\n            file_name, keyboard, is_qmk\n        )\n        .unwrap();\n\n        println!(\"cargo:rerun-if-changed=../layouts/system76/{}\", file_name);\n        println!(\"cargo:rerun-if-changed=../layouts/keyboards/{}\", keyboard);\n    }\n\n    writeln!(outfile, \"];\").unwrap();\n}\n"
  },
  {
    "path": "backend/examples/benchmark.rs",
    "content": "use std::io;\n\nuse system76_keyboard_configurator_backend::Benchmark;\n\nfn benchmark() -> io::Result<()> {\n    let benchmark = Benchmark::new()?;\n    for (port_desc, port_result) in benchmark.port_results.iter() {\n        eprintln!(\"{}: {:.2?}\", port_desc, port_result);\n    }\n\n    Ok(())\n}\n\nfn main() {\n    benchmark().unwrap();\n}\n"
  },
  {
    "path": "backend/examples/daemon.rs",
    "content": "use std::env;\nuse system76_keyboard_configurator_backend::{run_daemon, Backend, Events};\n\n#[cfg(target_os = \"linux\")]\nfn with_daemon<F: Fn(Backend, Events)>(f: F) {\n    let (backend, events) = if unsafe { libc::geteuid() == 0 } {\n        eprintln!(\"Already running as root\");\n        Backend::new().expect(\"Failed to create server\")\n    } else {\n        Backend::new_pkexec().unwrap()\n    };\n\n    f(backend, events);\n}\n\n#[cfg(not(target_os = \"linux\"))]\nfn with_daemon<F: Fn(Backend, Events)>(f: F) {\n    let (backend, events) = Backend::new().expect(\"Failed to create server\");\n    f(backend, events);\n}\n\nfn main() {\n    for arg in env::args().skip(1) {\n        if arg.as_str() == \"--daemon\" {\n            run_daemon()\n        }\n    }\n\n    with_daemon(|_backend, _events| {\n        // println!(\"boards: {:?}\", daemon.boards());\n    });\n}\n"
  },
  {
    "path": "backend/i18n.toml",
    "content": "fallback_language = \"en\"\n\n[fluent]\nassets_dir = \"../i18n\"\n"
  },
  {
    "path": "backend/src/backend.rs",
    "content": "use futures::{\n    channel::mpsc as async_mpsc,\n    stream::{FusedStream, Stream},\n};\nuse std::{\n    pin::Pin,\n    process,\n    sync::Arc,\n    task::{Context, Poll},\n    time::Duration,\n};\n\nuse crate::daemon::*;\nuse crate::{Board, BoardEvent, Bootloaded};\n\n#[derive(Clone, Debug)]\npub enum Event {\n    BoardLoading,\n    BoardLoadingDone,\n    BoardNotUpdated,\n    Board(BoardId, BoardEvent),\n    BoardAdded(Board),\n    BoardRemoved(BoardId),\n    BootloadedAdded(Bootloaded),\n    BootloadedRemoved,\n}\n\n#[derive(Debug)]\npub struct Events(async_mpsc::UnboundedReceiver<Event>);\n\nimpl Stream for Events {\n    type Item = Event;\n\n    fn poll_next(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Event>> {\n        let receiver = &mut self.get_mut().0;\n        futures::pin_mut!(receiver);\n        receiver.poll_next(cx)\n    }\n}\n\nimpl FusedStream for Events {\n    fn is_terminated(&self) -> bool {\n        self.0.is_terminated()\n    }\n}\n\nimpl Unpin for Events {}\n\n#[derive(Debug)]\nstruct BackendInner {\n    thread_client: Arc<ThreadClient>,\n    executor: futures::executor::ThreadPool,\n}\n\n#[derive(Clone, Debug)]\npub struct Backend(Arc<BackendInner>);\n\nunsafe impl Send for Backend {}\n\nimpl Backend {\n    fn new_internal<T: Daemon + 'static>(daemon: T) -> Result<(Self, Events), String> {\n        let (sender, receiver) = async_mpsc::unbounded();\n\n        let executor = futures::executor::ThreadPool::builder()\n            .pool_size(1)\n            .create()\n            .unwrap();\n\n        let thread_client = ThreadClient::new(Box::new(daemon), sender);\n\n        Ok((\n            Self(Arc::new(BackendInner {\n                thread_client,\n                executor,\n            })),\n            Events(receiver),\n        ))\n    }\n\n    pub fn new_dummy(board_names: Vec<String>) -> Result<(Self, Events), String> {\n        let dummy_daemon = DaemonDummy::new(board_names)?;\n        Self::new_internal(dummy_daemon)\n    }\n\n    #[cfg(target_os = \"linux\")]\n    pub fn new_s76power() -> Result<(Self, Events), String> {\n        Self::new_internal(DaemonS76Power::new()?)\n    }\n\n    pub fn new_pkexec() -> Result<(Self, Events), String> {\n        Self::new_internal(DaemonClient::new_pkexec())\n    }\n\n    pub fn new() -> Result<(Self, Events), String> {\n        Self::new_internal(DaemonServer::new_stdio()?)\n    }\n\n    /// Test for added/removed boards, emitting `board-added`/`board-removed` signals\n    ///\n    /// This function does not block, and loads new boards in the background.\n    pub fn refresh(&self) {\n        let self_ = self.clone();\n        self.0.executor.spawn_ok(async move {\n            if let Err(err) = self_.0.thread_client.refresh().await {\n                error!(\"Failed to refresh boards: {}\", err);\n            }\n        });\n    }\n\n    pub fn check_for_bootloader(&self) {\n        let self_ = self.clone();\n        self.0.executor.spawn_ok(async move {\n            if let Err(err) = self_.0.thread_client.check_for_bootloader().await {\n                error!(\"Failed to check for board in bootloader mode: {}\", err);\n            }\n        });\n    }\n\n    pub fn set_matrix_get_rate(&self, rate: Option<Duration>) {\n        let self_ = self.clone();\n        self.0.executor.spawn_ok(async move {\n            let _ = self_.0.thread_client.set_matrix_get_rate(rate).await;\n        });\n    }\n}\n\nimpl Drop for BackendInner {\n    fn drop(&mut self) {\n        self.thread_client.close();\n    }\n}\n\npub fn run_daemon() -> ! {\n    let server = DaemonServer::new_stdio().expect(\"Failed to create server\");\n    server.run().expect(\"Failed to run server\");\n    process::exit(0)\n}\n"
  },
  {
    "path": "backend/src/benchmark/block_dev.rs",
    "content": "#[cfg(target_os = \"linux\")]\nuse std::os::unix::fs::OpenOptionsExt;\nuse std::{\n    alloc::{alloc, dealloc, handle_alloc_error, Layout},\n    fs,\n    io::{self, Read},\n    path::{Path, PathBuf},\n    slice, time,\n};\n\nconst ALIGN: usize = 4096;\nconst SIZE: usize = ALIGN * 1024;\n\n#[derive(Eq, Ord, PartialEq, PartialOrd)]\npub struct BlockDev(PathBuf);\n\nimpl BlockDev {\n    pub fn new(path: PathBuf) -> Self {\n        Self(path)\n    }\n\n    pub fn path(&self) -> &Path {\n        &self.0\n    }\n\n    pub fn benchmark(&self) -> io::Result<f64> {\n        let mut open_options = fs::OpenOptions::new();\n        open_options.read(true);\n        #[cfg(target_os = \"linux\")]\n        open_options.custom_flags(libc::O_DIRECT);\n\n        let mut file = open_options.open(self.path())?;\n\n        // Buffer needs to be aligned for direct reads\n        let layout = Layout::from_size_align(SIZE, ALIGN).unwrap();\n        let ptr = unsafe { alloc(layout) };\n        if ptr.is_null() {\n            handle_alloc_error(layout);\n        }\n\n        let (res, elapsed) = {\n            let data = unsafe { slice::from_raw_parts_mut(ptr as *mut u8, SIZE) };\n\n            let start = time::Instant::now();\n            (file.read(data), start.elapsed())\n        };\n\n        unsafe {\n            dealloc(ptr, layout);\n        }\n\n        // Do this after free to ensure no memory leaks\n        res?;\n\n        Ok(4.0 / elapsed.as_secs_f64())\n    }\n}\n"
  },
  {
    "path": "backend/src/benchmark/mod.rs",
    "content": "use serde::{Deserialize, Serialize};\nuse std::{collections::BTreeMap, io};\n\nuse self::usb_hub::UsbHub;\n\nmod block_dev;\nmod usb_dev;\nmod usb_hub;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Benchmark {\n    pub port_results: BTreeMap<String, Result<f64, String>>,\n}\n\nimpl Benchmark {\n    pub fn new() -> io::Result<Self> {\n        let hubs = UsbHub::probe()?;\n\n        let mut port_descs = BTreeMap::new();\n        port_descs.insert(\"1\", \"USB-C Right\");\n        port_descs.insert(\"2\", \"USB-A Right\");\n        port_descs.insert(\"3\", \"USB-A Left\");\n        port_descs.insert(\"4\", \"USB-C Left\");\n\n        let mut usb_2_hubs = 0;\n        let mut usb_3_hubs = 0;\n        for hub in hubs.iter() {\n            match hub {\n                UsbHub::Usb2(_) => usb_2_hubs += 1,\n                UsbHub::Usb3(_) => usb_3_hubs += 1,\n            }\n        }\n\n        if usb_2_hubs != 1 {\n            return Err(io::Error::new(\n                io::ErrorKind::Other,\n                format!(\"Found {} USB 2 hubs instead of 1\", usb_2_hubs),\n            ));\n        }\n\n        if usb_3_hubs != 1 {\n            return Err(io::Error::new(\n                io::ErrorKind::Other,\n                format!(\"Found {} USB 3 hubs instead of 1\", usb_3_hubs),\n            ));\n        }\n\n        let mut port_results = BTreeMap::new();\n        for hub in hubs.iter() {\n            let (required_speed, speed_name) = match hub {\n                UsbHub::Usb2(_) => (\n                    1.5, // USB 1.1 max speed is 12 Mbps or 1.5 MBps\n                    \"USB 2.0\",\n                ),\n                UsbHub::Usb3(_) => (\n                    60.0, // USB 2.0 max speed is 480 Mbps or 60 MBps\n                    \"USB 3.2 Gen 2\",\n                ),\n            };\n\n            for (port_name, dev) in hub.ports()?.iter() {\n                let port_desc = match port_descs.get(port_name.as_str()) {\n                    Some(some) => some,\n                    // Ports 5 and 6 connect to the Launch microcontroller (port 5)\n                    // and an integrated hub device (port 6)\n                    None => continue,\n                };\n\n                let port_result = if dev.path().is_dir() {\n                    let mut best_speed = -1.0;\n                    for block_dev in dev.block_devs()? {\n                        match block_dev.benchmark() {\n                            Ok(benchmark) => {\n                                if benchmark > best_speed {\n                                    best_speed = benchmark;\n                                }\n                            }\n                            Err(_err) => {\n                                //TODO: do something with error\n                            }\n                        }\n                    }\n                    if best_speed < 0.0 {\n                        Err(\"no accessible disks\".to_string())\n                    } else if best_speed > required_speed {\n                        Ok(best_speed)\n                    } else {\n                        Err(format!(\"benchmarked speed of {:.2} MB/s was less than required speed of {:.2} MB/s\", best_speed, required_speed))\n                    }\n                } else {\n                    Err(\"no devices\".to_string())\n                };\n\n                port_results.insert(format!(\"{}: {}\", speed_name, port_desc), port_result);\n            }\n        }\n\n        Ok(Self { port_results })\n    }\n}\n"
  },
  {
    "path": "backend/src/benchmark/usb_dev.rs",
    "content": "use std::{\n    fs, io,\n    path::{Path, PathBuf},\n};\n\nuse super::block_dev::BlockDev;\n\npub struct UsbDev(PathBuf);\n\nimpl UsbDev {\n    pub fn new(path: PathBuf) -> Self {\n        Self(path)\n    }\n\n    pub fn path(&self) -> &Path {\n        &self.0\n    }\n\n    pub fn vendor_id(&self) -> io::Result<u16> {\n        let vid_path = self.path().join(\"idVendor\");\n        let vid_str = fs::read_to_string(vid_path)?;\n        u16::from_str_radix(vid_str.trim(), 16)\n            .map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err))\n    }\n\n    pub fn product_id(&self) -> io::Result<u16> {\n        let pid_path = self.path().join(\"idProduct\");\n        let pid_str = fs::read_to_string(pid_path)?;\n        u16::from_str_radix(pid_str.trim(), 16)\n            .map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err))\n    }\n\n    pub fn block_devs(&self) -> io::Result<Vec<BlockDev>> {\n        let mut ifaces = Vec::new();\n        //TODO: support multiple ifaces\n        let iface_suffix = \":1.0\";\n        for entry_res in fs::read_dir(self.path())? {\n            let entry = entry_res?;\n            if let Ok(entry_name) = entry.file_name().into_string() {\n                if entry_name.ends_with(&iface_suffix) {\n                    ifaces.push((entry_name, entry.path()));\n                }\n            }\n        }\n\n        let mut hosts = Vec::new();\n        for (_iface_name, iface_path) in ifaces.iter() {\n            let host_prefix = \"host\";\n            for entry_res in fs::read_dir(iface_path)? {\n                let entry = entry_res?;\n                if let Ok(entry_name) = entry.file_name().into_string() {\n                    if entry_name.starts_with(host_prefix) {\n                        hosts.push((entry_name, entry.path()));\n                    }\n                }\n            }\n        }\n\n        let mut targets = Vec::new();\n        for (host_name, host_path) in hosts.iter() {\n            let host_id = host_name.trim_start_matches(\"host\");\n            let target_prefix = format!(\"target{}:\", host_id);\n            for entry_res in fs::read_dir(host_path)? {\n                let entry = entry_res?;\n                if let Ok(entry_name) = entry.file_name().into_string() {\n                    if entry_name.starts_with(&target_prefix) {\n                        targets.push((entry_name, entry.path()));\n                    }\n                }\n            }\n        }\n\n        let mut disks = Vec::new();\n        for (target_name, target_path) in targets.iter() {\n            let target_id = target_name.trim_start_matches(\"target\");\n            let disk_prefix = format!(\"{}:\", target_id);\n            for entry_res in fs::read_dir(target_path)? {\n                let entry = entry_res?;\n                if let Ok(entry_name) = entry.file_name().into_string() {\n                    if entry_name.starts_with(&disk_prefix) {\n                        disks.push((entry_name, entry.path()));\n                    }\n                }\n            }\n        }\n\n        let mut blocks = Vec::new();\n        for (_disk_name, disk_path) in disks.iter() {\n            let disk_block_path = disk_path.join(\"block\");\n            for entry_res in fs::read_dir(&disk_block_path)? {\n                let entry = entry_res?;\n                if let Ok(entry_name) = entry.file_name().into_string() {\n                    blocks.push((entry_name, entry.path()));\n                }\n            }\n        }\n\n        let mut block_devs = Vec::new();\n        for (block_name, _block_path) in blocks.iter() {\n            block_devs.push(BlockDev::new(Path::new(\"/dev\").join(block_name)));\n        }\n\n        block_devs.sort();\n\n        Ok(block_devs)\n    }\n}\n"
  },
  {
    "path": "backend/src/benchmark/usb_hub.rs",
    "content": "use std::{collections::BTreeMap, fs, io, path::Path};\n\nuse super::usb_dev::UsbDev;\n\nconst SYSTEM76_VID: u16 = 0x3384;\nconst USB_2_HUB_PID: u16 = 0x0003;\nconst USB_3_HUB_PID: u16 = 0x0004;\n//TODO: Determine why USB7216 doesn't respect PID updates\nconst USB_2_HUB_PID_ALT: u16 = 0x4216;\nconst USB_3_HUB_PID_ALT: u16 = 0x7216;\n\npub enum UsbHub {\n    Usb2(UsbDev),\n    Usb3(UsbDev),\n}\n\nimpl UsbHub {\n    pub fn probe() -> io::Result<Vec<Self>> {\n        let mut hubs = Vec::new();\n        for entry_res in fs::read_dir(\"/sys/bus/usb/devices\")? {\n            let entry = entry_res?;\n            let entry_path = entry.path();\n            let vid_path = entry_path.join(\"idVendor\");\n            let pid_path = entry_path.join(\"idProduct\");\n            if vid_path.is_file() && pid_path.is_file() {\n                let usb = UsbDev::new(entry_path);\n                match (usb.vendor_id()?, usb.product_id()?) {\n                    (SYSTEM76_VID, USB_2_HUB_PID_ALT) | (SYSTEM76_VID, USB_2_HUB_PID) => {\n                        hubs.push(UsbHub::Usb2(usb))\n                    }\n                    (SYSTEM76_VID, USB_3_HUB_PID_ALT) | (SYSTEM76_VID, USB_3_HUB_PID) => {\n                        hubs.push(UsbHub::Usb3(usb))\n                    }\n                    _ => (),\n                }\n            }\n        }\n        Ok(hubs)\n    }\n\n    pub fn usb_dev(&self) -> &UsbDev {\n        match self {\n            UsbHub::Usb2(usb) => usb,\n            UsbHub::Usb3(usb) => usb,\n        }\n    }\n\n    pub fn path(&self) -> &Path {\n        self.usb_dev().path()\n    }\n\n    pub fn ports(&self) -> io::Result<BTreeMap<String, UsbDev>> {\n        let mut hub_ports = BTreeMap::new();\n        let hub_path = self.path();\n        let hub_name = hub_path\n            .file_name()\n            .and_then(|x| x.to_str())\n            .ok_or_else(|| {\n                io::Error::new(\n                    io::ErrorKind::InvalidData,\n                    \"hub_ports file_name not found or not UTF-8\",\n                )\n            })?;\n        let if_path = hub_path.join(format!(\"{}:1.0\", hub_name));\n        let port_prefix = format!(\"{}-port\", hub_name);\n        for entry_res in fs::read_dir(&if_path)? {\n            let entry = entry_res?;\n            if let Ok(entry_name) = entry.file_name().into_string() {\n                if entry_name.starts_with(&port_prefix) {\n                    let port_name = entry_name.trim_start_matches(&port_prefix);\n                    let dev_path = entry.path().join(\"device\");\n                    hub_ports.insert(port_name.to_owned(), UsbDev::new(dev_path));\n                }\n            }\n        }\n        Ok(hub_ports)\n    }\n}\n"
  },
  {
    "path": "backend/src/board.rs",
    "content": "use futures::channel::mpsc as async_mpsc;\nuse once_cell::sync::{Lazy, OnceCell};\nuse regex::Regex;\nuse serde::{Deserialize, Serialize};\nuse std::{\n    collections::BTreeMap,\n    process::Command,\n    sync::{\n        atomic::{AtomicBool, Ordering},\n        Arc, Mutex, MutexGuard, Weak,\n    },\n};\n\nuse crate::daemon::ThreadClient;\nuse crate::{\n    Benchmark, BoardId, Daemon, Event, Key, KeyMap, KeyMapLayer, Layer, Layout, Matrix, Nelson,\n    NelsonKind,\n};\n\n#[derive(Clone, Debug)]\npub enum BoardEvent {\n    KeymapChanged,\n    LedsChanged,\n    MatrixChanged,\n}\n\n#[derive(Debug)]\nstruct BoardInner {\n    thread_client: Arc<ThreadClient>,\n    board: BoardId,\n    model: String,\n    version: String,\n    layout: Layout,\n    keys: OnceCell<Vec<Key>>,\n    layers: OnceCell<Vec<Layer>>,\n    max_brightness: i32,\n    leds_changed: AtomicBool,\n    has_led_save: bool,\n    led_save_blocked: AtomicBool,\n    has_matrix: bool,\n    is_fake: bool,\n    has_keymap: bool,\n    matrix: Arc<Mutex<Matrix>>,\n    updated: bool,\n    event_sender: async_mpsc::UnboundedSender<Event>,\n}\n\n#[derive(Clone, Debug)]\npub struct Board(Arc<BoardInner>);\n\nimpl PartialEq for Board {\n    fn eq(&self, other: &Self) -> bool {\n        Arc::ptr_eq(&self.0, &other.0)\n    }\n}\n\nimpl Eq for Board {}\n\n#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Hash, Eq)]\npub enum Bootloaded {\n    // Launch 2, Launch Heavy 1,\n    At90usb646,\n    // Launch Lite 1\n    At90usb646Lite,\n    // Launch 1\n    AtMega32u4,\n}\n\n#[derive(Debug)]\npub(crate) struct WeakBoard(Weak<BoardInner>);\n\nimpl Board {\n    pub fn new(\n        daemon: &dyn Daemon,\n        thread_client: Arc<ThreadClient>,\n        board: BoardId,\n        matrix: Arc<Mutex<Matrix>>,\n        event_sender: async_mpsc::UnboundedSender<Event>,\n    ) -> Result<Self, String> {\n        let model = match daemon.model(board) {\n            Ok(model) => model,\n            Err(err) => {\n                return Err(format!(\"Failed to get board model: {}\", err));\n            }\n        };\n        let version = daemon.version(board).unwrap_or_else(|err| {\n            error!(\"Error getting firmware version: {}\", err);\n            String::new()\n        });\n        let layout = Layout::from_board(&model, &version)\n            .ok_or_else(|| format!(\"Failed to locate layout for '{}'\", model))?;\n\n        let max_brightness = daemon.max_brightness(board).unwrap_or_else(|err| {\n            error!(\"Error getting max brightness: {}\", err);\n            100\n        });\n\n        let num_layers = if layout.meta.has_per_layer {\n            layout.meta.num_layers\n        } else {\n            1\n        };\n\n        let has_led_save = daemon.led_save(board).is_ok();\n        let has_matrix = daemon.matrix_get(board).is_ok();\n        let logical = layout.layout.values().next().unwrap();\n        let has_keymap = daemon.keymap_get(board, 0, logical.0, logical.1).is_ok();\n\n        let self_ = Board(Arc::new(BoardInner {\n            thread_client,\n            board,\n            model,\n            version,\n            layout,\n            max_brightness,\n            has_led_save,\n            has_matrix,\n            is_fake: daemon.is_fake(),\n            has_keymap,\n            keys: OnceCell::new(),\n            layers: OnceCell::new(),\n            leds_changed: AtomicBool::new(false),\n            led_save_blocked: AtomicBool::new(false),\n            matrix,\n            event_sender,\n            updated: is_launch_updated().unwrap_or(false),\n        }));\n\n        let keys = self_\n            .layout()\n            .physical\n            .keys\n            .iter()\n            .map(|i| Key::new(daemon, &self_, i))\n            .collect();\n        self_.0.keys.set(keys).unwrap();\n\n        let layers = (0..num_layers)\n            .map(|layer| Layer::new(daemon, &self_, layer))\n            .collect();\n        self_.0.layers.set(layers).unwrap();\n\n        Ok(self_)\n    }\n\n    pub(crate) fn send_event(&self, event: BoardEvent) {\n        let _ = self\n            .0\n            .event_sender\n            .unbounded_send(Event::Board(self.0.board, event));\n    }\n\n    pub(crate) fn set_leds_changed(&self) {\n        self.0.leds_changed.store(true, Ordering::SeqCst);\n        self.send_event(BoardEvent::LedsChanged);\n    }\n\n    pub fn board(&self) -> BoardId {\n        self.0.board\n    }\n\n    pub(crate) fn thread_client(&self) -> &ThreadClient {\n        &self.0.thread_client\n    }\n\n    pub fn model(&self) -> &str {\n        &self.0.model\n    }\n\n    pub fn version(&self) -> &str {\n        &self.0.version\n    }\n\n    pub fn has_matrix(&self) -> bool {\n        self.0.has_matrix\n    }\n\n    pub fn max_brightness(&self) -> i32 {\n        self.0.max_brightness\n    }\n\n    pub async fn benchmark(&self) -> Result<Benchmark, String> {\n        self.thread_client().benchmark(self.board()).await\n    }\n\n    pub async fn nelson(&self, kind: NelsonKind) -> Result<Nelson, String> {\n        self.thread_client().nelson(self.board(), kind).await\n    }\n\n    pub async fn led_save(&self) -> Result<(), String> {\n        if self.0.led_save_blocked.load(Ordering::SeqCst) {\n            return Ok(());\n        }\n        if self.has_led_save() && self.0.leds_changed.load(Ordering::SeqCst) {\n            self.thread_client().led_save(self.board()).await?;\n            self.0.leds_changed.store(false, Ordering::SeqCst);\n            debug!(\"led_save\");\n        }\n        Ok(())\n    }\n\n    pub fn block_led_save(&self) {\n        self.0.led_save_blocked.store(true, Ordering::SeqCst);\n    }\n\n    pub fn unblock_led_save(&self) {\n        self.0.led_save_blocked.store(false, Ordering::SeqCst);\n    }\n\n    pub fn is_fake(&self) -> bool {\n        self.0.is_fake\n    }\n\n    pub fn is_lite(&self) -> bool {\n        static RE: Lazy<Regex> = Lazy::new(|| Regex::new(\"system76/launch_lite_.*\").unwrap());\n        RE.is_match(self.model())\n    }\n\n    pub fn is_updated(&self) -> bool {\n        self.0.updated\n    }\n\n    pub fn has_led_save(&self) -> bool {\n        self.0.has_led_save\n    }\n\n    pub fn has_keymap(&self) -> bool {\n        self.0.has_keymap\n    }\n\n    pub fn layout(&self) -> &Layout {\n        &self.0.layout\n    }\n\n    pub fn layers(&self) -> &[Layer] {\n        self.0.layers.get().unwrap()\n    }\n\n    pub fn keys(&self) -> &[Key] {\n        self.0.keys.get().unwrap()\n    }\n\n    pub(crate) fn matrix(&self) -> MutexGuard<Matrix> {\n        self.0.matrix.lock().unwrap()\n    }\n\n    pub fn export_keymap(&self) -> KeyMap {\n        let mut map = BTreeMap::new();\n        let mut key_leds = BTreeMap::new();\n        for key in self.keys().iter() {\n            let scancodes = (0..self.layout().meta.num_layers as usize)\n                .map(|layer| key.get_scancode(layer).unwrap().1)\n                .collect();\n            map.insert(key.logical_name.clone(), scancodes);\n            if !key.leds.is_empty() {\n                key_leds.insert(key.logical_name.clone(), key.color());\n            }\n        }\n        let layers = self\n            .layers()\n            .iter()\n            .map(|layer| KeyMapLayer {\n                mode: *layer.mode.lock().unwrap(),\n                brightness: layer.brightness(),\n                color: layer.color(),\n            })\n            .collect();\n        KeyMap {\n            model: self.model().to_string(),\n            version: 1,\n            map,\n            key_leds,\n            layers,\n        }\n    }\n\n    pub async fn set_no_input(&self, no_input: bool) -> Result<(), String> {\n        self.thread_client()\n            .set_no_input(self.board(), no_input)\n            .await\n    }\n\n    pub(crate) fn downgrade(&self) -> WeakBoard {\n        WeakBoard(Arc::downgrade(&self.0))\n    }\n}\n\nimpl WeakBoard {\n    pub fn upgrade(&self) -> Option<Board> {\n        Some(Board(self.0.upgrade()?))\n    }\n}\n\npub fn is_launch_updated() -> Result<bool, String> {\n    use regex::bytes::Regex;\n    let stdout = Command::new(\"fwupdmgr\")\n        .args([\"get-updates\", \"--json\"])\n        .output()\n        .map_err(|e| format!(\"Failed to use fwupdmgr: {}\", e))?\n        .stdout;\n\n    static RE: Lazy<Regex> = Lazy::new(|| Regex::new(\"Launch.* Configurable Keyboard\").unwrap());\n    Ok(!RE.is_match(&stdout))\n}\n"
  },
  {
    "path": "backend/src/color.rs",
    "content": "use ordered_float::NotNan;\nuse palette::{Component, IntoColor, RgbHue};\nuse serde::{de, Deserialize, Serialize};\nuse std::{f64::consts::PI, fmt};\n\ntype PaletteHsv = palette::Hsv<palette::encoding::Srgb, f64>;\ntype PaletteLinSrgb = palette::LinSrgb<f64>;\n\n/// Floating point hue/saturation color\n#[cfg_attr(feature = \"glib\", derive(glib::Boxed))]\n#[derive(\n    Clone, Copy, Debug, Serialize, Deserialize, Default, PartialEq, Hash, Eq, Ord, PartialOrd,\n)]\n#[cfg_attr(feature = \"glib\", boxed_type(name = \"S76Hs\"))]\npub struct Hs {\n    /// Hue, in radians\n    pub h: NotNan<f64>,\n    /// Saturation, from 0.0 to 1.0\n    pub s: NotNan<f64>,\n}\n\nimpl Hs {\n    pub fn new(h: f64, s: f64) -> Self {\n        Self {\n            h: NotNan::new(h).unwrap(),\n            s: NotNan::new(s).unwrap(),\n        }\n    }\n\n    pub fn from_ints(h: u8, s: u8) -> Self {\n        Self::new(h.convert::<f64>() * (2. * PI), s.convert())\n    }\n\n    pub fn to_ints(self) -> (u8, u8) {\n        let h = (self.h / (2. * PI)).rem_euclid(1.);\n        (h.convert(), self.s.convert())\n    }\n\n    pub fn to_rgb(self) -> Rgb {\n        let hue = RgbHue::from_radians(*self.h);\n        let hsv = PaletteHsv::new(hue, *self.s, 1.);\n        let rgb: PaletteLinSrgb = hsv.into_rgb();\n        let (r, g, b) = rgb.into_components();\n        Rgb::from_floats(r, g, b)\n    }\n}\n\n/// Integer RGB color\n#[cfg_attr(feature = \"glib\", derive(glib::Boxed))]\n#[derive(Clone, Copy, Debug, Default)]\n#[cfg_attr(feature = \"glib\", boxed_type(name = \"S76Rgb\"))]\npub struct Rgb {\n    /// Red\n    pub r: u8,\n    /// Green\n    pub g: u8,\n    /// Blue\n    pub b: u8,\n}\n\nimpl Rgb {\n    pub fn new(r: u8, g: u8, b: u8) -> Self {\n        Self { r, g, b }\n    }\n\n    pub fn from_floats(r: f64, g: f64, b: f64) -> Self {\n        Self {\n            r: r.convert(),\n            g: g.convert(),\n            b: b.convert(),\n        }\n    }\n\n    pub fn to_floats(self) -> (f64, f64, f64) {\n        (self.r.convert(), self.g.convert(), self.b.convert())\n    }\n\n    /// Parse from hexadecimal string\n    pub fn parse(s: &str) -> Option<Self> {\n        if s.len() == 7 && s.starts_with('#') {\n            let r = u8::from_str_radix(&s[1..3], 16).ok()?;\n            let g = u8::from_str_radix(&s[3..5], 16).ok()?;\n            let b = u8::from_str_radix(&s[5..7], 16).ok()?;\n            Some(Self::new(r, g, b))\n        } else {\n            None\n        }\n    }\n\n    #[allow(clippy::many_single_char_names)]\n    pub fn to_hs_lossy(self) -> Hs {\n        let (r, g, b) = self.to_floats();\n        let rgb = PaletteLinSrgb::new(r, g, b);\n        let hsv: PaletteHsv = rgb.into_hsv();\n        let (h, s, _) = hsv.into_components();\n        Hs::new(h.to_radians(), s)\n    }\n}\n\n/// Convert to hexadecimal string\nimpl fmt::Display for Rgb {\n    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"#{:02x}{:02x}{:02x}\", self.r, self.g, self.b)\n    }\n}\n\nimpl Serialize for Rgb {\n    fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {\n        serializer.serialize_str(&self.to_string())\n    }\n}\n\nstruct RgbVisitor;\n\nimpl<'de> de::Visitor<'de> for RgbVisitor {\n    type Value = Rgb;\n\n    fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {\n        write!(f, \"a hexadecimal rgb code prefixed with #\")\n    }\n\n    fn visit_str<E: de::Error>(self, v: &str) -> Result<Rgb, E> {\n        Rgb::parse(v).ok_or_else(|| E::invalid_value(de::Unexpected::Str(v), &self))\n    }\n}\n\nimpl<'de> Deserialize<'de> for Rgb {\n    fn deserialize<D: de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {\n        deserializer.deserialize_str(RgbVisitor)\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::*;\n\n    #[test]\n    fn test_hs_rgb_hs() {\n        let hs1 = Hs::new(0.3, 0.4);\n        let hs2 = hs1.to_rgb().to_hs_lossy();\n        let hs3 = hs2.to_rgb().to_hs_lossy();\n        assert!((hs1.h - hs2.h).abs() < 0.01);\n        assert!((hs1.s - hs2.s).abs() < 0.01);\n        assert!((hs2.h - hs3.h).abs() < 0.0001);\n        assert!((hs2.s - hs3.s).abs() < 0.0001);\n    }\n}\n"
  },
  {
    "path": "backend/src/daemon/client.rs",
    "content": "use std::{\n    cell::RefCell,\n    env,\n    io::{BufRead, BufReader, Write},\n    path::PathBuf,\n    process::{Child, ChildStdin, ChildStdout, Command, Stdio},\n};\n\nuse super::{err_str, Daemon, DaemonClientTrait, DaemonCommand, DaemonResponse};\n\npub struct DaemonClient {\n    child: Child,\n    read: RefCell<BufReader<ChildStdout>>,\n    write: RefCell<ChildStdin>,\n}\n\nimpl DaemonClient {\n    pub fn new_pkexec() -> Self {\n        // Use canonicalized command name\n        let command_path = if cfg!(feature = \"appimage\") {\n            PathBuf::from(env::var(\"APPIMAGE\").expect(\"Failed to get executable path\"))\n        } else {\n            env::current_exe().expect(\"Failed to get executable path\")\n        };\n\n        let mut child = Command::new(\"pkexec\")\n            .arg(command_path)\n            .arg(\"--daemon\")\n            .stdin(Stdio::piped())\n            .stdout(Stdio::piped())\n            .spawn()\n            .expect(\"Failed to spawn daemon\");\n\n        let stdin = child.stdin.take().unwrap();\n        let mut stdout = BufReader::new(child.stdout.take().unwrap());\n\n        // Check if daemon has started\n        let mut line = String::new();\n        if let Ok(count) = stdout.read_line(&mut line) {\n            // pkexec terminated returning EOF\n            if count == 0 {\n                panic!(\"Failed to start daemon with pkexec\");\n            }\n        }\n\n        Self {\n            child,\n            read: RefCell::new(stdout),\n            write: RefCell::new(stdin),\n        }\n    }\n}\n\nimpl DaemonClientTrait for DaemonClient {\n    fn send_command(&self, command: DaemonCommand) -> Result<DaemonResponse, String> {\n        let mut command_json = serde_json::to_string(&command).map_err(err_str)?;\n        command_json.push('\\n');\n        self.write\n            .borrow_mut()\n            .write_all(command_json.as_bytes())\n            .map_err(err_str)?;\n\n        let mut response_json = String::new();\n        self.read\n            .borrow_mut()\n            .read_line(&mut response_json)\n            .map_err(err_str)?;\n        serde_json::from_str(&response_json).map_err(err_str)?\n    }\n}\n\nimpl Drop for DaemonClient {\n    fn drop(&mut self) {\n        let _ = self.exit();\n\n        let status = self.child.wait().expect(\"Failed to wait for daemon\");\n        if !status.success() {\n            panic!(\"Failed to run daemon with exit status {:?}\", status);\n        }\n    }\n}\n"
  },
  {
    "path": "backend/src/daemon/daemon_thread.rs",
    "content": "use futures::{\n    channel::{mpsc as async_mpsc, oneshot},\n    executor::LocalPool,\n    future::{abortable, AbortHandle},\n    prelude::*,\n    task::LocalSpawnExt,\n};\nuse futures_timer::Delay;\nuse once_cell::sync::Lazy;\nuse std::{\n    cell::{Cell, RefCell},\n    cmp::PartialEq,\n    collections::HashMap,\n    hash::{Hash, Hasher},\n    rc::Rc,\n    sync::{Arc, Mutex, Weak},\n    thread::{self, JoinHandle},\n    time::Duration,\n};\n\nuse super::{Benchmark, BoardId, Daemon, Matrix, Nelson, NelsonKind};\nuse crate::{Board, BoardEvent, Bootloaded, Event};\n\n#[derive(Clone, Debug)]\nstruct Item<K: Hash + Eq, V> {\n    key: K,\n    value: V,\n}\n\nimpl<K: Hash + Eq, V> Item<K, V> {\n    fn new(key: K, value: V) -> Self {\n        Self { key, value }\n    }\n}\n\nimpl<K: Hash + Eq, V> Hash for Item<K, V> {\n    fn hash<H: Hasher>(&self, state: &mut H) {\n        self.key.hash(state);\n    }\n}\n\nimpl<K: Hash + Eq, V> PartialEq for Item<K, V> {\n    fn eq(&self, other: &Self) -> bool {\n        self.key == other.key\n    }\n}\n\nimpl<K: Hash + Eq, V> Eq for Item<K, V> {}\n\n#[derive(Clone, Hash, Eq, PartialEq, Debug)]\nenum SetEnum {\n    KeyMap(Item<(BoardId, u8, u8, u8), u16>),\n    Color(Item<(BoardId, u8), (u8, u8, u8)>),\n    Brightness(Item<(BoardId, u8), i32>),\n    Mode(Item<(BoardId, u8), (u8, u8)>),\n    Benchmark(BoardId),\n    Nelson(BoardId, NelsonKind),\n    LedSave(BoardId),\n    MatrixGetRate(Item<(), Option<Duration>>),\n    Refresh,\n    BootLoaderUpdate(Option<Bootloaded>),\n    NoInput(BoardId, bool),\n    Exit,\n}\n\nimpl SetEnum {\n    fn is_cancelable(&self) -> bool {\n        !matches!(self, Self::Nelson(_, _) | Self::Benchmark(_))\n    }\n}\n\n#[derive(Debug)]\nstruct Set {\n    inner: SetEnum,\n    oneshot: oneshot::Sender<Result<Response, String>>,\n}\n\n#[derive(Debug)]\nenum Response {\n    Benchmark(Benchmark),\n    Canceled,\n    Empty,\n    Nelson(Box<Nelson>),\n}\n\nimpl From<Benchmark> for Response {\n    fn from(benchmark: Benchmark) -> Self {\n        Response::Benchmark(benchmark)\n    }\n}\n\nimpl From<()> for Response {\n    fn from(_unit: ()) -> Self {\n        Response::Empty\n    }\n}\n\nimpl From<Nelson> for Response {\n    fn from(nelson: Nelson) -> Self {\n        Response::Nelson(Box::new(nelson))\n    }\n}\n\nimpl Set {\n    fn reply<T: Into<Response>>(self, resp: Result<T, String>) {\n        let _ = self.oneshot.send(resp.map(|x| x.into()));\n    }\n}\n\n#[derive(Debug)]\npub struct ThreadClient {\n    cancels: Mutex<HashMap<SetEnum, AbortHandle>>,\n    channel: async_mpsc::UnboundedSender<Set>,\n    join_handle: Mutex<Option<JoinHandle<()>>>,\n}\n\nimpl ThreadClient {\n    pub fn new(\n        daemon: Box<dyn Daemon>,\n        event_sender: async_mpsc::UnboundedSender<Event>,\n    ) -> Arc<Self> {\n        let (sender, reciever) = async_mpsc::unbounded();\n        let client = Arc::new(Self {\n            cancels: Mutex::new(HashMap::new()),\n            channel: sender,\n            join_handle: Mutex::new(None),\n        });\n\n        let join_handle = Thread::new(daemon, client.clone(), event_sender).spawn(reciever);\n        *client.join_handle.lock().unwrap() = Some(join_handle);\n        client\n    }\n\n    #[allow(clippy::await_holding_lock)]\n    async fn send(&self, set_enum: SetEnum) -> Result<Response, String> {\n        let (sender, receiver) = oneshot::channel();\n        let (receiver, cancel) = abortable(receiver);\n        {\n            let mut cancels = self.cancels.lock().unwrap();\n\n            if set_enum.is_cancelable() {\n                if let Some(cancel) = cancels.remove(&set_enum) {\n                    cancel.abort();\n                }\n            }\n\n            cancels.insert(set_enum.clone(), cancel);\n        }\n\n        let _ = self.channel.unbounded_send(Set {\n            inner: set_enum,\n            oneshot: sender,\n        });\n        match receiver.await {\n            Ok(Ok(res)) => res,\n            _ => Ok(Response::Canceled),\n        }\n    }\n\n    async fn send_noresp(&self, set_enum: SetEnum) -> Result<(), String> {\n        self.send(set_enum).await.and(Ok(()))\n    }\n\n    pub async fn refresh(&self) -> Result<(), String> {\n        self.send_noresp(SetEnum::Refresh).await\n    }\n\n    pub async fn check_for_bootloader(&self) -> Result<(), String> {\n        use regex::bytes::Regex;\n        static HAS_USB_HUB: Lazy<Regex> =\n            Lazy::new(|| Regex::new(\"3384:000.*System76 USB\").unwrap());\n        static ATMEGA32U4: Lazy<Regex> =\n            Lazy::new(|| Regex::new(\"03eb:2ff4.*atmega32u4.*bootloader\").unwrap());\n        static AT90USB646: Lazy<Regex> =\n            Lazy::new(|| Regex::new(\"03eb:2ff9.*at90usb646.*bootloader\").unwrap());\n\n        let lsusb = async_process::Command::new(\"lsusb\")\n            .arg(\"--verbose\")\n            .output()\n            .await\n            .map_err(|_| \"Failed to run lsusb\".to_string())?\n            .stdout;\n\n        let update = if AT90USB646.is_match(&lsusb) {\n            if HAS_USB_HUB.is_match(&lsusb) {\n                Some(Bootloaded::At90usb646)\n            } else {\n                Some(Bootloaded::At90usb646Lite)\n            }\n        } else if ATMEGA32U4.is_match(&lsusb) {\n            Some(Bootloaded::AtMega32u4)\n        } else {\n            None\n        };\n\n        self.send_noresp(SetEnum::BootLoaderUpdate(update)).await\n    }\n\n    pub async fn keymap_set(\n        &self,\n        board: BoardId,\n        layer: u8,\n        output: u8,\n        input: u8,\n        value: u16,\n    ) -> Result<(), String> {\n        self.send_noresp(SetEnum::KeyMap(Item::new(\n            (board, layer, output, input),\n            value,\n        )))\n        .await\n    }\n\n    pub async fn set_color(\n        &self,\n        board: BoardId,\n        index: u8,\n        color: (u8, u8, u8),\n    ) -> Result<(), String> {\n        self.send_noresp(SetEnum::Color(Item::new((board, index), color)))\n            .await\n    }\n\n    pub async fn set_brightness(\n        &self,\n        board: BoardId,\n        index: u8,\n        brightness: i32,\n    ) -> Result<(), String> {\n        self.send_noresp(SetEnum::Brightness(Item::new((board, index), brightness)))\n            .await\n    }\n\n    pub async fn set_mode(\n        &self,\n        board: BoardId,\n        layer: u8,\n        mode: u8,\n        speed: u8,\n    ) -> Result<(), String> {\n        self.send_noresp(SetEnum::Mode(Item::new((board, layer), (mode, speed))))\n            .await\n    }\n\n    pub async fn set_matrix_get_rate(&self, rate: Option<Duration>) -> Result<(), String> {\n        self.send_noresp(SetEnum::MatrixGetRate(Item::new((), rate)))\n            .await\n    }\n\n    pub async fn benchmark(&self, board: BoardId) -> Result<Benchmark, String> {\n        let resp = self.send(SetEnum::Benchmark(board)).await?;\n        if let Response::Benchmark(benchmark) = resp {\n            Ok(benchmark)\n        } else {\n            panic!(\"{}\", format!(\"'{:?}' unexpected\", resp));\n        }\n    }\n\n    pub async fn nelson(&self, board: BoardId, kind: NelsonKind) -> Result<Nelson, String> {\n        let resp = self.send(SetEnum::Nelson(board, kind)).await?;\n        if let Response::Nelson(nelson) = resp {\n            Ok(*nelson)\n        } else {\n            panic!(\"{}\", format!(\"'{:?}' unexpected\", resp));\n        }\n    }\n\n    pub async fn led_save(&self, board: BoardId) -> Result<(), String> {\n        self.send_noresp(SetEnum::LedSave(board)).await\n    }\n\n    pub async fn set_no_input(&self, board: BoardId, no_input: bool) -> Result<(), String> {\n        self.send_noresp(SetEnum::NoInput(board, no_input)).await\n    }\n\n    pub fn close(&self) {\n        let join_handle = match self.join_handle.lock().unwrap().take() {\n            Some(join_handle) => join_handle,\n            None => {\n                return;\n            }\n        };\n\n        // Send exit command to thread\n        let (sender, _receiver) = oneshot::channel();\n        let _ = self.channel.unbounded_send(Set {\n            inner: SetEnum::Exit,\n            oneshot: sender,\n        });\n\n        // Wait for thread to terminate\n        join_handle.join().unwrap();\n    }\n}\n\n/* TODO\n    BootloadedAdded(Bootloaded),\n    BootloadedRemoved\n*/\n\nstruct ThreadBoard {\n    matrix: Arc<Mutex<Matrix>>,\n    board: BoardId,\n    event_sender: async_mpsc::UnboundedSender<Event>,\n    has_matrix: bool,\n}\n\nimpl ThreadBoard {\n    fn new(\n        board: BoardId,\n        event_sender: async_mpsc::UnboundedSender<Event>,\n        has_matrix: bool,\n        matrix: Arc<Mutex<Matrix>>,\n    ) -> Self {\n        Self {\n            matrix,\n            board,\n            event_sender,\n            has_matrix,\n        }\n    }\n}\n\nstruct Thread {\n    daemon: Box<dyn Daemon>,\n    boards: RefCell<HashMap<BoardId, ThreadBoard>>,\n    client: Weak<ThreadClient>,\n    event_sender: async_mpsc::UnboundedSender<Event>,\n    matrix_get_rate: Cell<Option<Duration>>,\n    previous_bootloaded: RefCell<Option<Bootloaded>>,\n    current_bootloaded: RefCell<Option<Bootloaded>>,\n}\n\nimpl Thread {\n    fn new(\n        daemon: Box<dyn Daemon>,\n        client: Arc<ThreadClient>,\n        event_sender: async_mpsc::UnboundedSender<Event>,\n    ) -> Self {\n        Self {\n            daemon,\n            client: Arc::downgrade(&client),\n            event_sender,\n            boards: RefCell::new(HashMap::new()),\n            matrix_get_rate: Cell::new(None),\n            previous_bootloaded: RefCell::new(None),\n            current_bootloaded: RefCell::new(None),\n        }\n    }\n\n    fn spawn(self, mut channel: async_mpsc::UnboundedReceiver<Set>) -> JoinHandle<()> {\n        thread::spawn(move || {\n            let mut pool = LocalPool::new();\n            let spawner = pool.spawner();\n\n            let self_ = Rc::new(self);\n\n            let self_clone = self_.clone();\n            spawner\n                .spawn_local(async move {\n                    loop {\n                        if let Some(rate) = self_clone.matrix_get_rate.get() {\n                            Delay::new(rate).await;\n                            self_clone.matrix_refresh_all();\n                        } else {\n                            Delay::new(Duration::from_millis(100)).await;\n                        }\n                    }\n                })\n                .unwrap();\n\n            pool.run_until(async move {\n                while let Some(set) = channel.next().await {\n                    if !self_.handle_set(set) {\n                        break;\n                    }\n                }\n            });\n        })\n    }\n\n    fn handle_set(&self, set: Set) -> bool {\n        if set.oneshot.is_canceled() && set.inner != SetEnum::Exit {\n            return true;\n        }\n\n        match set.inner {\n            SetEnum::KeyMap(Item { key, value }) => {\n                set.reply(self.daemon.keymap_set(key.0, key.1, key.2, key.3, value))\n            }\n            SetEnum::Color(Item { key, value }) => {\n                set.reply(self.daemon.set_color(key.0, key.1, value))\n            }\n            SetEnum::Brightness(Item { key, value }) => {\n                set.reply(self.daemon.set_brightness(key.0, key.1, value))\n            }\n            SetEnum::Mode(Item { key, value }) => {\n                set.reply(self.daemon.set_mode(key.0, key.1, value.0, value.1))\n            }\n            SetEnum::Benchmark(board) => set.reply(self.daemon.benchmark(board)),\n            SetEnum::Nelson(board, kind) => set.reply(self.daemon.nelson(board, kind)),\n            SetEnum::LedSave(board) => set.reply(self.daemon.led_save(board)),\n            SetEnum::MatrixGetRate(Item { value, .. }) => {\n                self.matrix_get_rate.set(value);\n                set.reply(Ok(()))\n            }\n            SetEnum::Refresh => set.reply(self.refresh()),\n            SetEnum::BootLoaderUpdate(update) => set.reply(self.bootloader_update(update)),\n            SetEnum::NoInput(board, no_input) => {\n                set.reply(self.daemon.set_no_input(board, no_input))\n            }\n            SetEnum::Exit => return false,\n        }\n\n        true\n    }\n\n    fn matrix_refresh_all(&self) {\n        for (k, v) in self.boards.borrow_mut().iter_mut() {\n            if !v.has_matrix {\n                continue;\n            }\n            let matrix = match self.daemon.matrix_get(*k) {\n                Ok(ok) => ok,\n                Err(err) => {\n                    error!(\"failed to get matrix: {}\", err);\n                    continue;\n                }\n            };\n            let mut matrix_lock = v.matrix.lock().unwrap();\n            if *matrix_lock != matrix {\n                *matrix_lock = matrix;\n                let _ = v\n                    .event_sender\n                    .unbounded_send(Event::Board(v.board, BoardEvent::MatrixChanged));\n            }\n        }\n    }\n\n    fn bootloader_update(&self, update: Option<Bootloaded>) -> Result<(), String> {\n        *self.previous_bootloaded.borrow_mut() = *self.current_bootloaded.borrow();\n        *self.current_bootloaded.borrow_mut() = update;\n\n        // If a new board is plugged in and is in bootloader mode, update the gui\n        // only check if we are in launch test mode for production.\n        match (\n            *self.previous_bootloaded.borrow(),\n            *self.current_bootloaded.borrow(),\n        ) {\n            (None, Some(board)) => {\n                let _ = self\n                    .event_sender\n                    .unbounded_send(Event::BootloadedAdded(board));\n            }\n            (Some(_), None) => {\n                let _ = self.event_sender.unbounded_send(Event::BootloadedRemoved);\n            }\n            _ => {}\n        }\n        Ok(())\n    }\n\n    fn refresh(&self) -> Result<(), String> {\n        self.daemon.refresh()?;\n\n        let mut boards = self.boards.borrow_mut();\n\n        let new_ids = self.daemon.boards()?;\n\n        // Removed boards\n        let event_sender = &self.event_sender;\n        boards.retain(|id, _| {\n            if !new_ids.iter().any(|i| i == id) {\n                let _ = event_sender.unbounded_send(Event::BoardRemoved(*id));\n                return false;\n            }\n            true\n        });\n\n        // Added boards\n        let mut have_new_board = false;\n        for i in &new_ids {\n            if boards.contains_key(i) {\n                continue;\n            }\n\n            if !have_new_board {\n                let _ = self.event_sender.unbounded_send(Event::BoardLoading);\n                have_new_board = true;\n            }\n\n            let matrix = Arc::new(Mutex::new(Matrix::default()));\n            match Board::new(\n                self.daemon.as_ref(),\n                self.client.upgrade().unwrap(),\n                *i,\n                matrix.clone(),\n                self.event_sender.clone(),\n            ) {\n                Ok(board) => {\n                    boards.insert(\n                        *i,\n                        ThreadBoard::new(*i, event_sender.clone(), board.has_matrix(), matrix),\n                    );\n                    let _ = self.event_sender.unbounded_send(Event::BoardAdded(board));\n                }\n                Err(err) => error!(\"Failed to add board: {}\", err),\n            }\n        }\n\n        if have_new_board {\n            let _ = self.event_sender.unbounded_send(Event::BoardLoadingDone);\n        }\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "backend/src/daemon/dummy.rs",
    "content": "use std::{cell::RefCell, collections::HashMap};\n\nuse super::{BoardId, Daemon};\nuse crate::{fl, Benchmark, Layout, Matrix, Nelson, NelsonKind};\n\nstruct BoardDummy {\n    name: String,\n    layout: Layout,\n    keymap: RefCell<HashMap<(u8, u8, u8), u16>>,\n    colors: RefCell<HashMap<u8, (u8, u8, u8)>>,\n    brightnesses: RefCell<HashMap<u8, i32>>,\n    modes: RefCell<HashMap<u8, (u8, u8)>>,\n}\n\nimpl BoardDummy {\n    fn valid_index(&self, index: u8, allow_key: bool) -> bool {\n        if !self.layout.meta.has_per_layer {\n            index == 0xff\n        } else if index >= 0xf0 {\n            index < 0xf0 + self.layout.meta.num_layers\n        } else {\n            allow_key && self.layout.leds.values().flatten().any(|i| *i == index)\n        }\n    }\n}\n\npub struct DaemonDummy {\n    boards: Vec<BoardDummy>,\n}\n\nimpl DaemonDummy {\n    pub fn new(board_names: Vec<String>) -> Result<Self, String> {\n        let mut boards = Vec::with_capacity(board_names.len());\n        for name in board_names {\n            if let Some(layout) = Layout::from_board(&name, \"dummy\") {\n                boards.push(BoardDummy {\n                    layout,\n                    name,\n                    keymap: Default::default(),\n                    colors: Default::default(),\n                    brightnesses: Default::default(),\n                    modes: Default::default(),\n                })\n            } else {\n                return Err(format!(\n                    \"'{name}' is an invalid board name. Might need a prefix, 'system76/{name}'?\"\n                ));\n            }\n        }\n        Ok(Self { boards })\n    }\n\n    fn board(&self, board: BoardId) -> Result<&BoardDummy, String> {\n        self.boards\n            .get(board.0 as usize)\n            .ok_or_else(|| fl!(\"no-board\"))\n    }\n}\n\nimpl Daemon for DaemonDummy {\n    fn boards(&self) -> Result<Vec<BoardId>, String> {\n        Ok((0..self.boards.len() as u128).map(BoardId).collect())\n    }\n\n    fn model(&self, board: BoardId) -> Result<String, String> {\n        Ok(self.board(board)?.name.clone())\n    }\n\n    fn version(&self, _board: BoardId) -> Result<String, String> {\n        Ok(\"1970-01-01-deadbee\".to_string())\n    }\n\n    fn is_fake(&self) -> bool {\n        true\n    }\n\n    fn keymap_get(&self, board: BoardId, layer: u8, output: u8, input: u8) -> Result<u16, String> {\n        let keymap = self.board(board)?.keymap.borrow();\n        Ok(keymap.get(&(layer, output, input)).copied().unwrap_or(0))\n    }\n\n    fn keymap_set(\n        &self,\n        board: BoardId,\n        layer: u8,\n        output: u8,\n        input: u8,\n        value: u16,\n    ) -> Result<(), String> {\n        let mut keymap = self.board(board)?.keymap.borrow_mut();\n        keymap.insert((layer, output, input), value);\n        Ok(())\n    }\n\n    fn matrix_get(&self, _board: BoardId) -> Result<Matrix, String> {\n        Ok(Matrix::new(0, 0, Vec::new().into_boxed_slice()))\n    }\n\n    fn benchmark(&self, _board: BoardId) -> Result<Benchmark, String> {\n        Err(\"Unimplemented\".to_string())\n    }\n\n    fn nelson(&self, _board: BoardId, _kind: NelsonKind) -> Result<Nelson, String> {\n        Err(\"Unimplemented\".to_string())\n    }\n\n    fn color(&self, board: BoardId, index: u8) -> Result<(u8, u8, u8), String> {\n        let board = self.board(board)?;\n        if !board.valid_index(index, true) {\n            return Err(format!(\"Can't get color index {} {}\", index, board.name));\n        }\n        Ok(*board.colors.borrow_mut().entry(index).or_default())\n    }\n\n    fn set_color(&self, board: BoardId, index: u8, color: (u8, u8, u8)) -> Result<(), String> {\n        let board = self.board(board)?;\n        if !board.valid_index(index, true) {\n            return Err(format!(\"Can't set color index {}\", index));\n        }\n        board.colors.borrow_mut().insert(index, color);\n        Ok(())\n    }\n\n    fn max_brightness(&self, _board: BoardId) -> Result<i32, String> {\n        Ok(100)\n    }\n\n    fn brightness(&self, board: BoardId, index: u8) -> Result<i32, String> {\n        let board = self.board(board)?;\n        if !board.valid_index(index, false) {\n            return Err(format!(\"Can't get brightness index {}\", index));\n        }\n        Ok(*board.brightnesses.borrow_mut().entry(index).or_default())\n    }\n\n    fn set_brightness(&self, board: BoardId, index: u8, brightness: i32) -> Result<(), String> {\n        let board = self.board(board)?;\n        if !board.valid_index(index, false) {\n            return Err(format!(\"Can't set brightness index {}\", index));\n        }\n        board.brightnesses.borrow_mut().insert(index, brightness);\n        Ok(())\n    }\n\n    fn mode(&self, board: BoardId, layer: u8) -> Result<(u8, u8), String> {\n        let index = layer + 0xf0;\n        let board = self.board(board)?;\n        if !board.valid_index(index, false) {\n            return Err(format!(\"Can't get mode index {}\", index));\n        }\n        Ok(*board.modes.borrow_mut().entry(index).or_default())\n    }\n\n    fn set_mode(&self, board: BoardId, layer: u8, mode: u8, speed: u8) -> Result<(), String> {\n        let index = layer + 0xf0;\n        let board = self.board(board)?;\n        if !board.valid_index(index, false) {\n            return Err(format!(\"Can't get mode index {}\", index));\n        }\n        board.modes.borrow_mut().insert(index, (mode, speed));\n        Ok(())\n    }\n\n    fn led_save(&self, board: BoardId) -> Result<(), String> {\n        self.board(board)?;\n        Ok(())\n    }\n\n    fn refresh(&self) -> Result<(), String> {\n        Ok(())\n    }\n\n    fn set_no_input(&self, _board: BoardId, _no_input: bool) -> Result<(), String> {\n        Ok(())\n    }\n\n    fn exit(&self) -> Result<(), String> {\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "backend/src/daemon/mod.rs",
    "content": "use serde::{Deserialize, Serialize};\n\nuse crate::{Benchmark, Matrix, Nelson, NelsonKind};\n\nmod client;\nmod daemon_thread;\nmod dummy;\nmod server;\n\n#[cfg(target_os = \"linux\")]\nmod s76power;\n#[cfg(target_os = \"linux\")]\npub use self::s76power::*;\n\npub use self::{client::*, daemon_thread::*, dummy::*, server::*};\n\n#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Deserialize, Serialize)]\npub struct BoardId(u128);\n\npub trait DaemonClientTrait: Send + 'static {\n    fn send_command(&self, command: DaemonCommand) -> Result<DaemonResponse, String>;\n}\n\n// Define Daemon trait, DaemonCommand enum, and DaemonResponse enum\nmacro_rules! commands {\n    ( $( fn $func:ident(&self $(,)? $( $arg:ident: $type:ty ),*) -> Result<$ret:ty, String>; )* ) => {\n        pub trait Daemon: Send + 'static {\n        $(\n            fn $func(&self, $( $arg: $type ),*) -> Result<$ret, String>;\n        )*\n\n            fn is_fake(&self) -> bool {\n                false\n            }\n\n            fn dispatch_command_to_method(&self, command: DaemonCommand) -> Result<DaemonResponse, String> {\n                match command {\n                $(\n                    DaemonCommand::$func{$( $arg ),*} => {\n                        self.$func($( $arg ),*).map(DaemonResponse::$func)\n                    }\n                )*\n                }\n            }\n        }\n\n        #[allow(non_camel_case_types)]\n        #[derive(Deserialize, Serialize)]\n        #[serde(tag = \"t\", content = \"c\")]\n        pub enum DaemonCommand {\n        $(\n            $func{$( $arg: $type ),*}\n        ),*\n        }\n\n        #[allow(non_camel_case_types)]\n        #[derive(Deserialize, Serialize)]\n        #[serde(tag = \"t\", content = \"c\")]\n        pub enum DaemonResponse {\n        $(\n            $func($ret)\n        ),*\n        }\n\n        impl<T: DaemonClientTrait> Daemon for T {\n        $(\n            fn $func(&self, $( $arg: $type ),*) -> Result<$ret, String> {\n                let res = self.send_command(DaemonCommand::$func{$( $arg ),*});\n                match res {\n                    Ok(DaemonResponse::$func(ret)) => Ok(ret),\n                    Ok(_) => unreachable!(),\n                    Err(err) => Err(err),\n                }\n            }\n        )*\n        }\n    };\n}\n\ncommands! {\n    fn boards(&self) -> Result<Vec<BoardId>, String>;\n    fn model(&self, board: BoardId) -> Result<String, String>;\n    fn version(&self, board: BoardId) -> Result<String, String>;\n    fn refresh(&self) -> Result<(), String>;\n    fn keymap_get(&self, board: BoardId, layer: u8, output: u8, input: u8) -> Result<u16, String>;\n    fn keymap_set(&self, board: BoardId, layer: u8, output: u8, input: u8, value: u16) -> Result<(), String>;\n    fn matrix_get(&self, board: BoardId) -> Result<Matrix, String>;\n    fn benchmark(&self, board: BoardId) -> Result<Benchmark, String>;\n    fn nelson(&self, board: BoardId, kind: NelsonKind) -> Result<Nelson, String>;\n    fn color(&self, board: BoardId, index: u8) -> Result<(u8, u8, u8), String>;\n    fn set_color(&self, board: BoardId, index: u8, color: (u8, u8, u8)) -> Result<(), String>;\n    fn max_brightness(&self, board: BoardId) -> Result<i32, String>;\n    fn brightness(&self, board: BoardId, index: u8) -> Result<i32, String>;\n    fn set_brightness(&self, board: BoardId, index: u8, brightness: i32) -> Result<(), String>;\n    fn mode(&self, board: BoardId, layer: u8) -> Result<(u8, u8), String>;\n    fn set_mode(&self, board: BoardId, layer: u8, mode: u8, speed: u8) -> Result<(), String>;\n    fn led_save(&self, board: BoardId) -> Result<(), String>;\n    fn set_no_input(&self, board: BoardId, no_input: bool) -> Result<(), String>;\n    fn exit(&self) -> Result<(), String>;\n}\n\nfn err_str<E: std::fmt::Debug>(err: E) -> String {\n    format!(\"{:?}\", err)\n}\n"
  },
  {
    "path": "backend/src/daemon/s76power.rs",
    "content": "// Note: Linux only\n// Need to watch properties of each object?\n// TODO: Hotplug detection support\n\nuse std::iter::Iterator;\nuse zbus::{blocking::fdo::ObjectManagerProxy, blocking::Connection, dbus_proxy};\n\nuse super::{err_str, BoardId, Daemon, Matrix};\nuse crate::{fl, Benchmark, Nelson, NelsonKind, Rgb};\n\nconst DBUS_NAME: &str = \"com.system76.PowerDaemon\";\n\n#[dbus_proxy(\n    interface = \"com.system76.PowerDaemon.Keyboard\",\n    assume_defaults = true\n)]\ntrait Keyboard {\n    #[dbus_proxy(property, name = \"brightness\")]\n    fn brightness(&self) -> zbus::Result<i32>;\n    #[dbus_proxy(property, name = \"brightness\")]\n    fn set_brightness(&self, value: i32) -> zbus::Result<()>;\n\n    #[dbus_proxy(property, name = \"color\")]\n    fn color(&self) -> zbus::Result<String>;\n    #[dbus_proxy(property, name = \"color\")]\n    fn set_color(&self, value: &str) -> zbus::Result<()>;\n\n    #[dbus_proxy(property, name = \"max_brightness\")]\n    fn max_brightness(&self) -> zbus::Result<i32>;\n\n    #[dbus_proxy(property, name = \"name\")]\n    fn name(&self) -> zbus::Result<String>;\n}\n\nstruct Keyboard {\n    proxy: KeyboardProxyBlocking<'static>,\n}\n\nimpl Keyboard {\n    fn new(path: &str) -> Result<Self, String> {\n        let connection = Connection::system().map_err(err_str)?;\n        let proxy = KeyboardProxyBlocking::builder(&connection)\n            .destination(DBUS_NAME.to_owned())\n            .map_err(err_str)?\n            .path(path.to_owned())\n            .map_err(err_str)?\n            .build()\n            .map_err(err_str)?;\n        Ok(Self { proxy })\n    }\n}\n\npub struct DaemonS76Power {\n    boards: Vec<Keyboard>,\n}\n\nimpl DaemonS76Power {\n    fn board(&self, board: BoardId) -> Result<&Keyboard, String> {\n        self.boards\n            .get(board.0 as usize)\n            .ok_or_else(|| fl!(\"no-board\"))\n    }\n}\n\nimpl DaemonS76Power {\n    pub fn new() -> Result<Self, String> {\n        let mut boards = Vec::new();\n\n        let connection = Connection::system().map_err(err_str)?;\n        let proxy = ObjectManagerProxy::builder(&connection)\n            .destination(DBUS_NAME)\n            .map_err(err_str)?\n            .path(\"/com/system76/PowerDaemon\")\n            .map_err(err_str)?\n            .build()\n            .map_err(err_str)?;\n        let objects = proxy.get_managed_objects().map_err(err_str)?;\n\n        for path in objects.keys() {\n            if path.starts_with(\"/com/system76/PowerDaemon/keyboard\") {\n                boards.push(Keyboard::new(path)?);\n            }\n        }\n\n        Ok(Self { boards })\n    }\n}\n\nimpl Daemon for DaemonS76Power {\n    fn boards(&self) -> Result<Vec<BoardId>, String> {\n        Ok((0..self.boards.len() as u128).map(BoardId).collect())\n    }\n\n    fn model(&self, _board: BoardId) -> Result<String, String> {\n        // XXX\n        Ok(\"system76/darp6\".to_string())\n    }\n\n    fn version(&self, _board: BoardId) -> Result<String, String> {\n        Err(\"Unimplemented\".to_string())\n    }\n\n    fn keymap_get(\n        &self,\n        _board: BoardId,\n        _layer: u8,\n        _output: u8,\n        _input: u8,\n    ) -> Result<u16, String> {\n        Err(\"Unimplemented\".to_string())\n    }\n\n    fn keymap_set(\n        &self,\n        _board: BoardId,\n        _layer: u8,\n        _output: u8,\n        _input: u8,\n        _value: u16,\n    ) -> Result<(), String> {\n        Err(\"Unimplemented\".to_string())\n    }\n\n    fn matrix_get(&self, _board: BoardId) -> Result<Matrix, String> {\n        Err(\"Unimplemented\".to_string())\n    }\n\n    fn benchmark(&self, _board: BoardId) -> Result<Benchmark, String> {\n        Err(\"Unimplemented\".to_string())\n    }\n\n    fn nelson(&self, _board: BoardId, _kind: NelsonKind) -> Result<Nelson, String> {\n        Err(\"Unimplemented\".to_string())\n    }\n\n    fn color(&self, board: BoardId, index: u8) -> Result<(u8, u8, u8), String> {\n        if index != 0xFF {\n            return Err(format!(\"Can't set color index {}\", index));\n        }\n        let color = self.board(board)?.proxy.color().map_err(err_str)?;\n        Ok(Rgb::parse(&color).map_or((0, 0, 0), |rgb| (rgb.r, rgb.g, rgb.b)))\n    }\n\n    fn set_color(&self, board: BoardId, index: u8, color: (u8, u8, u8)) -> Result<(), String> {\n        if index != 0xFF {\n            return Err(format!(\"Can't set color index {}\", index));\n        }\n        self.board(board)?\n            .proxy\n            .set_color(&Rgb::new(color.0, color.1, color.2).to_string())\n            .map_err(err_str)\n    }\n\n    fn max_brightness(&self, board: BoardId) -> Result<i32, String> {\n        self.board(board)?.proxy.max_brightness().map_err(err_str)\n    }\n\n    fn brightness(&self, board: BoardId, index: u8) -> Result<i32, String> {\n        if index != 0xFF {\n            return Err(format!(\"Can't set brightness index {}\", index));\n        }\n        self.board(board)?.proxy.brightness().map_err(err_str)\n    }\n\n    fn set_brightness(&self, board: BoardId, index: u8, brightness: i32) -> Result<(), String> {\n        if index != 0xFF {\n            return Err(format!(\"Can't set brightness index {}\", index));\n        }\n        self.board(board)?\n            .proxy\n            .set_brightness(brightness)\n            .map_err(err_str)\n    }\n\n    fn mode(&self, _board: BoardId, _layer: u8) -> Result<(u8, u8), String> {\n        Err(\"Unimplemented\".to_string())\n    }\n\n    fn set_mode(&self, _board: BoardId, _layer: u8, _mode: u8, _speed: u8) -> Result<(), String> {\n        Err(\"Unimplemented\".to_string())\n    }\n\n    fn led_save(&self, _board: BoardId) -> Result<(), String> {\n        Err(\"Unimplemented\".to_string())\n    }\n\n    fn refresh(&self) -> Result<(), String> {\n        Ok(())\n    }\n\n    fn set_no_input(&self, _board: BoardId, _no_input: bool) -> Result<(), String> {\n        Err(\"Unimplemented\".to_string())\n    }\n\n    fn exit(&self) -> Result<(), String> {\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "backend/src/daemon/server.rs",
    "content": "#[cfg(target_os = \"linux\")]\nuse ectool::AccessLpcLinux;\nuse ectool::{Access, AccessHid, Ec};\nuse hidapi::{DeviceInfo, HidApi};\nuse std::{\n    cell::{Cell, RefCell, RefMut},\n    collections::HashMap,\n    io::{self, BufRead, BufReader, Read, Write},\n    str,\n    thread::sleep,\n    time::Duration,\n};\nuse uuid::Uuid;\n\nuse super::{err_str, BoardId, Daemon, DaemonCommand};\nuse crate::{Benchmark, Matrix, Nelson, NelsonKind};\n\nconst QMK_RAW_USAGE_PAGE: u16 = 0xFF60;\nconst QMK_RAW_USAGE_ID: u16 = 0x61;\n\n#[allow(clippy::type_complexity)]\npub struct DaemonServer<R: Read + Send + 'static, W: Write + Send + 'static> {\n    hidapi: RefCell<Option<HidApi>>,\n    running: Cell<bool>,\n    read: BufReader<R>,\n    write: W,\n    boards: RefCell<HashMap<BoardId, (Ec<Box<dyn Access>>, Option<DeviceInfo>)>>,\n    board_ids: RefCell<Vec<BoardId>>,\n    nelson: RefCell<Option<Ec<AccessHid>>>,\n}\n\nimpl DaemonServer<io::Stdin, io::Stdout> {\n    pub fn new_stdio() -> Result<Self, String> {\n        Self::new(io::stdin(), io::stdout())\n    }\n}\n\nimpl<R: Read + Send + 'static, W: Write + Send + 'static> DaemonServer<R, W> {\n    pub fn new(read: R, write: W) -> Result<Self, String> {\n        #[cfg_attr(not(target_os = \"linux\"), allow(unused_mut))]\n        let mut boards = HashMap::new();\n        #[cfg_attr(not(target_os = \"linux\"), allow(unused_mut))]\n        let mut board_ids = Vec::new();\n\n        #[cfg(target_os = \"linux\")]\n        match unsafe { AccessLpcLinux::new(Duration::new(1, 0)) } {\n            Ok(access) => match unsafe { Ec::new(access) } {\n                Ok(ec) => {\n                    info!(\"Adding LPC EC\");\n                    let id = BoardId(Uuid::new_v4().as_u128());\n                    boards.insert(id, (ec.into_dyn(), None));\n                    board_ids.push(id);\n                }\n                Err(err) => {\n                    error!(\"Failed to probe LPC EC: {:?}\", err);\n                }\n            },\n            Err(err) => {\n                error!(\"Failed to access LPC EC: {:?}\", err);\n            }\n        }\n\n        //TODO: should we continue through HID errors?\n        let hidapi = match HidApi::new() {\n            Ok(api) => Some(api),\n            Err(err) => {\n                error!(\"Failed to list USB HID ECs: {:?}\", err);\n                None\n            }\n        };\n\n        Ok(Self {\n            hidapi: RefCell::new(hidapi),\n            running: Cell::new(true),\n            read: BufReader::new(read),\n            write,\n            boards: RefCell::new(boards),\n            board_ids: RefCell::new(board_ids),\n            nelson: RefCell::new(None),\n        })\n    }\n\n    fn have_device(&self, info: &DeviceInfo) -> bool {\n        for (_, i) in self.boards.borrow().values() {\n            if let Some(i) = i {\n                if (i.vendor_id(), i.product_id(), i.path())\n                    == (info.vendor_id(), info.product_id(), info.path())\n                {\n                    return true;\n                }\n            }\n        }\n        false\n    }\n\n    pub fn run(mut self) -> io::Result<()> {\n        println!(\"Daemon started\");\n\n        while self.running.get() {\n            let mut command_json = String::new();\n            self.read.read_line(&mut command_json)?;\n\n            let command = serde_json::from_str::<DaemonCommand>(&command_json)\n                .expect(\"failed to deserialize command\");\n            let response = self.dispatch_command_to_method(command);\n\n            //TODO: what to do if we fail to serialize result?\n            let mut result_json =\n                serde_json::to_string(&response).expect(\"failed to serialize result\");\n            result_json.push('\\n');\n            self.write.write_all(result_json.as_bytes())?;\n        }\n\n        Ok(())\n    }\n\n    fn board(&self, board: BoardId) -> Result<RefMut<Ec<Box<dyn Access>>>, String> {\n        let mut boards = self.boards.borrow_mut();\n        if boards.get_mut(&board).is_some() {\n            Ok(RefMut::map(boards, |x| &mut x.get_mut(&board).unwrap().0))\n        } else {\n            Err(\"failed to find board\".to_string())\n        }\n    }\n}\n\nimpl<R: Read + Send + 'static, W: Write + Send + 'static> Daemon for DaemonServer<R, W> {\n    fn boards(&self) -> Result<Vec<BoardId>, String> {\n        Ok(self.board_ids.borrow().clone())\n    }\n\n    fn model(&self, board: BoardId) -> Result<String, String> {\n        let mut ec = self.board(board)?;\n        let data_size = unsafe { ec.access().data_size() };\n        let mut data = vec![0; data_size];\n        let len = unsafe { ec.board(&mut data).map_err(err_str)? };\n        let board = str::from_utf8(&data[..len]).map_err(err_str)?;\n        Ok(board.to_string())\n    }\n\n    fn version(&self, board: BoardId) -> Result<String, String> {\n        let mut ec = self.board(board)?;\n        let data_size = unsafe { ec.access().data_size() };\n        let mut data = vec![0; data_size];\n        let len = unsafe { ec.version(&mut data).map_err(err_str)? };\n        let version = str::from_utf8(&data[..len]).map_err(err_str)?;\n        Ok(version.to_string())\n    }\n\n    fn keymap_get(&self, board: BoardId, layer: u8, output: u8, input: u8) -> Result<u16, String> {\n        let mut ec = self.board(board)?;\n        unsafe { ec.keymap_get(layer, output, input).map_err(err_str) }\n    }\n\n    fn keymap_set(\n        &self,\n        board: BoardId,\n        layer: u8,\n        output: u8,\n        input: u8,\n        value: u16,\n    ) -> Result<(), String> {\n        let mut ec = self.board(board)?;\n        unsafe { ec.keymap_set(layer, output, input, value).map_err(err_str) }\n    }\n\n    fn matrix_get(&self, board: BoardId) -> Result<Matrix, String> {\n        let mut ec = self.board(board)?;\n\n        let data_size = unsafe { ec.access().data_size() };\n        let mut data = vec![0; data_size];\n        unsafe { ec.matrix_get(&mut data).map_err(err_str)? };\n\n        let rows = data.remove(0) as usize;\n        let cols = data.remove(0) as usize;\n        Ok(Matrix::new(rows, cols, data.into_boxed_slice()))\n    }\n\n    fn benchmark(&self, _board: BoardId) -> Result<Benchmark, String> {\n        Benchmark::new().map_err(err_str)\n    }\n\n    fn nelson(&self, board: BoardId, kind: NelsonKind) -> Result<Nelson, String> {\n        if let Some(nelson) = &mut *self.nelson.borrow_mut() {\n            const DELAY_MS: u64 = 200;\n            info!(\"Nelson delay is {} ms\", DELAY_MS);\n            let delay = Duration::from_millis(DELAY_MS);\n\n            // Check if Nelson is already closed\n            if unsafe { nelson.led_get_value(0).map_err(err_str)?.0 > 0 } {\n                info!(\"Open Nelson\");\n                unsafe { nelson.led_set_value(0, 0).map_err(err_str)? };\n\n                info!(\"Sleep\");\n                sleep(delay);\n            }\n\n            info!(\"Close Nelson\");\n            unsafe { nelson.led_set_value(0, 1).map_err(err_str)? };\n\n            info!(\"Sleep\");\n            sleep(delay);\n\n            // Get pressed keys while nelson is closed\n            let matrix = self.matrix_get(board)?;\n\n            // Either missing or bouncing is set depending on test\n            let (mut missing, bouncing) = match kind {\n                NelsonKind::Normal => (matrix, Matrix::default()),\n                NelsonKind::Bouncing => (Matrix::default(), matrix),\n            };\n\n            // Missing must be inverted, since missing keys are not pressed\n            for row in 0..missing.rows() {\n                for col in 0..missing.cols() {\n                    let value = missing.get(row, col).unwrap_or(false);\n                    missing.set(row, col, !value);\n                }\n            }\n\n            info!(\"Open Nelson\");\n            unsafe { nelson.led_set_value(0, 0).map_err(err_str)? };\n\n            info!(\"Sleep\");\n            sleep(delay);\n\n            // Anything still pressed after nelson is opened is sticking\n            let sticking = self.matrix_get(board)?;\n\n            Ok(Nelson {\n                missing,\n                bouncing,\n                sticking,\n            })\n        } else {\n            Err(\"failed to find Nelson\".to_string())\n        }\n    }\n\n    fn color(&self, board: BoardId, index: u8) -> Result<(u8, u8, u8), String> {\n        let mut ec = self.board(board)?;\n        unsafe { ec.led_get_color(index) }.map_err(err_str)\n    }\n\n    fn set_color(&self, board: BoardId, index: u8, color: (u8, u8, u8)) -> Result<(), String> {\n        let mut ec = self.board(board)?;\n        unsafe {\n            ec.led_set_color(index, color.0, color.1, color.2)\n                .map_err(err_str)\n        }\n    }\n\n    fn max_brightness(&self, board: BoardId) -> Result<i32, String> {\n        let mut ec = self.board(board)?;\n        let index = if unsafe { ec.access().is::<AccessHid>() } {\n            0xf0\n        } else {\n            0xff\n        };\n        unsafe { ec.led_get_value(index) }\n            .map(|x| i32::from(x.1))\n            .map_err(err_str)\n    }\n\n    fn brightness(&self, board: BoardId, index: u8) -> Result<i32, String> {\n        let mut ec = self.board(board)?;\n        unsafe {\n            ec.led_get_value(index)\n                .map(|x| i32::from(x.0))\n                .map_err(err_str)\n        }\n    }\n\n    fn set_brightness(&self, board: BoardId, index: u8, brightness: i32) -> Result<(), String> {\n        let mut ec = self.board(board)?;\n        unsafe { ec.led_set_value(index, brightness as u8).map_err(err_str) }\n    }\n\n    fn mode(&self, board: BoardId, layer: u8) -> Result<(u8, u8), String> {\n        let mut ec = self.board(board)?;\n        unsafe { ec.led_get_mode(layer).map_err(err_str) }\n    }\n\n    fn set_mode(&self, board: BoardId, layer: u8, mode: u8, speed: u8) -> Result<(), String> {\n        let mut ec = self.board(board)?;\n        unsafe { ec.led_set_mode(layer, mode, speed).map_err(err_str) }\n    }\n\n    fn led_save(&self, board: BoardId) -> Result<(), String> {\n        let mut ec = self.board(board)?;\n        unsafe { ec.led_save().map_err(err_str) }\n    }\n\n    fn refresh(&self) -> Result<(), String> {\n        if let Some(api) = &mut *self.hidapi.borrow_mut() {\n            // Remove USB boards that are no longer attached\n            {\n                let mut boards = self.boards.borrow_mut();\n                let mut board_ids = self.board_ids.borrow_mut();\n\n                boards.retain(|_, (ec, _)| unsafe {\n                    !(ec.access().is::<AccessHid>() && ec.probe().is_err())\n                });\n                board_ids.retain(|i| boards.contains_key(i));\n            }\n\n            if let Err(err) = api.refresh_devices() {\n                error!(\"Failed to refresh hidapi devices: {}\", err);\n            }\n\n            for info in api.device_list() {\n                match (\n                    info.vendor_id(),\n                    info.product_id(),\n                    info.interface_number(),\n                    info.usage_page(),\n                    info.usage(),\n                ) {\n                    // System76\n                    (0x3384,\n                        // launch_1\n                        0x0001 |\n                        // launch_lite_1\n                        0x0005 |\n                        // launch_2\n                        0x0006 |\n                        // launch_heavy_1\n                        0x0007 |\n                        // launch_3\n                        0x0009 |\n                        // launch_heavy_3\n                        0x000A,\n                        interface, usage_page, usage)\n                        if is_qmk_raw_interface(interface, usage_page, usage) =>\n                    {\n                        // Skip if device already open\n                        if self.have_device(info) {\n                            continue;\n                        }\n\n                        match info.open_device(api) {\n                            Ok(device) => match AccessHid::new(device, 10, 1000) {\n                                Ok(access) => match unsafe { Ec::new(access) } {\n                                    Ok(ec) => {\n                                        info!(\"Adding USB HID EC at {:?}\", info.path());\n                                        let id = BoardId(Uuid::new_v4().as_u128());\n                                        self.boards\n                                            .borrow_mut()\n                                            .insert(id, (ec.into_dyn(), Some(info.clone())));\n                                        self.board_ids.borrow_mut().push(id);\n                                    }\n                                    Err(err) => error!(\n                                        \"Failed to probe USB HID EC at {:?}: {:?}\",\n                                        info.path(),\n                                        err\n                                    ),\n                                },\n                                Err(err) => error!(\n                                    \"Failed to access USB HID EC at {:?}: {:?}\",\n                                    info.path(),\n                                    err\n                                ),\n                            },\n                            Err(err) => {\n                                error!(\"Failed to open USB HID EC at {:?}: {:?}\", info.path(), err)\n                            }\n                        }\n                    }\n                    // System76 launch-nelson\n                    (0x3384, 0x0002, 0, _, _) => {\n                        if self.nelson.borrow().is_some() {\n                            continue;\n                        }\n\n                        match info.open_device(api) {\n                            Ok(device) => match AccessHid::new(device, 10, 1000) {\n                                Ok(access) => match unsafe { Ec::new(access) } {\n                                    Ok(ec) => {\n                                        info!(\"Adding Nelson at {:?}\", info.path());\n                                        *self.nelson.borrow_mut() = Some(ec);\n                                    }\n                                    Err(err) => error!(\n                                        \"Failed to probe Nelson at {:?}: {:?}\",\n                                        info.path(),\n                                        err\n                                    ),\n                                },\n                                Err(err) => error!(\n                                    \"Failed to access Nelson at {:?}: {:?}\",\n                                    info.path(),\n                                    err\n                                ),\n                            },\n                            Err(err) => {\n                                error!(\"Failed to open Nelson at {:?}: {:?}\", info.path(), err)\n                            }\n                        }\n                    }\n                    _ => (),\n                }\n            }\n        }\n\n        Ok(())\n    }\n\n    fn set_no_input(&self, board: BoardId, no_input: bool) -> Result<(), String> {\n        let mut ec = self.board(board)?;\n        unsafe { ec.set_no_input(no_input) }.map_err(err_str)\n    }\n\n    fn exit(&self) -> Result<(), String> {\n        self.running.set(false);\n        Ok(())\n    }\n}\n\n// Getting the interface number isn't working on macOS 13.3\n// (https://github.com/libusb/hidapi/pull/530)\n// And `usage_page` and `usage` seem to have issues on Linux with older versions of `hidapi`.\nfn is_qmk_raw_interface(interface: i32, usage_page: u16, usage: u16) -> bool {\n    if cfg!(target_os = \"macos\") {\n        (usage_page, usage) == (QMK_RAW_USAGE_PAGE, QMK_RAW_USAGE_ID)\n    } else {\n        interface == 1\n    }\n}\n"
  },
  {
    "path": "backend/src/deref_cell.rs",
    "content": "use once_cell::unsync::OnceCell;\n\n/// Wrapper around `OnceCell` implementing `Deref`, and thus also panicking\n/// when not set (or set twice).\n///\n/// To be used in place of `gtk::TemplateChild`, but without xml.\npub struct DerefCell<T>(OnceCell<T>);\n\nimpl<T> DerefCell<T> {\n    pub fn is_some(&self) -> bool {\n        self.0.get().is_some()\n    }\n\n    #[track_caller]\n    pub fn set(&self, value: T) {\n        if self.0.set(value).is_err() {\n            panic!(\"Initialized twice\");\n        }\n    }\n}\n\nimpl<T> Default for DerefCell<T> {\n    fn default() -> Self {\n        Self(OnceCell::default())\n    }\n}\n\nimpl<T> std::ops::Deref for DerefCell<T> {\n    type Target = T;\n\n    #[track_caller]\n    fn deref(&self) -> &T {\n        self.0.get().unwrap()\n    }\n}\n"
  },
  {
    "path": "backend/src/key.rs",
    "content": "use std::sync::{\n    atomic::{AtomicU16, Ordering},\n    Mutex,\n};\n\nuse crate::{Board, BoardEvent, Daemon, Hs, PhysicalLayoutKey, Rect, Rgb, WeakBoard};\n\n#[derive(Debug)]\npub struct Key {\n    pub(crate) board: WeakBoard,\n    /// Logical position (row, column)\n    pub logical: (u8, u8),\n    /// Logical name (something like K01, where 0 is the row and 1 is the column)\n    pub logical_name: String,\n    /// Physical position and size\n    pub physical: Rect,\n    /// Physical key name (what is printed on the keycap)\n    pub physical_name: String,\n    /// Electrical mapping (output, input)\n    pub electrical: (u8, u8),\n    /// Electrical name (output, input)\n    pub electrical_name: String,\n    /// LED indexes\n    pub leds: Vec<u8>,\n    /// LED name\n    pub led_name: String,\n    led_color: Mutex<Option<Hs>>,\n    /// Currently loaded scancodes and their names\n    scancodes: Vec<AtomicU16>,\n    /// Background color\n    pub background_color: Rgb,\n}\n\nimpl Key {\n    pub(crate) fn new(\n        daemon: &dyn Daemon,\n        board: &Board,\n        physical_key: &PhysicalLayoutKey,\n    ) -> Self {\n        let logical = physical_key.logical;\n        let logical_name = physical_key.logical_name();\n        let physical = physical_key.physical;\n        let physical_name = physical_key.physical_name.clone();\n        let background_color = physical_key.background_color;\n\n        debug!(\"Key {}, {} = {:?}\", physical.x, physical.y, physical_name);\n\n        debug!(\"  Logical: {:?}\", logical);\n        debug!(\"  Logical Name: {}\", logical_name);\n\n        let electrical = *board\n            .layout()\n            .layout\n            .get(logical_name.as_str())\n            //.expect(\"Failed to find electrical mapping\");\n            .unwrap_or(&(0, 0));\n        debug!(\"  Electrical: {:?}\", electrical);\n\n        let leds = board\n            .layout()\n            .leds\n            .get(logical_name.as_str())\n            .map_or(Vec::new(), |x| x.clone());\n        debug!(\"  LEDs: {:?}\", leds);\n\n        let mut led_name = String::new();\n        for led in leds.iter() {\n            if !led_name.is_empty() {\n                led_name.push_str(\", \");\n            }\n            led_name.push_str(&led.to_string());\n        }\n\n        let mut scancodes = Vec::new();\n        for layer in 0..board.layout().meta.num_layers {\n            debug!(\"  Layer {}\", layer);\n            let scancode = match daemon.keymap_get(board.board(), layer, electrical.0, electrical.1)\n            {\n                Ok(value) => value,\n                Err(err) => {\n                    error!(\"Failed to read scancode: {:?}\", err);\n                    0\n                }\n            };\n            debug!(\"    Scancode: {:04X}\", scancode);\n            debug!(\n                \"    Scancode Name: {:?}\",\n                board.layout().scancode_to_name(scancode)\n            );\n\n            scancodes.push(AtomicU16::new(scancode));\n        }\n\n        let mut led_color = None;\n        if board.layout().meta.has_mode && !leds.is_empty() {\n            match daemon.color(board.board(), leds[0]) {\n                Ok((0, 0, 0)) => {}\n                Ok((r, g, b)) => led_color = Some(Rgb::new(r, g, b).to_hs_lossy()),\n                Err(err) => error!(\"error getting key color: {}\", err),\n            }\n        }\n\n        Self {\n            board: board.downgrade(),\n            logical,\n            logical_name,\n            physical,\n            physical_name,\n            electrical,\n            electrical_name: format!(\"{}, {}\", electrical.0, electrical.1),\n            leds,\n            led_name,\n            led_color: Mutex::new(led_color),\n            scancodes,\n            background_color,\n        }\n    }\n\n    fn board(&self) -> Board {\n        self.board.upgrade().unwrap()\n    }\n\n    pub fn pressed(&self) -> bool {\n        self.board()\n            .matrix()\n            .get(self.electrical.0 as usize, self.electrical.1 as usize)\n            .unwrap_or(false)\n    }\n\n    pub fn color(&self) -> Option<Hs> {\n        *self.led_color.lock().unwrap()\n    }\n\n    pub async fn set_color(&self, color: Option<Hs>) -> Result<(), String> {\n        let board = self.board();\n        let Rgb { r, g, b } = color.map_or(Rgb::new(0, 0, 0), Hs::to_rgb);\n        for index in &self.leds {\n            board\n                .thread_client()\n                .set_color(board.board(), *index, (r, g, b))\n                .await?;\n        }\n        *self.led_color.lock().unwrap() = color;\n        board.set_leds_changed();\n        Ok(())\n    }\n\n    pub fn get_scancode(&self, layer: usize) -> Option<(u16, String)> {\n        let board = self.board();\n        let scancode = self.scancodes.get(layer)?.load(Ordering::SeqCst);\n        let scancode_name = match board.layout().scancode_to_name(scancode) {\n            Some(some) => some,\n            None => String::new(),\n        };\n        Some((scancode, scancode_name))\n    }\n\n    pub async fn set_scancode(&self, layer: usize, scancode_name: &str) -> Result<(), String> {\n        let board = self.board();\n        let scancode = board\n            .layout()\n            .scancode_from_name(scancode_name)\n            .ok_or_else(|| format!(\"Unable to find scancode '{}'\", scancode_name))?;\n        board\n            .thread_client()\n            .keymap_set(\n                board.board(),\n                layer as u8,\n                self.electrical.0,\n                self.electrical.1,\n                scancode,\n            )\n            .await?;\n        self.scancodes[layer].store(scancode, Ordering::SeqCst);\n        board.send_event(BoardEvent::KeymapChanged);\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "backend/src/keymap.rs",
    "content": "use serde::{Deserialize, Deserializer, Serialize, Serializer};\nuse std::{\n    collections::BTreeMap,\n    convert::TryFrom,\n    io::{Read, Write},\n};\n\nuse crate::Hs;\n\nmod hs_serde {\n    use super::*;\n\n    pub fn serialize<S: Serializer>(color: &Hs, serializer: S) -> Result<S::Ok, S::Error> {\n        color.to_ints().serialize(serializer)\n    }\n\n    pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Hs, D::Error> {\n        let (h, s) = <(u8, u8)>::deserialize(deserializer)?;\n        Ok(Hs::from_ints(h, s))\n    }\n}\n\nmod hs_map_serde {\n    use super::*;\n\n    pub fn serialize<S: Serializer>(\n        map: &BTreeMap<String, Option<Hs>>,\n        serializer: S,\n    ) -> Result<S::Ok, S::Error> {\n        let map = map\n            .iter()\n            .map(|(k, hs)| (k, hs.map(|hs| hs.to_ints())))\n            .collect::<BTreeMap<_, _>>();\n        map.serialize(serializer)\n    }\n\n    pub fn deserialize<'de, D: Deserializer<'de>>(\n        deserializer: D,\n    ) -> Result<BTreeMap<String, Option<Hs>>, D::Error> {\n        let map = <BTreeMap<String, Option<(u8, u8)>>>::deserialize(deserializer)?;\n        Ok(map\n            .into_iter()\n            .map(|(k, v)| (k, v.map(|(h, s)| Hs::from_ints(h, s))))\n            .collect())\n    }\n}\n\n#[derive(Clone, Debug, Serialize, Deserialize)]\npub struct KeyMapLayer {\n    pub mode: Option<(u8, u8)>,\n    pub brightness: i32,\n    #[serde(with = \"hs_serde\")]\n    pub color: Hs,\n}\n\n#[derive(Clone, Debug, Serialize, Deserialize)]\npub struct KeyMap {\n    pub model: String,\n    pub version: u8,\n    pub map: BTreeMap<String, Vec<String>>,\n    #[serde(with = \"hs_map_serde\")]\n    pub key_leds: BTreeMap<String, Option<Hs>>,\n    pub layers: Vec<KeyMapLayer>,\n}\n\nimpl KeyMap {\n    /// Parse layout from json file\n    pub fn from_reader<R: Read>(rdr: R) -> serde_json::Result<Self> {\n        serde_json::from_reader(rdr)\n    }\n\n    /// Write layout to json file, pretty printed\n    pub fn to_writer_pretty<W: Write>(&self, wtr: W) -> serde_json::Result<()> {\n        serde_json::to_writer_pretty(wtr, self)\n    }\n\n    /// Write layout to json string, pretty printed\n    pub fn to_string_pretty(&self) -> String {\n        serde_json::to_string_pretty(self).unwrap()\n    }\n}\n\nimpl TryFrom<&str> for KeyMap {\n    type Error = serde_json::Error;\n    fn try_from(s: &str) -> Result<Self, serde_json::Error> {\n        serde_json::from_str(s)\n    }\n}\n"
  },
  {
    "path": "backend/src/layer.rs",
    "content": "use std::sync::{\n    atomic::{AtomicI32, Ordering},\n    Mutex,\n};\n\nuse crate::{Board, Daemon, Hs, Mode, Rgb, WeakBoard};\n\n#[derive(Debug)]\npub struct Layer {\n    layer: u8,\n    index: u8,\n    board: WeakBoard,\n    pub(crate) mode: Mutex<Option<(u8, u8)>>,\n    brightness: AtomicI32,\n    color: Mutex<Hs>,\n}\n\nimpl Layer {\n    pub(crate) fn new(daemon: &dyn Daemon, board: &Board, layer: u8) -> Self {\n        let index = if board.layout().meta.has_per_layer {\n            0xf0 + layer\n        } else {\n            0xff\n        };\n        let mode = if board.layout().meta.has_mode {\n            daemon\n                .mode(board.board(), layer)\n                .map(Some)\n                .unwrap_or_else(|err| {\n                    error!(\"Error getting layer mode: {}\", err);\n                    None\n                })\n        } else {\n            None\n        };\n        let brightness = daemon\n            .brightness(board.board(), index)\n            .unwrap_or_else(|err| {\n                error!(\"error getting layer brightness: {}\", err);\n                0\n            });\n        let color = daemon\n            .color(board.board(), index)\n            .map(|color| {\n                if index == 0xff {\n                    Rgb::new(color.0, color.1, color.2).to_hs_lossy()\n                } else {\n                    Hs::from_ints(color.0, color.1)\n                }\n            })\n            .unwrap_or_else(|err| {\n                error!(\"error getting layer color: {}\", err);\n                Hs::new(0., 0.)\n            });\n        Self {\n            layer,\n            index,\n            board: board.downgrade(),\n            mode: Mutex::new(mode),\n            brightness: AtomicI32::new(brightness),\n            color: Mutex::new(color),\n        }\n    }\n\n    fn board(&self) -> Board {\n        self.board.upgrade().unwrap()\n    }\n\n    /// Get the current mode and speed. `None` if not supported by board.\n    pub fn mode(&self) -> Option<(&'static Mode, u8)> {\n        let (index, speed) = (*self.mode.lock().unwrap())?;\n        Some((Mode::from_index(index)?, speed))\n    }\n\n    pub async fn set_mode(&self, mode: &Mode, speed: u8) -> Result<(), String> {\n        let board = self.board();\n        board\n            .thread_client()\n            .set_mode(board.board(), self.layer, mode.index, speed)\n            .await?;\n        *self.mode.lock().unwrap() = Some((mode.index, speed));\n        board.set_leds_changed();\n        Ok(())\n    }\n\n    /// Get the current brightness\n    pub fn brightness(&self) -> i32 {\n        self.brightness.load(Ordering::SeqCst)\n    }\n\n    pub async fn set_brightness(&self, brightness: i32) -> Result<(), String> {\n        let board = self.board();\n        board\n            .thread_client()\n            .set_brightness(board.board(), self.index, brightness)\n            .await?;\n        self.brightness.store(brightness, Ordering::SeqCst);\n        board.set_leds_changed();\n        Ok(())\n    }\n\n    /// Get the current color\n    pub fn color(&self) -> Hs {\n        *self.color.lock().unwrap()\n    }\n\n    pub async fn set_color(&self, hs: Hs) -> Result<(), String> {\n        let board = self.board();\n        let color = if self.index == 0xff {\n            let Rgb { r, g, b } = hs.to_rgb();\n            (r, g, b)\n        } else {\n            let (h, s) = hs.to_ints();\n            (h, s, 0)\n        };\n        board\n            .thread_client()\n            .set_color(board.board(), self.index, color)\n            .await?;\n        *self.color.lock().unwrap() = hs;\n        board.set_leds_changed();\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "backend/src/layout/meta.rs",
    "content": "use crate::Rgb;\nuse serde::Deserialize;\n\nfn num_layers_default() -> u8 {\n    2\n}\n\n/// Metadata for keyboard\n#[derive(Debug, Deserialize)]\npub struct Meta {\n    /// Display name for keyboard\n    pub display_name: String,\n    /// Keyboard has per-key controllable LEDs supporting various modes\n    #[serde(default)]\n    pub has_mode: bool,\n    /// LED settings are per-layer, not for the whole keyboard\n    #[serde(default)]\n    pub has_per_layer: bool,\n    /// Has LED with brightness\n    pub has_brightness: bool,\n    /// Has LED with color (i.e. not monochrome)\n    pub has_color: bool,\n    /// Supports mod-tap bindings (assumes QMK mod-tap encoding)\n    #[serde(default)]\n    pub has_mod_tap: bool,\n    #[serde(default)]\n    /// Disable \"Invert F Keys\" option\n    pub no_fn_f: bool,\n    /// Number or layers; e.g. 2 where layer 2 is used when `Fn` is held\n    #[serde(default = \"num_layers_default\")]\n    pub num_layers: u8,\n    pub pressed_color: Rgb,\n    #[serde(default)]\n    pub is_qmk: bool,\n}\n"
  },
  {
    "path": "backend/src/layout/mod.rs",
    "content": "use cascade::cascade;\nuse regex::Regex;\nuse std::{collections::HashMap, convert::TryFrom, fs, path::Path, str::FromStr};\n\nmod meta;\nuse once_cell::sync::Lazy;\nmod physical_layout;\npub use self::meta::Meta;\npub(crate) use physical_layout::{PhysicalLayout, PhysicalLayoutKey};\n\nuse crate::KeyMap;\n\n// Merge date of https://github.com/system76/ec/pull/229\n// Before this, `PAUSE` will not work.\nconst EC_PAUSE_DATE: (u16, u16, u16) = (2022, 5, 23);\n// https://github.com/system76/ec/pull/263\nconst EC_FNLOCK_DATE: (u16, u16, u16) = (2023, 8, 1);\n\nconst QK_MOD_TAP_LEGACY: u16 = 0x6000;\nconst QK_MOD_TAP_MAX_LEGACY: u16 = 0x7FFF;\nconst QK_MOD_TAP: u16 = 0x2000;\nconst QK_MOD_TAP_MAX: u16 = 0x3FFF;\n\npub static MOD_TAP_MODS: Lazy<HashMap<&str, u16>> = Lazy::new(|| {\n    cascade! {\n        HashMap::new();\n        ..insert(\"LEFT_CTRL\", 0x01);\n        ..insert(\"LEFT_SHIFT\", 0x02);\n        ..insert(\"LEFT_ALT\", 0x04);\n        ..insert(\"LEFT_SUPER\", 0x08);\n        ..insert(\"RIGHT_CTRL\", 0x11);\n        ..insert(\"RIGHT_SHIFT\", 0x12);\n        ..insert(\"RIGHT_ALT\", 0x14);\n        ..insert(\"RIGHT_SUPER\", 0x18);\n    }\n});\n\n#[derive(Debug)]\npub struct Layout {\n    /// Metadata for keyboard\n    pub meta: Meta,\n    /// Default keymap for this keyboard\n    pub default: KeyMap,\n    keymap: HashMap<String, u16>,\n    scancode_names: HashMap<u16, String>,\n    pub(crate) physical: PhysicalLayout,\n    pub(crate) layout: HashMap<String, (u8, u8)>,\n    pub(crate) leds: HashMap<String, Vec<u8>>,\n    use_legacy_scancodes: bool,\n}\n\nmacro_rules! keyboards {\n    ($( ($board:expr, $keyboard:expr, $is_qmk:expr) ),* $(,)?) => {\n        fn layout_data(board: &str, use_legacy_scancodes: bool) -> Option<(&'static str, &'static str, &'static str, &'static str, &'static str, &'static str)> {\n            match board {\n                $(\n                $board => {\n                    let meta_json =\n                        include_str!(concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/../layouts/\", $board, \"/meta.json\"));\n                    let default_json =\n                        include_str!(concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/../layouts/\", $board, \"/default.json\"));\n                    let keymap_json = if use_legacy_scancodes && $is_qmk {\n                        include_str!(concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/../layouts/keymap/qmk_legacy.json\"))\n                    } else if $is_qmk {\n                        include_str!(concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/../layouts/keymap/qmk.json\"))\n                    } else {\n                        include_str!(concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/../layouts/keymap/ec.json\"))\n                    };\n                    let layout_json =\n                        include_str!(concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/../layouts/keyboards/\", $keyboard, \"/layout.json\"));\n                    let leds_json =\n                        include_str!(concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/../layouts/keyboards/\", $keyboard, \"/leds.json\"));\n                    let physical_json =\n                        include_str!(concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/../layouts/keyboards/\", $keyboard, \"/physical.json\"));\n                    Some((meta_json, default_json, keymap_json, layout_json, leds_json, physical_json))\n                }\n                )*\n                _ => None\n            }\n        }\n\n        /// Names of board layouts that can be opened with `Layout::from_board`\n        pub fn layouts() -> &'static [&'static str] {\n            &[$( $board ),*]\n        }\n    };\n}\n\n// Calls the `keyboards!` macro\ninclude!(concat!(env!(\"OUT_DIR\"), \"/keyboards.rs\"));\n\nimpl Layout {\n    #[allow(clippy::too_many_arguments)]\n    pub fn from_data(\n        board: &str,\n        meta_json: &str,\n        default_json: &str,\n        keymap_json: &str,\n        layout_json: &str,\n        leds_json: &str,\n        physical_json: &str,\n        version: &str,\n        use_legacy_scancodes: bool,\n    ) -> Self {\n        let meta: Meta = serde_json::from_str(meta_json).unwrap();\n        let mut default = KeyMap::try_from(default_json).unwrap();\n\n        let has_pause_scancode = if meta.is_qmk {\n            true\n        } else {\n            parse_ec_date(version).map_or(true, |date| date >= EC_PAUSE_DATE)\n        };\n        if !has_pause_scancode {\n            keymap_remove_pause(&mut default);\n        }\n\n        let has_fnlock_scancode = if meta.is_qmk {\n            false\n        } else {\n            parse_ec_date(version).map_or(true, |date| date >= EC_FNLOCK_DATE)\n        };\n        if !has_fnlock_scancode {\n            keymap_remove_fnlock(&mut default);\n        }\n\n        let (keymap, scancode_names) = parse_keymap_json(\n            keymap_json,\n            board,\n            &meta,\n            has_pause_scancode,\n            has_fnlock_scancode,\n        );\n        let layout = serde_json::from_str(layout_json).unwrap();\n        let leds = serde_json::from_str(leds_json).unwrap();\n        let physical = PhysicalLayout::from_str(physical_json);\n        Self {\n            meta,\n            default,\n            keymap,\n            scancode_names,\n            physical,\n            layout,\n            leds,\n            use_legacy_scancodes,\n        }\n    }\n\n    #[allow(dead_code)]\n    pub fn from_dir<P: AsRef<Path>>(board: &str, dir: P) -> Self {\n        let dir = dir.as_ref();\n\n        let meta_json =\n            fs::read_to_string(dir.join(\"meta.json\")).expect(\"Failed to load meta.json\");\n        let default_json =\n            fs::read_to_string(dir.join(\"default.json\")).expect(\"Failed to load default.json\");\n        let keymap_json =\n            fs::read_to_string(dir.join(\"keymap.json\")).expect(\"Failed to load keymap.json\");\n        let layout_json =\n            fs::read_to_string(dir.join(\"layout.json\")).expect(\"Failed to load layout.json\");\n        let leds_json =\n            fs::read_to_string(dir.join(\"leds.json\")).expect(\"Failed to load leds.json\");\n        let physical_json =\n            fs::read_to_string(dir.join(\"physical.json\")).expect(\"Failed to load physical.json\");\n\n        Self::from_data(\n            board,\n            &meta_json,\n            &default_json,\n            &keymap_json,\n            &layout_json,\n            &leds_json,\n            &physical_json,\n            \"dummy\",\n            false,\n        )\n    }\n\n    pub fn from_board(board: &str, version: &str) -> Option<Self> {\n        let use_legacy_scancodes = version.contains(\"0.7.103\")\n            || version.contains(\"0.7.104\")\n            || version.contains(\"0.12.20\");\n        layout_data(board, use_legacy_scancodes).map(\n            |(meta_json, default_json, keymap_json, layout_json, leds_json, physical_json)| {\n                Self::from_data(\n                    board,\n                    meta_json,\n                    default_json,\n                    keymap_json,\n                    layout_json,\n                    leds_json,\n                    physical_json,\n                    version,\n                    use_legacy_scancodes,\n                )\n            },\n        )\n    }\n\n    /// Get the scancode number corresponding to a name\n    pub fn scancode_to_name(&self, scancode: u16) -> Option<String> {\n        if self.meta.is_qmk {\n            let (qk_mod_tap, qk_mod_tap_max) = if self.use_legacy_scancodes {\n                (QK_MOD_TAP_LEGACY, QK_MOD_TAP_MAX_LEGACY)\n            } else {\n                (QK_MOD_TAP, QK_MOD_TAP_MAX)\n            };\n            if scancode >= qk_mod_tap && scancode < qk_mod_tap_max {\n                let mod_ = (scancode >> 8) & 0x1f;\n                let kc = scancode & 0xff;\n                let mod_name = MOD_TAP_MODS.iter().find(|(_, v)| **v == mod_)?.0;\n                let kc_name = self.scancode_names.get(&kc)?;\n                return Some(format!(\"MT({}, {})\", mod_name, kc_name));\n            }\n        }\n        self.scancode_names.get(&scancode).cloned()\n    }\n\n    /// Get the name corresponding to a scancode number\n    pub fn scancode_from_name(&self, name: &str) -> Option<u16> {\n        if self.meta.is_qmk {\n            // Check if mod-tap\n            let mt_re = Regex::new(\"MT\\\\(([^()]+), ([^()]+)\\\\)\").unwrap();\n            if let Some(captures) = mt_re.captures(name) {\n                let qk_mod_tap = if self.use_legacy_scancodes {\n                    QK_MOD_TAP_LEGACY\n                } else {\n                    QK_MOD_TAP\n                };\n                let mod_ = *MOD_TAP_MODS.get(&captures.get(1).unwrap().as_str())?;\n                let kc = *self.keymap.get(captures.get(2).unwrap().as_str())?;\n                return Some(qk_mod_tap | ((mod_ & 0x1f) << 8) | (kc & 0xff));\n            }\n        }\n        self.keymap.get(name).copied()\n    }\n\n    pub fn f_keys(&self) -> impl Iterator<Item = &str> {\n        self.default.map.iter().filter_map(|(k, v)| {\n            if let Some(num) = v[0].strip_prefix('F') {\n                if num.parse::<u8>().is_ok() {\n                    return Some(k.as_str());\n                }\n            }\n            None\n        })\n    }\n\n    pub fn layout(&self) -> &HashMap<String, (u8, u8)> {\n        &self.layout\n    }\n}\n\nfn parse_keymap_json(\n    keymap_json: &str,\n    board: &str,\n    meta: &Meta,\n    has_pause_scancode: bool,\n    has_fnlock_scancode: bool,\n) -> (HashMap<String, u16>, HashMap<u16, String>) {\n    let mut keymap: HashMap<String, u16> = serde_json::from_str(keymap_json).unwrap();\n\n    // Filter out keycodes that aren't relevant to this particular model\n    // TODO: Support bonw backlight over USB?\n    if meta.has_color || board == \"system76/bonw14\" || board == \"system76/bonw15\" {\n        keymap.remove(\"KBD_BKL\");\n    } else if meta.has_brightness {\n        keymap.remove(\"KBD_COLOR\");\n    } else {\n        for i in [\"KBD_COLOR\", \"KBD_DOWN\", \"KBD_UP\", \"KBD_BKL\", \"KBD_TOGGLE\"] {\n            keymap.remove(i);\n        }\n    }\n\n    if !has_pause_scancode {\n        keymap.remove(\"PAUSE\");\n    }\n    if !has_fnlock_scancode {\n        keymap.remove(\"FNLOCK\");\n    }\n\n    // Generate reverse mapping, from scancode to names\n    let mut scancode_names = HashMap::new();\n    for (scancode_name, scancode) in &keymap {\n        scancode_names.insert(*scancode, scancode_name.clone());\n    }\n\n    (keymap, scancode_names)\n}\n\nfn parse_ec_date(version: &str) -> Option<(u16, u16, u16)> {\n    let groups = Regex::new(r\"^(\\d+)-(\\d+)-(\\d+)_\")\n        .unwrap()\n        .captures(version)?;\n    let mut groups = groups\n        .iter()\n        .skip(1)\n        .map(|g| u16::from_str(g.unwrap().as_str()).unwrap());\n    Some((\n        groups.next().unwrap(),\n        groups.next().unwrap(),\n        groups.next().unwrap(),\n    ))\n}\n\nfn keymap_remove_pause(keymap: &mut KeyMap) {\n    for values in keymap.map.values_mut() {\n        if values.get(1).map(String::as_str) == Some(\"PAUSE\") {\n            // Change `PAUSE` on layer 1 to match layer 0\n            values[1] = values[0].clone();\n        }\n    }\n}\n\nfn keymap_remove_fnlock(keymap: &mut KeyMap) {\n    for values in keymap.map.values_mut() {\n        if values.get(1).map(String::as_str) == Some(\"FNLOCK\") {\n            // Change `FNLOCK` on layer 1 to match layer 0\n            values[1] = values[0].clone();\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::{collections::HashSet, fs, io};\n\n    const VERSIONS: [&str; 3] = [\"0.7.103\", \"0.7.104\", \"0.19.12\"];\n\n    #[test]\n    fn layout_from_board() {\n        for i in layouts() {\n            for version in VERSIONS {\n                Layout::from_board(i, version).unwrap();\n            }\n        }\n    }\n\n    #[test]\n    fn default_keys_exist() {\n        for i in layouts() {\n            for version in VERSIONS {\n                let mut missing = HashSet::new();\n                let layout = Layout::from_board(i, version).unwrap();\n                for j in layout.default.map.values().flatten() {\n                    if !layout.keymap.keys().any(|x| x == j) {\n                        missing.insert(j.to_owned());\n                    }\n                }\n                assert_eq!(missing, HashSet::new(), \"Mssing in keymap for {}\", i);\n            }\n        }\n    }\n\n    #[test]\n    fn qmk_has_ec_keycodes() {\n        for version in VERSIONS {\n            let layout_ec = Layout::from_board(\"system76/darp6\", version).unwrap();\n            let layout_qmk = Layout::from_board(\"system76/launch_1\", version).unwrap();\n            for k in layout_ec.keymap.keys() {\n                if k == \"KBD_COLOR\"\n                    || k == \"KBD_BKL\"\n                    || k == \"TOUCHPAD\"\n                    || k == \"DISPLAY_TOGGLE\"\n                    || k == \"DISPLAY_MODE\"\n                    || k == \"FAN_TOGGLE\"\n                    || k == \"CAMERA_TOGGLE\"\n                    || k == \"AIRPLANE_MODE\"\n                    || k == \"MIC_MUTE\"\n                    || k == \"FNLOCK\"\n                {\n                    continue;\n                }\n                assert_eq!(layout_qmk.keymap.keys().find(|x| x == &k), Some(k));\n            }\n        }\n    }\n\n    #[test]\n    fn color_brightness_keycodes() {\n        const VERSION: &str = \"0.19.12\";\n\n        let layout_no_color = Layout::from_board(\"system76/lemp10\", VERSION).unwrap();\n        assert!(\n            layout_no_color.keymap.contains_key(\"KBD_BKL\")\n                && !layout_no_color.keymap.contains_key(\"KBD_COLOR\")\n        );\n\n        let layout_color = Layout::from_board(\"system76/gaze15\", VERSION).unwrap();\n        assert!(\n            layout_color.keymap.contains_key(\"KBD_COLOR\")\n                && !layout_color.keymap.contains_key(\"KBD_BKL\")\n        );\n\n        let layout_bonw = Layout::from_board(\"system76/bonw14\", VERSION).unwrap();\n        assert!(\n            layout_bonw.keymap.contains_key(\"KBD_COLOR\")\n                && !layout_bonw.keymap.contains_key(\"KBD_BKL\")\n        );\n    }\n\n    #[test]\n    fn has_all_layouts_in_dir() -> io::Result<()> {\n        let layouts = layouts();\n        for i in fs::read_dir(\"../layouts/system76\")? {\n            let i = i?;\n            if i.file_type()?.is_dir() {\n                let name = format!(\"system76/{}\", i.file_name().into_string().unwrap());\n                assert!(\n                    layouts.contains(&name.as_str()),\n                    \"{} not listed in {}\",\n                    name,\n                    file!()\n                );\n            }\n        }\n        Ok(())\n    }\n\n    #[test]\n    fn physical_layout_leds_logical() {\n        for i in layouts() {\n            for version in VERSIONS {\n                let layout = Layout::from_board(i, version).unwrap();\n                let logical_in_physical = layout\n                    .physical\n                    .keys\n                    .iter()\n                    .map(|i| i.logical_name())\n                    .collect::<HashSet<_>>();\n                let logical_in_layout = layout.layout.keys().cloned().collect::<HashSet<_>>();\n                let logical_in_leds = layout.layout.keys().cloned().collect::<HashSet<_>>();\n                assert_eq!(\n                    &logical_in_physical - &logical_in_layout,\n                    HashSet::new(),\n                    \"{}\",\n                    i\n                );\n                assert_eq!(\n                    &logical_in_layout - &logical_in_physical,\n                    HashSet::new(),\n                    \"{}\",\n                    i\n                );\n                assert_eq!(\n                    &logical_in_physical - &logical_in_leds,\n                    HashSet::new(),\n                    \"{}\",\n                    i\n                );\n                assert_eq!(\n                    &logical_in_leds - &logical_in_physical,\n                    HashSet::new(),\n                    \"{}\",\n                    i\n                );\n            }\n        }\n    }\n\n    #[test]\n    fn layout_has_f_keys() {\n        for i in layouts() {\n            if *i == \"system76/launch_lite_1\" {\n                continue;\n            }\n\n            for version in VERSIONS {\n                let layout = Layout::from_board(i, version).unwrap();\n                assert_eq!(layout.f_keys().count(), 12);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "backend/src/layout/physical_layout.rs",
    "content": "//! Serde based deserialization for physical.json\n//! From <http://www.keyboard-layout-editor.com>\nuse serde::Deserialize;\nuse std::char;\n\nuse crate::{Rect, Rgb};\n\n#[allow(dead_code)]\n#[derive(Debug)]\npub(crate) struct PhysicalLayout {\n    pub meta: PhysicalLayoutMeta,\n    pub keys: Vec<PhysicalLayoutKey>,\n}\n\nimpl PhysicalLayout {\n    pub fn from_str(physical_json: &str) -> Self {\n        let json = serde_json::from_str::<PhysicalLayoutJson>(physical_json).unwrap();\n\n        let mut keys = Vec::new();\n\n        let mut row_i = 0;\n        let mut col_i = 0;\n        let mut physical = Rect::new(0.0, 0.0, 1.0, 1.0);\n        let mut background_color = Rgb::new(0xcc, 0xcc, 0xcc);\n        let mut meta = None;\n\n        for entry in json.0 {\n            match entry {\n                PhysicalLayoutEntry::Meta(data) => {\n                    meta = Some(data);\n                }\n                PhysicalLayoutEntry::Row(row) => {\n                    for i in &row.0 {\n                        match i {\n                            PhysicalKeyEnum::Meta(meta) => {\n                                debug!(\"Key metadata {:?}\", meta);\n                                physical.x += meta.x;\n                                physical.y -= meta.y;\n                                physical.w = meta.w.unwrap_or(physical.w);\n                                physical.h = meta.h.unwrap_or(physical.h);\n                                background_color = meta.c.unwrap_or(background_color);\n                            }\n                            PhysicalKeyEnum::Name(name) => {\n                                keys.push(PhysicalLayoutKey {\n                                    logical: (row_i as u8, col_i as u8),\n                                    physical,\n                                    physical_name: name.clone(),\n                                    background_color,\n                                });\n\n                                physical.x += physical.w;\n\n                                physical.w = 1.0;\n                                physical.h = 1.0;\n\n                                col_i += 1;\n                            }\n                        }\n                    }\n\n                    physical.x = 0.0;\n                    physical.y -= 1.0;\n\n                    col_i = 0;\n                    row_i += 1;\n                }\n            }\n        }\n\n        let meta = meta.expect(\"No layout meta\");\n\n        Self { keys, meta }\n    }\n}\n\n#[derive(Debug)]\npub(crate) struct PhysicalLayoutKey {\n    pub logical: (u8, u8),\n    pub physical: Rect,\n    pub physical_name: String,\n    pub background_color: Rgb,\n}\n\nimpl PhysicalLayoutKey {\n    pub fn logical_name(&self) -> String {\n        let row_char =\n            char::from_digit(u32::from(self.logical.0), 36).expect(\"Failed to convert row to char\");\n        let col_char =\n            char::from_digit(u32::from(self.logical.1), 36).expect(\"Failed to convert col to char\");\n        format!(\"K{}{}\", row_char, col_char).to_uppercase()\n    }\n}\n\n#[derive(Debug, Deserialize)]\nstruct PhysicalLayoutJson(Vec<PhysicalLayoutEntry>);\n\n#[derive(Debug, Deserialize)]\n#[serde(untagged)]\nenum PhysicalLayoutEntry {\n    Meta(PhysicalLayoutMeta),\n    Row(PhysicalRow),\n}\n\n#[derive(Debug, Deserialize)]\n#[allow(dead_code)]\npub(crate) struct PhysicalLayoutMeta {\n    pub name: String,\n    pub author: String,\n}\n\n#[derive(Debug, Deserialize)]\nstruct PhysicalRow(Vec<PhysicalKeyEnum>);\n\n#[derive(Debug, Deserialize)]\n#[serde(untagged)]\nenum PhysicalKeyEnum {\n    Name(String),\n    Meta(PhysicalKeyMeta),\n}\n\n#[derive(Debug, Deserialize)]\nstruct PhysicalKeyMeta {\n    #[serde(default)]\n    x: f64,\n    #[serde(default)]\n    y: f64,\n    w: Option<f64>,\n    h: Option<f64>,\n    c: Option<Rgb>,\n}\n"
  },
  {
    "path": "backend/src/lib.rs",
    "content": "//#![warn(missing_docs)]\n\n//! ```no_run\n//! # use futures::{executor::ThreadPool, stream::StreamExt};\n//! use system76_keyboard_configurator_backend::{Backend, Event};\n//!\n//! # let executor = ThreadPool::new().unwrap();\n//!\n//! let (backend, mut events) = Backend::new()?;\n//! executor.spawn_ok(async move {\n//!     while let Some(event) = events.next().await {\n//!         if let Event::BoardAdded(board) = event {\n//!             println!(\"{}\", board.model());\n//!         }\n//!     }\n//! });\n//! backend.refresh();\n//! # Ok::<(), String>(())\n//! ```\n\n#[macro_use]\nextern crate log;\n\nmod backend;\nmod benchmark;\nmod board;\nmod color;\nmod daemon;\nmod deref_cell;\nmod key;\nmod keymap;\nmod layer;\nmod layout;\nmod localize;\nmod matrix;\nmod mode;\nmod nelson;\nmod rect;\n\npub use crate::daemon::BoardId;\nuse crate::daemon::*;\npub use crate::{\n    backend::*, benchmark::*, board::*, color::*, deref_cell::*, key::*, keymap::*, layer::*,\n    layout::*, localize::*, matrix::*, mode::*, nelson::*, rect::*,\n};\n"
  },
  {
    "path": "backend/src/localize.rs",
    "content": "use i18n_embed::{\n    fluent::{fluent_language_loader, FluentLanguageLoader},\n    DefaultLocalizer, LanguageLoader, Localizer,\n};\nuse once_cell::sync::Lazy;\nuse rust_embed::RustEmbed;\n\n#[derive(RustEmbed)]\n#[folder = \"../i18n/\"]\nstruct Localizations;\n\npub static LANGUAGE_LOADER: Lazy<FluentLanguageLoader> = Lazy::new(|| {\n    let loader: FluentLanguageLoader = fluent_language_loader!();\n\n    loader\n        .load_fallback_language(&Localizations)\n        .expect(\"Error while loading fallback language\");\n\n    loader\n});\n\n#[macro_export]\nmacro_rules! fl {\n    ($message_id:literal) => {{\n        i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id)\n    }};\n\n    ($message_id:literal, $($args:expr),*) => {{\n        i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id, $($args), *)\n    }};\n}\n\n// Get the `Localizer` to be used for localizing this library.\npub fn localizer() -> Box<dyn Localizer> {\n    Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER, &Localizations))\n}\n"
  },
  {
    "path": "backend/src/matrix.rs",
    "content": "use serde::{Deserialize, Serialize};\n\n#[derive(Deserialize, Serialize, Debug, Default, PartialEq, Clone)]\npub struct Matrix {\n    rows: usize,\n    cols: usize,\n    data: Box<[u8]>,\n}\n\nimpl Matrix {\n    pub fn new(rows: usize, cols: usize, data: Box<[u8]>) -> Self {\n        Self { rows, cols, data }\n    }\n\n    pub fn rows(&self) -> usize {\n        self.rows\n    }\n\n    pub fn cols(&self) -> usize {\n        self.cols\n    }\n\n    pub fn get(&self, row: usize, col: usize) -> Option<bool> {\n        if row < self.rows && col < self.cols {\n            let i = row * self.cols + col;\n            let byte = i / 8;\n            let bit = i % 8;\n            Some((self.data[byte] & (1 << bit)) != 0)\n        } else {\n            None\n        }\n    }\n\n    pub fn set(&mut self, row: usize, col: usize, value: bool) {\n        if row < self.rows && col < self.cols {\n            let i = row * self.cols + col;\n            let byte = i / 8;\n            let bit = i % 8;\n            if value {\n                self.data[byte] |= 1 << bit;\n            } else {\n                self.data[byte] &= !(1 << bit);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "backend/src/mode.rs",
    "content": "use crate::fl;\nuse once_cell::sync::Lazy;\nuse std::collections::HashMap;\n\n/// A mode/pattern for the keyboard's LEDs to display\n#[non_exhaustive]\npub struct Mode {\n    /// Index (as used in firmware)\n    pub index: u8,\n    /// Textual ID of mode, for `ListBox` or debugging\n    pub id: &'static str,\n    /// Display name of mode\n    pub name: String,\n    /// Hue setting has effect in this mode\n    pub has_hue: bool,\n    /// Speed setting has effect in this mode\n    pub has_speed: bool,\n}\n\nimpl Mode {\n    const fn new(\n        index: u8,\n        id: &'static str,\n        name: String,\n        has_hue: bool,\n        has_speed: bool,\n    ) -> Self {\n        Self {\n            index,\n            id,\n            name,\n            has_hue,\n            has_speed,\n        }\n    }\n\n    /// Return slice of all `Mode`s, ordered as they should be displayed\n    pub fn all() -> &'static [Mode] {\n        &MODES\n    }\n\n    /// Get `Mode` corresponding to index (as used in firmware)\n    pub fn from_index(index: u8) -> Option<&'static Self> {\n        static MODE_BY_INDEX: Lazy<HashMap<u8, &Mode>> =\n            Lazy::new(|| MODES.iter().map(|i| (i.index, i)).collect());\n        MODE_BY_INDEX.get(&index).cloned()\n    }\n\n    /// Get `Mode` corresponding to textual ID\n    pub fn from_id(id: &str) -> Option<&'static Self> {\n        static MODE_BY_ID: Lazy<HashMap<&str, &Mode>> =\n            Lazy::new(|| MODES.iter().map(|i| (i.id, i)).collect());\n        MODE_BY_ID.get(&id).cloned()\n    }\n\n    /// `true` for Per Key mode, otherwise `false`\n    pub fn is_per_key(&self) -> bool {\n        self.index == 1\n    }\n\n    pub fn is_disabled(&self) -> bool {\n        self.index == 14\n    }\n}\n\nstatic MODES: Lazy<Vec<Mode>> = Lazy::new(|| {\n    vec![\n        Mode::new(14, \"DISABLED\", fl!(\"mode-disabled\"), false, false),\n        Mode::new(0, \"SOLID_COLOR\", fl!(\"mode-solid-color\"), true, false),\n        Mode::new(1, \"PER_KEY\", fl!(\"mode-per-key\"), true, false),\n        Mode::new(13, \"ACTIVE_KEYS\", fl!(\"mode-active-keys\"), true, false),\n        Mode::new(2, \"CYCLE_ALL\", fl!(\"mode-cycle-all\"), false, true),\n        Mode::new(\n            3,\n            \"CYCLE_LEFT_RIGHT\",\n            fl!(\"mode-cycle-left-right\"),\n            false,\n            true,\n        ),\n        Mode::new(4, \"CYCLE_UP_DOWN\", fl!(\"mode-cycle-up-down\"), false, true),\n        Mode::new(5, \"CYCLE_OUT_IN\", fl!(\"mode-cycle-out-in\"), false, true),\n        Mode::new(\n            6,\n            \"CYCLE_OUT_IN_DUAL\",\n            fl!(\"mode-cycle-out-in-dual\"),\n            false,\n            true,\n        ),\n        Mode::new(\n            7,\n            \"RAINBOW_MOVING_CHEVRON\",\n            fl!(\"mode-rainbow-moving-chevron\"),\n            false,\n            true,\n        ),\n        Mode::new(8, \"CYCLE_PINWHEEL\", fl!(\"mode-cycle-pinwheel\"), false, true),\n        Mode::new(9, \"CYCLE_SPIRAL\", fl!(\"mode-cycle-spiral\"), false, true),\n        Mode::new(10, \"RAINDROPS\", fl!(\"mode-raindrops\"), false, false),\n        Mode::new(11, \"SPLASH\", fl!(\"mode-splash\"), false, true),\n        Mode::new(12, \"MULTISPLASH\", fl!(\"mode-multisplash\"), false, true),\n    ]\n});\n"
  },
  {
    "path": "backend/src/nelson.rs",
    "content": "use serde::{Deserialize, Serialize};\nuse std::cmp;\nuse std::collections::HashMap;\n\nuse crate::Matrix;\n\n#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]\npub enum NelsonKind {\n    Normal,\n    Bouncing,\n}\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Nelson {\n    pub missing: Matrix,\n    pub bouncing: Matrix,\n    pub sticking: Matrix,\n}\n\nimpl Nelson {\n    pub fn max_rows(&self) -> usize {\n        cmp::max(\n            self.missing.rows(),\n            cmp::max(self.bouncing.rows(), self.sticking.rows()),\n        )\n    }\n\n    pub fn max_cols(&self) -> usize {\n        cmp::max(\n            self.missing.cols(),\n            cmp::max(self.bouncing.cols(), self.sticking.cols()),\n        )\n    }\n\n    pub fn success(&self, layout: &HashMap<std::string::String, (u8, u8)>) -> bool {\n        let values: Vec<&(u8, u8)> = layout.values().collect();\n        for matrix in &[&self.missing, &self.bouncing, &self.sticking] {\n            for (row, col) in values.iter() {\n                if matrix.get(*row as usize, *col as usize).unwrap_or(false) {\n                    return false;\n                }\n            }\n        }\n        true\n    }\n}\n"
  },
  {
    "path": "backend/src/rect.rs",
    "content": "#[derive(Copy, Clone, Debug)]\npub struct Rect {\n    pub x: f64,\n    pub y: f64,\n    pub w: f64,\n    pub h: f64,\n}\n\nimpl Rect {\n    pub fn new(x: f64, y: f64, w: f64, h: f64) -> Self {\n        Self { x, y, w, h }\n    }\n\n    /// Test if `(x, y)` is a point in the rectangle\n    pub fn contains(&self, x: f64, y: f64) -> bool {\n        (self.x..=self.x + self.w).contains(&x) && (self.y..=self.y + self.h).contains(&y)\n    }\n}\n"
  },
  {
    "path": "build.rs",
    "content": "fn main() {\n    glib_build_tools::compile_resources(\n        &[\"data\"],\n        \"data/com.system76.keyboardconfigurator.gresource.xml\",\n        \"compiled.gresource\",\n    );\n}\n"
  },
  {
    "path": "data/com.system76.keyboardconfigurator.gresource.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<gresources>\n    <gresource prefix=\"/com/system76/keyboardconfigurator\">\n      <file>icons/scalable/apps/com.system76.keyboardconfigurator.svg</file>\n      <file>icons/scalable/status/launch-keyboard-not-found.svg</file>\n    </gresource>\n</gresources>\n"
  },
  {
    "path": "data/system76_launch_1_default.hex",
    "content": ":100000000C9458030C949F030C949F030C949F032F\r\n:100010000C949F030C949F030C949F030C949F03D8\r\n:100020000C949F030C949F030C94912C0C94462BDE\r\n:100030000C94E11A0C949F030C949F030C949F035F\r\n:100040000C949F030C949F030C949F030C949F03A8\r\n:100050000C949F030C94AF1A0C949F030C949F0371\r\n:100060000C949F030C949F030C949F030C949F0388\r\n:100070000C949F030C949F030C949F030C949F0378\r\n:100080000C949F030C949F030C949F030C949F0368\r\n:100090000C949F030C949F030C949F030C949F0358\r\n:1000A0000C949F030C949F030C949F0395079E0749\r\n:1000B000D10715085B08A508F108F408F908FC0841\r\n:1000C0000109040909090C090F0912091509180980\r\n:1000D0001B091E092109240927092C096809A409FB\r\n:1000E000A709AC09B709BA09C509C809D309D609CE\r\n:1000F000E109E409EF09F5096D0ABA0AB80BBE0B6C\r\n:10010000C30B5E0D5E0DCC0B5E0D5E0DD60BE70BCB\r\n:100110000D0C2C0C4D0C7F0CAE0CD60C090D010DEA\r\n:10012000540D98179817D217D2172518C819C8193F\r\n:10013000C81941181F19301930199B1C9B1CAE1C83\r\n:10014000AE1CA41CAE1CAE1CAE1C9B1C9B1CA91C94\r\n:10015000AE1CAE1CA91C33245A2401265A240126A5\r\n:10016000A624C9240126BE25CE2529003A003B003D\r\n:100170003C003D003E003F00400041004200430083\r\n:10018000440045004C0035001E001F0020002100E7\r\n:100190002200230024002500260027002D002E0029\r\n:1001A0002A002B0014001A000800150017001C007C\r\n:1001B00018000C00120013002F003000310039002D\r\n:1001C00004001600070009000A000B000D000E00D5\r\n:1001D0000F003300340028004A00E1001D001B001E\r\n:1001E0000600190005001100100036003700380025\r\n:1001F000E50052004B00E000E2000151E3002C005A\r\n:100200004D002C00E400E6000151500051004F0069\r\n:100210004E00005C0100010001000100010001002E\r\n:1002200001000100010001000100010001000100C6\r\n:1002300001000100010001000100010001000100B6\r\n:100240000100C35CCB5CCA5C0100460001000100F8\r\n:100250000100010001004A004E004B004D0001006A\r\n:100260000100010001000100010001000100010086\r\n:1002700001005000510052004F0001000100010038\r\n:10028000AE000100010001000100010001000100B9\r\n:10029000010001000100010001004B00A900010064\r\n:1002A0000100010001000100A8000100010001009F\r\n:1002B00001004A004E004D00AA00010001000100AB\r\n:1002C0000100010001000100010001000100010026\r\n:1002D0000100010001000100010001000100010016\r\n:1002E0000100010001000100010001000100010006\r\n:1002F00001000100010001000100010001000100F6\r\n:1003000001000100010001000100010001000100E5\r\n:1003100001000100010001000100010001000100D5\r\n:1003200001000100010001000100010001000100C5\r\n:1003300001000100010001000100010001000100B5\r\n:1003400001000100010001000100010001000100A5\r\n:100350000100010001000100010001000100010095\r\n:100360000100010001000100010001000100010085\r\n:100370000100010001000100010001000100010075\r\n:100380000100010001000100010001000100010065\r\n:100390000100010001000100010001000100010055\r\n:1003A0000100010001000100010001000100010045\r\n:1003B0000100010001000100010001000100010035\r\n:1003C0000100010001000100010001000100010025\r\n:1003D0000100010001000100010001000100010015\r\n:1003E0000100010001000100010001000100010005\r\n:1003F00001000100010001000100010001000100F5\r\n:1004000001000100010001000100000101010101E2\r\n:1004100001010101020202020202020202030303BD\r\n:10042000030303030304040404040404050505058D\r\n:10043000050606060606070707070708080808094D\r\n:100440000909090A0A0A0B0B0B0C0C0C0D0D0D0EF9\r\n:100450000E0E0F0F0F10101111111212131314148E\r\n:10046000151516161717181819191A1A1B1B1C1D03\r\n:100470001D1E1E1F2020212222232424252626275C\r\n:100480002829292A2B2C2D2D2E2F3031323233348E\r\n:1004900035363738393A3B3C3D3E3F404142434494\r\n:1004A00045464748494A4C4D4E4F50515354555676\r\n:1004B00058595A5B5D5E5F616264656668696B6C22\r\n:1004C0006D6F7072737577787A7B7D7E808283859D\r\n:1004D00087888A8C8E8F91939596989A9C9EA0A2DD\r\n:1004E000A3A5A7A9ABADAFB1B3B5B7BABCBEC0C2E7\r\n:1004F000C4C6C9CBCDCFD1D4D6D8DBDDDFE2E4E7AB\r\n:10050000E9EBEEF0F3F5F8FAFDFF05010980A10132\r\n:10051000850319012AB700150126B700950175104A\r\n:100520008100C0050C0901A101850419012AA0025E\r\n:10053000150126A002950175108100C0050109066C\r\n:10054000A1018505050719E029E715002501950892\r\n:10055000750181020507190029EF1500250195F0A5\r\n:10056000750181020508190129059505750191029A\r\n:10057000950175039101C00660FF0961A10109623F\r\n:10058000150026FF009520750881020963150026D5\r\n:10059000FF00952075089102C005010906A101051B\r\n:1005A0000719E029E71500250195087501810295D5\r\n:1005B00001750881010507190029FF150026FF00B4\r\n:1005C000950675088100050819012905950575012D\r\n:1005D0009102950175039101C009025B00030100BE\r\n:1005E000A0FA090400000103010100092111010022\r\n:1005F000012240000705810308000A0904010002E6\r\n:1006000003000000092111010001222200070582D8\r\n:100610000320000107050303200001090402000173\r\n:1006200003000000092111010001226D000705846B\r\n:100630000320000A120110010000000884330100A9\r\n:1006400001000102000150034C00610075006E00C2\r\n:1006500063006800200043006F006E0066006900C0\r\n:10066000670075007200610062006C006500200088\r\n:100670004B006500790062006F0061007200640049\r\n:10068000200028006C00610075006E0063006800A7\r\n:100690005F0031002900000012035300790073004D\r\n:1006A000740065006D003700360000000403090483\r\n:1006B00011241FBECFEFDAE0DEBFCDBF04B603FECC\r\n:1006C00027C08091080790910907A0910A07B0916F\r\n:1006D0000B078730904BA740B04BD1F4109208071E\r\n:1006E0001092090710920A0710920B0714BE84B7E4\r\n:1006F000877F84BF0FB6F894A895809160008861C9\r\n:1007000080936000109260000FBEE0E0F8E309956E\r\n:1007100013E0A0E0B1E0E2E9F0E602C005900D923E\r\n:10072000AA34B107D9F727E0AAE4B3E001C01D92CB\r\n:10073000A830B207E1F70E94A1030C9447300C9453\r\n:100740000000CF93DF93CDB7DEB7AD970FB6F89427\r\n:10075000DEBF0FBECDBF84B7877F84BF0FB6F894CE\r\n:10076000A89580916000886180936000109260007D\r\n:100770000FBE91E080E80FB6F894809361009093EB\r\n:1007800061000FBE85B7806885BF85B7806885BF6B\r\n:100790008EE09AE190934B0380934A030E948A2B48\r\n:1007A0000E94302C8091E20084608093E200789473\r\n:1007B0008091CB068823A1F01091E9001F709091E1\r\n:1007C000EC00892F817090FD80E8182B1092E900D1\r\n:1007D0008091E80083FD0E944D231F701093E90073\r\n:1007E00082E084BD93E095BD9DE797BD80936E0048\r\n:1007F00009E711E07FE7E72E71E0F72ED8018D9130\r\n:100800008D010E946226E016F106C1F70FE711E0A4\r\n:100810006DE8E62E61E0F62EF80181918F010E94CD\r\n:100820006226E016F106C1F7ECE4F3E088E593E018\r\n:10083000A7EFB3E0119211921D921D928E179F07A0\r\n:10084000C9F780E090E00E94642F8B3E9E4F11F02C\r\n:100850000E94781B1092D506EEEEF6E08EEF96E041\r\n:100860002FEF3FEF219331938E179F07D9F7109207\r\n:100870005D03E6E7F3E08FEF9FEF8193919323E031\r\n:10088000E638F207D1F780E090E00E94642F8B3EBB\r\n:100890009E4F21F00E94781B0E94471245E050E0D5\r\n:1008A0006CE170E082E097E00E944C2F809102079B\r\n:1008B0008C7F11F40E9447121092BA0080E280935C\r\n:1008C000B8001092BC008CE08CA701E010E09E0103\r\n:1008D000245D3F4F4AEF50E360E87FEB8AE391E00D\r\n:1008E0000E94872997FD4CC01BA69E01255D3F4FA6\r\n:1008F00042E154E362ED7FEB8AE391E00E948729B5\r\n:1009000097FD3EC019821A821B821C829E012F5FB6\r\n:100910003F4F48E054E362ED7FEB8AE391E00E94B1\r\n:10092000EE1F97FD2DC009811A812B813C8101604A\r\n:1009300009831A832B833C8348E054E362ED7FEB09\r\n:100940008AE391E00E94DF2997FD1AC004E813E3CF\r\n:1009500023E030E040E050E360E87FEB8AE391E0A1\r\n:100960000E94DF2997FD0CC004E813E324E030E087\r\n:1009700048E455EE62ED7FEB8AE391E00E94DF29C7\r\n:100980001FEF1093460180914701909148010E940A\r\n:10099000932A0E9476201093150180911601909160\r\n:1009A00017010E94932A10931101809112019091D6\r\n:1009B00013010E94932A8091490190914A01A091CC\r\n:1009C0004B0189839A83AB8343E050E0BE016F5FA4\r\n:1009D0007F4F80913A010E94502904E610E00E9466\r\n:1009E00076208FE19EE40197F1F700C000000150EE\r\n:1009F0001109A9F70E94DA13AFE0B7E21197F1F7F6\r\n:100A000000C00000EFE0F7E23197F1F700C000000E\r\n:100A10000E94DA138091F70380FF13C06FEF7FEF1E\r\n:100A200080E490E00E94982F6FEF82E490E00E94B3\r\n:100A30007A2F6FEF7FEF80E090E00E94982F0E9466\r\n:100A40008B1A80E490E00E94642F8C3E964739F424\r\n:100A500082E490E00E945C2F91E0823009F090E007\r\n:100A600090FD39C000E010E0780158EAE50EF11C75\r\n:100A700058012CE1A20EB11CF801E659FE4FC590B9\r\n:100A8000D4906D2DC8018D5B9F4F0E947A2F6C2DE5\r\n:100A9000C8018C5B9F4F0E947A2F0E5F1F4FA016DC\r\n:100AA000B10651F78501EA14FB0411F7870130EA1A\r\n:100AB000E31632E0F306C1F681E00E94282B6CEECB\r\n:100AC00076E780E490E00E94982F62E082E490E074\r\n:100AD0000E947A2F03C080E00E94282B60910005BD\r\n:100AE0007091010580910205909103050E94FC2AF6\r\n:100AF00080E090E00E94642F8B3E9E4F11F00E9498\r\n:100B0000781B82E090E00E945C2F8093EA030E94B1\r\n:100B1000671B909359038093580383E090E00E94F1\r\n:100B20005C2F682F70E080E090E00E947E1D609155\r\n:100B300000057091010580910205909103050E94C6\r\n:100B4000FC2A609158036068609358031091590320\r\n:100B500084E090E00E947A2F612F81E290E00E9471\r\n:100B60007A2F8FE291E090935B0380935A032224C3\r\n:100B70002394312C8091CB06853009F053C040E49A\r\n:100B8000F42EEE24E39400E112E18091CB0685304F\r\n:100B900009F042C08091CB06843051F140E060E022\r\n:100BA00080E00E944312E092E80310925C0388E127\r\n:100BB00090E00FB6F894A895809360000FBEF09275\r\n:100BC000600083B7817F846083BF83B7816083BF08\r\n:100BD0007894889583B78E7F83BF0FB6F894A895D5\r\n:100BE00080916000886180936000109260000FBE69\r\n:100BF0008091CA06882309F4C8CF0E94DA13E7EF70\r\n:100C0000F3E081919191892B09F090C7A3E0B4E0C2\r\n:100C1000AE17BF07B1F7B9CF0E94AD1F0E946D118B\r\n:100C20001092E8030E94DA13882359F08FB7F894E2\r\n:100C30004091E4035091E5036091E6037091E7036E\r\n:100C40008FBFABEEB3E0E7EFF3E0E12CF12C4E2DDC\r\n:100C5000A190B1908D919D918A259B25009709F4D3\r\n:100C6000AEC010E0CC24C394D12C9C012C213D219A\r\n:100C7000232B09F49EC019A34AA3AC20BD2081E018\r\n:100C8000A114B10409F480E08BA30E94D51A8160FD\r\n:100C9000782F9DA38CA349A15AA16BA18DA10E947D\r\n:100CA000A310F701EE0FFF1FE551FC4F80819181EA\r\n:100CB000C826D926D182C082AB2889F08EE08E9DCD\r\n:100CC000F0018F9DF00D1124E753FE4FE10FF11D50\r\n:100CD00080818F3F21F08DA7DD24D39401C0D12CDA\r\n:100CE000C0905D03ED2CF12CC7018C0D911D09976F\r\n:100CF0009CF108E010E00E191F09B7016F5F7F4FEC\r\n:100D0000635A7C4FA8018EE593E00E942F30B70113\r\n:100D1000675F7F4F635A7C4FA80186E693E00E948D\r\n:100D20002F30A801440F551FB701660F771F675E6C\r\n:100D30007F4F635A7C4F86E793E00E942F30B701C4\r\n:100D40006F5E7F4F635A7C4FA8018EE693E00E944E\r\n:100D50002F30CA94C0925D0380915D0390E0EDA5B1\r\n:100D6000AE2FB0E09D01220F331F235E3D4FAA0F2F\r\n:100D7000BB1FBD01625E7D4F41E0480F9D15B0F481\r\n:100D800090E0FC01E35AFC4FD9015C915183DB01F7\r\n:100D90005C915187BDA5B18B880F991FFC01E35A67\r\n:100DA000FC4F128E118E91E0842FE6CF80935D036D\r\n:100DB0001EC01F5FCC0CDD1C1E3009F056CF2FEF7C\r\n:100DC000E21AF20A36E0E316F10409F040CF8FEFA1\r\n:100DD0008EA38FA318A60E94D51A8160782F9AA798\r\n:100DE00089A74EA15FA168A58AA50E94A310409182\r\n:100DF00086035091870360918803709189032FB710\r\n:100E0000F8948091E4039091E503A091E603B091FA\r\n:100E1000E7032FBF841B950BA60BB70B2FB7F894D6\r\n:100E2000C090E403D090E503E090E603F090E70380\r\n:100E30002FBFC0928603D0928703E0928803F0927E\r\n:100E4000890360915D03EDE5F3E0462F50E0442413\r\n:100E50004A94542C612C712C481A590A6A0A7B0A4C\r\n:100E6000651799F0218D328D4901A12CB12C4814C0\r\n:100E700059046A047B0410F4415004C0280F391F40\r\n:100E8000328F218F5F5F3296EBCF40935D0380916D\r\n:100E9000E803811108C010910207812F837019F0B7\r\n:100EA0001695169501C010E080911A018130E9F085\r\n:100EB00038F0823009F4DFC3833009F4E9C305C494\r\n:100EC00010924201C092FE06D092FF06E092000707\r\n:100ED000F092010789E2EDE5F3E0A5EDB6E00190BF\r\n:100EE0000D928A95E1F781E0D0C380911901181322\r\n:100EF0000DC020910207237030E04091180150E0AE\r\n:100F000081E02417350719F480E001C081E0817089\r\n:100F100080934401412F50E04832510508F099C3B5\r\n:100F2000FA01EA5AFF4F0C942930882309F491C33F\r\n:100F300040E060E080E00E9443128BC300914201D8\r\n:100F400081E1089F002D112421E1F22EF00E54E5DD\r\n:100F50005F1510F494E5F92E609103077091040772\r\n:100F6000809105070E94E212E62ED72EC82E0F159B\r\n:100F700090F4E02FF0E0DF01AB53BD4F8C919091E6\r\n:100F80004301982331F02C2D4E2D6D2DCF010E9461\r\n:100F900045120F5FECCF81E063E56F1508F05AC38F\r\n:100FA00058C30091420181E1089F002D112481E185\r\n:100FB000F82EF00E74E57F1510F4B4E5FB2ED090FA\r\n:100FC0000407E0900507C0900307B6018E2D0E942C\r\n:100FD000E212B62EA72E782E609106076C0D7D2D9D\r\n:100FE0008E2D0E94E212E62ED72EC82E0F15B8F4D1\r\n:100FF000802F90E0FC01EB53FD4F308120914301A5\r\n:10100000232359F030FF04C02C2D4E2D6D2D03C02D\r\n:10101000272D4B2D6A2D0E9445120F5FE7CF81E0EF\r\n:1010200093E59F1508F016C314C30091420181E1B6\r\n:10103000089F002D1124A1E1DA2ED00EA4E5AD15F4\r\n:1010400010F4F4E5DF2EB0900407A090050720917E\r\n:101050000607E0E4CE2E3C2D329F312D1124C32E05\r\n:101060000D1518F5E02EF12CF701EB53FD4F908193\r\n:10107000809143018923B9F0F701EE0FFF1FE25E73\r\n:10108000FD4F808182958F70609103078C9D600D6C\r\n:1010900011247B2D8A2D0E94E212462F282F672FC4\r\n:1010A000C7010E9445120F5FDBCF81E053E55D155C\r\n:1010B00008F0D0C2CEC20091420181E1089F002D0C\r\n:1010C000112461E1D62ED00E64E56D1510F454E5BF\r\n:1010D000D52EB0900407A09005072091060740E4A4\r\n:1010E000C42E7C2D729F712D1124C72E0D1538F53D\r\n:1010F000E02EF12CF701EB53FD4F908180914301DD\r\n:101100008923D9F0F701EE0FFF1FE35EFD4F6081E9\r\n:10111000C69EB001112435E0759567953A95E1F7C3\r\n:1011200080910307680F7B2D8A2D0E94E212462FC3\r\n:10113000282F672FC7010E9445120F5FD7CF81E08C\r\n:1011400093E59D1508F086C284C20091420181E1B9\r\n:10115000089F002D112491E1F92EF00EA4E5AF15A2\r\n:1011600010F484E5F82ED0900307E0900407C090B7\r\n:101170000507609106076695669566958091FE065F\r\n:101180009091FF060E94D8120E945D12805887FD40\r\n:101190008195880F282F3C2D239F212D1124822FEC\r\n:1011A0006D2D7E2D0E94E212E62ED72EC82E0F1531\r\n:1011B00090F4E02FF0E0DF01AB53BD4F8C919091A4\r\n:1011C0004301982331F02C2D4E2D6D2DCF010E941F\r\n:1011D00045120F5FECCF81E053E55F1508F03AC28E\r\n:1011E00038C28BE89FE002C08FE59FE00E94732128\r\n:1011F00031C284E690E102C085E490E10E941721AB\r\n:1012000029C28AE290E102C08EE090E10E949B2018\r\n:1012100021C28DE59FE0EACF84E59FE0E7CF8BE434\r\n:101220009FE0E4CF80E39FE0E1CF81E29FE0EECF5B\r\n:101230008FEA92E1E3CF8DEF9FE0E0CF89EE9FE070\r\n:10124000E5CF83EF9EE005C081EC9EE002C083E81D\r\n:101250009EE00E94BD21FEC181111EC06091060763\r\n:1012600020E1620F08F46FEF8091FE069091FF0677\r\n:101270000E94D8126AE070E00E940130892B09F0C8\r\n:10128000E8C10E943C2F64E570E00E941530609137\r\n:1012900043010E947213DDC18091420191E1899F57\r\n:1012A000802D112401E1080F053508F004E5E82E32\r\n:1012B000F12CC02ED12CEC14FD040CF0C7C16091B0\r\n:1012C0004301C7010E9472136FEFE61AF60AF3CFCB\r\n:1012D00081111EC06091060720E1620F08F46FEFD4\r\n:1012E0008091FE069091FF060E94D81265E070E0A2\r\n:1012F0000E940130892B09F0ACC10E943C2F64E5AB\r\n:1013000070E00E941530609143010E94B813A1C1A2\r\n:101310008091420191E1899F802D112401E1080F04\r\n:10132000053508F004E5E82EF12CC02ED12CEC1484\r\n:10133000FD040CF08BC160914301C7010E94B813FA\r\n:101340007FEFE71AF70AF3CF8CE79EE002C086E74B\r\n:101350009EE00E941E227EC18091D50621E0382F9A\r\n:10136000321B08F430E0832F6DE57EE03BC06DE575\r\n:101370007EE037C08091D50621E0582F521B08F43B\r\n:1013800050E0852F65E27EE02DC065E27EE029C059\r\n:101390008091D50621E0682F621B08F460E0862F5B\r\n:1013A00063EF7DE01FC063EF7DE01BC08091D50639\r\n:1013B00021E0782F721B08F470E0872F6BED7DE041\r\n:1013C00011C06BED7DE00DC08091D50621E0382F76\r\n:1013D000321B08F430E0832F65EC7DE003C065EC40\r\n:1013E0007DE080E00E948A2235C18091DE03811178\r\n:1013F00025C069EC71E040E050E0942F9295907F19\r\n:1014000020E030E0FB01E20FF31F8081843538F4E7\r\n:10141000E82FF0E0E657FC4F892F822B80832F5F67\r\n:101420003F4F2E30310571F74F5F5F4F625F7F4F47\r\n:101430004630510511F781E08093DE0300914201AF\r\n:1014400081E1089F002D1124B1E1DB2ED00E54E57F\r\n:101450005D1510F4A4E5DA2E609100057091010588\r\n:1014600080910205909103050E94F527C82E609196\r\n:10147000030770910407809105070E94E212B62EBF\r\n:10148000A72E782E0D1518F5E02EF12CF701EB5351\r\n:10149000FD4F9081809143018923B9F0F701E65710\r\n:1014A000FC4F6081462F4F7062956F708C2D0E94AB\r\n:1014B0000F12029720F420E040E060E003C0272DE7\r\n:1014C0004B2D6A2DC7010E9445120F5FDBCF81E0D3\r\n:1014D00063E56D1508F0BEC0BCC00091420181E11A\r\n:1014E000089F002D1124F1E17F2E700E74E5771511\r\n:1014F00010F4E4E57E2EEE24EA94F12C0715A0F515\r\n:10150000E02FF0E0DF01AB53BD4F9C918091430190\r\n:10151000892341F1DF01AA0FBB1FAE0FBF1FAC5FD4\r\n:10152000BB4FAC901196CC90119712968C919091E4\r\n:101530000507A99E50011124C99E60011124899FAD\r\n:10154000C0011124B7010E940130262FC501B70147\r\n:101550000E940130462FC601B7010E940130CF0121\r\n:101560000E9445120F5FCACF81E093E5971508F0FE\r\n:1015700071C06FC0D090420191E1D99ED02C11244E\r\n:1015800001E10D0D053508F004E5811106C08091DB\r\n:10159000E3038F5F8093E30304C01092E303109290\r\n:1015A000E2038091E303811147C08091E203883018\r\n:1015B00029F41092E1031092E2033EC0A82FB0E09C\r\n:1015C000AA0FBB1FA357BE4FEC9111969C91AEE0A2\r\n:1015D000EA9FF0011124E753FE4FE90FF11D9081BE\r\n:1015E0009F3F21F09093DF0391E001C090E0909342\r\n:1015F000E1038F5F8093E2031FC0ED2CF12CF70114\r\n:10160000EB53FD4F9081809143018923A1F06091BC\r\n:10161000E3036D0D2091E103EFEDF3E080E77FEF51\r\n:1016200090E092130CC00E94E212462F282F672FE1\r\n:10163000C7010E944512D394D016F8F207C0319129\r\n:10164000D31202C08FEF70E09F5FEBCF81E00435D3\r\n:1016500008F080E0909142019F5F909342018111D8\r\n:1016600034C082E080931A018091440181112DC021\r\n:10167000112351F02AC01093190180910207837041\r\n:10168000809318010E94821083E080931A011DC08C\r\n:101690004091FE065091FF0660910007709101078E\r\n:1016A0002FB7F8948091E4039091E503A091E603AD\r\n:1016B000B091E7032FBF841B950BA60BB70B409788\r\n:1016C000A105B10510F010921A010E946D119091C0\r\n:1016D000E903891721F00E946D118093E90380913D\r\n:1016E000CB06843009F046CA83E08093E9008091FC\r\n:1016F000E80082FF3FCA8091E80085FF21C00E9478\r\n:10170000A92B81111BC000E210E0FE0131967F0180\r\n:1017100008C08091F100D7018D937D01015011091E\r\n:1017200069F08091E80085FDF4CF8091E8008B7727\r\n:101730008093E8000E94A92B882399F391E001C0CF\r\n:1017400090E08091E8008B778093E800992309F47A\r\n:1017500011CA81E08A83E9818E2F90E0FC013197E4\r\n:10176000E331F10508F0AAC1E258FF4F0C9429308B\r\n:1017700086E78B838CEE8C8381E012C14EE150E0D2\r\n:1017800062E571E004C04EE150E064E671E0CE0134\r\n:1017900003960E94383091C180910505882309F491\r\n:1017A0008DC11A8281E08093040588C18B818430C9\r\n:1017B00008F084C16C81663008F080C14D814E30E4\r\n:1017C00008F07CC10E940F128E839F8376C19B819B\r\n:1017D000943008F073C10C81063008F06FC18D8120\r\n:1017E0008E3008F06BC1FE806F81BCE10B9F8001E1\r\n:1017F0001124E8EA9E9F000D111D1124080F111DF0\r\n:10180000080F111D0D5B1F4FC8010E947A2F6F2D0D\r\n:10181000C80101960E947A2F50C18091050581115F\r\n:101820004DC18B81803F49F0813F49F0823F49F0B3\r\n:10183000833F09F043C1E3E005C0E0E003C0E1E01D\r\n:1018400001C0E2E025E0E29FF0011124E55EFE4FD9\r\n:1018500083818C8380EBA4C08091050581112EC10A\r\n:101860008B819C81903B08F090EB803F49F0813F59\r\n:1018700049F0823F49F0833F09F020C1E3E005C011\r\n:10188000E0E003C0E1E001C0E2E035E0E39FF00109\r\n:101890001124E55EFE4F9383A8C080910505811158\r\n:1018A0000DC1EB81E43558F0E03FC1F0E13FC1F0FC\r\n:1018B000E23FC1F0E33F09F001C1E3E014C0F0E012\r\n:1018C000CF01880F991FE80FF91FEC5FFB4F818153\r\n:1018D0008C8380818D8382818E83EFC0E0E003C0A2\r\n:1018E000E1E001C0E2E055E0E59FF0011124E55E92\r\n:1018F000FE4F81818C8382818D831E82DEC0809128\r\n:1019000005058111DBC0EB818D819C81E43558F0A8\r\n:10191000E03FB1F0E13FB1F0E23FB1F0E33F09F069\r\n:10192000CDC0E3E012C02E81F0E0AF01440F551F9F\r\n:10193000E40FF51FEC5FFB4F808391832283BDC0D2\r\n:10194000E0E003C0E1E001C0E2E065E0E69FF00115\r\n:101950001124E55EFE4F9183828347C08091050587\r\n:101960008111ACC0EB81E43008F0A8C02E2F30E02C\r\n:1019700075E0E79FF0011124E55EFE4F908196959A\r\n:101980009695EDE9F1E0419194130CC08C8385E0CC\r\n:10199000829FF001839FF00D1124E55EFE4F84814C\r\n:1019A0008D838BC08F5F8F3071F788C08091050564\r\n:1019B000811184C0EB81E43008F080C0AC81AF308D\r\n:1019C00008F07CC02D8185E0E89FF0011124E55EE0\r\n:1019D000FE4FB0E0A356BE4F8C91982F990F990FF0\r\n:1019E00080818370892B808324831A826091000513\r\n:1019F0007091010580910205909103050E94FC2AD7\r\n:101A00005DC080910505811159C081E00E94282B9D\r\n:101A100054C086E08B838EE08C8387EFE82E83E0D2\r\n:101A2000F82E16E0A0E0B4E040E050E0B03258F507\r\n:101A3000F70160817181C101042E02C0880F991FD6\r\n:101A40000A94E2F7682379238B2F90E091010A2E04\r\n:101A500001C0220F0A94EAF7672B51F061E070E0B1\r\n:101A60006C0F7D1F860F971FFC013081232B0AC04E\r\n:101A700061E070E06C0F7D1F860F971F2095FC01C1\r\n:101A8000308123232083AF5FA83010F0BF5FA0E038\r\n:101A90004F5F5F4F4E30510549F61150F2E0EF0EA7\r\n:101AA000F11C1111C1CF09C00E94AD1F81E09B81C3\r\n:101AB000911101C080E0809303041A828091CB06CB\r\n:101AC000843009F51091E9001F709091EC00892F86\r\n:101AD000817090FD80E8182B82E08093E90080916E\r\n:101AE000E80080FF0DC040E050E060E270E0CE0111\r\n:101AF00001960E94C21F8091E8008E778093E800D3\r\n:101B00001F701093E90080910405882311F40C9450\r\n:101B1000BA052FEF30E752E0215030405040E1F756\r\n:101B200000C000000E948B1A0C94BA0509BD19BDB3\r\n:101B300009B400FEFDCF8091D8008F7D8093D8003E\r\n:101B40008091E00082608093E0008091E00081FD60\r\n:101B5000FCCF0E94AD1F0C94C505EBE0F5E096E0CC\r\n:101B6000E730F90729F08183608342833396F7CF0A\r\n:101B70000895FC01EE0FFF1F8E0F9F1FFC01E55F14\r\n:101B8000FA4F6183408322830895EF92FF920F936F\r\n:101B90009701201B31092F3F310519F010F02FEF6D\r\n:101BA00030E02095382F320F08F43FEF832F0F914C\r\n:101BB000FF90EF900895EF92FF920F939701201BF3\r\n:101BC00031092F3F310519F010F02FEF30E0322F9F\r\n:101BD0003095482F430F08F44FEF842F620F0F9179\r\n:101BE000FF90EF900895EF92FF920F93972F093493\r\n:101BF00038F4B701601B71096F3F710519F010F0DF\r\n:101C00006FEF70E0485F5F4F4131510540F0A9012F\r\n:101C1000485F5F4F4131510510F06FEF70E0609504\r\n:101C2000482F460F08F44FEF842F37FF02C02D5F77\r\n:101C30003F4F359527953595279560910307620F9E\r\n:101C4000792F0F91FF90EF900895EF92FF920F93ED\r\n:101C5000E00EF11CF90137FF03C0F195E195F109A0\r\n:101C600024E0EE0FFF1F2A95E1F7EF3FF10519F091\r\n:101C700014F0EFEFF0E09A0157FF03C03195219582\r\n:101C8000310994E0220F331F9A95E1F72E173F0791\r\n:101C90000CF4F901EE0DFF1DEF3FF10519F010F006\r\n:101CA000EFEFF0E02E2F2095382F320F08F43FEFA2\r\n:101CB000832F0F91FF90EF900895EF92FF920F9373\r\n:101CC000970195E0099F200D311D11242F3F31050B\r\n:101CD00019F010F02FEF30E02095382F320F08F474\r\n:101CE0003FEF832F0F91FF90EF90089522E8241B80\r\n:101CF00008F420E0620F08954095282F429F412D5F\r\n:101D00001124842F08950F931F9310E0F801EE0F14\r\n:101D1000FF1FE35EFD4F9081905797FD9195000F57\r\n:101D2000111FF801E25EFD4FE081F0E0B097DF01A6\r\n:101D3000AA0FBB1F8D010E0F1F1F2003D001219F73\r\n:101D4000B00D1124E8E3F0E0E91BF10997FDF395EC\r\n:101D50009F01220F331F89010E0F1F1F40039001A7\r\n:101D6000419F300D11242A0F3B1F37FF02C021581D\r\n:101D70003F4F220F232F221F330B620F1F910F9112\r\n:101D800008950F931F93522F10E0F801EE0FFF1FDD\r\n:101D9000E25EFD4FE081F0E0B097EE0FFF1F9F0184\r\n:101DA0005203D001539FB00D1124000F111FF801F1\r\n:101DB000E35EFD4F008110E000571109000F111F75\r\n:101DC00040039001419F300D11242A0F3B1F37FF24\r\n:101DD00002C021583F4F220F232F221F330B620FC7\r\n:101DE0001F910F9108950F931F93522F10E0F80148\r\n:101DF000EE0FFF1FE25EFD4FE081F0E0B0979F0124\r\n:101E00005203D001539FB00D1124000F111FF80190\r\n:101E1000E35EFD4F008110E000571109400390017F\r\n:101E2000419F300D11242A0F3B1F37FF02C021585C\r\n:101E30003F4F220F232F221F330B620F1F910F9151\r\n:101E40000895EF920F931F9393E0099F800111244F\r\n:101E5000159507956E2D600F1F910F91EF900895C6\r\n:101E6000A22F50E0FA01EE0FFF1FE25EFD4F9081BE\r\n:101E7000905297FD9195440F551FFA01E35EFD4F77\r\n:101E80003081232F30E02A1B3109290F311D97FDA6\r\n:101E90003A95620F0895E42FF0E0EE0FFF1FE25E27\r\n:101EA000FD4F6081621B0895E42FF0E0EE0FFF1FED\r\n:101EB000E35EFD4F6081621B0895622F0895E42F59\r\n:101EC000F0E0EE0FFF1FE35EFD4F408134EE439FD5\r\n:101ED000412D1124E82FF0E050E0445E5F4FDA011D\r\n:101EE000A21BB1099D01B7FF03C0319521953109AE\r\n:101EF00093E0220F331F9A95E1F7AF01421B530B7A\r\n:101F00009A0157FF02C020E030E0582F259F212D75\r\n:101F10001124822F0895E42FF0E0EE0FFF1FE35EFF\r\n:101F2000FD4F408134EE439F412D1124E72FF0E017\r\n:101F300050E0445E5F4FDA01A21BB1099D01B7FF7B\r\n:101F400003C031952195310993E0220F331F9A95F3\r\n:101F5000E1F7AF01421B530B9A0157FF02C020E08B\r\n:101F600030E0279F212D1124722F0895FC019B0141\r\n:101F7000009721F477FF2BC080E80895AC0197FF0C\r\n:101F800004C044275527481B590BB901640F751F1E\r\n:101F900037FD0CC0241B350BC901A5E0880F991F24\r\n:101FA000AA95E1F70E94153080E20CC0CB0165E0F4\r\n:101FB000880F991F6A95E1F7BA01621B730B0E94A3\r\n:101FC000153080E6861BF7FF03C08195089580E0F9\r\n:101FD0000895EF920F93CF93DF93D72FC82FC901A6\r\n:101FE0000E19BA010E94B60F602F681B7D2F8C2F2F\r\n:101FF000DF91CF910F91EF9008950F93CF93DF93DF\r\n:10200000D72FC82FC901BA010E94B60F682F600FE1\r\n:102010007D2F8C2FDF91CF910F910895EF920F9329\r\n:102020001F93CF93DF93D62FC72F182FC9010E19F7\r\n:10203000010FBA010E94B60F081B202F219F212DEE\r\n:102040001124822F6D2F7C2FDF91CF911F910F9143\r\n:10205000EF900895EF920F931F93CF93DF93D62FB6\r\n:10206000172FC82FC9010E19070FBA010E94B60F0A\r\n:10207000702F781B719F712D11246D2F8C2FDF9184\r\n:10208000CF911F910F91EF900895FF920F931F939F\r\n:10209000CF93DF93F62ED72F182FC901C12FC01B66\r\n:1020A000BA010E94B60F982F990F890FC81B2C2FC9\r\n:1020B000219F212D1124822F6F2D7D2FDF91CF9114\r\n:1020C0001F910F91FF900895FF920F931F93CF934D\r\n:1020D000DF93F62E172FD82FC901C72FC01BBA01C7\r\n:1020E0000E94B60F982F990F890F7C2F781B719F34\r\n:1020F000712D11246F2D8D2FDF91CF911F910F9195\r\n:10210000FF9008956A9A8EB18B7F9EB194602FB72D\r\n:10211000F894EBE0F5E036E0E730F30761F0319159\r\n:1021200048E09EB937FF8EB9330F000000C08EB96A\r\n:102130004A95B9F7F0CF2FBF8FE292E00197F1F700\r\n:1021400000C0000008951F93CF93DF93CDB7DEB793\r\n:1021500067970FB6F894DEBF0FBECDBF342F4B8B01\r\n:10216000252F5C8B6D8B7E8B8F8B4E895F896111E8\r\n:102170001092A00686E0FE013D96DF01982F1D9289\r\n:102180009A95E9F73D872E876F87598B488BDE013B\r\n:10219000179601900D928A95E1F7CE0107960E945D\r\n:1021A000FE1D81113EC086E0FE013796DE011196CC\r\n:1021B00001900D928A95E1F7FF81E8856A857B851C\r\n:1021C0006115710531F0EF3F31F481E0FF3F19F403\r\n:1021D00003C081E001C080E080FD23C0209135066E\r\n:1021E00030E0C9010196877099274091660650E05A\r\n:1021F0008417950779F1F983EA837D836C8396E0F0\r\n:10220000929FD001939FB00D1124AA5CB94FFE019B\r\n:10221000319601900D929A95E1F7809335060E94D0\r\n:10222000881D16E080916606909135068917F9F0B1\r\n:10223000189FC00111248A5C994F0E94FE1D8823BB\r\n:10224000B1F08091660690E001968770992780939F\r\n:102250006606E8CF0E94AD1F109235061092660602\r\n:10226000EFE2F6E086E0DF011D928A95E9F76796D6\r\n:102270000FB6F894DEBF0FBECDBFDF91CF911F9197\r\n:10228000089520910B0630910C062817390771F03C\r\n:1022900090930C0680930B06E0915A03F0915B0338\r\n:1022A000309721F00084F185E02D09940895209164\r\n:1022B000090630910A062817390771F090930A062B\r\n:1022C00080930906E0915A03F0915B03309721F067\r\n:1022D0000680F781E02D09940895E0915A03F0916A\r\n:1022E0005B03309721F00190F081E02D099480E0AC\r\n:1022F0000895EF92FF920F93CF93DF93C42FD22FC5\r\n:10230000FC0182818823D1F040930D060E94D51AEA\r\n:10231000909308068093070680E28C0F883008F0BF\r\n:1023200078C0C77081E001C0880FCA95EAF7DF91D5\r\n:10233000CF910F91FF90EF900C94CF2D80910D06CF\r\n:10234000481356C020910706309108064FB7F894FD\r\n:102350008091E4039091E503A091E603B091E70337\r\n:102360004FBF821B930B883C910508F041C0CD17ED\r\n:10237000C9F080E28C0F883040F4C77081E001C062\r\n:10238000880FCA95EAF70E94C42D80E28D0F88302D\r\n:1023900048F481E09D2F977001C0880F9A95EAF765\r\n:1023A0000E94CF2D093319F0E12CF12C03C080E5F8\r\n:1023B000E82EF12C802F0E94352EE114F10451F00B\r\n:1023C0008FEC97E00197F1F700C0000091E0E91A67\r\n:1023D000F108F3CF802F0E94D92D80E28D0F883035\r\n:1023E000C0F4D77081E001C0880FDA95EAF70AC01F\r\n:1023F00080E28C0F883068F4C77081E001C0880FDC\r\n:10240000CA95EAF7DF91CF910F91FF90EF900C946E\r\n:10241000C42DDF91CF910F91FF90EF9008950F930E\r\n:102420001F93CF93DF93C42FD0E0CC0FDD1F2CE19F\r\n:10243000629FC00DD11D112438EA839FC00DD11DAC\r\n:102440001124CD5BDF4FCE010E945C2F082F10E0DE\r\n:10245000102F0027CE0101960E945C2F9801282B97\r\n:10246000C901DF91CF911F910F910895462F8430BC\r\n:1024700038F4763028F46E3018F4672F0C940F126D\r\n:1024800080E090E008950C94AD0D0C94B90DE2E05D\r\n:10249000F7E08DE3808380914C0190914D01A091F4\r\n:1024A0004E0181839283A3838FE7848345E050E0CC\r\n:1024B0006CE170E0CF010C946A2F482F982F46FDF5\r\n:1024C0009095E92FEF739F7046FD9F5FE295EF7047\r\n:1024D000EE0FF0E0E455FE4F2181299F802D212D44\r\n:1024E000112482958F702295207F822B3081982F26\r\n:1024F000930F892F47FD819580580895BC01823044\r\n:10250000910508F40895613E8EE1780748F49B0137\r\n:1025100095E0369527959A95E1F748E0420F01C07E\r\n:102520004FEF91E0242F30E0290F311D359527958D\r\n:10253000229FF001239FF00DF00D11246E177F07ED\r\n:1025400018F44FEF420F04C02F3F39F091E0920F83\r\n:10255000491740F78FEF890F08958FEF08950F9374\r\n:10256000CF93DF93D72FC82F47FD4195E8E3F0E0E5\r\n:10257000CF01841B910947FD9395889FB001899FE6\r\n:10258000700D700D1124229FC001239F900D900D9E\r\n:102590001124860F971F0E947E12682F660F860FE8\r\n:1025A000682F600F7D2F8C2FDF91CF910F910895B1\r\n:1025B00020E030E0869F212D969F200D311D1124B3\r\n:1025C000C9010895CF92DF92EF92FF920F931F936C\r\n:1025D000CF93DF93F62E472FE82FF0E0711106C05E\r\n:1025E000E65FFB4F8491782F682F73C0272F30E070\r\n:1025F000E65FFB4FE491FE2F0E2F10E056E0659F43\r\n:10260000C0011124CFEFD0E0BE010E9401305BEA8F\r\n:102610005603C001579F900D11248F0D911D8F0DF2\r\n:10262000911D982F990F980F7E01E21AF30AE09EF0\r\n:10263000D001E19EB00DF09EB00D11248B2F499F6B\r\n:10264000A0011124452F55277E01E41AF50AE09ECA\r\n:10265000A001E19E500DF09E500D11246E01C91A8B\r\n:10266000D108C29E7001C39EF00CD29EF00C1124C2\r\n:102670002F2D3327C21BD30BC09F9001C19F300D5C\r\n:10268000D09F300D1124932F6230710591F048F4E2\r\n:1026900061157105E1F061307105B9F49E2FE52FE8\r\n:1026A00016C06430710569F040F06630710579F04C\r\n:1026B0000CC09E2FEB2F832F0AC0EB2F8F2F952F4F\r\n:1026C00006C09B2F8E2FE32F02C09B2F852F7E2FBE\r\n:1026D000692FDF91CF911F910F91FF90EF90DF90C5\r\n:1026E000CF900895DF92EF92FF920F931F93CF93B5\r\n:1026F000DF93EC01FC01EB53FD4F9081692381F1E5\r\n:10270000D09004070091050710910307E12EF12CEA\r\n:102710000E943C2F282FC7018C549F4F68E671E020\r\n:102720000E9415308E199F0997FD03969595879500\r\n:10273000959587952370612F289F600D11247D2D1D\r\n:10274000802F0E94E212462F282F672FCE01DF91A3\r\n:10275000CF911F910F91FF90EF90DF900C94451255\r\n:10276000DF91CF911F910F91FF90EF90DF9008952F\r\n:102770001F93CF93DF93FC01EB53FD4F2081622326\r\n:10278000A9F0EC010E943C2F182F0E943C2F612FD2\r\n:10279000782F809105070E94E212462F282F672F7D\r\n:1027A000CE01DF91CF911F910C944512DF91CF9113\r\n:1027B0001F9108959F92AF92BF92CF92DF92EF92B6\r\n:1027C000FF920F931F93CF93DF930CE413E089E7FD\r\n:1027D000E82E81E0F82EC0E0D0E0912CCC24C39408\r\n:1027E000D12CB701D7018C91F894E82FE295EF70C6\r\n:1027F000F0E021A18F70A60102C0440F551F8A95F9\r\n:10280000E2F7CA01922F982B91A392A18095892378\r\n:1028100082A3789400C0EFE7F1E020E030E0A12C43\r\n:10282000B12C4191842F82958F7090E0DC019096BD\r\n:102830008C9190E04F7002C0959587954A95E2F78C\r\n:1028400080FD08C0C601022E02C0880F991F0A949D\r\n:10285000E2F702C080E090E0A82AB92A2F5F3F4F3C\r\n:102860002E303105F1F6BFEFEB1AFB0AFB01808138\r\n:102870000E946226C530D10519F0F0E5FA95F1F70E\r\n:10288000D8018D919C911197A816B90621F0AD92AF\r\n:10289000BC9281E001C080E0982A21960E5F1F4F14\r\n:1028A000C630D10509F09DCF992049F081E0809391\r\n:1028B00008050E94D51A909307058093060580911C\r\n:1028C0000805882309F445C02091060530910705C5\r\n:1028D0004FB7F8948091E4039091E503A091E6034B\r\n:1028E000B091E7034FBF821B930B069790F1809145\r\n:1028F0004C0390914D039093F8038093F7038091DC\r\n:102900004E0390914F039093FA038093F9038091C3\r\n:102910005003909151039093FC038093FB038091AB\r\n:102920005203909153039093FE038093FD03809193\r\n:10293000540390915503909300048093FF0380917A\r\n:1029400056039091570390930204809301041092D0\r\n:1029500008058091090590910A05883EB3E09B0720\r\n:102960006CF010920A051092090584E191E00E9432\r\n:102970005A2A80E191E00E945A2A05C0019690935C\r\n:102980000A0580930905892DDF91CF911F910F9141\r\n:10299000FF90EF90DF90CF90BF90AF909F90089501\r\n:1029A0008F929F92AF92BF92CF92DF92EF92FF925F\r\n:1029B0000F931F93CF93DF9300D000D01F92CDB71A\r\n:1029C000DEB7FC018081918123813481232B31F09A\r\n:1029D0009F3F31F491E08F3F19F403C091E001C0B3\r\n:1029E00090E090FD05C57F0185E0DE011196019024\r\n:1029F0000D928A95E1F7F701228189819A8122233C\r\n:102A000049F00E943C1C182F682F89819A810E94EE\r\n:102A1000DE1C03C00E94B21C182F69817A81812FAD\r\n:102A20000E9436128C018091030481111EC2033C66\r\n:102A3000FCE51F0709F446C028F401153CE513071F\r\n:102A400051F052C00A3C8CE5180749F10B3C9CE55B\r\n:102A5000190799F049C0F7018281882309F405C25A\r\n:102A600080910207837029F08C698093020710928D\r\n:102A70001A0181E080930505F8C1F701828188235E\r\n:102A800009F4F3C180910507EAEBF1E024EB31E0B2\r\n:102A900092919817A8F02E173F07D1F722C0F7019F\r\n:102AA0008281882309F4E1C180910507E4EBF1E01C\r\n:102AB0002AEB31E02E173F07A1F091918917D0F74B\r\n:102AC000892F0FC0F7018281882309F4CEC180913C\r\n:102AD0000507811103C08091390103C0809339013A\r\n:102AE00080E00E94112BC1C1043FFCE51F0799F44F\r\n:102AF00006E221EE40EE64EF7CE509C0083D9CE56E\r\n:102B0000190711F506E221EE41EE68ED7CE5C701FB\r\n:102B10000E947911AAC1053F2CE5120708F042C1B5\r\n:102B2000093D3CE5130731F407E225EE45EE69ED7A\r\n:102B30007CE5EDCF0A3D8CE5180701F708E221E0BE\r\n:102B400045EE6AED7CE5E3CFF7018281882309F445\r\n:102B50005EC110920D060230FCE51F0708F441C16A\r\n:102B600006312CE5120738F098012B5F3C452930DF\r\n:102B7000310508F036C10E94671B9093590380937A\r\n:102B8000580300313CE5130709F4C3C008F041C005\r\n:102B900008309CE5190709F49AC0F0F40430FCE50C\r\n:102BA0001F0709F487C068F402303CE5130709F4F5\r\n:102BB00077C003301C4509F0E5C08091580382605E\r\n:102BC00076C006309CE5190709F46EC008F07BC09A\r\n:102BD0008091580388606BC00C30FCE51F0709F436\r\n:102BE00085C068F40A303CE5130709F474C008F0A6\r\n:102BF00079C00E94AD1F80915803806858C00E3084\r\n:102C00009CE5190709F476C008F07FC0809158034D\r\n:102C10008BC00C3FFCE51F0709F44FC018F50331CA\r\n:102C20003CE5130709F47DC078F401319CE51907F0\r\n:102C300009F473C002311C4509F0A4C00E94AD1F05\r\n:102C4000809158038F7733C00531FCE51F0709F4E5\r\n:102C500072C008F486C00B3F1C4509F093C08091F8\r\n:102C600059033EC001158DE5180709F45FC058F4FB\r\n:102C70000E3FECE51E0709F444C008F43FC0809104\r\n:102C8000590382602DC002302DE5120709F475C08A\r\n:102C900008F45DC003301D4509F074C060E06EC0EB\r\n:102CA00080915803816003C08091580380618093B4\r\n:102CB000580368C08091580311C080915903826005\r\n:102CC000809359035FC0809158038062F0CF809158\r\n:102CD00058038064ECCF8091580388608460E7CF0C\r\n:102CE0008160EECF809158038E7FE1CF80915803B1\r\n:102CF0008D7FDDCF80915803877FD9CF8091590395\r\n:102D000018C0809159038D7FDBCF809158038F7E4F\r\n:102D1000CECF809158038F7DCACF809158038F7B8F\r\n:102D2000C6CF80915803877F8B7FC1CF8091590395\r\n:102D30008D7F8E7FC5CF8091580382FB222720F99B\r\n:102D400091E0922790FB82F990FB83F9B0CF8091BC\r\n:102D50005903982F909591708E7F892B90FB81F964\r\n:102D6000AFCF0E94AD1F8091580387FB222720F927\r\n:102D700091E0922790FB87F99ACF61E08EE090E096\r\n:102D80000E947A2F609158031091590384E090E0DB\r\n:102D90000E947A2F612F81E290E00E947A2F0E9498\r\n:102DA000AD1F63C0063FECE51E0731F406E221EEDD\r\n:102DB00042EE66EF7CE5ABCE063FFCE51F0730F444\r\n:102DC00007E225EE44EE65EF7CE5A1CE073F2CE55A\r\n:102DD000120709F0B9CE07E225EE46EE67EF7CE573\r\n:102DE00096CE06313CE5130719F58091A1068A7A43\r\n:102DF00091E009F490E090930E06882311F065E3CA\r\n:102E000001C069E28FE096E00E94321B0EC00631DD\r\n:102E10001C4509F048C080910E06882309F4E6C2DB\r\n:102E200065E38FE096E00E940A1B0E94E81B1DC02C\r\n:102E30009801235C3C4524313105B8F001159CE52F\r\n:102E4000190731F00F3D1C4571F50E94781B0DC02C\r\n:102E50000E94AD1FFFE70AE116E0F150004010406C\r\n:102E6000E1F700C000000E948B1A80919E068770D7\r\n:102E700009F4BEC2F7018281882309F4B9C282E055\r\n:102E80000F900F900F900F900F90DF91CF911F91A7\r\n:102E90000F91FF90EF90DF90CF90BF90AF909F90F9\r\n:102EA0008F900C94441DF70100811181882349F013\r\n:102EB000C8010E943C1CD82E682FC8010E94DE1C4D\r\n:102EC00004C0C8010E94B21CD82EB8018D2D0E94EA\r\n:102ED00079268C01982EF701B280A580A2949FE0FC\r\n:102EE000A92280919E06877099F0BB2089F0812FDE\r\n:102EF000807F803421F080E2800F883048F082E0CB\r\n:102F00000E94441D80919E068770DD24D394811118\r\n:102F1000D12CC12EC2948FE0C8228C2D90E08C3031\r\n:102F2000910508F035C2FC01EF56FF4F0C94293093\r\n:102F3000812F807F1F70882311F01295107FBB2096\r\n:102F4000B9F0112309F40FC280E2800F883010F02D\r\n:102F5000911006C08091A106182B1093A10605C000\r\n:102F60008091A006182B1093A0060E94E81BFBC1BD\r\n:102F7000802F0E94D92D112309F40AC2005E1095FA\r\n:102F8000083010F0911006C08091A106182310930C\r\n:102F9000A10605C08091A00618231093A0060E94E8\r\n:102FA000E81BF6C1812F807F1F70803211F01295CF\r\n:102FB000107F992021F0F1E09F16E1F02AC0BB209C\r\n:102FC00081F08091A206AA2051F001E0A01207C072\r\n:102FD000182B181709F4DCC11093A206D9C1812B54\r\n:102FE00010C0AA2021F021E0A21609F4D1C10E944C\r\n:102FF000E21B27C0BB2041F035E03A1508F4C8C1F8\r\n:10300000812F0E94CF2DC4C184E08A1508F4C0C16D\r\n:1030100018C0BB2049F0AA2099F3F701858180FFF1\r\n:10302000A2C18F708583ECCFAA2059F0093309F033\r\n:10303000ACC1FFEF13EF21E0F15010402040E1F769\r\n:10304000A2C1812F0E94C42DA3C1812F8695869590\r\n:10305000837019F0813059F09BC1BB2019F0C80171\r\n:10306000937002C080E090E00E94571197C1BB208E\r\n:1030700019F0C801937002C080E090E00E944111F5\r\n:103080008DC1812F837009F069C0B11085C1902F67\r\n:10309000929596959770990F990F802F8F70882E23\r\n:1030A000912CA12CB12C092E04C0880C991CAA1CAF\r\n:1030B000BB1C0A94D2F704FF12C04FE050E060E05E\r\n:1030C00070E004C0440F551F661F771F9A95D2F712\r\n:1030D000DB01CA0180959095A095B09503C080E072\r\n:1030E00090E0DC0116951695412F4370423019F19E\r\n:1030F000C8F40091A3061091A4062091A506309172\r\n:10310000A606413059F088299929AA29BB29BC0172\r\n:10311000CD0160237123822393230AC0802A912A40\r\n:10312000A22AB32ABC01CD01682979298A299B29C1\r\n:103130000E947E1D31C188299929AA29BB290091A5\r\n:10314000A3061091A4062091A5063091A606BC0105\r\n:10315000CD016027712782279327EACFBB2019F082\r\n:10316000812F817001C08695882309F415C1902FA5\r\n:10317000929596959770990F990F802F8F70882E42\r\n:10318000912CA12CB12C092E04C0880C991CAA1CCE\r\n:10319000BB1C0A94D2F704FF12C04FE050E060E07D\r\n:1031A00070E004C0440F551F661F771F9A95D2F731\r\n:1031B000DB01CA0180959095A095B09503C080E091\r\n:1031C00090E0DC0116951695412F43704230D9F0FE\r\n:1031D00068F50091000510910105209102053091DC\r\n:1031E0000305413059F088299929AA29BB29BC0136\r\n:1031F000CD0160237123822393231EC0802A912A4C\r\n:10320000A22AB32A13C088299929AA29BB29009187\r\n:103210000005109101052091020530910305BC01C4\r\n:10322000CD01602771278227932706C0BC01CD01FD\r\n:10323000682979298A299B290E94091DADC01F7020\r\n:10324000BB2039F0812F0E945D1D802F0E94CF2D61\r\n:10325000A3C0802F0E94C42D812F0E941F1D9CC0DF\r\n:10326000802F32EF931609F440C0391538F090EFF3\r\n:10327000991661F0E1EF9E1699F170C0F3EF9F1679\r\n:10328000D9F124EF921609F44EC068C0BB2019F1A1\r\n:1032900034E03A1508F47CC01F7181E090E0A0E0B2\r\n:1032A000B0E0AC01BD0104C0440F551F661F771F7D\r\n:1032B0001A95D2F78091000590910105A091020521\r\n:1032C000B09103058A019B01082719272A273B276C\r\n:1032D000C901B80125C025E02A1508F459C0DCCF82\r\n:1032E000BB2029F0812F8F712CC0BB20D9F3812FF7\r\n:1032F0008F710E941F1D4CC0BB2079F01F7181E0AF\r\n:1033000090E0A0E0B0E0BC01CD0104C0660F771FE3\r\n:10331000881F991F1A95D2F703C060E070E0CB01B7\r\n:103320000E94091D35C0BB2079F01F71812F0E94BA\r\n:103330005D1D38E0139FC0011124836080939E06B9\r\n:10334000812F0E945D1D24C081E00E94441D81E008\r\n:103350008A15F0F482E00E94441D1AC0BB2039F0A7\r\n:10336000AA2009F4BFCF802F0E94352E11C0AA20B9\r\n:1033700009F4BDCF893349F49FEFE3EFF1E09150B9\r\n:10338000E040F040E1F700C00000802F0E94D92DFE\r\n:1033900088EF8C0D843010F40E946D11DD2041F116\r\n:1033A00080919E0680FD24C0F70112828595859547\r\n:1033B00085950E945D1DC7010E94D01480919E06D4\r\n:1033C0008595859585950F900F900F900F900F9094\r\n:1033D000DF91CF911F910F91FF90EF90DF90CF90F1\r\n:1033E000BF90AF909F908F900C941F1D69E219CDF4\r\n:1033F0000F900F900F900F900F90DF91CF911F9132\r\n:103400000F91FF90EF90DF90CF90BF90AF909F9083\r\n:103410008F90089508958091A806089580E00895FA\r\n:10342000CF93DF9300D01F92CDB7DEB79091CB063C\r\n:10343000943011F589837B836A839093E9008FEF41\r\n:103440009091E800815095FD06C09AE69A95F1F7B3\r\n:1034500000C08111F5CF8091E80085FF0DC040E0EC\r\n:1034600050E063E070E0CE0101960E94C21F80919F\r\n:10347000E8008E778093E8000F900F900F90DF9117\r\n:10348000CF910895BC0184E00C94101ABC0183E034\r\n:103490000C94101ACF93DF9320914101222339F02D\r\n:1034A0002091580327FF03C060E224E002C068E0D7\r\n:1034B00021E02093E9002FEF3091E800215035FD05\r\n:1034C00006C03AE63A95F1F700C02111F5CF2091F8\r\n:1034D000E80025FF1DC0EC0180914101811105C06C\r\n:1034E00040E050E068E070E003C070E040E050E091\r\n:1034F000CE010E94C21F8091E8008E778093E80081\r\n:1035000080E2FE01A9EAB6E001900D928A95E1F70A\r\n:10351000DF91CF91089581E08093E00080E2809375\r\n:10352000D8001092C9008FE097E20197F1F700C030\r\n:10353000000087E090EBDC01809308079093090777\r\n:10354000A0930A07B0930B079CE088E10FB6F894AC\r\n:10355000A895809360000FBE90936000FFCF789491\r\n:103560001F920F920FB60F9211248F939F93AF93D8\r\n:10357000BF938091E4039091E503A091E603B0919D\r\n:10358000E7030196A11DB11D8093E4039093E50329\r\n:10359000A093E603B093E703BF91AF919F918F9102\r\n:1035A0000F900FBE0F901F9018952FB7F894809131\r\n:1035B000E4039091E503A091E603B091E7032FBFE8\r\n:1035C00008951F920F920FB60F9211248F939F931D\r\n:1035D000AF93BF9380915C03811113C08091E4038A\r\n:1035E0009091E503A091E603B091E7034196A11DF8\r\n:1035F000B11D8093E4039093E503A093E603B09399\r\n:10360000E703BF91AF919F918F910F900FBE0F90E5\r\n:103610001F901895209141012223C9F02091580351\r\n:1036200027FF15C0262F2695269526952E31C8F4FE\r\n:10363000FC01E20FF11D677081E090E001C0880F8E\r\n:103640006A95EAF780959281892382830895FC0127\r\n:1036500006962281621301C012823196E817F9079B\r\n:10366000C1F70895209141012223C1F02091580310\r\n:1036700027FF14C0262F2695269526952E3130F546\r\n:10368000FC01E20FF11D677081E090E001C0880F3E\r\n:103690006A95EAF79281892B82830895FC0132961C\r\n:1036A0002FEF30E04191641789F02F3F19F4411159\r\n:1036B00001C0232F3F5F3630A9F72F3F39F0FC01BF\r\n:1036C000E20FF11D27FDFA95628308950895CF93C7\r\n:1036D00084E090E00E945C2FC82F81E290E00E947D\r\n:1036E0005C2F2C2F30E0A901582BCA01CF910895EF\r\n:1036F0006BEE7EEF80E090E00E94982F60E082E029\r\n:1037000090E00E947A2F60E083E090E00E947A2FA0\r\n:103710001092A3061092A4061092A5061092A60677\r\n:1037200060E084E090E00E947A2F60E081E290E027\r\n:103730000E947A2F60E085E090E00E947A2F60E09E\r\n:1037400086E090E00E947A2F6FEF87E090E00E9481\r\n:103750007A2F40E050E0BA0188E090E00E948C2F80\r\n:1037600060E08DE090E00E947A2F40E050E0BA01E6\r\n:1037700088E190E00E948C2F60E087E190E00E9459\r\n:103780007A2F40E050E0BA018CE190E00E948C2F4B\r\n:1037900060E080E290E00E947A2F40E050E0BA01C1\r\n:1037A00088E190E00E948C2F40E050E0BA018FE069\r\n:1037B00090E00E948C2F40E050E0BA0183E190E05D\r\n:1037C0000C948C2F8091A20681111092A20608956C\r\n:1037D0009091A1068091A006892B20919F06982F99\r\n:1037E000922B90930F068091A2068823D9F0892B03\r\n:1037F00080930F0680914101882331F08091580316\r\n:1038000087FF02C08EE101C086E0E1E1F6E090E0D2\r\n:10381000815028F021912223D9F39F5FF9CF911194\r\n:103820000E94E21BE0915A03F0915B033097A9F0EC\r\n:1038300080914101882359F08091580387FF07C088\r\n:1038400080910F068093100685E080930F0602801A\r\n:10385000F381E02D8FE096E00994089580E090E0F8\r\n:103860000E94571180E090E00E9441111092A00642\r\n:1038700010929F060C94E81BBF92CF92DF92EF92BA\r\n:10388000FF920F931F93CF93DF938C01C09000059D\r\n:10389000D0900105E0900205F09003058091A30609\r\n:1038A0009091A406A091A506B091A606C82AD92A8F\r\n:1038B000EA2AFB2ACFE1D0E0D701C6010C2E04C0D2\r\n:1038C000B695A795979587950A94D2F780FD04C081\r\n:1038D000219790F7B12C07C0BC2EB8018C2F0E9405\r\n:1038E00079260197A9F38B2DDF91CF911F910F912D\r\n:1038F000FF90EF90DF90CF90BF900895CF93DF932C\r\n:10390000EC010E943C1CBE010E947926DF91CF9100\r\n:1039100008950E947E1C292F2F70E92FE295EF70E9\r\n:103920004E2F50E0FA013297EE30F105B8F4E3562D\r\n:10393000FF4F0C942930803F99F018F4883E70F4C2\r\n:103940000FC0843F59F40CC0883E50F0813F31F4E1\r\n:1039500007C0822F869586958695089580E0089504\r\n:1039600081E008952EE0929F800D1124682F6695C6\r\n:1039700066956695982F977085E0689FB001112431\r\n:1039800040E050E080E0FB01E40FF51FE959F94FFA\r\n:10399000208130E0092E02C0369527950A94E2F77F\r\n:1039A00021703327042E01C0220F0A94EAF7822BDC\r\n:1039B0004F5F5F4F4530510531F708952EE0929FDC\r\n:1039C000800D1124E82FE695E695E695877051E085\r\n:1039D00001C0550F8A95EAF785E0E89FF0011124B0\r\n:1039E000E959F94F20E030E070E04081CB01022E30\r\n:1039F00002C0969587950A94E2F781708195842795\r\n:103A00008523842781932F5F3F4F2530310569F748\r\n:103A10000895CF92DF92EF92FF926B017C010E949A\r\n:103A2000FC2AC0920005D0920105E0920205F092B6\r\n:103A30000305FF90EF90DF90CF900C942E1C0F9316\r\n:103A40001F9341E050E060E070E004C0440F551F58\r\n:103A5000661F771F8A95D2F74095509560957095AF\r\n:103A60008091000590910105A0910205B091030598\r\n:103A70008A019B01082319232A233B23C901B8018A\r\n:103A80001F910F910C94091D20919E068095822311\r\n:103A900080939E06982F977079F430E0482F082E77\r\n:103AA000000C550B2417350739F0859585958595BC\r\n:103AB0000E941F1D10929E0608950F931F9341E0D0\r\n:103AC00050E060E070E004C0440F551F661F771F90\r\n:103AD0008A95D2F78091000590910105A091020589\r\n:103AE000B09103058A019B01082B192B2A2B3B2B34\r\n:103AF000C901B8011F910F910C94091D6093A30691\r\n:103B00007093A4068093A5069093A6060C942E1C91\r\n:103B10008091660690913506891719F08F5F87703E\r\n:103B2000FBCF08950F931F93CF93DF9380913406BB\r\n:103B300082958F7009F05DC080913106882309F469\r\n:103B400058C0809166061091350660912F067091DD\r\n:103B50003006C0913206D091330691E06F3F09F0F4\r\n:103B600090E0292F06E0811709F443C0209721F047\r\n:103B70007F3F21F030E003C031E001C0322F90E000\r\n:103B800030FD34C0089FF001099FF00D1124DF01C2\r\n:103B9000AA5CB94F11963C911197371327C03C91FD\r\n:103BA000361324C012963C91129731111FC0139600\r\n:103BB0004D915C9114974C1B5D0B483C5105B0F442\r\n:103BC000809134068F70806180933406E55CF94FF4\r\n:103BD00080818F70806180838FE296E00E94D01494\r\n:103BE000DF91CF911F910F910C94881D01968770E2\r\n:103BF000BACFDF91CF911F910F9108959F92AF920D\r\n:103C0000BF92CF92DF92EF92FF920F931F93CF93C9\r\n:103C1000DF93CDB7DEB761970FB6F894DEBF0FBE66\r\n:103C2000CDBF8C0185E0F801DE011D9601900D925B\r\n:103C30008A95E1F7F80190818181E28030912F0629\r\n:103C4000609130064091320650913306411551057E\r\n:103C500031F06F3F31F421E03F3F19F403C021E020\r\n:103C600001C020E0F22FF1709F2E20FD23C1F8014A\r\n:103C7000C380D4802FE2A22E26E0B22EF09031062F\r\n:103C8000F601E41BF50BFF2009F4CEC020913406A9\r\n:103C9000E83CF10508F099C0422F407F09F051C07F\r\n:103CA000681311C039130FC0FE2CE1100CC02F7027\r\n:103CB000206120933406C5010E94D01480913406FF\r\n:103CC000F801858337C1CD2831F08F3F31F421E0F1\r\n:103CD0009F3F19F403C021E001C020E020FD03C094\r\n:103CE00021E02E2502C020E030E0F22FF170FF2EFF\r\n:103CF00020FF1DC0209166064091350656E024172E\r\n:103D000009F4F6C030E0529FF001539FF00D1124EA\r\n:103D1000EA5CF94F6181861306C06081961303C087\r\n:103D20006281E61204C02F5F3F4F2770E8CFFE2C60\r\n:103D3000EE2009F4FFC08091340681608093340640\r\n:103D400050C0681307C0391305C0E11003C0F80163\r\n:103D500025838DC09D878E878D859E850E94891CB9\r\n:103D6000882369F1EE2059F120913406822F829543\r\n:103D70008F7090E0029774F080912F06909130063A\r\n:103D800098878F831986DB86CA862C87CE01079693\r\n:103D90000E94D01486E0F801AFE2B6E001900D92E7\r\n:103DA0008A95E1F70E94921D0DC06817E1F09D878A\r\n:103DB0008E878D859E850E94891C81111EC0C80139\r\n:103DC0000E94D014FF24F394B5C0422F407F69F7BE\r\n:103DD0008FE296E00E94D01486E0F50111928A9558\r\n:103DE000E9F7F12CA7C03913E2CFE110E0CFF801D9\r\n:103DF0002583C8010E94D01457C0EE2001F3209102\r\n:103E00003406822F82958F7090E002971CF2809189\r\n:103E10002F06909130069A8389831B82DD82CC82A3\r\n:103E20002E83CE010196B4CFE83CF105E8F5FE2CD7\r\n:103E3000EE2029F2681327C0391325C020913406DB\r\n:103E400020FD18C0822F82958F70482F50E04115B9\r\n:103E5000510581F0F80125834F30510541F08F5F06\r\n:103E6000982F9295907F822F8F70892B8583C80120\r\n:103E70000E94D01486E0F801AFE2B6E001900D9206\r\n:103E80008A95E1F757C09D878E878D859E850E9414\r\n:103E9000891C81117FCF8091340681608093340624\r\n:103EA000C8010E94D01446C086E0F50111928A959F\r\n:103EB000E9F740C0EE2009F482CF9D878E878D857B\r\n:103EC0009E850E94891CF82E882309F478CF86E00D\r\n:103ED000F801AFE2B6E001900D928A95E1F780918A\r\n:103EE0002F06909130060E947E1C0E94921D22C0D7\r\n:103EF0009D878E878D859E850E947E1C292F229509\r\n:103F00002F70223028F49F7039F0811105C00BC04A\r\n:103F1000243028F49F7049F4805E883020F0C80176\r\n:103F20000E94D0149F2CF92C05C0F8019581907F38\r\n:103F300099F7F9CF8F2D61960FB6F894DEBF0FBEBB\r\n:103F4000CDBFDF91CF911F910F91FF90EF90DF9048\r\n:103F5000CF90BF90AF909F9008951092A10680914E\r\n:103F60004101882331F08091580387FF02C08EE120\r\n:103F700001C086E0E1E1F6E0DF011D928A95E9F7F4\r\n:103F80000C942E1CEF92FF920F931F93CF93DF930D\r\n:103F90007C018B010E94A92B811119C0E701011539\r\n:103FA0001105A1F08091E80085FD0AC08091E8002C\r\n:103FB0008E778093E8000E94A92B882381F307C0A5\r\n:103FC00089918093F10001501109E9CF80E0DF91E0\r\n:103FD000CF911F910F91FF90EF900895CF92DF92B4\r\n:103FE000EF92FF920F931F93CF93DF93CDB7DEB77E\r\n:103FF0002F970FB6F894DEBF0FBECDBF7C018901AD\r\n:104000001A861B861C861D8619821A8286E0D82E87\r\n:10401000DB8281E08C8384E08D837E836F8358878D\r\n:10402000498749E050E0BE016F5F7F4FF701808113\r\n:104030000E94502997FD40C0C7010E94692997FD41\r\n:104040003BC060E0F70180810E949F2897FD34C04B\r\n:104050001E86DF8662E070E0CE010E960E94672821\r\n:1040600097FD2AC061E0F70180810E949F2897FD9B\r\n:1040700023C081E00E94452897FD1EC06E01FAE032\r\n:10408000CF0ED11CE12CF12C8FEFE81AF80A81E059\r\n:1040900094E0E916F1040CF080E00E94452897FDB9\r\n:1040A0000BC0F60181936F01F4E0EF16F10461F7A4\r\n:1040B0000E94972884E090E097FD09C04A855B85BF\r\n:1040C0006C857D85F80140835183628373832F96CD\r\n:1040D0000FB6F894DEBF0FBECDBFDF91CF911F9119\r\n:1040E0000F91FF90EF90DF90CF900895CF93DF93E3\r\n:1040F0001F92CDB7DEB7BE016F5F7F4F85E491E0C1\r\n:104100000E941A2997FD13C09981292F237080914D\r\n:10411000470190914801211102C060E001C061E0B7\r\n:104120000E94FB291816190614F480E090E00F9005\r\n:10413000DF91CF9108956F927F928F929F92AF926D\r\n:10414000BF92CF92DF92EF920F931F93CF93DF93A3\r\n:104150003C01C091420181E1C89FC02D1124D1E1F1\r\n:10416000DC0FD53508F0D4E560910607669580919F\r\n:10417000FE069091FF060E94D812182FCD1708F066\r\n:1041800044C08C2E912CF401EB53FD4F9081809113\r\n:1041900043018923C1F1F401EE0FFF1FE35EFD4FE0\r\n:1041A000C080D12C80E7C81AD108F401EE0FFF1FA0\r\n:1041B000E25EFD4FA080B12CE0E2AE1AB108CC9CCB\r\n:1041C0009001CD9C300D300D1124AA9CC001AB9CF8\r\n:1041D000900D900D1124820F931F0E947E12082FC4\r\n:1041E000609103077091040780910507E12E950106\r\n:1041F000A601F30109950E94E212462F282F672F8E\r\n:10420000C4010E944512CF5FB9CF81E0D43508F0D8\r\n:1042100080E0DF91CF911F910F91EF90DF90CF90D1\r\n:10422000BF90AF909F908F907F906F900895CF92A6\r\n:10423000DF92EF92FF920F931F93CF93DF936C0166\r\n:10424000C091420181E1C89FC02D1124D1E1DC0F52\r\n:10425000D53508F0D4E56091060766958091FE0695\r\n:104260009091FF060E94D812182FCD1778F5EC2EEA\r\n:10427000F12CF701EB53FD4F90818091430189238D\r\n:1042800019F1F701EE0FFF1FE25EFD4F208130E0D4\r\n:1042900020523109F701EE0FFF1FE35EFD4F408111\r\n:1042A00050E04057510960910307709104078091D5\r\n:1042B0000507012FF60109950E94E212462F282FCB\r\n:1042C000672FC7010E944512CF5FCFCF81E0D43561\r\n:1042D00008F080E0DF91CF911F910F91FF90EF9058\r\n:1042E000DF90CF900895DF92EF92FF920F931F938C\r\n:1042F000CF93DF937C01C091420181E1C89FC02D23\r\n:104300001124D1E1DC0FD53508F0D4E56091060722\r\n:10431000669566958091FE069091FF060E94D812E0\r\n:10432000D82ECD17F0F40C2F10E0F801EB53FD4F11\r\n:10433000908180914301892391F0609103077091EE\r\n:104340000407809105072D2D4C2FF70109950E9438\r\n:10435000E212462F282F672FC8010E944512CF5F17\r\n:10436000E0CF81E0D43508F080E0DF91CF911F915C\r\n:104370000F91FF90EF90DF9008959F92AF92BF92C0\r\n:10438000CF92DF92EF92FF920F931F93CF93DF9321\r\n:104390006C01C091420181E1C89FC02D1124D1E17F\r\n:1043A000DC0FD53508F0D4E5609106076695669573\r\n:1043B0008091FE069091FF060E94D812182F80E48B\r\n:1043C000810F0E945D1290E8F92EF80E812F0E9455\r\n:1043D0005D1220E8922E980ECD1700F5AC2EB12C70\r\n:1043E000F501EB53FD4F9081809143018923A1F0AA\r\n:1043F000609103077091040780910507E12E0C2F4F\r\n:10440000292D4F2DF60109950E94E212462F282FE3\r\n:10441000672FC5010E944512CF5FDECF81E0D43502\r\n:1044200008F080E0DF91CF911F910F91FF90EF9006\r\n:10443000DF90CF90BF90AF909F900895CF92DF9282\r\n:10444000EF92FF920F931F93CF93DF936C01C09174\r\n:10445000420181E1C89FC02D1124D1E1DC0FD53587\r\n:1044600008F0D4E52091060730E040E050E06FEF1F\r\n:104470007FEF80E090E00E949E2F8901CD17E8F544\r\n:10448000EC2EF12CF701EB53FD4F9081809143010D\r\n:10449000892389F19091D506915097FD15C0492F38\r\n:1044A000092E000C550BFA01EB52F94F8189C81304\r\n:1044B000F3CF440F551FFA01EB52F94F218D328D86\r\n:1044C0002017310748F701C0980160910607C9011C\r\n:1044D0000E94D812AC01609103077091040780918B\r\n:1044E0000507F60109950E94E212462F282F672F33\r\n:1044F000C7010E944512CF5FC1CF81E0D43508F0DB\r\n:1045000080E0DF91CF911F910F91FF90EF90DF90AE\r\n:10451000CF9008952F923F924F925F926F927F9229\r\n:104520008F929F92AF92BF92CF92DF92EF92FF92C3\r\n:104530000F931F93CF93DF93CDB7DEB727970FB6B7\r\n:10454000F894DEBF0FBECDBF282E4B012091420153\r\n:1045500081E1289F802D11248E83182F1F5E153531\r\n:1045600008F014E53091D50639839E81911708F043\r\n:1045700077C08E81682E712CF301EB53FD4F908133\r\n:1045800080914301892309F467C03090030740906C\r\n:104590000407522C1F82C301880F991FDC01A35E00\r\n:1045A000BD4FBB83AA83C301880F991FFC01E25E44\r\n:1045B000FD4FFD83EC83F9815F16E0F5E52CF12CCE\r\n:1045C000AA81BB81CC90D12CF701EB52F94F8181AC\r\n:1045D000C81AD108AC81BD81AC90B12C8185A81AD4\r\n:1045E000B108CC9C9001CD9C300D300D1124AA9CBB\r\n:1045F000C001AB9C900D900D1124820F931F0E945F\r\n:104600007E12082FF701EE0FFF1FEB52F94F60915A\r\n:104610000607818D928D0E94D8127C019501A6011A\r\n:10462000632D742D8F81F4010995362E472E8F83CB\r\n:104630005394C1CF209105078F81382F329F312DA0\r\n:104640001124832F632D742D0E94E212462F282FF0\r\n:10465000672FC3010E9445128E818F5F8E8385CFA5\r\n:1046600081E0143508F080E027960FB6F894DEBF9D\r\n:104670000FBECDBFDF91CF911F910F91FF90EF90B3\r\n:10468000DF90CF90BF90AF909F908F907F906F9072\r\n:104690005F904F903F902F9008951F93CF93DF939B\r\n:1046A000CDB7DEB7AA970FB6F894DEBF0FBECDBF69\r\n:1046B000EDECF6E08091F100819346E0E53DF407F2\r\n:1046C000C9F78091CE06833009F462C030F481309E\r\n:1046D00071F0823009F49CC0B3C08A3009F488C0FC\r\n:1046E0008B3009F46DC0893009F0AAC020C08091D8\r\n:1046F000CD06813A09F0A4C08091E800877F8093BD\r\n:10470000E8008091D1069091D206892B21F460E2D5\r\n:1047100089EA96E003C060E080E090E070E00E94EB\r\n:10472000662D8091E8008B778093E80089C08091A6\r\n:10473000CD06813209F084C08091D1069091D206D5\r\n:10474000009719F0029709F07BC08091E800877FFD\r\n:104750008093E8008091E80082FD05C08091CB063F\r\n:104760008111F8CF6DC02091F3008091F20090E0AC\r\n:10477000922B029729F48091F1008B7F813021F4F4\r\n:104780008091F1008093A8068091E8008B7754C057\r\n:104790008091CD06813A09F053C08091D106909165\r\n:1047A000D206892B09F04CC08091E800877F809366\r\n:1047B000E8008091E80080FFFCCF8091410137C084\r\n:1047C0008091CD068132E1F58091D1069091D2069B\r\n:1047D000892BB1F58091E800877F8093E8000E94E3\r\n:1047E000DC2B8091CF06809341010E94AD1F28C031\r\n:1047F0008091CD06813221F58091E800877F8093FA\r\n:10480000E8000E94DC2B8091D0068093A70618C098\r\n:104810008091CD06813AA1F48091E800877F809352\r\n:10482000E8008091E80080FFFCCF8091A70680938C\r\n:10483000F1008091E8008E778093E8000E94DC2BE5\r\n:104840008091E80083FFDDC18091CD069091CE0676\r\n:10485000492F50E04A30510508F0D3C1FA01E5551F\r\n:10486000FF4F0C942930803821F0823809F0C9C1FB\r\n:1048700008C08091C9069091CA06992389F0826088\r\n:104880000FC08091D1068F70873008F0BAC1809335\r\n:10489000E9008091EB0085FB882780F91092E90000\r\n:1048A0009091E800977F9093E8008093F100109238\r\n:1048B000F10070C1282F2D7F09F0A3C1882319F0C2\r\n:1048C000823061F09EC18091CF06813009F099C19C\r\n:1048D000933009F080E08093CA062EC08091CF0605\r\n:1048E00081112AC08091D1068F702FEF280F2630BA\r\n:1048F00008F087C18093E9002091EB0020FF1CC0E5\r\n:10490000933021F48091EB00806214C09091EB0011\r\n:1049100090619093EB0021E030E0A90102C0440FC8\r\n:10492000551F8A95E2F74093EA001092EA008091C1\r\n:10493000EB0088608093EB001092E9008091E80022\r\n:10494000877F8093E8000E94DC2B5BC1811159C1F5\r\n:104950001091CF061F778091E3008078812B8093A0\r\n:10496000E3008091E800877F8093E8000E94DC2BC1\r\n:104970008091E80080FFFCCF8091E3008068809305\r\n:10498000E300111102C082E001C083E08093CB06F6\r\n:1049900038C18058823008F034C12091CF06309160\r\n:1049A000D0062C3D53E0350779F583E08A838AE20F\r\n:1049B00089834FB7F894DE01139620E03EE051E280\r\n:1049C000E32FF0E050935700E49120FF03C0E295FD\r\n:1049D000EF703F5FEF708E2F90E0EA3010F0C796D7\r\n:1049E00001C0C0968D939D932F5F243149F74FBF2F\r\n:1049F0008091E800877F8093E8006AE270E0CE0152\r\n:104A000001960E94662DB4C08091D1069091D20685\r\n:104A1000432F552743305105A9F068F44130510523\r\n:104A200009F4FEC04230510509F0EBC08BE590E07F\r\n:104A3000E9EDF5E04BC04132510529F14232510513\r\n:104A400089F1DFC0C901992781309105A1F058F0A3\r\n:104A5000029709F0D6C0E6E4F6E0E4918E2F90E0EC\r\n:104A6000E6E4F6E030C0ECEAF6E0E4918E2F90E068\r\n:104A7000ECEAF6E028C0E8E9F6E0E4918E2F90E059\r\n:104A8000E8E9F6E020C08330910508F0BAC0880F4D\r\n:104A9000991FFC01ED53FE4F0190F081E02D89E05C\r\n:104AA00090E014C08330910508F0ABC0FC01EE0F1C\r\n:104AB000FF1FE354FE4F0190F081E02DDC01A6546E\r\n:104AC000BE4F8C9190E0009709F49BC02091E800C4\r\n:104AD000277F2093E8002091D3063091D406281731\r\n:104AE000390708F4C90140E0009789F12091CB060D\r\n:104AF000222309F43DC02530D9F12091E80023FD9F\r\n:104B000037C02091E80022FD2FC02091E80020FF4F\r\n:104B1000EBCF4091F3002091F20030E0342B00976E\r\n:104B200059F02830310540F444914093F10031961A\r\n:104B300001972F5F3F4FF3CF41E02830310509F057\r\n:104B400040E02091E8002E772093E800CDCF41117E\r\n:104B5000CDCF0AC08091CB06882351F0853041F03B\r\n:104B60008091E80083FD04C08091E80082FFF2CFCD\r\n:104B70008091E8008B778093E80043C0803809F08B\r\n:104B800040C08091E800877F8093E8008091CC0648\r\n:104B90008093F1008091E8008E77D3CE811131C0EF\r\n:104BA0008091CF069091D0069927029754F5809175\r\n:104BB000E800877F8093E8001091CF061093CC0621\r\n:104BC0000E94DC2B111106C08091E30087FD02C01A\r\n:104BD00081E001C084E08093CB0642E061EC81E09B\r\n:104BE0000E94FB2B42E261EC84E00E94FB2B42E23C\r\n:104BF00061EC82E00E94FB2B42E260EC83E00E94C9\r\n:104C0000FB2B8091E80083FF10C08091E800877F34\r\n:104C10008093E8008091EB0080628093EB0005C0F8\r\n:104C200082E190E0E4E3F6E051CFAA960FB6F89463\r\n:104C3000DEBF0FBECDBFDF91CF911F910895909140\r\n:104C4000580392FF0DC0282F2871283019F4877F50\r\n:104C5000846006C0282F2471243011F48B7F886073\r\n:104C600093FF0DC0282F2871283119F4877E8461A5\r\n:104C700006C0282F2471243111F48B7E8861209185\r\n:104C8000590320FF0DC0382F3871383019F4877F51\r\n:104C9000816006C0382F3171313011F48E7F886009\r\n:104CA00021FF0DC0282F2871283119F4877E8161DA\r\n:104CB00006C0282F2171213111F48E7E886194FD68\r\n:104CC000877E0895F894E82FE295EF70F0E031A127\r\n:104CD000282F2F7081E090E001C0880F2A95EAF715\r\n:104CE000982F9095932391A392A1892B82A37894D6\r\n:104CF0000895CF93DF930E943612EC01823891051C\r\n:104D000059F1A0F48133910509F473C040F489325C\r\n:104D1000910509F467C08A9709F472C084C085338D\r\n:104D2000910509F458C0C997B9F07DC0833E91053B\r\n:104D300071F138F4803E9105B1F0823E910511F198\r\n:104D400072C0863E9105B9F1873E9105C9F1843E56\r\n:104D5000910509F068C024C08091580380FD5DC0B2\r\n:104D600081FD5BC060C08091580380FD50C0809180\r\n:104D7000590380FF36C18091580384FD30C1C3EED2\r\n:104D8000D0E02FC18091580382FF2BC1F4CF8091D6\r\n:104D9000580382FD3FC08091590380FD3EC0EBCF98\r\n:104DA0008091590381FF1DC18091580384FD17C173\r\n:104DB000C7EED0E016C18091580383FF12C1F4CF33\r\n:104DC0008091580383FD2CC08091590381FFECCF63\r\n:104DD000C4EED0E006C18091580385FF02C1C9E24C\r\n:104DE000D0E0FFC08091580385FFFBC0C5E3D0E051\r\n:104DF000F8C08091580386FFF4C0CAE2D0E0F1C049\r\n:104E00008091580386FFEDC0C1E3D0E0EAC0C9E35A\r\n:104E1000D0E0E7C0C2EED0E0E4C0C0EED0E0E1C038\r\n:104E2000C6EED0E0DEC0C11582E5D80708F066C046\r\n:104E3000C11591E5D90728F0DC2FCC27C16FD06AC6\r\n:104E4000D0C0C83ED10560F5C03ED10508F0C9C04C\r\n:104E5000C83AD105B0F4C53AD10540F0C55AD0E002\r\n:104E6000C75EDC4FC881D0E0D064BBC0C130D10583\r\n:104E700009F4B7C008F4B3C0C430D10508F4AFC01A\r\n:104E8000B0C0CF3BD10508F0AAC0C85AD0E0CC0FC3\r\n:104E9000DD1FC45EDC4F0990D881C02DD464A1C051\r\n:104EA000C11520E5D207E0F0CE0174E09695879514\r\n:104EB0007A95E1F783709C2F937021E030E002C077\r\n:104EC000220F331F9A95E2F73C68382BCF70C695B6\r\n:104ED000C69580E2C89FE0011124C22BD32B81C06C\r\n:104EE000C11580E4D80718F0DF70D06A7AC0CE010F\r\n:104EF0009A9581159F4108F474C071C0C11586E56B\r\n:104F0000D807F0F5C11595E5D90750F08C2F0E9410\r\n:104F10001F268F71C82FD0E0DC2FCC27D06261C054\r\n:104F2000C11524E5D20728F0DC2FCC27C46FD06A46\r\n:104F300058C09E01237033278C2F86958695C11506\r\n:104F4000D34578F4C1E0D0E002C0CC0FDD1F2A9534\r\n:104F5000E2F720E2829FC0011124C82BD92BDC6824\r\n:104F600040C0C1E0D0E002C0CC0FDD1F2A95E2F7BF\r\n:104F700020E2829FC0011124C82BD92BDA6831C0EE\r\n:104F8000C1152AE5D207E8F4C11589E5D80780F0F4\r\n:104F90008C2F8F700E941F2694E0D695C7959A9506\r\n:104FA000E1F7CF70D0E0DC2FCC27D069C82B19C037\r\n:104FB000C11598E5D90798F0DC2FCC27C06FD06ACF\r\n:104FC00010C0CE0190568115904248F48D2F8F71FC\r\n:104FD0000E941F26DD27D0628F71D82B02C0C0E04F\r\n:104FE000D0E0CE01DF91CF910895CF92DF92EF9282\r\n:104FF000FF926C01EE24FF24C114D104E104F104FA\r\n:1050000021F0C701B60120E101C020E0C72ED82E53\r\n:10501000E92EFF24C114D104E104F10419F0285F42\r\n:10502000C701B6016B017C0154E0F694E794D79474\r\n:10503000C7945A95D1F7C114D104E104F10419F0D1\r\n:105040002C5FC701B6016B017C0142E0F694E79446\r\n:10505000D794C7944A95D1F7C114D104E104F1045F\r\n:1050600019F02E5FC701B601DC01CB01B695A795FB\r\n:1050700097958795892B8A2B8B2B09F02F5F822F91\r\n:10508000FF90EF90DF90CF900895882311F084EC8B\r\n:1050900001C084E88093BC0080E49FE1A0E0B0E020\r\n:1050A0002091BC0027FD08C00097A105B10561F063\r\n:1050B0000197A109B109F4CF892B8A2B8B2B21F001\r\n:1050C0008091BB0090E008958FEF9FEF0895DB0182\r\n:1050D000FC0120E030E084E82A173B071CF59191A1\r\n:1050E0009093BB008093BC0040E45FE160E070E01F\r\n:1050F0009091BC0097FD0AC04115510561057105ED\r\n:1051000099F04150510961097109F2CF452B462BA5\r\n:10511000472B51F09091B900987F983229F42F5F76\r\n:105120003F4FDACFC90108958FEF9FEF089584E9CB\r\n:105130008093BC008091BC0084FDFCCF0895262F95\r\n:1051400094EA9093BC0040E45FE160E070E09091ED\r\n:10515000BC0097FD0AC0411551056105710549F074\r\n:105160004150510961097109F2CF452B462B472B5C\r\n:1051700019F48FEF9FEF08959091B900987F9830C0\r\n:1051800011F09031B1F7682F660F622B6093BB006E\r\n:1051900084E88093BC0080E49FE1A0E0B0E020912F\r\n:1051A000BC0027FD08C00097A105B10511F30197C8\r\n:1051B000A109B109F4CF892B8A2B8B2BD1F28091D5\r\n:1051C000B900887F883111F0803499F680E090E052\r\n:1051D00008950F931F93CF93DF9300D0CDB7DEB721\r\n:1051E0006A83FC01808193E2998360E00E949F289A\r\n:1051F00097FD14C061E070E0CE0101960E9467281F\r\n:1052000097FD0CC061E070E0CE0102960E94672815\r\n:105210008C0197FD05C00E94972802C0282F02C06C\r\n:10522000202F912F822F0F900F90DF91CF911F9100\r\n:105230000F910895FF920F931F93CF93DF931F92C7\r\n:10524000CDB7DEB78B01FC01F0808DE1898360E092\r\n:105250008F2D0E949F2897FD1AC061E070E0CE015B\r\n:1052600001960E94672897FD12C061E08F2D0E9471\r\n:105270009F2897FD0CC080E00E94452897FD07C03D\r\n:10528000F80180830E94972821E090E001C0282F38\r\n:10529000822F0F90DF91CF911F910F91FF90089572\r\n:1052A0000F931F93CF93DF93EB018A0160E00E947D\r\n:1052B0009F2897FD09C0B801CE010E946728EC0124\r\n:1052C00097FF0E949728CE01DF91CF911F910F91F8\r\n:1052D0000895CF93DF9300D01F92CDB7DEB7209112\r\n:1052E0004F01309150014091510129833A834B8302\r\n:1052F00043E050E0BE016F5F7F4FFC0180810E9460\r\n:1053000050290F900F900F90DF91CF9108958F92B9\r\n:105310009F92AF92BF92CF92DF92EF92FF920F9344\r\n:105320001F93CF93DF93CDB7DEB729970FB6F894CD\r\n:10533000DEBF0FBECDBF7C01B42EA52E962E872ECC\r\n:10534000690160E0FC0180810E949F2897FD22C0D6\r\n:1053500019821A8286E0800F8B831C820D838E82D5\r\n:105360009F82A886B98669E070E0CE0101960E940E\r\n:10537000672897FD0FC0B801C6010E94672897FDF6\r\n:1053800009C00E949728C7010E94692997FD02C0A1\r\n:10539000912F01C0082F802F29960FB6F894DEBFF9\r\n:1053A0000FBECDBFDF91CF911F910F91FF90EF9076\r\n:1053B000DF90CF90BF90AF909F908F9008950F9304\r\n:1053C0001F93CF93DF9300D000D0CDB7DEB7098312\r\n:1053D0001A832B833C8304E010E09E012F5F3F4F34\r\n:1053E0000E9487290F900F900F900F90DF91CF911F\r\n:1053F0001F910F910895EF92FF920F931F93CF93F8\r\n:10540000DF9300D000D0CDB7DEB77C01162F198214\r\n:105410001A821B821C829E012F5F3F4F48E259E097\r\n:1054200060E87FEBFC01808191810E94EE1F97FD77\r\n:1054300036C089819A81AB81BC8141E050E060E057\r\n:1054400070E0F701028004C0440F551F661F771FEC\r\n:105450000A94D2F7112329F0842B952BA62BB72B76\r\n:1054600008C0409550956095709584239523A62398\r\n:10547000B72389839A83AB83BC8309811A812B81EB\r\n:105480003C8148E259E060E87FEBF701808191813F\r\n:105490000E94DF291816190614F480E090E00F909E\r\n:1054A0000F900F900F90DF91CF911F910F91FF9070\r\n:1054B000EF9008950F931F93CF93DF931F92CDB773\r\n:1054C000DEB78C01BE016F5F7F4F0E941A2997FDE6\r\n:1054D00024C08981F80191819817E9F08183982F80\r\n:1054E0009370923039F0869586958370823061F49E\r\n:1054F00060E001C061E0F801828193810E94FB2994\r\n:1055000097FD0BC067E701C066E6C8010E94E92865\r\n:105510001816190614F480E090E00F90DF91CF91F7\r\n:105520001F910F910895EF92FF920F931F93CF93C6\r\n:10553000DF9300D000D01F92CDB7DEB77C01FC0115\r\n:1055400042815381648175814D5F534F6F47704431\r\n:10555000808191811D8201E010E09E012B5F3F4F11\r\n:105560000E94872997FD3CC060E0C7010E94FB298B\r\n:1055700019821A821B821C829E012F5F3F4F48E0D6\r\n:1055800059E060E87FEBF701808191810E94EE1F76\r\n:1055900097FD26C001E010E020E030E0F701028036\r\n:1055A00004C0000F111F221F331F0A94D2F78981F4\r\n:1055B0009A81AB81BC81082B192B2A2B3B2B0983A9\r\n:1055C0001A832B833C8348E059E060E87FEB8081BD\r\n:1055D00091810E94DF291816190614F480E090E0EA\r\n:1055E0000F900F900F900F900F90DF91CF911F9120\r\n:1055F0000F91FF90EF90089520910505211110C0A3\r\n:105600000E94F527843060F495E0989FF001112402\r\n:10561000E55EFE4FA2E0B7E001900D929A95E1F7AA\r\n:10562000089590910505911112C080931E018093F9\r\n:1056300023018093280180932D01609100057091D2\r\n:10564000010580910205909103050C94FC2A0895B0\r\n:1056500044E150E063EE72E0882361F08BE191E079\r\n:105660000E946A2F4CEF50E067EF72E084E094E014\r\n:105670000C946A2F8BE191E00E944C2F4CEF50E08C\r\n:1056800067EF72E084E094E00C944C2F1F920F922D\r\n:105690000FB60F9211242F933F934F935F936F9305\r\n:1056A0007F938F939F93AF93BF93CF93DF93EF93AA\r\n:1056B000FF93C091E900CF708091EC00D82FD1709A\r\n:1056C00080FDD0E81092E9008091F000877F809300\r\n:1056D000F00078940E944D231092E9008091F00030\r\n:1056E00088608093F000CD2BCF70C093E900FF91CC\r\n:1056F000EF91DF91CF91BF91AF919F918F917F916A\r\n:105700006F915F914F913F912F910F900FBE0F902E\r\n:105710001F901895E8EDF0E080818E7F80831092D5\r\n:10572000E2001092DA001092E100A0EEB0E08C915D\r\n:1057300081608C9380818F77808319BCA7EDB0E066\r\n:105740008C918E7F8C9380818F7E8083109207074F\r\n:1057500008952091E4003091E50095E64091EC0039\r\n:10576000842F817040FF23C08091E80080FD1DC020\r\n:105770008091CB06882399F0853099F08091EB00D9\r\n:1057800085FD11C04091E4005091E50024173507D4\r\n:1057900029F3915011F09A01E1CF84E0089582E05D\r\n:1057A000089583E0089581E0089580E00895409190\r\n:1057B000E80042FFDDCF08958091CD0687FF11C03C\r\n:1057C0008091E80082FD05C08091CB068111F8CF61\r\n:1057D00011C08091E8008B770BC08091CB068823A5\r\n:1057E00049F08091E80080FFF8CF8091E8008E7743\r\n:1057F0008093E8000895982F973068F59093E9001A\r\n:10580000981739F07091EC002091ED005091F00064\r\n:1058100003C0242F762F50E021FD02C09F5FECCF04\r\n:105820003091EB003E7F3093EB003091ED003D7FF7\r\n:105830003093ED003091EB0031603093EB007093CA\r\n:10584000EC002093ED005093F0002091EE0027FD36\r\n:10585000E5CF80E008958F708093E90081E008959E\r\n:10586000CF92DF92EF92FF920F931F93CF93DF932C\r\n:10587000C8EDD0E088818F7E8883E7EDF0E08081FD\r\n:105880008160808384E082BF81E080930707888104\r\n:105890008E7F888302EE10E0F80110821092DA0009\r\n:1058A00081EEC82ED12CF601108288818F778883F3\r\n:1058B00088818068888388818F7D888319BC109255\r\n:1058C000CB061092CC061092CA061092C90690EE32\r\n:1058D000E92EF12CF70180818B7F808388818160A4\r\n:1058E000888342E060E080E00E94FB2BF60180812B\r\n:1058F0008E7F8083F80180818160808380818860D1\r\n:105900008083F70180818E7F808388818061888396\r\n:10591000DF91CF911F910F91FF90EF90DF90CF908B\r\n:1059200008951F920F920FB60F9211242F933F9359\r\n:105930004F935F936F937F938F939F93AF93BF9397\r\n:10594000EF93FF938091E10082FF09C08091E20014\r\n:1059500082FF05C08091E1008B7F8093E100809100\r\n:10596000DA0080FF2AC08091D80080FF26C0809195\r\n:10597000DA008E7F8093DA008091D90080FF18C012\r\n:1059800080E189BD82E189BD09B400FEFDCF81E0DF\r\n:105990008093CB068091070781110FC00E948A2B4C\r\n:1059A0000E94302C8091E20084608093E20005C068\r\n:1059B00019BC1092CB06109207078091E10080FF7E\r\n:1059C00017C08091E20080FF13C08091E2008E7FBB\r\n:1059D0008093E2008091E20080618093E2008091F8\r\n:1059E000D80080628093D80019BC85E08093CB06F4\r\n:1059F0008091E10084FF2EC08091E20084FF2AC0E4\r\n:105A000080E189BD82E189BD09B400FEFDCF8091AE\r\n:105A1000D8008F7D8093D8008091E1008F7E8093A5\r\n:105A2000E1008091E2008F7E8093E2008091E200AD\r\n:105A300081608093E2008091CC06882311F084E09D\r\n:105A400007C08091E30087FD02C081E001C083E0D0\r\n:105A50008093CB068091E10083FF27C08091E20014\r\n:105A600083FF23C08091E100877F8093E10082E083\r\n:105A70008093CB061092CC068091E1008E7F8093BC\r\n:105A8000E1008091E2008E7F8093E2008091E2004D\r\n:105A900080618093E20042E060E080E00E94FB2BA6\r\n:105AA0008091F00088608093F000FF91EF91BF91AA\r\n:105AB000AF919F918F917F916F915F914F913F91A6\r\n:105AC0002F910F900FBE0F901F9018952091D30625\r\n:105AD0003091D4062617370748F06115710539F45F\r\n:105AE0002091E8002E772093E80001C0B901FC0165\r\n:105AF00020E06115710579F18091CB068823F1F1E1\r\n:105B00008530F1F18091E80083FD3CC08091E80090\r\n:105B100082FD2EC08091E80080FFEBCF2091F30042\r\n:105B20008091F20090E0922B6115710551F0883060\r\n:105B3000910538F421912093F1006150710901968B\r\n:105B4000F3CF21E0089709F020E08091E8008E77FC\r\n:105B50008093E800CECF2111CFCF0AC08091CB0631\r\n:105B6000882361F0853061F08091E80083FD0AC0F0\r\n:105B70008091E80082FFF2CF80E0089582E00895EE\r\n:105B800083E0089581E00895882341F08095909105\r\n:105B9000A10689238093A1060C94E81B089588230D\r\n:105BA00039F09091A106892B8093A1060C94E81BF3\r\n:105BB0000895882309F458C0682F823869F40E9438\r\n:105BC0006D1181FF51C069E38FE096E00E94321BA6\r\n:105BD0000E94E81B69E30EC0833891F40E946D11A6\r\n:105BE00080FF42C063E58FE096E00E94321B0E9476\r\n:105BF000E81B63E58FE096E00E940A1B0C94E81B0B\r\n:105C0000843869F40E946D1182FF2EC067E48FE032\r\n:105C100096E00E94321B0E94E81B67E4EBCF8CEFFA\r\n:105C2000860F813A38F380E2860F883070F467700F\r\n:105C300081E090E001C0880F6A95EAF78095909125\r\n:105C4000A10689238093A106D9CF8BE5860F8330E7\r\n:105C500020F480E090E00C945711685A673120F4EA\r\n:105C600080E090E00C9441110895CF93882309F4CB\r\n:105C7000B5C0C82F8238B1F40E946D1181FDAEC04D\r\n:105C800069E38FE096E00E94321B0E94E81B2FEF31\r\n:105C900080E792E0215080409040E1F700C0000092\r\n:105CA00069E317C08338E1F40E946D1180FD96C04E\r\n:105CB00063E58FE096E00E94321B0E94E81B2FEF05\r\n:105CC00080E792E0215080409040E1F700C0000062\r\n:105CD00063E58FE096E00E940A1BCF910C94E81BCD\r\n:105CE0008438B1F40E946D1182FD78C067E48FE0C2\r\n:105CF00096E00E94321B0E94E81B2FEF80E792E0A3\r\n:105D0000215080409040E1F700C0000067E4E1CFFF\r\n:105D10008CEF8C0F813AB8F5809141018823E1F036\r\n:105D20008091580387FF18C0EC2FE695E695E6951D\r\n:105D3000F0E0E15FF94F8281282F30E04C2F47706F\r\n:105D400081E090E002C0880F991F4A95E2F7822314\r\n:105D50009323892B59F411C0E1E1F6E08191C81732\r\n:105D600029F026E0E731F207C9F707C06C2F8FE072\r\n:105D700096E00E940A1B0E94E81B6C2F8FE096E0C1\r\n:105D80000E94321BAACF80E28C0F883068F4C77063\r\n:105D900081E090E001C0880FCA95EAF79091A106D2\r\n:105DA000892B8093A10699CFEBE5EC0FE33040F40B\r\n:105DB000F0E0E75EFC4F808190E0CF910C945711AA\r\n:105DC000C85AC73158F4EC2FF0E0EE0FFF1FE45E25\r\n:105DD000FC4F80819181CF910C944111CF91089516\r\n:105DE0008F929F92AF92BF92CF92DF92EF92FF92EB\r\n:105DF000CF93DF93EC01688179818A819B81611562\r\n:105E000071058105910521F464E279ED8BE597E058\r\n:105E10002DE133EF41E050E00E949E2F49015A01ED\r\n:105E20009B01AC01A7EAB1E40E94BD2F6B017C018C\r\n:105E3000ACEEB4EFA50194010E94CB2FDC01CB01A5\r\n:105E40008C0D9D1DAE1DBF1DB7FF03C00197A1099D\r\n:105E5000B04888839983AA83BB839F77DF91CF91D2\r\n:105E6000FF90EF90DF90CF90BF90AF909F908F907A\r\n:105E700008950E94F02E089580E091E00E94F02E97\r\n:105E80000895A0E0B0E08093000190930101A093F9\r\n:105E90000201B09303010895DC01CB01FC01F999E3\r\n:105EA000FECF06C0F2BDE1BDF89A319600B40D9266\r\n:105EB00041505040B8F70895F999FECF92BD81BD89\r\n:105EC000F89A992780B50895A8E1B0E042E050E043\r\n:105ED0000C944E2FDC01A40FB51F4150504048F0E8\r\n:105EE000CB01840F951F2E910E947B2F4150504073\r\n:105EF000D0F70895262FF999FECF92BD81BDF89A6B\r\n:105F0000019700B4021639F01FBA20BD0FB6F894FD\r\n:105F1000FA9AF99A0FBE08950396272F0E947B2FB5\r\n:105F20000E947A2F252F0E947B2F242F0C947B2FE9\r\n:105F30000196272F0E947B2F0C947A2F052E97FB1A\r\n:105F40001EF400940E94B52F57FD07D00E94D02F59\r\n:105F500007FC03D04EF40C94B52F50954095309526\r\n:105F600021953F4F4F4F5F4F0895909580957095C5\r\n:105F700061957F4F8F4F9F4F08950E94F22FA59FED\r\n:105F8000900DB49F900DA49F800D911D1124089534\r\n:105F9000B7FF0C94BD2F0E94BD2F821B930B089559\r\n:105FA000A1E21A2EAA1BBB1BFD010DC0AA1FBB1F1D\r\n:105FB000EE1FFF1FA217B307E407F50720F0A21B8F\r\n:105FC000B30BE40BF50B661F771F881F991F1A94FC\r\n:105FD00069F760957095809590959B01AC01BD0126\r\n:105FE000CF010895A29FB001B39FC001A39F700D80\r\n:105FF000811D1124911DB29F700D811D1124911DD1\r\n:106000000895AA1BBB1B51E107C0AA1FBB1FA617FF\r\n:10601000B70710F0A61BB70B881F991F5A95A9F751\r\n:1060200080959095BC01CD01089597FB072E16F43D\r\n:10603000009407D077FD09D00E94013007FC05D0FD\r\n:106040003EF4909581959F4F0895709561957F4F8F\r\n:106050000895EE0FFF1F0590F491E02D0994FB01C8\r\n:10606000DC0102C001900D9241505040D8F70895D4\r\n:10607000FB01DC014150504048F001900D9200209E\r\n:10608000C9F701C01D9241505040E0F70895F894BF\r\n:02609000FFCF40\r\n:10609200010000003A01190000003A010A00000064\r\n:1060A2005000040152000A01FFFF033D8EFFB07F42\r\n:1060B200958EFFB07F958EFFB07F958EFFB07F0BE0\r\n:1060C2001A4A1A0A1A461A421AB02D3A011D00003B\r\n:1060D200000100FF0051003B01AA56008EFFB0995B\r\n:1060E200370073797374656D37362F6C61756E6323\r\n:1060F200685F3100302E372E3130332D343031315C\r\n:106102002D6737303865643500F0F1F4F5F6F7970E\r\n:1061120067663635349694C69593923730020704F3\r\n:106122000603090209040303080203030301260C00\r\n:106132000D0E10110F1213172122250000313129E3\r\n:106142005A1B750A2131426384B040226D9905774A\r\n:10615200050A05EB050406240645464748494A4B0D\r\n:106162004C4D4E4F50515244434241403F3E3D3CC4\r\n:106172003B3A3938372728292A2B2C2D2E2F30311C\r\n:10618200323334262524232221201F1E1D1C1B1AD4\r\n:10619200530C0B0A09080706050403020100360D19\r\n:1061A2000E0F1011191213141516171835D133BE0C\r\n:1061B20033AB339C338C337D336E335F3350334197\r\n:1061C20033313322330B3308401B402A40394050CD\r\n:1061D200406E4085409440A740C240D140E040E03C\r\n:1061E20026C526B226A32694268526762667265716\r\n:1061F20026482639262A261B260826041A171A2676\r\n:106202001A351A441A541A631A721A811A901A9F6A\r\n:106212001AAF1ABE1ACD1AE01AE00DC90DB60DA7B3\r\n:106222000D980D890D790D6A0D5B0D4C0D3D0D2EEE\r\n:106232000D1E0D0F0D000D00000F001E002E003D63\r\n:10624200004C005B006A00790089009800A700B644\r\n:1062520000C900E000040404040404040404040467\r\n:1062620004040404040404040404040404040404EC\r\n:1062720004040404040404040404040404040404DC\r\n:1062820004040404040404040404040404040404CC\r\n:1062920004040404040404040404040404040404BC\r\n:1062A200040404040404040404818283E200E90077\r\n:1062B200EA00B500B600B700CD008301CC008A0128\r\n:1062C20092019401210223022402250226022702BE\r\n:0A62D2002A02B300B4006F00700050\r\n:00000001FF\r\n"
  },
  {
    "path": "data/system76_launch_2_default.hex",
    "content": ":100000000C944E030C9495030C9495030C94950357\r\n:100010000C9495030C9495030C9495030C94950300\r\n:100020000C9495030C9495030C94FB2C0C94AF2B1F\r\n:100030000C94421A0C9495030C9495030C9495031C\r\n:100040000C9495030C9495030C9495030C949503D0\r\n:100050000C9495030C94101A0C9495030C9495032E\r\n:100060000C9495030C9495030C9495030C949503B0\r\n:100070000C9495030C9495030C9495030C949503A0\r\n:100080000C9495030C9495030C9495030C94950390\r\n:100090000C9495030C949503F206FB062607630760\r\n:1000A000A107E307260829082C082F08320835087D\r\n:1000B00038083B083E084108460849084C085108E2\r\n:1000C000560859085C0861089D08D908DC08E10851\r\n:1000D000EC08EF08FA08FD0808090B0916091909C8\r\n:1000E00024092A099A09DF09DF0AE50AEA0A870CC6\r\n:1000F000870CF30A870C870CFD0A0E0B350B540B8B\r\n:10010000750BA70BD60BFF0B320C2A0C7D0C1D17A1\r\n:100110001D1757175717AA174D194D194D19C617FF\r\n:10012000A418B518B518FC1BFC1B0F1C0F1C051CD4\r\n:100130000F1C0F1C0F1CFC1BFC1B0A1C0F1C0F1C94\r\n:100140000A1C9923C0236425C02364250C242F2472\r\n:1001500064252125312529003A003B003C003D0063\r\n:100160003E003F0040004100420043004400450083\r\n:100170004C0035001E001F0020002100220023003B\r\n:1001800024002500260027002D002E002A002B0029\r\n:1001900014001A000800150017001C0018000C00BD\r\n:1001A000120013002F003000310039000400160047\r\n:1001B000070009000A000B000D000E000F003300BD\r\n:1001C000340028004A00E1001D001B000600190051\r\n:1001D000050011001000360037003800E50052001D\r\n:1001E0004B00E000E2000151E3002C004D002C0028\r\n:1001F000E400E6000151500051004F004E00005C49\r\n:1002000001000100010001000100010001000100E6\r\n:1002100001000100010001000100010001000100D6\r\n:100220000100010001000100010001000100C35CA8\r\n:10023000CB5CCA5C01004600010001000100010026\r\n:1002400001004A004E004B004D000100010001007A\r\n:100250000100010001000100010001000100500047\r\n:10026000510052004F00010001000100AE000100EA\r\n:100270000100010001000100010001000100010076\r\n:100280000100010001004B00A90001000100010074\r\n:1002900001000100A80001000100010001004A0066\r\n:1002A0004E004D00AA000100010001000100010004\r\n:1002B0000100010001000100010001000100010036\r\n:1002C0000100010001000100010001000100010026\r\n:1002D0000100010001000100010001000100010016\r\n:1002E0000100010001000100010001000100010006\r\n:1002F00001000100010001000100010001000100F6\r\n:1003000001000100010001000100010001000100E5\r\n:1003100001000100010001000100010001000100D5\r\n:1003200001000100010001000100010001000100C5\r\n:1003300001000100010001000100010001000100B5\r\n:1003400001000100010001000100010001000100A5\r\n:100350000100010001000100010001000100010095\r\n:100360000100010001000100010001000100010085\r\n:100370000100010001000100010001000100010075\r\n:100380000100010001000100010001000100010065\r\n:100390000100010001000100010001000100010055\r\n:1003A0000100010001000100010001000100010045\r\n:1003B0000100010001000100010001000100010035\r\n:1003C0000100010001000100010001000100010025\r\n:1003D0000100010001000100010001000100010015\r\n:1003E0000100010001000100010001000100010005\r\n:1003F00001000100010005010980A1018503190127\r\n:100400002AB700150126B700950175108100C005B7\r\n:100410000C0901A101850419012AA002150126A0D9\r\n:1004200002950175108100C005010906A10185052D\r\n:10043000050719E029E715002501950875018102D6\r\n:100440000507190029EF1500250195F075018102B6\r\n:100450000508190129059505750191029501750396\r\n:100460009101C00660FF0961A1010962150026FF24\r\n:10047000009520750881020963150026FF0095206C\r\n:1004800075089102C005010906A101050719E029B7\r\n:10049000E715002501950875018102950175088110\r\n:1004A000010507190029FF150026FF0095067508AC\r\n:1004B000810005081901290595057501910295012D\r\n:1004C00075039101C009025B00030100A0FA090451\r\n:1004D0000000010301010009211101000122400077\r\n:1004E0000705810308000A09040100020300000057\r\n:1004F00009211101000122220007058203200001C9\r\n:1005000007050303200001090402000103000000A5\r\n:10051000092111010001226D000705840320000A52\r\n:1005200012011001000000088433060001000102DE\r\n:10053000000150034C00610075006E00630068000C\r\n:10054000200043006F006E006600690067007500C0\r\n:100550007200610062006C00650020004B006500C5\r\n:10056000790062006F0061007200640020002800C2\r\n:100570006C00610075006E00630068005F0032006F\r\n:100580002900000012035300790073007400650015\r\n:100590006D0037003600000004030904000101016A\r\n:1005A0000101010101010202020202020202020330\r\n:1005B0000303030303030304040404040404050500\r\n:1005C00005050506060606060707070707080808C3\r\n:1005D00008090909090A0A0A0B0B0B0C0C0C0D0D72\r\n:1005E0000D0E0E0E0F0F0F1010111111121213130A\r\n:1005F0001414151516161717181819191A1A1B1B83\r\n:100600001C1D1D1E1E1F20202122222324242526DE\r\n:1006100026272829292A2B2C2D2D2E2F3031323216\r\n:10062000333435363738393A3B3C3D3E3F40414222\r\n:10063000434445464748494A4C4D4E4F5051535408\r\n:10064000555658595A5B5D5E5F61626465666869BC\r\n:100650006B6C6D6F7072737577787A7B7D7E80823C\r\n:10066000838587888A8C8E8F91939596989A9C9E85\r\n:10067000A0A2A3A5A7A9ABADAFB1B3B5B7BABCBE95\r\n:10068000C0C2C4C6C9CBCDCFD1D4D6D8DBDDDFE262\r\n:10069000E4E7E9EBEEF0F3F5F8FAFDFF11241FBEF5\r\n:1006A000CFEFD0E1DEBFCDBF04B603FE27C08091FF\r\n:1006B000100790911107A0911207B091130787308E\r\n:1006C000904BA740B04BD1F4109210071092110735\r\n:1006D000109212071092130714BE84B7877F84BF4D\r\n:1006E0000FB6F894A89580916000886180936000AF\r\n:1006F000109260000FBEE0E0F8E7099513E0A0E07B\r\n:10070000B1E0E2E6F1E602C005900D92A035B10736\r\n:10071000D9F727E0A0E5B3E001C01D92A031B207F0\r\n:10072000E1F70E9497030C94AF300C940000CF9334\r\n:10073000DF93CDB7DEB7AB970FB6F894DEBF0FBE31\r\n:10074000CDBF84B7877F84BF0FB6F894A8958091FA\r\n:100750006000886180936000109260000FBE91E09D\r\n:1007600080E80FB6F89480936100909361000FBE0B\r\n:1007700085B7806885BF85B7806885BF83E999E1C3\r\n:1007800090935103809350030E94F32B0E94992C65\r\n:100790008091E20084608093E20078948091D1059A\r\n:1007A0008823A1F01091E9001F709091EC00892F2F\r\n:1007B000817090FD80E8182B1092E9008091E8008C\r\n:1007C00083FD0E94B5221F701093E90082E084BD72\r\n:1007D00093E095BD9DE797BD80936E000FE711E014\r\n:1007E00045E8C42E41E0D42ED8018D918D010E94A0\r\n:1007F000080DC016D106C1F705E811E033E9C32E94\r\n:1008000031E0D32EF80181918F010E94080DC016AE\r\n:10081000D106C1F7E2E5F3E08EE593E0ADEFB3E09A\r\n:10082000119211921D921D928E179F07C9F780E0B9\r\n:1008300090E00E94CC2F8B3E9E4F11F00E94D91A5F\r\n:100840001092DB05E4EFF5E084E096E02FEF3FEF58\r\n:10085000219331938E179F07D9F710926303ECE72A\r\n:10086000F3E08CE893E02FEF3FEF219331938E1765\r\n:100870009F07D9F780E090E00E94CC2F8B3E9E4FDF\r\n:1008800021F00E94D91A0E941C2A45E050E06CE138\r\n:1008900070E088E096E00E94B42F809108068C7F7B\r\n:1008A00011F40E941C2A0E9480128FE097E20197A7\r\n:1008B000F1F700C00000AFE0B7E21197F1F700C018\r\n:1008C00000000E9480128091FD0380FF14C06FEF32\r\n:1008D0007FEF80E490E00E9400306FEF82E490E0D0\r\n:1008E0000E94E22F6FEF7FEF80E090E00E940030E7\r\n:1008F0000E94B61302C00E94C91180E490E00E94D9\r\n:10090000CC2F8C3E964739F482E490E00E94C42FAD\r\n:1009100091E0823009F090E090FD39C000E010E0F5\r\n:10092000680128EAC20ED11C4801ECE18E0E911C30\r\n:10093000F801EA5AFE4FA590B4906B2DC8018D5B6B\r\n:100940009F4F0E94E22F6A2DC8018C5B9F4F0E942F\r\n:10095000E22F0E5F1F4F8016910651F78401C814D5\r\n:10096000D90411F78601F0EACF16F2E0DF06C1F6EE\r\n:1009700081E00E9416146CEE76E780E490E00E941D\r\n:10098000003062E082E490E00E94E22F03C080E049\r\n:100990000E94161460910605709107058091080564\r\n:1009A000909109050E94EA1380E090E00E94CC2F0C\r\n:1009B0008B3E9E4F11F00E94D91A82E090E00E9477\r\n:1009C000C42F8093F0030E94C81A90935F03809312\r\n:1009D0005E0383E090E00E94C42F682F70E080E007\r\n:1009E00090E00E94DF1C60910605709107058091E0\r\n:1009F0000805909109050E94EA1360915E03606802\r\n:100A000060935E0310915F0384E090E00E94E22F08\r\n:100A1000612F81E290E00E94E22F8BE191E09093C0\r\n:100A200061038093600322242394312C8091D105AB\r\n:100A3000853009F054C080E4E82EDD24D39498E199\r\n:100A4000F92E1AE18091D105853009F042C08091DC\r\n:100A5000D105843051F140E060E080E00E94182A26\r\n:100A6000D092EE031092620368E170E00FB6F89442\r\n:100A7000A895609360000FBEE092600083B7817F0D\r\n:100A8000846083BF83B7816083BF7894889583B780\r\n:100A90008E7F83BF0FB6F894A8958091600088611F\r\n:100AA00080936000109260000FBE8091D005882373\r\n:100AB00009F4C8CF0E948012EDEFF3E0819191918B\r\n:100AC000892B09F04BC789E094E08E179F07B1F797\r\n:100AD000B9CF0E940E1F0E9442291092EE030E947D\r\n:100AE0008012882359F08FB7F8944091EA0350910F\r\n:100AF000EB036091EC037091ED038FBFA1EFB3E0C6\r\n:100B0000EDEFF3E0E12CF12C4E2DA190B1908D9101\r\n:100B10009D918A259B25009709F4AEC010E0CC2456\r\n:100B2000C394D12C9C012C213D21232B09F49EC080\r\n:100B300019A34AA3AC20BD2081E0A114B10409F49B\r\n:100B400080E08BA30E94361A8160782F9DA38CA32E\r\n:100B500049A15AA16BA18DA10E947828F701EE0F3F\r\n:100B6000FF1FEF50FC4F80819181C826D926D1828A\r\n:100B7000C082AB2881F08EE08E9DF0018F9DF00D3C\r\n:100B80001124E953FE4FE10FF11D80818F3F19F0D1\r\n:100B90008BA711E001C010E0B0906303E12EF12CAF\r\n:100BA000C7018B0D911D0997A4F188E090E06C01BD\r\n:100BB000CE18DF08B7016F5F7F4F6D597C4FA601DC\r\n:100BC00084E693E00E949730B701675F7F4F6D59CD\r\n:100BD0007C4FA6018CE693E00E949730A601440F5B\r\n:100BE000551FB701660F771F675E7F4F6D597C4FAA\r\n:100BF0008CE793E00E949730B7016F5E7F4F6D598D\r\n:100C00007C4FA60184E793E00E949730BA94B0929B\r\n:100C100063038091630390E0EBA5AE2FB0E09D01EC\r\n:100C2000220F331F255E3D4FAA0FBB1FBD01645E1F\r\n:100C30007D4F41E0480F9117B0F490E0FC01ED5971\r\n:100C4000FC4FD9015C915183DB015C915187BBA5BD\r\n:100C5000B18B880F991FFC01ED59FC4F128E118E3C\r\n:100C600091E0842FE6CF809363031EC01F5FCC0CFE\r\n:100C7000DD1C1E3009F056CF2FEFE21AF20A36E0E3\r\n:100C8000E316F10409F040CF8FEF8EA38FA318A6CF\r\n:100C90000E94361A8160782F9AA789A74EA15FA17A\r\n:100CA00068A58AA50E94782840918C0350918D03F5\r\n:100CB00060918E0370918F032FB7F8948091EA03AF\r\n:100CC0009091EB03A091EC03B091ED032FBF841B37\r\n:100CD000950BA60BB70B2FB7F894C090EA03D090F2\r\n:100CE000EB03E090EC03F090ED032FBFC0928C0378\r\n:100CF000D0928D03E0928E03F0928F036091630394\r\n:100D0000E3E6F3E0462F50E088248A94982CA12C47\r\n:100D1000B12C881A990AAA0ABB0A651799F0218D85\r\n:100D2000328D2901612C712C84149504A604B7041A\r\n:100D300010F4415004C0280F391F328F218F5F5F9C\r\n:100D40003296EBCF409363038091EE03811108C08C\r\n:100D500010910806812F837019F01695169501C021\r\n:100D600010E0809106018130E9F038F0823009F41A\r\n:100D7000A7C3833009F4B1C3CDC310924901C09217\r\n:100D80000406D0920506E0920606F092070689E274\r\n:100D9000E3E6F3E0ABEDB5E001900D928A95E1F763\r\n:100DA00081E098C38091050118130DC020910806B9\r\n:100DB000237030E04091040150E081E024173507B2\r\n:100DC00019F480E001C081E0817080934B01412FD4\r\n:100DD00050E04832510508F061C3FA01E45BFF4F6F\r\n:100DE0000C949130882309F459C340E060E080E01E\r\n:100DF0000E94182A53C3F090490181E1F89EF02C1B\r\n:100E0000112401E10F0D053508F004E56091090694\r\n:100E100070910A0680910B060E94B72AD62EC72E23\r\n:100E2000B82EF01608F037C3EF2DF0E0DF01AD5318\r\n:100E3000BD4F8C9190914A01982331F02B2D4D2D6F\r\n:100E40006C2DCF010E941A2AF394EBCFF090490148\r\n:100E500081E1F89EF02C112401E10F0D053508F019\r\n:100E600004E5C0900A06D0900B06B09009066B2DE1\r\n:100E70007C2D8D2D0E94B72AA62E972E882E60914C\r\n:100E80000C066B0D7C2D8D2D0E94B72AD62EC72EF9\r\n:100E9000B82EF01608F0FFC28F2D90E0FC01ED5344\r\n:100EA000FD4F308120914A01232359F030FF04C0C7\r\n:100EB0002B2D4D2D6C2D03C0282D4A2D692D0E9400\r\n:100EC0001A2AF394E6CFD090490181E1D89ED02C24\r\n:100ED000112401E10D0D053508F004E5A0900A0686\r\n:100EE00090900B0620910C0630E4B32E5B2D529FA0\r\n:100EF000512D1124B52ED01608F0CDC2ED2CF12CB9\r\n:100F0000F701ED53FD4F908180914A018923B9F09B\r\n:100F1000F701EE0FFF1FE45EFD4F808182958F7019\r\n:100F2000609109068B9D600D11247A2D892D0E94F8\r\n:100F3000B72A462F282F672FC7010E941A2AD39459\r\n:100F4000DACFD090490181E1D89ED02C112401E163\r\n:100F50000D0D053508F004E5A0900A0690900B06EB\r\n:100F600020910C0680E4B82E6B2D629F612D112418\r\n:100F7000B62ED01608F08FC2ED2CF12CF701ED53F0\r\n:100F8000FD4F908180914A018923D9F0F701EE0F3E\r\n:100F9000FF1FE55EFD4F6081B69EB0011124B5E0F4\r\n:100FA00075956795BA95E1F780910906680F7A2DD6\r\n:100FB000892D0E94B72A462F282F672FC7010E942C\r\n:100FC0001A2AD394D6CFF090490181E1F89EF02CF3\r\n:100FD000112401E10F0D053508F004E5C090090664\r\n:100FE000D0900A06B0900B0660910C066695669547\r\n:100FF000669580910406909105060E94AD2A0E9494\r\n:10100000322A805887FD8195880F782F2B2D729F6B\r\n:10101000712D1124872FB6010E94B72AD62EC72E14\r\n:10102000B82EF01608F037C2EF2DF0E0DF01AD5317\r\n:10103000BD4F8C9190914A01982331F02B2D4D2D6D\r\n:101040006C2DCF010E941A2AF394EBCF80E697E231\r\n:101050001AC084E397E217C089E398E21FC08AE1CF\r\n:1010600098E21CC08FEF97E21EC083EE97E21BC090\r\n:1010700082E397E208C089E297E205C080E297E246\r\n:1010800002C085E097E20E94DB2009C286EF96E26B\r\n:101090000AC084E89AE202C082ED97E20E947F20B3\r\n:1010A000FEC18EEB97E20E940320F9C188EC96E224\r\n:1010B00005C086E996E202C088E596E20E942521F5\r\n:1010C000EEC181111EC060910C0620E1620F08F490\r\n:1010D0006FEF80910406909105060E94AD2A6AE0A8\r\n:1010E00070E00E946930892B09F0D8C10E94A42FBA\r\n:1010F00064E570E00E947D3060914A010E94472BB8\r\n:10110000CDC18091490191E1899F802D112401E198\r\n:10111000080F053508F004E5E82EF12CC02ED12C7F\r\n:10112000EC14FD040CF0B7C160914A01C7010E94A4\r\n:10113000472B3FEFE31AF30AF3CF81111EC06091F2\r\n:101140000C0620E1620F08F46FEF80910406909185\r\n:1011500005060E94AD2A65E070E00E946930892B87\r\n:1011600009F09CC10E94A42F64E570E00E947D30CC\r\n:1011700060914A010E948D2B91C18091490191E1BA\r\n:10118000899F802D112401E1080F053508F004E541\r\n:10119000E82EF12CC02ED12CEC14FD040CF07BC1F8\r\n:1011A00060914A01C7010E948D2B5FEFE51AF50A95\r\n:1011B000F3CF81E596E202C08BE496E20E9486219D\r\n:1011C0006EC18091DB0521E0682F621B08F460E0AE\r\n:1011D000862F62E376E23BC062E376E237C080911D\r\n:1011E000DB0521E0782F721B08F470E0872F6AEF8F\r\n:1011F00075E22DC06AEF75E229C08091DB0521E020\r\n:10120000382F321B08F430E0832F68EC75E21FC0E2\r\n:1012100068EC75E21BC08091DB0521E0582F521B62\r\n:1012200008F450E0852F60EB75E211C060EB75E2C9\r\n:101230000DC08091DB0521E0682F621B08F460E09F\r\n:10124000862F6AE975E203C06AE975E280E00E94D0\r\n:10125000F22125C18091E403811125C067EC71E082\r\n:1012600040E050E0942F9295907F20E030E0FB0129\r\n:10127000E20FF31F8081843538F4E82FF0E0E05767\r\n:10128000FC4F892F822B80832F5F3F4F2E303105FB\r\n:1012900071F74F5F5F4F625F7F4F4630510511F727\r\n:1012A00081E08093E403D090490181E1D89ED02C65\r\n:1012B000112401E10D0D053508F004E560910605E6\r\n:1012C0007091070580910805909109050E949B0E79\r\n:1012D000B82E6091090670910A0680910B060E9453\r\n:1012E000B72AA62E972E882ED01608F0D4C0ED2C43\r\n:1012F000F12CF701ED53FD4F908180914A01892334\r\n:10130000B9F0F701E057FC4F6081462F4F706295AE\r\n:101310006F708B2D0E94E429029720F420E040E0BA\r\n:1013200060E003C0282D4A2D692DC7010E941A2AAA\r\n:10133000D394DACF9090490181E1989E902C1124AA\r\n:1013400001E1090D053508F004E5EE24EA94F12CDD\r\n:10135000901608F0A0C0E92DF0E0DF01AD53BD4FBD\r\n:101360009C9180914A01892341F1DF01AA0FBB1FA3\r\n:10137000AE0FBF1FA65FBB4FAC901196CC901197DC\r\n:1013800012968C9190910B06A99E50011124C99E32\r\n:1013900060011124899FC0011124B7010E946930A6\r\n:1013A000262FC501B7010E946930462FC601B7013B\r\n:1013B0000E946930CF010E941A2A9394C9CFC0902D\r\n:1013C000490191E1C99EC02C112401E10C0D0535A4\r\n:1013D00008F004E5811106C08091E9038F5F8093D6\r\n:1013E000E90304C01092E9031092E8038091E90335\r\n:1013F000811147C08091E803883029F41092E703F7\r\n:101400001092E8033EC0A82FB0E0AA0FBB1FAD5654\r\n:10141000BE4FEC9111969C917EE0E79FF001112464\r\n:10142000E953FE4FE90FF11D90819F3F21F090930A\r\n:10143000E50391E001C090E09093E7038F5F809314\r\n:10144000E8031FC0EC2CF12CF701ED53FD4F908108\r\n:1014500080914A018923A1F06091E9036C0D2091EC\r\n:10146000E703E5EEF3E080E77FEF90E092130CC036\r\n:101470000E94B72A462F282F672FC7010E941A2AD9\r\n:10148000C394C016F8F207C03191C31202C08FEFA7\r\n:1014900070E09F5FEBCF81E0043508F080E0909131\r\n:1014A00049019F5F90934901811134C082E080938C\r\n:1014B000060180914B0181112DC0112351F02AC0EA\r\n:1014C00010930501809108068370809304010E94A7\r\n:1014D000572883E0809306011DC040910406509177\r\n:1014E000050660910606709107062FB7F894809163\r\n:1014F000EA039091EB03A091EC03B091ED032FBFB1\r\n:10150000841B950BA60BB70B4097A105B10510F0F6\r\n:10151000109206010E9442299091EF03891721F051\r\n:101520000E9442298093EF038091D105843009F015\r\n:101530007DCA83E08093E9008091E80082FF76CA4B\r\n:101540008091E80085FF23C00E94122C81111DC0EC\r\n:1015500050E2E52EF12CCE0101966C0109C080917C\r\n:10156000F100D6018D936D01B1E0EB1AF10869F03D\r\n:101570008091E80085FDF3CF8091E8008B77809320\r\n:10158000E8000E94122C882399F391E001C090E0BA\r\n:101590008091E8008B778093E800992309F446CA8C\r\n:1015A00081E08A83E9818E2F90E0FC013197E3315D\r\n:1015B000F10508F0ACC1EC58FF4F0C94913086E770\r\n:1015C0008B838CEE8C8381E014C14EE150E065E5A5\r\n:1015D00071E004C04EE150E067E671E0CE01039691\r\n:1015E0000E94A03093C180910B05882309F48FC11C\r\n:1015F0001A8281E080930A058AC18B81843008F0C9\r\n:1016000086C16C81663008F082C14D814E3008F091\r\n:101610007EC10E94E4298E839F8378C12B81243070\r\n:1016200008F075C18C81863008F071C19D819E30B3\r\n:1016300008F06DC11E816F81ECE18E9F7001112455\r\n:10164000F8EA2F9FE00CF11C1124E90EF11CE90EC1\r\n:10165000F11C23E4E20EF11CC7010E94E22F612F6E\r\n:10166000C70101960E94E22F51C180910B058111A3\r\n:101670004EC18B81803F49F0813F49F0823F49F064\r\n:10168000833F09F044C1E3E005C0E0E003C0E1E0CE\r\n:1016900001C0E2E035E0E39FF0011124E95FFE4F75\r\n:1016A00083818C8380EBA5C080910B0581112FC1B4\r\n:1016B0008B819C81903B08F090EB803F49F0813F0B\r\n:1016C00049F0823F49F0833F09F021C1E3E005C0C2\r\n:1016D000E0E003C0E1E001C0E2E055E0E59FF00199\r\n:1016E0001124E95FFE4F9383A9C080910B058111FE\r\n:1016F0000EC1EB81E43558F0E03FC1F0E13FC1F0AD\r\n:10170000E23FC1F0E33F09F002C1E3E014C0F0E0C2\r\n:10171000CF01880F991FE80FF91FE65FFB4F81810A\r\n:101720008C8380818D8382818E83F0C0E0E003C052\r\n:10173000E1E001C0E2E065E0E69FF0011124E95F2D\r\n:10174000FE4F81818C8382818D831E82DFC08091D8\r\n:101750000B058111DCC0EB818D819C81E43558F053\r\n:10176000E03FB1F0E13FB1F0E23FB1F0E33F09F01B\r\n:10177000CEC0E3E012C02E81F0E0AF01440F551F50\r\n:10178000E40FF51FE65FFB4F808391832283BEC089\r\n:10179000E0E003C0E1E001C0E2E075E0E79FF001B6\r\n:1017A0001124E95FFE4F9183828348C080910B052D\r\n:1017B0008111ADC0EB81E43008F0A9C02E2F30E0DC\r\n:1017C00085E0E89FF0011124E95FFE4F9081969536\r\n:1017D0009695E3EAF1E080E0419194130CC08C838C\r\n:1017E00085E0829FF001839FF00D1124E95FFE4F99\r\n:1017F00084818D838BC08F5F8F3071F788C080911B\r\n:101800000B05811184C0EB81E43008F080C0AC810D\r\n:10181000AF3008F07CC02D8195E0E99FF0011124E4\r\n:10182000E95FFE4FB0E0AD55BE4F8C91982F990FF8\r\n:10183000990F80818370892B808324831A82609121\r\n:1018400006057091070580910805909109050E9491\r\n:10185000EA135DC080910B05811159C081E00E949F\r\n:10186000161454C086E08B838EE08C838DEFE82EB7\r\n:1018700083E0F82E16E0A0E0B4E040E050E0B032A3\r\n:1018800058F5F70160817181C101042E02C0880FF3\r\n:10189000991F0A94E2F7682379238B2F90E0910136\r\n:1018A0000A2E01C0220F0A94EAF7672B51F061E07B\r\n:1018B00070E06C0F7D1F860F971FFC013081232B7A\r\n:1018C0000AC061E070E06C0F7D1F860F971F2095A6\r\n:1018D000FC01308123232083AF5FA83010F0BF5F6D\r\n:1018E000A0E04F5F5F4F4E30510549F61150F2E0D6\r\n:1018F000EF0EF11C1111C1CF09C00E940E1F81E033\r\n:101900009B81911101C080E0809309041A8280912B\r\n:10191000D105843009F08AC81091E9001F709091B8\r\n:10192000EC00892F817090FD80E8182B82E0809375\r\n:10193000E9008091E80080FF0DC040E050E060E2E7\r\n:1019400070E0CE0101960E94231F8091E8008E77FF\r\n:101950008093E8001F701093E90068C8F9BC19BDB6\r\n:1019600009B400FEFDCF8091D8008F7D8093D80010\r\n:101970008091E00082608093E0008091E00081FD32\r\n:10198000FCCF0E940E1F0C94220590915E0392FFE3\r\n:101990000DC0282F2871283019F4877F846006C075\r\n:1019A000282F2471243011F48B7F886093FF0DC0A1\r\n:1019B000282F2871283119F4877E846106C0282FCA\r\n:1019C0002471243111F48B7E886120915F0320FF04\r\n:1019D0000DC0382F3871383019F4877F816006C008\r\n:1019E000382F3171313011F48E7F886021FF0DC0A6\r\n:1019F000282F2871283119F4877E816106C0282F8D\r\n:101A00002171213111F48E7E886194FD877E0895C5\r\n:101A1000F894E82FE295EF70F0E031A1282F2F70B5\r\n:101A200081E090E001C0880F2A95EAF7982F909501\r\n:101A3000932391A392A1892B82A378940895CF93A5\r\n:101A4000DF930E940B2AEC018238910559F1A0F432\r\n:101A50008133910509F473C040F48932910509F48A\r\n:101A600067C08A9709F472C084C08533910509F470\r\n:101A700058C0C997B9F07DC0833E910571F138F423\r\n:101A8000803E9105B1F0823E910511F172C0863E13\r\n:101A90009105B9F1873E9105C9F1843E910509F0A0\r\n:101AA00068C024C080915E0380FD5DC081FD5BC085\r\n:101AB00060C080915E0380FD50C080915F0380FF15\r\n:101AC00036C180915E0384FD30C1C3EED0E02FC1EA\r\n:101AD00080915E0382FF2BC1F4CF80915E0382FD73\r\n:101AE0003FC080915F0380FD3EC0EBCF80915F03DC\r\n:101AF00081FF1DC180915E0384FD17C1C7EED0E058\r\n:101B000016C180915E0383FF12C1F4CF80915E0302\r\n:101B100083FD2CC080915F0381FFECCFC4EED0E049\r\n:101B200006C180915E0385FF02C1C9E2D0E0FFC01B\r\n:101B300080915E0385FFFBC0C5E3D0E0F8C08091D3\r\n:101B40005E0386FFF4C0CAE2D0E0F1C080915E037C\r\n:101B500086FFEDC0C1E3D0E0EAC0C9E3D0E0E7C052\r\n:101B6000C2EED0E0E4C0C0EED0E0E1C0C6EED0E00E\r\n:101B7000DEC0C11582E5D80708F066C0C11591E541\r\n:101B8000D90728F0DC2FCC27C16FD06AD0C0C83E5F\r\n:101B9000D10560F5C03ED10508F0C9C0C83AD105ED\r\n:101BA000B0F4C53AD10540F0C55AD0E0C15EDC4F73\r\n:101BB000C881D0E0D064BBC0C130D10509F4B7C042\r\n:101BC00008F4B3C0C430D10508F4AFC0B0C0CF3BF7\r\n:101BD000D10508F0AAC0C85AD0E0CC0FDD1FCE5DF9\r\n:101BE000DC4F0990D881C02DD464A1C0C11520E577\r\n:101BF000D207E0F0CE0174E0969587957A95E1F7EB\r\n:101C000083709C2F937021E030E002C0220F331FBD\r\n:101C10009A95E2F73C68382BCF70C695C69580E25E\r\n:101C2000C89FE0011124C22BD32B81C0C11580E4D1\r\n:101C3000D80718F0DF70D06A7AC0CE019A95811566\r\n:101C40009F4108F474C071C0C11586E5D807F0F54E\r\n:101C5000C11595E5D90750F08C2F0E94C50C8F71E6\r\n:101C6000C82FD0E0DC2FCC27D06261C0C11524E59D\r\n:101C7000D20728F0DC2FCC27C46FD06A58C09E0151\r\n:101C8000237033278C2F86958695C115D34578F41C\r\n:101C9000C1E0D0E002C0CC0FDD1F2A95E2F720E2C0\r\n:101CA000829FC0011124C82BD92BDC6840C0C1E041\r\n:101CB000D0E002C0CC0FDD1F2A95E2F720E2829F20\r\n:101CC000C0011124C82BD92BDA6831C0C1152AE50F\r\n:101CD000D207E8F4C11589E5D80780F08C2F8F7002\r\n:101CE0000E94C50C94E0D695C7959A95E1F7CF7000\r\n:101CF000D0E0DC2FCC27D069C82B19C0C11598E5DE\r\n:101D0000D90798F0DC2FCC27C06FD06A10C0CE0165\r\n:101D100090568115904248F48D2F8F710E94C50C0A\r\n:101D2000DD27D0628F71D82B02C0C0E0D0E0CE0199\r\n:101D3000DF91CF910895CF92DF92EF92FF926C01E5\r\n:101D4000EE24FF24C114D104E104F10421F0C70101\r\n:101D5000B60120E101C020E0C72ED82EE92EFF24D5\r\n:101D6000C114D104E104F10419F0285FC701B601E0\r\n:101D70006B017C0154E0F694E794D794C7945A958C\r\n:101D8000D1F7C114D104E104F10419F02C5FC701AB\r\n:101D9000B6016B017C0142E0F694E794D794C794B6\r\n:101DA0004A95D1F7C114D104E104F10419F02E5F72\r\n:101DB000C701B601DC01CB01B695A795979587952C\r\n:101DC000892B8A2B8B2B09F02F5F822FFF90EF90AE\r\n:101DD000DF90CF900895882311F084EC01C084E84F\r\n:101DE0008093BC0080E49FE1A0E0B0E02091BC00C3\r\n:101DF00027FD08C00097A105B10561F00197A10971\r\n:101E0000B109F4CF892B8A2B8B2B21F08091BB0059\r\n:101E100090E008958FEF9FEF0895DB01FC0120E033\r\n:101E200030E084E82A173B071CF591919093BB00A2\r\n:101E30008093BC0040E45FE160E070E09091BC0002\r\n:101E400097FD0AC0411551056105710599F0415092\r\n:101E5000510961097109F2CF452B462B472B51F0EF\r\n:101E60009091B900987F983229F42F5F3F4FDACFD5\r\n:101E7000C90108958FEF9FEF089584E98093BC0016\r\n:101E80008091BC0084FDFCCF0895262F94EA9093A6\r\n:101E9000BC0040E45FE160E070E09091BC0097FD21\r\n:101EA0000AC0411551056105710549F041505109BC\r\n:101EB00061097109F2CF452B462B472B19F48FEF9F\r\n:101EC0009FEF08959091B900987F983011F090316C\r\n:101ED000B1F7682F660F622B6093BB0084E8809394\r\n:101EE000BC0080E49FE1A0E0B0E02091BC0027FDB1\r\n:101EF00008C00097A105B10511F30197A109B10927\r\n:101F0000F4CF892B8A2B8B2BD1F28091B900887F5B\r\n:101F1000883111F0803499F680E090E00895FF92C6\r\n:101F20000F931F93CF93DF931F92CDB7DEB78B0133\r\n:101F3000FC01F1808DE1898360E08F2D0E94450FC7\r\n:101F400097FD1AC061E070E0CE0101960E940D0F6E\r\n:101F500097FD12C061E08F2D0E94450F97FD0CC0C8\r\n:101F600080E00E94EB0E97FD07C0F80180830E947D\r\n:101F70003D0F21E090E001C0282F822F0F90DF91CC\r\n:101F8000CF911F910F91FF9008950F931F93CF93BF\r\n:101F9000DF93EB018A0160E00E94450F97FD09C0C5\r\n:101FA000B801CE010E940D0FEC0197FF0E943D0F7A\r\n:101FB000CE01DF91CF911F910F910895CF93DF93C1\r\n:101FC00000D01F92CDB7DEB720914C0130914D016A\r\n:101FD00040914E0129833A834B8343E050E0BE0198\r\n:101FE0006F5F7F4FFC0180810E94C50F0F900F90A3\r\n:101FF0000F90DF91CF9108958F929F92AF92BF92F1\r\n:10200000CF92DF92EF92FF920F931F93CF93DF93C4\r\n:10201000CDB7DEB729970FB6F894DEBF0FBECDBFA0\r\n:102020007C01B42EA52E962E872E690160E0FC015E\r\n:1020300080810E94450F97FD22C019821A8286E096\r\n:10204000800F8B831C820D838E829F82A886B98627\r\n:1020500069E070E0CE0101960E940D0F97FD0FC060\r\n:10206000B801C6010E940D0F97FD09C00E943D0FE7\r\n:10207000C7010E94DE0F97FD02C0912F01C0082FFB\r\n:10208000802F29960FB6F894DEBF0FBECDBFDF912B\r\n:10209000CF911F910F91FF90EF90DF90CF90BF9065\r\n:1020A000AF909F908F9008950F931F93CF93DF93DE\r\n:1020B00000D000D0CDB7DEB709831A832B833C83D1\r\n:1020C00004E010E09E012F5F3F4F0E94FC0F0F9035\r\n:1020D0000F900F900F90DF91CF911F910F91089566\r\n:1020E000EF92FF920F931F93CF93DF9300D000D016\r\n:1020F000CDB7DEB77C01162F19821A821B821C8293\r\n:102100009E012F5F3F4F48E259E060E87FEBFC0102\r\n:10211000808191810E947B1F97FD36C089819A81C1\r\n:10212000AB81BC8141E050E060E070E0F7010280EB\r\n:1021300004C0440F551F661F771F0A94D2F711235E\r\n:1021400029F0842B952BA62BB72B08C040955095D2\r\n:102150006095709584239523A623B72389839A835A\r\n:10216000AB83BC8309811A812B813C8148E259E011\r\n:1021700060E87FEBF701808191810E94541018166E\r\n:10218000190614F480E090E00F900F900F900F90DC\r\n:10219000DF91CF911F910F91FF90EF9008950F93D2\r\n:1021A0001F93CF93DF9300D01F92CDB7DEB78C0182\r\n:1021B000BE016D5F7F4F0E948F0F97FD2EC08B81F8\r\n:1021C000F8019281981739F18283982F9370923099\r\n:1021D00039F0869586958370823081F460E001C085\r\n:1021E00061E0F801838194810E94701097FD15C011\r\n:1021F00087E78A83AE014E5F5F4F05C086E689831D\r\n:10220000AE014F5F5F4F63E2F80181810E944F1F73\r\n:102210001816190614F480E090E00F900F900F90BC\r\n:10222000DF91CF911F910F9108950F931F93CF933B\r\n:10223000DF931F92CDB7DEB78C01BE016F5F7F4F7A\r\n:102240000E948F0F97FD12C09981292F2370F801EA\r\n:1022500083819481211102C060E001C061E00E948D\r\n:1022600070101816190614F480E090E00F90DF91BA\r\n:10227000CF911F910F910895CF92DF92EF92FF922D\r\n:102280000F931F93CF93DF9300D000D01F92CDB751\r\n:10229000DEB76C018FEFF6018283E380F480F701F3\r\n:1022A00042815381648175814D5F534F6F47704404\r\n:1022B000808191811D8201E010E09E012B5F3F4FE4\r\n:1022C0000E94FC0F97FD3CC060E0C7010E947010A7\r\n:1022D00019821A821B821C829E012F5F3F4F48E0A9\r\n:1022E00059E060E87FEBF701808191810E947B1FBC\r\n:1022F00097FD26C001E010E020E030E0F701028009\r\n:1023000004C0000F111F221F331F0A94D2F78981C6\r\n:102310009A81AB81BC81082B192B2A2B3B2B09837B\r\n:102320001A832B833C8348E059E060E87FEB80818F\r\n:1023300091810E9454101816190614F480E090E060\r\n:102340000097C9F4F6012081222369F0213099F425\r\n:1023500085E08983AE014F5F5F4F6AE1F6018181BD\r\n:102360000E944F1F03C0C6010E94151118161906BE\r\n:1023700014F480E090E00F900F900F900F900F906A\r\n:10238000DF91CF911F910F91FF90EF90DF90CF9051\r\n:1023900008950F931F93CF93DF9300D000D000D008\r\n:1023A000CDB7DEB70B9A13981092BA0080E28093F3\r\n:1023B000B8001092BC008FE19EE40197F1F700C0D5\r\n:1023C0000000139A9FEF20E782E091502040804068\r\n:1023D000E1F700C000008CE08E8301E010E09E0178\r\n:1023E0002A5F3F4F4AEF50E360E87FEB8CE391E0D8\r\n:1023F0000E94FC0F97FD4CC01D829E012B5F3F4F3A\r\n:1024000042E154E362ED7FEB8CE391E00E94FC0F2C\r\n:1024100097FD3EC019821A821B821C829E012F5F8B\r\n:102420003F4F48E054E362ED7FEB8CE391E00E9484\r\n:102430007B1F97FD2DC009811A812B813C81016092\r\n:1024400009831A832B833C8348E054E362ED7FEBDE\r\n:102450008CE391E00E94541097FD1AC004E813E346\r\n:1024600023E030E040E050E360E87FEB8CE391E074\r\n:102470000E94541097FD0CC004E813E324E030E000\r\n:1024800048E450E960E87FEB8CE391E00E9454104F\r\n:1024900087E391E00E943C1182E491E00E943C11AC\r\n:1024A0008DE391E00E943C1180914F019091500189\r\n:1024B000A091510189839A83AB8343E050E0BE0130\r\n:1024C0006F5F7F4F80913C010E94C50F04E610E0D2\r\n:1024D00087E391E00E9415118FE19EE40197F1F7E7\r\n:1024E00000C000000150110999F726960FB6F89424\r\n:1024F000DEBF0FBECDBFDF91CF911F910F91089529\r\n:102500009F92AF92BF92CF92DF92EF92FF920F9382\r\n:102510001F93CF93DF9302E513E08FE7E82E81E06E\r\n:10252000F82EC0E0D0E0912CCC24C394D12CB7017C\r\n:10253000D7018C91F894E82FE295EF70F0E021A19B\r\n:102540008F70A60102C0440F551F8A95E2F7CA0199\r\n:10255000922F982B91A392A18095892382A378949E\r\n:1025600000C0E5E8F1E020E030E0A12CB12C419181\r\n:10257000842F82958F7090E0DC0190968C9190E092\r\n:102580004F7002C0959587954A95E2F780FD08C087\r\n:10259000C601022E02C0880F991F0A94E2F702C0FA\r\n:1025A00080E090E0A82AB92A2F5F3F4F2E303105F6\r\n:1025B000F1F6BFEFEB1AFB0AFB0180810E94080DC8\r\n:1025C000C530D10519F0F0E5FA95F1F7D8018D91F4\r\n:1025D0009C911197A816B90621F0AD92BC9281E0AA\r\n:1025E00001C080E0982A21960E5F1F4FC630D105AA\r\n:1025F00009F09DCF992049F081E080930E050E945B\r\n:10260000361A90930D0580930C0580910E05882352\r\n:1026100009F445C020910C0530910D054FB7F89491\r\n:102620008091EA039091EB03A091EC03B091ED034C\r\n:102630004FBF821B930B069790F1809152039091AC\r\n:1026400053039093FE038093FD0380915403909174\r\n:102650005503909300048093FF038091560390915B\r\n:102660005703909302048093010480915803909142\r\n:102670005903909304048093030480915A0390912A\r\n:102680005B03909306048093050480915C03909112\r\n:102690005D03909308048093070410920E058091C7\r\n:1026A0000A058823E1F1BFEFE0E7F2E0B150E04036\r\n:1026B000F040E1F700C0000081E08093E00080E29C\r\n:1026C0008093D8001092C9008FE097E20197F1F74C\r\n:1026D00000C000001DBA109268001CBC10BE1FBADA\r\n:1026E00010927A0010926E0010926F00109270009B\r\n:1026F000109271001092C9001092BC0088E081B95C\r\n:1027000014B817B81AB81DB810BA82B915B818B8E5\r\n:102710001BB81EB811BA0E94C9110C94527880914E\r\n:102720000F0590911005883EA3E09A076CF0109277\r\n:10273000100510920F0582E491E00E94CF108DE306\r\n:1027400091E00E94CF1005C00196909310058093F0\r\n:102750000F05892DDF91CF911F910F91FF90EF9081\r\n:10276000DF90CF90BF90AF909F90089581E08093CD\r\n:10277000E00080E28093D800E9ECF0E010828FE086\r\n:1027800097E20197F1F700C000001DBA10926800AF\r\n:102790001CBC10BE1FBA10927A0010926E001092EC\r\n:1027A0006F00109270001092710010821092BC00A5\r\n:1027B00088E081B914B817B81AB81DB810BA82B930\r\n:1027C00015B818B81BB81EB811BA0E94C9110C94DC\r\n:1027D000007E089520910B05211110C00E949B0ED0\r\n:1027E000843060F495E0989FF0011124E95FFE4F7A\r\n:1027F000A8E0B6E001900D929A95E1F708959091C6\r\n:102800000B05911112C080930A0180930F018093F0\r\n:10281000140180931901609106057091070580915C\r\n:102820000805909109050C94EA13089544E150E0DD\r\n:1028300063EE72E0882361F087E091E00E94D22F7E\r\n:102840004CEF50E067EF72E08AE094E00C94D22FF6\r\n:1028500087E091E00E94B42F4CEF50E067EF72E008\r\n:102860008AE094E00C94B42F80910806837029F0DC\r\n:102870008C69809308061092060181E080930B0515\r\n:1028800008958F929F92AF92BF92CF92DF92EF9274\r\n:10289000FF920F931F93CF93DF9300D000D01F922E\r\n:1028A000CDB7DEB7FC018081918123813481232B58\r\n:1028B00031F09F3F31F491E08F3F19F403C091E074\r\n:1028C00001C090E090FD19C57F0185E0DE01119601\r\n:1028D00001900D928A95E1F7F701228189819A8111\r\n:1028E000222349F00E949D1B182F682F89819A810D\r\n:1028F0000E943F1C03C00E94131C182F69817A811B\r\n:10290000812F0E940B2A8C0180910904811132C20F\r\n:102910000115FCE51F0731F168F4003E110509F4CB\r\n:102920005FC0043E110509F460C00932110509F0C9\r\n:102930008EC10EC00A3C3CE5130769F10B3C8CE5E7\r\n:102940001807C1F0033C9CE5190709F080C136C0A7\r\n:1029500080911205882309F44CC0809111058823C9\r\n:1029600009F447C0F7018281882309F403C20E9459\r\n:10297000341400C2F7018281882309F4FBC18091DD\r\n:102980000B06E8EBF1E092919817B0F001E0E23B22\r\n:10299000F007C9F722C0F7018281882309F4EAC150\r\n:1029A00080910B06E2EBF1E028EB31E02E173F07B8\r\n:1029B000A1F091918917D0F7892F0FC0F70182817B\r\n:1029C000882309F4D7C180910B06811103C080913F\r\n:1029D000470103C08093470180E00E94FF13CAC1F2\r\n:1029E000F70182818093120504C0F70182818093F0\r\n:1029F0001105F7018281882309F48EC11092130515\r\n:102A00000230FCE51F0708F471C106312CE51207FE\r\n:102A100038F098012B5F3C452930310508F066C13C\r\n:102A20000E94C81A90935F0380935E0300313CE5D7\r\n:102A3000130709F4C3C008F041C008309CE519072A\r\n:102A400009F49AC0F0F40430FCE51F0709F487C0CC\r\n:102A500068F402303CE5130709F477C003301C45E5\r\n:102A600009F0E5C080915E03826076C006309CE587\r\n:102A7000190709F46EC008F07BC080915E0388607E\r\n:102A80006BC00C30FCE51F0709F485C068F40A3000\r\n:102A90003CE5130709F474C008F079C00E940E1FCA\r\n:102AA00080915E03806858C00E309CE5190709F4D8\r\n:102AB00076C008F07FC080915E038BC00C3FFCE5C0\r\n:102AC0001F0709F44FC018F503313CE5130709F45B\r\n:102AD0007DC078F401319CE5190709F473C0023117\r\n:102AE0001C4509F0A4C00E940E1F80915E038F77E1\r\n:102AF00033C00531FCE51F0709F472C008F486C035\r\n:102B00000B3F1C4509F093C080915F033EC0011547\r\n:102B10008DE5180709F45FC058F40E3FECE51E0779\r\n:102B200009F444C008F43FC080915F0382602DC067\r\n:102B300002302DE5120709F475C008F45DC00330BA\r\n:102B40001D4509F074C060E06EC080915E03816035\r\n:102B500003C080915E03806180935E0368C08091B2\r\n:102B60005E0311C080915F03826080935F035FC04A\r\n:102B700080915E038062F0CF80915E038064ECCF31\r\n:102B800080915E0388608460E7CF8160EECF8091A2\r\n:102B90005E038E7FE1CF80915E038D7FDDCF8091DC\r\n:102BA0005E03877FD9CF80915F0318C080915F0358\r\n:102BB0008D7FDBCF80915E038F7ECECF80915E03D1\r\n:102BC0008F7DCACF80915E038F7BC6CF80915E03DD\r\n:102BD000877F8B7FC1CF80915F038D7F8E7FC5CF35\r\n:102BE00080915E0382FB222720F991E0922790FBDF\r\n:102BF00082F990FB83F9B0CF80915F03982F909575\r\n:102C000091708E7F892B90FB81F9AFCF0E940E1FB0\r\n:102C100080915E0387FB222720F991E0922790FBA9\r\n:102C200087F99ACF61E08EE090E00E94E22F6091F8\r\n:102C30005E0310915F0384E090E00E94E22F612F19\r\n:102C400081E290E00E94E22F0E940E1F93C0043F99\r\n:102C5000FCE51F07A1F406E221EE40EE64EF7CE5FF\r\n:102C60000AC0083D9CE5190709F0C3CE06E221EE33\r\n:102C700041EE68ED7CE5C7010E944E297BC0053F0F\r\n:102C80002CE51207A0F4093D3CE5130731F407E2F7\r\n:102C900025EE45EE69ED7CE5EECF0A3D8CE51807A3\r\n:102CA00001F708E221E045EE6AED7CE5E4CF063F5E\r\n:102CB000ECE51E0731F406E221EE42EE66EF7CE51C\r\n:102CC000DACF063FFCE51F0730F407E225EE44EEBD\r\n:102CD00065EF7CE5D0CF073F2CE5120709F089CEE0\r\n:102CE00007E225EE46EE67EF7CE5C5CF06313CE511\r\n:102CF000130719F58091A7058A7A91E009F490E00D\r\n:102D000090931405882311F065E301C069E285E121\r\n:102D100095E00E94931A0EC006311C4509F048C088\r\n:102D200080911405882309F4E6C265E385E195E006\r\n:102D30000E946B1A0E94491B1DC09801235C3C45F0\r\n:102D400024313105B8F001159CE5190731F00F3D2C\r\n:102D50001C4571F50E94D91A0DC00E940E1FFFE795\r\n:102D60000AE116E0F15000401040E1F700C0000019\r\n:102D70000E94B6138091A405877009F4BEC2F701C2\r\n:102D80008281882309F4B9C282E00F900F900F90DE\r\n:102D90000F900F90DF91CF911F910F91FF90EF90C7\r\n:102DA000DF90CF90BF90AF909F908F900C94A51C18\r\n:102DB000F70100811181882349F0C8010E949D1B01\r\n:102DC000D82E682FC8010E943F1C04C0C8010E9471\r\n:102DD000131CD82EB8018D2D0E941F0D8C01982E2A\r\n:102DE000F701B280A580A2949FE0A9228091A4055A\r\n:102DF000877099F0BB2089F0812F807F803421F08B\r\n:102E000080E2800F883048F082E00E94A51C80910B\r\n:102E1000A4058770DD24D3948111D12CC12EC294D6\r\n:102E20008FE0C8228C2D90E08C30910508F035C2DF\r\n:102E3000FC01E957FF4F0C949130812F807F1F7068\r\n:102E4000882311F01295107FBB20B9F0112309F4EB\r\n:102E50000FC280E2800F883010F0911006C0809180\r\n:102E6000A705182B1093A70505C08091A605182B60\r\n:102E70001093A6050E94491BFBC1802F0E94412E82\r\n:102E8000112309F40AC2005E1095083010F0911069\r\n:102E900006C08091A70518231093A70505C080914F\r\n:102EA000A60518231093A6050E94491BF6C1812F81\r\n:102EB000807F1F70803211F01295107F992021F0D1\r\n:102EC000F1E09F16E1F02AC0BB2081F08091A805B7\r\n:102ED000AA2051F001E0A01207C0182B181709F41E\r\n:102EE000DCC11093A805D9C1812B10C0AA2021F004\r\n:102EF00021E0A21609F4D1C10E94431B27C0BB20C8\r\n:102F000041F035E03A1508F4C8C1812F0E94372EF0\r\n:102F1000C4C184E08A1508F4C0C118C0BB2049F0C0\r\n:102F2000AA2099F3F701858180FFA2C18F70858364\r\n:102F3000ECCFAA2059F0093309F0ACC1FFEF13EF31\r\n:102F400021E0F15010402040E1F7A2C1812F0E9402\r\n:102F50002C2EA3C1812F86958695837019F0813020\r\n:102F600059F09BC1BB2019F0C801937002C080E0EA\r\n:102F700090E00E942C2997C1BB2019F0C8019370E2\r\n:102F800002C080E090E00E9416298DC1812F8370DD\r\n:102F900009F069C0B11085C1902F929596959770F0\r\n:102FA000990F990F802F8F70882E912CA12CB12C06\r\n:102FB000092E04C0880C991CAA1CBB1C0A94D2F7C9\r\n:102FC00004FF12C04FE050E060E070E004C0440F26\r\n:102FD000551F661F771F9A95D2F7DB01CA018095AE\r\n:102FE0009095A095B09503C080E090E0DC01169527\r\n:102FF0001695412F4370423019F1C8F40091A9058C\r\n:103000001091AA052091AB053091AC05413059F0E3\r\n:1030100088299929AA29BB29BC01CD0160237123E4\r\n:10302000822393230AC0802A912AA22AB32ABC01B0\r\n:10303000CD01682979298A299B290E94DF1C31C189\r\n:1030400088299929AA29BB290091A9051091AA05C7\r\n:103050002091AB053091AC05BC01CD0160277127F3\r\n:1030600082279327EACFBB2019F0812F817001C0FE\r\n:103070008695882309F415C1902F9295969597709F\r\n:10308000990F990F802F8F70882E912CA12CB12C25\r\n:10309000092E04C0880C991CAA1CBB1C0A94D2F7E8\r\n:1030A00004FF12C04FE050E060E070E004C0440F45\r\n:1030B000551F661F771F9A95D2F7DB01CA018095CD\r\n:1030C0009095A095B09503C080E090E0DC01169546\r\n:1030D0001695412F43704230D9F068F500910605EE\r\n:1030E000109107052091080530910905413059F0EC\r\n:1030F00088299929AA29BB29BC01CD016023712304\r\n:10310000822393231EC0802A912AA22AB32A13C0A5\r\n:1031100088299929AA29BB2900910605109107053C\r\n:103120002091080530910905BC01CD016027712768\r\n:103130008227932706C0BC01CD01682979298A29F5\r\n:103140009B290E946A1CADC01F70BB2039F0812FE3\r\n:103150000E94BE1C802F0E94372EA3C0802F0E9489\r\n:103160002C2E812F0E94801C9CC0802F32EF931642\r\n:1031700009F440C0391538F090EF991661F0E1EF8D\r\n:103180009E1699F170C0F3EF9F16D9F124EF9216B5\r\n:1031900009F44EC068C0BB2019F134E03A1508F4B8\r\n:1031A0007CC01F7181E090E0A0E0B0E0AC01BD0107\r\n:1031B00004C0440F551F661F771F1A95D2F78091E0\r\n:1031C000060590910705A0910805B09109058A01AF\r\n:1031D0009B01082719272A273B27C901B80125C0C9\r\n:1031E00025E02A1508F459C0DCCFBB2029F0812F37\r\n:1031F0008F712CC0BB20D9F3812F8F710E94801C4E\r\n:103200004CC0BB2079F01F7181E090E0A0E0B0E0FD\r\n:10321000BC01CD0104C0660F771F881F991F1A9546\r\n:10322000D2F703C060E070E0CB010E946A1C35C099\r\n:10323000BB2079F01F71812F0E94BE1C38E0139FC4\r\n:10324000C001112483608093A405812F0E94BE1CBD\r\n:1032500024C081E00E94A51C81E08A15F0F482E080\r\n:103260000E94A51C1AC0BB2039F0AA2009F4BFCFC8\r\n:10327000802F0E949D2E11C0AA2009F4BDCF893352\r\n:1032800049F49FEFE3EFF1E09150E040F040E1F7C7\r\n:1032900000C00000802F0E94412E88EF8C0D8430EA\r\n:1032A00010F40E944229DD2041F18091A40580FDA7\r\n:1032B00024C0F70112828595859585950E94BE1CD4\r\n:1032C000C7010E9441148091A40585958595859537\r\n:1032D0000F900F900F900F900F90DF91CF911F9153\r\n:1032E0000F91FF90EF90DF90CF90BF90AF909F90A5\r\n:1032F0008F900C94801C69E219CD0F900F900F9065\r\n:103300000F900F90DF91CF911F910F91FF90EF9051\r\n:10331000DF90CF90BF90AF909F908F9008950895C9\r\n:103320008091AE05089580E00895CF93DF9300D09B\r\n:103330001F92CDB7DEB79091D105943011F58983F6\r\n:103340007B836A839093E9008FEF9091E80081502E\r\n:1033500095FD06C09AE69A95F1F700C08111F5CF68\r\n:103360008091E80085FF0DC040E050E063E070E030\r\n:10337000CE0101960E94231F8091E8008E778093F2\r\n:10338000E8000F900F900F90DF91CF910895BC014E\r\n:1033900084E00C949519BC0183E00C949519CF93AB\r\n:1033A000DF9320914801222339F020915E0327FF0B\r\n:1033B00003C060E224E002C068E021E02093E9005D\r\n:1033C0002FEF3091E800215035FD06C03AE63A95DE\r\n:1033D000F1F700C02111F5CF2091E80025FF1DC0B5\r\n:1033E000EC0180914801811105C040E050E068E0A7\r\n:1033F00070E003C070E040E050E0CE010E94231F67\r\n:103400008091E8008E778093E80080E2FE01AFEAC9\r\n:10341000B5E001900D928A95E1F7DF91CF91089583\r\n:1034200078941F920F920FB60F9211248F939F934F\r\n:10343000AF93BF938091EA039091EB03A091EC03CB\r\n:10344000B091ED030196A11DB11D8093EA03909305\r\n:10345000EB03A093EC03B093ED03BF91AF919F9169\r\n:103460008F910F900FBE0F901F9018952FB7F89463\r\n:103470008091EA039091EB03A091EC03B091ED03EE\r\n:103480002FBF08951F920F920FB60F9211248F93A2\r\n:103490009F93AF93BF9380916203811113C080917A\r\n:1034A000EA039091EB03A091EC03B091ED034196F8\r\n:1034B000A11DB11D8093EA039093EB03A093EC034D\r\n:1034C000B093ED03BF91AF919F918F910F900FBE7D\r\n:1034D0000F901F901895209148012223C9F0209148\r\n:1034E0005E0327FF15C0262F2695269526952E319B\r\n:1034F000C8F4FC01E20FF11D677081E090E001C0AB\r\n:10350000880F6A95EAF780959281892382830895CE\r\n:10351000FC0106962281621301C012823196E817DF\r\n:10352000F907C1F70895209148012223C1F02091A5\r\n:103530005E0327FF14C0262F2695269526952E314B\r\n:1035400030F5FC01E20FF11D677081E090E001C0F1\r\n:10355000880F6A95EAF79281892B82830895FC018E\r\n:1035600032962FEF30E04191641789F02F3F19F424\r\n:10357000411101C0232F3F5F3630A9F72F3F39F0AB\r\n:10358000FC01E20FF11D27FDFA956283089508956D\r\n:10359000CF9384E090E00E94C42FC82F81E290E096\r\n:1035A0000E94C42F2C2F30E0A901582BCA01CF91C3\r\n:1035B00008956BEE7EEF80E090E00E94003060E0C6\r\n:1035C00082E090E00E94E22F60E083E090E00E94C1\r\n:1035D000E22F1092A9051092AA051092AB05109245\r\n:1035E000AC0560E084E090E00E94E22F60E081E2C0\r\n:1035F00090E00E94E22F60E085E090E00E94E22FE0\r\n:1036000060E086E090E00E94E22F6FEF87E090E0BC\r\n:103610000E94E22F40E050E0BA0188E090E00E9472\r\n:10362000F42F60E08DE090E00E94E22F40E050E057\r\n:10363000BA0188E190E00E94F42F60E087E190E019\r\n:103640000E94E22F40E050E0BA018CE190E00E943D\r\n:10365000F42F60E080E290E00E94E22F40E050E032\r\n:10366000BA0188E190E00E94F42F40E050E0BA01F6\r\n:103670008FE090E00E94F42F40E050E0BA0183E137\r\n:1036800090E00C94F42F8091A80581111092A80568\r\n:1036900008959091A7058091A605892B2091A505F5\r\n:1036A000982F922B909315058091A8058823D9F027\r\n:1036B000892B8093150580914801882331F08091F2\r\n:1036C0005E0387FF02C08EE101C086E0E7E1F5E01E\r\n:1036D00090E0815028F021912223D9F39F5FF9CF08\r\n:1036E00091110E94431BE0916003F09161033097B8\r\n:1036F000A9F080914801882359F080915E0387FFEB\r\n:1037000007C0809115058093160585E08093150507\r\n:103710000280F381E02D85E195E00994089580E031\r\n:1037200090E00E942C2980E090E00E9416291092DF\r\n:10373000A6051092A5050C94491BBF92CF92DF926B\r\n:10374000EF92FF920F931F93CF93DF938C01C09062\r\n:103750000605D0900705E0900805F09009058091D6\r\n:10376000A9059091AA05A091AB05B091AC05C82A16\r\n:10377000D92AEA2AFB2ACFE1D0E0D701C6010C2ED4\r\n:1037800004C0B695A795979587950A94D2F780FDC2\r\n:1037900004C0219790F7B12C07C0BC2EB8018C2F24\r\n:1037A0000E941F0D0197A9F38B2DDF91CF911F91DF\r\n:1037B0000F91FF90EF90DF90CF90BF900895CF933F\r\n:1037C000DF93EC010E949D1BBE010E941F0DDF9143\r\n:1037D000CF9108950E94DF1B292F2F70E92FE295CA\r\n:1037E000EF704E2F50E0FA013297EE30F105B8F449\r\n:1037F000ED56FF4F0C949130803F99F018F4883EBD\r\n:1038000070F40FC0843F59F40CC0883E50F0813FE3\r\n:1038100031F407C0822F869586958695089580E0BD\r\n:10382000089581E008952EE0929F800D1124682F65\r\n:10383000669566956695982F977085E0689FB001AC\r\n:10384000112440E050E080E0FB01E40FF51FE35954\r\n:10385000FA4F208130E0092E02C0369527950A9450\r\n:10386000E2F721703327042E01C0220F0A94EAF7F1\r\n:10387000822B4F5F5F4F4530510531F708952EE0A1\r\n:10388000929F800D1124E82FE695E695E6958770C6\r\n:1038900051E001C0550F8A95EAF785E0E89FF001F5\r\n:1038A0001124E359FA4F20E030E070E04081CB0171\r\n:1038B000022E02C0969587950A94E2F78170819551\r\n:1038C00084278523842781932F5F3F4F253031053F\r\n:1038D00069F70895CF92DF92EF92FF926B017C011E\r\n:1038E0000E94EA13C0920605D0920705E0920805EF\r\n:1038F000F0920905FF90EF90DF90CF900C948F1B12\r\n:103900000F931F9341E050E060E070E004C0440F6B\r\n:10391000551F661F771F8A95D2F740955095609581\r\n:1039200070958091060590910705A0910805B091CA\r\n:1039300009058A019B01082319232A233B23C90176\r\n:10394000B8011F910F910C946A1C2091A4058095D9\r\n:1039500082238093A405982F977079F430E0482F44\r\n:10396000082E000C550B2417350739F085958595E1\r\n:1039700085950E94801C1092A40508950F931F93B3\r\n:1039800041E050E060E070E004C0440F551F661F46\r\n:10399000771F8A95D2F78091060590910705A0912F\r\n:1039A0000805B09109058A019B01082B192B2A2BC8\r\n:1039B0003B2BC901B8011F910F910C946A1C6093B5\r\n:1039C000A9057093AA058093AB059093AC050C9460\r\n:1039D0008F1B80916C0590913B05891719F08F5FC3\r\n:1039E0008770FBCF08950F931F93CF93DF93809140\r\n:1039F0003A0582958F7009F05DC080913705882364\r\n:103A000009F458C080916C0510913B056091350513\r\n:103A100070913605C0913805D091390591E06F3F1E\r\n:103A200009F090E0292F06E0811709F443C02097A0\r\n:103A300021F07F3F21F030E003C031E001C0322FA0\r\n:103A400090E030FD34C0089FF001099FF00D112473\r\n:103A5000DF01A45CBA4F11963C911197371327C030\r\n:103A60003C91361324C012963C91129731111FC01D\r\n:103A700013964D915C9114974C1B5D0B483C51057E\r\n:103A8000B0F480913A058F70806180933A05EF5BC6\r\n:103A9000FA4F80818F708061808385E395E00E947A\r\n:103AA0004114DF91CF911F910F910C94E91C019665\r\n:103AB0008770BACFDF91CF911F910F9108959F9298\r\n:103AC000AF92BF92CF92DF92EF92FF920F931F932C\r\n:103AD000CF93DF93CDB7DEB761970FB6F894DEBF13\r\n:103AE0000FBECDBF8C0185E0F801DE011D9601906F\r\n:103AF0000D928A95E1F7F80190818181E280309101\r\n:103B000035056091360540913805509139054115CC\r\n:103B1000510531F06F3F31F421E03F3F19F403C00C\r\n:103B200021E001C020E0F22FF1709F2E20FD23C183\r\n:103B3000F801C380D48025E3A22E25E0B22EF090B8\r\n:103B40003705F601E41BF50BFF2009F4CEC02091E8\r\n:103B50003A05E83CF10508F099C0422F407F09F092\r\n:103B600051C0681311C039130FC0FE2CE1100CC0F6\r\n:103B70002F70206120933A05C5010E944114809165\r\n:103B80003A05F801858337C1CD2831F08F3F31F4F4\r\n:103B900021E09F3F19F403C021E001C020E020FD97\r\n:103BA00003C021E02E2502C020E030E0F22FF170AA\r\n:103BB000FF2E20FF1DC020916C0540913B0556E073\r\n:103BC000241709F4F6C030E0529FF001539FF00D26\r\n:103BD0001124E45CFA4F6181861306C0608196135C\r\n:103BE00003C06281E61204C02F5F3F4F2770E8CF09\r\n:103BF000FE2CEE2009F4FFC080913A05816080938D\r\n:103C00003A0550C0681307C0391305C0E11003C05E\r\n:103C1000F80125838DC09D878E878D859E850E94A6\r\n:103C2000EA1B882369F1EE2059F120913A05822F91\r\n:103C300082958F7090E0029774F080913505909195\r\n:103C4000360598878F831986DB86CA862C87CE0136\r\n:103C500007960E94411486E0F801A5E3B5E00190C3\r\n:103C60000D928A95E1F70E94F31C0DC06817E1F0F0\r\n:103C70009D878E878D859E850E94EA1B81111EC0BF\r\n:103C8000C8010E944114FF24F394B5C0422F407F25\r\n:103C900069F785E395E00E94411486E0F5011192F1\r\n:103CA0008A95E9F7F12CA7C03913E2CFE110E0CFF4\r\n:103CB000F8012583C8010E94411457C0EE2001F38A\r\n:103CC00020913A05822F82958F7090E002971CF226\r\n:103CD00080913505909136059A8389831B82DD8218\r\n:103CE000CC822E83CE010196B4CFE83CF105E8F5F5\r\n:103CF000FE2CEE2029F2681327C0391325C020912D\r\n:103D00003A0520FD18C0822F82958F70482F50E011\r\n:103D10004115510581F0F80125834F30510541F0DF\r\n:103D20008F5F982F9295907F822F8F70892B85833C\r\n:103D3000C8010E94411486E0F801A5E3B5E00190B6\r\n:103D40000D928A95E1F757C09D878E878D859E8558\r\n:103D50000E94EA1B81117FCF80913A058160809398\r\n:103D60003A05C8010E94411446C086E0F50111924F\r\n:103D70008A95E9F740C0EE2009F482CF9D878E87AF\r\n:103D80008D859E850E94EA1BF82E882309F478CF42\r\n:103D900086E0F801A5E3B5E001900D928A95E1F780\r\n:103DA00080913505909136050E94DF1B0E94F31C1F\r\n:103DB00022C09D878E878D859E850E94DF1B292FBF\r\n:103DC00022952F70223028F49F7039F0811105C0A0\r\n:103DD0000BC0243028F49F7049F4805E883020F0B6\r\n:103DE000C8010E9441149F2CF92C05C0F80195814F\r\n:103DF000907F99F7F9CF8F2D61960FB6F894DEBFBB\r\n:103E00000FBECDBFDF91CF911F910F91FF90EF902B\r\n:103E1000DF90CF90BF90AF909F9008951092A7052C\r\n:103E200080914801882331F080915E0387FF02C0B2\r\n:103E30008EE101C086E0E7E1F5E0DF011D928A95A1\r\n:103E4000E9F70C948F1BEF92FF920F931F93CF9380\r\n:103E5000DF937C018B010E94122C811119C0E701B4\r\n:103E600001151105A1F08091E80085FD0AC080913F\r\n:103E7000E8008E778093E8000E94122C882381F35B\r\n:103E800007C089918093F10001501109E9CF80E0CA\r\n:103E9000DF91CF911F910F91FF90EF9008950F93B5\r\n:103EA0001F93CF93DF931F92CDB7DEB769838A014B\r\n:103EB00060E00E94450F97FD13C061E070E0CE0105\r\n:103EC00001960E940D0F97FD0BC061E070E0C801E4\r\n:103ED0000E940D0F8C0197FD05C00E943D0F02C08E\r\n:103EE000282F02C0202F912F822F0F90DF91CF918A\r\n:103EF0001F910F910895CF92DF92EF92FF920F934F\r\n:103F00001F93CF93DF93CDB7DEB72F970FB6F894FB\r\n:103F1000DEBF0FBECDBF7C0189011A861B861C86C1\r\n:103F20001D8619821A8286E0D82EDB8281E08C837E\r\n:103F300084E08D837E836F835887498749E050E012\r\n:103F4000BE016F5F7F4FF70180810E94C50F97FD13\r\n:103F500040C0C7010E94DE0F97FD3BC060E0F70143\r\n:103F600080810E94450F97FD34C01E86DF8662E087\r\n:103F700070E0CE010E960E940D0F97FD2AC061E001\r\n:103F8000F70180810E94450F97FD23C081E00E94C8\r\n:103F9000EB0E97FD1EC06E01FAE0CF0ED11CE12C96\r\n:103FA000F12C8FEFE81AF80A81E094E0E916F104A9\r\n:103FB0000CF080E00E94EB0E97FD0BC0F6018193A0\r\n:103FC0006F01F4E0EF16F10461F70E943D0F84E009\r\n:103FD00090E097FD09C04A855B856C857D85F80179\r\n:103FE00040835183628373832F960FB6F894DEBFAC\r\n:103FF0000FBECDBFDF91CF911F910F91FF90EF903A\r\n:10400000DF90CF9008956F927F928F929F92AF92A0\r\n:10401000BF92CF92DF92EF920F931F93CF93DF93D4\r\n:104020003C01C091490181E1C89FC02D1124D1E11B\r\n:10403000DC0FD53508F0D4E560910C0666958091CB\r\n:104040000406909105060E94AD2A182FCD1708F09E\r\n:1040500044C08C2E912CF401ED53FD4F9081809142\r\n:104060004A018923C1F1F401EE0FFF1FE55EFD4F08\r\n:10407000C080D12C80E7C81AD108F401EE0FFF1FD1\r\n:10408000E45EFD4FA080B12CE0E2AE1AB108CC9CFA\r\n:104090009001CD9C300D300D1124AA9CC001AB9C29\r\n:1040A000900D900D1124820F931F0E94532A082F08\r\n:1040B0006091090670910A0680910B06E12E950128\r\n:1040C000A601F30109950E94B72A462F282F672FD2\r\n:1040D000C4010E941A2ACF5FB9CF81E0D43508F01D\r\n:1040E00080E0DF91CF911F910F91EF90DF90CF9003\r\n:1040F000BF90AF909F908F907F906F900895CF92D8\r\n:10410000DF92EF92FF920F931F93CF93DF936C0197\r\n:10411000C091490181E1C89FC02D1124D1E1DC0F7C\r\n:10412000D53508F0D4E560910C06669580910406BB\r\n:10413000909105060E94AD2A182FCD1778F5EC2E28\r\n:10414000F12CF701ED53FD4F908180914A018923B5\r\n:1041500019F1F701EE0FFF1FE45EFD4F208130E003\r\n:1041600020523109F701EE0FFF1FE55EFD4F408140\r\n:1041700050E0405751096091090670910A068091FC\r\n:104180000B06012FF60109950E94B72A462F282F0A\r\n:10419000672FC7010E941A2ACF5FCFCF81E0D435A5\r\n:1041A00008F080E0DF91CF911F910F91FF90EF9089\r\n:1041B000DF90CF900895DF92EF92FF920F931F93BD\r\n:1041C000CF93DF937C01C091490181E1C89FC02D4D\r\n:1041D0001124D1E1DC0FD53508F0D4E560910C064F\r\n:1041E0006695669580910406909105060E94AD2A19\r\n:1041F000D82ECD17F0F40C2F10E0F801ED53FD4F41\r\n:10420000908180914A01892391F060910906709113\r\n:104210000A0680910B062D2D4C2FF70109950E945F\r\n:10422000B72A462F282F672FC8010E941A2ACF5F6E\r\n:10423000E0CF81E0D43508F080E0DF91CF911F918D\r\n:104240000F91FF90EF90DF9008959F92AF92BF92F1\r\n:10425000CF92DF92EF92FF920F931F93CF93DF9352\r\n:104260006C01C091490181E1C89FC02D1124D1E1A9\r\n:10427000DC0FD53508F0D4E560910C06669566959F\r\n:1042800080910406909105060E94AD2A182F80E4C3\r\n:10429000810F0E94322A90E8F92EF80E812F0E9499\r\n:1042A000322A20E8922E980ECD1700F5AC2EB12CB4\r\n:1042B000F501ED53FD4F908180914A018923A1F0D2\r\n:1042C0006091090670910A0680910B06E12E0C2F71\r\n:1042D000292D4F2DF60109950E94B72A462F282F28\r\n:1042E000672FC5010E941A2ACF5FDECF81E0D43547\r\n:1042F00008F080E0DF91CF911F910F91FF90EF9038\r\n:10430000DF90CF90BF90AF909F900895CF92DF92B3\r\n:10431000EF92FF920F931F93CF93DF936C01C091A5\r\n:10432000490181E1C89FC02D1124D1E1DC0FD535B1\r\n:1043300008F0D4E520910C0630E040E050E06FEF4B\r\n:104340007FEF80E090E00E9406308901CD17E8F50C\r\n:10435000EC2EF12CF701ED53FD4F908180914A0135\r\n:10436000892389F19091DB05915097FD15C0492F64\r\n:10437000092E000C550BFA01E552FA4F8189C8133A\r\n:10438000F3CF440F551FFA01E552FA4F218D328DBC\r\n:104390002017310748F701C0980160910C06C90148\r\n:1043A0000E94AD2AAC016091090670910A068091C5\r\n:1043B0000B06F60109950E94B72A462F282F672F72\r\n:1043C000C7010E941A2ACF5FC1CF81E0D43508F01F\r\n:1043D00080E0DF91CF911F910F91FF90EF90DF90E0\r\n:1043E000CF9008952F923F924F925F926F927F925B\r\n:1043F0008F929F92AF92BF92CF92DF92EF92FF92F5\r\n:104400000F931F93CF93DF93CDB7DEB727970FB6E8\r\n:10441000F894DEBF0FBECDBF282E4B01209149017D\r\n:1044200081E1289F802D11248E83182F1F5E153562\r\n:1044300008F014E53091DB0539839E81911708F06F\r\n:1044400077C08E81682E712CF301ED53FD4F908162\r\n:1044500080914A01892309F467C030900906409091\r\n:104460000A06522C1F82C301880F991FDC01A55E2A\r\n:10447000BD4FBB83AA83C301880F991FFC01E45E73\r\n:10448000FD4FFD83EC83F9815F16E0F5E52CF12CFF\r\n:10449000AA81BB81CC90D12CF701E552FA4F8181E2\r\n:1044A000C81AD108AC81BD81AC90B12C8185A81A05\r\n:1044B000B108CC9C9001CD9C300D300D1124AA9CEC\r\n:1044C000C001AB9C900D900D1124820F931F0E9490\r\n:1044D000532A082FF701EE0FFF1FE552FA4F6091A4\r\n:1044E0000C06818D928D0E94AD2A7C019501A6015A\r\n:1044F000632D742D8F81F4010995362E472E8F83FD\r\n:104500005394C1CF20910B068F81382F329F312DCC\r\n:104510001124832F632D742D0E94B72A462F282F34\r\n:10452000672FC3010E941A2A8E818F5F8E8385CFE9\r\n:1045300081E0143508F080E027960FB6F894DEBFCE\r\n:104540000FBECDBFDF91CF911F910F91FF90EF90E4\r\n:10455000DF90CF90BF90AF909F908F907F906F90A3\r\n:104560005F904F903F902F9008951F93CF93DF93CC\r\n:10457000CDB7DEB7AA970FB6F894DEBF0FBECDBF9A\r\n:10458000E3EDF5E08091F100819345E0EB3DF40728\r\n:10459000C9F78091D405833009F460C030F48130CC\r\n:1045A00071F0823009F49AC0B1C08A3009F486C033\r\n:1045B0008B3009F46BC0893009F0A8C020C080910D\r\n:1045C000D305813A09F0A2C08091E800877F8093EB\r\n:1045D000E8008091D7059091D805892B21F460E2FD\r\n:1045E0008FEA95E003C060E080E090E070E00E9418\r\n:1045F000D02D8091E8008B778093E80087C0809170\r\n:10460000D305813209F082C08091D7059091D805F9\r\n:10461000009719F0029709F079C08091E800877F30\r\n:104620008093E8008091E80082FD05C08091D1056B\r\n:104630008111F8CF6BC08091F2009091F300029746\r\n:1046400029F48091F1008B7F813021F48091F10079\r\n:104650008093AE058091E8008B7754C08091D3059C\r\n:10466000813A09F053C08091D7059091D805892BE4\r\n:1046700009F04CC08091E800877F8093E80080912A\r\n:10468000E80080FFFCCF8091480137C08091D305BE\r\n:104690008132E1F58091D7059091D805892BB1F54C\r\n:1046A0008091E800877F8093E8000E94452C8091EC\r\n:1046B000D505809348010E940E1F28C08091D30524\r\n:1046C000813221F58091E800877F8093E8000E9485\r\n:1046D000452C8091D6058093AD0518C08091D305F7\r\n:1046E000813AA1F48091E800877F8093E80080916F\r\n:1046F000E80080FFFCCF8091AD058093F1008091B0\r\n:10470000E8008E778093E8000E94452C8091E800B5\r\n:1047100083FFDAC18091D3059091D405492F50E0F1\r\n:104720004A30510508F0D0C1FA01EF55FF4F0C9403\r\n:104730009130803821F0823809F0C6C108C08091DC\r\n:10474000CF059091D005992389F082600FC08091A8\r\n:10475000D7058F70873008F0B7C18093E90080914A\r\n:10476000EB0085FB882780F91092E9009091E80022\r\n:10477000977F9093E8008093F1001092F1006DC153\r\n:10478000282F2D7F09F0A0C1882319F0823061F015\r\n:104790009BC18091D505813009F096C1933009F015\r\n:1047A00080E08093D0052EC08091D50581112AC06C\r\n:1047B0008091D7058F702FEF280F263008F084C125\r\n:1047C0008093E9002091EB0020FF1CC0933021F47E\r\n:1047D0008091EB00806214C09091EB009061909307\r\n:1047E000EB0021E030E0A90102C0440F551F8A957B\r\n:1047F000E2F74093EA001092EA008091EB008860B3\r\n:104800008093EB001092E9008091E800877F80930D\r\n:10481000E8000E94452C58C1811156C11091D50560\r\n:104820001F778091E3008078812B8093E300809153\r\n:10483000E800877F8093E8000E94452C8091E80083\r\n:1048400080FFFCCF8091E30080688093E30011112A\r\n:1048500002C082E001C083E08093D10535C1805859\r\n:10486000823008F031C12091D5053091D6052C3D1C\r\n:1048700053E0350779F583E08A838AE289834FB76D\r\n:10488000F894DE01139620E03EE051E2E32FF0E0E1\r\n:1048900050935700E49120FF03C0E295EF703F5F13\r\n:1048A000EF708E2F90E0EA3010F0C79601C0C096EE\r\n:1048B0008D939D932F5F243149F74FBF8091E8007E\r\n:1048C000877F8093E8006AE270E0CE0101960E9443\r\n:1048D000D02DB1C08091D7059091D805432F552791\r\n:1048E00043305105A9F068F44130510509F4FBC08B\r\n:1048F0004230510509F0E8C08BE590E0E5ECF4E0CA\r\n:104900004BC04132510529F14232510589F1DCC0D9\r\n:10491000C901992781309105A1F058F0029709F05B\r\n:10492000D3C0E2E3F5E0E4918E2F90E0E2E3F5E01E\r\n:1049300030C0E8E9F5E0E4918E2F90E0E8E9F5E099\r\n:1049400028C0E4E8F5E0E4918E2F90E0E4E8F5E09B\r\n:1049500020C08330910508F0B7C0880F991FFC0173\r\n:10496000EF53FE4F0190F081E02D89E090E014C0FC\r\n:104970008330910508F0A8C0FC01EE0FFF1FE5543D\r\n:10498000FE4F0190F081E02DDC01A854BE4F8C91C8\r\n:1049900090E0009709F498C02091E800277F2093C9\r\n:1049A000E8002091D9053091DA052817390708F475\r\n:1049B000C90140E0009771F12091D1052223D9F17E\r\n:1049C0002530C9F12091E80023FD35C02091E80091\r\n:1049D00022FD2DC02091E80020FFECCF2091F200B5\r\n:1049E0003091F300009759F02830310540F444919C\r\n:1049F0004093F100319601972F5F3F4FF3CF41E095\r\n:104A00002830310509F040E02091E8002E7720930E\r\n:104A1000E800D0CF4111D0CF0AC08091D1058823C2\r\n:104A200051F0853041F08091E80083FD04C0809111\r\n:104A3000E80082FFF2CF8091E8008B778093E80056\r\n:104A400043C0803809F040C08091E800877F8093A0\r\n:104A5000E8008091D2058093F1008091E8008E7784\r\n:104A6000D6CE811131C08091D5059091D605992778\r\n:104A7000029754F58091E800877F8093E8001091B9\r\n:104A8000D5051093D2050E94452C111106C08091C6\r\n:104A9000E30087FD02C081E001C084E08093D1057E\r\n:104AA00042E061EC81E00E94642C42E261EC84E02F\r\n:104AB0000E94642C42E261EC82E00E94642C42E29B\r\n:104AC00060EC83E00E94642C8091E80083FF10C0BA\r\n:104AD0008091E800877F8093E8008091EB008062FE\r\n:104AE0008093EB0005C082E190E0E0E2F5E054CF76\r\n:104AF000AA960FB6F894DEBF0FBECDBFDF91CF915F\r\n:104B00001F910895EDE0F6E097E0E930F90729F00C\r\n:104B10008183608342833396F7CF0895FC01EE0FC3\r\n:104B2000FF1F8E0F9F1FFC01E35FF94F61834083DE\r\n:104B300022830895EF92FF920F939701201B310972\r\n:104B40002F3F310519F010F02FEF30E02095382F6E\r\n:104B5000320F08F43FEF832F0F91FF90EF900895ED\r\n:104B6000EF92FF920F939701201B31092F3F3105E0\r\n:104B700019F010F02FEF30E0322F3095482F430F0F\r\n:104B800008F44FEF842F620F0F91FF90EF9008957C\r\n:104B9000EF92FF920F93972F093438F4B701601BFF\r\n:104BA00071096F3F710519F010F06FEF70E0485F09\r\n:104BB0005F4F4131510540F0A901485F5F4F4131DE\r\n:104BC000510510F06FEF70E06095482F460F08F424\r\n:104BD0004FEF842F37FF02C02D5F3F4F359527954C\r\n:104BE0003595279560910906620F792F0F91FF90F7\r\n:104BF000EF900895EF92FF920F93E00EF11CF901F0\r\n:104C000037FF03C0F195E195F10924E0EE0FFF1F96\r\n:104C10002A95E1F7EF3FF10519F014F0EFEFF0E01E\r\n:104C20009A0157FF03C031952195310994E0220F75\r\n:104C3000331F9A95E1F72E173F070CF4F901EE0D9B\r\n:104C4000FF1DEF3FF10519F010F0EFEFF0E02E2F10\r\n:104C50002095382F320F08F43FEF832F0F91FF90EC\r\n:104C6000EF900895EF92FF920F93970195E0099FBF\r\n:104C7000200D311D11242F3F310519F010F02FEFB9\r\n:104C800030E02095382F320F08F43FEF832F0F913B\r\n:104C9000FF90EF90089522E8241B08F420E0620FB3\r\n:104CA00008954095282F429F412D1124842F089567\r\n:104CB0000F931F9310E0F801EE0FFF1FE55EFD4F0D\r\n:104CC0009081905797FD9195000F111FF801E45EB8\r\n:104CD000FD4FE081F0E0B097DF01AA0FBB1F8D010F\r\n:104CE0000E0F1F1F2003D001219FB00D1124E8E3F8\r\n:104CF000F0E0E91BF10997FDF3959F01220F331FA7\r\n:104D000089010E0F1F1F40039001419F300D112498\r\n:104D10002A0F3B1F37FF02C021583F4F220F232F7E\r\n:104D2000221F330B620F1F910F9108950F931F9352\r\n:104D3000522F10E0F801EE0FFF1FE45EFD4FE081FF\r\n:104D4000F0E0B097EE0FFF1F9F015203D001539F79\r\n:104D5000B00D1124000F111FF801E55EFD4F008119\r\n:104D600010E000571109000F111F40039001419FEF\r\n:104D7000300D11242A0F3B1F37FF02C021583F4F2F\r\n:104D8000220F232F221F330B620F1F910F910895C3\r\n:104D90000F931F93522F10E0F801EE0FFF1FE45EF8\r\n:104DA000FD4FE081F0E0B0979F015203D001539F87\r\n:104DB000B00D1124000F111FF801E55EFD4F0081B9\r\n:104DC00010E00057110940039001419F300D11245C\r\n:104DD0002A0F3B1F37FF02C021583F4F220F232FBE\r\n:104DE000221F330B620F1F910F910895EF920F93C3\r\n:104DF0001F9393E0099F80011124159507956E2D4F\r\n:104E0000600F1F910F91EF900895A22F50E0FA01CB\r\n:104E1000EE0FFF1FE45EFD4F9081905297FD91953C\r\n:104E2000440F551FFA01E55EFD4F3081232F30E01E\r\n:104E30002A1B3109290F311D97FD3A95620F0895FC\r\n:104E4000E42FF0E0EE0FFF1FE45EFD4F6081621B78\r\n:104E50000895E42FF0E0EE0FFF1FE55EFD4F608147\r\n:104E6000621B0895622F0895E42FF0E0EE0FFF1FFC\r\n:104E7000E55EFD4F408134EE439F412D1124E82F24\r\n:104E8000F0E050E0445E5F4FDA01A21BB1099D01E2\r\n:104E9000B7FF03C031952195310993E0220F331FED\r\n:104EA0009A95E1F7AF01421B530B9A0157FF02C0DD\r\n:104EB00020E030E0582F259F212D1124822F0895C6\r\n:104EC000E42FF0E0EE0FFF1FE55EFD4F408134EE72\r\n:104ED000439F412D1124E72FF0E050E0445E5F4FE7\r\n:104EE000DA01A21BB1099D01B7FF03C031952195DD\r\n:104EF000310993E0220F331F9A95E1F7AF01421B6E\r\n:104F0000530B9A0157FF02C020E030E0279F212D6C\r\n:104F10001124722F0895FC019B01009721F477FF63\r\n:104F20002BC080E80895AC0197FF04C044275527A3\r\n:104F3000481B590BB901640F751F37FD0CC0241BAA\r\n:104F4000350BC901A5E0880F991FAA95E1F70E94CA\r\n:104F50007D3080E20CC0CB0165E0880F991F6A9517\r\n:104F6000E1F7BA01621B730B0E947D3080E6861B5D\r\n:104F7000F7FF03C08195089580E00895EF920F93A5\r\n:104F8000CF93DF93D72FC82FC9010E19BA010E9402\r\n:104F90008B27602F681B7D2F8C2FDF91CF910F9176\r\n:104FA000EF9008950F93CF93DF93D72FC82FC901A8\r\n:104FB000BA010E948B27682F600F7D2F8C2FDF9105\r\n:104FC000CF910F910895EF920F931F93CF93DF939B\r\n:104FD000D62FC72F182FC9010E19010FBA010E9431\r\n:104FE0008B27081B202F219F212D1124822F6D2F0D\r\n:104FF0007C2FDF91CF911F910F91EF900895EF9249\r\n:105000000F931F93CF93DF93D62F172FC82FC9016C\r\n:105010000E19070FBA010E948B27702F781B719F02\r\n:10502000712D11246D2F8C2FDF91CF911F910F9136\r\n:10503000EF900895FF920F931F93CF93DF93F62E77\r\n:10504000D72F182FC901C12FC01BBA010E948B276F\r\n:10505000982F990F890FC81B2C2F219F212D1124C8\r\n:10506000822F6F2D7D2FDF91CF911F910F91FF9098\r\n:105070000895FF920F931F93CF93DF93F62E172F70\r\n:10508000D82FC901C72FC01BBA010E948B27982FA8\r\n:10509000990F890F7C2F781B719F712D11246F2D13\r\n:1050A0008D2FDF91CF911F910F91FF900895879AD7\r\n:1050B00081B38F7791B390682FB7F894EDE0F6E065\r\n:1050C00037E0E930F30761F0319148E091BB37FFF9\r\n:1050D00081BB330F000000C081BB4A95B9F7F0CF08\r\n:1050E0002FBF8FE292E00197F1F700C00000089512\r\n:1050F0001F93CF93DF93CDB7DEB767970FB6F894C2\r\n:10510000DEBF0FBECDBF342F4B8B252F5C8B6D8B3D\r\n:105110007E8B8F8B4E895F8961111092A60586E088\r\n:10512000FE013D96DF01982F1D929A95E9F73D8784\r\n:105130002E876F87598B488BDE01179601900D9251\r\n:105140008A95E1F7CE0107960E945F1D81113EC04E\r\n:1051500086E0FE013796DE01119601900D928A9548\r\n:10516000E1F7FF81E8856A857B856115710531F07E\r\n:10517000EF3F31F481E0FF3F19F403C081E001C04B\r\n:1051800080E080FD23C020913B0530E0C9010196FD\r\n:105190008770992740916C0550E08417950779F145\r\n:1051A000F983EA837D836C8396E0929FD001939F7D\r\n:1051B000B00D1124A45CBA4FFE01319601900D92FE\r\n:1051C0009A95E1F780933B050E94E91C16E08091D7\r\n:1051D0006C0590913B058917F9F0189FC0011124C7\r\n:1051E000845C9A4F0E945F1D8823B1F080916C050A\r\n:1051F00090E001968770992780936C05E8CF0E9414\r\n:105200000E1F10923B0510926C05E5E3F5E086E079\r\n:10521000DF011D928A95E9F767960FB6F894DEBF15\r\n:105220000FBECDBFDF91CF911F91089520910D0743\r\n:1052300030910E072817390771F090930E0780936D\r\n:105240000D07E0916003F0916103309721F0008435\r\n:10525000F185E02D0994089520910B0730910C07FA\r\n:105260002817390771F090930C0780930B07E09192\r\n:105270006003F0916103309721F00680F781E02D03\r\n:1052800009940895E0916003F0916103309721F053\r\n:105290000190F081E02D099480E00895EF92FF9253\r\n:1052A0000F93CF93DF93C42FD22FFC0182818823E9\r\n:1052B000D1F0409313050E94361A90930A07809309\r\n:1052C000090780E28C0F883008F078C0C77081E051\r\n:1052D00001C0880FCA95EAF7DF91CF910F91FF9037\r\n:1052E000EF900C94372E80911305481356C02091EF\r\n:1052F000090730910A074FB7F8948091EA0390911B\r\n:10530000EB03A091EC03B091ED034FBF821B930B15\r\n:10531000883C910508F041C0CD17C9F080E28C0FA0\r\n:10532000883040F4C77081E001C0880FCA95EAF761\r\n:105330000E942C2E80E28D0F883048F481E09D2F52\r\n:10534000977001C0880F9A95EAF70E94372E0933AB\r\n:1053500019F0E12CF12C03C080E5E82EF12C802F10\r\n:105360000E949D2EE114F10451F08FEC97E001971B\r\n:10537000F1F700C0000091E0E91AF108F3CF802FA7\r\n:105380000E94412E80E28D0F8830C0F4D77081E0FA\r\n:1053900001C0880FDA95EAF70AC080E28C0F8830E6\r\n:1053A00068F4C77081E001C0880FCA95EAF7DF9101\r\n:1053B000CF910F91FF90EF900C942C2EDF91CF9115\r\n:1053C0000F91FF90EF9008950F931F93CF93DF936A\r\n:1053D000C42FD0E0CC0FDD1F2CE1629FC00DD11D8A\r\n:1053E000112438EA839FC00DD11D1124CD5BDF4FFE\r\n:1053F000CE010E94C42F082F10E0102F0027CE01ED\r\n:1054000001960E94C42F9801282BC901DF91CF91EA\r\n:105410001F910F910895462F843038F4763028F488\r\n:105420006E3018F4672F0C94E42980E090E0089522\r\n:105430000C9482250C948E25E8E0F6E08DE38083C1\r\n:105440008091520190915301A091540181839283E4\r\n:10545000A3838FE7848345E050E06CE170E0CF01E7\r\n:105460000C94D22F482F982F46FD9095E92FEF737B\r\n:105470009F7046FD9F5FE295EF70EE0FF0E0E95EF2\r\n:10548000FC4F2181299F802D212D112482958F7021\r\n:105490002295207F822B3081982F930F892F47FDF3\r\n:1054A000819580580895BC018230910508F40895D3\r\n:1054B000613E8EE1780748F49B0195E0369527958B\r\n:1054C0009A95E1F748E0420F01C04FEF91E0242F99\r\n:1054D00030E0290F311D35952795229FF001239F3C\r\n:1054E000F00DF00D11246E177F0718F44FEF420FE7\r\n:1054F00004C02F3F39F091E0920F491740F78FEF2A\r\n:10550000890F08958FEF08950F93CF93DF93D72FCF\r\n:10551000C82F47FD4195E8E3F0E0CF01841B9109D6\r\n:1055200047FD9395889FB001899F700D700D1124E0\r\n:10553000229FC001239F900D900D1124860F971F6D\r\n:105540000E94532A682F660F860F682F600F7D2FE9\r\n:105550008C2FDF91CF910F91089520E030E0869F4E\r\n:10556000212D969F200D311D1124C9010895CF9240\r\n:10557000DF92EF92FF920F931F93CF93DF93F62E5C\r\n:10558000472FE82FF0E0711106C0E456FA4F8491DE\r\n:10559000782F682F73C0272F30E0E456FA4FE4913C\r\n:1055A000FE2F0E2F10E056E0659FC0011124CFEFB3\r\n:1055B000D0E0BE010E9469305BEA5603C001579FEC\r\n:1055C000900D11248F0D911D8F0D911D982F990F06\r\n:1055D000980F7E01E21AF30AE09ED001E19EB00D21\r\n:1055E000F09EB00D11248B2F499FA0011124452F4F\r\n:1055F00055277E01E41AF50AE09EA001E19E500DB8\r\n:10560000F09E500D11246E01C91AD108C29E70017E\r\n:10561000C39EF00CD29EF00C11242F2D3327C21BF9\r\n:10562000D30BC09F9001C19F300DD09F300D11242E\r\n:10563000932F6230710591F048F461157105E1F026\r\n:1056400061307105B9F49E2FE52F16C064307105E5\r\n:1056500069F040F06630710579F00CC09E2FEB2F99\r\n:10566000832F0AC0EB2F8F2F952F06C09B2F8E2FD5\r\n:10567000E32F02C09B2F852F7E2F692FDF91CF91C3\r\n:105680001F910F91FF90EF90DF90CF900895DF92E0\r\n:10569000EF92FF920F931F93CF93DF93EC01FC01E6\r\n:1056A000ED53FD4F9081692381F1D0900A0600915E\r\n:1056B0000B0610910906E12EF12C0E94A42F282F31\r\n:1056C000C7018C549F4F68E671E00E947D308E19AF\r\n:1056D0009F0997FD039695958795959587952370D6\r\n:1056E000612F289F600D11247D2D802F0E94B72AE5\r\n:1056F000462F282F672FCE01DF91CF911F910F9159\r\n:10570000FF90EF90DF900C941A2ADF91CF911F91B8\r\n:105710000F91FF90EF90DF9008951F93CF93DF9349\r\n:10572000FC01ED53FD4F20816223A9F0EC010E94A2\r\n:10573000A42F182F0E94A42F612F782F80910B0681\r\n:105740000E94B72A462F282F672FCE01DF91CF91D5\r\n:105750001F910C941A2ADF91CF911F9108951F92E7\r\n:105760000F920FB60F9211242F933F934F935F9395\r\n:105770006F937F938F939F93AF93BF93CF93DF9359\r\n:10578000EF93FF93C091E900CF708091EC00D82F88\r\n:10579000D17080FDD0E81092E9008091F000877F01\r\n:1057A0008093F00078940E94B5221092E9008091D5\r\n:1057B000F00088608093F000CD2BCF70C093E9009B\r\n:1057C000FF91EF91DF91CF91BF91AF919F918F9119\r\n:1057D0007F916F915F914F913F912F910F900FBEED\r\n:1057E0000F901F901895E8EDF0E080818C7F80830A\r\n:1057F0001092E2001092DA001092E100A0EEB0E008\r\n:105800008C9181608C9380818F77808319BCA7ED08\r\n:10581000B0E08C918E7F8C9380818F7E80831092FC\r\n:105820000F0708952091E4003091E50095E640913E\r\n:10583000EC00842F817040FF23C08091E80080FD40\r\n:105840001DC08091D105882399F0853099F0809111\r\n:10585000EB0085FD11C04091E4005091E500241754\r\n:10586000350729F3915011F09A01E1CF84E00895B2\r\n:1058700082E0089583E0089581E0089580E008952E\r\n:105880004091E80042FFDDCF08958091D30587FF66\r\n:1058900011C08091E80082FD05C08091D105811181\r\n:1058A000F8CF11C08091E8008B770BC08091D105B3\r\n:1058B000882349F08091E80080FFF8CF8091E800CC\r\n:1058C0008E778093E8000895982F973068F590932D\r\n:1058D000E900981739F07091EC002091ED0050919B\r\n:1058E000F00003C0242F762F50E021FD02C09F5FFF\r\n:1058F000ECCF3091EB003E7F3093EB003091ED0028\r\n:105900003D7F3093ED003091EB0031603093EB0040\r\n:105910007093EC002093ED005093F0002091EE0086\r\n:1059200027FDE5CF80E008958F708093E90081E046\r\n:105930000895CF92DF92EF92FF920F931F93CF9330\r\n:10594000DF93C8EDD0E088818F7E8883E7EDF0E0BB\r\n:1059500080818160808381E080930F0788818C7FC4\r\n:10596000888302EE10E0D8011C921092DA0081EEDA\r\n:10597000C82ED12CD6011C9288818F77888388818C\r\n:105980008068888388818F7D888380818068808318\r\n:1059900019BC1092D1051092D2051092D005109228\r\n:1059A000CF0590EEE92EF12CF70180818B7F80836B\r\n:1059B00088818160888342E060E080E00E94642CFE\r\n:1059C000D6018C918E7F8C93F801808181608083D9\r\n:1059D000808188608083D7018C918E7F8C938881B1\r\n:1059E00080618883DF91CF911F910F91FF90EF909D\r\n:1059F000DF90CF9008951F920F920FB60F9211244F\r\n:105A00002F933F934F935F936F937F938F939F93C6\r\n:105A1000AF93BF93EF93FF938091E10082FF09C0A2\r\n:105A20008091E20082FF05C08091E1008B7F80932E\r\n:105A3000E1008091DA0080FF2AC08091D80080FFC9\r\n:105A400026C08091DA008E7F8093DA008091D900A1\r\n:105A500080FF18C088E189BD8AE189BD09B400FED4\r\n:105A6000FDCF81E08093D10580910F0781110FC098\r\n:105A70000E94F32B0E94992C8091E2008460809315\r\n:105A8000E20005C019BC1092D10510920F07809159\r\n:105A9000E10080FF17C08091E20080FF13C0809179\r\n:105AA000E2008E7F8093E2008091E200806180932B\r\n:105AB000E2008091D80080628093D80019BC85E014\r\n:105AC0008093D1058091E10084FF2EC08091E20097\r\n:105AD00084FF2AC088E189BD8AE189BD09B400FE3E\r\n:105AE000FDCF8091D8008F7D8093D8008091E10018\r\n:105AF0008F7E8093E1008091E2008F7E8093E200B0\r\n:105B00008091E20081608093E2008091D205882339\r\n:105B100011F084E007C08091E30087FD02C081E0BE\r\n:105B200001C083E08093D1058091E10083FF27C00D\r\n:105B30008091E20083FF23C08091E100877F809302\r\n:105B4000E10082E08093D1051092D2058091E100BE\r\n:105B50008E7F8093E1008091E2008E7F8093E2004F\r\n:105B60008091E20080618093E20042E060E080E0AA\r\n:105B70000E94642C8091F00088608093F000FF9177\r\n:105B8000EF91BF91AF919F918F917F916F915F91B5\r\n:105B90004F913F912F910F900FBE0F901F9018952E\r\n:105BA0002091D9053091DA052617370748F061159D\r\n:105BB000710539F42091E8002E772093E80001C0A8\r\n:105BC000B901FC0120E06115710569F18091D105F1\r\n:105BD0008823E1F18530E1F18091E80083FD3AC04E\r\n:105BE0008091E80082FD2CC08091E80080FFEBCF1F\r\n:105BF0008091F2009091F3006115710551F08830A9\r\n:105C0000910538F421912093F100615071090196BA\r\n:105C1000F3CF21E0089709F020E08091E8008E772B\r\n:105C20008093E800D0CF2111D1CF0AC08091D10557\r\n:105C3000882361F0853061F08091E80083FD0AC01F\r\n:105C40008091E80082FFF2CF80E0089582E008951D\r\n:105C500083E0089581E00895882341F08095909134\r\n:105C6000A70589238093A7050C94491B08958823D1\r\n:105C700039F09091A705892B8093A7050C94491BB7\r\n:105C80000895882309F458C0682F823869F40E9467\r\n:105C9000422981FF51C069E385E195E00E94931A92\r\n:105CA0000E94491B69E30EC0833891F40E94422987\r\n:105CB00080FF42C063E585E195E00E94931A0E944F\r\n:105CC000491B63E585E195E00E946B1A0C94491B22\r\n:105CD000843869F40E94422982FF2EC067E485E17E\r\n:105CE00095E00E94931A0E94491B67E4EBCF8CEF6A\r\n:105CF000860F813A38F380E2860F883070F467703F\r\n:105D000081E090E001C0880F6A95EAF78095909154\r\n:105D1000A70589238093A705D9CF8BE5860F83300C\r\n:105D200020F480E090E00C942C29685A673120F42C\r\n:105D300080E090E00C9416290895CF93882309F40D\r\n:105D4000B5C0C82F8238B1F40E94422981FDAEC08F\r\n:105D500069E385E195E00E94931A0E94491B2FEFA9\r\n:105D600080E792E0215080409040E1F700C00000C1\r\n:105D700069E317C08338E1F40E94422980FD96C090\r\n:105D800063E585E195E00E94931A0E94491B2FEF7D\r\n:105D900080E792E0215080409040E1F700C0000091\r\n:105DA00063E585E195E00E946B1ACF910C94491B45\r\n:105DB0008438B1F40E94422982FD78C067E485E10D\r\n:105DC00095E00E94931A0E94491B2FEF80E792E012\r\n:105DD000215080409040E1F700C0000067E4E1CF2F\r\n:105DE0008CEF8C0F813AB8F5809148018823E1F05F\r\n:105DF00080915E0387FF18C0EC2FE695E695E69547\r\n:105E0000F0E0EB5EFA4F8281282F30E04C2F477094\r\n:105E100081E090E002C0880F991F4A95E2F7822343\r\n:105E20009323892B59F411C0E7E1F5E08191C8175C\r\n:105E300029F025E0ED31F207C9F707C06C2F85E1A5\r\n:105E400095E00E946B1A0E94491B6C2F85E195E03A\r\n:105E50000E94931AAACF80E28C0F883068F4C77032\r\n:105E600081E090E001C0880FCA95EAF79091A705FC\r\n:105E7000892B8093A70599CFEBE5EC0FE33040F435\r\n:105E8000F0E0E15EFC4F808190E0CF910C942C29F2\r\n:105E9000C85AC73158F4EC2FF0E0EE0FFF1FEE5D4B\r\n:105EA000FC4F80819181CF910C941629CF91089558\r\n:105EB0008F929F92AF92BF92CF92DF92EF92FF921A\r\n:105EC000CF93DF93EC01688179818A819B81611591\r\n:105ED00071058105910521F464E279ED8BE597E088\r\n:105EE0002DE133EF41E050E00E94063049015A01B4\r\n:105EF0009B01AC01A7EAB1E40E9425306B017C0153\r\n:105F0000ACEEB4EFA50194010E943330DC01CB016B\r\n:105F10008C0D9D1DAE1DBF1DB7FF03C00197A109CC\r\n:105F2000B04888839983AA83BB839F77DF91CF9101\r\n:105F3000FF90EF90DF90CF90BF90AF909F908F90A9\r\n:105F400008950E94582F089580E091E00E94582FF4\r\n:105F50000895A0E0B0E08093000190930101A09328\r\n:105F60000201B09303010895DC01CB01FC01F99912\r\n:105F7000FECF06C0F2BDE1BDF89A319600B40D9295\r\n:105F800041505040B8F70895F999FECF92BD81BDB8\r\n:105F9000F89A992780B50895A8E1B0E042E050E072\r\n:105FA0000C94B62FDC01A40FB51F4150504048F0AF\r\n:105FB000CB01840F951F2E910E94E32F415050403A\r\n:105FC000D0F70895262FF999FECF92BD81BDF89A9A\r\n:105FD000019700B4021639F01FBA20BD0FB6F8942D\r\n:105FE000FA9AF99A0FBE08950396272F0E94E32F7D\r\n:105FF0000E94E22F252F0E94E32F242F0C94E32FE1\r\n:106000000196272F0E94E32F0C94E22F052E97FB79\r\n:106010001EF400940E941D3057FD07D00E943830B6\r\n:1060200007FC03D04EF40C941D30509540953095EC\r\n:1060300021953F4F4F4F5F4F0895909580957095F4\r\n:1060400061957F4F8F4F9F4F08950E945A30A59FB3\r\n:10605000900DB49F900DA49F800D911D1124089563\r\n:10606000B7FF0C9425300E942530821B930B0895B6\r\n:10607000A1E21A2EAA1BBB1BFD010DC0AA1FBB1F4C\r\n:10608000EE1FFF1FA217B307E407F50720F0A21BBE\r\n:10609000B30BE40BF50B661F771F881F991F1A942B\r\n:1060A00069F760957095809590959B01AC01BD0155\r\n:1060B000CF010895A29FB001B39FC001A39F700DAF\r\n:1060C000811D1124911DB29F700D811D1124911D00\r\n:1060D0000895AA1BBB1B51E107C0AA1FBB1FA6172F\r\n:1060E000B70710F0A61BB70B881F991F5A95A9F781\r\n:1060F00080959095BC01CD01089597FB072E16F46D\r\n:10610000009407D077FD09D00E94693007FC05D0C4\r\n:106110003EF4909581959F4F0895709561957F4FBE\r\n:106120000895EE0FFF1F0590F491E02D0994FB01F7\r\n:10613000DC0102C001900D9241505040D8F7089503\r\n:10614000FB01DC014150504048F001900D920020CD\r\n:10615000C9F701C01D9241505040E0F70895F894EE\r\n:02616000FFCF6F\r\n:1061620001000000FFFF033D8EFFB07F958EFFB060\r\n:106172007F958EFFB07F958EFFB07F9019CF198FDC\r\n:1061820019CB19C7193C011D0000003C0119000080\r\n:10619200003C010A00000000510025012D015000C1\r\n:1061A2002B010152003101B00100FF00993700AA12\r\n:1061B20056008EFFB073797374656D37362F6C613C\r\n:1061C200756E63685F3200302E372E3130342D31D8\r\n:1061D20038382D673761363535653533306200F032\r\n:1061E200F1F2F3F4F566656463626167070605041C\r\n:1061F200C660C70207040603090209040303080272\r\n:1062020003030301260C0D0E10110F121317212286\r\n:1062120025002131426384B040226D85046304F677\r\n:1062220003D704F004100545464748494A4B4C4DF4\r\n:106232004E4F50515244434241403F3E3D3C3B3A17\r\n:106242003938372728292A2B2C2D2E2F303132335B\r\n:1062520034262524232221201F1E1D1C1B1A530C09\r\n:106262000B0A09080706050403020100360D0E0F8A\r\n:106272001011191213141516171835D133BE33AB7A\r\n:10628200339C338C337D336E335F33503341333140\r\n:106292003322330B3308401B402A40394050406EB2\r\n:1062A2004085409440A740C240D140E040E026C52E\r\n:1062B20026B226A3269426852676266726572648C2\r\n:1062C2002639262A261B260826041A171A261A35C4\r\n:1062D2001A441A541A631A721A811A901A9F1AAF20\r\n:1062E2001ABE1ACD1AE01AE00DC90DB60DA70D9807\r\n:1062F2000D890D790D6A0D5B0D4C0D3D0D2E0D1E98\r\n:106302000D0F0D000D00000F001E002E003D004C71\r\n:10631200005B006A00790089009800A700B600C9F6\r\n:1063220000E0000404040404040404040404040457\r\n:10633200040404040404040404040404040404041B\r\n:10634200040404040404040404040404040404040B\r\n:1063520004040404040404040404040404040404FB\r\n:1063620004040404040404040404040404040404EB\r\n:1063720004040404040404003131295A1B750A81FF\r\n:106382008283E200E900EA00B500B600B700CD0062\r\n:106392008301CC008A01920194012102230224028A\r\n:1063A2002502260227022A02B300B4006F00700001\r\n:10F000004BC0000074C0000072C0000070C000005F\r\n:10F010006EC000006CC000006AC0000068C0000044\r\n:10F0200066C0000064C00000A9C5000060C0000008\r\n:10F030005EC000005CC000005AC0000058C0000064\r\n:10F0400056C0000054C0000052C0000050C0000074\r\n:10F05000E5C100004CC000004AC0000048C00000EC\r\n:10F0600046C0000044C0000042C0000040C0000094\r\n:10F070003EC000003CC000003AC0000038C00000A4\r\n:10F0800036C0000034C0000032C0000030C00000B4\r\n:10F090002EC000002CC0000011241FBECFEFD0E115\r\n:10F0A000DEBFCDBF83E090E050D480FD04C084B7C4\r\n:10F0B0008D7F84BF03C084B7877F84BFE0E0F0E02A\r\n:10F0C0008591949111E0A0E0B1E0E8EAFEEF02C082\r\n:10F0D00005900D92A638B107D9F721E0A6E8B1E076\r\n:10F0E00001C01D92A33AB207E1F736D1DBC688CF43\r\n:10F0F0008823B9F02091F2003091F300232B69F4BA\r\n:10F100009091E8009B7F9093E8009091E80092FD39\r\n:10F1100006C09EB39111F9CF04C09091F1008150C7\r\n:10F12000E7CF0895EEE8F1E0358124819381828173\r\n:10F130009093880180938901C901909386018093FF\r\n:10F1400087010895CF92DF92EF92FF921F93CF93A2\r\n:10F15000DF9300D01F92CDB7DEB7909198018091D8\r\n:10F160008E019923D1F0843049F480918F0181116F\r\n:10F1700008C0809190018F3F21F455C0853009F47B\r\n:10F18000A2C08AE08093000183E080939601809181\r\n:10F19000EB0080628093EB00D4C0843009F443C05C\r\n:10F1A00028F4813051F08330D9F0CBC0853009F498\r\n:10F1B0008AC0863009F4B2C0C4C010918F011230E9\r\n:10F1C00008F0BFC0AFDF111109C0609188017091D4\r\n:10F1D000890120918A01822F90E064D385E007C0E5\r\n:10F1E00080918F01982F9D7F29F49CDF89E0809387\r\n:10F1F0000001A7C0813009F0A4C0E0E0F0E08491F4\r\n:10F200008F3F59F010928A01F0938901E0938801B1\r\n:10F210008AE08093000185E092C03196E11520EFED\r\n:10F22000F20769F78EC080918F01833091F581E0FC\r\n:10F2300080939701E0919401F09195018091900164\r\n:10F24000309761F0813009F07CC0909193018091FA\r\n:10F25000920190938B0180938C0173C0811111C036\r\n:10F2600082E49CED9093A4018093A3019CE088E14B\r\n:10F270000FB6F894A895809360000FBE909360003D\r\n:10F2800060C085919491019609F05BC010920101D4\r\n:10F2900058C0811156C0809190018F3F09F051C034\r\n:10F2A000C12CD12C7601C701B601FCD28FEFD81A40\r\n:10F2B000E80AF80AC11420EFD206E104F10499F734\r\n:10F2C000109298013EC08091020190910301A0919B\r\n:10F2D000040189839A83AB838091900190918F017F\r\n:10F2E000911107C0833038F5FE01E80FF11D8181CF\r\n:10F2F00012C0913031F5813359F020F48033D9F4C4\r\n:10F3000088E509C0803631F08136A9F482E803C06F\r\n:10F310008EE101C086E980938D0113C080918F0139\r\n:10F32000833079F48091900181110BC0809191011B\r\n:10F3300080938A0106C08AE08093000188E0809370\r\n:10F3400096010F900F900F90DF91CF911F91FF903A\r\n:10F35000EF90DF90CF90089584B7877F84BF0FB67A\r\n:10F36000F894A89580916000886180936000109265\r\n:10F3700060000FBE90E080E80FB6F89480936100C3\r\n:10F38000909361000FBEC1E0C5BF82E085BF559A72\r\n:10F390005D9A819AD8D36E9A769A3E9A469AC0938D\r\n:10F3A0006F0083E080938100769846987894C0E05F\r\n:10F3B000D0E080910101882361F152D58FB1827034\r\n:10F3C00090910001923009F5C93893E1D907E8F02E\r\n:10F3D000882369F38FEC97E00197F1F700C00000F4\r\n:10F3E0005AD36E9876983E98469810926F00109275\r\n:10F3F000810081E085BF15BE11BA10BA1BB81AB8DA\r\n:10F40000E0918B01F0918C010995882381F221967E\r\n:10F41000D0CF809197018111D0CFDCCF1F920F9276\r\n:10F420000FB60F9211248F9380E48CB986B98F9117\r\n:10F430000F900FBE0F901F9018955F926F927F9262\r\n:10F440008F929F92AF92BF92CF92DF92EF92FF92F4\r\n:10F450000F931F93CF93DF9380919B018F7781321E\r\n:10F4600009F0DEC180E48CB986B98091A101909148\r\n:10F47000A201909395018093940180919C01833027\r\n:10F4800009F488C158F48130D1F0823009F0C8C144\r\n:10F490008091E800877F8093E800F0C0853009F410\r\n:10F4A0009FC108F495C1863009F0BAC18091E80087\r\n:10F4B000877F8093E80082E080930001A1C1809162\r\n:10F4C000E800877F8093E80080919701882319F0F6\r\n:10F4D00039DE1092970180919401909195010097E7\r\n:10F4E00051F12091E80022FD04C02EB32111F9CF83\r\n:10F4F00097C12091F10020938E010197909395017F\r\n:10F5000080939401EFE8F1E08091F2009091F30094\r\n:10F51000892B81F08091F1008193809194019091E9\r\n:10F5200095010197909395018093940121E0E4392E\r\n:10F53000F20751F707DE80910001853009F096C08F\r\n:10F540008091940190919501892B21F482E0809320\r\n:10F5500000018CC08AE1CCDD009188011091890105\r\n:10F56000802F8F71C5DDC0918601D09187012196D2\r\n:10F57000C01BD10B80918F01811166C0D695C795B4\r\n:10F58000680180918A01E82EF12C7D2C682E5F2C79\r\n:10F5900010E02097C9F18091F2009091F300892B3F\r\n:10F5A000A9F021974091F1005091F100C701B601F7\r\n:10F5B000B9D11F5F4601570182E0880E911CA11C42\r\n:10F5C000B11C75016401103871F40FC08091E8001E\r\n:10F5D0008B7F8093E8008091E80082FDE2CF8EB3BC\r\n:10F5E0008111F9CF1DC12097A1F6602F772D862DAF\r\n:10F5F000952D78D1209769F2C501B40153D1082D1A\r\n:10F60000792C6A2C5B2CC4CF809186019091870164\r\n:10F61000909389018093880127C08091F200909196\r\n:10F62000F300892BA1F021976091F100809188016E\r\n:10F630009091890125D4809188019091890101964A\r\n:10F640009093890180938801209739F70DC08091AC\r\n:10F65000E8008B7F8093E8008091E80082FDE3CF93\r\n:10F660008EB38111F9CFDCC080E142DD8091E800EA\r\n:10F670008B7F8DC08EB3882309F4D2C08091E800BF\r\n:10F6800080FFF8CF80910001893091F08A3059F4E1\r\n:10F6900080918F01813039F49091880180918901A6\r\n:10F6A0009093F10002C080918D018093F1006CC0B5\r\n:10F6B0002091880130918901C0918601D091870104\r\n:10F6C0002196C21BD30B80918F01811131C0D69539\r\n:10F6D000C795C90120918A01A22FB0E02197F8F0C7\r\n:10F6E0002091F2003091F3002032310559F0FC01F5\r\n:10F6F000259134912093F1003093F1000296A11DE1\r\n:10F70000B11DECCF2091E8002E7F2093E8002091DE\r\n:10F71000E80020FDECCF2EB32111F9CF81C08091FC\r\n:10F72000860190918701909389018093880129C077\r\n:10F73000823039F5209729F18091F2009091F30001\r\n:10F74000809791F0809188019091890191D3809365\r\n:10F75000F10080918801909189010196909389012F\r\n:10F76000809388012197E6CF8091E8008E7F809377\r\n:10F77000E8008091E80080FDE5CF8EB38111F9CFDC\r\n:10F780004FC082E0809300018091E8008E7F8093DB\r\n:10F79000E80036C08091E800877F8093E800809180\r\n:10F7A000E80080FD04C08EB38111F9CF39C080918B\r\n:10F7B00096018093F1001092F1001092F1001092E6\r\n:10F7C000F100809100018093F1001092F100DCCFF4\r\n:10F7D0008091E800877F8093E8001092960110C026\r\n:10F7E0008091E800877F8093E8008091E80080FDA9\r\n:10F7F00004C08EB38111F9CF13C08091000155CFA1\r\n:10F80000DF91CF911F910F91FF90EF90DF90CF90FC\r\n:10F81000BF90AF909F908F907F906F905F901EC130\r\n:10F82000DF91CF911F910F91FF90EF90DF90CF90DC\r\n:10F83000BF90AF909F908F907F906F905F90089552\r\n:10F84000292F30E02230310559F02330310569F09D\r\n:10F8500021303105F9F482E190E024E731E01EC067\r\n:10F860008BE190E029E531E019C0882349F081302F\r\n:10F8700061F0823079F48AE390E025E031E00EC057\r\n:10F8800084E090E025E531E009C082E190E021E4E8\r\n:10F8900031E004C080E090E020E030E0FA01318304\r\n:10F8A00020830895611520EF72078105910510F4FA\r\n:10F8B00021E0611120E020FF14C02FB7F89407B6B3\r\n:10F8C00000FCFDCFF999FECF33E0FB0130935700E8\r\n:10F8D000E89507B600FCFDCF91E190935700E895BD\r\n:10F8E0002FBF0895611520EF72078105910510F46F\r\n:10F8F00021E0611120E020FF14C02FB7F89407B673\r\n:10F9000000FCFDCFF999FECF35E0FB0130935700A5\r\n:10F91000E89507B600FCFDCF91E190935700E8957C\r\n:10F920002FBF089507B600FCFDCFF999FECF21E067\r\n:10F93000FB010A0120935700E8951124089521E264\r\n:10F94000FC01209357008491089529E0FC01209345\r\n:10F95000570084910895E1E0F0E089E0809357003A\r\n:10F96000849108959FB7F89407B600FCFDCFF999EC\r\n:10F97000FECF809529E0E1E0F0E0082E20935700CB\r\n:10F98000E8959FBF08952091A1013091A20126170B\r\n:10F99000370748F06115710539F42091E8002E7F92\r\n:10F9A0002093E80001C0B901FC0120E06115710558\r\n:10F9B00061F18EB38823D9F18530D9F18091E800C7\r\n:10F9C00083FD39C08091E80082FD2BC08091E80062\r\n:10F9D00080FFECCF8091F2009091F30061157105EA\r\n:10F9E00051F08032910538F421912093F10061505B\r\n:10F9F00071090196F3CF21E0809709F020E0809112\r\n:10FA0000E8008E7F8093E800D1CF2111D2CF09C0CA\r\n:10FA10008EB3882361F0853061F08091E80083FD2A\r\n:10FA20000AC08091E80082FFF3CF80E0089582E071\r\n:10FA3000089583E0089581E00895EBEEF0E0808181\r\n:10FA400081608083EDEEF0E010826093EC004083F3\r\n:10FA50008091EE00881F8827881F089580919B0160\r\n:10FA600087FF0FC08091E80082FD04C08EB3811132\r\n:10FA7000F9CF10C08091E8008B7F0AC08EB3882335\r\n:10FA800049F08091E80080FFF9CF8091E8008E7FF7\r\n:10FA90008093E800089565D06CD0E0EEF0E08081BE\r\n:10FAA00081608083E8EDF0E080818F77808319BCEE\r\n:10FAB000A7EDB0E08C918E7F8C9380818F7E8083C8\r\n:10FAC00010929A0108950F931F93CF93DF9349D01B\r\n:10FAD00050D0C8EDD0E088818F7788838881806896\r\n:10FAE000888388818F7D8883E7EDF0E0808180685E\r\n:10FAF000808319BC1EBA1092990100EE10E0F80143\r\n:10FB000080818B7F808388818160888342E260E08E\r\n:10FB100080E093DFE1EEF0E080818E7F8083E2EE93\r\n:10FB2000F0E0808181608083808188608083F8013B\r\n:10FB300080818E7F8083888180618883DF91CF91EF\r\n:10FB40001F910F910895E8EDF0E080818F7E808312\r\n:10FB5000E7EDF0E080818160808381E080939A010D\r\n:10FB6000B2CFE8EDF0E080818C7F80831092E200DC\r\n:10FB700008951092DA001092E10008951F920F92FA\r\n:10FB80000FB60F9211242F933F934F935F936F9370\r\n:10FB90007F938F939F93AF93BF93EF93FF93809146\r\n:10FBA000DA0080FF1BC08091D80080FF17C08091D1\r\n:10FBB000DA008E7F8093DA008091D90080FF0BC03D\r\n:10FBC00088E189BD8AE189BD09B400FEFDCF81E0ED\r\n:10FBD0008EBB45D103C019BC1EBA41D18091E10052\r\n:10FBE00080FF17C08091E20080FF13C08091E20087\r\n:10FBF0008E7F8093E2008091E20080618093E2003A\r\n:10FC00008091D80080628093D80019BC85E08EBBBB\r\n:10FC100026D18091E10084FF2EC08091E20084FF14\r\n:10FC20002AC088E189BD8AE189BD09B400FEFDCF03\r\n:10FC30008091D8008F7D8093D8008091E1008F7EE5\r\n:10FC40008093E1008091E2008F7E8093E2008091BA\r\n:10FC5000E20081608093E20080919901882311F095\r\n:10FC600084E007C08091E30087FD02C081E001C00D\r\n:10FC700083E08EBBF4D08091E10083FF21C08091AE\r\n:10FC8000E20083FF1DC08091E100877F8093E10047\r\n:10FC900082E08EBB109299018091E1008E7F80936B\r\n:10FCA000E1008091E2008E7F8093E2008091E2008B\r\n:10FCB00080618093E20042E260E080E0BEDECFD06F\r\n:10FCC000FF91EF91BF91AF919F918F917F916F9134\r\n:10FCD0005F914F913F912F910F900FBE0F901F900A\r\n:10FCE00018951F93CF93DF9300D0CDB7DEB7EBE924\r\n:10FCF000F1E08091F100819381E0E33AF807C9F7E0\r\n:10FD00009CDB8091E80083FF96C080919B019091DD\r\n:10FD10009C019630E1F128F4992351F09530B1F02F\r\n:10FD20008AC0983009F455C0993009F464C083C082\r\n:10FD30008D7F803809F07FC08091E800877F8093B5\r\n:10FD4000E8001092F1001092F1004EC0811173C0D2\r\n:10FD500010919D011F778091E3008078812B809323\r\n:10FD6000E3008091E800877F8093E80077DE809150\r\n:10FD7000E80080FFFCCF8091E30080688093E3007F\r\n:10FD8000111102C082E001C083E08EBB54C08058D4\r\n:10FD9000823008F050C060919F017091A001AE01C7\r\n:10FDA0004F5F5F4F80919D0190919E0149DDBC01A5\r\n:10FDB000892B09F440C09091E800977F9093E80068\r\n:10FDC00089819A81E0DD8091E8008B7F8093E80053\r\n:10FDD00032C0803881F58091E800877F8093E80009\r\n:10FDE000809199018093F1008091E8008E7F80934B\r\n:10FDF000E80034DE20C081111EC080919D019091E9\r\n:10FE00009E0199270297BCF48091E800877F809338\r\n:10FE1000E80080919D018093990120DE80919901F5\r\n:10FE2000811106C08091E30087FD02C081E001C01E\r\n:10FE300084E08EBB14D08091E80083FF0AC08091DB\r\n:10FE4000E800877F8093E8008091EB0080628093D8\r\n:10FE5000EB000F900F90DF91CF911F9108950895BF\r\n:10FE60008EB3882321F08091E80083FD3ACF089576\r\n:10FE7000F999FECF92BD81BDF89A992780B5089572\r\n:10FE8000262FF999FECF92BD81BDF89A019700B453\r\n:10FE9000021639F01FBA20BD0FB6F894FA9AF99AF3\r\n:08FEA0000FBE0895F894FFCF96\r\n:10FEA800020120DCFB3A03730079007300740065DB\r\n:10FEB800006D00370036002F006C00610075006E81\r\n:10FEC80000630068005F003200200042006F006F8E\r\n:10FED8000074006C006F006100640065007200002F\r\n:10FEE800001203530079007300740065006D003739\r\n:10FEF80000360000000403090409021B0001010088\r\n:10FF080080320904000000FE0102000921030000FC\r\n:10FF1800000C10011201100100000020EB03F92F62\r\n:06FF2800000001020001CF\r\n:10FFA00081CCA0CCBFCCCBCCD0CCD5CCDBCC0895F5\r\n:08FFB0000895089508950895D5\r\n:10FFE000DFCFDFCFDFCFDFCFDFCFDFCFDFCFDFCFA1\r\n:08FFF000DFCFDFCFDFCFDFCF51\r\n:08FFF80000F0000010DFFBDC4B\r\n:040000030000F00009\r\n:00000001FF\r\n"
  },
  {
    "path": "data/system76_launch_heavy_1_default.hex",
    "content": ":100000000C94AA040C94F1040C94F1040C94F104E3\r\n:100010000C94F1040C94F1040C94F1040C94F1048C\r\n:100020000C94F1040C94F1040C943F2E0C94F32CDA\r\n:100030000C94811B0C94F1040C94F1040C94F104C5\r\n:100040000C94F1040C94F1040C94F1040C94F1045C\r\n:100050000C94F1040C944F1B0C94F1040C94F104D7\r\n:100060000C94F1040C94F1040C94F1040C94F1043C\r\n:100070000C94F1040C94F1040C94F1040C94F1042C\r\n:100080000C94F1040C94F1040C94F1040C94F1041C\r\n:100090000C94F1040C94F1044F0858088308C0082C\r\n:1000A000FE0840098309860989098C098F0992098C\r\n:1000B000950998099B099E09A309A609A909AE09F2\r\n:1000C000B309B609B909BE09FA09360A390A3E0A5E\r\n:1000D000490A4C0A570A5A0A650A680A730A760AD4\r\n:1000E000810A870AF70A3C0B3C0C420C470CE60DD0\r\n:1000F000E60D500CE60DE60D5A0C6B0C950CB40C8D\r\n:10010000D50C070D360D5E0D910D890DDC0D5C18BB\r\n:100110005C1896189618E9188C1A8C1A8C1A0519FE\r\n:10012000E319F419F4193B1D3B1D4E1D4E1D441DD2\r\n:100130004E1D4E1D4E1D3B1D3B1D491D4E1D4E1D92\r\n:10014000491DD824FF24A326FF24A3264B256E2572\r\n:10015000A3266026702629003A003B003C003D00A3\r\n:100160003E003F0040004100420043004400450083\r\n:100170004C0035001E001F0020002100220023003B\r\n:1001800024002500260027002D002E002A002B0029\r\n:1001900014001A000800150017001C0018000C00BD\r\n:1001A000120013002F003000310039000400160047\r\n:1001B000070009000A000B000D000E000F003300BD\r\n:1001C000340028004A00E1001D001B000600190051\r\n:1001D000050011001000360037003800E50052001D\r\n:1001E0004B00E000E2000151E3002C004D002C0028\r\n:1001F000E400E6000151500051004F004E000000A5\r\n:1002000000000000AB00AE00AC00000000000000E9\r\n:100210000000000000004600000000000000000098\r\n:1002200056005500540000000000000000000000CF\r\n:1002300000005300000000000000000057006100B3\r\n:1002400060000000000000000000000000005F00EF\r\n:10025000000000000000000000005E005D000000E3\r\n:10026000000000000000000000005C000000000032\r\n:100270000000000058005B005A0000000000000071\r\n:100280000000000000005900000000000000000015\r\n:1002900000006300000000000000000000000000FB\r\n:1002A000000062000000005C01000100010001008C\r\n:1002B0000100010001000100010001000100010036\r\n:1002C0000100010001000100010001000100010026\r\n:1002D000010001000100C35CCB5CCA5C0100460068\r\n:1002E000010001000100010001004A004E004B0026\r\n:1002F0004D000100010001000100010001000100AA\r\n:100300000100010001005000510052004F000100A7\r\n:1003100001000100AE000100010001000100010028\r\n:1003200001000100010001000100010001004B007B\r\n:10033000A90001000100010001000100A800010066\r\n:100340000100010001004A004E004D00AA0000001B\r\n:10035000000000000100010001000000000000009A\r\n:10036000000000000000010000000000000000008C\r\n:10037000010001000100000000000000000000007A\r\n:10038000000001000000000000000000010001006A\r\n:10039000010000000000000000000000000001005B\r\n:1003A000000000000000000000000100010000004B\r\n:1003B000000000000000000000000100000000003C\r\n:1003C000000000000100010001000000000000002A\r\n:1003D000000000000000010000000000000000001C\r\n:1003E000000001000000000000000000000000000C\r\n:1003F00000000100000001000100010001000100F7\r\n:1004000001000100010001000100010001000100E4\r\n:1004100001000100010001000100010001000100D4\r\n:1004200001000100010001000100010001000100C4\r\n:1004300001000100010001000100010001000100B4\r\n:1004400001000100010001000100010001000100A4\r\n:100450000100010001000100010001000100010094\r\n:100460000100010001000100010001000100010084\r\n:100470000100010001000100010001000100010074\r\n:100480000100010001000100010001000100010064\r\n:100490000100010001000100010001000100000055\r\n:1004A0000000000001000100010000000000000049\r\n:1004B000000000000000010000000000000000003B\r\n:1004C0000100010001000000000000000000000029\r\n:1004D0000000010000000000000000000100010019\r\n:1004E000010000000000000000000000000001000A\r\n:1004F00000000000000000000000010001000000FA\r\n:1005000000000000000000000000010000000000EA\r\n:1005100000000000010001000100000000000000D8\r\n:1005200000000000000001000000000000000000CA\r\n:1005300000000100000000000000000000000000BA\r\n:1005400000000100000001000100010001000100A5\r\n:100550000100010001000100010001000100010093\r\n:100560000100010001000100010001000100010083\r\n:100570000100010001000100010001000100010073\r\n:100580000100010001000100010001000100010063\r\n:100590000100010001000100010001000100010053\r\n:1005A0000100010001000100010001000100010043\r\n:1005B0000100010001000100010001000100010033\r\n:1005C0000100010001000100010001000100010023\r\n:1005D0000100010001000100010001000100010013\r\n:1005E0000100010001000100010001000100000004\r\n:1005F00000000000010001000100000000000000F8\r\n:1006000000000000000001000000000000000000E9\r\n:1006100001000100010000000000000000000000D7\r\n:1006200000000100000000000000000001000100C7\r\n:1006300001000000000000000000000000000100B8\r\n:1006400000000000000000000000010001000000A8\r\n:100650000000000000000000000001000000000099\r\n:100660000000000001000100010000000000000087\r\n:100670000000000000000100000000000000000079\r\n:100680000000010000000000000000000000000069\r\n:1006900000000100000005010980A1018503190186\r\n:1006A0002AB700150126B700950175108100C00515\r\n:1006B0000C0901A101850419012AA002150126A037\r\n:1006C00002950175108100C005010906A10185058B\r\n:1006D000050719E029E71500250195087501810234\r\n:1006E0000507190029EF1500250195F07501810214\r\n:1006F00005081901290595057501910295017503F4\r\n:100700009101C00660FF0961A1010962150026FF81\r\n:10071000009520750881020963150026FF009520C9\r\n:1007200075089102C005010906A101050719E02914\r\n:10073000E71500250195087501810295017508816D\r\n:10074000010507190029FF150026FF009506750809\r\n:10075000810005081901290595057501910295018A\r\n:1007600075039101C009025B00030100A0FA0904AE\r\n:1007700000000103010100092111010001224000D4\r\n:100780000705810308000A090401000203000000B4\r\n:100790000921110100012222000705820320000126\r\n:1007A0000705030320000109040200010300000003\r\n:1007B000092111010001226D000705840320000AB0\r\n:1007C000120110010000000884330700010001023B\r\n:1007D000000168034C00610075006E006300680052\r\n:1007E0002000480065006100760079002000430089\r\n:1007F0006F006E006600690067007500720061009E\r\n:1008000062006C00650020004B006500790062000A\r\n:100810006F00610072006400200028006C0061001D\r\n:1008200075006E00630068005F006800650061008D\r\n:10083000760079005F0031002900000012035300A8\r\n:1008400079007300740065006D0037003600000009\r\n:100850000403090400010101010101010101020277\r\n:10086000020202020202020303030303030303045E\r\n:100870000404040404040505050505060606060629\r\n:10088000070707070708080808090909090A0A0AE3\r\n:100890000B0B0B0C0C0C0D0D0D0E0E0E0F0F0F1085\r\n:1008A000101111111212131314141515161617170F\r\n:1008B000181819191A1A1B1B1C1D1D1E1E1F20207B\r\n:1008C000212222232424252626272829292A2B2CC5\r\n:1008D0002D2D2E2F30313232333435363738393AE8\r\n:1008E0003B3C3D3E3F404142434445464748494AE0\r\n:1008F0004C4D4E4F50515354555658595A5B5D5EAE\r\n:100900005F616264656668696B6C6D6F7072737548\r\n:1009100077787A7B7D7E8082838587888A8C8E8FAC\r\n:1009200091939596989A9C9EA0A2A3A5A7A9ABADDA\r\n:10093000AFB1B3B5B7BABCBEC0C2C4C6C9CBCDCFC8\r\n:10094000D1D4D6D8DBDDDFE2E4E7E9EBEEF0F3F576\r\n:10095000F8FAFDFF11241FBECFEFD0E1DEBFCDBFFF\r\n:1009600004B603FE27C08091990890919A08A0913F\r\n:100970009B08B0919C088730904BA740B04BD1F4B6\r\n:100980001092990810929A0810929B0810929C0855\r\n:1009900014BE84B7877F84BF0FB6F894A895809162\r\n:1009A0006000886180936000109260000FBEE0E0FC\r\n:1009B000F8E7099513E0A0E0B1E0EAEEF3E602C043\r\n:1009C00005900D92A03FB107D9F728E0A0EFB3E062\r\n:1009D00001C01D92A939B207E1F70E94F3040C94FB\r\n:1009E000F3310C940000CF93DF93CDB7DEB7AB9714\r\n:1009F0000FB6F894DEBF0FBECDBF84B7877F84BF2C\r\n:100A00000FB6F894A895809160008861809360008B\r\n:100A1000109260000FBE91E080E80FB6F8948093CA\r\n:100A20006100909361000FBE85B7806885BF85B770\r\n:100A3000806885BF82ED9AE19093F1038093F00383\r\n:100A40000E94372D0E94DD2D8091E200846080930A\r\n:100A5000E200789480911B078823A1F01091E900AF\r\n:100A60001F709091EC00892F817090FD80E8182B09\r\n:100A70001092E9008091E80083FD0E94F4231F702A\r\n:100A80001093E90082E084BD93E095BD9DE797BD9A\r\n:100A900080936E0005E811E041E9C42E41E0D42EB8\r\n:100AA000D8018D918D010E94670EC016D106C1F745\r\n:100AB00001E911E03FE9C32E31E0D32EF801819125\r\n:100AC0008F010E94670EC016D106C1F7E2EFF3E076\r\n:100AD0008AE094E0AAECB4E0119211921D921D926A\r\n:100AE0008E179F07C9F780E090E00E9410318B3E7F\r\n:100AF0009E4F11F00E94181C10922507EEE3F7E0BC\r\n:100B00008EE497E02FEF3FEF219331938E179F07ED\r\n:100B1000D9F710920F04E8E2F4E088E394E02FEFB5\r\n:100B20003FEF219331938E179F07D9F780E090E034\r\n:100B30000E9410318B3E9E4F21F00E94181C0E9493\r\n:100B4000602B45E050E06CE170E082E597E00E94A8\r\n:100B5000F830809152078C7F11F40E94602B0E9424\r\n:100B6000DE138FE097E20197F1F700C00000AFE0DD\r\n:100B7000B7E21197F1F700C000000E94DE138091E8\r\n:100B8000CA0480FF14C06FEF7FEF80E490E00E9402\r\n:100B900044316FEF82E490E00E9426316FEF7FEFE7\r\n:100BA00080E090E00E9444310E94F61402C00E944E\r\n:100BB000281380E490E00E9410318C3E964739F46F\r\n:100BC00082E490E00E94083191E0823009F090E0E8\r\n:100BD00090FD3AC000E010E0680120EBC21A2EEF51\r\n:100BE000D20A4801ECE18E0E911CF801EA5AFE4F40\r\n:100BF000A590B4906B2DC8018D5B9F4F0E9426314C\r\n:100C00006A2DC8018C5B9F4F0E9426310E5F1F4FDB\r\n:100C10008016910651F78401C814D90411F7860192\r\n:100C2000F0E4CF16F5E0DF06B9F681E00E94551535\r\n:100C30006CEE76E780E490E00E94443162E082E46A\r\n:100C400090E00E94263103C080E00E94551560911B\r\n:100C50001E0670911F0680912006909121060E9429\r\n:100C6000291580E090E00E9410318B3E9E4F11F0DC\r\n:100C70000E94181C82E090E00E9408318093B10429\r\n:100C80000E94071C90930B0480930A0483E090E079\r\n:100C90000E940831682F70E080E090E00E941E1EE4\r\n:100CA00060911E0670911F0680912006909121068A\r\n:100CB0000E94291560910A04606860930A041091EB\r\n:100CC0000B0484E090E00E942631612F81E290E0E5\r\n:100CD0000E9426318BE191E090930D0480930C04E7\r\n:100CE00022242394312C80911B07853009F054C0B5\r\n:100CF00080E4E82EDD24D39498E1F92E1AE1809166\r\n:100D00001B07853009F042C080911B07843051F1E8\r\n:100D100040E060E080E00E945C2BD092AF04109233\r\n:100D20000E0468E170E00FB6F894A8956093600037\r\n:100D30000FBEE092600083B7817F846083BF83B77A\r\n:100D4000816083BF7894889583B78E7F83BF0FB609\r\n:100D5000F894A8958091600088618093600010925B\r\n:100D600060000FBE80911A07882309F4C8CF0E9443\r\n:100D7000DE13EAECF4E081919191892B09F04DC7E3\r\n:100D800082EE94E08E179F07B1F7B9CF0E944D20F5\r\n:100D90000E94812A1092AF040E94DE13882359F02A\r\n:100DA0008FB7F8944091AB045091AC046091AD04BE\r\n:100DB0007091AE048FBFA2EBB4E0EAECF4E0E12C5A\r\n:100DC000F12C4E2DA190B1908D919D918A259B255E\r\n:100DD000009709F4AEC010E0CC24C394D12C9C0140\r\n:100DE0002C213D21232B09F49EC019A34AA3AC203A\r\n:100DF000BD2081E0A114B10409F480E08BA30E941E\r\n:100E0000751B8160782F9DA38CA349A15AA16BA16A\r\n:100E10008DA10E94B729F701EE0FFF1FEE54FB4F83\r\n:100E200080819181C826D926D182C082AB2881F0E9\r\n:100E30008EE08E9DF0018F9DF00D1124ED52FE4F3E\r\n:100E4000E10FF11D80818F3F19F08BA711E001C0E8\r\n:100E500010E0B0900F04E12EF12CC7018B0D911D15\r\n:100E60000997A4F188E090E06C01CE18DF08B70183\r\n:100E70006F5F7F4F615F7B4FA60180E194E00E942E\r\n:100E8000DB31B701675F7F4F615F7B4FA60188E170\r\n:100E900094E00E94DB31A601440F551FB701660F95\r\n:100EA000771F675E7F4F615F7B4F88E294E00E940F\r\n:100EB000DB31B7016F5E7F4F615F7B4FA60180E240\r\n:100EC00094E00E94DB31BA94B0920F0480910F0439\r\n:100ED00090E0EBA5AE2FB0E09D01220F331F255807\r\n:100EE0003D4FAA0FBB1FBD0164587D4F41E0480F25\r\n:100EF0009117B0F490E0FC01E15FFB4FD9015C91E8\r\n:100F00005183DB015C915187BBA5B18B880F991F81\r\n:100F1000FC01E15FFB4F128E118E91E0842FE6CF32\r\n:100F200080930F041EC01F5FCC0CDD1C1E3009F027\r\n:100F300056CF2FEFE21AF20A3CE0E316F10409F073\r\n:100F400040CF8FEF8EA38FA318A60E94751B8160E0\r\n:100F5000782F9AA789A74EA15FA168A58AA50E94AC\r\n:100F6000B729409138045091390460913A04709146\r\n:100F70003B042FB7F8948091AB049091AC04A091FE\r\n:100F8000AD04B091AE042FBF841B950BA60BB70B1D\r\n:100F90002FB7F894C090AB04D090AC04E090AD04AF\r\n:100FA000F090AE042FBFC0923804D0923904E09282\r\n:100FB0003A04F0923B0460910F04EFE0F4E0462F16\r\n:100FC00050E088248A94982CA12CB12C881A990A74\r\n:100FD000AA0ABB0A651799F0218D328D2901612C6F\r\n:100FE000712C84149504A604B70410F4415004C075\r\n:100FF000280F391F328F218F5F5F3296EBCF4093DE\r\n:101000000F048091AF04811108C010915207812F05\r\n:10101000837019F01695169501C010E080910601B5\r\n:101020008130E9F038F0823009F4A7C3833009F445\r\n:10103000B1C3CDC310924901C0924E07D0924F0761\r\n:10104000E0925007F092510789E2EFE0F4E0A5E268\r\n:10105000B7E001900D928A95E1F781E098C3809105\r\n:10106000050118130DC020915207237030E0409104\r\n:10107000040150E081E02417350719F480E001C035\r\n:1010800081E0817080934B01412F50E0483251053F\r\n:1010900008F061C3FA01E45BFF4F0C94D53188235B\r\n:1010A00009F459C340E060E080E00E945C2B53C328\r\n:1010B000F090490185E1F89EF02C112405E10F0D17\r\n:1010C0000A3608F009E66091530770915407809141\r\n:1010D00055070E94FB2BD62EC72EB82EF01608F00F\r\n:1010E00037C3EF2DF0E0DF01A35BBC4F8C919091F3\r\n:1010F0004A01982331F02B2D4D2D6C2DCF010E94EC\r\n:101100005E2BF394EBCFF090490185E1F89EF02C33\r\n:10111000112405E10F0D0A3608F009E6C0905407C6\r\n:10112000D0905507B09053076B2D7C2D8D2D0E94CC\r\n:10113000FB2BA62E972E882E609156076B0D7C2DCB\r\n:101140008D2D0E94FB2BD62EC72EB82EF01608F040\r\n:10115000FFC28F2D90E0FC01E35BFC4F30812091BA\r\n:101160004A01232359F030FF04C02B2D4D2D6C2D47\r\n:1011700003C0282D4A2D692D0E945E2BF394E6CFE3\r\n:10118000D090490185E1D89ED02C112405E10D0DA8\r\n:101190000A3608F009E6A090540790905507209170\r\n:1011A000560730E4B32E5B2D529F512D1124B52EDE\r\n:1011B000D01608F0CDC2ED2CF12CF701E35BFC4F0B\r\n:1011C000908180914A018923B9F0F701EE0FFF1F4A\r\n:1011D000E458FD4F808182958F70609153078B9DFD\r\n:1011E000600D11247A2D892D0E94FB2B462F282F6C\r\n:1011F000672FC7010E945E2BD394DACFD0904901AC\r\n:1012000085E1D89ED02C112405E10D0D0A3608F099\r\n:1012100009E6A0905407909055072091560780E466\r\n:10122000B82E6B2D629F612D1124B62ED01608F0BA\r\n:101230008FC2ED2CF12CF701E35BFC4F9081809184\r\n:101240004A018923D9F0F701EE0FFF1FE558FD4F42\r\n:101250006081B69EB0011124B5E075956795BA9589\r\n:10126000E1F780915307680F7A2D892D0E94FB2B9F\r\n:10127000462F282F672FC7010E945E2BD394D6CF0D\r\n:10128000F090490185E1F89EF02C112405E10F0D45\r\n:101290000A3608F009E6C0905307D0905407B09082\r\n:1012A00055076091560766956695669580914E073D\r\n:1012B00090914F070E94F12B0E94762B805887FD5A\r\n:1012C0008195880F782F2B2D729F712D1124872FD8\r\n:1012D000B6010E94FB2BD62EC72EB82EF01608F0B2\r\n:1012E00037C2EF2DF0E0DF01A35BBC4F8C919091F2\r\n:1012F0004A01982331F02B2D4D2D6C2DCF010E94EA\r\n:101300005E2BF394EBCF8FE998E21AC083E798E263\r\n:1013100017C088E799E21FC089E599E21CC08EE3F7\r\n:1013200099E21EC082E299E21BC081E798E208C000\r\n:1013300088E698E205C08FE598E202C084E498E26E\r\n:101340000E941A2209C285E398E20AC088EC9BE257\r\n:1013500002C081E199E20E94BE21FEC18DEF98E2B8\r\n:101360000E944221F9C187E098E205C085ED97E22D\r\n:1013700002C087E997E20E946422EEC181111EC07B\r\n:101380006091560720E1620F08F46FEF80914E07DD\r\n:1013900090914F070E94F12B6AE070E00E94AD31FE\r\n:1013A000892B09F0D8C10E94E83069E670E00E94FC\r\n:1013B000C13160914A010E948B2CCDC180914901BD\r\n:1013C00095E1899F802D112405E1080F0A3608F068\r\n:1013D00009E6E82EF12CC02ED12CEC14FD040CF003\r\n:1013E000B7C160914A01C7010E948B2C3FEFE31AFD\r\n:1013F000F30AF3CF81111EC06091560720E1620FFE\r\n:1014000008F46FEF80914E0790914F070E94F12BE7\r\n:1014100065E070E00E94AD31892B09F09CC10E940B\r\n:10142000E83069E670E00E94C13160914A010E9493\r\n:10143000D12C91C18091490195E1899F802D112482\r\n:1014400005E1080F0A3608F009E6E82EF12CC02E57\r\n:10145000D12CEC14FD040CF07BC160914A01C70152\r\n:101460000E94D12C5FEFE51AF50AF3CF80E997E2ED\r\n:1014700002C08AE897E20E94C5226EC180912507CA\r\n:1014800021E0682F621B08F460E0862F61E777E2B5\r\n:101490003BC061E777E237C08091250721E0782FD4\r\n:1014A000721B08F470E0872F69E377E22DC069E3CF\r\n:1014B00077E229C08091250721E0382F321B08F4FC\r\n:1014C00030E0832F67E077E21FC067E077E21BC060\r\n:1014D0008091250721E0582F521B08F450E0852FFA\r\n:1014E0006FEE76E211C06FEE76E20DC080912507B7\r\n:1014F00021E0682F621B08F460E0862F69ED76E238\r\n:1015000003C069ED76E280E00E94312325C180911D\r\n:10151000A504811125C063ED71E040E050E0942FF7\r\n:101520009295907F20E030E0FB01E20FF31F808175\r\n:10153000893638F4E82FF0E0E45CFB4F892F822BEA\r\n:1015400080832F5F3F4F2E30310571F74F5F5F4F24\r\n:10155000625F7F4F4C30510511F781E08093A50405\r\n:10156000D090490185E1D89ED02C112405E10D0DC4\r\n:101570000A3608F009E660911E0670911F068091F8\r\n:101580002006909121060E94FA0FB82E6091530711\r\n:1015900070915407809155070E94FB2BA62E972E21\r\n:1015A000882ED01608F0D4C0ED2CF12CF701E35BA7\r\n:1015B000FC4F908180914A018923B9F0F701E45CE6\r\n:1015C000FB4F6081462F4F7062956F708B2D0E948C\r\n:1015D000232B029720F420E040E060E003C0282D98\r\n:1015E0004A2D692DC7010E945E2BD394DACF9090CB\r\n:1015F000490185E1989E902C112405E1090D0A36D8\r\n:1016000008F009E6EE24EA94F12C901608F0A0C048\r\n:10161000E92DF0E0DF01A35BBC4F9C9180914A0172\r\n:10162000892341F1DF01AA0FBB1FAE0FBF1FAD51D0\r\n:10163000BB4FAC901196CC90119712968C919091D3\r\n:101640005507A99E50011124C99E60011124899F4C\r\n:10165000C0011124B7010E94AD31262FC501B70189\r\n:101660000E94AD31462FC601B7010E94AD31CF01B6\r\n:101670000E945E2B9394C9CFC090490195E1C99E09\r\n:10168000C02C112405E10C0D0A3608F009E6811181\r\n:1016900006C08091AA048F5F8093AA0404C01092B0\r\n:1016A000AA041092A9048091AA04811147C08091D4\r\n:1016B000A904883029F41092A8041092A9043EC00D\r\n:1016C000A82FB0E0AA0FBB1FA156BE4FEC911196F8\r\n:1016D0009C917EE0E79FF0011124ED52FE4FE90F4F\r\n:1016E000F11D90819F3F21F09093A60491E001C0ED\r\n:1016F00090E09093A8048F5F8093A9041FC0EC2C06\r\n:10170000F12CF701E35BFC4F908180914A01892322\r\n:10171000A1F06091AA046C0D2091A804E6EAF4E01F\r\n:1017200080E77FEF90E092130CC00E94FB2B462FC6\r\n:10173000282F672FC7010E945E2BC394C016F8F2B2\r\n:1017400007C03191C31202C08FEF70E09F5FEBCFF3\r\n:1017500081E0093608F080E0909149019F5F909305\r\n:101760004901811134C082E08093060180914B01D0\r\n:1017700081112DC0112351F02AC0109305018091D1\r\n:1017800052078370809304010E94962983E080931E\r\n:1017900006011DC040914E0750914F0760915007C0\r\n:1017A000709151072FB7F8948091AB049091AC04DD\r\n:1017B000A091AD04B091AE042FBF841B950BA60B76\r\n:1017C000B70B4097A105B10510F0109206010E94D9\r\n:1017D000812A9091B004891721F00E94812A809378\r\n:1017E000B00480911B07843009F07DCA83E08093A8\r\n:1017F000E9008091E80082FF76CA8091E80085FFC9\r\n:1018000023C00E94562D81111DC050E2E52EF12CFF\r\n:10181000CE0101966C0109C08091F100D6018D9333\r\n:101820006D01B1E0EB1AF10869F08091E80085FDE7\r\n:10183000F3CF8091E8008B778093E8000E94562DCB\r\n:10184000882399F391E001C090E08091E8008B77C4\r\n:101850008093E800992309F446CA81E08A83E981EC\r\n:101860008E2F90E0FC013197E331F10508F0AEC115\r\n:10187000EC58FF4F0C94D53186E78B838CEE8C832C\r\n:1018800081E016C14EE150E065E571E004C04EE133\r\n:1018900050E06DE671E0CE0103960E94E43195C1FF\r\n:1018A00080912306882309F491C11A8281E08093F4\r\n:1018B00022068CC18B81843008F088C16C816C3029\r\n:1018C00008F084C14D814E3008F080C10E94232B66\r\n:1018D0008E839F837AC12B81243008F077C19C814D\r\n:1018E0009C3008F073C18D818E3008F06FC11E816D\r\n:1018F0006F8140E551E0249F7001259FF00C112479\r\n:10190000ECE19E9FE00CF11C1124E80EF11CE80EA6\r\n:10191000F11CF3E4EF0EF11CC7010E942631612F88\r\n:10192000C70101960E94263150C180912306811182\r\n:101930004DC18B81803F49F0813F49F0823F49F0A2\r\n:10194000833F09F043C1E3E005C0E0E003C0E1E00C\r\n:1019500001C0E2E025E0E29FF0011124E95FFE4FC3\r\n:1019600083818C8380EBA4C08091230681112EC1DA\r\n:101970008B819C81903B08F090EB803F49F0813F48\r\n:1019800049F0823F49F0833F09F020C1E3E005C000\r\n:10199000E0E003C0E1E001C0E2E035E0E39FF001F8\r\n:1019A0001124E95FFE4F9383A8C080912306811123\r\n:1019B0000DC1EB81E93658F0E03FC1F0E13FC1F0E5\r\n:1019C000E23FC1F0E33F09F001C1E3E014C0F0E001\r\n:1019D000CF01880F991FE80FF91FED51FB4F81814F\r\n:1019E0008C8380818D8382818E83EFC0E0E003C091\r\n:1019F000E1E001C0E2E055E0E59FF0011124E95F7C\r\n:101A0000FE4F81818C8382818D831E82DEC0809116\r\n:101A100023068111DBC0EB818D819C81E93658F072\r\n:101A2000E03FB1F0E13FB1F0E23FB1F0E33F09F058\r\n:101A3000CDC0E3E012C02E81F0E0AF01440F551F8E\r\n:101A4000E40FF51FED51FB4F808391832283BDC0CE\r\n:101A5000E0E003C0E1E001C0E2E065E0E69FF00104\r\n:101A60001124E95FFE4F9183828347C08091230652\r\n:101A70008111ACC0EB81E43008F0A8C02E2F30E01B\r\n:101A800075E0E79FF0011124E95FFE4F9081969584\r\n:101A90009695EFEAF1E0419194130CC08C8385E0B8\r\n:101AA000829FF001839FF00D1124E95FFE4F848136\r\n:101AB0008D838BC08F5F8F3071F788C08091230634\r\n:101AC000811184C0EB81E43008F080C0AC81AF307C\r\n:101AD00008F07CC02D8185E0E89FF0011124E95FCA\r\n:101AE000FE4FB0E0A155BE4F8C91982F990F990FE2\r\n:101AF00080818370892B808324831A8260911E06E3\r\n:101B000070911F0680912006909121060E94291550\r\n:101B10005DC080912306811159C081E00E94551556\r\n:101B200054C08CE08B838EE08C838AECE82E84E0BA\r\n:101B3000F82E1CE0A0E0B4E040E050E0B03258F5F0\r\n:101B4000F70160817181C101042E02C0880F991FC5\r\n:101B50000A94E2F7682379238B2F90E091010A2EF3\r\n:101B600001C0220F0A94EAF7672B51F061E070E0A0\r\n:101B70006C0F7D1F860F971FFC013081232B0AC03D\r\n:101B800061E070E06C0F7D1F860F971F2095FC01B0\r\n:101B9000308123232083AF5FA83010F0BF5FA0E027\r\n:101BA0004F5F5F4F4E30510549F61150F2E0EF0E96\r\n:101BB000F11C1111C1CF09C00E944D2081E09B8111\r\n:101BC000911101C080E08093E2041A8280911B078A\r\n:101BD000843009F088C81091E9001F709091EC00E2\r\n:101BE000892F817090FD80E8182B82E08093E900B6\r\n:101BF0008091E80080FF0DC040E050E060E270E0BE\r\n:101C0000CE0101960E9462208091E8008E77809339\r\n:101C1000E8001F701093E90066C8F9BC19BD09B44B\r\n:101C200000FEFDCF8091D8008F7D8093D8008091F9\r\n:101C3000E00082608093E0008091E00081FDFCCFB5\r\n:101C40000E944D200C947F0690910A0492FF0DC0D3\r\n:101C5000282F2871283019F4877F846006C0282F28\r\n:101C60002471243011F48B7F886093FF0DC0282FDE\r\n:101C70002871283119F4877E846106C0282F2471C9\r\n:101C8000243111F48B7E886120910B0420FF0DC05C\r\n:101C9000382F3871383019F4877F816006C0382FAB\r\n:101CA0003171313011F48E7F886021FF0DC0282FF3\r\n:101CB0002871283119F4877E816106C0282F21718F\r\n:101CC000213111F48E7E886194FD877E0895F89409\r\n:101CD000E82FE295EF70F0E031A1282F2F7081E01E\r\n:101CE00090E001C0880F2A95EAF7982F90959323EA\r\n:101CF00091A392A1892B82A378940895CF93DF9327\r\n:101D00000E944F2BEC018238910559F1A0F48133E8\r\n:101D1000910509F473C040F48932910509F467C054\r\n:101D20008A9709F472C084C08533910509F458C0BC\r\n:101D3000C997B9F07DC0833E910571F138F4803EBA\r\n:101D40009105B1F0823E910511F172C0863E910578\r\n:101D5000B9F1873E9105C9F1843E910509F068C04B\r\n:101D600024C080910A0480FD5DC081FD5BC060C01D\r\n:101D700080910A0480FD50C080910B0480FF36C121\r\n:101D800080910A0484FD30C1C3EED0E02FC1809160\r\n:101D90000A0482FF2BC1F4CF80910A0482FD3FC068\r\n:101DA00080910B0480FD3EC0EBCF80910B0481FF3E\r\n:101DB0001DC180910A0484FD17C1C7EED0E016C191\r\n:101DC00080910A0483FF12C1F4CF80910A0483FD3D\r\n:101DD0002CC080910B0481FFECCFC4EED0E006C193\r\n:101DE00080910A0485FF02C1C9E2D0E0FFC0809162\r\n:101DF0000A0485FFFBC0C5E3D0E0F8C080910A0467\r\n:101E000086FFF4C0CAE2D0E0F1C080910A0486FFE8\r\n:101E1000EDC0C1E3D0E0EAC0C9E3D0E0E7C0C2EE64\r\n:101E2000D0E0E4C0C0EED0E0E1C0C6EED0E0DEC05D\r\n:101E3000C11582E5D80708F066C0C11591E5D9073C\r\n:101E400028F0DC2FCC27C16FD06AD0C0C83ED105A6\r\n:101E500060F5C03ED10508F0C9C0C83AD105B0F45C\r\n:101E6000C53AD10540F0C55AD0E0C254DC4FC88114\r\n:101E7000D0E0D064BBC0C130D10509F4B7C008F4CC\r\n:101E8000B3C0C430D10508F4AFC0B0C0CF3BD1055A\r\n:101E900008F0AAC0C85AD0E0CC0FDD1FCF53DC4FEA\r\n:101EA0000990D881C02DD464A1C0C11520E5D20706\r\n:101EB000E0F0CE0174E0969587957A95E1F783700E\r\n:101EC0009C2F937021E030E002C0220F331F9A95BF\r\n:101ED000E2F73C68382BCF70C695C69580E2C89F64\r\n:101EE000E0011124C22BD32B81C0C11580E4D80797\r\n:101EF00018F0DF70D06A7AC0CE019A9581159F41A3\r\n:101F000008F474C071C0C11586E5D807F0F5C11595\r\n:101F100095E5D90750F08C2F0E94240E8F71C82FA1\r\n:101F2000D0E0DC2FCC27D06261C0C11524E5D207F8\r\n:101F300028F0DC2FCC27C46FD06A58C09E012370D4\r\n:101F400033278C2F86958695C115D34578F4C1E04B\r\n:101F5000D0E002C0CC0FDD1F2A95E2F720E2829F7D\r\n:101F6000C0011124C82BD92BDC6840C0C1E0D0E0EF\r\n:101F700002C0CC0FDD1F2A95E2F720E2829FC0014C\r\n:101F80001124C82BD92BDA6831C0C1152AE5D20734\r\n:101F9000E8F4C11589E5D80780F08C2F8F700E9476\r\n:101FA000240E94E0D695C7959A95E1F7CF70D0E0CE\r\n:101FB000DC2FCC27D069C82B19C0C11598E5D907EB\r\n:101FC00098F0DC2FCC27C06FD06A10C0CE0190569D\r\n:101FD0008115904248F48D2F8F710E94240EDD27C9\r\n:101FE000D0628F71D82B02C0C0E0D0E0CE01DF916B\r\n:101FF000CF910895CF92DF92EF92FF926C01EE2481\r\n:10200000FF24C114D104E104F10421F0C701B60199\r\n:1020100020E101C020E0C72ED82EE92EFF24C114F4\r\n:10202000D104E104F10419F0285FC701B6016B0186\r\n:102030007C0154E0F694E794D794C7945A95D1F76D\r\n:10204000C114D104E104F10419F02C5FC701B601F9\r\n:102050006B017C0142E0F694E794D794C7944A95CB\r\n:10206000D1F7C114D104E104F10419F02E5FC701C6\r\n:10207000B601DC01CB01B695A79597958795892B7D\r\n:102080008A2B8B2B09F02F5F822FFF90EF90DF9030\r\n:10209000CF900895882311F084EC01C084E88093E8\r\n:1020A000BC0080E49FE1A0E0B0E02091BC0027FDEF\r\n:1020B00008C00097A105B10561F00197A109B10918\r\n:1020C000F4CF892B8A2B8B2B21F08091BB0090E0E1\r\n:1020D00008958FEF9FEF0895DB01FC0120E030E0D1\r\n:1020E00084E82A173B071CF591919093BB008093DD\r\n:1020F000BC0040E45FE160E070E09091BC0097FDBF\r\n:102100000AC0411551056105710599F04150510909\r\n:1021100061097109F2CF452B462B472B51F0909165\r\n:10212000B900987F983229F42F5F3F4FDACFC90169\r\n:1021300008958FEF9FEF089584E98093BC0080910C\r\n:10214000BC0084FDFCCF0895262F94EA9093BC0038\r\n:1021500040E45FE160E070E09091BC0097FD0AC050\r\n:10216000411551056105710549F041505109610959\r\n:102170007109F2CF452B462B472B19F48FEF9FEFB8\r\n:1021800008959091B900987F983011F09031B1F78F\r\n:10219000682F660F622B6093BB0084E88093BC00BD\r\n:1021A00080E49FE1A0E0B0E02091BC0027FD08C0E2\r\n:1021B0000097A105B10511F30197A109B109F4CF69\r\n:1021C000892B8A2B8B2BD1F28091B900887F8831A3\r\n:1021D00011F0803499F680E090E00895FF920F931B\r\n:1021E0001F93CF93DF931F92CDB7DEB78B01FC0116\r\n:1021F000F1808DE1898360E08F2D0E94A41097FD0E\r\n:102200001AC061E070E0CE0101960E946C1097FD4B\r\n:1022100012C061E08F2D0E94A41097FD0CC080E0D9\r\n:102220000E944A1097FD07C0F80180830E949C100D\r\n:1022300021E090E001C0282F822F0F90DF91CF91F5\r\n:102240001F910F91FF9008950F931F93CF93DF93EA\r\n:10225000EB018A0160E00E94A41097FD09C0B8015B\r\n:10226000CE010E946C10EC0197FF0E949C10CE01E1\r\n:10227000DF91CF911F910F910895CF93DF9300D0FD\r\n:102280001F92CDB7DEB720914C0130914D014091A6\r\n:102290004E0129833A834B8343E050E0BE016F5FD8\r\n:1022A0007F4FFC0180810E9424110F900F900F90AE\r\n:1022B000DF91CF9108958F929F92AF92BF92CF926C\r\n:1022C000DF92EF92FF920F931F93CF93DF93CDB7DF\r\n:1022D000DEB729970FB6F894DEBF0FBECDBF7C01E5\r\n:1022E000B42EA52E962E872E690160E0FC01808118\r\n:1022F0000E94A41097FD22C019821A8286E0800FE6\r\n:102300008B831C820D838E829F82A886B98669E0AA\r\n:1023100070E0CE0101960E946C1097FD0FC0B801CD\r\n:10232000C6010E946C1097FD09C00E949C10C70155\r\n:102330000E943D1197FD02C0912F01C0082F802FF0\r\n:1023400029960FB6F894DEBF0FBECDBFDF91CF91B7\r\n:102350001F910F91FF90EF90DF90CF90BF90AF90C3\r\n:102360009F908F9008950F931F93CF93DF9300D08A\r\n:1023700000D0CDB7DEB709831A832B833C8304E0FA\r\n:1023800010E09E012F5F3F4F0E945B110F900F9056\r\n:102390000F900F90DF91CF911F910F910895EF92C1\r\n:1023A000FF920F931F93CF93DF9300D000D0CDB750\r\n:1023B000DEB77C01162F19821A821B821C829E01B5\r\n:1023C0002F5F3F4F48E259E060E87FEBFC018081DE\r\n:1023D00091810E94BA2097FD36C089819A81AB8194\r\n:1023E000BC8141E050E060E070E0F701028004C091\r\n:1023F000440F551F661F771F0A94D2F7112329F047\r\n:10240000842B952BA62BB72B08C040955095609533\r\n:10241000709584239523A623B72389839A83AB835E\r\n:10242000BC8309811A812B813C8148E259E060E834\r\n:102430007FEBF701808191810E94B3111816190674\r\n:1024400014F480E090E00F900F900F900F90DF91C8\r\n:10245000CF911F910F91FF90EF9008950F931F93CD\r\n:10246000CF93DF9300D01F92CDB7DEB78C01BE01B2\r\n:102470006D5F7F4F0E94EE1097FD2EC08B81F8019B\r\n:102480009281981739F18283982F9370923039F0A6\r\n:10249000869586958370823081F460E001C061E0AA\r\n:1024A000F801838194810E94CF1197FD15C087E7C1\r\n:1024B0008A83AE014E5F5F4F05C086E68983AE0119\r\n:1024C0004F5F5F4F63E2F80181810E948E201816F2\r\n:1024D000190614F480E090E00F900F900F90DF91B8\r\n:1024E000CF911F910F9108950F931F93CF93DF9377\r\n:1024F0001F92CDB7DEB78C01BE016F5F7F4F0E9488\r\n:10250000EE1097FD12C09981292F2370F801838165\r\n:102510009481211102C060E001C061E00E94CF11EE\r\n:102520001816190614F480E090E00F90DF91CF9117\r\n:102530001F910F910895CF92DF92EF92FF920F9328\r\n:102540001F93CF93DF9300D000D01F92CDB7DEB79B\r\n:102550006C018FEFF6018283E380F480F701428102\r\n:102560005381648175814D5F534F6F477044808103\r\n:1025700091811D8201E010E09E012B5F3F4F0E9480\r\n:102580005B1197FD3CC060E0C7010E94CF1119822A\r\n:102590001A821B821C829E012F5F3F4F48E059E048\r\n:1025A00060E87FEBF701808191810E94BA2097FD5E\r\n:1025B00026C001E010E020E030E0F701028004C016\r\n:1025C000000F111F221F331F0A94D2F789819A81AD\r\n:1025D000AB81BC81082B192B2A2B3B2B09831A8337\r\n:1025E0002B833C8348E059E060E87FEB8081918158\r\n:1025F0000E94B3111816190614F480E090E00097B9\r\n:10260000C9F4F6012081222369F0213099F485E094\r\n:102610008983AE014F5F5F4F6AE1F60181810E94BD\r\n:102620008E2003C0C6010E9474121816190614F4F5\r\n:1026300080E090E00F900F900F900F900F90DF913F\r\n:10264000CF911F910F91FF90EF90DF90CF90089561\r\n:102650000F931F93CF93DF9300D000D000D0CDB75E\r\n:10266000DEB71092BA0080E28093B8001092BC00EE\r\n:102670008FE19EE40197F1F700C000000B9A139AD6\r\n:102680009FEF20E782E0915020408040E1F700C0BA\r\n:1026900000008CE08E8301E010E09E012A5F3F4F36\r\n:1026A0004AEF50E360E87FEB8CE391E00E945B111E\r\n:1026B00097FD4CC01D829E012B5F3F4F42E154E3CA\r\n:1026C00062ED7FEB8CE391E00E945B1197FD3EC0D1\r\n:1026D00019821A821B821C829E012F5F3F4F48E0A5\r\n:1026E00054E362ED7FEB8CE391E00E94BA2097FD0A\r\n:1026F0002DC009811A812B813C81016009831A83D5\r\n:102700002B833C8348E054E362ED7FEB8CE391E064\r\n:102710000E94B31197FD1AC004E813E323E030E0F0\r\n:1027200040E050E360E87FEB8CE391E00E94B3115E\r\n:1027300097FD0CC004E813E324E030E048E450E9DE\r\n:1027400060E87FEB8CE391E00E94B31187E391E0B6\r\n:102750000E949B1282E491E00E949B128DE391E023\r\n:102760000E949B1280914F0190915001A0915101C4\r\n:1027700089839A83AB8343E050E0BE016F5F7F4F54\r\n:1027800080913C010E94241104E610E087E391E06F\r\n:102790000E9474128FE19EE40197F1F700C00000DF\r\n:1027A0000150110999F726960FB6F894DEBF0FBEB7\r\n:1027B000CDBFDF91CF911F910F9108957F928F929E\r\n:1027C0009F92AF92BF92CF92DF92EF92FF920F93C0\r\n:1027D0001F93CF93DF9382EFC82E83E0D82E95E826\r\n:1027E000E92E91E0F92E8601C0E0D0E0712CAA24F8\r\n:1027F000A394B12CB701D7018C91F894E82FE295FE\r\n:10280000EF70F0E021A18F70A50102C0440F551FA9\r\n:102810008A95E2F7CA01922F982B91A392A18095F5\r\n:10282000892382A3789400C0E1E9F1E020E030E060\r\n:10283000812C912C4191842F82958F7090E0DC0146\r\n:1028400090968C9190E04F7002C0959587954A952F\r\n:10285000E2F780FD08C0C501022E02C0880F991F53\r\n:102860000A94E2F702C080E090E0882A992A2F5F5C\r\n:102870003F4F2E303105F1F6BFEFEB1AFB0AFB019B\r\n:1028800080810E94670ECB30D10519F0F0E5FA95F2\r\n:10289000F1F7D8018D919C9111978816990621F036\r\n:1028A0008D929C9281E001C080E0782A21960E5F93\r\n:1028B0001F4FCC30D10509F09DCF772049F081E042\r\n:1028C000809326060E94751B90932506809324060C\r\n:1028D00080912606882311F1209124063091250647\r\n:1028E0004FB7F8948091AB049091AC04A091AD04E3\r\n:1028F000B091AE044FBF821B930B069778F0EAECC1\r\n:10290000F4E08AE094E0D6012D913D916D01219390\r\n:1029100031938A179B07B9F71092260680912206F9\r\n:102920008823D9F1BFEFE0E7F2E0B150E040F0409A\r\n:10293000E1F700C0000081E08093E00080E2809336\r\n:10294000D8001092C9008FE097E20197F1F700C01C\r\n:1029500000001DBA109268001CBC10BE1FBA109275\r\n:102960007A0010926E0010926F0010927000109218\r\n:1029700071001092C9001092BC0011B814B817B8B9\r\n:102980001AB81DB810BA12B815B818B81BB81EB8C6\r\n:1029900011BA0E9428130C945278809127069091C6\r\n:1029A0002806883EA3E09A076CF010922806109241\r\n:1029B000270682E491E00E942E128DE391E00E94AE\r\n:1029C0002E1205C001969093280680932706872D26\r\n:1029D000DF91CF911F910F91FF90EF90DF90CF90FB\r\n:1029E000BF90AF909F908F907F90089581E08093EB\r\n:1029F000E00080E28093D800E9ECF0E010828FE004\r\n:102A000097E20197F1F700C000001DBA109268002C\r\n:102A10001CBC10BE1FBA10927A0010926E00109269\r\n:102A20006F00109270001092710010821092BC0022\r\n:102A300011B814B817B81AB81DB810BA12B815B82A\r\n:102A400018B81BB81EB811BA0E9428130C94007E47\r\n:102A5000089520912306211110C00E94FA0F84309E\r\n:102A600060F495E0989FF0011124E95FFE4FA2E524\r\n:102A7000B7E001900D929A95E1F7089590912306A1\r\n:102A8000911112C080930A0180930F018093140169\r\n:102A90008093190160911E0670911F068091200697\r\n:102AA000909121060C942915089544E150E063E8C3\r\n:102AB00075E0882361F087E091E00E9416314BE3D6\r\n:102AC00051E067E975E083EE94E00C94163187E0FD\r\n:102AD00091E00E94F8304BE351E067E975E083EE46\r\n:102AE00094E00C94F83080915207837029F08C693F\r\n:102AF000809352071092060181E080932306089587\r\n:102B00008F929F92AF92BF92CF92DF92EF92FF92FD\r\n:102B10000F931F93CF93DF9300D000D01F92CDB7B8\r\n:102B2000DEB7FC018081918123813481232B31F038\r\n:102B30009F3F31F491E08F3F19F403C091E001C051\r\n:102B400090E090FD19C57F0185E0DE0111960190AE\r\n:102B50000D928A95E1F7F701228189819A812223DA\r\n:102B600049F00E94DC1C182F682F89819A810E94ED\r\n:102B70007E1D03C00E94521D182F69817A81812F0A\r\n:102B80000E944F2B8C018091E204811132C2011509\r\n:102B9000FCE51F0731F168F4003E110509F45FC040\r\n:102BA000043E110509F460C00932110509F08EC117\r\n:102BB0000EC00A3C3CE5130769F10B3C8CE5180795\r\n:102BC000C1F0033C9CE5190709F080C136C0809133\r\n:102BD0002A06882309F44CC080912906882309F429\r\n:102BE00047C0F7018281882309F403C20E9473154C\r\n:102BF00000C2F7018281882309F4FBC18091550747\r\n:102C0000E4ECF1E092919817B0F001E0EE3BF007B0\r\n:102C1000C9F722C0F7018281882309F4EAC18091B3\r\n:102C20005507EEEBF1E024EC31E02E173F07A1F061\r\n:102C300091918917D0F7892F0FC0F70182818823DE\r\n:102C400009F4D7C180915507811103C080914701D4\r\n:102C500003C08093470180E00E943E15CAC1F7017E\r\n:102C6000828180932A0604C0F7018281809329061D\r\n:102C7000F7018281882309F48EC110922B0602305D\r\n:102C8000FCE51F0708F471C106312CE5120738F086\r\n:102C900098012B5F3C452930310508F066C10E9440\r\n:102CA000071C90930B0480930A0400313CE5130742\r\n:102CB00009F4C3C008F041C008309CE5190709F4C5\r\n:102CC0009AC0F0F40430FCE51F0709F487C068F4EB\r\n:102CD00002303CE5130709F477C003301C4509F0C6\r\n:102CE000E5C080910A04826076C006309CE5190731\r\n:102CF00009F46EC008F07BC080910A0488606BC044\r\n:102D00000C30FCE51F0709F485C068F40A303CE587\r\n:102D1000130709F474C008F079C00E944D20809117\r\n:102D20000A04806858C00E309CE5190709F476C083\r\n:102D300008F07FC080910A048BC00C3FFCE51F07A0\r\n:102D400009F44FC018F503313CE5130709F47DC0C1\r\n:102D500078F401319CE5190709F473C002311C4570\r\n:102D600009F0A4C00E944D2080910A048F7733C0DF\r\n:102D70000531FCE51F0709F472C008F486C00B3F5B\r\n:102D80001C4509F093C080910B043EC001158DE5F0\r\n:102D9000180709F45FC058F40E3FECE51E0709F46C\r\n:102DA00044C008F43FC080910B0482602DC0023003\r\n:102DB0002DE5120709F475C008F45DC003301D4508\r\n:102DC00009F074C060E06EC080910A04816003C0A5\r\n:102DD00080910A04806180930A0468C080910A048B\r\n:102DE00011C080910B04826080930B045FC08091BE\r\n:102DF0000A048062F0CF80910A048064ECCF809155\r\n:102E00000A0488608460E7CF8160EECF80910A0475\r\n:102E10008E7FE1CF80910A048D7FDDCF80910A04FF\r\n:102E2000877FD9CF80910B0418C080910B048D7FD0\r\n:102E3000DBCF80910A048F7ECECF80910A048F7DF4\r\n:102E4000CACF80910A048F7BC6CF80910A04877F06\r\n:102E50008B7FC1CF80910B048D7F8E7FC5CF8091FA\r\n:102E60000A0482FB222720F991E0922790FB82F945\r\n:102E700090FB83F9B0CF80910B04982F90959170BF\r\n:102E80008E7F892B90FB81F9AFCF0E944D208091DE\r\n:102E90000A0487FB222720F991E0922790FB87F90B\r\n:102EA0009ACF61E08EE090E00E94263160910A04A2\r\n:102EB00010910B0484E090E00E942631612F81E2A2\r\n:102EC00090E00E9426310E944D2093C0043FFCE513\r\n:102ED0001F07A1F406E221EE40EE64EF7CE50AC094\r\n:102EE000083D9CE5190709F0C3CE06E221EE41EE4C\r\n:102EF00068ED7CE5C7010E948D2A7BC0053F2CE56B\r\n:102F00001207A0F4093D3CE5130731F407E225EE72\r\n:102F100045EE69ED7CE5EECF0A3D8CE5180701F73B\r\n:102F200008E221E045EE6AED7CE5E4CF063FECE502\r\n:102F30001E0731F406E221EE42EE66EF7CE5DACFC1\r\n:102F4000063FFCE51F0730F407E225EE44EE65EF8F\r\n:102F50007CE5D0CF073F2CE5120709F089CE07E2C8\r\n:102F600025EE46EE67EF7CE5C5CF06313CE513075D\r\n:102F700019F58091F1068A7A91E009F490E0909336\r\n:102F80002C06882311F065E301C069E28DE296E02A\r\n:102F90000E94D21B0EC006311C4509F048C080912A\r\n:102FA0002C06882309F4E6C265E38DE296E00E94D0\r\n:102FB000AA1B0E94881C1DC09801235C3C4524313B\r\n:102FC0003105B8F001159CE5190731F00F3D1C459E\r\n:102FD00071F50E94181C0DC00E944D20FFE70AE108\r\n:102FE00016E0F15000401040E1F700C000000E94E0\r\n:102FF000F6148091EE06877009F4BEC2F701828153\r\n:10300000882309F4B9C282E00F900F900F900F90BF\r\n:103010000F90DF91CF911F910F91FF90EF90DF9074\r\n:10302000CF90BF90AF909F908F900C94E41DF701CC\r\n:1030300000811181882349F0C8010E94DC1CD82E30\r\n:10304000682FC8010E947E1D04C0C8010E94521D45\r\n:10305000D82EB8018D2D0E947E0E8C01982EF7017E\r\n:10306000B280A580A2949FE0A9228091EE0687708D\r\n:1030700099F0BB2089F0812F807F803421F080E29D\r\n:10308000800F883048F082E00E94E41D8091EE06B7\r\n:103090008770DD24D3948111D12CC12EC2948FE08E\r\n:1030A000C8228C2D90E08C30910508F035C2FC01CF\r\n:1030B000E957FF4F0C94D531812F807F1F708823F3\r\n:1030C00011F01295107FBB20B9F0112309F40FC243\r\n:1030D00080E2800F883010F0911006C08091F106D8\r\n:1030E000182B1093F10605C08091F006182B109351\r\n:1030F000F0060E94881CFBC1802F0E94852F11239F\r\n:1031000009F40AC2005E1095083010F0911006C054\r\n:103110008091F10618231093F10605C08091F00606\r\n:1031200018231093F0060E94881CF6C1812F807F1F\r\n:103130001F70803211F01295107F992021F0F1E07C\r\n:103140009F16E1F02AC0BB2081F08091F206AA20F0\r\n:1031500051F001E0A01207C0182B181709F4DCC1C8\r\n:103160001093F206D9C1812B10C0AA2021F021E0D2\r\n:10317000A21609F4D1C10E94821C27C0BB2041F0D5\r\n:1031800035E03A1508F4C8C1812F0E947B2FC4C1D5\r\n:1031900084E08A1508F4C0C118C0BB2049F0AA20F9\r\n:1031A00099F3F701858180FFA2C18F708583ECCFF1\r\n:1031B000AA2059F0093309F0ACC1FFEF13EF21E069\r\n:1031C000F15010402040E1F7A2C1812F0E94702FE2\r\n:1031D000A3C1812F86958695837019F0813059F0AF\r\n:1031E0009BC1BB2019F0C801937002C080E090E041\r\n:1031F0000E946B2A97C1BB2019F0C801937002C0CE\r\n:1032000080E090E00E94552A8DC1812F837009F0E3\r\n:1032100069C0B11085C1902F929596959770990FBE\r\n:10322000990F802F8F70882E912CA12CB12C092EF4\r\n:1032300004C0880C991CAA1CBB1C0A94D2F704FF7A\r\n:1032400012C04FE050E060E070E004C0440F551F32\r\n:10325000661F771F9A95D2F7DB01CA01809590957A\r\n:10326000A095B09503C080E090E0DC01169516951E\r\n:10327000412F4370423019F1C8F40091F3061091C8\r\n:10328000F4062091F5063091F606413059F0882970\r\n:103290009929AA29BB29BC01CD016023712382236E\r\n:1032A00093230AC0802A912AA22AB32ABC01CD0105\r\n:1032B000682979298A299B290E941E1E31C18829E3\r\n:1032C0009929AA29BB290091F3061091F4062091AF\r\n:1032D000F5063091F606BC01CD01602771278227E3\r\n:1032E0009327EACFBB2019F0812F817001C086950A\r\n:1032F000882309F415C1902F929596959770990F90\r\n:10330000990F802F8F70882E912CA12CB12C092E13\r\n:1033100004C0880C991CAA1CBB1C0A94D2F704FF99\r\n:1033200012C04FE050E060E070E004C0440F551F51\r\n:10333000661F771F9A95D2F7DB01CA018095909599\r\n:10334000A095B09503C080E090E0DC01169516953D\r\n:10335000412F43704230D9F068F500911E0610915C\r\n:103360001F062091200630912106413059F088290E\r\n:103370009929AA29BB29BC01CD016023712382238D\r\n:1033800093231EC0802A912AA22AB32A13C0882917\r\n:103390009929AA29BB2900911E0610911F06209188\r\n:1033A000200630912106BC01CD01602771278227BC\r\n:1033B000932706C0BC01CD01682979298A299B2958\r\n:1033C0000E94A91DADC01F70BB2039F0812F0E9443\r\n:1033D000FD1D802F0E947B2FA3C0802F0E94702F85\r\n:1033E000812F0E94BF1D9CC0802F32EF931609F4DD\r\n:1033F00040C0391538F090EF991661F0E1EF9E1654\r\n:1034000099F170C0F3EF9F16D9F124EF921609F4E9\r\n:103410004EC068C0BB2019F134E03A1508F47CC0F6\r\n:103420001F7181E090E0A0E0B0E0AC01BD0104C0FC\r\n:10343000440F551F661F771F1A95D2F780911E06FD\r\n:1034400090911F06A0912006B09121068A019B0150\r\n:10345000082719272A273B27C901B80125C025E0DD\r\n:103460002A1508F459C0DCCFBB2029F0812F8F71B9\r\n:103470002CC0BB20D9F3812F8F710E94BF1D4CC07F\r\n:10348000BB2079F01F7181E090E0A0E0B0E0BC01CA\r\n:10349000CD0104C0660F771F881F991F1A95D2F7B8\r\n:1034A00003C060E070E0CB010E94A91D35C0BB20C5\r\n:1034B00079F01F71812F0E94FD1D38E0139FC0011C\r\n:1034C000112483608093EE06812F0E94FD1D24C08D\r\n:1034D00081E00E94E41D81E08A15F0F482E00E9400\r\n:1034E000E41D1AC0BB2039F0AA2009F4BFCF802FF9\r\n:1034F0000E94E12F11C0AA2009F4BDCF893349F4FD\r\n:103500009FEFE3EFF1E09150E040F040E1F700C0C1\r\n:103510000000802F0E94852F88EF8C0D843010F4DE\r\n:103520000E94812ADD2041F18091EE0680FD24C0B9\r\n:10353000F70112828595859585950E94FD1DC7012D\r\n:103540000E9480158091EE068595859585950F9052\r\n:103550000F900F900F900F90DF91CF911F910F91CF\r\n:10356000FF90EF90DF90CF90BF90AF909F908F90A3\r\n:103570000C94BF1D69E219CD0F900F900F900F9022\r\n:103580000F90DF91CF911F910F91FF90EF90DF90FF\r\n:10359000CF90BF90AF909F908F90089508958091A5\r\n:1035A000F806089580E00895CF93DF9300D01F922E\r\n:1035B000CDB7DEB790911B07943011F589837B83DB\r\n:1035C0006A839093E9008FEF9091E800815095FD18\r\n:1035D00006C09AE69A95F1F700C08111F5CF809167\r\n:1035E000E80085FF0DC040E050E063E070E0CE01F0\r\n:1035F00001960E9462208091E8008E778093E80017\r\n:103600000F900F900F90DF91CF910895BC0184E04F\r\n:103610000C94D41ABC0183E00C94D41ACF93DF939A\r\n:1036200020914801222339F020910A0427FF03C08A\r\n:1036300060E224E002C068E021E02093E9002FEF7F\r\n:103640003091E800215035FD06C03AE63A95F1F791\r\n:1036500000C02111F5CF2091E80025FF1DC0EC012D\r\n:1036600080914801811105C040E050E068E070E0C1\r\n:1036700003C070E040E050E0CE010E9462208091E3\r\n:10368000E8008E778093E80080E2FE01A9EFB6E0C3\r\n:1036900001900D928A95E1F7DF91CF91089578948A\r\n:1036A0001F920F920FB60F9211248F939F93AF9397\r\n:1036B000BF938091AB049091AC04A091AD04B09104\r\n:1036C000AE040196A11DB11D8093AB049093AC0490\r\n:1036D000A093AD04B093AE04BF91AF919F918F9131\r\n:1036E0000F900FBE0F901F9018952FB7F8948091F0\r\n:1036F000AB049091AC04A091AD04B091AE042FBF87\r\n:1037000008951F920F920FB60F9211248F939F93DB\r\n:10371000AF93BF9380910E04811113C08091AB04CD\r\n:103720009091AC04A091AD04B091AE044196A11D5E\r\n:10373000B11D8093AB049093AC04A093AD04B093FF\r\n:10374000AE04BF91AF919F918F910F900FBE0F90DC\r\n:103750001F901895209148012223C9F020910A0456\r\n:1037600027FF15C0262F2695269526952E31C8F4BD\r\n:10377000FC01E20FF11D677081E090E001C0880F4D\r\n:103780006A95EAF780959281892382830895FC01E6\r\n:1037900006962281621301C012823196E817F9075A\r\n:1037A000C1F70895209148012223C1F020910A0415\r\n:1037B00027FF14C0262F2695269526952E3130F505\r\n:1037C000FC01E20FF11D677081E090E001C0880FFD\r\n:1037D0006A95EAF79281892B82830895FC013296DB\r\n:1037E0002FEF30E04191641789F02F3F19F4411118\r\n:1037F00001C0232F3F5F3630A9F72F3F39F0FC017E\r\n:10380000E20FF11D27FDFA95628308950895CF9385\r\n:1038100084E090E00E940831C82F81E290E00E948D\r\n:1038200008312C2F30E0A901582BCA01CF910895FF\r\n:103830006BEE7EEF80E090E00E94443160E082E039\r\n:1038400090E00E94263160E083E090E00E94263103\r\n:103850001092F3061092F4061092F5061092F606F6\r\n:1038600060E084E090E00E94263160E081E290E038\r\n:103870000E94263160E085E090E00E94263160E001\r\n:1038800086E090E00E9426316FEF87E090E00E9492\r\n:10389000263140E050E0BA0188E090E00E943831E3\r\n:1038A00060E08DE090E00E94263140E050E0BA01F7\r\n:1038B00088E190E00E94383160E087E190E00E946A\r\n:1038C000263140E050E0BA018CE190E00E943831AE\r\n:1038D00060E080E290E00E94263140E050E0BA01D2\r\n:1038E00088E190E00E94383140E050E0BA018FE07A\r\n:1038F00090E00E94383140E050E0BA0183E190E06E\r\n:103900000C9438318091F20681111092F2060895DC\r\n:103910009091F1068091F006892B2091EF06982F67\r\n:10392000922B90932D068091F2068823D9F0892B53\r\n:1039300080932D0680914801882331F080910A04FC\r\n:1039400087FF02C08EE101C086E0EFE2F6E090E082\r\n:10395000815028F021912223D9F39F5FF9CF911153\r\n:103960000E94821CE0910C04F0910D043097A9F0A4\r\n:1039700080914801882359F080910A0487FF07C08D\r\n:1039800080912D0680932E0685E080932D0602807F\r\n:10399000F381E02D8DE296E00994089580E090E0B7\r\n:1039A0000E946B2A80E090E00E94552A1092F00657\r\n:1039B0001092EF060C94881CBF92CF92DF92EF9288\r\n:1039C000FF920F931F93CF93DF938C01C0901E063D\r\n:1039D000D0901F06E0902006F09021068091F3061B\r\n:1039E0009091F406A091F506B091F606C82AD92A5E\r\n:1039F000EA2AFB2ACFE1D0E0D701C6010C2E04C091\r\n:103A0000B695A795979587950A94D2F780FD04C03F\r\n:103A1000219790F7B12C07C0BC2EB8018C2F0E94C3\r\n:103A20007E0E0197A9F38B2DDF91CF911F910F91FE\r\n:103A3000FF90EF90DF90CF90BF900895CF93DF93EA\r\n:103A4000EC010E94DC1CBE010E947E0EDF91CF9132\r\n:103A500008950E941E1D292F2F70E92FE295EF7007\r\n:103A60004E2F50E0FA013297EE30F105B8F4ED56E2\r\n:103A7000FF4F0C94D531803F99F018F4883E70F4D4\r\n:103A80000FC0843F59F40CC0883E50F0813F31F4A0\r\n:103A900007C0822F869586958695089580E00895C3\r\n:103AA00081E008952EE0929F800D1124682F669585\r\n:103AB00066956695982F977085E0689FB0011124F0\r\n:103AC00040E050E080E0FB01E40FF51FEB57F94FB9\r\n:103AD000208130E0092E02C0369527950A94E2F73E\r\n:103AE00021703327042E01C0220F0A94EAF7822B9B\r\n:103AF0004F5F5F4F4530510531F708952EE0929F9B\r\n:103B0000800D1124E82FE695E695E695877051E043\r\n:103B100001C0550F8A95EAF785E0E89FF00111246E\r\n:103B2000EB57F94F20E030E070E04081CB01022EEE\r\n:103B300002C0969587950A94E2F781708195842753\r\n:103B40008523842781932F5F3F4F2530310569F707\r\n:103B50000895CF92DF92EF92FF926B017C010E9459\r\n:103B60002915C0921E06D0921F06E0922006F09200\r\n:103B70002106FF90EF90DF90CF900C94CE1C0F9316\r\n:103B80001F9341E050E060E070E004C0440F551F17\r\n:103B9000661F771F8A95D2F740955095609570956E\r\n:103BA00080911E0690911F06A0912006B0912106DB\r\n:103BB0008A019B01082319232A233B23C901B80149\r\n:103BC0001F910F910C94A91D2091EE0680958223E0\r\n:103BD0008093EE06982F977079F430E0482F082EE6\r\n:103BE000000C550B2417350739F08595859585957B\r\n:103BF0000E94BF1D1092EE0608950F931F9341E09F\r\n:103C000050E060E070E004C0440F551F661F771F4E\r\n:103C10008A95D2F780911E0690911F06A0912006EA\r\n:103C2000B09121068A019B01082B192B2A2B3B2BD3\r\n:103C3000C901B8011F910F910C94A91D6093F3065F\r\n:103C40007093F4068093F5069093F6060C94CE1CC0\r\n:103C50008091840690915306891719F08F5F8770C1\r\n:103C6000FBCF08950F931F93CF93DF93809152065C\r\n:103C700082958F7009F05DC080914F06882309F40A\r\n:103C800058C0809184061091530660914D06709142\r\n:103C90004E06C0915006D091510691E06F3F09F059\r\n:103CA00090E0292F06E0811709F443C0209721F006\r\n:103CB0007F3F21F030E003C031E001C0322F90E0BF\r\n:103CC00030FD34C0089FF001099FF00D1124DF0181\r\n:103CD000AC5AB94F11963C911197371327C03C91BC\r\n:103CE000361324C012963C91129731111FC01396BF\r\n:103CF0004D915C9114974C1B5D0B483C5105B0F401\r\n:103D0000809152068F70806180935206E75AF94F76\r\n:103D100080818F70806180838DE496E00E948015A1\r\n:103D2000DF91CF911F910F910C94281E01968770FF\r\n:103D3000BACFDF91CF911F910F9108959F92AF92CB\r\n:103D4000BF92CF92DF92EF92FF920F931F93CF9388\r\n:103D5000DF93CDB7DEB761970FB6F894DEBF0FBE25\r\n:103D6000CDBF8C0185E0F801DE011D9601900D921A\r\n:103D70008A95E1F7F80190818181E28030914D06CA\r\n:103D800060914E06409150065091510641155105E3\r\n:103D900031F06F3F31F421E03F3F19F403C021E0DF\r\n:103DA00001C020E0F22FF1709F2E20FD23C1F80109\r\n:103DB000C380D4802DE4A22E26E0B22EF0904F06D0\r\n:103DC000F601E41BF50BFF2009F4CEC0209152064A\r\n:103DD000E83CF10508F099C0422F407F09F051C03E\r\n:103DE000681311C039130FC0FE2CE1100CC02F70E6\r\n:103DF000206120935206C5010E94801580915206D1\r\n:103E0000F801858337C1CD2831F08F3F31F421E0AF\r\n:103E10009F3F19F403C021E001C020E020FD03C052\r\n:103E200021E02E2502C020E030E0F22FF170FF2EBD\r\n:103E300020FF1DC0209184064091530656E02417B0\r\n:103E400009F4F6C030E0529FF001539FF00D1124A9\r\n:103E5000EC5AF94F6181861306C06081961303C046\r\n:103E60006281E61204C02F5F3F4F2770E8CFFE2C1F\r\n:103E7000EE2009F4FFC080915206816080935206C3\r\n:103E800050C0681307C0391305C0E11003C0F80122\r\n:103E900025838DC09D878E878D859E850E94291DD7\r\n:103EA000882369F1EE2059F120915206822F8295E4\r\n:103EB0008F7090E0029774F080914D0690914E06BD\r\n:103EC00098878F831986DB86CA862C87CE01079652\r\n:103ED0000E94801586E0F801ADE4B6E001900D92F5\r\n:103EE0008A95E1F70E94321E0DC06817E1F09D87A8\r\n:103EF0008E878D859E850E94291D81111EC0C80157\r\n:103F00000E948015FF24F394B5C0422F407F69F7CB\r\n:103F10008DE496E00E94801586E0F50111928A9565\r\n:103F2000E9F7F12CA7C03913E2CFE110E0CFF80197\r\n:103F30002583C8010E94801557C0EE2001F320910F\r\n:103F40005206822F82958F7090E002971CF280912A\r\n:103F50004D0690914E069A8389831B82DD82CC8226\r\n:103F60002E83CE010196B4CFE83CF105E8F5FE2C96\r\n:103F7000EE2029F2681327C0391325C0209152067C\r\n:103F800020FD18C0822F82958F70482F50E0411578\r\n:103F9000510581F0F80125834F30510541F08F5FC5\r\n:103FA000982F9295907F822F8F70892B8583C801DF\r\n:103FB0000E94801586E0F801ADE4B6E001900D9214\r\n:103FC0008A95E1F757C09D878E878D859E850E94D3\r\n:103FD000291D81117FCF8091520681608093520606\r\n:103FE000C8010E94801546C086E0F50111928A95AD\r\n:103FF000E9F740C0EE2009F482CF9D878E878D853A\r\n:104000009E850E94291DF82E882309F478CF86E02A\r\n:10401000F801ADE4B6E001900D928A95E1F7809148\r\n:104020004D0690914E060E941E1D0E94321E22C017\r\n:104030009D878E878D859E850E941E1D292F229526\r\n:104040002F70223028F49F7039F0811105C00BC009\r\n:10405000243028F49F7049F4805E883020F0C80135\r\n:104060000E9480159F2CF92C05C0F8019581907F46\r\n:1040700099F7F9CF8F2D61960FB6F894DEBF0FBE7A\r\n:10408000CDBFDF91CF911F910F91FF90EF90DF9007\r\n:10409000CF90BF90AF909F9008951092F1068091BD\r\n:1040A0004801882331F080910A0487FF02C08EE125\r\n:1040B00001C086E0EFE2F6E0DF011D928A95E9F7A4\r\n:1040C0000C94CE1CEF92FF920F931F93CF93DF932C\r\n:1040D0007C018B010E94562D811119C0E701011549\r\n:1040E0001105A1F08091E80085FD0AC08091E800EB\r\n:1040F0008E778093E8000E94562D882381F307C0B5\r\n:1041000089918093F10001501109E9CF80E0DF919E\r\n:10411000CF911F910F91FF90EF9008950F931F93F0\r\n:10412000CF93DF931F92CDB7DEB769838A0160E03A\r\n:104130000E94A41097FD13C061E070E0CE010196CB\r\n:104140000E946C1097FD0BC061E070E0C8010E94F6\r\n:104150006C108C0197FD05C00E949C1002C0282F96\r\n:1041600002C0202F912F822F0F90DF91CF911F91AE\r\n:104170000F910895CF92DF92EF92FF920F931F93CA\r\n:10418000CF93DF93CDB7DEB72F970FB6F894DEBF8E\r\n:104190000FBECDBF7C0189011A861B861C861D8639\r\n:1041A00019821A8286E0D82EDB8281E08C8384E03B\r\n:1041B0008D837E836F835887498749E050E0BE0135\r\n:1041C0006F5F7F4FF70180810E94241197FD40C0EF\r\n:1041D000C7010E943D1197FD3BC060E0F70180815F\r\n:1041E0000E94A41097FD34C01E86DF8662E070E056\r\n:1041F000CE010E960E946C1097FD2AC061E0F70177\r\n:1042000080810E94A41097FD23C081E00E944A1083\r\n:1042100097FD1EC06E01FAE0CF0ED11CE12CF12CEF\r\n:104220008FEFE81AF80A81E094E0E916F1040CF047\r\n:1042300080E00E944A1097FD0BC0F60181936F0148\r\n:10424000F4E0EF16F10461F70E949C1084E090E026\r\n:1042500097FD09C04A855B856C857D85F8014083A3\r\n:104260005183628373832F960FB6F894DEBF0FBE1F\r\n:10427000CDBFDF91CF911F910F91FF90EF90DF9015\r\n:10428000CF9008956F927F928F929F92AF92BF923C\r\n:10429000CF92DF92EF920F931F93CF93DF933C0166\r\n:1042A000C091490185E1C89FC02D1124D5E1DC0FE3\r\n:1042B000DA3608F0D9E660915607669580914E0788\r\n:1042C00090914F070E94F12B182FCD1708F044C092\r\n:1042D0008C2E912CF401E35BFC4F908180914A017C\r\n:1042E0008923C1F1F401EE0FFF1FE558FD4FC08097\r\n:1042F000D12C80E7C81AD108F401EE0FFF1FE45853\r\n:10430000FD4FA080B12CE0E2AE1AB108CC9C900128\r\n:10431000CD9C300D300D1124AA9CC001AB9C900D9A\r\n:10432000900D1124820F931F0E94972B082F6091EC\r\n:1043300053077091540780915507E12E9501A6010E\r\n:10434000F30109950E94FB2B462F282F672FC401EC\r\n:104350000E945E2BCF5FB9CF81E0D93608F080E0B4\r\n:10436000DF91CF911F910F91EF90DF90CF90BF9091\r\n:10437000AF909F908F907F906F900895CF92DF9233\r\n:10438000EF92FF920F931F93CF93DF936C01C09135\r\n:10439000490185E1C89FC02D1124D5E1DC0FDA3633\r\n:1043A00008F0D9E660915607669580914E07909186\r\n:1043B0004F070E94F12B182FCD1778F5EC2EF12C1A\r\n:1043C000F701E35BFC4F908180914A01892319F149\r\n:1043D000F701EE0FFF1FE458FD4F208130E020521F\r\n:1043E0003109F701EE0FFF1FE558FD4F408150E006\r\n:1043F00040575109609153077091540780915507B8\r\n:10440000012FF60109950E94FB2B462F282F672FBD\r\n:10441000C7010E945E2BCF5FCFCF81E0D93608F075\r\n:1044200080E0DF91CF911F910F91FF90EF90DF908F\r\n:10443000CF900895DF92EF92FF920F931F93CF9347\r\n:10444000DF937C01C091490185E1C89FC02D1124F3\r\n:10445000D5E1DC0FDA3608F0D9E6609156076695AB\r\n:10446000669580914E0790914F070E94F12BD82EB0\r\n:10447000CD17F0F40C2F10E0F801E35BFC4F9081B6\r\n:1044800080914A01892391F06091530770915407FC\r\n:10449000809155072D2D4C2FF70109950E94FB2B7C\r\n:1044A000462F282F672FC8010E945E2BCF5FE0CFD9\r\n:1044B00081E0D93608F080E0DF91CF911F910F9114\r\n:1044C000FF90EF90DF9008959F92AF92BF92CF92AE\r\n:1044D000DF92EF92FF920F931F93CF93DF936C01C4\r\n:1044E000C091490185E1C89FC02D1124D5E1DC0FA1\r\n:1044F000DA3608F0D9E660915607669566958091A0\r\n:104500004E0790914F070E94F12B182F80E4810FE6\r\n:104510000E94762B90E8F92EF80E812F0E94762BC0\r\n:1045200020E8922E980ECD1700F5AC2EB12CF50197\r\n:10453000E35BFC4F908180914A018923A1F0609157\r\n:1045400053077091540780915507E12E0C2F292DA8\r\n:104550004F2DF60109950E94FB2B462F282F672F20\r\n:10456000C5010E945E2BCF5FDECF81E0D93608F017\r\n:1045700080E0DF91CF911F910F91FF90EF90DF903E\r\n:10458000CF90BF90AF909F900895CF92DF92EF921F\r\n:10459000FF920F931F93CF93DF936C01C09149015A\r\n:1045A00085E1C89FC02D1124D5E1DC0FDA3608F073\r\n:1045B000D9E62091560730E040E050E06FEF7FEF02\r\n:1045C00080E090E00E944A318901CD17E8F5EC2E99\r\n:1045D000F12CF701E35BFC4F908180914A01892324\r\n:1045E00089F190912507915097FD15C0492F092E0B\r\n:1045F000000C550BFA01EB5DF84F8189C813F3CF1E\r\n:10460000440F551FFA01EB5DF84F218D328D2017B5\r\n:10461000310748F701C0980160915607C9010E940F\r\n:10462000F12BAC01609153077091540780915507AD\r\n:10463000F60109950E94FB2B462F282F672FC701F3\r\n:104640000E945E2BCF5FC1CF81E0D93608F080E0B9\r\n:10465000DF91CF911F910F91FF90EF90DF90CF905E\r\n:1046600008952F923F924F925F926F927F928F9216\r\n:104670009F92AF92BF92CF92DF92EF92FF920F93F1\r\n:104680001F93CF93DF93CDB7DEB727970FB6F8947C\r\n:10469000DEBF0FBECDBF282E4B012091490185E121\r\n:1046A000289F802D11248E83182F1B5E1A3608F048\r\n:1046B00019E63091250739839E81911708F077C05C\r\n:1046C0008E81682E712CF301E35BFC4F9081809109\r\n:1046D0004A01892309F467C030905307409054077A\r\n:1046E000522C1F82C301880F991FDC01A558BD4FB2\r\n:1046F000BB83AA83C301880F991FFC01E458FD4FB7\r\n:10470000FD83EC83F9815F16E0F5E52CF12CAA819D\r\n:10471000BB81CC90D12CF701EB5DF84F8181C81A99\r\n:10472000D108AC81BD81AC90B12C8185A81AB108AB\r\n:10473000CC9C9001CD9C300D300D1124AA9CC00161\r\n:10474000AB9C900D900D1124820F931F0E94972B0C\r\n:10475000082FF701EE0FFF1FEB5DF84F6091560732\r\n:10476000818D928D0E94F12B7C019501A601632D14\r\n:10477000742D8F81F4010995362E472E8F83539423\r\n:10478000C1CF209155078F81382F329F312D1124B1\r\n:10479000832F632D742D0E94FB2B462F282F672F0C\r\n:1047A000C3010E945E2B8E818F5F8E8385CF81E057\r\n:1047B000193608F080E027960FB6F894DEBF0FBEDA\r\n:1047C000CDBFDF91CF911F910F91FF90EF90DF90C0\r\n:1047D000CF90BF90AF909F908F907F906F905F90A1\r\n:1047E0004F903F902F9008951F93CF93DF93CDB7B5\r\n:1047F000DEB7AA970FB6F894DEBF0FBECDBFEDE1CE\r\n:10480000F7E08091F100819347E0E532F407C9F7C2\r\n:1048100080911E07833009F460C030F4813071F05C\r\n:10482000823009F49AC0B1C08A3009F486C08B3056\r\n:1048300009F46BC0893009F0A8C020C080911D0721\r\n:10484000813A09F0A2C08091E800877F8093E80058\r\n:104850008091210790912207892B21F460E289EF52\r\n:1048600096E003C060E080E090E070E00E94142FCA\r\n:104870008091E8008B778093E80087C080911D07C6\r\n:10488000813209F082C08091210790912207009720\r\n:1048900019F0029709F079C08091E800877F809332\r\n:1048A000E8008091E80082FD05C080911B0781111E\r\n:1048B000F8CF6BC08091F2009091F300029729F439\r\n:1048C0008091F1008B7F813021F48091F100809301\r\n:1048D000F8068091E8008B7754C080911D07813ADB\r\n:1048E00009F053C08091210790912207892B09F08C\r\n:1048F0004CC08091E800877F8093E8008091E800B9\r\n:1049000080FFFCCF8091480137C080911D07813224\r\n:10491000E1F58091210790912207892BB1F58091D3\r\n:10492000E800877F8093E8000E94892D80911F070F\r\n:10493000809348010E944D2028C080911D0781323C\r\n:1049400021F58091E800877F8093E8000E94892DFF\r\n:10495000809120078093F70618C080911D07813A47\r\n:10496000A1F48091E800877F8093E8008091E800BF\r\n:1049700080FFFCCF8091F7068093F1008091E800E2\r\n:104980008E778093E8000E94892D8091E80083FF54\r\n:10499000DAC180911D0790911E07492F50E04A30DF\r\n:1049A000510508F0D0C1FA01EF55FF4F0C94D531F5\r\n:1049B000803821F0823809F0C6C108C080911907FB\r\n:1049C00090911A07992389F082600FC08091210786\r\n:1049D0008F70873008F0B7C18093E9008091EB00B9\r\n:1049E00085FB882780F91092E9009091E800977F75\r\n:1049F0009093E8008093F1001092F1006DC1282F90\r\n:104A00002D7F09F0A0C1882319F0823061F09BC18D\r\n:104A100080911F07813009F096C1933009F080E042\r\n:104A200080931A072EC080911F0781112AC08091A0\r\n:104A300021078F702FEF280F263008F084C1809354\r\n:104A4000E9002091EB0020FF1CC0933021F48091FD\r\n:104A5000EB00806214C09091EB0090619093EB00AA\r\n:104A600021E030E0A90102C0440F551F8A95E2F70A\r\n:104A70004093EA001092EA008091EB0088608093F6\r\n:104A8000EB001092E9008091E800877F8093E800B6\r\n:104A90000E94892D58C1811156C110911F071F779F\r\n:104AA0008091E3008078812B8093E3008091E8007F\r\n:104AB000877F8093E8000E94892D8091E80080FF25\r\n:104AC000FCCF8091E30080688093E300111102C065\r\n:104AD00082E001C083E080931B0735C1805882309B\r\n:104AE00008F031C120911F07309120072C3D53E081\r\n:104AF000350779F583E08A838AE289834FB7F89492\r\n:104B0000DE01139620E03EE051E2E32FF0E0509307\r\n:104B10005700E49120FF03C0E295EF703F5FEF7014\r\n:104B20008E2F90E0EA3010F0C79601C0C0968D93AA\r\n:104B30009D932F5F243149F74FBF8091E800877F15\r\n:104B40008093E8006AE270E0CE0101960E94142F83\r\n:104B5000B1C08091210790912207432F5527433000\r\n:104B60005105A9F068F44130510509F4FBC0423009\r\n:104B7000510509F0E8C08BE590E0E5E6F7E04BC0B1\r\n:104B80004132510529F14232510589F1DCC0C90198\r\n:104B9000992781309105A1F058F0029709F0D3C010\r\n:104BA000E2EDF7E0E4918E2F90E0E2EDF7E030C027\r\n:104BB000E0E5F8E0E4918E2F90E0E0E5F8E028C031\r\n:104BC000ECE3F8E0E4918E2F90E0ECE3F8E020C015\r\n:104BD0008330910508F0B7C0880F991FFC01E3539B\r\n:104BE000FE4F0190F081E02D89E090E014C0833009\r\n:104BF000910508F0A8C0FC01EE0FFF1FE953FE4F1E\r\n:104C00000190F081E02DDC01AC53BE4F8C9190E01F\r\n:104C1000009709F498C02091E800277F2093E800CE\r\n:104C200020912307309124072817390708F4C90178\r\n:104C300040E0009771F120911B072223D9F1253024\r\n:104C4000C9F12091E80023FD35C02091E80022FD44\r\n:104C50002DC02091E80020FFECCF2091F200309190\r\n:104C6000F300009759F02830310540F44491409307\r\n:104C7000F100319601972F5F3F4FF3CF41E028308D\r\n:104C8000310509F040E02091E8002E772093E800FC\r\n:104C9000D0CF4111D0CF0AC080911B07882351F09B\r\n:104CA000853041F08091E80083FD04C08091E800E8\r\n:104CB00082FFF2CF8091E8008B778093E80043C0B9\r\n:104CC000803809F040C08091E800877F8093E80039\r\n:104CD00080911C078093F1008091E8008E77D6CEFA\r\n:104CE000811131C080911F07909120079927029769\r\n:104CF00054F58091E800877F8093E80010911F07AA\r\n:104D000010931C070E94892D111106C08091E300A9\r\n:104D100087FD02C081E001C084E080931B0742E070\r\n:104D200061EC81E00E94A82D42E261EC84E00E94E7\r\n:104D3000A82D42E261EC82E00E94A82D42E260ECE4\r\n:104D400083E00E94A82D8091E80083FF10C080912D\r\n:104D5000E800877F8093E8008091EB008062809379\r\n:104D6000EB0005C082E190E0E0ECF7E054CFAA96BA\r\n:104D70000FB6F894DEBF0FBECDBFDF91CF911F916C\r\n:104D80000895E7E5F7E098E0E239F90729F0818333\r\n:104D9000608342833396F7CF0895FC01EE0FFF1F27\r\n:104DA0008E0F9F1FFC01E95AF84F618340832283D5\r\n:104DB0000895EF92FF920F939701201B31092F3F27\r\n:104DC000310519F010F02FEF30E02095382F320F19\r\n:104DD00008F43FEF832F0F91FF90EF900895EF922B\r\n:104DE000FF920F939701201B31092F3F310519F0D6\r\n:104DF00010F02FEF30E0322F3095482F430F08F49A\r\n:104E00004FEF842F620F0F91FF90EF900895EF9274\r\n:104E1000FF920F93972F093438F4B701601B710983\r\n:104E20006F3F710519F010F06FEF70E0485F5F4F52\r\n:104E30004131510540F0A901485F5F4F41315105B3\r\n:104E400010F06FEF70E06095482F460F08F44FEFB9\r\n:104E5000842F37FF02C02D5F3F4F3595279535953D\r\n:104E6000279560915307620F792F0F91FF90EF9074\r\n:104E70000895EF92FF920F93E00EF11CF90137FFB6\r\n:104E800003C0F195E195F10924E0EE0FFF1F2A958B\r\n:104E9000E1F7EF3FF10519F014F0EFEFF0E09A01C0\r\n:104EA00057FF03C031952195310994E0220F331F3C\r\n:104EB0009A95E1F72E173F070CF4F901EE0DFF1D4F\r\n:104EC000EF3FF10519F010F0EFEFF0E02E2F2095F5\r\n:104ED000382F320F08F43FEF832F0F91FF90EF90A0\r\n:104EE0000895EF92FF920F93970195E0099F200D8F\r\n:104EF000311D11242F3F310519F010F02FEF30E054\r\n:104F00002095382F320F08F43FEF832F0F91FF9039\r\n:104F1000EF90089522E8241B08F420E0620F089522\r\n:104F20004095282F429F412D1124842F08950F93DF\r\n:104F30001F9310E0F801EE0FFF1FE558FD4F908121\r\n:104F4000905797FD9195000F111FF801E458FD4F00\r\n:104F5000E081F0E0B097DF01AA0FBB1F8D010E0FBB\r\n:104F60001F1F2003D001219FB00D1124E8E3F0E0C2\r\n:104F7000E91BF10997FDF3959F01220F331F89016A\r\n:104F80000E0F1F1F40039001419F300D11242A0F67\r\n:104F90003B1F37FF02C021583F4F220F232F221FF4\r\n:104FA000330B620F1F910F9108950F931F93522F90\r\n:104FB00010E0F801EE0FFF1FE458FD4FE081F0E034\r\n:104FC000B097EE0FFF1F9F015203D001539FB00D0A\r\n:104FD0001124000F111FF801E558FD4F008110E06A\r\n:104FE00000571109000F111F40039001419F300D20\r\n:104FF00011242A0F3B1F37FF02C021583F4F220FB9\r\n:10500000232F221F330B620F1F910F9108950F93CF\r\n:105010001F93522F10E0F801EE0FFF1FE458FD4FD1\r\n:10502000E081F0E0B0979F015203D001539FB00D93\r\n:105030001124000F111FF801E558FD4F008110E009\r\n:105040000057110940039001419F300D11242A0F90\r\n:105050003B1F37FF02C021583F4F220F232F221F33\r\n:10506000330B620F1F910F910895EF920F931F93CF\r\n:1050700093E0099F80011124159507956E2D600F0F\r\n:105080001F910F91EF900895A22F50E0FA01EE0FBB\r\n:10509000FF1FE458FD4F9081905297FD9195440F6A\r\n:1050A000551FFA01E558FD4F3081232F30E02A1BB0\r\n:1050B0003109290F311D97FD3A95620F0895E42FAC\r\n:1050C000F0E0EE0FFF1FE458FD4F6081621B089572\r\n:1050D000E42FF0E0EE0FFF1FE558FD4F6081621BEB\r\n:1050E0000895622F0895E42FF0E0EE0FFF1FE558BA\r\n:1050F000FD4F408134EE439F412D1124E82FF0E015\r\n:1051000050E0445E5F4FDA01A21BB1099D01B7FF79\r\n:1051100003C031952195310993E0220F331F9A95F1\r\n:10512000E1F7AF01421B530B9A0157FF02C020E089\r\n:1051300030E0582F259F212D1124822F0895E42F30\r\n:10514000F0E0EE0FFF1FE558FD4F408134EE439F26\r\n:10515000412D1124E72FF0E050E0445E5F4FDA016B\r\n:10516000A21BB1099D01B7FF03C0319521953109FB\r\n:1051700093E0220F331F9A95E1F7AF01421B530BC7\r\n:105180009A0157FF02C020E030E0279F212D112413\r\n:10519000722F0895FC019B01009721F477FF2BC02B\r\n:1051A00080E80895AC0197FF04C044275527481BA9\r\n:1051B000590BB901640F751F37FD0CC0241B350B4B\r\n:1051C000C901A5E0880F991FAA95E1F70E94C13196\r\n:1051D00080E20CC0CB0165E0880F991F6A95E1F76A\r\n:1051E000BA01621B730B0E94C13180E6861BF7FF78\r\n:1051F00003C08195089580E00895EF920F93CF93B7\r\n:10520000DF93D72FC82FC9010E19BA010E94CA28EF\r\n:10521000602F681B7D2F8C2FDF91CF910F91EF9026\r\n:1052200008950F93CF93DF93D72FC82FC901BA01E9\r\n:105230000E94CA28682F600F7D2F8C2FDF91CF919D\r\n:105240000F910895EF920F931F93CF93DF93D62F73\r\n:10525000C72F182FC9010E19010FBA010E94CA28C1\r\n:10526000081B202F219F212D1124822F6D2F7C2F91\r\n:10527000DF91CF911F910F91EF900895EF920F93CF\r\n:105280001F93CF93DF93D62F172FC82FC9010E1965\r\n:10529000070FBA010E94CA28702F781B719F712DC9\r\n:1052A00011246D2F8C2FDF91CF911F910F91EF90D3\r\n:1052B0000895FF920F931F93CF93DF93F62ED72F6E\r\n:1052C000182FC901C12FC01BBA010E94CA28982FEC\r\n:1052D000990F890FC81B2C2F219F212D1124822F5C\r\n:1052E0006F2D7D2FDF91CF911F910F91FF9008952A\r\n:1052F000FF920F931F93CF93DF93F62E172FD82F84\r\n:10530000C901C72FC01BBA010E94CA28982F990F44\r\n:10531000890F7C2F781B719F712D11246F2D8D2F7C\r\n:10532000DF91CF911F910F91FF900895879A81B3DC\r\n:105330008F7791B390682FB7F894E7E5F7E038E0FE\r\n:10534000E239F30761F0319148E091BB37FF81BB4F\r\n:10535000330F000000C081BB4A95B9F7F0CF2FBFD3\r\n:105360008FE292E00197F1F700C0000008951F93CB\r\n:10537000CF93DF93CDB7DEB767970FB6F894DEBF54\r\n:105380000FBECDBF342F4B8B252F5C8B6D8B7E8B4F\r\n:105390008F8B4E895F8961111092F00686E0FE01C5\r\n:1053A0003D96DF01982F1D929A95E9F73D872E874C\r\n:1053B0006F87598B488BDE01179601900D928A9565\r\n:1053C000E1F7CE0107960E949E1E81113EC086E045\r\n:1053D000FE013796DE01119601900D928A95E1F754\r\n:1053E000FF81E8856A857B856115710531F0EF3FA6\r\n:1053F00031F481E0FF3F19F403C081E001C080E097\r\n:1054000080FD23C02091530630E0C90101968770CA\r\n:1054100099274091840650E08417950779F1F98324\r\n:10542000EA837D836C8396E0929FD001939FB00DB9\r\n:105430001124AC5AB94FFE01319601900D929A9504\r\n:10544000E1F7809353060E94281E16E0809184069F\r\n:10545000909153068917F9F0189FC00111248C5AB6\r\n:10546000994F0E949E1E8823B1F08091840690E09F\r\n:1054700001968770992780938406E8CF0E944D207B\r\n:105480001092530610928406EDE4F6E086E0DF0108\r\n:105490001D928A95E9F767960FB6F894DEBF0FBEA6\r\n:1054A000CDBFDF91CF911F91089520919608309143\r\n:1054B00097082817390771F09093970880939608FA\r\n:1054C000E0910C04F0910D04309721F00084F185F7\r\n:1054D000E02D09940895209194083091950828179B\r\n:1054E000390771F09093950880939408E0910C042B\r\n:1054F000F0910D04309721F00680F781E02D09949A\r\n:105500000895E0910C04F0910D04309721F0019082\r\n:10551000F081E02D099480E00895EF92FF920F93BF\r\n:10552000CF93DF93C42FD22FFC0182818823D1F047\r\n:1055300040932B060E94751B9093930880939208CA\r\n:1055400080E28C0F883008F078C0C77081E001C01D\r\n:10555000880FCA95EAF7DF91CF910F91FF90EF90F6\r\n:105560000C947B2F80912B06481356C020919208F3\r\n:10557000309193084FB7F8948091AB049091AC04AC\r\n:10558000A091AD04B091AE044FBF821B930B883C39\r\n:10559000910508F041C0CD17C9F080E28C0F88302A\r\n:1055A00040F4C77081E001C0880FCA95EAF70E94F5\r\n:1055B000702F80E28D0F883048F481E09D2F977026\r\n:1055C00001C0880F9A95EAF70E947B2F093319F0E2\r\n:1055D000E12CF12C03C080E5E82EF12C802F0E94F5\r\n:1055E000E12FE114F10451F08FEC97E00197F1F70E\r\n:1055F00000C0000091E0E91AF108F3CF802F0E946B\r\n:10560000852F80E28D0F8830C0F4D77081E001C013\r\n:10561000880FDA95EAF70AC080E28C0F883068F4C8\r\n:10562000C77081E001C0880FCA95EAF7DF91CF917A\r\n:105630000F91FF90EF900C94702FDF91CF910F910D\r\n:10564000FF90EF9008950F931F93CF93DF9350E057\r\n:10565000440F551F2CE1629F400D511D112420E580\r\n:1056600031E0682F629FC001639F900D1124480FA5\r\n:10567000591FEA01CD5BDF4FCE010E940831082F90\r\n:1056800010E0102F0027CE0101960E9408319801EA\r\n:10569000282BC901DF91CF911F910F910895462FBB\r\n:1056A000843038F47C3028F46E3018F4672F0C9472\r\n:1056B000232B80E090E008950C94C1260C94CD2615\r\n:1056C000E2E5F7E08DE380838091520190915301F0\r\n:1056D000A091540181839283A3838FE7848345E063\r\n:1056E00050E06CE170E0CF010C941631482F982FF8\r\n:1056F00046FD9095E92FEF739F7046FD9F5FE29501\r\n:10570000EF70EE0FF0E0EA54FC4F2181299F802DCD\r\n:10571000212D112482958F702295207F822B30813C\r\n:10572000982F930F892F47FD819580580895BC01CC\r\n:105730008230910508F40895613E8EE1780748F4BF\r\n:105740009B0195E0369527959A95E1F748E0420F41\r\n:1057500001C04FEF91E0242F30E0290F311D359526\r\n:105760002795229FF001239FF00DF00D11246E1755\r\n:105770007F0718F44FEF420F04C02F3F39F091E03C\r\n:10578000920F491740F78FEF890F08958FEF089513\r\n:105790000F93CF93DF93D72FC82F47FD4195E8E3B1\r\n:1057A000F0E0CF01841B910947FD9395889FB001DC\r\n:1057B000899F700D700D1124229FC001239F900DB1\r\n:1057C000900D1124860F971F0E94972B682F660F4C\r\n:1057D000860F682F600F7D2F8C2FDF91CF910F9157\r\n:1057E000089520E030E0869F212D969F200D311DE9\r\n:1057F0001124C9010895CF92DF92EF92FF920F9387\r\n:105800001F93CF93DF93F62E472FE82FF0E071110F\r\n:1058100006C0EC5AF74F8491782F682F73C0272F5A\r\n:1058200030E0EC5AF74FE491FE2F0E2F10E056E0D7\r\n:10583000659FC0011124CFEFD0E0BE010E94AD31C1\r\n:105840005BEA5603C001579F900D11248F0D911DE7\r\n:105850008F0D911D982F990F980F7E01E21AF30A70\r\n:10586000E09ED001E19EB00DF09EB00D11248B2F73\r\n:10587000499FA0011124452F55277E01E41AF50AFE\r\n:10588000E09EA001E19E500DF09E500D11246E018E\r\n:10589000C91AD108C29E7001C39EF00CD29EF00CB2\r\n:1058A00011242F2D3327C21BD30BC09F9001C19F02\r\n:1058B000300DD09F300D1124932F6230710591F07F\r\n:1058C00048F461157105E1F061307105B9F49E2F5E\r\n:1058D000E52F16C06430710569F040F0663071053F\r\n:1058E00079F00CC09E2FEB2F832F0AC0EB2F8F2F48\r\n:1058F000952F06C09B2F8E2FE32F02C09B2F852F45\r\n:105900007E2F692FDF91CF911F910F91FF90EF9024\r\n:10591000DF90CF900895DF92EF92FF920F931F9345\r\n:10592000CF93DF93EC01FC01E35BFC4F9081692393\r\n:1059300081F1D09054070091550710915307E12E43\r\n:10594000F12C0E94E830282FC7018C549F4F68E645\r\n:1059500071E00E94C1318E199F0997FD03969595BC\r\n:105960008795959587952370612F289F600D112449\r\n:105970007D2D802F0E94FB2B462F282F672FCE01D5\r\n:10598000DF91CF911F910F91FF90EF90DF900C94DA\r\n:105990005E2BDF91CF911F910F91FF90EF90DF90E1\r\n:1059A00008951F93CF93DF93FC01E35BFC4F2081AD\r\n:1059B0006223A9F0EC010E94E830182F0E94E83021\r\n:1059C000612F782F809155070E94FB2B462F282F9F\r\n:1059D000672FCE01DF91CF911F910C945E2BDF9149\r\n:1059E000CF911F9108951F920F920FB60F9211241D\r\n:1059F0002F933F934F935F936F937F938F939F93D7\r\n:105A0000AF93BF93CF93DF93EF93FF93C091E900E0\r\n:105A1000CF708091EC00D82FD17080FDD0E810922B\r\n:105A2000E9008091F000877F8093F00078940E94D5\r\n:105A3000F4231092E9008091F00088608093F000D8\r\n:105A4000CD2BCF70C093E900FF91EF91DF91CF9103\r\n:105A5000BF91AF919F918F917F916F915F914F9186\r\n:105A60003F912F910F900FBE0F901F901895E8ED6A\r\n:105A7000F0E080818C7F80831092E2001092DA0047\r\n:105A80001092E100A0EEB0E08C9181608C93808157\r\n:105A90008F77808319BCA7EDB0E08C918E7F8C93BB\r\n:105AA00080818F7E80831092980808952091E40071\r\n:105AB0003091E50095E64091EC00842F817040FF25\r\n:105AC00023C08091E80080FD1DC080911B078823C2\r\n:105AD00099F0853099F08091EB0085FD11C04091DF\r\n:105AE000E4005091E5002417350729F3915011F097\r\n:105AF0009A01E1CF84E0089582E0089583E008955B\r\n:105B000081E0089580E008954091E80042FFDDCFF4\r\n:105B1000089580911D0787FF11C08091E80082FDE4\r\n:105B200005C080911B078111F8CF11C08091E8005A\r\n:105B30008B770BC080911B07882349F08091E80088\r\n:105B400080FFF8CF8091E8008E778093E800089579\r\n:105B5000982F973068F59093E900981739F0709175\r\n:105B6000EC002091ED005091F00003C0242F762F1F\r\n:105B700050E021FD02C09F5FECCF3091EB003E7FF3\r\n:105B80003093EB003091ED003D7F3093ED0030918C\r\n:105B9000EB0031603093EB007093EC002093ED004C\r\n:105BA0005093F0002091EE0027FDE5CF80E00895AE\r\n:105BB0008F708093E90081E00895CF92DF92EF9299\r\n:105BC000FF920F931F93CF93DF93C8EDD0E08881AE\r\n:105BD0008F7E8883E7EDF0E080818160808381E0C3\r\n:105BE0008093980888818C7F888302EE10E0D8012A\r\n:105BF0001C921092DA0081EEC82ED12CD6011C9294\r\n:105C000088818F77888388818068888388818F7D69\r\n:105C1000888380818068808319BC10921B07109252\r\n:105C20001C0710921A071092190790EEE92EF12C1A\r\n:105C3000F70180818B7F808388818160888342E047\r\n:105C400060E080E00E94A82DD6018C918E7F8C931D\r\n:105C5000F801808181608083808188608083D701A2\r\n:105C60008C918E7F8C93888180618883DF91CF9126\r\n:105C70001F910F91FF90EF90DF90CF9008951F92AA\r\n:105C80000F920FB60F9211242F933F934F935F9370\r\n:105C90006F937F938F939F93AF93BF93EF93FF93F4\r\n:105CA0008091E10082FF09C08091E20082FF05C07F\r\n:105CB0008091E1008B7F8093E1008091DA0080FF8A\r\n:105CC0002AC08091D80080FF26C08091DA008E7FA4\r\n:105CD0008093DA008091D90080FF18C088E189BDE7\r\n:105CE0008AE189BD09B400FEFDCF81E080931B07E6\r\n:105CF0008091980881110FC00E94372D0E94DD2DE0\r\n:105D00008091E20084608093E20005C019BC10928B\r\n:105D10001B07109298088091E10080FF17C08091C6\r\n:105D2000E20080FF13C08091E2008E7F8093E2004A\r\n:105D30008091E20080618093E2008091D8008062CF\r\n:105D40008093D80019BC85E080931B078091E10007\r\n:105D500084FF2EC08091E20084FF2AC088E189BDC3\r\n:105D60008AE189BD09B400FEFDCF8091D8008F7D06\r\n:105D70008093D8008091E1008F7E8093E100809134\r\n:105D8000E2008F7E8093E2008091E2008160809348\r\n:105D9000E20080911C07882311F084E007C0809105\r\n:105DA000E30087FD02C081E001C083E080931B0710\r\n:105DB0008091E10083FF27C08091E20083FF23C030\r\n:105DC0008091E100877F8093E10082E080931B0750\r\n:105DD00010921C078091E1008E7F8093E1008091FA\r\n:105DE000E2008E7F8093E2008091E20080618093E8\r\n:105DF000E20042E060E080E00E94A82D8091F00087\r\n:105E000088608093F000FF91EF91BF91AF919F91D7\r\n:105E10008F917F916F915F914F913F912F910F9053\r\n:105E20000FBE0F901F9018952091230730912407E3\r\n:105E30002617370748F06115710539F42091E800FD\r\n:105E40002E772093E80001C0B901FC0120E0611524\r\n:105E5000710569F180911B078823E1F18530E1F13B\r\n:105E60008091E80083FD3AC08091E80082FD2CC05B\r\n:105E70008091E80080FFEBCF8091F2009091F300D9\r\n:105E80006115710551F08830910538F42191209306\r\n:105E9000F100615071090196F3CF21E0089709F0F4\r\n:105EA00020E08091E8008E778093E800D0CF211128\r\n:105EB000D1CF0AC080911B07882361F0853061F043\r\n:105EC0008091E80083FD0AC08091E80082FFF2CF54\r\n:105ED00080E0089582E0089583E0089581E00895C8\r\n:105EE000882341F080959091F10689238093F106F3\r\n:105EF0000C94881C0895882339F09091F106892B21\r\n:105F00008093F1060C94881C0895882309F458C0E6\r\n:105F1000682F823869F40E94812A81FF51C069E3A9\r\n:105F20008DE296E00E94D21B0E94881C69E30EC09D\r\n:105F3000833891F40E94812A80FF42C063E58DE29C\r\n:105F400096E00E94D21B0E94881C63E58DE296E0D9\r\n:105F50000E94AA1B0C94881C843869F40E94812A30\r\n:105F600082FF2EC067E48DE296E00E94D21B0E9461\r\n:105F7000881C67E4EBCF8CEF860F813A38F380E220\r\n:105F8000860F883070F4677081E090E001C0880F60\r\n:105F90006A95EAF780959091F10689238093F1063E\r\n:105FA000D9CF8BE5860F833020F480E090E00C940D\r\n:105FB0006B2A685A673120F480E090E00C94552AEF\r\n:105FC0000895CF93882309F4B5C0C82F8238B1F45F\r\n:105FD0000E94812A81FDAEC069E38DE296E00E94B5\r\n:105FE000D21B0E94881C2FEF80E792E02150804056\r\n:105FF0009040E1F700C0000069E317C08338E1F486\r\n:106000000E94812A80FD96C063E58DE296E00E94A1\r\n:10601000D21B0E94881C2FEF80E792E02150804025\r\n:106020009040E1F700C0000063E58DE296E00E9439\r\n:10603000AA1BCF910C94881C8438B1F40E94812A49\r\n:1060400082FD78C067E48DE296E00E94D21B0E9438\r\n:10605000881C2FEF80E792E0215080409040E1F7CC\r\n:1060600000C0000067E4E1CF8CEF8C0F813AB8F5F7\r\n:10607000809148018823E1F080910A0487FF18C0CD\r\n:10608000EC2FE695E695E695F0E0E35DF94F828129\r\n:10609000282F30E04C2F477081E090E002C0880F3D\r\n:1060A000991F4A95E2F782239323892B59F411C053\r\n:1060B000EFE2F6E08191C81729F026E0E533F20718\r\n:1060C000C9F707C06C2F8DE296E00E94AA1B0E94C0\r\n:1060D000881C6C2F8DE296E00E94D21BAACF80E232\r\n:1060E0008C0F883068F4C77081E090E001C0880FA1\r\n:1060F000CA95EAF79091F106892B8093F10699CF22\r\n:10610000EBE5EC0FE33040F4F0E0E254FC4F80812B\r\n:1061100090E0CF910C946B2AC85AC73158F4EC2FF9\r\n:10612000F0E0EE0FFF1FEF53FC4F80819181CF9184\r\n:106130000C94552ACF9108958F929F92AF92BF925F\r\n:10614000CF92DF92EF92FF92CF93DF93EC016881C1\r\n:1061500079818A819B81611571058105910521F401\r\n:1061600064E279ED8BE597E02DE133EF41E050E01B\r\n:106170000E944A3149015A019B01AC01A7EAB1E4EE\r\n:106180000E9469316B017C01ACEEB4EFA501940172\r\n:106190000E947731DC01CB018C0D9D1DAE1DBF1D12\r\n:1061A000B7FF03C00197A109B04888839983AA83E8\r\n:1061B000BB839F77DF91CF91FF90EF90DF90CF90DF\r\n:1061C000BF90AF909F908F9008950E949C3008954B\r\n:1061D00080E091E00E949C300895A0E0B0E08093C0\r\n:1061E000000190930101A0930201B093030108956F\r\n:1061F000DC01CB01FC01F999FECF06C0F2BDE1BD87\r\n:10620000F89A319600B40D9241505040B8F7089575\r\n:10621000F999FECF92BD81BDF89A992780B508956E\r\n:10622000A8E1B0E042E050E00C94FA30DC01A40FA9\r\n:10623000B51F4150504048F0CB01840F951F2E915F\r\n:106240000E94273141505040D0F70895262FF999E8\r\n:10625000FECF92BD81BDF89A019700B4021639F0C5\r\n:106260001FBA20BD0FB6F894FA9AF99A0FBE089596\r\n:106270000396272F0E9427310E942631252F0E9446\r\n:106280002731242F0C9427310196272F0E94273184\r\n:106290000C942631052E97FB1EF400940E94613168\r\n:1062A00057FD07D00E947C3107FC03D04EF40C94BC\r\n:1062B000613150954095309521953F4F4F4F5F4F3D\r\n:1062C000089590958095709561957F4F8F4F9F4F62\r\n:1062D00008950E949E31A59F900DB49F900DA49F9C\r\n:1062E000800D911D11240895B7FF0C9469310E940F\r\n:1062F0006931821B930B0895A1E21A2EAA1BBB1BC6\r\n:10630000FD010DC0AA1FBB1FEE1FFF1FA217B30781\r\n:10631000E407F50720F0A21BB30BE40BF50B661F97\r\n:10632000771F881F991F1A9469F76095709580955B\r\n:1063300090959B01AC01BD01CF010895A29FB001D2\r\n:10634000B39FC001A39F700D811D1124911DB29FA9\r\n:10635000700D811D1124911D0895AA1BBB1B51E1D5\r\n:1063600007C0AA1FBB1FA617B70710F0A61BB70BC5\r\n:10637000881F991F5A95A9F780959095BC01CD016A\r\n:10638000089597FB072E16F4009407D077FD09D0E7\r\n:106390000E94AD3107FC05D03EF4909581959F4F4A\r\n:1063A0000895709561957F4F0895EE0FFF1F05903A\r\n:1063B000F491E02D0994FB01DC0102C001900D92E3\r\n:1063C00041505040D8F70895FB01DC014150504046\r\n:1063D00048F001900D920020C9F701C01D92415074\r\n:0A63E0005040E0F70895F894FFCF55\r\n:1063EA0001000000FFFF033D8EFFB07F958EFFB0D6\r\n:1063FA007F958EFFB07F958EFFB07FCF1A0E1BCE92\r\n:10640A001A0A1B061B3C011D0000003C0119000072\r\n:10641A00003C010A00000000510025012D01500036\r\n:10642A002B010152003101B00100FF00993700AA87\r\n:10643A0056008EFFB073797374656D37362F6C61B1\r\n:10644A00756E63685F68656176795F3100302E37F3\r\n:10645A002E3130342D3138382D6737613635356570\r\n:10646A003533306200F0F1F2F3F4F5929495969791\r\n:10647A00C06665646362616707060504C660C70291\r\n:10648A0007040603090209040303080203030301BC\r\n:10649A00260C0D0E10110F1213172122250021317F\r\n:1064AA00426384B040226D2507030796067707905A\r\n:1064BA0007B00745464748494A4B4C4D4E4F505145\r\n:1064CA005244434241403F3E3D3C3B3A39383727EC\r\n:1064DA0028292A2B2C2D2E2F3031323334262524ED\r\n:1064EA00232221201F1E1D1C1B1A530C0B0A0908EC\r\n:1064FA000706050403020100360D0E0F10111912CA\r\n:10650A001314151617183500000068676600000096\r\n:10651A0000000065000000006162630000000000E6\r\n:10652A00006400000000605F5E0000000000005D83\r\n:10653A0000000000005A5B0000000000005C000040\r\n:10654A0000005459580000000000005700000000E5\r\n:10655A000055000000000000005600A9289D289060\r\n:10656A002886287D28732869285F2855284B2841C2\r\n:10657A002837282828253232323C324632553269A9\r\n:10658A0032783281328E329F32A932B332B31EA2AE\r\n:10659A001E951E8B1E811E781E6E1E641E5A1E506C\r\n:1065AA001E461E3C1E321E251E23142F1439144368\r\n:1065BA00144D14571461146B1475147F14891493B1\r\n:1065CA00149D14A714B314B30AA40A980A8E0A8451\r\n:1065DA000A7A0A700A660A5C0A520A480A3E0A34A9\r\n:1065EA000A2A0A200A20002A0034003E00480052E3\r\n:1065FA00005C00660070007A0084008E009800A497\r\n:10660A0000B300E02DD632C732C228CC28D628D60D\r\n:10661A001ECC1EC21EC214CC14D614E019E00AD62F\r\n:10662A000ACC0AC20AC200CC00D600E00004040464\r\n:10663A000404040404040404040404040404040410\r\n:10664A000404040404040404040404040404040400\r\n:10665A0004040404040404040404040404040404F0\r\n:10666A0004040404040404040404040404040404E0\r\n:10667A0004040404040404040404040404040404D0\r\n:10668A0004040404040404040404040404040404C0\r\n:10669A00040404040404003131295A1B750A818256\r\n:1066AA0083E200E900EA00B500B600B700CD008336\r\n:1066BA0001CC008A019201940121022302240225BD\r\n:1066CA0002260227022A02B300B4006F00700000FB\r\n:10F000004BC0000074C0000072C0000070C000005F\r\n:10F010006EC000006CC000006AC0000068C0000044\r\n:10F0200066C0000064C00000A9C5000060C0000008\r\n:10F030005EC000005CC000005AC0000058C0000064\r\n:10F0400056C0000054C0000052C0000050C0000074\r\n:10F05000E5C100004CC000004AC0000048C00000EC\r\n:10F0600046C0000044C0000042C0000040C0000094\r\n:10F070003EC000003CC000003AC0000038C00000A4\r\n:10F0800036C0000034C0000032C0000030C00000B4\r\n:10F090002EC000002CC0000011241FBECFEFD0E115\r\n:10F0A000DEBFCDBF83E090E050D480FD04C084B7C4\r\n:10F0B0008D7F84BF03C084B7877F84BFE0E0F0E02A\r\n:10F0C0008591949111E0A0E0B1E0E8EAFEEF02C082\r\n:10F0D00005900D92A239B107D9F721E0A2E9B1E07C\r\n:10F0E00001C01D92AF3AB207E1F736D1DBC688CF37\r\n:10F0F0008823B9F02091F2003091F300232B69F4BA\r\n:10F100009091E8009B7F9093E8009091E80092FD39\r\n:10F1100006C09EB39111F9CF04C09091F1008150C7\r\n:10F12000E7CF0895EAE9F1E0358124819381828176\r\n:10F130009093940180939501C901909392018093DB\r\n:10F1400093010895CF92DF92EF92FF921F93CF9396\r\n:10F15000DF9300D01F92CDB7DEB79091A4018091CC\r\n:10F160009A019923D1F0843049F480919B01811157\r\n:10F1700008C080919C018F3F21F455C0853009F46F\r\n:10F18000A2C08AE08093000183E08093A201809175\r\n:10F19000EB0080628093EB00D4C0843009F443C05C\r\n:10F1A00028F4813051F08330D9F0CBC0853009F498\r\n:10F1B0008AC0863009F4B2C0C4C010919B011230DD\r\n:10F1C00008F0BFC0AFDF111109C0609194017091C8\r\n:10F1D000950120919601822F90E064D385E007C0CD\r\n:10F1E00080919B01982F9D7F29F49CDF89E080937B\r\n:10F1F0000001A7C0813009F0A4C0E0E0F0E08491F4\r\n:10F200008F3F59F010929601F0939501E09394018D\r\n:10F210008AE08093000185E092C03196E11520EFED\r\n:10F22000F20769F78EC080919B01833091F581E0F0\r\n:10F230008093A301E091A001F091A10180919C0134\r\n:10F24000309761F0813009F07CC090919F018091EE\r\n:10F250009E01909397018093980173C0811111C012\r\n:10F2600082E49CED9093B0018093AF019CE088E133\r\n:10F270000FB6F894A895809360000FBE909360003D\r\n:10F2800060C085919491019609F05BC010920101D4\r\n:10F2900058C0811156C080919C018F3F09F051C028\r\n:10F2A000C12CD12C7601C701B601FCD28FEFD81A40\r\n:10F2B000E80AF80AC11420EFD206E104F10499F734\r\n:10F2C0001092A4013EC08091020190910301A0918F\r\n:10F2D000040189839A83AB8380919C0190919B0167\r\n:10F2E000911107C0833038F5FE01E80FF11D8181CF\r\n:10F2F00012C0913031F5813359F020F48033D9F4C4\r\n:10F3000088E509C0803631F08136A9F482E803C06F\r\n:10F310008EE101C086E98093990113C080919B0121\r\n:10F32000833079F480919C0181110BC080919D0103\r\n:10F330008093960106C08AE08093000188E0809364\r\n:10F34000A2010F900F900F90DF91CF911F91FF902E\r\n:10F35000EF90DF90CF90089584B7877F84BF0FB67A\r\n:10F36000F894A89580916000886180936000109265\r\n:10F3700060000FBE90E080E80FB6F89480936100C3\r\n:10F38000909361000FBEC1E0C5BF82E085BF559A72\r\n:10F390005D9A819AD8D36E9A769A3E9A469AC0938D\r\n:10F3A0006F0083E080938100769846987894C0E05F\r\n:10F3B000D0E080910101882361F152D58FB1827034\r\n:10F3C00090910001923009F5C93893E1D907E8F02E\r\n:10F3D000882369F38FEC97E00197F1F700C00000F4\r\n:10F3E0005AD36E9876983E98469810926F00109275\r\n:10F3F000810081E085BF15BE11BA10BA1BB81AB8DA\r\n:10F40000E0919701F09198010995882381F2219666\r\n:10F41000D0CF8091A3018111D0CFDCCF1F920F926A\r\n:10F420000FB60F9211248F9380E48CB986B98F9117\r\n:10F430000F900FBE0F901F9018955F926F927F9262\r\n:10F440008F929F92AF92BF92CF92DF92EF92FF92F4\r\n:10F450000F931F93CF93DF938091A7018F77813212\r\n:10F4600009F0DEC180E48CB986B98091AD0190913C\r\n:10F47000AE019093A1018093A0018091A8018330F7\r\n:10F4800009F488C158F48130D1F0823009F0C8C144\r\n:10F490008091E800877F8093E800F0C0853009F410\r\n:10F4A0009FC108F495C1863009F0BAC18091E80087\r\n:10F4B000877F8093E80082E080930001A1C1809162\r\n:10F4C000E800877F8093E8008091A301882319F0EA\r\n:10F4D00039DE1092A3018091A0019091A1010097C3\r\n:10F4E00051F12091E80022FD04C02EB32111F9CF83\r\n:10F4F00097C12091F10020939A0101979093A10167\r\n:10F500008093A001EBE9F1E08091F2009091F3008B\r\n:10F51000892B81F08091F10081938091A0019091DD\r\n:10F52000A10101979093A1018093A00121E0E03A0D\r\n:10F53000F20751F707DE80910001853009F096C08F\r\n:10F540008091A0019091A101892B21F482E0809308\r\n:10F5500000018CC08AE1CCDD0091940110919501ED\r\n:10F56000802F8F71C5DDC0919201D09193012196BA\r\n:10F57000C01BD10B80919B01811166C0D695C795A8\r\n:10F58000680180919601E82EF12C7D2C682E5F2C6D\r\n:10F5900010E02097C9F18091F2009091F300892B3F\r\n:10F5A000A9F021974091F1005091F100C701B601F7\r\n:10F5B000B9D11F5F4601570182E0880E911CA11C42\r\n:10F5C000B11C75016401103871F40FC08091E8001E\r\n:10F5D0008B7F8093E8008091E80082FDE2CF8EB3BC\r\n:10F5E0008111F9CF1DC12097A1F6602F772D862DAF\r\n:10F5F000952D78D1209769F2C501B40153D1082D1A\r\n:10F60000792C6A2C5B2CC4CF80919201909193014C\r\n:10F61000909395018093940127C08091F20090917E\r\n:10F62000F300892BA1F021976091F1008091940162\r\n:10F630009091950125D48091940190919501019626\r\n:10F640009093950180939401209739F70DC0809194\r\n:10F65000E8008B7F8093E8008091E80082FDE3CF93\r\n:10F660008EB38111F9CFDCC080E142DD8091E800EA\r\n:10F670008B7F8DC08EB3882309F4D2C08091E800BF\r\n:10F6800080FFF8CF80910001893091F08A3059F4E1\r\n:10F6900080919B01813039F4909194018091950182\r\n:10F6A0009093F10002C0809199018093F1006CC0A9\r\n:10F6B0002091940130919501C0919201D0919301D4\r\n:10F6C0002196C21BD30B80919B01811131C0D6952D\r\n:10F6D000C795C90120919601A22FB0E02197F8F0BB\r\n:10F6E0002091F2003091F3002032310559F0FC01F5\r\n:10F6F000259134912093F1003093F1000296A11DE1\r\n:10F70000B11DECCF2091E8002E7F2093E8002091DE\r\n:10F71000E80020FDECCF2EB32111F9CF81C08091FC\r\n:10F72000920190919301909395018093940129C047\r\n:10F73000823039F5209729F18091F2009091F30001\r\n:10F74000809791F0809194019091950191D380934D\r\n:10F75000F10080919401909195010196909395010B\r\n:10F76000809394012197E6CF8091E8008E7F80936B\r\n:10F77000E8008091E80080FDE5CF8EB38111F9CFDC\r\n:10F780004FC082E0809300018091E8008E7F8093DB\r\n:10F79000E80036C08091E800877F8093E800809180\r\n:10F7A000E80080FD04C08EB38111F9CF39C080918B\r\n:10F7B000A2018093F1001092F1001092F1001092DA\r\n:10F7C000F100809100018093F1001092F100DCCFF4\r\n:10F7D0008091E800877F8093E8001092A20110C01A\r\n:10F7E0008091E800877F8093E8008091E80080FDA9\r\n:10F7F00004C08EB38111F9CF13C08091000155CFA1\r\n:10F80000DF91CF911F910F91FF90EF90DF90CF90FC\r\n:10F81000BF90AF909F908F907F906F905F901EC130\r\n:10F82000DF91CF911F910F91FF90EF90DF90CF90DC\r\n:10F83000BF90AF909F908F907F906F905F90089552\r\n:10F84000292F30E02230310559F02330310569F09D\r\n:10F8500021303105F9F482E190E020E831E01EC06A\r\n:10F860008BE190E025E631E019C0882349F0813032\r\n:10F8700061F0823079F486E490E025E031E00EC05A\r\n:10F8800084E090E021E631E009C082E190E02DE4DF\r\n:10F8900031E004C080E090E020E030E0FA01318304\r\n:10F8A00020830895611520EF72078105910510F4FA\r\n:10F8B00021E0611120E020FF14C02FB7F89407B6B3\r\n:10F8C00000FCFDCFF999FECF33E0FB0130935700E8\r\n:10F8D000E89507B600FCFDCF91E190935700E895BD\r\n:10F8E0002FBF0895611520EF72078105910510F46F\r\n:10F8F00021E0611120E020FF14C02FB7F89407B673\r\n:10F9000000FCFDCFF999FECF35E0FB0130935700A5\r\n:10F91000E89507B600FCFDCF91E190935700E8957C\r\n:10F920002FBF089507B600FCFDCFF999FECF21E067\r\n:10F93000FB010A0120935700E8951124089521E264\r\n:10F94000FC01209357008491089529E0FC01209345\r\n:10F95000570084910895E1E0F0E089E0809357003A\r\n:10F96000849108959FB7F89407B600FCFDCFF999EC\r\n:10F97000FECF809529E0E1E0F0E0082E20935700CB\r\n:10F98000E8959FBF08952091AD013091AE012617F3\r\n:10F99000370748F06115710539F42091E8002E7F92\r\n:10F9A0002093E80001C0B901FC0120E06115710558\r\n:10F9B00061F18EB38823D9F18530D9F18091E800C7\r\n:10F9C00083FD39C08091E80082FD2BC08091E80062\r\n:10F9D00080FFECCF8091F2009091F30061157105EA\r\n:10F9E00051F08032910538F421912093F10061505B\r\n:10F9F00071090196F3CF21E0809709F020E0809112\r\n:10FA0000E8008E7F8093E800D1CF2111D2CF09C0CA\r\n:10FA10008EB3882361F0853061F08091E80083FD2A\r\n:10FA20000AC08091E80082FFF3CF80E0089582E071\r\n:10FA3000089583E0089581E00895EBEEF0E0808181\r\n:10FA400081608083EDEEF0E010826093EC004083F3\r\n:10FA50008091EE00881F8827881F08958091A70154\r\n:10FA600087FF0FC08091E80082FD04C08EB3811132\r\n:10FA7000F9CF10C08091E8008B7F0AC08EB3882335\r\n:10FA800049F08091E80080FFF9CF8091E8008E7FF7\r\n:10FA90008093E800089565D06CD0E0EEF0E08081BE\r\n:10FAA00081608083E8EDF0E080818F77808319BCEE\r\n:10FAB000A7EDB0E08C918E7F8C9380818F7E8083C8\r\n:10FAC0001092A60108950F931F93CF93DF9349D00F\r\n:10FAD00050D0C8EDD0E088818F7788838881806896\r\n:10FAE000888388818F7D8883E7EDF0E0808180685E\r\n:10FAF000808319BC1EBA1092A50100EE10E0F80137\r\n:10FB000080818B7F808388818160888342E260E08E\r\n:10FB100080E093DFE1EEF0E080818E7F8083E2EE93\r\n:10FB2000F0E0808181608083808188608083F8013B\r\n:10FB300080818E7F8083888180618883DF91CF91EF\r\n:10FB40001F910F910895E8EDF0E080818F7E808312\r\n:10FB5000E7EDF0E080818160808381E08093A60101\r\n:10FB6000B2CFE8EDF0E080818C7F80831092E200DC\r\n:10FB700008951092DA001092E10008951F920F92FA\r\n:10FB80000FB60F9211242F933F934F935F936F9370\r\n:10FB90007F938F939F93AF93BF93EF93FF93809146\r\n:10FBA000DA0080FF1BC08091D80080FF17C08091D1\r\n:10FBB000DA008E7F8093DA008091D90080FF0BC03D\r\n:10FBC00088E189BD8AE189BD09B400FEFDCF81E0ED\r\n:10FBD0008EBB45D103C019BC1EBA41D18091E10052\r\n:10FBE00080FF17C08091E20080FF13C08091E20087\r\n:10FBF0008E7F8093E2008091E20080618093E2003A\r\n:10FC00008091D80080628093D80019BC85E08EBBBB\r\n:10FC100026D18091E10084FF2EC08091E20084FF14\r\n:10FC20002AC088E189BD8AE189BD09B400FEFDCF03\r\n:10FC30008091D8008F7D8093D8008091E1008F7EE5\r\n:10FC40008093E1008091E2008F7E8093E2008091BA\r\n:10FC5000E20081608093E2008091A501882311F089\r\n:10FC600084E007C08091E30087FD02C081E001C00D\r\n:10FC700083E08EBBF4D08091E10083FF21C08091AE\r\n:10FC8000E20083FF1DC08091E100877F8093E10047\r\n:10FC900082E08EBB1092A5018091E1008E7F80935F\r\n:10FCA000E1008091E2008E7F8093E2008091E2008B\r\n:10FCB00080618093E20042E260E080E0BEDECFD06F\r\n:10FCC000FF91EF91BF91AF919F918F917F916F9134\r\n:10FCD0005F914F913F912F910F900FBE0F901F900A\r\n:10FCE00018951F93CF93DF9300D0CDB7DEB7E7EA27\r\n:10FCF000F1E08091F100819381E0EF3AF807C9F7D4\r\n:10FD00009CDB8091E80083FF96C08091A7019091D1\r\n:10FD1000A8019630E1F128F4992351F09530B1F023\r\n:10FD20008AC0983009F455C0993009F464C083C082\r\n:10FD30008D7F803809F07FC08091E800877F8093B5\r\n:10FD4000E8001092F1001092F1004EC0811173C0D2\r\n:10FD50001091A9011F778091E3008078812B809317\r\n:10FD6000E3008091E800877F8093E80077DE809150\r\n:10FD7000E80080FFFCCF8091E30080688093E3007F\r\n:10FD8000111102C082E001C083E08EBB54C08058D4\r\n:10FD9000823008F050C06091AB017091AC01AE01AF\r\n:10FDA0004F5F5F4F8091A9019091AA0149DDBC018D\r\n:10FDB000892B09F440C09091E800977F9093E80068\r\n:10FDC00089819A81E0DD8091E8008B7F8093E80053\r\n:10FDD00032C0803881F58091E800877F8093E80009\r\n:10FDE0008091A5018093F1008091E8008E7F80933F\r\n:10FDF000E80034DE20C081111EC08091A9019091DD\r\n:10FE0000AA0199270297BCF48091E800877F80932C\r\n:10FE1000E8008091A9018093A50120DE8091A501D1\r\n:10FE2000811106C08091E30087FD02C081E001C01E\r\n:10FE300084E08EBB14D08091E80083FF0AC08091DB\r\n:10FE4000E800877F8093E8008091EB0080628093D8\r\n:10FE5000EB000F900F90DF91CF911F9108950895BF\r\n:10FE60008EB3882321F08091E80083FD3ACF089576\r\n:10FE7000F999FECF92BD81BDF89A992780B5089572\r\n:10FE8000262FF999FECF92BD81BDF89A019700B453\r\n:10FE9000021639F01FBA20BD0FB6F894FA9AF99AF3\r\n:08FEA0000FBE0895F894FFCF96\r\n:10FEA800020120DCFB4603730079007300740065CF\r\n:10FEB800006D00370036002F006C00610075006E81\r\n:10FEC80000630068005F00680065006100760079E3\r\n:10FED800005F003100200042006F006F0074006C6A\r\n:10FEE800006F006100640065007200000012035397\r\n:10FEF8000079007300740065006D0037003600005B\r\n:10FF0800000403090409021B0001010080320904EE\r\n:10FF1800000000FE0102000921030000000C10018E\r\n:10FF28001201100100000020EB03F92F000001026C\r\n:02FF38000001C6\r\n:10FFA00081CCA0CCBFCCCBCCD0CCD5CCDBCC0895F5\r\n:08FFB0000895089508950895D5\r\n:10FFE000DFCFDFCFDFCFDFCFDFCFDFCFDFCFDFCFA1\r\n:08FFF000DFCFDFCFDFCFDFCF51\r\n:08FFF80000F0000010DFFBDC4B\r\n:040000030000F00009\r\n:00000001FF\r\n"
  },
  {
    "path": "data/system76_launch_lite_1_default.hex",
    "content": ":100000000C941B030C9462030C9462030C94620323\r\n:100010000C9462030C9462030C9462030C946203CC\r\n:100020000C9462030C9462030C941A280C94CE2650\r\n:100030000C94421C0C9462030C9462030C946203B3\r\n:100040000C9462030C9462030C9462030C9462039C\r\n:100050000C9462030C94101C0C9462030C946203C5\r\n:100060000C9462030C9462030C9462030C9462037C\r\n:100070000C9462030C9462030C9462030C9462036C\r\n:100080000C9462030C9462030C9462030C9462035C\r\n:100090000C9462030C946203BD06C606F1062E079B\r\n:1000A0006C07AE07F107F407F707FA07FD0700082A\r\n:1000B0000308060809080C081108140817081C088A\r\n:1000C0002108240827082C086808A408A708AC08F9\r\n:1000D000B708BA08C508C808D308D608E108E40874\r\n:1000E000EF08F5086509AA09AA0AB00AB50A520C70\r\n:1000F000520CBE0A520C520CC80AD90A000B1F0B34\r\n:10010000400B720BA10BCA0BFD0BF50B480CF91839\r\n:10011000F918331933198619291B291B291BA21910\r\n:10012000801A911A911AFC1DFC1D0F1E0F1E051E30\r\n:100130000F1E0F1E0F1EFC1DFC1D0A1E0F1E0F1E84\r\n:100140000A1EE5240C25B0260C25B02658257B2553\r\n:10015000B0266D267D2629001E001F0020002100EC\r\n:100160002200230024002500260027002D002E0059\r\n:100170002A002B0014001A000800150017001C00AC\r\n:1001800018000C00120013002F003000310039005D\r\n:1001900004001600070009000A000B000D000E0005\r\n:1001A0000F003300340028004A00E1001D001B004E\r\n:1001B0000600190005001100100036003700380055\r\n:1001C000E50052004B00E000E2000151E3002C008A\r\n:1001D0004D002C00E400E6000151500051004F009A\r\n:1001E0004E0035003A003B003C003D003E003F0021\r\n:1001F0004000410042004300440045004C004600DE\r\n:10020000010001000100010001004A004E004B0006\r\n:100210004D000100CB5CCA5CC35C01000100010021\r\n:100220000100010001005000510052004F00010088\r\n:1002300001000100AE000100010001000100010009\r\n:1002400001000100010001000100010001004B005C\r\n:10025000A90001000100010001000100A800010047\r\n:100260000100010001004A004E004D00AA000100FB\r\n:100270000100010001000100010001000100010076\r\n:100280000100010001000100010001000100010066\r\n:100290000100010001000100010001000100010056\r\n:1002A0000100010001000100010001000100010046\r\n:1002B0000100010001000100010001000100010036\r\n:1002C0000100010001000100010001000100010026\r\n:1002D0000100010001000100010001000100010016\r\n:1002E0000100010001000100010001000100010006\r\n:1002F00001000100010001000100010001000100F6\r\n:1003000001000100010001000100010001000100E5\r\n:1003100001000100010001000100010001000100D5\r\n:1003200001000100010001000100010001000100C5\r\n:1003300001000100010001000100010001000100B5\r\n:1003400001000100010001000100010001000100A5\r\n:100350000100010001000100010001000100010095\r\n:100360000100010001000100010001000100010085\r\n:100370000100010001000100010001000100010075\r\n:100380000100010001000001010101010101010161\r\n:100390000202020202020202020303030303030336\r\n:1003A0000304040404040404050505050506060603\r\n:1003B0000606070707070708080808090909090AC0\r\n:1003C0000A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F65\r\n:1003D0000F101011111112121313141415151616F3\r\n:1003E0001717181819191A1A1B1B1C1D1D1E1E1F62\r\n:1003F0002020212222232424252626272829292AB1\r\n:100400002B2C2D2D2E2F30313232333435363738D8\r\n:10041000393A3B3C3D3E3F404142434445464748D4\r\n:10042000494A4C4D4E4F50515354555658595A5BAA\r\n:100430005D5E5F616264656668696B6C6D6F70724A\r\n:10044000737577787A7B7D7E8082838587888A8CB6\r\n:100450008E8F91939596989A9C9EA0A2A3A5A7A9EA\r\n:10046000ABADAFB1B3B5B7BABCBEC0C2C4C6C9CBE1\r\n:10047000CDCFD1D4D6D8DBDDDFE2E4E7E9EBEEF097\r\n:10048000F3F5F8FAFDFF05010980A10185031901C3\r\n:100490002AB700150126B700950175108100C00527\r\n:1004A0000C0901A101850419012AA002150126A049\r\n:1004B00002950175108100C005010906A10185059D\r\n:1004C000050719E029E71500250195087501810246\r\n:1004D0000507190029EF1500250195F07501810226\r\n:1004E0000508190129059505750191029501750306\r\n:1004F0009101C00660FF0961A1010962150026FF94\r\n:10050000009520750881020963150026FF009520DB\r\n:1005100075089102C005010906A101050719E02926\r\n:10052000E71500250195087501810295017508817F\r\n:10053000010507190029FF150026FF00950675081B\r\n:10054000810005081901290595057501910295019C\r\n:1005500075039101C009025B00030100A0FA0904C0\r\n:1005600000000103010100092111010001224000E6\r\n:100570000705810308000A090401000203000000C6\r\n:100580000921110100012222000705820320000138\r\n:100590000705030320000109040200010300000015\r\n:1005A000092111010001226D000705840320000AC2\r\n:1005B000120110010000000884330500010001024F\r\n:1005C00000015A034C00610075006E006300680072\r\n:1005D000200043006F006E00660069006700750030\r\n:1005E0007200610062006C00650020004B00650035\r\n:1005F000790062006F006100720064002000280032\r\n:100600006C00610075006E00630068005F006C00A4\r\n:100610006900740065005F003100290000001203CA\r\n:10062000530079007300740065006D0037003600D8\r\n:1006300000000403090411241FBECFEFD0E1DEBF88\r\n:10064000CDBF04B603FE27C080913E0690913F06C1\r\n:10065000A0914006B09141068730904BA740B04B27\r\n:10066000D1F410923E0610923F061092400610926E\r\n:10067000410614BE84B7877F84BF0FB6F894A8954F\r\n:1006800080916000886180936000109260000FBECE\r\n:10069000E0E0F8E7099512E0A0E0B1E0E0EAF7E574\r\n:1006A00002C005900D92A23FB107D9F726E0A2EF54\r\n:1006B000B2E001C01D92AE33B207E1F70E946403BD\r\n:1006C0000C94CE2B0C940000CF93DF93CDB7DEB704\r\n:1006D000AB970FB6F894DEBF0FBECDBF84B7877F50\r\n:1006E00084BF0FB6F894A8958091600088618093CC\r\n:1006F0006000109260000FBE91E080E80FB6F894A1\r\n:1007000080936100909361000FBE85B7806885BFBC\r\n:1007100085B7806885BF8FE69BE19093F302809355\r\n:10072000F2020E9412270E94B8278091E2008460A2\r\n:100730008093E2007894809101068823A1F01091C3\r\n:10074000E9001F709091EC00892F817090FD80E886\r\n:10075000182B1092E9008091E80083FD0E9401248B\r\n:100760001F701093E90082E084BD93E095BD9DE782\r\n:1007700097BD80936E0081EF0E94101382EF0E945C\r\n:10078000101383EF0E94101384EF0E94101385EF63\r\n:100790000E9410130EE511E03CE6C32E31E0D32E8B\r\n:1007A000D8018D918D010E941013C016D106C1F79A\r\n:1007B000E4EFF2E08EEF92E0ADE8B3E01192119237\r\n:1007C0001D921D928E179F07C9F780E090E00E944E\r\n:1007D000EB2A8B3E9E4F11F00E94D91C10920B0603\r\n:1007E000E4E2F6E084E396E02FEF3FEF21933193CC\r\n:1007F0008E179F07D9F710920303ECE1F3E08CE228\r\n:1008000093E02FEF3FEF219331938E179F07D9F796\r\n:1008100080E090E00E94EB2A8B3E9E4F21F00E94E8\r\n:10082000D91C0E947D1145E050E06CE170E088E346\r\n:1008300096E00E94D32A809138068C7F11F40E94A2\r\n:100840007D110E9427138FE097E20197F1F700C016\r\n:100850000000AFE0B7E21197F1F700C000000E947E\r\n:10086000271380918D0380FF13C06FEF7FEF80E42B\r\n:1008700090E00E941F2B6FEF82E490E00E94012B1A\r\n:100880006FEF7FEF80E090E00E941F2B0E94EC1B37\r\n:1008900080E490E00E94EB2A8C3E964739F482E493\r\n:1008A00090E00E94E32A91E0823009F090E090FD10\r\n:1008B00039C000E010E058012CE8A20EB11C48013C\r\n:1008C000ECE18E0E911CF801EA5AFE4FC590D490CF\r\n:1008D0006D2DC8018D5B9F4F0E94012B6C2DC801AF\r\n:1008E0008C5B9F4F0E94012B0E5F1F4F801691065D\r\n:1008F00051F784018A149B0411F78401F0E38F16E9\r\n:10090000F2E09F06C1F681E00E94F2156CEE76E7F8\r\n:1009100080E490E00E941F2B62E082E490E00E945D\r\n:10092000012B03C080E00E94F21560916A0470916F\r\n:100930006B0480916C0490916D040E94C61580E058\r\n:1009400090E00E94EB2A8B3E9E4F11F00E94D91C32\r\n:1009500082E090E00E94E32A809382030E94C81CF8\r\n:100960009093FF028093FE0283E090E00E94E32ACE\r\n:10097000682F70E080E090E00E94DF1E60916A04C2\r\n:1009800070916B0480916C0490916D040E94C61567\r\n:100990006091FE0260686093FE021091FF0284E0A5\r\n:1009A00090E00E94012B612F81E290E00E94012BD8\r\n:1009B0008BE191E090930103809300032224239420\r\n:1009C000312C80910106853009F054C080E4E82E76\r\n:1009D000DD24D39498E1F92E1AE180910106853047\r\n:1009E00009F042C080910106843051F140E060E09E\r\n:1009F00080E00E947911D09280031092020368E196\r\n:100A000070E00FB6F894A895609360000FBEE09276\r\n:100A1000600083B7817F846083BF83B7816083BFB9\r\n:100A20007894889583B78E7F83BF0FB6F894A89586\r\n:100A300080916000886180936000109260000FBE1A\r\n:100A400080910006882309F4C8CF0E942713EDE89F\r\n:100A5000F3E081919191892B09F05BC787E993E0DD\r\n:100A60008E179F07B1F7B9CF0E940E210E94A310E5\r\n:100A7000109280030E942713882359F08FB7F894AF\r\n:100A800040917C0350917D0360917E0370917F03C0\r\n:100A90008FBFA3E8B3E0EDE8F3E0E12CF12C4E2D9D\r\n:100AA000A190B1908D919D918A259B25009709F485\r\n:100AB000AEC010E0CC24C394D12C9C012C213D214C\r\n:100AC000232B09F49EC019A34AA3AC20BD2081E0CA\r\n:100AD000A114B10409F480E08BA30E94361C81604C\r\n:100AE000782F9DA38CA349A15AA16BA18DA10E942F\r\n:100AF000D90FF701EE0FFF1FED57FC4F8081918159\r\n:100B0000C826D926D182C082AB2881F08EE08E9D86\r\n:100B1000F0018F9DF00D1124E855FE4FE10FF11DFE\r\n:100B200080818F3F19F08BA711E001C010E0B090D9\r\n:100B30000303E12EF12CC7018B0D911D0997A4F140\r\n:100B400088E090E06C01CE18DF08B7016F5F7F4F3F\r\n:100B50006D5F7C4FA60184E093E00E94B62BB70145\r\n:100B6000675F7F4F6D5F7C4FA6018CE093E00E9432\r\n:100B7000B62BA601440F551FB701660F771F675E9E\r\n:100B80007F4F6D5F7C4F8CE193E00E94B62BB701E5\r\n:100B90006F5E7F4F6D5F7C4FA60184E193E00E9402\r\n:100BA000B62BBA94B09203038091030390E0EBA5B7\r\n:100BB000AE2FB0E09D01220F331F22513E4FAA0FEE\r\n:100BC000BB1FBD0161517E4F41E0480F9117B0F44A\r\n:100BD00090E0FC01ED5FFC4FD9015C915183DB019A\r\n:100BE0005C915187BBA5B18B880F991FFC01ED5F0C\r\n:100BF000FC4F128E118E91E0842FE6CF8093030379\r\n:100C00001EC01F5FCC0CDD1C1E3009F056CF2FEF2D\r\n:100C1000E21AF20A35E0E316F10409F040CF8FEF53\r\n:100C20008EA38FA318A60E94361C8160782F9AA7E6\r\n:100C300089A74EA15FA168A58AA50E94D90F4091FE\r\n:100C40002C0350912D0360912E0370912F032FB729\r\n:100C5000F89480917C0390917D03A0917E03B091E4\r\n:100C60007F032FBF841B950BA60BB70B2FB7F894F0\r\n:100C7000C0907C03D0907D03E0907E03F0907F03D2\r\n:100C80002FBFC0922C03D0922D03E0922E03F0923E\r\n:100C90002F0360910303E3E0F3E0462F50E0882444\r\n:100CA0008A94982CA12CB12C881A990AAA0ABB0AFA\r\n:100CB000651799F0218D328D2901612C712C8414D6\r\n:100CC0009504A604B70410F4415004C0280F391F3E\r\n:100CD000328F218F5F5F3296EBCF40930303809179\r\n:100CE0008003811108C010913806812F837019F09C\r\n:100CF0001695169501C010E0809106018130E9F04B\r\n:100D000038F0823009F4A7C3833009F4B1C3CDC3EE\r\n:100D100010922701C0923406D0923506E092360632\r\n:100D2000F092370689E2E3E0F3E0ABE0B6E0019051\r\n:100D30000D928A95E1F781E098C38091050118131F\r\n:100D40000DC020913806237030E04091040150E03E\r\n:100D500081E02417350719F480E001C081E081703B\r\n:100D600080932901412F50E04832510508F061C3BA\r\n:100D7000FA01E45BFF4F0C94B02B882309F459C3AC\r\n:100D800040E060E080E00E94791153C3F0902701B9\r\n:100D90008EE0F89EF02C11240EE00F0D073408F0C1\r\n:100DA00006E46091390670913A0680913B060E94F4\r\n:100DB0001812D62EC72EB82EF01608F037C3EF2D16\r\n:100DC000F0E0DF01A658BD4F8C9190912801982347\r\n:100DD00031F02B2D4D2D6C2DCF010E947B11F39402\r\n:100DE000EBCFF09027018EE0F89EF02C11240EE05E\r\n:100DF0000F0D073408F006E4C0903A06D0903B0689\r\n:100E0000B09039066B2D7C2D8D2D0E941812A62EC8\r\n:100E1000972E882E60913C066B0D7C2D8D2D0E94A7\r\n:100E20001812D62EC72EB82EF01608F0FFC28F2D3E\r\n:100E300090E0FC01E658FD4F3081209128012323EA\r\n:100E400059F030FF04C02B2D4D2D6C2D03C0282DE3\r\n:100E50004A2D692D0E947B11F394E6CFD090270193\r\n:100E60008EE0D89ED02C11240EE00D0D073408F032\r\n:100E700006E4A0903A0690903B0620913C0630E4B0\r\n:100E8000B32E5B2D529F512D1124B52ED01608F094\r\n:100E9000CDC2ED2CF12CF701E658FD4F90818091E9\r\n:100EA00028018923B9F0F701EE0FFF1FE151FE4F32\r\n:100EB000808182958F70609139068B9D600D112421\r\n:100EC0007A2D892D0E941812462F282F672FC701CF\r\n:100ED0000E947B11D394DACFD09027018EE0D89E68\r\n:100EE000D02C11240EE00D0D073408F006E4A0907C\r\n:100EF0003A0690903B0620913C0680E4B82E6B2D7C\r\n:100F0000629F612D1124B62ED01608F08FC2ED2CF1\r\n:100F1000F12CF701E658FD4F90818091280189233B\r\n:100F2000D9F0F701EE0FFF1FE251FE4F6081B69E30\r\n:100F3000B0011124B5E075956795BA95E1F78091F8\r\n:100F40003906680F7A2D892D0E941812462F282FF6\r\n:100F5000672FC7010E947B11D394D6CFF090270151\r\n:100F60008EE0F89EF02C11240EE00F0D073408F0EF\r\n:100F700006E4C0903906D0903A06B0903B066091E6\r\n:100F80003C06669566956695809134069091350687\r\n:100F90000E940E120E949311805887FD8195880F40\r\n:100FA000782F2B2D729F712D1124872FB6010E944F\r\n:100FB0001812D62EC72EB82EF01608F037C2EF2D15\r\n:100FC000F0E0DF01A658BD4F8C9190912801982345\r\n:100FD00031F02B2D4D2D6C2DCF010E947B11F39400\r\n:100FE000EBCF8EE79EE01AC082E59EE017C087E552\r\n:100FF0009FE01FC088E39FE01CC08DE19FE01EC002\r\n:1010000081E09FE01BC080E59EE008C087E49EE091\r\n:1010100005C08EE39EE002C083E29EE00E9427228C\r\n:1010200009C284E19EE00AC085EE91E102C080EF32\r\n:101030009EE00E94CB21FEC18CED9EE00E944F21DC\r\n:10104000F9C186EE9DE005C084EB9DE002C086E715\r\n:101050009DE00E947122EEC181111EC060913C068C\r\n:1010600020E1620F08F46FEF80913406909135060D\r\n:101070000E940E126AE070E00E94882B892B09F012\r\n:10108000D8C10E94C32A66E470E00E949C2B609144\r\n:1010900028010E94A812CDC1809127019EE0899F5E\r\n:1010A000802D11240EE0080F073408F006E4E82E26\r\n:1010B000F12CC02ED12CEC14FD040CF0B7C16091C2\r\n:1010C0002801C7010E94A8123FEFE31AF30AF3CFE9\r\n:1010D00081111EC060913C0620E1620F08F46FEFA1\r\n:1010E00080913406909135060E940E1265E070E002\r\n:1010F0000E94882B892B09F09CC10E94C32A66E4B8\r\n:1011000070E00E949C2B609128010E94EE1291C118\r\n:10111000809127019EE0899F802D11240EE0080F09\r\n:10112000073408F006E4E82EF12CC02ED12CEC1484\r\n:10113000FD040CF07BC160912801C7010E94EE12F2\r\n:101140005FEFE51AF50AF3CF8FE69DE002C089E66E\r\n:101150009DE00E94D2226EC180910B0621E0682F93\r\n:10116000621B08F460E0862F60E57DE03BC060E52F\r\n:101170007DE037C080910B0621E0782F721B08F4C8\r\n:1011800070E0872F68E17DE02DC068E17DE029C037\r\n:1011900080910B0621E0382F321B08F430E0832FBA\r\n:1011A00066EE7CE01FC066EE7CE01BC080910B0603\r\n:1011B00021E0582F521B08F450E0852F6EEC7CE0A4\r\n:1011C00011C06EEC7CE00DC080910B0621E0682F11\r\n:1011D000621B08F460E0862F68EB7CE003C068EBDC\r\n:1011E0007CE080E00E943E2325C18091760381113E\r\n:1011F00025C068EA71E040E050E0942F9295907F1E\r\n:1012000020E030E0FB01E20FF31F8081863438F4E8\r\n:10121000E82FF0E0E05DFC4F892F822B80832F5F69\r\n:101220003F4F2E30310571F74F5F5F4F625F7F4F49\r\n:101230004530510511F781E080937603D090270166\r\n:101240008EE0D89ED02C11240EE00D0D073408F04E\r\n:1012500006E460916A0470916B0480916C04909133\r\n:101260006D040E947615B82E6091390670913A0689\r\n:1012700080913B060E941812A62E972E882ED0161B\r\n:1012800008F0D4C0ED2CF12CF701E658FD4F908109\r\n:10129000809128018923B9F0F701E05DFC4F60815E\r\n:1012A000462F4F7062956F708B2D0E9445110297EB\r\n:1012B00020F420E040E060E003C0282D4A2D692D95\r\n:1012C000C7010E947B11D394DACF909027018EE062\r\n:1012D000989E902C11240EE0090D073408F006E4C6\r\n:1012E000EE24EA94F12C901608F0A0C0E92DF0E06D\r\n:1012F000DF01A658BD4F9C9180912801892341F1BF\r\n:10130000DF01AA0FBB1FAE0FBF1FA856BC4FAC908A\r\n:101310001196CC90119712968C9190913B06A99EB4\r\n:1013200050011124C99E60011124899FC00111241C\r\n:10133000B7010E94882B262FC501B7010E94882B78\r\n:10134000462FC601B7010E94882BCF010E947B1156\r\n:101350009394C9CFC09027019EE0C99EC02C112450\r\n:101360000EE00C0D073408F006E4811106C08091F0\r\n:101370007B038F5F80937B0304C010927B031092EA\r\n:101380007A0380917B03811147C080917A03883072\r\n:1013900029F41092790310927A033EC0A82FB0E08E\r\n:1013A000AA0FBB1FA459BE4FEC9111969C917EE0F1\r\n:1013B000E79FF0011124E855FE4FE90FF11D9081E0\r\n:1013C0009F3F21F09093770391E001C090E09093CC\r\n:1013D00079038F5F80937A031FC0EC2CF12CF70107\r\n:1013E000E658FD4F9081809128018923A1F06091FA\r\n:1013F0007B036C0D20917903E7E7F3E080E77FEF53\r\n:1014000090E092130CC00E941812462F282F672FCD\r\n:10141000C7010E947B11C394C016F8F207C0319136\r\n:10142000C31202C08FEF70E09F5FEBCF81E0063404\r\n:1014300008F080E0909127019F5F90932701811130\r\n:1014400034C082E0809306018091290181112DC072\r\n:10145000112351F02AC01093050180913806837042\r\n:10146000809304010E94B80F83E0809306011DC0A1\r\n:1014700040913406509135066091360670913706DA\r\n:101480002FB7F89480917C0390917D03A0917E0307\r\n:10149000B0917F032FBF841B950BA60BB70B409712\r\n:1014A000A105B10510F0109206010E94A3109091C1\r\n:1014B0008103891721F00E94A310809381038091FA\r\n:1014C0000106843009F07DCA83E08093E9008091B1\r\n:1014D000E80082FF76CA8091E80085FF23C00E9461\r\n:1014E000312781111DC050E2E52EF12CCE0101966D\r\n:1014F0006C0109C08091F100D6018D936D01B1E0BE\r\n:10150000EB1AF10869F08091E80085FDF3CF809136\r\n:10151000E8008B778093E8000E943127882399F3B5\r\n:1015200091E001C090E08091E8008B778093E80023\r\n:10153000992309F446CA81E08A83E9818E2F90E0DD\r\n:10154000FC013197E331F10508F0ACC1EC58FF4FD5\r\n:101550000C94B02B86E78B838CEE8C8381E014C1D6\r\n:101560004EE150E06DE271E004C04EE150E064E411\r\n:1015700071E0CE0103960E94BF2B93C180916F044E\r\n:10158000882309F48FC11A8281E080936E048AC196\r\n:101590008B81843008F086C16C81653008F082C18F\r\n:1015A0004D814E3008F07EC10E9445118E839F838D\r\n:1015B00078C12B81243008F075C18C81853008F00A\r\n:1015C00071C19D819E3008F06DC11E816F81ECE17B\r\n:1015D0008E9F70011124FCE82F9FE00CF11C112458\r\n:1015E000E90EF11CE90EF11C23E4E20EF11CC70127\r\n:1015F0000E94012B612FC70101960E94012B51C14E\r\n:1016000080916F0481114EC18B81803F49F0813FF1\r\n:1016100049F0823F49F0833F09F044C1E3E005C04F\r\n:10162000E0E003C0E1E001C0E2E035E0E39FF0016B\r\n:101630001124E95FFE4F83818C8380EBA5C08091EC\r\n:101640006F0481112FC18B819C81903B08F090EB3E\r\n:10165000803F49F0813F49F0823F49F0833F09F0E4\r\n:1016600021C1E3E005C0E0E003C0E1E001C0E2E049\r\n:1016700055E0E59FF0011124E95FFE4F9383A9C077\r\n:1016800080916F0481110EC1EB81E63458F0E03F88\r\n:10169000C1F0E13FC1F0E23FC1F0E33F09F002C118\r\n:1016A000E3E014C0F0E0CF01880F991FE80FF91FA5\r\n:1016B000E856FC4F81818C8380818D8382818E836B\r\n:1016C000F0C0E0E003C0E1E001C0E2E065E0E69FD9\r\n:1016D000F0011124E95FFE4F81818C8382818D832B\r\n:1016E0001E82DFC080916F048111DCC0EB818D818F\r\n:1016F0009C81E63458F0E03FB1F0E13FB1F0E23FC9\r\n:10170000B1F0E33F09F0CEC0E3E012C02E81F0E07B\r\n:10171000AF01440F551FE40FF51FE856FC4F8083BF\r\n:1017200091832283BEC0E0E003C0E1E001C0E2E0BB\r\n:1017300075E0E79FF0011124E95FFE4F91838283FA\r\n:1017400048C080916F048111ADC0EB81E43008F096\r\n:10175000A9C02E2F30E085E0E89FF0011124E95F59\r\n:10176000FE4F908196959695ECE7F1E080E04191EF\r\n:1017700094130CC08C8385E0829FF001839FF00D51\r\n:101780001124E95FFE4F84818D838BC08F5F8F3082\r\n:1017900071F788C080916F04811184C0EB81E430BF\r\n:1017A00008F080C0AC81AF3008F07CC02D8195E09E\r\n:1017B000E99FF0011124E95FFE4FB0E0A458BE4F4D\r\n:1017C0008C91982F990F990F80818370892B80833A\r\n:1017D00024831A8260916A0470916B0480916C0476\r\n:1017E00090916D040E94C6155DC080916F048111B7\r\n:1017F00059C081E00E94F21554C085E08B838EE0D1\r\n:101800008C838DE8E82E83E0F82E15E0A0E0B4E0AC\r\n:1018100040E050E0B03258F5F70160817181C101BC\r\n:10182000042E02C0880F991F0A94E2F768237923D7\r\n:101830008B2F90E091010A2E01C0220F0A94EAF743\r\n:10184000672B51F061E070E06C0F7D1F860F971FD2\r\n:10185000FC013081232B0AC061E070E06C0F7D1F1A\r\n:10186000860F971F2095FC01308123232083AF5FD3\r\n:10187000A83010F0BF5FA0E04F5F5F4F4E305105C2\r\n:1018800049F61150F2E0EF0EF11C1111C1CF09C061\r\n:101890000E940E2181E09B81911101C080E0809324\r\n:1018A00097031A8280910106843009F51091E900AE\r\n:1018B0001F709091EC00892F817090FD80E8182BAB\r\n:1018C00082E08093E9008091E80080FF0DC040E055\r\n:1018D00050E060E270E0CE0101960E9423218091E9\r\n:1018E000E8008E778093E8001F701093E9008091E4\r\n:1018F0006E04882309F465C82FEF30E752E02150C9\r\n:1019000030405040E1F700C000000E94EC1B0C94F6\r\n:10191000E104F9BC19BD09B400FEFDCF8091D800E7\r\n:101920008F7D8093D8008091E00082608093E000FA\r\n:101930008091E00081FDFCCF0E940E210C94ED040B\r\n:10194000E3E7F4E095E0E534F90729F0818360836B\r\n:1019500042833396F7CF0895FC01EE0FFF1F8E0FE1\r\n:101960009F1FFC01ED58FB4F618340832283089544\r\n:10197000EF92FF920F939701201B31092F3F310502\r\n:1019800019F010F02FEF30E02095382F320F08F4C7\r\n:101990003FEF832F0F91FF90EF900895EF92FF920A\r\n:1019A0000F939701201B31092F3F310519F010F0DB\r\n:1019B0002FEF30E0322F3095482F430F08F44FEFD0\r\n:1019C000842F620F0F91FF90EF900895EF92FF9296\r\n:1019D0000F93972F093438F4B701601B71096F3FDB\r\n:1019E000710519F010F06FEF70E0485F5F4F413103\r\n:1019F000510540F0A901485F5F4F4131510510F09A\r\n:101A00006FEF70E06095482F460F08F44FEF842F7A\r\n:101A100037FF02C02D5F3F4F3595279535952795A8\r\n:101A200060913906620F792F0F91FF90EF90089522\r\n:101A3000EF92FF920F93E00EF11CF90137FF03C004\r\n:101A4000F195E195F10924E0EE0FFF1F2A95E1F7EA\r\n:101A5000EF3FF10519F014F0EFEFF0E09A0157FFB6\r\n:101A600003C031952195310994E0220F331F9A95D7\r\n:101A7000E1F72E173F070CF4F901EE0DFF1DEF3FC4\r\n:101A8000F10519F010F0EFEFF0E02E2F2095382F30\r\n:101A9000320F08F43FEF832F0F91FF90EF900895DE\r\n:101AA000EF92FF920F93970195E0099F200D311D52\r\n:101AB00011242F3F310519F010F02FEF30E0209561\r\n:101AC000382F320F08F43FEF832F0F91FF90EF90E4\r\n:101AD000089522E8241B08F420E0620F0895409541\r\n:101AE000282F429F412D1124842F08950F931F9377\r\n:101AF00010E0F801EE0FFF1FE251FE4F908190576A\r\n:101B000097FD9195000F111FF801E151FE4FE08103\r\n:101B1000F0E0B097DF01AA0FBB1F8D010E0F1F1F52\r\n:101B20002003D001219FB00D1124E8E3F0E0E91B70\r\n:101B3000F10997FDF3959F01220F331F89010E0FC5\r\n:101B40001F1F40039001419F300D11242A0F3B1F9E\r\n:101B500037FF02C021583F4F220F232F221F330B84\r\n:101B6000620F1F910F9108950F931F93522F10E052\r\n:101B7000F801EE0FFF1FE151FE4FE081F0E0B0975A\r\n:101B8000EE0FFF1F9F015203D001539FB00D112490\r\n:101B9000000F111FF801E251FE4F008110E00057C5\r\n:101BA0001109000F111F40039001419F300D1124B6\r\n:101BB0002A0F3B1F37FF02C021583F4F220F232F10\r\n:101BC000221F330B620F1F910F9108950F931F93E4\r\n:101BD000522F10E0F801EE0FFF1FE151FE4FE081A0\r\n:101BE000F0E0B0979F015203D001539FB00D112434\r\n:101BF000000F111FF801E251FE4F008110E0005765\r\n:101C0000110940039001419F300D11242A0F3B1F01\r\n:101C100037FF02C021583F4F220F232F221F330BC3\r\n:101C2000620F1F910F910895EF920F931F9393E00E\r\n:101C3000099F80011124159507956E2D600F1F9146\r\n:101C40000F91EF900895A22F50E0FA01EE0FFF1FC1\r\n:101C5000E151FE4F9081905297FD9195440F551F91\r\n:101C6000FA01E251FE4F3081232F30E02A1B310967\r\n:101C7000290F311D97FD3A95620F0895E42FF0E08A\r\n:101C8000EE0FFF1FE151FE4F6081621B0895E42FAC\r\n:101C9000F0E0EE0FFF1FE251FE4F6081621B0895DE\r\n:101CA000622F0895E42FF0E0EE0FFF1FE251FE4F88\r\n:101CB000408134EE439F412D1124E82FF0E050E0A5\r\n:101CC000445E5F4FDA01A21BB1099D01B7FF03C05B\r\n:101CD00031952195310993E0220F331F9A95E1F751\r\n:101CE000AF01421B530B9A0157FF02C020E030E0C6\r\n:101CF000582F259F212D1124822F0895E42FF0E0E5\r\n:101D0000EE0FFF1FE251FE4F408134EE439F412D05\r\n:101D10001124E72FF0E050E0445E5F4FDA01A21B90\r\n:101D2000B1099D01B7FF03C031952195310993E0B9\r\n:101D3000220F331F9A95E1F7AF01421B530B9A0113\r\n:101D400057FF02C020E030E0279F212D1124722F81\r\n:101D50000895FC019B01009721F477FF2BC080E8D8\r\n:101D60000895AC0197FF04C044275527481B590B21\r\n:101D7000B901640F751F37FD0CC0241B350BC90159\r\n:101D8000A5E0880F991FAA95E1F70E949C2B80E29D\r\n:101D90000CC0CB0165E0880F991F6A95E1F7BA0185\r\n:101DA000621B730B0E949C2B80E6861BF7FF03C00F\r\n:101DB0008195089580E00895EF920F93CF93DF937C\r\n:101DC000D72FC82FC9010E19BA010E94A90E602F82\r\n:101DD000681B7D2F8C2FDF91CF910F91EF9008958D\r\n:101DE0000F93CF93DF93D72FC82FC901BA010E9459\r\n:101DF000A90E682F600F7D2F8C2FDF91CF910F914F\r\n:101E00000895EF920F931F93CF93DF93D62FC72F91\r\n:101E1000182FC9010E19010FBA010E94A90E081B43\r\n:101E2000202F219F212D1124822F6D2F7C2FDF91B8\r\n:101E3000CF911F910F91EF900895EF920F931F9301\r\n:101E4000CF93DF93D62F172FC82FC9010E19070F75\r\n:101E5000BA010E94A90E702F781B719F712D112459\r\n:101E60006D2F8C2FDF91CF911F910F91EF900895DF\r\n:101E7000FF920F931F93CF93DF93F62ED72F182F38\r\n:101E8000C901C12FC01BBA010E94A90E982F990F3A\r\n:101E9000890FC81B2C2F219F212D1124822F6F2DDC\r\n:101EA0007D2FDF91CF911F910F91FF900895FF92A9\r\n:101EB0000F931F93CF93DF93F62E172FD82FC901BF\r\n:101EC000C72FC01BBA010E94A90E982F990F890F26\r\n:101ED0007C2F781B719F712D11246F2D8D2FDF9119\r\n:101EE000CF911F910F91FF9008959091FE0292FF64\r\n:101EF0000DC0282F2871283019F4877F846006C010\r\n:101F0000282F2471243011F48B7F886093FF0DC03B\r\n:101F1000282F2871283119F4877E846106C0282F64\r\n:101F20002471243111F48B7E88612091FF0220FFFF\r\n:101F30000DC0382F3871383019F4877F816006C0A2\r\n:101F4000382F3171313011F48E7F886021FF0DC040\r\n:101F5000282F2871283119F4877E816106C0282F27\r\n:101F60002171213111F48E7E886194FD877E089560\r\n:101F7000879A81B38F7791B390682FB7F894E3E78E\r\n:101F8000F4E035E0E534F30761F0319148E091BBCE\r\n:101F900037FF81BB330F000000C081BB4A95B9F702\r\n:101FA000F0CF2FBF8FE292E00197F1F700C0000061\r\n:101FB00008951F93CF93DF93CDB7DEB767970FB622\r\n:101FC000F894DEBF0FBECDBF342F4B8B252F5C8B1B\r\n:101FD0006D8B7E8B8F8B4E895F8961111092D60538\r\n:101FE00086E0FE013D96DF01982F1D929A95E9F754\r\n:101FF0003D872E876F87598B488BDE01179601909E\r\n:102000000D928A95E1F7CE0107960E945F1F81111C\r\n:102010003EC086E0FE013796DE01119601900D92DA\r\n:102020008A95E1F7FF81E8856A857B8561157105F1\r\n:1020300031F0EF3F31F481E0FF3F19F403C081E05C\r\n:1020400001C080E080FD23C02091750530E0C9010A\r\n:102050000196877099274091A60550E0841795074F\r\n:1020600079F1F983EA837D836C8396E0929FD001B6\r\n:10207000939FB00D1124AA58BA4FFE0131960190DA\r\n:102080000D929A95E1F7809375050E94E91E16E07E\r\n:102090008091A605909175058917F9F0189FC001E8\r\n:1020A00011248A589A4F0E945F1F8823B1F08091B3\r\n:1020B000A60590E00196877099278093A605E8CF42\r\n:1020C0000E940E21109275051092A605EFE6F5E02C\r\n:1020D00086E0DF011D928A95E9F767960FB6F894BE\r\n:1020E000DEBF0FBECDBFDF91CF911F91089520912C\r\n:1020F000490530914A052817390771F090934A0530\r\n:1021000080934905E0910003F0910103309721F09D\r\n:102110000084F185E02D09940895209147053091C0\r\n:1021200048052817390771F09093480580934705B3\r\n:10213000E0910003F0910103309721F00680F781D0\r\n:10214000E02D09940895E0910003F0910103309788\r\n:1021500021F00190F081E02D099480E00895EF9244\r\n:10216000FF920F93CF93DF93C42FD22FFC01828174\r\n:102170008823D1F040934D050E94361C909346056C\r\n:102180008093450580E28C0F883008F078C0C770D6\r\n:1021900081E001C0880FCA95EAF7DF91CF910F91D6\r\n:1021A000FF90EF900C94562980914D05481356C02E\r\n:1021B00020914505309146054FB7F89480917C03F6\r\n:1021C00090917D03A0917E03B0917F034FBF821B4E\r\n:1021D000930B883C910508F041C0CD17C9F080E20F\r\n:1021E0008C0F883040F4C77081E001C0880FCA9519\r\n:1021F000EAF70E944B2980E28D0F883048F481E095\r\n:102200009D2F977001C0880F9A95EAF70E94562972\r\n:10221000093319F0E12CF12C03C080E5E82EF12CF4\r\n:10222000802F0E94BC29E114F10451F08FEC97E05B\r\n:102230000197F1F700C0000091E0E91AF108F3CF2F\r\n:10224000802F0E94602980E28D0F8830C0F4D77003\r\n:1022500081E001C0880FDA95EAF70AC080E28C0FAE\r\n:10226000883068F4C77081E001C0880FCA95EAF72A\r\n:10227000DF91CF910F91FF90EF900C944B29DF915C\r\n:10228000CF910F91FF90EF9008950F931F93CF93ED\r\n:10229000DF93C42FD0E0CC0FDD1F2CE1629FC00D77\r\n:1022A000D11D11243CE8839FC00DD11D1124CD5BAD\r\n:1022B000DF4FCE010E94E32A082F10E0102F0027E5\r\n:1022C000CE0101960E94E32A9801282BC901DF91D3\r\n:1022D000CF911F910F910895462F843038F47530B7\r\n:1022E00028F46E3018F4672F0C94451180E090E0CC\r\n:1022F00008950C94A00C0C94AC0CE8E3F6E08DE38C\r\n:10230000808380912A0190912B01A0912C018183DF\r\n:102310009283A3838FE7848345E050E06CE170E013\r\n:10232000CF010C94F12A482F982F46FD9095E92F64\r\n:10233000EF739F7046FD9F5FE295EF70EE0FF0E048\r\n:10234000E557FE4F2181299F802D212D1124829553\r\n:102350008F702295207F822B3081982F930F892FA9\r\n:1023600047FD819580580895BC018230910508F49D\r\n:102370000895613E8EE1780748F49B0195E036951B\r\n:1023800027959A95E1F748E0420F01C04FEF91E0A1\r\n:10239000242F30E0290F311D35952795229FF0011C\r\n:1023A000239FF00DF00D11246E177F0718F44FEFE7\r\n:1023B000420F04C02F3F39F091E0920F491740F7C8\r\n:1023C0008FEF890F08958FEF08950F93CF93DF93C9\r\n:1023D000D72FC82F47FD4195E8E3F0E0CF01841BDC\r\n:1023E000910947FD9395889FB001899F700D700DED\r\n:1023F0001124229FC001239F900D900D1124860F60\r\n:10240000971F0E94B411682F660F860F682F600F08\r\n:102410007D2F8C2FDF91CF910F91089520E030E038\r\n:10242000869F212D969F200D311D1124C9010895ED\r\n:10243000CF92DF92EF92FF920F931F93CF93DF9390\r\n:10244000F62E472FE82FF0E0711106C0EA57FC4F37\r\n:102450008491782F682F73C0272F30E0EA57FC4F04\r\n:10246000E491FE2F0E2F10E056E0659FC00111246D\r\n:10247000CFEFD0E0BE010E94882B5BEA5603C0017B\r\n:10248000579F900D11248F0D911D8F0D911D982F29\r\n:10249000990F980F7E01E21AF30AE09ED001E19EA7\r\n:1024A000B00DF09EB00D11248B2F499FA001112477\r\n:1024B000452F55277E01E41AF50AE09EA001E19E12\r\n:1024C000500DF09E500D11246E01C91AD108C29E04\r\n:1024D0007001C39EF00CD29EF00C11242F2D3327D7\r\n:1024E000C21BD30BC09F9001C19F300DD09F300DF8\r\n:1024F0001124932F6230710591F048F46115710534\r\n:10250000E1F061307105B9F49E2FE52F16C06430FB\r\n:10251000710569F040F06630710579F00CC09E2FAE\r\n:10252000EB2F832F0AC0EB2F8F2F952F06C09B2FE9\r\n:102530008E2FE32F02C09B2F852F7E2F692FDF91D7\r\n:10254000CF911F910F91FF90EF90DF90CF90089562\r\n:10255000DF92EF92FF920F931F93CF93DF93EC01E3\r\n:10256000FC01E658FD4F9081692381F1D0903A0635\r\n:1025700000913B0610913906E12EF12C0E94C32AEE\r\n:10258000282FC7018C549F4F68E671E00E949C2B56\r\n:102590008E199F0997FD0396959587959595879533\r\n:1025A0002370612F289F600D11247D2D802F0E94A4\r\n:1025B0001812462F282F672FCE01DF91CF911F9140\r\n:1025C0000F91FF90EF90DF900C947B11DF91CF91F2\r\n:1025D0001F910F91FF90EF90DF9008951F93CF937D\r\n:1025E000DF93FC01E658FD4F20816223A9F0EC0146\r\n:1025F0000E94C32A182F0E94C32A612F782F80912E\r\n:102600003B060E941812462F282F672FCE01DF911C\r\n:10261000CF911F910C947B11DF91CF911F91089561\r\n:10262000F894E82FE295EF70F0E031A1282F2F7099\r\n:1026300081E090E001C0880F2A95EAF7982F9095E5\r\n:10264000932391A392A1892B82A3789408959F92BA\r\n:10265000AF92BF92CF92DF92EF92FF920F931F93B0\r\n:10266000CF93DF9304EF12E089E5E82E81E0F82EA6\r\n:10267000C0E0D0E0912CCC24C394D12CB701D70179\r\n:102680008C91F894E82FE295EF70F0E021A18F7023\r\n:10269000A60102C0440F551F8A95E2F7CA01922F86\r\n:1026A000982B91A392A18095892382A3789400C04E\r\n:1026B000EEE5F1E020E030E0A12CB12C4191842F37\r\n:1026C00082958F7090E0DC0190968C9190E04F7035\r\n:1026D00002C0959587954A95E2F780FD08C0C6012E\r\n:1026E000022E02C0880F991F0A94E2F702C080E010\r\n:1026F00090E0A82AB92A2F5F3F4F2E303105F1F61E\r\n:10270000BFEFEB1AFB0AFB0180810E941013C4305B\r\n:10271000D10519F0F0E5FA95F1F7D8018D919C916A\r\n:102720001197A816B90621F0AD92BC9281E001C0C4\r\n:1027300080E0982A21960E5F1F4FC530D10509F021\r\n:102740009DCF992049F081E0809372040E94361C4D\r\n:102750009093710480937004809172048823E9F14E\r\n:1027600020917004309171044FB7F89480917C03EC\r\n:1027700090917D03A0917E03B0917F034FBF821B98\r\n:10278000930B069750F18091F4029091F50290938B\r\n:102790008E0380938D038091F6029091F7029093BF\r\n:1027A000900380938F038091F8029091F9029093A7\r\n:1027B0009203809391038091FA029091FB0290938F\r\n:1027C0009403809393038091FC029091FD02909377\r\n:1027D00096038093950310927204892DDF91CF9117\r\n:1027E0001F910F91FF90EF90DF90CF90BF90AF902F\r\n:1027F0009F900895CF93DF930E946C11EC01823873\r\n:10280000910559F1A0F48133910509F473C040F4A6\r\n:102810008932910509F467C08A9709F472C084C0AF\r\n:102820008533910509F458C0C997B9F07DC0833E3E\r\n:10283000910571F138F4803E9105B1F0823E910529\r\n:1028400011F172C0863E9105B9F1873E9105C9F13B\r\n:10285000843E910509F068C024C08091FE0280FD8D\r\n:102860005DC081FD5BC060C08091FE0280FD50C0F4\r\n:102870008091FF0280FF36C18091FE0284FD30C14D\r\n:10288000C3EED0E02FC18091FE0282FF2BC1F4CFB6\r\n:102890008091FE0282FD3FC08091FF0280FD3EC01C\r\n:1028A000EBCF8091FF0281FF1DC18091FE0284FD6C\r\n:1028B00017C1C7EED0E016C18091FE0283FF12C19E\r\n:1028C000F4CF8091FE0283FD2CC08091FF0281FF36\r\n:1028D000ECCFC4EED0E006C18091FE0285FF02C1BC\r\n:1028E000C9E2D0E0FFC08091FE0285FFFBC0C5E3D6\r\n:1028F000D0E0F8C08091FE0286FFF4C0CAE2D0E0CA\r\n:10290000F1C08091FE0286FFEDC0C1E3D0E0EAC0D5\r\n:10291000C9E3D0E0E7C0C2EED0E0E4C0C0EED0E052\r\n:10292000E1C0C6EED0E0DEC0C11582E5D80708F0F0\r\n:1029300066C0C11591E5D90728F0DC2FCC27C16FFF\r\n:10294000D06AD0C0C83ED10560F5C03ED10508F0C0\r\n:10295000C9C0C83AD105B0F4C53AD10540F0C55A4E\r\n:10296000D0E0C054DD4FC881D0E0D064BBC0C130DE\r\n:10297000D10509F4B7C008F4B3C0C430D10508F4D8\r\n:10298000AFC0B0C0CF3BD10508F0AAC0C85AD0E054\r\n:10299000CC0FDD1FCD53DD4F0990D881C02DD464FD\r\n:1029A000A1C0C11520E5D207E0F0CE0174E09695F4\r\n:1029B00087957A95E1F783709C2F937021E030E042\r\n:1029C00002C0220F331F9A95E2F73C68382BCF7074\r\n:1029D000C695C69580E2C89FE0011124C22BD32B77\r\n:1029E00081C0C11580E4D80718F0DF70D06A7AC0C2\r\n:1029F000CE019A9581159F4108F474C071C0C1152C\r\n:102A000086E5D807F0F5C11595E5D90750F08C2F6C\r\n:102A10000E94750F8F71C82FD0E0DC2FCC27D062B9\r\n:102A200061C0C11524E5D20728F0DC2FCC27C46F84\r\n:102A3000D06A58C09E01237033278C2F86958695C7\r\n:102A4000C115D34578F4C1E0D0E002C0CC0FDD1F42\r\n:102A50002A95E2F720E2829FC0011124C82BD92BCE\r\n:102A6000DC6840C0C1E0D0E002C0CC0FDD1F2A9579\r\n:102A7000E2F720E2829FC0011124C82BD92BDA682B\r\n:102A800031C0C1152AE5D207E8F4C11589E5D80798\r\n:102A900080F08C2F8F700E94750F94E0D695C795AB\r\n:102AA0009A95E1F7CF70D0E0DC2FCC27D069C82B06\r\n:102AB00019C0C11598E5D90798F0DC2FCC27C06F55\r\n:102AC000D06A10C0CE0190568115904248F48D2FE7\r\n:102AD0008F710E94750FDD27D0628F71D82B02C0D5\r\n:102AE000C0E0D0E0CE01DF91CF910895CF92DF9288\r\n:102AF000EF92FF926C01EE24FF24C114D104E10493\r\n:102B0000F10421F0C701B60120E101C020E0C72E89\r\n:102B1000D82EE92EFF24C114D104E104F10419F0E8\r\n:102B2000285FC701B6016B017C0154E0F694E7947D\r\n:102B3000D794C7945A95D1F7C114D104E104F10494\r\n:102B400019F02C5FC701B6016B017C0142E0F694DD\r\n:102B5000E794D794C7944A95D1F7C114D104E104FE\r\n:102B6000F10419F02E5FC701B601DC01CB01B69567\r\n:102B7000A79597958795892B8A2B8B2B09F02F5F2B\r\n:102B8000822FFF90EF90DF90CF90089520916F04F7\r\n:102B9000211110C00E947615843060F495E0989F52\r\n:102BA000F0011124E95FFE4FA8E3B6E001900D9219\r\n:102BB0009A95E1F7089590916F04911112C0809356\r\n:102BC0000A0180930F018093140180931901609191\r\n:102BD0006A0470916B0480916C0490916D040C9464\r\n:102BE000C615089544E150E063E772E0882361F080\r\n:102BF00087E091E00E94F12A42ED50E067E872E040\r\n:102C000088E993E00C94F12A87E091E00E94D32AAE\r\n:102C100042ED50E067E872E088E993E00C94D32A33\r\n:102C200080913806837029F08C6980933806109261\r\n:102C3000060181E080936F0408958F929F92AF9276\r\n:102C4000BF92CF92DF92EF92FF920F931F93CF9399\r\n:102C5000DF9300D000D01F92CDB7DEB7FC0180819A\r\n:102C6000918123813481232B31F09F3F31F491E016\r\n:102C70008F3F19F403C091E001C090E090FD19C5A9\r\n:102C80007F0185E0DE01119601900D928A95E1F7B2\r\n:102C9000F701228189819A81222349F00E949D1D9A\r\n:102CA000182F682F89819A810E943F1E03C00E94BD\r\n:102CB000131E182F69817A81812F0E946C118C015B\r\n:102CC00080919703811132C20115FCE51F0731F194\r\n:102CD00068F4003E110509F45FC0043E110509F4D3\r\n:102CE00060C00932110509F08EC10EC00A3C3CE5F6\r\n:102CF000130769F10B3C8CE51807C1F0033C9CE518\r\n:102D0000190709F080C136C080914C05882309F469\r\n:102D10004CC080914B05882309F447C0F70182819C\r\n:102D2000882309F403C20E94101600C2F7018281B1\r\n:102D3000882309F4FBC180913B06E9E9F1E0929117\r\n:102D40009817B0F001E0E339F007C9F722C0F701A6\r\n:102D50008281882309F4EAC180913B06E3E9F1E02E\r\n:102D600029E931E02E173F07A1F091918917D0F79B\r\n:102D7000892F0FC0F7018281882309F4D7C1809180\r\n:102D80003B06811103C08091250103C0809325017A\r\n:102D900080E00E94DB15CAC1F701828180934C0557\r\n:102DA00004C0F701828180934B05F701828188235B\r\n:102DB00009F48EC110924D050230FCE51F0708F49E\r\n:102DC00071C106312CE5120738F098012B5F3C45A4\r\n:102DD0002930310508F066C10E94C81C9093FF029B\r\n:102DE0008093FE0200313CE5130709F4C3C008F0EC\r\n:102DF00041C008309CE5190709F49AC0F0F404308A\r\n:102E0000FCE51F0709F487C068F402303CE51307AE\r\n:102E100009F477C003301C4509F0E5C08091FE023B\r\n:102E2000826076C006309CE5190709F46EC008F090\r\n:102E30007BC08091FE0288606BC00C30FCE51F07F0\r\n:102E400009F485C068F40A303CE5130709F474C03E\r\n:102E500008F079C00E940E218091FE02806858C05F\r\n:102E60000E309CE5190709F476C008F07FC0809108\r\n:102E7000FE028BC00C3FFCE51F0709F44FC018F59C\r\n:102E800003313CE5130709F47DC078F401319CE57A\r\n:102E9000190709F473C002311C4509F0A4C00E944F\r\n:102EA0000E218091FE028F7733C00531FCE51F07AC\r\n:102EB00009F472C008F486C00B3F1C4509F093C0AA\r\n:102EC0008091FF023EC001158DE5180709F45FC02F\r\n:102ED00058F40E3FECE51E0709F444C008F43FC067\r\n:102EE0008091FF0282602DC002302DE5120709F4A7\r\n:102EF00075C008F45DC003301D4509F074C060E082\r\n:102F00006EC08091FE02816003C08091FE028061EC\r\n:102F10008093FE0268C08091FE0211C08091FF0282\r\n:102F200082608093FF025FC08091FE028062F0CFDA\r\n:102F30008091FE028064ECCF8091FE028860846004\r\n:102F4000E7CF8160EECF8091FE028E7FE1CF80914E\r\n:102F5000FE028D7FDDCF8091FE02877FD9CF8091E9\r\n:102F6000FF0218C08091FF028D7FDBCF8091FE02AF\r\n:102F70008F7ECECF8091FE028F7DCACF8091FE02E0\r\n:102F80008F7BC6CF8091FE02877F8B7FC1CF8091E0\r\n:102F9000FF028D7F8E7FC5CF8091FE0282FB2227AC\r\n:102FA00020F991E0922790FB82F990FB83F9B0CF52\r\n:102FB0008091FF02982F909591708E7F892B90FBC6\r\n:102FC00081F9AFCF0E940E218091FE0287FB22275C\r\n:102FD00020F991E0922790FB87F99ACF61E08EE08B\r\n:102FE00090E00E94012B6091FE021091FF0284E0AC\r\n:102FF00090E00E94012B612F81E290E00E94012B62\r\n:103000000E940E2193C0043FFCE51F07A1F406E2D5\r\n:1030100021EE40EE64EF7CE50AC0083D9CE519070F\r\n:1030200009F0C3CE06E221EE41EE68ED7CE5C70172\r\n:103030000E94AF107BC0053F2CE51207A0F4093DAC\r\n:103040003CE5130731F407E225EE45EE69ED7CE53A\r\n:10305000EECF0A3D8CE5180701F708E221E045EEC6\r\n:103060006AED7CE5E4CF063FECE51E0731F406E2AD\r\n:1030700021EE42EE66EF7CE5DACF063FFCE51F0766\r\n:1030800030F407E225EE44EE65EF7CE5D0CF073F54\r\n:103090002CE5120709F089CE07E225EE46EE67EF30\r\n:1030A0007CE5C5CF06313CE5130719F58091D705BE\r\n:1030B0008A7A91E009F490E090934E05882311F00C\r\n:1030C00065E301C069E28FE495E00E94931C0EC0A5\r\n:1030D00006311C4509F048C080914E05882309F44B\r\n:1030E000E6C265E38FE495E00E946B1C0E94491DD7\r\n:1030F0001DC09801235C3C4524313105B8F0011511\r\n:103100009CE5190731F00F3D1C4571F50E94D91C53\r\n:103110000DC00E940E21FFE70AE116E0F1500040C9\r\n:103120001040E1F700C000000E94EC1B8091D40524\r\n:10313000877009F4BEC2F7018281882309F4B9C2FD\r\n:1031400082E00F900F900F900F900F90DF91CF9132\r\n:103150001F910F91FF90EF90DF90CF90BF90AF90B5\r\n:103160009F908F900C94A51EF701008111818823F8\r\n:1031700049F0C8010E949D1DD82E682FC8010E94E9\r\n:103180003F1E04C0C8010E94131ED82EB8018D2D09\r\n:103190000E94FA138C01982EF701B280A580A294A8\r\n:1031A0009FE0A9228091D405877099F0BB2089F017\r\n:1031B000812F807F803421F080E2800F883048F0BA\r\n:1031C00082E00E94A51E8091D4058770DD24D394EF\r\n:1031D0008111D12CC12EC2948FE0C8228C2D90E099\r\n:1031E0008C30910508F035C2FC01E957FF4F0C9473\r\n:1031F000B02B812F807F1F70882311F01295107FD4\r\n:10320000BB20B9F0112309F40FC280E2800F88308F\r\n:1032100010F0911006C08091D705182B1093D70598\r\n:1032200005C08091D605182B1093D6050E94491D24\r\n:10323000FBC1802F0E946029112309F40AC2005E9D\r\n:103240001095083010F0911006C08091D705182312\r\n:103250001093D70505C08091D60518231093D60585\r\n:103260000E94491DF6C1812F807F1F70803211F0AE\r\n:103270001295107F992021F0F1E09F16E1F02AC00D\r\n:10328000BB2081F08091D805AA2051F001E0A01266\r\n:1032900007C0182B181709F4DCC11093D805D9C141\r\n:1032A000812B10C0AA2021F021E0A21609F4D1C17F\r\n:1032B0000E94431D27C0BB2041F035E03A1508F4B9\r\n:1032C000C8C1812F0E945629C4C184E08A1508F420\r\n:1032D000C0C118C0BB2049F0AA2099F3F70185812D\r\n:1032E00080FFA2C18F708583ECCFAA2059F00933EB\r\n:1032F00009F0ACC1FFEF13EF21E0F1501040204086\r\n:10330000E1F7A2C1812F0E944B29A3C1812F86958D\r\n:103310008695837019F0813059F09BC1BB2019F05C\r\n:10332000C801937002C080E090E00E948D1097C1A8\r\n:10333000BB2019F0C801937002C080E090E00E94A9\r\n:1033400077108DC1812F837009F069C0B11085C1DC\r\n:10335000902F929596959770990F990F802F8F7057\r\n:10336000882E912CA12CB12C092E04C0880C991CFC\r\n:10337000AA1CBB1C0A94D2F704FF12C04FE050E015\r\n:1033800060E070E004C0440F551F661F771F9A95D8\r\n:10339000D2F7DB01CA0180959095A095B09503C046\r\n:1033A00080E090E0DC0116951695412F4370423085\r\n:1033B00019F1C8F40091D9051091DA052091DB05C7\r\n:1033C0003091DC05413059F088299929AA29BB2977\r\n:1033D000BC01CD0160237123822393230AC0802A7C\r\n:1033E000912AA22AB32ABC01CD01682979298A2908\r\n:1033F0009B290E94DF1E31C188299929AA29BB294E\r\n:103400000091D9051091DA052091DB053091DC059A\r\n:10341000BC01CD016027712782279327EACFBB200B\r\n:1034200019F0812F817001C08695882309F415C198\r\n:10343000902F929596959770990F990F802F8F7076\r\n:10344000882E912CA12CB12C092E04C0880C991C1B\r\n:10345000AA1CBB1C0A94D2F704FF12C04FE050E034\r\n:1034600060E070E004C0440F551F661F771F9A95F7\r\n:10347000D2F7DB01CA0180959095A095B09503C065\r\n:1034800080E090E0DC0116951695412F43704230A4\r\n:10349000D9F068F500916A0410916B0420916C04D6\r\n:1034A00030916D04413059F088299929AA29BB2906\r\n:1034B000BC01CD0160237123822393231EC0802A87\r\n:1034C000912AA22AB32A13C088299929AA29BB299B\r\n:1034D00000916A0410916B0420916C0430916D048A\r\n:1034E000BC01CD01602771278227932706C0BC014C\r\n:1034F000CD01682979298A299B290E946A1EADC0BD\r\n:103500001F70BB2039F0812F0E94BE1E802F0E94A9\r\n:103510005629A3C0802F0E944B29812F0E94801E14\r\n:103520009CC0802F32EF931609F440C0391538F053\r\n:1035300090EF991661F0E1EF9E1699F170C0F3EFEC\r\n:103540009F16D9F124EF921609F44EC068C0BB2033\r\n:1035500019F134E03A1508F47CC01F7181E090E065\r\n:10356000A0E0B0E0AC01BD0104C0440F551F661FD0\r\n:10357000771F1A95D2F780916A0490916B04A091FD\r\n:103580006C04B0916D048A019B01082719272A2732\r\n:103590003B27C901B80125C025E02A1508F459C008\r\n:1035A000DCCFBB2029F0812F8F712CC0BB20D9F339\r\n:1035B000812F8F710E94801E4CC0BB2079F01F713B\r\n:1035C00081E090E0A0E0B0E0BC01CD0104C0660F56\r\n:1035D000771F881F991F1A95D2F703C060E070E02B\r\n:1035E000CB010E946A1E35C0BB2079F01F71812F6C\r\n:1035F0000E94BE1E38E0139FC00111248360809397\r\n:10360000D405812F0E94BE1E24C081E00E94A51E09\r\n:1036100081E08A15F0F482E00E94A51E1AC0BB204A\r\n:1036200039F0AA2009F4BFCF802F0E94BC2911C015\r\n:10363000AA2009F4BDCF893349F49FEFE3EFF1E00D\r\n:103640009150E040F040E1F700C00000802F0E9460\r\n:10365000602988EF8C0D843010F40E94A310DD20C7\r\n:1036600041F18091D40580FD24C0F7011282859537\r\n:10367000859585950E94BE1EC7010E941D168091EA\r\n:10368000D4058595859585950F900F900F900F9097\r\n:103690000F90DF91CF911F910F91FF90EF90DF90EE\r\n:1036A000CF90BF90AF909F908F900C94801E69E256\r\n:1036B00019CD0F900F900F900F900F90DF91CF9139\r\n:1036C0001F910F91FF90EF90DF90CF90BF90AF9040\r\n:1036D0009F908F90089508958091DE05089580E071\r\n:1036E0000895CF93DF9300D01F92CDB7DEB79091AE\r\n:1036F0000106943011F589837B836A839093E900F6\r\n:103700008FEF9091E800815095FD06C09AE69A955A\r\n:10371000F1F700C08111F5CF8091E80085FF0DC061\r\n:1037200040E050E063E070E0CE0101960E9423216A\r\n:103730008091E8008E778093E8000F900F900F90B3\r\n:10374000DF91CF910895BC0184E00C94711BBC0102\r\n:1037500083E00C94711BCF93DF93209126012223E9\r\n:1037600039F02091FE0227FF03C060E224E002C08E\r\n:1037700068E021E02093E9002FEF3091E80021502C\r\n:1037800035FD06C03AE63A95F1F700C02111F5CFB4\r\n:103790002091E80025FF1DC0EC01809126018111D8\r\n:1037A00005C040E050E068E070E003C070E040E039\r\n:1037B00050E0CE010E9423218091E8008E77809313\r\n:1037C000E80080E2FE01AFEDB5E001900D928A9530\r\n:1037D000E1F7DF91CF91089581E08093E00080E2EE\r\n:1037E0008093D8001092C9008FE097E20197F1F71B\r\n:1037F00000C0000087E090EBDC0180933E069093D0\r\n:103800003F06A0934006B09341069CE088E10FB6C6\r\n:10381000F894A895809360000FBE90936000FFCF4E\r\n:1038200078941F920F920FB60F9211248F939F934B\r\n:10383000AF93BF9380917C0390917D03A0917E0311\r\n:10384000B0917F030196A11DB11D80937C039093DD\r\n:103850007D03A0937E03B0937F03BF91AF919F91AF\r\n:103860008F910F900FBE0F901F9018952FB7F8945F\r\n:1038700080917C0390917D03A0917E03B0917F03A2\r\n:103880002FBF08951F920F920FB60F9211248F939E\r\n:103890009F93AF93BF9380910203811113C08091D6\r\n:1038A0007C0390917D03A0917E03B0917F034196AC\r\n:1038B000A11DB11D80937C0390937D03A0937E0393\r\n:1038C000B0937F03BF91AF919F918F910F900FBEE7\r\n:1038D0000F901F901895209126012223C9F0209166\r\n:1038E000FE0227FF15C0262F2695269526952E31F8\r\n:1038F000C8F4FC01E20FF11D677081E090E001C0A7\r\n:10390000880F6A95EAF780959281892382830895CA\r\n:10391000FC0106962281621301C012823196E817DB\r\n:10392000F907C1F70895209126012223C1F02091C3\r\n:10393000FE0227FF14C0262F2695269526952E31A8\r\n:1039400030F5FC01E20FF11D677081E090E001C0ED\r\n:10395000880F6A95EAF79281892B82830895FC018A\r\n:1039600032962FEF30E04191641789F02F3F19F420\r\n:10397000411101C0232F3F5F3630A9F72F3F39F0A7\r\n:10398000FC01E20FF11D27FDFA9562830895089569\r\n:10399000CF9384E090E00E94E32AC82F81E290E078\r\n:1039A0000E94E32A2C2F30E0A901582BCA01CF91A5\r\n:1039B00008956BEE7EEF80E090E00E941F2B60E0A8\r\n:1039C00082E090E00E94012B60E083E090E00E94A2\r\n:1039D000012B1092D9051092DA051092DB05109296\r\n:1039E000DC0560E084E090E00E94012B60E081E271\r\n:1039F00090E00E94012B60E085E090E00E94012BA6\r\n:103A000060E086E090E00E94012B6FEF87E090E09D\r\n:103A10000E94012B40E050E0BA0188E090E00E9453\r\n:103A2000132B60E08DE090E00E94012B40E050E01D\r\n:103A3000BA0188E190E00E94132B60E087E190E0FA\r\n:103A40000E94012B40E050E0BA018CE190E00E941E\r\n:103A5000132B60E080E290E00E94012B40E050E0F8\r\n:103A6000BA0188E190E00E94132B40E050E0BA01D7\r\n:103A70008FE090E00E94132B40E050E0BA0183E118\r\n:103A800090E00C94132B8091D80581111092D805E9\r\n:103A900008959091D7058091D605892B2091D50561\r\n:103AA000982F922B90934F058091D8058823D9F0B9\r\n:103AB000892B80934F0580912601882331F08091D6\r\n:103AC000FE0287FF02C08EE101C086E0E1E5F5E07D\r\n:103AD00090E0815028F021912223D9F39F5FF9CF04\r\n:103AE00091110E94431DE0910003F0910103309772\r\n:103AF000A9F080912601882359F08091FE0287FF6A\r\n:103B000007C080914F058093500585E080934F0555\r\n:103B10000280F381E02D8FE495E00994089580E020\r\n:103B200090E00E948D1080E090E00E94771010924B\r\n:103B3000D6051092D5050C94491DBF92CF92DF9205\r\n:103B4000EF92FF920F931F93CF93DF938C01C0905E\r\n:103B50006A04D0906B04E0906C04F0906D04809146\r\n:103B6000D9059091DA05A091DB05B091DC05C82A52\r\n:103B7000D92AEA2AFB2ACFE1D0E0D701C6010C2ED0\r\n:103B800004C0B695A795979587950A94D2F780FDBE\r\n:103B900004C0219790F7B12C07C0BC2EB8018C2F20\r\n:103BA0000E94FA130197A9F38B2DDF91CF911F91FA\r\n:103BB0000F91FF90EF90DF90CF90BF900895CF933B\r\n:103BC000DF93EC010E949D1DBE010E94FA13DF915C\r\n:103BD000CF9108950E94DF1D292F2F70E92FE295C4\r\n:103BE000EF704E2F50E0FA013297EE30F105B8F445\r\n:103BF000ED56FF4F0C94B02B803F99F018F4883E9F\r\n:103C000070F40FC0843F59F40CC0883E50F0813FDF\r\n:103C100031F407C0822F869586958695089580E0B9\r\n:103C2000089581E008952EE0929F800D1124682F61\r\n:103C3000669566956695982F977085E0689FB001A8\r\n:103C4000112440E050E080E0FB01E40FF51FE9554E\r\n:103C5000FA4F208130E0092E02C0369527950A944C\r\n:103C6000E2F721703327042E01C0220F0A94EAF7ED\r\n:103C7000822B4F5F5F4F4530510531F708952EE09D\r\n:103C8000929F800D1124E82FE695E695E6958770C2\r\n:103C900051E001C0550F8A95EAF785E0E89FF001F1\r\n:103CA0001124E955FA4F20E030E070E04081CB016B\r\n:103CB000022E02C0969587950A94E2F7817081954D\r\n:103CC00084278523842781932F5F3F4F253031053B\r\n:103CD00069F70895CF92DF92EF92FF926B017C011A\r\n:103CE0000E94C615C0926A04D0926B04E0926C04E4\r\n:103CF000F0926D04FF90EF90DF90CF900C948F1DA9\r\n:103D00000F931F9341E050E060E070E004C0440F67\r\n:103D1000551F661F771F8A95D2F74095509560957D\r\n:103D2000709580916A0490916B04A0916C04B0919D\r\n:103D30006D048A019B01082319232A233B23C9010F\r\n:103D4000B8011F910F910C946A1E2091D4058095A3\r\n:103D500082238093D405982F977079F430E0482F10\r\n:103D6000082E000C550B2417350739F085958595DD\r\n:103D700085950E94801E1092D40508950F931F937D\r\n:103D800041E050E060E070E004C0440F551F661F42\r\n:103D9000771F8A95D2F780916A0490916B04A09165\r\n:103DA0006C04B0916D048A019B01082B192B2A2BFE\r\n:103DB0003B2BC901B8011F910F910C946A1E6093AF\r\n:103DC000D9057093DA058093DB059093DC050C949C\r\n:103DD0008F1D8091A60590917505891719F08F5F49\r\n:103DE0008770FBCF08950F931F93CF93DF9380913C\r\n:103DF000740582958F7009F05DC0809171058823EC\r\n:103E000009F458C08091A6051091750560916F0561\r\n:103E100070917005C0917205D091730591E06F3F6C\r\n:103E200009F090E0292F06E0811709F443C020979C\r\n:103E300021F07F3F21F030E003C031E001C0322F9C\r\n:103E400090E030FD34C0089FF001099FF00D11246F\r\n:103E5000DF01AA58BA4F11963C911197371327C02A\r\n:103E60003C91361324C012963C91129731111FC019\r\n:103E700013964D915C9114974C1B5D0B483C51057A\r\n:103E8000B0F4809174058F70806180937405E5585B\r\n:103E9000FA4F80818F70806180838FE695E00E9469\r\n:103EA0001D16DF91CF911F910F910C94E91E019681\r\n:103EB0008770BACFDF91CF911F910F9108959F9294\r\n:103EC000AF92BF92CF92DF92EF92FF920F931F9328\r\n:103ED000CF93DF93CDB7DEB761970FB6F894DEBF0F\r\n:103EE0000FBECDBF8C0185E0F801DE011D9601906B\r\n:103EF0000D928A95E1F7F80190818181E2803091FD\r\n:103F00006F056091700540917205509173054115E0\r\n:103F1000510531F06F3F31F421E03F3F19F403C008\r\n:103F200021E001C020E0F22FF1709F2E20FD23C17F\r\n:103F3000F801C380D4802FE6A22E25E0B22EF090A7\r\n:103F40007105F601E41BF50BFF2009F4CEC02091AA\r\n:103F50007405E83CF10508F099C0422F407F09F054\r\n:103F600051C0681311C039130FC0FE2CE1100CC0F2\r\n:103F70002F70206120937405C5010E941D16809149\r\n:103F80007405F801858337C1CD2831F08F3F31F4B6\r\n:103F900021E09F3F19F403C021E001C020E020FD93\r\n:103FA00003C021E02E2502C020E030E0F22FF170A6\r\n:103FB000FF2E20FF1DC02091A6054091750556E0FB\r\n:103FC000241709F4F6C030E0529FF001539FF00D22\r\n:103FD0001124EA58FA4F6181861306C06081961356\r\n:103FE00003C06281E61204C02F5F3F4F2770E8CF05\r\n:103FF000FE2CEE2009F4FFC080917405816080934F\r\n:10400000740550C0681307C0391305C0E11003C020\r\n:10401000F80125838DC09D878E878D859E850E94A2\r\n:10402000EA1D882369F1EE2059F120917405822F51\r\n:1040300082958F7090E0029774F080916F05909157\r\n:10404000700598878F831986DB86CA862C87CE01F8\r\n:1040500007960E941D1686E0F801AFE6B5E00190D4\r\n:104060000D928A95E1F70E94F31E0DC06817E1F0EA\r\n:104070009D878E878D859E850E94EA1D81111EC0B9\r\n:10408000C8010E941D16FF24F394B5C0422F407F43\r\n:1040900069F78FE695E00E941D1686E0F501119202\r\n:1040A0008A95E9F7F12CA7C03913E2CFE110E0CFF0\r\n:1040B000F8012583C8010E941D1657C0EE2001F3A8\r\n:1040C00020917405822F82958F7090E002971CF2E8\r\n:1040D00080916F05909170059A8389831B82DD82A0\r\n:1040E000CC822E83CE010196B4CFE83CF105E8F5F1\r\n:1040F000FE2CEE2029F2681327C0391325C0209129\r\n:10410000740520FD18C0822F82958F70482F50E0D3\r\n:104110004115510581F0F80125834F30510541F0DB\r\n:104120008F5F982F9295907F822F8F70892B858338\r\n:10413000C8010E941D1686E0F801AFE6B5E00190C7\r\n:104140000D928A95E1F757C09D878E878D859E8554\r\n:104150000E94EA1D81117FCF809174058160809358\r\n:104160007405C8010E941D1646C086E0F501119233\r\n:104170008A95E9F740C0EE2009F482CF9D878E87AB\r\n:104180008D859E850E94EA1DF82E882309F478CF3C\r\n:1041900086E0F801AFE6B5E001900D928A95E1F76F\r\n:1041A00080916F05909170050E94DF1D0E94F31EA3\r\n:1041B00022C09D878E878D859E850E94DF1D292FB9\r\n:1041C00022952F70223028F49F7039F0811105C09C\r\n:1041D0000BC0243028F49F7049F4805E883020F0B2\r\n:1041E000C8010E941D169F2CF92C05C0F80195816D\r\n:1041F000907F99F7F9CF8F2D61960FB6F894DEBFB7\r\n:104200000FBECDBFDF91CF911F910F91FF90EF9027\r\n:10421000DF90CF90BF90AF909F9008951092D705F8\r\n:1042200080912601882331F08091FE0287FF02C031\r\n:104230008EE101C086E0E1E5F5E0DF011D928A959F\r\n:10424000E9F70C948F1DEF92FF920F931F93CF937A\r\n:10425000DF937C018B010E943127811119C0E70196\r\n:1042600001151105A1F08091E80085FD0AC080913B\r\n:10427000E8008E778093E8000E943127882381F33D\r\n:1042800007C089918093F10001501109E9CF80E0C6\r\n:10429000DF91CF911F910F91FF90EF9008956F9252\r\n:1042A0007F928F929F92AF92BF92CF92DF92EF92C6\r\n:1042B0000F931F93CF93DF933C01C09127018EE0B2\r\n:1042C000C89FC02D1124DEE0DC0FD73408F0D6E4FF\r\n:1042D00060913C06669580913406909135060E9467\r\n:1042E0000E12182FCD1708F044C08C2E912CF4011B\r\n:1042F000E658FD4F9081809128018923C1F1F40196\r\n:10430000EE0FFF1FE251FE4FC080D12C80E7C81A8C\r\n:10431000D108F401EE0FFF1FE151FE4FA080B12C38\r\n:10432000E0E2AE1AB108CC9C9001CD9C300D300D6E\r\n:104330001124AA9CC001AB9C900D900D1124820FFA\r\n:10434000931F0E94B411082F6091390670913A06AC\r\n:1043500080913B06E12E9501A601F30109950E948B\r\n:104360001812462F282F672FC4010E947B11CF5FA0\r\n:10437000B9CF81E0D63408F080E0DF91CF911F9172\r\n:104380000F91EF90DF90CF90BF90AF909F908F9064\r\n:104390007F906F900895CF92DF92EF92FF920F93EC\r\n:1043A0001F93CF93DF936C01C09127018EE0C89FCC\r\n:1043B000C02D1124DEE0DC0FD73408F0D6E4609184\r\n:1043C0003C06669580913406909135060E940E1247\r\n:1043D000182FCD1778F5EC2EF12CF701E658FD4F8C\r\n:1043E000908180912801892319F1F701EE0FFF1FB9\r\n:1043F000E151FE4F208130E020523109F701EE0FEC\r\n:10440000FF1FE251FE4F408150E04057510960913B\r\n:10441000390670913A0680913B06012FF601099505\r\n:104420000E941812462F282F672FC7010E947B1168\r\n:10443000CF5FCFCF81E0D63408F080E0DF91CF911D\r\n:104440001F910F91FF90EF90DF90CF900895DF9232\r\n:10445000EF92FF920F931F93CF93DF937C01C09154\r\n:1044600027018EE0C89FC02D1124DEE0DC0FD73479\r\n:1044700008F0D6E460913C06669566958091340616\r\n:10448000909135060E940E12D82ECD17F0F40C2F05\r\n:1044900010E0F801E658FD4F9081809128018923B2\r\n:1044A00091F06091390670913A0680913B062D2D6E\r\n:1044B0004C2FF70109950E941812462F282F672FBD\r\n:1044C000C8010E947B11CF5FE0CF81E0D63408F0B5\r\n:1044D00080E0DF91CF911F910F91FF90EF90DF90DF\r\n:1044E00008959F92AF92BF92CF92DF92EF92FF9288\r\n:1044F0000F931F93CF93DF936C01C09127018EE040\r\n:10450000C89FC02D1124DEE0DC0FD73408F0D6E4BC\r\n:1045100060913C06669566958091340690913506CB\r\n:104520000E940E12182F80E4810F0E94931190E8D0\r\n:10453000F92EF80E812F0E94931120E8922E980EEA\r\n:10454000CD1700F5AC2EB12CF501E658FD4F90814A\r\n:10455000809128018923A1F06091390670913A0673\r\n:1045600080913B06E12E0C2F292D4F2DF601099548\r\n:104570000E941812462F282F672FC5010E947B1119\r\n:10458000CF5FDECF81E0D63408F080E0DF91CF91BD\r\n:104590001F910F91FF90EF90DF90CF90BF90AF9061\r\n:1045A0009F900895CF92DF92EF92FF920F931F9307\r\n:1045B000CF93DF936C01C09127018EE0C89FC02D7F\r\n:1045C0001124DEE0DC0FD73408F0D6E420913C065D\r\n:1045D00030E040E050E06FEF7FEF80E090E00E943D\r\n:1045E000252B8901CD17E8F5EC2EF12CF701E658C3\r\n:1045F000FD4F908180912801892389F190910B06CC\r\n:10460000915097FD15C0492F092E000C550BFA014A\r\n:10461000E55FF94F8189C813F3CF440F551FFA01A5\r\n:10462000E55FF94F218D328D2017310748F701C022\r\n:10463000980160913C06C9010E940E12AC01609184\r\n:10464000390670913A0680913B06F60109950E9461\r\n:104650001812462F282F672FC7010E947B11CF5FAA\r\n:10466000C1CF81E0D63408F080E0DF91CF911F9177\r\n:104670000F91FF90EF90DF90CF9008952F923F928F\r\n:104680004F925F926F927F928F929F92AF92BF9262\r\n:10469000CF92DF92EF92FF920F931F93CF93DF930E\r\n:1046A000CDB7DEB727970FB6F894DEBF0FBECDBFEC\r\n:1046B000282E4B01209127018EE0289F802D112468\r\n:1046C0008E83182F125F173408F016E430910B0612\r\n:1046D00039839E81911708F077C08E81682E712CE6\r\n:1046E000F301E658FD4F908180912801892309F458\r\n:1046F00067C03090390640903A06522C1F82C301A1\r\n:10470000880F991FDC01A251BE4FBB83AA83C3014E\r\n:10471000880F991FFC01E151FE4FFD83EC83F98165\r\n:104720005F16E0F5E52CF12CAA81BB81CC90D12C51\r\n:10473000F701E55FF94F8181C81AD108AC81BD81CD\r\n:10474000AC90B12C8185A81AB108CC9C9001CD9C6D\r\n:10475000300D300D1124AA9CC001AB9C900D900D22\r\n:104760001124820F931F0E94B411082FF701EE0F3E\r\n:10477000FF1FE55FF94F60913C06818D928D0E948D\r\n:104780000E127C019501A601632D742D8F81F40119\r\n:104790000995362E472E8F835394C1CF20913B0627\r\n:1047A0008F81382F329F312D1124832F632D742D4B\r\n:1047B0000E941812462F282F672FC3010E947B11D9\r\n:1047C0008E818F5F8E8385CF81E0163408F080E084\r\n:1047D00027960FB6F894DEBF0FBECDBFDF91CF9105\r\n:1047E0001F910F91FF90EF90DF90CF90BF90AF900F\r\n:1047F0009F908F907F906F905F904F903F902F9001\r\n:1048000008951F93CF93DF93CDB7DEB7AA970FB666\r\n:10481000F894DEBF0FBECDBFE3E0F6E08091F1007B\r\n:10482000819346E0EB30F407C9F7809104068330AA\r\n:1048300009F460C030F4813071F0823009F49AC01C\r\n:10484000B1C08A3009F486C08B3009F46BC089305E\r\n:1048500009F0A8C020C080910306813A09F0A2C0E7\r\n:104860008091E800877F8093E8008091070690910F\r\n:104870000806892B21F460E28FED95E003C060E02B\r\n:1048800080E090E070E00E94EF288091E8008B7754\r\n:104890008093E80087C080910306813209F082C0CE\r\n:1048A0008091070690910806009719F0029709F089\r\n:1048B00079C08091E800877F8093E8008091E800CC\r\n:1048C00082FD05C0809101068111F8CF6BC08091F7\r\n:1048D000F2009091F300029729F48091F1008B7F10\r\n:1048E000813021F48091F1008093DE058091E80011\r\n:1048F0008B7754C080910306813A09F053C08091B0\r\n:10490000070690910806892B09F04CC08091E800B9\r\n:10491000877F8093E8008091E80080FFFCCF809142\r\n:10492000260137C0809103068132E1F580910706A8\r\n:1049300090910806892BB1F58091E800877F8093DC\r\n:10494000E8000E94642780910506809326010E945A\r\n:104950000E2128C080910306813221F58091E80064\r\n:10496000877F8093E8000E946427809106068093E9\r\n:10497000DD0518C080910306813AA1F48091E8001A\r\n:10498000877F8093E8008091E80080FFFCCF8091D2\r\n:10499000DD058093F1008091E8008E778093E80038\r\n:1049A0000E9464278091E80083FFDAC180910306AA\r\n:1049B00090910406492F50E04A30510508F0D0C1CB\r\n:1049C000FA01EF55FF4F0C94B02B803821F082385C\r\n:1049D00009F0C6C108C08091FF0590910006992397\r\n:1049E00089F082600FC0809107068F70873008F0D1\r\n:1049F000B7C18093E9008091EB0085FB882780F99F\r\n:104A00001092E9009091E800977F9093E8008093DE\r\n:104A1000F1001092F1006DC1282F2D7F09F0A0C187\r\n:104A2000882319F0823061F09BC1809105068130A6\r\n:104A300009F096C1933009F080E0809300062EC003\r\n:104A40008091050681112AC0809107068F702FEF93\r\n:104A5000280F263008F084C18093E9002091EB00F4\r\n:104A600020FF1CC0933021F48091EB00806214C0C1\r\n:104A70009091EB0090619093EB0021E030E0A90170\r\n:104A800002C0440F551F8A95E2F74093EA00109246\r\n:104A9000EA008091EB0088608093EB001092E900BF\r\n:104AA0008091E800877F8093E8000E94642758C1C6\r\n:104AB000811156C1109105061F778091E30080781F\r\n:104AC000812B8093E3008091E800877F8093E8004A\r\n:104AD0000E9464278091E80080FFFCCF8091E30072\r\n:104AE00080688093E300111102C082E001C083E07E\r\n:104AF0008093010635C18058823008F031C1209181\r\n:104B00000506309106062C3D53E0350779F583E024\r\n:104B10008A838AE289834FB7F894DE01139620E0F6\r\n:104B20003EE051E2E32FF0E050935700E49120FF84\r\n:104B300003C0E295EF703F5FEF708E2F90E0EA3098\r\n:104B400010F0C79601C0C0968D939D932F5F2431BE\r\n:104B500049F74FBF8091E800877F8093E8006AE2C1\r\n:104B600070E0CE0101960E94EF28B1C08091070647\r\n:104B700090910806432F552743305105A9F068F45A\r\n:104B80004130510509F4FBC04230510509F0E8C03D\r\n:104B90008BE590E0E5E5F5E04BC04132510529F1A8\r\n:104BA0004232510589F1DCC0C90199278130910554\r\n:104BB000A1F058F0029709F0D3C0E2ECF5E0E491DF\r\n:104BC0008E2F90E0E2ECF5E030C0E2E3F6E0E49115\r\n:104BD0008E2F90E0E2E3F6E028C0EEE1F6E0E4910B\r\n:104BE0008E2F90E0EEE1F6E020C08330910508F0D2\r\n:104BF000B7C0880F991FFC01EE55FE4F0190F08160\r\n:104C0000E02D89E090E014C08330910508F0A8C041\r\n:104C1000FC01EE0FFF1FE456FE4F0190F081E02DE6\r\n:104C2000DC01A756BE4F8C9190E0009709F498C024\r\n:104C30002091E800277F2093E80020910906309119\r\n:104C40000A062817390708F4C90140E0009771F1F6\r\n:104C5000209101062223D9F12530C9F12091E800E5\r\n:104C600023FD35C02091E80022FD2DC02091E800F1\r\n:104C700020FFECCF2091F2003091F300009759F023\r\n:104C80002830310540F444914093F100319601976A\r\n:104C90002F5F3F4FF3CF41E02830310509F040E06E\r\n:104CA0002091E8002E772093E800D0CF4111D0CF9B\r\n:104CB0000AC080910106882351F0853041F080912F\r\n:104CC000E80083FD04C08091E80082FFF2CF80916C\r\n:104CD000E8008B778093E80043C0803809F040C03B\r\n:104CE0008091E800877F8093E8008091020680939E\r\n:104CF000F1008091E8008E77D6CE811131C080918D\r\n:104D00000506909106069927029754F58091E800D0\r\n:104D1000877F8093E80010910506109302060E9499\r\n:104D20006427111106C08091E30087FD02C081E075\r\n:104D300001C084E08093010642E061EC81E00E94C2\r\n:104D4000832742E261EC84E00E94832742E261EC27\r\n:104D500082E00E94832742E260EC83E00E94832786\r\n:104D60008091E80083FF10C08091E800877F8093E6\r\n:104D7000E8008091EB0080628093EB0005C082E147\r\n:104D800090E0E0EBF5E054CFAA960FB6F894DEBFC2\r\n:104D90000FBECDBFDF91CF911F9108951F920F924B\r\n:104DA0000FB60F9211242F933F934F935F936F93FE\r\n:104DB0007F938F939F93AF93BF93CF93DF93EF93A3\r\n:104DC000FF93C091E900CF708091EC00D82FD17093\r\n:104DD00080FDD0E81092E9008091F000877F8093F9\r\n:104DE000F00078940E9401241092E9008091F00074\r\n:104DF00088608093F000CD2BCF70C093E900FF91C5\r\n:104E0000EF91DF91CF91BF91AF919F918F917F9162\r\n:104E10006F915F914F913F912F910F900FBE0F9027\r\n:104E20001F901895E8EDF0E080818C7F80831092D0\r\n:104E3000E2001092DA001092E100A0EEB0E08C9156\r\n:104E400081608C9380818F77808319BCA7EDB0E05F\r\n:104E50008C918E7F8C9380818F7E808310923D0613\r\n:104E600008952091E4003091E50095E64091EC0032\r\n:104E7000842F817040FF23C08091E80080FD1DC019\r\n:104E800080910106882399F0853099F08091EB009C\r\n:104E900085FD11C04091E4005091E50024173507CD\r\n:104EA00029F3915011F09A01E1CF84E0089582E056\r\n:104EB000089583E0089581E0089580E00895409189\r\n:104EC000E80042FFDDCF08958091030687FF11C0FF\r\n:104ED0008091E80082FD05C0809101068111F8CF24\r\n:104EE00011C08091E8008B770BC080910106882368\r\n:104EF00049F08091E80080FFF8CF8091E8008E773C\r\n:104F00008093E8000895982F973068F59093E90012\r\n:104F1000981739F07091EC002091ED005091F0005D\r\n:104F200003C0242F762F50E021FD02C09F5FECCFFD\r\n:104F30003091EB003E7F3093EB003091ED003D7FF0\r\n:104F40003093ED003091EB0031603093EB007093C3\r\n:104F5000EC002093ED005093F0002091EE0027FD2F\r\n:104F6000E5CF80E008958F708093E90081E0089597\r\n:104F7000CF92DF92EF92FF920F931F93CF93DF9325\r\n:104F8000C8EDD0E088818F7E8883E7EDF0E08081F6\r\n:104F90008160808381E080933D0688818C7F888357\r\n:104FA00002EE10E0D8011C921092DA0081EEC82EB9\r\n:104FB000D12CD6011C9288818F7788838881806864\r\n:104FC000888388818F7D888380818068808319BCF5\r\n:104FD0001092010610920206109200061092FF0530\r\n:104FE00090EEE92EF12CF70180818B7F8083888100\r\n:104FF0008160888342E060E080E00E948327D601E0\r\n:105000008C918E7F8C93F801808181608083808178\r\n:1050100088608083D7018C918E7F8C93888180619A\r\n:105020008883DF91CF911F910F91FF90EF90DF90D8\r\n:10503000CF9008951F920F920FB60F9211242F93C5\r\n:105040003F934F935F936F937F938F939F93AF9310\r\n:10505000BF93EF93FF938091E10082FF09C080919D\r\n:10506000E20082FF05C08091E1008B7F8093E10028\r\n:105070008091DA0080FF2AC08091D80080FF26C08E\r\n:105080008091DA008E7F8093DA008091D90080FFD2\r\n:1050900018C088E189BD8AE189BD09B400FEFDCF51\r\n:1050A00081E08093010680913D0681110FC00E942E\r\n:1050B00012270E94B8278091E20084608093E2006A\r\n:1050C00005C019BC1092010610923D068091E100C6\r\n:1050D00080FF17C08091E20080FF13C08091E20042\r\n:1050E0008E7F8093E2008091E20080618093E200F5\r\n:1050F0008091D80080628093D80019BC85E08093AD\r\n:1051000001068091E10084FF2EC08091E20084FFBF\r\n:105110002AC088E189BD8AE189BD09B400FEFDCFBE\r\n:105120008091D8008F7D8093D8008091E1008F7EA0\r\n:105130008093E1008091E2008F7E8093E200809175\r\n:10514000E20081608093E20080910206882311F0E2\r\n:1051500084E007C08091E30087FD02C081E001C0C8\r\n:1051600083E0809301068091E10083FF27C0809156\r\n:10517000E20083FF23C08091E100877F8093E100FC\r\n:1051800082E080930106109202068091E1008E7FFA\r\n:105190008093E1008091E2008E7F8093E200809115\r\n:1051A000E20080618093E20042E060E080E00E94E3\r\n:1051B00083278091F00088608093F000FF91EF9149\r\n:1051C000BF91AF919F918F917F916F915F914F911F\r\n:1051D0003F912F910F900FBE0F901F901895209127\r\n:1051E000090630910A062617370748F06115710540\r\n:1051F00039F42091E8002E772093E80001C0B9012E\r\n:10520000FC0120E06115710569F180910106882398\r\n:10521000E1F18530E1F18091E80083FD3AC08091B1\r\n:10522000E80082FD2CC08091E80080FFEBCF8091E8\r\n:10523000F2009091F3006115710551F088309105ED\r\n:1052400038F421912093F100615071090196F3CF58\r\n:1052500021E0089709F020E08091E8008E778093A4\r\n:10526000E800D0CF2111D1CF0AC080910106882358\r\n:1052700061F0853061F08091E80083FD0AC0809183\r\n:10528000E80082FFF2CF80E0089582E0089583E095\r\n:10529000089581E00895882341F080959091D70585\r\n:1052A00089238093D7050C94491D0895882339F0EC\r\n:1052B0009091D705892B8093D7050C94491D0895AB\r\n:1052C000882309F458C0682F823869F40E94A3101B\r\n:1052D00081FF51C069E38FE495E00E94931C0E9416\r\n:1052E000491D69E30EC0833891F40E94A31080FF2A\r\n:1052F00042C063E58FE495E00E94931C0E94491D23\r\n:1053000063E58FE495E00E946B1C0C94491D843882\r\n:1053100069F40E94A31082FF2EC067E48FE495E039\r\n:105320000E94931C0E94491D67E4EBCF8CEF860F0F\r\n:10533000813A38F380E2860F883070F4677081E03C\r\n:1053400090E001C0880F6A95EAF780959091D705A3\r\n:1053500089238093D705D9CF8BE5860F833020F43E\r\n:1053600080E090E00C948D10685A673120F480E062\r\n:1053700090E00C9477100895CF93882309F4B5C07A\r\n:10538000C82F8238B1F40E94A31081FDAEC069E33A\r\n:105390008FE495E00E94931C0E94491D2FEF80E747\r\n:1053A00092E0215080409040E1F700C0000069E3A6\r\n:1053B00017C08338E1F40E94A31080FD96C063E516\r\n:1053C0008FE495E00E94931C0E94491D2FEF80E717\r\n:1053D00092E0215080409040E1F700C0000063E57A\r\n:1053E0008FE495E00E946B1CCF910C94491D84388A\r\n:1053F000B1F40E94A31082FD78C067E48FE495E0C9\r\n:105400000E94931C0E94491D2FEF80E792E02150DB\r\n:1054100080409040E1F700C0000067E4E1CF8CEFEE\r\n:105420008C0F813AB8F5809126018823E1F08091B4\r\n:10543000FE0287FF18C0EC2FE695E695E695F0E0B2\r\n:10544000E15BFA4F8281282F30E04C2F477081E0DA\r\n:1054500090E002C0880F991F4A95E2F782239323B8\r\n:10546000892B59F411C0E1E5F5E08191C81729F0C5\r\n:1054700025E0E735F207C9F707C06C2F8FE495E008\r\n:105480000E946B1C0E94491D6C2F8FE495E00E94C6\r\n:10549000931CAACF80E28C0F883068F4C77081E03B\r\n:1054A00090E001C0880FCA95EAF79091D705892B43\r\n:1054B0008093D70599CFEBE5EC0FE33040F4F0E0B3\r\n:1054C000E054FD4F808190E0CF910C948D10C85A2C\r\n:1054D000C73158F4EC2FF0E0EE0FFF1FED53FD4FF6\r\n:1054E00080819181CF910C947710CF9108958F9204\r\n:1054F0009F92AF92BF92CF92DF92EF92FF92CF93A3\r\n:10550000DF93EC01688179818A819B816115710546\r\n:105510008105910521F464E279ED8BE597E02DE1B9\r\n:1055200033EF41E050E00E94252B49015A019B01D5\r\n:10553000AC01A7EAB1E40E94442B6B017C01ACEE04\r\n:10554000B4EFA50194010E94522BDC01CB018C0D1C\r\n:105550009D1DAE1DBF1DB7FF03C00197A109B04837\r\n:1055600088839983AA83BB839F77DF91CF91FF9034\r\n:10557000EF90DF90CF90BF90AF909F908F90089565\r\n:105580000E94772A089580E091E00E94772A08958A\r\n:10559000A0E0B0E08093000190930101A09302018C\r\n:1055A000B09303010895DC01CB01FC01F999FECF12\r\n:1055B00006C0F2BDE1BDF89A319600B40D9241509B\r\n:1055C0005040B8F70895F999FECF92BD81BDF89A81\r\n:1055D000992780B50895A8E1B0E042E050E00C942E\r\n:1055E000D52ADC01A40FB51F4150504048F0CB0133\r\n:1055F000840F951F2E910E94022B41505040D0F7EE\r\n:105600000895262FF999FECF92BD81BDF89A019792\r\n:1056100000B4021639F01FBA20BD0FB6F894FA9AFA\r\n:10562000F99A0FBE08950396272F0E94022B0E941D\r\n:10563000012B252F0E94022B242F0C94022B019664\r\n:10564000272F0E94022B0C94012B052E97FB1EF492\r\n:1056500000940E943C2B57FD07D00E94572B07FC5B\r\n:1056600003D04EF40C943C2B5095409530952195E9\r\n:105670003F4F4F4F5F4F089590958095709561957E\r\n:105680007F4F8F4F9F4F08950E94792BA59F900DBC\r\n:10569000B49F900DA49F800D911D11240895B7FF14\r\n:1056A0000C94442B0E94442B821B930B0895A1E27F\r\n:1056B0001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F8C\r\n:1056C000FF1FA217B307E407F50720F0A21BB30BD7\r\n:1056D000E40BF50B661F771F881F991F1A9469F753\r\n:1056E00060957095809590959B01AC01BD01CF01AF\r\n:1056F0000895A29FB001B39FC001A39F700D811DAB\r\n:105700001124911DB29F700D811D1124911D0895CA\r\n:10571000AA1BBB1B51E107C0AA1FBB1FA617B707D7\r\n:1057200010F0A61BB70B881F991F5A95A9F78095F3\r\n:105730009095BC01CD01089597FB072E16F40094B7\r\n:1057400007D077FD09D00E94882B07FC05D03EF4D6\r\n:10575000909581959F4F0895709561957F4F08951D\r\n:10576000EE0FFF1F0590F491E02D0994FB01DC0181\r\n:1057700002C001900D9241505040D8F70895FB01AE\r\n:10578000DC014150504048F001900D920020C9F7D3\r\n:1057900001C01D9241505040E0F70895F894FFCFAA\r\n:1057A00001000000FFFF033D8EFFB07F958EFFB02C\r\n:1057B0007F958EFFB07F958EFFB07F6C1BAB1B6B10\r\n:1057C0001BA71BA31BB00100FF008EFFB0737973F2\r\n:1057D00074656D37362F6C61756E63685F6C6974C4\r\n:1057E000655F3100302E372E3130332D3430323674\r\n:1057F0002D6737666432663500F1F2F3F4F56665BD\r\n:10580000646362616707060504C660C70107030693\r\n:1058100002090109030302080103020301260C0D1A\r\n:105820000E10110F12131721222500003131295AB1\r\n:105830001B750A2131426384B040226D1505F304C3\r\n:10584000860467058005A00544434241403F3E3D34\r\n:105850003C3B3A3938372728292A2B2C2D2E2F303C\r\n:1058600031323334262524232221201F1E1D1C1BE8\r\n:105870001A450C0B0A090807060504030201003645\r\n:105880000D0E0F1011191213141516171835D130EB\r\n:10589000BE30AB309C308C307D306E305F3050305D\r\n:1058A0004130313022300B3008401B402A40394013\r\n:1058B00050406E4085409440A740C240D140E040F7\r\n:1058C000E030C520B220A3209420852076206720D8\r\n:1058D0005720482039202A201B20082004101710A8\r\n:1058E000261035104410541063107210811090105F\r\n:1058F0009F10AF10BE10CD10E020E010C900B60020\r\n:10590000A7009800890079006A005B004C003D0008\r\n:105910002E001E000F000000E00004040404040434\r\n:105920000404040404040404040404040404040437\r\n:105930000404040404040404040404040404040427\r\n:105940000404040404040404040404040404040417\r\n:105950000404040404040404040404040404040407\r\n:10596000818283E200E900EA00B500B600B700CD0D\r\n:10597000008301CC008A01920194012102230224B8\r\n:10598000022502260227022A02B300B4006F00702B\r\n:02599000000015\r\n:00000001FF\r\n"
  },
  {
    "path": "debian/changelog",
    "content": "system76-keyboard-configurator (1.3.13) jammy; urgency=medium\n\n  * 1.3.13 release.\n\n -- Ian Douglas Scott <idscott@system76.com>  Tue, 17 Feb 2026 19:58:49 -0800\n\nsystem76-keyboard-configurator (1.3.12) jammy; urgency=medium\n\n  * 1.3.12 release.\n\n -- Ian Douglas Scott <idscott@system76.com>  Wed, 07 Aug 2024 10:24:27 -0700\n\nsystem76-keyboard-configurator (1.3.11) jammy; urgency=medium\n\n  * 1.3.11 release.\n\n -- Jeremy Soller <jeremy@system76.com>  Tue, 25 Jun 2024 09:22:20 -0600\n\nsystem76-keyboard-configurator (1.3.10) jammy; urgency=medium\n\n  * 1.3.10 release.\n\n -- Levi Portenier <levi@system76.com>  Tue, 10 Oct 2023 10:13:04 -0600\n\nsystem76-keyboard-configurator (1.3.7) jammy; urgency=medium\n\n  * 1.3.7 release.\n\n -- Levi Portenier <levi@system76.com>  Tue, 27 Jun 2023 09:58:45 -0600\n\nsystem76-keyboard-configurator (1.3.6) jammy; urgency=medium\n\n  * 1.3.6 release.\n\n -- Levi Portenier <levi@system76.com>  Wed, 07 Jun 2023 13:14:33 -0600\n\nsystem76-keyboard-configurator (1.3.5) jammy; urgency=medium\n\n  * 1.3.5 release\n\n -- Levi Portenier <levi@system76.com>  Tue, 06 Jun 2023 09:48:32 -0600\n\nsystem76-keyboard-configurator (1.3.2) focal; urgency=medium\n\n  * 1.3.2 release.\n\n -- Ian Douglas Scott <idscott@system76.com>  Tue, 02 May 2023 14:42:50 -0700\n\nsystem76-keyboard-configurator (1.3.1) focal; urgency=medium\n\n  * 1.3.1 release.\n\n -- Jeremy Soller <jeremy@system76.com>  Mon, 27 Mar 2023 18:40:57 -0600\n\nsystem76-keyboard-configurator (1.3.0) focal; urgency=medium\n\n  * 1.3.0 release.\n\n -- Ian Scott <idscott@system76.com>  Wed, 16 Nov 2022 08:23:08 -0800\n\nsystem76-keyboard-configurator (1.2.0) focal; urgency=medium\n\n  * 1.2.0 release.\n\n -- Ian Douglas Scott <idscott@system76.com>  Mon, 27 Jun 2022 11:57:12 -0700\n\nsystem76-keyboard-configurator (1.1.0) focal; urgency=medium\n\n  * 1.1.0 release.\n\n -- Ian Douglas Scott <idscott@system76.com>  Thu, 18 Nov 2021 08:07:12 -0800\n\nsystem76-keyboard-configurator (1.0.0) focal; urgency=medium\n\n  * First stable release.\n\n -- Ian Douglas Scott <idscott@system76.com>  Thu, 27 May 2021 15:53:28 -0700\n\nsystem76-keyboard-configurator (0.2.11) focal; urgency=medium\n\n  * 0.2.11 release.\n\n -- Ian Douglas Scott <idscott@system76.com>  Thu, 27 May 2021 07:21:32 -0700\n\nsystem76-keyboard-configurator (0.2.10) focal; urgency=medium\n\n  * 0.2.10 beta release.\n\n -- Ian Douglas Scott <idscott@system76.com>  Mon, 24 May 2021 10:20:43 -0700\n\nsystem76-keyboard-configurator (0.1.0) focal; urgency=medium\n\n  * Initial release.\n\n -- Ian Douglas Scott <idscott@system76.com>  Tue, 18 Aug 2020 09:54:33 -0700\n"
  },
  {
    "path": "debian/com.system76.pkexec.keyboardconfigurator.policy",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE policyconfig PUBLIC\n \"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN\"\n \"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd\">\n<policyconfig>\n\n  <action id=\"com.system76.pkexec.keyboardconfigurator\">\n    <message>Authentication required to run System76 Keyboard Configurator</message>\n    <icon_name>com.system76.keyboardconfigurator</icon_name>\n    <defaults>\n      <allow_any>auth_admin</allow_any>\n      <allow_inactive>auth_admin</allow_inactive>\n      <allow_active>auth_admin</allow_active>\n    </defaults>\n    <annotate key=\"org.freedesktop.policykit.exec.path\">/usr/bin/system76-keyboard-configurator</annotate>\n    <annotate key=\"org.freedesktop.policykit.exec.allow_gui\">true</annotate>\n  </action>\n\n</policyconfig>\n"
  },
  {
    "path": "debian/compat",
    "content": "11\n"
  },
  {
    "path": "debian/control",
    "content": "Source: system76-keyboard-configurator\nSection: admin\nPriority: optional\nMaintainer: System76 <info@system76.com>\nBuild-Depends:\n  debhelper (>= 11),\n  cargo,\n  rustc (>=1.36.0),\n  libgtk-3-dev,\n  libhidapi-dev,\n  libudev-dev,\n  pkg-config,\nStandards-Version: 4.3.0\nHomepage: https://github.com/pop-os/keyboard-configurator\n\nPackage: system76-keyboard-configurator\nArchitecture: amd64 arm64\nDepends:\n  ${misc:Depends},\n  ${shlibs:Depends}\nDescription: System76 Keyboard Configurator\n  Application for configuration of System76 keyboard firmware.\n\nPackage: test-launch-system76-keyboard-configurator\nArchitecture: amd64 arm64\nDepends:\n  system76-keyboard-configurator,\n  avrdude,\n  dfu-programmer,\nDescription: Internal testing version of the System76 keyboard configurator.\n\nPackage: libsystem76-keyboard-configurator\nArchitecture: amd64 arm64\nDepends:\n  ${misc:Depends},\n  ${shlibs:Depends}\nDescription: Pop keyboard backlight library\n Shared library for C which provides the Pop!_OS keyboard backlight as a GTK widget.\n\nPackage: libsystem76-keyboard-configurator-dev\nArchitecture: all\nDepends:\n  libsystem76-keyboard-configurator (= ${binary:Version}),\n  ${misc:Depends}\nDescription: Pop keyboard backlight library header\n The C header required to link to the Pop!_OS keyboard backlight widget library.\n"
  },
  {
    "path": "debian/copyright",
    "content": "Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/\nUpstream-Name: system76-keyboard-configurator\nSource: https://github.com/pop-os/keyboard-configurator\n\nFiles: *\nCopyright: Copyright 2020 System76\nLicense: GPL-3\n"
  },
  {
    "path": "debian/libsystem76-keyboard-configurator-dev.install",
    "content": "usr/include\n"
  },
  {
    "path": "debian/libsystem76-keyboard-configurator.install",
    "content": "usr/lib/libsystem76_keyboard_configurator.so\nusr/lib/pkgconfig/system76_keyboard_configurator.pc\n"
  },
  {
    "path": "debian/libsystem76-keyboard-configurator.trigger",
    "content": "ldconfig"
  },
  {
    "path": "debian/rules",
    "content": "#!/usr/bin/make -f\n\nCLEAN ?= 1\nVENDOR ?= 1\n\n%:\n\tdh $@\n\noverride_dh_auto_clean:\nifeq ($(CLEAN),1)\n\tmake clean\nendif\nifeq ($(VENDOR),1)\n\tif ! ischroot; then \\\n\t\tmake vendor; \\\n\tfi\nendif\n\noverride_dh_auto_build:\n\tenv CARGO_HOME=\"$$(pwd)/target/cargo\" \\\n\t\tmake all VENDOR=$(VENDOR) prefix=/usr\n\noverride_dh_auto_install:\n\tdh_auto_install -- prefix=/usr\n"
  },
  {
    "path": "debian/source/format",
    "content": "3.0 (native)\n"
  },
  {
    "path": "debian/source/options",
    "content": "tar-ignore = \".git\"\ntar-ignore = \"target\"\ntar-ignore = \"vendor\"\n"
  },
  {
    "path": "debian/system76-keyboard-configurator.install",
    "content": "usr/bin/system76-keyboard-configurator\nusr/share/applications/com.system76.keyboardconfigurator.desktop\nusr/share/metainfo/com.system76.keyboardconfigurator.appdata.xml\nusr/share/icons\ndebian/com.system76.pkexec.keyboardconfigurator.policy usr/share/polkit-1/actions\n\ndata/system76_launch_1_default.hex /var/lib/system76-keyboard-configurator/\ndata/system76_launch_2_default.hex /var/lib/system76-keyboard-configurator/\ndata/system76_launch_lite_1_default.hex /var/lib/system76-keyboard-configurator/\ndata/system76_launch_heavy_1_default.hex /var/lib/system76-keyboard-configurator/\n"
  },
  {
    "path": "debian/test-launch-system76-keyboard-configurator.install",
    "content": "linux/com.system76.keyboardconfiguratorlaunchtest.desktop usr/share/applications/\n"
  },
  {
    "path": "ffi/Cargo.toml",
    "content": "[package]\nname = \"ffi\"\nversion = \"0.1.0\"\nauthors = [\"Ian Douglas Scott <idscott@system76.com>\"]\nedition = \"2021\"\n\n[lib]\nname = \"system76_keyboard_configurator\"\ncrate-type = [ \"cdylib\" ]\n\n[dependencies]\ngtk = \"0.18.0\"\nsystem76-keyboard-configurator-widgets = { path = \"../widgets\" }\n"
  },
  {
    "path": "ffi/build.rs",
    "content": "use std::{env, fs::File, io::Write, path::PathBuf};\n\nfn main() {\n    let target_dir = PathBuf::from(\"../target\");\n\n    let pkg_config = format!(\n        include_str!(\"system76_keyboard_configurator.pc.in\"),\n        name = \"system76_keyboard_configurator\",\n        description = env::var(\"CARGO_PKG_DESCRIPTION\").unwrap(),\n        version = env::var(\"CARGO_PKG_VERSION\").unwrap()\n    );\n\n    File::create(target_dir.join(\"system76_keyboard_configurator.pc.stub\"))\n        .expect(\"failed to create pc.stub\")\n        .write_all(pkg_config.as_bytes())\n        .expect(\"failed to write pc.stub\");\n}\n"
  },
  {
    "path": "ffi/src/lib.rs",
    "content": "use gtk::glib::object::ObjectType;\nuse std::mem;\nuse system76_keyboard_configurator_widgets::keyboard_backlight_widget;\n\n#[no_mangle]\npub extern \"C\" fn pop_keyboard_backlight_widget() -> *mut gtk::ffi::GtkWidget {\n    unsafe {\n        gtk::set_initialized();\n    }\n\n    let widget = keyboard_backlight_widget();\n    let ptr = widget.as_ptr();\n    mem::forget(widget);\n\n    ptr\n}\n"
  },
  {
    "path": "ffi/system76_keyboard_configurator.h",
    "content": "#pragma once\n\n#include <gtk/gtk.h>\n\nGtkWidget *pop_keyboard_backlight_widget ();"
  },
  {
    "path": "ffi/system76_keyboard_configurator.pc.in",
    "content": "Name: {name}\nDescription: {description}\nVersion: {version}\nCflags: -I${{includedir}}\nLibs: -L${{libdir}} -l{name}\n"
  },
  {
    "path": "flake.nix",
    "content": "{\n  description = \"System76 Keyboard Configurator\";\n\n  inputs = {\n    flake-utils.url = \"github:numtide/flake-utils\";\n    nixpkgs.url = \"github:nixos/nixpkgs/nixos-24.05\";\n    naersk.url = \"github:nix-community/naersk\";\n  };\n\n  outputs = { self, nixpkgs, flake-utils, naersk }:\n    flake-utils.lib.eachDefaultSystem (system:\n      let\n        pkgs = import nixpkgs { inherit system; };\n        naersk-lib = naersk.lib.\"${system}\";\n      in\n      {\n        packages = rec {\n          default = system76-keyboard-configurator;\n\n          system76-keyboard-configurator = naersk-lib.buildPackage {\n            name = \"system76-keyboard-configurator\";\n            version = \"1.3.12\";\n            src = ./.;\n            buildInputs = with pkgs; [ pkg-config rustc cargo hidapi glib gtk3 ];\n          };\n        };\n\n        devShells.default = pkgs.mkShell {\n          buildInputs = with pkgs; [ pkg-config rustc cargo hidapi glib gtk3 ];\n        };\n\n        formatter = nixpkgs.legacyPackages.\"${system}\".nixfmt;\n      });\n}\n"
  },
  {
    "path": "i18n/cs/system76_keyboard_configurator.ftl",
    "content": "-name = Nastavení Klávesnice\n\napp-about = O {-name}\napp-title = System76 {-name}\n\nboard-fake = {$model}, falešný\n\nbutton-cancel = Zrušit\nbutton-configure = Nastavit Klávesnici\nbutton-disable = Vypnout\nbutton-import = Importovat\nbutton-test = Vyzkoušet\nbutton-start = Start\nbutton-stop = Stop\n\nerror-disable-key = Vypnutí klávesy selhalo\nerror-export-keymap = Exportování mapy kláves selhalo\nerror-import-keymap = Importování mapy kláves selhalo\nerror-key-led = Nastavení LED selhalo.\nerror-open-file = Otevření souboru selhalo\nerror-save-leds = Uložení LED selhalo\nerror-set-keyboard-brightness = Nastavení jasu selhalo\nerror-set-keyboard-mode = Nastavení režimu klávesnice selhalo\nerror-set-keymap = Nastavení mapy kláves selhalo\nerror-set-layer-brightness = Nastavení jasu vrstvy selhalo\nerror-set-layer-color = Nastavení barvy vrstvy selhalo.\nerror-set-layer-mode = Nastavení módu vrstvy selhalo.\nerror-unsupported-keymap = Nepodporovaný soubor mapy kláves\nerror-unsupported-keymap-desc = Soubor mapy kláves z novější verzi konfigurace.\n\nfirmware-version = Firmware verze {$version} nepodporuje konfiguraci kláves.\n\nkeyboard-brightness = Jas:\nkeyboard-color = Barva:\n\nkey-color = Barva klávesy:\n\nkeymap-for-board = Mapa kláves je pro klávesnici '{$model}'\n\nlayer-all-brightness = Jas (všechny vrstvy):\nlayer-animation-speed = Rychlost animace vrstvy:\nlayer-color = Barva vrstvy:\nlayer-color-pattern = Vzor barvy vrstvy:\nlayer-saturation = Saturace vrstvy:\n\nlayout-export = Exportovat vrstvu\nlayout-import = Importovat vrstvu\nlayout-reset = Resetovat vrstvu\nlayout-invert-f-keys = Invertovat F klávesy\n\nloading = Klávesnice detekována. Načítání...\nloading-keyboard = Načítání mapy kláves a LED pro {$keyboard}\n\npage-electrical = Electrické\npage-keycaps = Klávesy\npage-layer1 = Vrstva 1\npage-layer2 = Vrstva 2\npage-layer3 = Vrstva 3\npage-layer4 = Vrstva 4\npage-leds = LEDky\npage-logical = Logické\n\nno-boards = Nebyla detekována klávesnice\nno-boards-msg = Ujistěte se, že klávesnice má aktualizovaný\n System76 Otevřený Firmware.\n Pokud používáte externí klávesnici, ujistěte se,\n že je správně zapojena.\n\nshow-help-overlay = Klávesové zkratky\n\nstack-keymap = Mapa kláves\nstack-keymap-desc =\n Vyberte klávesu na mapě kláves pro změnu nastavení. Shift pro výběr více kláves najednou. Nastavení jsou automaticky ukládány do firmwaru.\n\nstack-leds = LEDky\nstack-leds-desc = Vyberte klávesu pro změnu nastavení. Zvolte 'každá klávesa' pro změnu barvy každé klávesy. Shift pro výběr více kláves najednou. Nastaavení jsou automaticky ukládány do firmwaru.\nstack-leds-desc-builtin = Nastavení LED se resetují po restartu zařízení. Více funkcí budou přidány do budoucna.\n\nstack-testing = Testování\n\ntest-check-pins = Zkontrolovat piny (chybící)\ntest-check-key = Zkontrolovat klávesy (lepící)\ntest-number-of-runs = Počet testů\ntest-replace-switch = Vyměňte switch\ntest-spurious-keypress = Falešné zmáčknutí klávesy\n\nuntitled-layout = Vrstva bez nadpisu\n"
  },
  {
    "path": "i18n/cs/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = Vypnuto\nmode-solid-color = Celé rozložení\nmode-per-key = Každá klávesa\nmode-active-keys = Nastavené klávesy\nmode-cycle-all = Kosmické pozadí\nmode-cycle-left-right = Horizontální\nmode-cycle-up-down = Vertikální\nmode-cycle-out-in = Horizont událostí\nmode-cycle-out-in-dual = Dvojhvězdy\nmode-rainbow-moving-chevron = Časoprostor\nmode-cycle-pinwheel = Kolo\nmode-cycle-spiral = Spirála\nmode-raindrops = Kapky deště\nmode-splash = Splashdown\nmode-multisplash = Meteorový déšť\n\nno-board = Žádná klávesnice\n"
  },
  {
    "path": "i18n/cs/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = Barva\nbutton-cancel = Zrušit\nbutton-save = Uložit\n\nchoose-color = Nastavit barvu\n\nerror-set-color = Nastavení barvy klávesnice selhalo\nerror-set-brightness = Nastavení jasu klávesnice selhalo\n\nlabel-hue = Odstín\nlabel-saturation = Sytost\n\nscale-brightness = Jas\n"
  },
  {
    "path": "i18n/da/system76_keyboard_configurator.ftl",
    "content": "-name = Keyboard Konfigureringsværktøj\n\napp-about = Om {-name}\napp-title = System76 {-name}\n\nboard-fake = {$model}, Falsk\n\nbutton-cancel = Annuller\nbutton-configure = Konfigurer Keyboard\nbutton-disable = Slå fra\nbutton-import = Importer\nbutton-test = Test\nbutton-start = Start\nbutton-stop = Stop\n\nerror-disable-key = Fejlede i at slå tast fra\nerror-export-keymap = Fejlede i at exportere keymap\nerror-import-keymap = Fejlede i at importere keymap\nerror-key-led = Fejlede i at key'e LED\nerror-open-file = Fejlede i at åbne fil\nerror-save-leds = Fejlede i at gemme LEDer\nerror-set-keyboard-brightness = Fejlede i at sætte lysstyrke\nerror-set-keyboard-mode = Fejlede i at sætte tastatur mode\nerror-set-keymap = Fejlede i at sætte keymap\nerror-set-layer-brightness = Fejlede i at sætte lag's lysstyrke\nerror-set-layer-color = Fejlede i at sætte lag's farve\nerror-set-layer-mode = Fejlede i at sætte lag's mode\nerror-unsupported-keymap = keymap fil ikke understøttet\nerror-unsupported-keymap-desc = Keymap fil virker til at komme fra en nyere version konfigureringsværktøj.\n\nfirmware-version = Firmware version {$version} understøtter ikke keymap konfiguration.\n\nkeyboard-brightness = Lysstyrke:\nkeyboard-color = Farve:\n\nkey-color = Tast farve:\n\nkeymap-for-board = Keymap er for tastatur '{$model}'\n\nlayer-all-brightness = Lysstyrke (alle lag):\nlayer-animation-speed = Lag's Animations fart:\nlayer-color = Lag's farve:\nlayer-color-pattern = Lag's Farve Mønster:\nlayer-saturation = Lag's Saturation:\n\nlayout-export = Exporter Layout\nlayout-import = Importer Layout\nlayout-reset = Nulstil Layout\nlayout-invert-f-keys = Inverter F Taster\n\nflash-to-launch-heavy = Flash til Launch Heavy 1\nflash-to-launch-2 = Flash til Launch 2\nflash-to-launch-1 = Flash til Launch 1\nflash-to-launch-lite-1 = Flash til Launch Lite 1\n\nloading = Tastatur(er) registreret. Loader...\nloading-keyboard = Loader keymap og LEDer for {$keyboard}\nfirmware-update-required = Keyboard Firmware Opdatering Påkrævet!\n\npage-electrical = Electrisk\npage-keycaps = Keycaps\npage-layer1 = lag 1\npage-layer2 = Lag 2\npage-layer3 = Lag 3\npage-layer4 = Lag 4\npage-leds = LEDer\npage-logical = Logisk\n\nno-boards = Intet Tastatur Registreret\nno-boards-msg = Vær sikker på dig indbyggede tastatur har oppe til dato\n System76 Åben Firmware.\n Hvis du bruger et externt Tastatur, dobbel check den er\n proppet ind ordentligt\n\nshow-help-overlay = Keyboard Genveje\n\nstack-keymap = Keymap\nstack-keymap-desc =\n Vælg en tast på keymap'et for at ændre dens indstillinger. Shift + klik for at vælg mere end et klik. Dine indstillinger bliver automatisk gemt til firmwaren.\n\nstack-leds = LEDer\nstack-leds-desc = Vælg en tast på keymapet for at ændre dens indstillinger. Vælg per tast Solid mønster for at modificere hver tast's LED farve. Shift + klik for at vælge mere end en tast. Dine indstillinger bliver automatisk gemt til firmwaren.\nstack-leds-desc-builtin = LED indstillinger nulstiller efter genstart. Mere functionalitet kommer i fremtiden.\n\nstack-testing = Tester\n\ntest-check-pins = Checker pins (mangler)\ntest-check-key = Checker tast (klæbning)\ntest-number-of-runs = Mængde af løb\ntest-replace-switch = Udskift switch\ntest-spurious-keypress = Falsk tastklik\n\nuntitled-layout = Unavngivet Layout\n"
  },
  {
    "path": "i18n/da/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = Slået fra\nmode-solid-color = Per Lag Solid Farve\nmode-per-key = Per Tast Solid\nmode-active-keys = Kun Bundede Taster\nmode-cycle-all = Cosmic Baggrund\nmode-cycle-left-right = Vandret Scan\nmode-cycle-up-down = Lodret Scan\nmode-cycle-out-in = Event Horizon\nmode-cycle-out-in-dual = Binære Galakser\nmode-rainbow-moving-chevron = Rumtid\nmode-cycle-pinwheel = Pinwheel Galaksesr\nmode-cycle-spiral = Spiral Galaxy\nmode-raindrops = Elementer\nmode-splash = Splashdown\nmode-multisplash = Meteor Regn\n\nno-board = Intet tastatur"
  },
  {
    "path": "i18n/da/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = Farve\nbutton-cancel = Annuller\nbutton-save = Gem\n\nchoose-color = Set Farve\n\nerror-set-color = Fejlede i at sætte tastatur farve\nerror-set-brightness = Fejlede i at sætte tastatur lysstyrke\n\nlabel-hue = Hue\nlabel-saturation = Saturation\n\nscale-brightness = Lysstyrke"
  },
  {
    "path": "i18n/de/system76_keyboard_configurator.ftl",
    "content": "-name = Tastatur-Konfigurator\n\napp-about = Über {-name}\napp-title = System76 {-name}\n\nboard-fake = {$model}, Fälschung\n\nbutton-cancel = Abbrechen\nbutton-configure = Tastatur einstellen\nbutton-disable = Deaktivieren\nbutton-import = Importieren\nbutton-test = Testen\n\nerror-disable-key = Taste konnte nicht deaktiviert werden\nerror-export-keymap = Tastaturbelegung konnte nicht exportiert werden\nerror-import-keymap = Tastaturbelegung konnte nicht importiert werden\nerror-key-led = LED konnte nicht getastet werden\nerror-open-file = Datei konnte nicht geöffnet werden\nerror-save-leds = LEDs konnten nicht gespeichert werden\nerror-set-keyboard-brightness = Fehler beim Einstellen der Helligkeit\nerror-set-keyboard-mode = Fehler beim Einstellen der Tastaturart\nerror-set-keymap = Fehler beim Einstellen der Tastaturbelegung\nerror-set-layer-brightness = Schichthelligkeit konnte nicht eingestellt werden\nerror-set-layer-color = Schichtfarbe konnte nicht eingestellt werden\nerror-set-layer-mode = Schichtart konnte nicht eingestellt werden\nerror-unsupported-keymap = Tastaturbelegungsdatei wird nicht unterstützt\nerror-unsupported-keymap-desc = Tastaturbelegungsdatei scheint von einer neueren Konfigurator-Version zu stammen.\n\nkeyboard-brightness = Helligkeit:\nkeyboard-color = Farbe:\n\nkey-color = Tastenfarbe:\n\nkeymap-for-board = Tastaturbelegung ist für Bord '{$model}'\n\nlayer-all-brightness = Helligkeit (alle Schichten):\nlayer-animation-speed = Schichtenanimationsgeschwindigkeit:\nlayer-color = Schichtenfarbe:\nlayer-color-pattern = Schichtenfarbenmuster:\nlayer-saturation = Schichtensättigung:\n\nlayout-export = Belegung exportieren\nlayout-import = Belegung importieren\nlayout-reset = Belegung zurücksetzen\n\nloading = Tastatur(en) erkannt. Laden...\nloading-keyboard = Tastaturbelegung und LEDs für {$keyboard} werden geladen\n\npage-electrical = Elektronisch\npage-keycaps = Tastenkappen\npage-layer1 = Schicht 1\npage-layer2 = Schicht 2\npage-layer3 = Schicht 3\npage-layer4 = Schicht 4\npage-leds = LEDs\npage-logical = Logisch\n\nno-boards = Keine Tastatur erkannt\nno-boards-msg = Stellen Sie sicher, dass Ihre eingebaute Tastatur die neuste\n System76 Open Firmware hat.\n Falls Sie eine externe Tastatur verwenden, stellen Sie sicher, dass diese\n richtig eingesteckt ist\n\nshow-help-overlay = Tastaturkürzel\n\nstack-keymap = Tastaturbelegung\nstack-keymap-desc =\n Wählen Sie eine Taste von der Tastaturbelegung um dessen Einstellungen zu ändern. Shift + Klick um mehrere auszuwählen. Ihre Einstellungen werden automatisch auf der Firmware gespeichert.\n\nstack-leds = LEDs\nstack-leds-desc = Wählen Sie eine Taste von der Tastaturbelegung um dessen Einstellungen zu ändern. Wählen Sie Tastenbezogenes Volltonfarbenmuster um jede Tasten-LED-Farbe einzustellen. Shift + Klick um mehrere auszuwählen. Ihre Einstellungen werden automatisch auf der Firmware gespeichert.\nstack-leds-desc-builtin = LED-Einstellungen werden sich nach einem Neustart zurücksetzen. Mehr Funktionen folgen in der Zukunft.\n\nstack-testing = Testen\n\ntest-check-pins = Pins überprüfen\ntest-number-of-runs = Anzahl der Durchläufe\ntest-replace-switch = Schalter ersetzen\ntest-serial = Seriell\n\nuntitled-layout = Unbenannte Schicht\n"
  },
  {
    "path": "i18n/de/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = Deaktiviert\nmode-solid-color = Schichtbezogene Volltonfarbe\nmode-per-key = Tastenbezogene Volltonfarbe\nmode-active-keys = Nur gebundene Tasten\nmode-cycle-all = Kosmischer Hintergrund\nmode-cycle-left-right = Horizontaler Scan\nmode-cycle-up-down = Vertikaler Scan\nmode-cycle-out-in = Ereignishorizont\nmode-cycle-out-in-dual = Binärgalaxien\nmode-rainbow-moving-chevron = Raumzeit\nmode-cycle-pinwheel = Windradgalaxie\nmode-cycle-spiral = Spiralengalaxie\nmode-raindrops = Elemente\nmode-splash = Wasserplatsch\nmode-multisplash = Meteoritenhagel\n\nno-board = Kein Bord\n"
  },
  {
    "path": "i18n/de/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = Farbe\nbutton-cancel = Abbrechen\nbutton-save = Speichern\n\nchoose-color = Farbe auswählen\n\nerror-set-color = Tastaturfarbe konnte nicht eingestellt werden\nerror-set-brightness = Tastaturhelligkeit konnte nicht eingestellt werden\n\nlabel-hue = Farbton\nlabel-saturation = Sättigung\n\nscale-brightness = Helligkeit\n"
  },
  {
    "path": "i18n/en/system76_keyboard_configurator.ftl",
    "content": "-name = Keyboard Configurator\n\napp-about = About {-name}\napp-title = System76 {-name}\n\nboard-fake = {$model}, fake\n\nbutton-cancel = Cancel\nbutton-configure = Configure Keyboard\nbutton-disable = Disable\nbutton-import = Import\nbutton-test = Test\nbutton-start = Start\nbutton-stop = Stop\n\nerror-disable-key = Failed to disable key\nerror-export-keymap = Failed to export keymap\nerror-import-keymap = Failed to import keymap\nerror-key-led = Failed to key LED\nerror-open-file = Failed to open file\nerror-save-leds = Failed to save LEDs\nerror-set-keyboard-brightness = Error setting brightness\nerror-set-keyboard-mode = Error setting keyboard mode\nerror-set-keymap = Failed to set keymap\nerror-set-layer-brightness = Failed to set layer brightness\nerror-set-layer-color = Failed to set layer color\nerror-set-layer-mode = Failed to set layer mode\nerror-unsupported-keymap = Unsupported keymap file\nerror-unsupported-keymap-desc = Keymap file appears to be from newer Configurator version.\n\nfirmware-version = Firmware version {$version} does not support keymap configuration.\n\nkeyboard-brightness = Brightness:\nkeyboard-color = Color:\n\nkey-color = Key Color:\n\nkeymap-for-board = Keymap is for board '{$model}'\n\nlayer-all-brightness = Brightness (all layers):\nlayer-animation-speed = Layer Animation Speed:\nlayer-color = Layer Color:\nlayer-color-pattern = Layer Color Pattern:\nlayer-saturation = Layer Saturation:\n\nlayout-export = Export Layout\nlayout-import = Import Layout\nlayout-reset = Reset Layout\nlayout-invert-f-keys = Invert F Keys\n\nflash-to-launch-heavy = Flash to Launch Heavy 1\nflash-to-launch-2 = Flash to Launch 2\nflash-to-launch-1 = Flash to Launch 1\nflash-to-launch-lite-1 = Flash to Launch Lite 1\n\nloading = Keyboard(s) detected. Loading...\nloading-keyboard = Loading keymap and LEDs for {$keyboard}\nfirmware-update-required = Keyboard Firmware Update Required!\n\npage-electrical = Electrical\npage-keycaps = Keycaps\npage-layer1 = Layer 1\npage-layer2 = Layer 2\npage-layer3 = Layer 3\npage-layer4 = Layer 4\npage-leds = LEDs\npage-logical = Logical\n\nno-boards = No keyboard detected\nno-boards-msg = Make sure your built-in keyboard has up to date\n System76 Open Firmware.\n If using an external keyboard, make sure it is\n plugged in properly\n\nshow-help-overlay = Keyboard Shortcuts\n\nstack-keymap = Keymap\nstack-keymap-desc =\n Select a key on the keymap to change its settings. Shift + click to select more than one click. Your settings are automatically saved to firmware.\n\nstack-leds = LEDs\nstack-leds-desc = Select a key on the keymap to change its settings. Choose per key Solid Pattern to customize each key's LED color. Shift + click to select more than one key. Your settings are automatically saved to firmware.\nstack-leds-desc-builtin = LED settings will reset after reboot. More functionality is coming in the future.\n\nstack-testing = Testing\n\ntest-check-pins = Check pins (missing)\ntest-check-key = Check key (sticking)\ntest-number-of-runs = Number of runs\ntest-replace-switch = Replace switch\ntest-spurious-keypress = Spurious keypress\n\nuntitled-layout = Untitled Layout\n"
  },
  {
    "path": "i18n/en/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = Disabled\nmode-solid-color = Per Layer Solid Color\nmode-per-key = Per Key Solid\nmode-active-keys = Bound Keys Only\nmode-cycle-all = Cosmic Background\nmode-cycle-left-right = Horizontal Scan\nmode-cycle-up-down = Vertical Scan\nmode-cycle-out-in = Event Horizon\nmode-cycle-out-in-dual = Binary Galaxies\nmode-rainbow-moving-chevron = Spacetime\nmode-cycle-pinwheel = Pinwheel Galaxy\nmode-cycle-spiral = Spiral Galaxy\nmode-raindrops = Elements\nmode-splash = Splashdown\nmode-multisplash = Meteor Shower\n\nno-board = No board"
  },
  {
    "path": "i18n/en/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = Color\nbutton-cancel = Cancel\nbutton-save = Save\n\nchoose-color = Set Color\n\nerror-set-color = Failed to set keyboard color\nerror-set-brightness = Failed to set keyboard brightness\n\nlabel-hue = Hue\nlabel-saturation = Saturation\n\nscale-brightness = Brightness"
  },
  {
    "path": "i18n/es/system76_keyboard_configurator.ftl",
    "content": "-name = Configurador del teclado\n\napp-about = Acerca de {-name}\napp-title = {-name} System76\n\nboard-fake = {$model}, falso\n\nbutton-cancel = Cancelar\nbutton-configure = Configurar teclado\nbutton-disable = Desactivar\nbutton-import = Importar\nbutton-test = Probar\nbutton-start = Empezar\nbutton-stop = Parar\n\nerror-disable-key = Fallo al desactivar la tecla\nerror-export-keymap = Fallo al exportar el mapeo\nerror-import-keymap = Fallo al importar el mapeo\nerror-key-led = Fallo a cambiar el LED de la tecla\nerror-open-file = Fallo al abrir el archivo\nerror-save-leds = Fallo al guardar LEDs\nerror-set-keyboard-brightness = Fallo al cambiar el brillo\nerror-set-keyboard-mode = Fallo al cambiar modo del teclado\nerror-set-keymap = Fallo al cambiar mapeo\nerror-set-layer-brightness = Fallo al cambiar el brillo de la capa\nerror-set-layer-color = Fallo al cambiar el color de la capa\nerror-set-layer-mode = Fallo al cambiar el modo de capa\nerror-unsupported-keymap = Archivo de mapeo no respaldado\nerror-unsupported-keymap-desc = El archivo de mapeo parece ser de una versión más reciente del configurador.\n\nfirmware-version = La versión de firmware {$version} no respalda la configuración del mapeo de teclas.\n\nkeyboard-brightness = Brillo:\nkeyboard-color = Color:\n\nkey-color = Color de la tecla:\n\nkeymap-for-board = El mapeo es para el '{$model}'\n\nlayer-all-brightness = Brillo (todas las capas):\nlayer-animation-speed = Velocidad de animación de capa:\nlayer-color = Color de capa:\nlayer-color-pattern = Patrón de color de capa:\nlayer-saturation = Saturación de capa:\n\nlayout-export = Exportar distribución\nlayout-import = Importar distribución\nlayout-reset = Restablecer distribución\nlayout-invert-f-keys = Invertir teclas F\n\nloading = Teclado(s) detectado(s). Cargando...\nloading-keyboard = Cargando mapeo y LEDs para {$keyboard}\n\npage-electrical = Eléctrica\npage-keycaps = Teclas\npage-layer1 = Capa 1\npage-layer2 = Capa 2\npage-layer3 = Capa 3\npage-layer4 = Capa 4\npage-leds = LEDs\npage-logical = Lógica\n\nno-boards = No se detecta ningún teclado\nno-boards-msg = Asegurate que tu teclado integrado tiene un Firmware\n System76 actualizado.\n Si estás usando un teclado externo, asegúrate que\n esté conectado correctamente.\n\nshow-help-overlay = Atajos de teclado\n\nstack-keymap = Mapeo\nstack-keymap-desc =\n Selecciona una tecla en el mapeo para cambiar su configuración. Haz Shift + Click para seleccionar más de una tecla. Tus cambios se guardan automáticamente al Firmware.\n\nstack-leds = LEDs\nstack-leds-desc = Selecciona una tecla en el mapeo para cambiar su configuración. Elige \"Patrón Sólido\" en una tecla para cambiar su color de el LED. Haz Shift + Click para seleccionar más de una tecla. Tus cambios se guardan automáticamente al Firmware.\nstack-leds-desc-builtin = La configuración de las LEDs se restablecerá al reiniciar el PC. Más funcionalidad será añadida en el futuro.\n\nstack-testing = Probando\n\ntest-check-pins = Comprueba los pines\ntest-check-key = Comprueba la tecla\ntest-number-of-runs = Número de ciclos\ntest-replace-switch = Cambia el interruptor de la tecla\ntest-spurious-keypress = Pulsaciones falsas\n\nuntitled-layout = Distribución sin título\n"
  },
  {
    "path": "i18n/es/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = Desabilitado\nmode-solid-color = Color sólido por capa\nmode-per-key = Sólido por tecla\nmode-active-keys = Solo teclas enlazadas\nmode-cycle-all = Fondo cosmico\nmode-cycle-left-right = Barrido horizontal\nmode-cycle-up-down = Barrido vertical\nmode-cycle-out-in = Horizonte de sucesos\nmode-cycle-out-in-dual = Galaxias binarias\nmode-rainbow-moving-chevron = Espacio-tiempo\nmode-cycle-pinwheel = Galaxia de molinillo\nmode-cycle-spiral = Galaxia espiral\nmode-raindrops = Elementos\nmode-splash = Chapuzón\nmode-multisplash = Lluvia de meteoritos\n\nno-board = Sin placa\n"
  },
  {
    "path": "i18n/es/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = Color\nbutton-cancel = Cancelar\nbutton-save = Guardar\n\nchoose-color = Escoger un color\n\nerror-set-color = Fallo al aplicar color del teclado\nerror-set-brightness = Fallo al aplicar brillo del teclado\n\nlabel-hue = Matíz\nlabel-saturation = Saturación\n\nscale-brightness = Brillo\n"
  },
  {
    "path": "i18n/fi/system76_keyboard_configurator.ftl",
    "content": "-name = Näppäimistön Konfiguraattori\n\napp-about = Tietoa {-name}\napp-title = System76 {-name}\n\nboard-fake = {$model}, väärennös\n\nbutton-cancel = Peruuta\nbutton-configure = Konfiguroi Näppäimistö\nbutton-disable = Ota pois päältä\nbutton-import = Tuo\nbutton-test = Testaa\nbutton-start = Aloita\nbutton-stop = Pysäytä\n\nerror-disable-key = Näppäimistön käytöstä poistaminen epäonnistui\nerror-export-keymap = Keymapin vienti epäonnistui\nerror-import-keymap = Keymapin tuonti epäonnistui\nerror-key-led = Taustavalon asetus epäonnistui\nerror-open-file = Tiedostoa ei pystytty avamaan\nerror-save-leds = Taustavalon talletus epäonnistui\nerror-set-keyboard-brightness = Kirkkauden asetusvirhe\nerror-set-keyboard-mode = Näppäimistötilan asetusvirhe\nerror-set-keymap = Keymapin soveltaminen epäonnistui\nerror-set-layer-brightness = Kerroksen kirkkauden asettaminen epäonnistui\nerror-set-layer-color = Kerroksen värin asettaminen epäonnistui\nerror-set-layer-mode = Kerrostilan asettaminen epäonnistui\nerror-unsupported-keymap = Tätä Keymap-tiedostoa ei tueta\nerror-unsupported-keymap-desc = Tämä Keymap-tiedosto näyttäisi olevan uudemmasta Configurator versiosta.\n\nfirmware-version = Laiteohjelmistoversio {$version} ei tue Keymap-asetusta.\n\nkeyboard-brightness = Kirkkaus:\nkeyboard-color = Väri:\n\nkey-color = Näppäin Väri:\n\nkeymap-for-board = Keymap on näppäimistölle '{$model}'\n\nlayer-all-brightness = Kirkkaus (kaikki kerrokset):\nlayer-animation-speed = Kerroksen Animaationopeus:\nlayer-color = Kerroksen Väri:\nlayer-color-pattern = Kerroksen värikuvio:\nlayer-saturation = Kerroksen Kylläisyys:\n\nlayout-export = Vie Asettelu\nlayout-import = Tuo Asettelu\nlayout-reset = Resetoi Asettelu\nlayout-invert-f-keys = Käännä F-näppäimet\n\nflash-to-launch-heavy = Väläytä Käynnistääksesi Launch Heavy 1\nflash-to-launch-2 = Väläytä Käynnistääksesi Launch 2\nflash-to-launch-1 = Väläytä Käynnistääksesi Launch 1\nflash-to-launch-lite-1 = Väläytä Käynnistääksesi Launch Lite 1\n\nloading = Näppäimistö(t) havaittu. Ladataan...\nloading-keyboard = Ladataan keymap ja taustavalo näppäimistölle {$keyboard}\nfirmware-update-required = Näppäimistön laiteohjelmiston päivitys vaaditaan!\n\npage-electrical = Sähköinen\npage-keycaps = Näppäimet\npage-layer1 = Kerros 1\npage-layer2 = Kerros 2\npage-layer3 = Kerros 3\npage-layer4 = Kerros 4\npage-leds = Taustavalot\npage-logical = Looginen\n\nno-boards = Näppäimistöä ei havaittu\nno-boards-msg = Varmista, että sisäänrakennetussa näppäimistössä on uusin version System76 Open Firmware -ohjelmistosta.\n Jos käytät ulkoista näppäimistöä, varmista, että se on liitetty oikein ja,\n että se on kytketty oikein.\n\nshow-help-overlay = Pikanäppäimet\n\nstack-keymap = Keymap\nstack-keymap-desc =\n Valitse näppäin keymapista muuttaaksesi sen asetuksia. Valitse useampi kuin yksi näppäin painamalla ja pitämällä samalla Shift-näppäintä painettuna. Asetuksesi tallentuvat automaattisesti laiteohjelmaan. \nstack-leds = Taustavalot\nstack-leds-desc = Valitse näppäin keymapista muuttaaksesi sen asetuksia. Valitse näppäimen yksivärisyys-kuvio säätääksesi kunkin näppäimen taustavalaistusta. Valitse useita näppäimiä pitämällä Shift-näppäintä painettuna. Asetuksesi tallentuvat automaattisesti laiteohjelmaan.\nstack-leds-desc-builtin = Taustavaloasetukset nollataan uudelleenkäynnistyksen jälkeen. Lisää toimintoja on saatavilla tulevaisuudessa.\n\nstack-testing = Testataan\n\ntest-check-pins = Tarkista pinnit (puuttuu)\ntest-check-key = Tarkista näppäimet (tartutaan)\ntest-number-of-runs = Ajojen määrä\ntest-replace-switch = Vaihda kytkin\ntest-spurious-keypress = Väärä näppäintoiminto\n\nuntitled-layout = Nimetön Asettelu\n"
  },
  {
    "path": "i18n/fi/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = Pois Käytöstä\nmode-solid-color = Yksivärisyys Per Kerros\nmode-per-key = Yksivärisyys Per Näppäin\nmode-active-keys = Vain Aktiiviset Näppäimet\nmode-cycle-all = Cosmic Tausta\nmode-cycle-left-right = Horisontaali Skannaus\nmode-cycle-up-down = Vertikaali Skannaus\nmode-cycle-out-in = Tapahtumahorisontti\nmode-cycle-out-in-dual = Binäärigalaksit\nmode-rainbow-moving-chevron = Aika-avaruus\nmode-cycle-pinwheel = Pinwheel-Galaksi\nmode-cycle-spiral = Spiraaligalaksi\nmode-raindrops = Elementit\nmode-splash = Splashdown\nmode-multisplash = Meteorisade\n\nno-board = Ei näppäimistöä\n"
  },
  {
    "path": "i18n/fi/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = Väri\nbutton-cancel = Peruuta\nbutton-save = Tallenna\n\nchoose-color = Aseta Väri\n\nerror-set-color = Näppäimistön värin asettaminen epäonnistui\nerror-set-brightness = Näppäimistön kirkkauden asettaminen epäonnistui\n\nlabel-hue = Värisävy\nlabel-saturation = Kylläisyys\n\nscale-brightness = Kirkkaus\n"
  },
  {
    "path": "i18n/fr/system76_keyboard_configurator.ftl",
    "content": "-name = Configurateur de clavier\n\napp-about = À propos du {-name}\napp-title = System76 {-name}\n\nboard-fake = {$model}, simulé\n\nbutton-cancel = Annuler\nbutton-configure = Configurer ce clavier\nbutton-disable = Désactiver\nbutton-import = Importer\nbutton-test = Vérifier\n\nerror-disable-key = Échec dans la désactivation de la touche.\nerror-export-keymap = Échec lors de l'exportation du plan de codage.\nerror-import-keymap = Échec lors de l'importation du plan de codage.\nerror-key-led = Échec lors de la configuration de la DEL de la touche.\nerror-open-file = Échec lors de la lecture du fichier.\nerror-save-leds = Échec lors de la sauvegarde des DELs.\nerror-set-keyboard-brightness = Échec lors de la configuration de la luminosité du clavier.\nerror-set-keyboard-mode = Échec lors de la configuration du mode du clavier.\nerror-set-keymap = Échec lors de la configuration du plan de codage.\nerror-set-layer-brightness = Échec lors de la configuration de la luminosité de la couche.\nerror-set-layer-color = Échec lors de la configuration de la couleur de la couche.\nerror-set-layer-mode = Échec lors de la configuration du mode de la couche.\nerror-unsupported-keymap = Fichier contenant le plan de codage incompatible.\nerror-unsupported-keymap-desc = Fichier contenant le plan de codage provient d'une version plus récente du logiciel.\n\nkey-color = Couleur de la touche:\n\nkeymap-for-board = Plan de codage pour '{$model}'\n\nlayer-all-brightness = Luminosité (toutes les couches):\nlayer-animation-speed = Vitesse de l'animation de la couche:\nlayer-color = Couleur de la couche:\nlayer-color-pattern = Patron de couleur de la couche:\nlayer-saturation = Saturation de la couche:\n\nlayout-export = Exporter la configuration\nlayout-import = Importer la configuration\nlayout-reset = Réinitialiser la configuration\n\nloading = Clavier(s) détecté(s). Chargement...\nloading-keyboard = Chargement du plan de codage et DELs pour {$keyboard}\n\npage-electrical = Électrique\npage-keycaps = Capuchon de touche\npage-layer1 = Couche 1\npage-layer2 = Couche 2\npage-layer3 = Couche 3\npage-layer4 = Couche 4\npage-leds = DELs\npage-logical = Logique\n\nno-boards = Aucun clavier détecté.\nno-boards-msg = Assurer que le System76 Open Firmware est \n mis à jour pour un clavier intégré. \n Avec un clavier externe, assurer qu'il est bien connecté.\n\nshow-help-overlay = Raccourcis du clavier\n\nstack-keymap = Plan de codage\nstack-keymap-desc =\n Choisir une touche sur le plan de codage afin de modifier ses paramètres. Les changements seront sauvegardés automatiquement dans le microcode.\n\nstack-leds = DELs\nstack-leds-desc = Choisir une touche sur le plan de codage afin de modifier ses paramètres. La couleur de la touche individuelle est réglée à partir de l'option Solide par touche. La sélection de touches multiple se fait à partir de Shift et clique. Les changements seront sauvegardés automatiquement dans le microcode.\n\n\nstack-testing = Vérification\n\ntest-check-pins = Vérifier les broches\ntest-number-of-runs = Nombre de cycles\ntest-replace-switch = Remplacé l'interrupteur\ntest-serial = Séquentiel\n\nuntitled-layout = Disposition sans-titre\n"
  },
  {
    "path": "i18n/fr/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = Désactiver\nmode-solid-color = Couleur solide par couche\nmode-per-key = Solide par touche\nmode-active-keys = Touches actives seulement\nmode-cycle-all = Arrière-plan cosmique\nmode-cycle-left-right = Balayage horizontal\nmode-cycle-up-down = Balayage vertical\nmode-cycle-out-in = Horizon du trou noir\nmode-cycle-out-in-dual = Galaxies binaires\nmode-rainbow-moving-chevron = Espace-temps\nmode-cycle-pinwheel = Galaxie du Moulinet\nmode-cycle-spiral = Galaxie spirale\nmode-raindrops = Gouttes d'eau\nmode-splash = Amerrissage\nmode-multisplash = Pluie de météores\n\nno-board = Aucune carte électronique"
  },
  {
    "path": "i18n/fr/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = Couleur\nbutton-cancel = Annuler\nbutton-save = Sauvegarder\n\nchoose-color = Choisir la couleur\n\nerror-set-color = Échec lors de la configuration de la couleur du clavier\nerror-set-brightness = Échec lors de la configuration de la luminosité du clavier\n\nlabel-hue = Teinte\nlabel-saturation = Saturation\n\nscale-brightness = Luminosité"
  },
  {
    "path": "i18n/hu/system76_keyboard_configurator.ftl",
    "content": "-name = Billentyűzet-konfigurátor\n\napp-about = A {-name} névjegye\napp-title = System76 {-name}\n\nboard-fake = {$model}, hamis\n\nbutton-cancel = Mégse\nbutton-configure = Billentyűzet beállítása\nbutton-disable = Letiltás\nbutton-import = Importálás\nbutton-test = Teszt\nbutton-start = Indítás\nbutton-stop = Leállítás\n\nerror-disable-key = Nem sikerült letiltani a billentyűt\nerror-export-keymap = Nem sikerült exportálni a billentyűkiosztást\nerror-import-keymap = Nem sikerült importálni a billentyűkiosztást\nerror-key-led = Nem sikerült vezérelni a billentyű LED-jét\nerror-open-file = Nem sikerült megnyitni a fájlt\nerror-save-leds = Nem sikerült elmenteni a LED-beállításokat\nerror-set-keyboard-brightness = Hiba a fényerő beállításakor\nerror-set-keyboard-mode = Hiba a billentyűzet mód beállításakor\nerror-set-keymap = Nem sikerült beállítani a billentyűkiosztást\nerror-set-layer-brightness = Nem sikerült beállítani a réteg fényerejét\nerror-set-layer-color = Nem sikerült beállítani a réteg színét\nerror-set-layer-mode = Nem sikerült beállítani a réteg módját\nerror-unsupported-keymap = Nem támogatott billentyűkiosztás-fájl\nerror-unsupported-keymap-desc = A billentyűkiosztás-fájl úgy tűnik, újabb Konfigurátor-verzióból származik.\n\nfirmware-version = A(z) {$version} verziószámú firmware nem támogatja a billentyűkiosztás beállítását.\n\nkeyboard-brightness = Fényerő:\nkeyboard-color = Szín:\n\nkey-color = Billentyű színe:\n\nkeymap-for-board = A billentyűkiosztás a(z) '{$model}' modellhez készült\n\nlayer-all-brightness = Fényerő (minden réteg):\nlayer-animation-speed = Réteg animáció sebessége:\nlayer-color = Réteg színe:\nlayer-color-pattern = Rétegszín minta:\nlayer-saturation = Réteg telítettsége:\n\nlayout-export = Elrendezés exportálása\nlayout-import = Elrendezés importálása\nlayout-reset = Elrendezés visszaállítása\nlayout-invert-f-keys = F billentyűk invertálása\n\nflash-to-launch-heavy = Feltöltés a Launch Heavy 1-re\nflash-to-launch-2 = Feltöltés a Launch 2-re\nflash-to-launch-1 = Feltöltés a Launch 1-re\nflash-to-launch-lite-1 = Feltöltés a Launch Lite 1-re\n\nloading = Billentyűzet(ek) észlelve. Betöltés...\nloading-keyboard = Billentyűkiosztás és LED-ek betöltése: {$keyboard}\nfirmware-update-required = Billentyűzet-firmware frissítés szükséges!\n\npage-electrical = Elektromos\npage-keycaps = Billentyűsapkák\npage-layer1 = 1. réteg\npage-layer2 = 2. réteg\npage-layer3 = 3. réteg\npage-layer4 = 4. réteg\npage-leds = LED-ek\npage-logical = Logikai\n\nno-boards = Nincs billentyűzet észlelve\nno-boards-msg = Győződj meg róla, hogy a beépített billentyűzeten a\n System76 Open Firmware naprakész.\n Ha külső billentyűzetet használsz, ellenőrizd,\n hogy megfelelően csatlakozik\n\nshow-help-overlay = Billentyűparancsok megjelenítése\n\nstack-keymap = Billentyűkiosztás\nstack-keymap-desc =\n Válassz ki egy billentyűt a kiosztáson a beállításai módosításához. Shift + kattintással többet is kijelölhetsz. A beállításaid automatikusan elmentődnek a firmware-be.\n\nstack-leds = LED-ek\nstack-leds-desc = Válassz ki egy billentyűt a kiosztáson a beállításaihoz. Válaszd az \"Egyedi minta\" opciót minden billentyű színének külön-külön testreszabásához. Shift + kattintással több billentyű is kijelölhető. A beállításaid automatikusan elmentődnek a firmware-be.\nstack-leds-desc-builtin = A LED-beállítások újraindítás után visszaállnak. További funkciók később érkeznek.\n\nstack-testing = Tesztelés\n\ntest-check-pins = Ellenőrizd a csatlakozókat (hiányzik)\ntest-check-key = Ellenőrizd a billentyűt (beragadt)\ntest-number-of-runs = Futások száma\ntest-replace-switch = Cseréld ki a kapcsolót\ntest-spurious-keypress = Véletlenszerű billentyűlenyomás\n\nuntitled-layout = Névtelen elrendezés\n"
  },
  {
    "path": "i18n/hu/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = Letiltva\nmode-solid-color = Egységes szín rétegenként\nmode-per-key = Egyedi szín billentyűnként\nmode-active-keys = Csak hozzárendelt billentyűk\nmode-cycle-all = Kozmikus háttér\nmode-cycle-left-right = Vízszintes pásztázás\nmode-cycle-up-down = Függőleges pásztázás\nmode-cycle-out-in = Eseményhorizont\nmode-cycle-out-in-dual = Bináris galaxisok\nmode-rainbow-moving-chevron = Téridő\nmode-cycle-pinwheel = Forgó galaxis\nmode-cycle-spiral = Spirálgalaxis\nmode-raindrops = Elemi erők\nmode-splash = Becsapódás\nmode-multisplash = Meteorzápor\n\nno-board = Nincs eszköz\n"
  },
  {
    "path": "i18n/hu/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = Szín\nbutton-cancel = Mégse\nbutton-save = Mentés\n\nchoose-color = Szín beállítása\n\nerror-set-color = Nem sikerült beállítani a billentyűzet színét\nerror-set-brightness = Nem sikerült beállítani a billentyűzet fényerejét\n\nlabel-hue = Árnyalat\nlabel-saturation = Telítettség\n\nscale-brightness = Fényerő\n"
  },
  {
    "path": "i18n/it/system76_keyboard_configurator.ftl",
    "content": "-name = Configuratore Tastiera\n\napp-about = About {-name}\napp-title = System76 {-name}\n\nboard-fake = {$model}, falso\n\nbutton-cancel = Annulla\nbutton-configure = Configura Tastiera\nbutton-disable = Disabilita\nbutton-import = Importa\nbutton-test = Prova\nbutton-start = Inizia\nbutton-stop = Termina\n\nerror-disable-key = Disabilitazione tasto fallita\nerror-export-keymap = Esportazione mappa della tastiera fallita\nerror-import-keymap = Importazione mappa della tastiera fallita\nerror-key-led = Impostazione LED fallita\nerror-open-file = Apertura file fallita\nerror-save-leds = Salvataggio LED fallito\nerror-set-keyboard-brightness = Impostazione luminosità fallita\nerror-set-keyboard-mode = Impostazione modalità tastiera fallita\nerror-set-keymap = Impostazione mappa della tastiera fallita\nerror-set-layer-brightness = Impostazione luminosità livello fallita\nerror-set-layer-color = Impostazione colore livello fallita\nerror-set-layer-mode = Impostazione modalità a livelli fallita\nerror-unsupported-keymap = File mappa della tastiera non supportato\nerror-unsupported-keymap-desc = Il file mappa della tastiera sembra provenire da una nuova versione del Configuratore.\n\nfirmware-version = La versione {$version} del firmware non supporta la configurazione della mappa della tastiera.\n\nkeyboard-brightness = Luminosità:\nkeyboard-color = Colore:\n\nkey-color = Colore Tasto:\n\nkeymap-for-board = La mappa della tastiera è per il modello '{$model}'\n\nlayer-all-brightness = Luminosità (tutti i livelli):\nlayer-animation-speed = Velocità Animazione Livello:\nlayer-color = Colore Livello:\nlayer-color-pattern = Modello Colore Livello:\nlayer-saturation = Saturazione Livello:\n\nlayout-export = Esporta Disposizione\nlayout-import = Importa Disposizione\nlayout-reset = Ripristina Disposizione\nlayout-invert-f-keys = Inverti Tasti F\n\nflash-to-launch-heavy = Flash to Launch Heavy 1\nflash-to-launch-2 = Flash to Launch 2\nflash-to-launch-1 = Flash to Launch 1\nflash-to-launch-lite-1 = Flash to Launch Lite 1\n\nloading = Tastiera rilevata. Caricamento...\nloading-keyboard = Caricamento mappa della tastiera e LED per {$keyboard}\nfirmware-update-required = È necessario aggiornare il firmware della tastiera!\n\npage-electrical = Elettrica\npage-keycaps = Copritasti\npage-layer1 = Livello 1\npage-layer2 = Livello 2\npage-layer3 = Livello 3\npage-layer4 = Livello 4\npage-leds = LED\npage-logical = Logica\n\nno-boards = Nessuna tastiera rilevata\nno-boards-msg = Assicurarsi di che la tastiera integrata abbia l'ultima versione dell'Open Firmware System76.\n Se si sta utilizzando una tastiera esterna, assicurarsi che sia connessa correttamente\n\nshow-help-overlay = Scorciatoie Tastiera\n\nstack-keymap = Mappa tastiera\nstack-keymap-desc =\n Seleziona un tasto sulla mappa per cambiare le sue impostazioni. Maiusc + click per selezionarne più di uno. Le tue impostazioni sono salvate automaticamente sul firmware.\n\nstack-leds = LED\nstack-leds-desc = Seleziona un tasto sulla mappa per cambiare le sue impostazioni. Scegli una tinta unica per modello, per personalizzare il colore del LED per ogni tasto. Maiusc + click per selezionarne più di uno. Le tue impostazioni sono salvate automaticamente sul firmware.\nstack-leds-desc-builtin = Le impostazioni dei LED saranno ripristinate dopo il riavvio. In futuro arriveranno altre funzionalità.\n\nstack-testing = Testing\n\ntest-check-pins = Controlla perno (mancante)\ntest-check-key = Controlla tasto (aderenza)\ntest-number-of-runs = Numero di esecuzioni\ntest-replace-switch = Sostituisci tasto\ntest-spurious-keypress = Pressione spuria del tasto\n\nuntitled-layout = Layout Senza Titolo\n"
  },
  {
    "path": "i18n/it/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = Disabilitato\nmode-solid-color = Tinta Unita Per Strato\nmode-per-key = Colore Per Tasto\nmode-active-keys = Solo Tasti Vincolati\nmode-cycle-all = Background Cosmic\nmode-cycle-left-right = Scansione Orizzontale\nmode-cycle-up-down = Scansione Verticale\nmode-cycle-out-in = Orizzonte Degli Eventi\nmode-cycle-out-in-dual = Galassie Binarie\nmode-rainbow-moving-chevron = Spaziotempo\nmode-cycle-pinwheel = Galassia Girandola\nmode-cycle-spiral = Galassia Spirale\nmode-raindrops = Elementi\nmode-splash = Splashdown\nmode-multisplash = Pioggia Di Meteore\n\nno-board = Nessuna tavola\n"
  },
  {
    "path": "i18n/it/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = Colore\nbutton-cancel = Annulla\nbutton-save = Salva\n\nchoose-color = Imposta Colore\n\nerror-set-color = Impostazione colore della tastiera fallito\nerror-set-brightness = Impostazione luminosità della tastiera fallito\n\nlabel-hue = Tonalità\nlabel-saturation = Saturazione\n\nscale-brightness = Luminosità\n"
  },
  {
    "path": "i18n/ko/system76_keyboard_configurator.ftl",
    "content": "-name = 키보드 설정기\n\napp-about = {-name} 정보\napp-title = System76 {-name}\n\nboard-fake = {$model}, fake\n\nbutton-cancel = 취소\nbutton-configure = 키보드 설정\nbutton-disable = 비활성화\nbutton-import = 가져오기\nbutton-test = 테스트\nbutton-start = 시작\nbutton-stop = 중지\n\nerror-disable-key = 키를 비활성화하지 못했습니다.\nerror-export-keymap = 키맵을 내보내지 못했습니다.\nerror-import-keymap = 키맵을 가져오지 못했습니다.\nerror-key-led = LED 키에 실패 했습니다.\nerror-open-file = 파일을 열지 못했습니다.\nerror-save-leds = LED(들)를 저장하지 못했습니다.\nerror-set-keyboard-brightness = 밝기 설정에 실패하였습니다.\nerror-set-keyboard-mode = 키보드 모드 설정에 실패하였습니다.\nerror-set-keymap = 키맵 저장에 실패하였습니다.\nerror-set-layer-brightness = 레이어 밝기 설정에 실패하였습니다.\nerror-set-layer-color = 색상 레이어 설정에 실패하였습니다.\nerror-set-layer-mode = 레이어 모드 설정에 실패하였습니다.\nerror-unsupported-keymap = 지원하지 않는 키맵 파일입니다.\nerror-unsupported-keymap-desc = 키맵 파일이 신규 설정 버젼인것 같습니다.\n\nfirmware-version = 펌웨어 버젼 {$version} 이 키맵 구성을 지원하지 않습니다.\n\nkeyboard-brightness = 밝기:\nkeyboard-color = 색상:\n\nkey-color = 키 색상:\n\nkeymap-for-board = 캐맵은 보드 '{$model}' 전용입니다.\n\nlayer-all-brightness = 밝기 (모든 레이어):\nlayer-animation-speed = 레이어 에니메이션 속도:\nlayer-color = 레이어 색상:\nlayer-color-pattern = 레이어 색상 패턴:\nlayer-saturation = 레이어 채도:\n\nlayout-export = 레이어 내보내기\nlayout-import = 레이어 가져오기\nlayout-reset = 레이아웃 재설정\nlayout-invert-f-keys = 펑션키(F-key) 반전\n\nflash-to-launch-heavy = Flash to Launch Heavy 1\nflash-to-launch-2 = Flash to Launch 2\nflash-to-launch-1 = Flash to Launch 1\nflash-to-launch-lite-1 = Flash to Launch Lite 1\n\nloading = 키보드(들)가 인식되었습니다. 로딩중...\nloading-keyboard = {$keyboard}에 대한 키맵 및 LED 로딩중\nfirmware-update-required = 키보드 펌웨어 업데이트 필요!\n\npage-electrical = Electrical\npage-keycaps = 키캡\npage-layer1 = 레이어 1\npage-layer2 = 레이어 2\npage-layer3 = 레이어 3\npage-layer4 = 레이어 4\npage-leds = LEDs\npage-logical = Logical\n\nno-boards = 키보드 인식 실패\nno-boards-msg = 키보드가 최신 버젼인지 확인해주세요.\n System76에서 펌웨어를 확인해주세요.\n 만약 외장 키보드를 사용하는 경우, \n 연결에 문제가 있는지 확인해주세요.\n\nshow-help-overlay = 키보드 단축기\n\nstack-keymap = 키맵\nstack-keymap-desc =\n 설정을 변경하기 위해 키맵에서 키를 선택하세요. Shift + Click 으로 여러개의 키를 선택할 수 있습니다. 설정은 자동으로 펌웨어에 저장됩니다.\n\nstack-leds = LEDs\nstack-leds-desc = 설정을 변경하기 위해 키맵에서 키를 선택하세요. 각 키에 LED 색상을 설정하기 위해 원하는 색상을 선택하세요. Shift + Click 으로 여러개의 키를 선택할 수 있습니다. 설정은 자동으로 펌웨어에 저장됩니다.\nstack-leds-desc-builtin = LED 설정은 재부팅 후 초기화됩니다. 햫후 더 많은 기능이 추가될 예정입니다.\n\nstack-testing = 테스트\n\ntest-check-pins = 핀 확인 (missing)\ntest-check-key = 키 확인 (sticking)\ntest-number-of-runs = 실행 횟수\ntest-replace-switch = 스위치 교체\ntest-spurious-keypress = 가짜 키 눌림\n\nuntitled-layout = 제목없는 레이아웃\n"
  },
  {
    "path": "i18n/ko/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = 비활성화\nmode-solid-color = 레이어 단위 고정\nmode-per-key = 키 단위 고정\nmode-active-keys = 지정 키 전용\nmode-cycle-all = 코스믹 배경\nmode-cycle-left-right = 수평 스캔\nmode-cycle-up-down = 수직 스캔\nmode-cycle-out-in = 이벤트 호라이즌\nmode-cycle-out-in-dual = 바이너리 겔럭시\nmode-rainbow-moving-chevron = 시공간\nmode-cycle-pinwheel = 바람개비 은하\nmode-cycle-spiral = 나선형 은하\nmode-raindrops = 엘리먼트\nmode-splash = 스플래시 다운\nmode-multisplash = 유성우\n\nno-board = 보드 없음"
  },
  {
    "path": "i18n/ko/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = 색상\nbutton-cancel = 취소\nbutton-save = 저장\n\nchoose-color = 색상 선택\n\nerror-set-color = 키보드 색상 설정 실패\nerror-set-brightness = 키보드 밝기 설정 실패\n\nlabel-hue = 색조\nlabel-saturation = 채도\n\nscale-brightness = 밝기"
  },
  {
    "path": "i18n/nl/system76_keyboard_configurator.ftl",
    "content": "-name = Toetsenbordconfigurator\n\napp-about = Over {-name}\napp-title = System76 - {-name}\n\nboard-fake = {$model}, namaak\n\nbutton-cancel = Annuleren\nbutton-configure = Toetsenbord instellen\nbutton-disable = Uitschakelen\nbutton-import = Importeren\nbutton-test = Testen\nbutton-start = Start\nbutton-stop = Stop\n\nerror-disable-key = Kon deze toets niet uitschakelen\nerror-export-keymap = Kon de indeling niet exporteren\nerror-import-keymap = Kon de indeling niet importeren\nerror-key-led = Kon gedrag van de led niet aanpassen\nerror-open-file = Kon bestand niet openen\nerror-save-leds = Kon ledinstellingen niet opslaan\nerror-set-keyboard-brightness = Kon toetsenbordhelderheid niet aanpassen\nerror-set-keyboard-mode = Kon toetsenbordmodus niet instellen\nerror-set-keymap = Kon toetsenbordindeling niet instellen\nerror-set-layer-brightness = Kon helderheidslaag niet instellen\nerror-set-layer-color = Kon kleurlaag niet instellen\nerror-set-layer-mode = Kon toetsenbordfunctielaag niet instellen\nerror-unsupported-keymap = Toetsenbordindelingsbestand wordt niet ondersteund\nerror-unsupported-keymap-desc = Dit bestand lijkt afkomstig te zijn van een nieuwere versie van Toetsenbordconfigurator.\n\nfirmware-version = Versie {$version} van de firmware heeft geen ondersteuning voor deze instellingen.\n\nkeyboard-brightness = Helderheid:\nkeyboard-color = Kleur:\n\nkey-color = Toetskleur:\n\nkeymap-for-board = Deze indeling is gemaakt voor '{$model}'\n\nlayer-all-brightness = Helderheid (alle lagen):\nlayer-animation-speed = Animatiesnelheid van laag:\nlayer-color = Laagkleur:\nlayer-color-pattern = Kleurpatroon van laag:\nlayer-saturation = Laagverzadiging:\n\nlayout-export = Indeling exporteren\nlayout-import = Indeling importeren\nlayout-reset = Standaardwaarden\nlayout-invert-f-keys = Primair gedrag functietoetsen omwisselen\n\nflash-to-launch-heavy = Firmware flashen voor Launch Heavy 1\nflash-to-launch-2 = Firmware flashen voor Launch 2\nflash-to-launch-1 = Firmware flashen voor Launch 1\nflash-to-launch-lite-1 = Firmware flashen voor Launch Lite 1\n\nloading = Toetsenbord(en) aangetroffen. Bezig met laden...\nloading-keyboard = Indelingen en ledconfiguraties van {$keyboard} worden geladen\n\npage-electrical = Elektrisch\npage-keycaps = Toetsenkapjes\npage-layer1 = Laag 1\npage-layer2 = Laag 2\npage-layer3 = Laag 3\npage-layer4 = Laag 4\npage-leds = Ledverlichting\npage-logical = Logisch\n\nno-boards = Er is geen toetsenbord aangetroffen\nno-boards-msg = Zorg er voor dat uw ingebouwde toetsenbord beschikt over de nieuwste\n  System76 Open Firmware.\n  Als u gebruikmaakt van een extern toetsenbord, zorg er dan voor dat\n  het toetsenbord goed is aangesloten.\n\nshow-help-overlay = Sneltoetsen\n\nstack-keymap = Toetsindeling\nstack-keymap-desc = Selecteer een toets op de toetsindeling om de instellingen ervan te wijzigen. Shift + klik om meerdere toetsen tegelijk te selecteren. De instellingen worden automatisch opgeslagen in de firmware.\n\nstack-leds = Ledverlichting\nstack-leds-desc = Selecteer een toets op de toetsindeling om de instellingen ervan te wijzigen. Kies per toets een vast kleurpatroon om zo de ledkleuren aan te passen. Shift + klik om meerdere toetsen tegelijk te selecteren. De instellingen worden automatisch opgeslagen in de firmware.\nstack-leds-desc-builtin = Opmerking: uw aanpassingen aan de ledverlichting worden na het opnieuw opstarten van uw computer gereset. Meer functionaliteit komt in de toekomst.\n\nstack-testing = Testen\n\ntest-check-pins = Check missende pinnen\ntest-check-key = Check vastzittende toetsen\ntest-number-of-runs = Aantal checks achter elkaar\ntest-replace-switch = Check te vervangen schakelmechanismen\ntest-spurious-keypress = Check spontane toetsdrukken\n\nuntitled-layout = Naamloze indeling\n"
  },
  {
    "path": "i18n/nl/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = Uitgeschakeld\nmode-solid-color = Vaste kleur per laag\nmode-per-key = Vaste kleur per toets\nmode-active-keys = Alleen toegewezen toetsen\nmode-cycle-all = Kosmische achtergrond\nmode-cycle-left-right = Horizontale scan\nmode-cycle-up-down = Verticale scan\nmode-cycle-out-in = Waarnemingshorizon\nmode-cycle-out-in-dual = Binaire sterrenstelsels\nmode-rainbow-moving-chevron = Ruimtetijd\nmode-cycle-pinwheel = Windmolenstelsel\nmode-cycle-spiral = Spiraalvormig sterrenstelsel\nmode-raindrops = Elementen\nmode-splash = Waterlanding\nmode-multisplash = Meteorenzwerm\n\nno-board = Geen toetsenbord\n"
  },
  {
    "path": "i18n/nl/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = Kleur\nbutton-cancel = Annuleren\nbutton-save = Opslaan\n\nchoose-color = Kleur instellen\n\nerror-set-color = De kleur kan niet worden ingesteld\nerror-set-brightness = De helderheid kan niet worden ingesteld\n\nlabel-hue = Tint\nlabel-saturation = Verzadiging\n\nscale-brightness = Helderheid"
  },
  {
    "path": "i18n/pl/system76_keyboard_configurator.ftl",
    "content": "-name = Konfiguracja Klawiatury\napp-about = Na temat {-name}\napp-title = System76 {-name}\n\nboard-fake = {$model}, imitacja\n\nbutton-cancel = Anuluj\nbutton-configure = Konfiguruj Klawiaturę\nbutton-disable = Blokuj\nbutton-import = Importuj\nbutton-test = Testuj\n\nerror-disable-key = Błąd blokowania przycisku\nerror-export-keymap = Błąd eksportowania mapowania klawiszy\nerror-import-keymap = Błąd importowania mapowania klawiszy\nerror-key-led = Błąd ustawienia klawisza LED\nerror-open-file = Błąd otwierania pliku\nerror-save-leds = Błąd zapisu ustawień LED\nerror-set-keyboard-brightness = Błąd ustawienia jasności klawiatury\nerror-set-keyboard-mode = Błąd ustawienia trybu klawiatury\nerror-set-keymap = Błąd ustawienia mapowania klawiszy\nerror-set-layer-brightness = Błąd ustawienia jasności warstwy\nerror-set-layer-color = Błąd ustawienia koloru warstwy\nerror-set-layer-mode = Błąd ustawienia trybu warstwy\nerror-unsupported-keymap = Plik mapowania klawiszy nie jest obsługiwany\nerror-unsupported-keymap-desc = Plik mapowania klawiszy może pochodzić z nowszej wersji Konfiguracji.\n\nkey-color = Kolor klawisza:\n\nkeymap-for-board = Mapowanie klawisza dla klawiatury '{$model}'\n\nlayer-all-brightness = Jasność (wszystkie warstwy):\nlayer-animation-speed = Szybkość Animacji Warstwy:\nlayer-color = Kolor Warstwy:\nlayer-color-pattern = Wzór Koloru Warstwy:\nlayer-saturation = Nasycenie Warstwy:\n\nlayout-export = Eksportuj Układ\nlayout-import = Importuj Układ\nlayout-reset = Zresetuj Układ\n\nloading = Klawiatura(-ry) wykryta. Ładowanie...\nloading-keyboard = Ładowanie mapowania klawiszy i LED dla {$keyboard}\n\npage-electrical = Elektryczny\npage-keycaps = Klawisze klawiatury\npage-layer1 = Warstwa 1\npage-layer2 = Warstwa 2\npage-layer3 = Warstwa 3\npage-layer4 = Warstwa 4\npage-leds = LED\npage-logical = Logiczny\n\nno-boards = Nie wykryto klawiatury\nno-boards-msg = Upewnij się, że twoja wbudowana klawiatura ma aktualne oprogramowanie System76. Jeśli używasz zewnętrznej klawiatury upewnij się, że jest poprawnie podłączona.\n\nshow-help-overlay = Skróty klawiszowe klawiatury\n\nstack-keymap = Mapowanie klawiatury\nstack-keymap-desc = Wybierz klawisz w mapowaniu klawiatury aby zmienić jego ustawienia. Twoje ustawienia są automatyczne zapisywane w oprogramowaniu.\n\nstack-leds = LED\nstack-leds-desc = Wybierz klawisz w mapowaniu klawiatury aby zmienić jego ustawienia. Wybierz Jednolity Wzór aby zmienić kolor LED dla każdego pojedyńczego klawisza. Shift + kliknij aby zaznaczyć więcej niż jeden przycisk. Twoje ustawienia są automatyczne zapisywane w oprogramowaniu.\n\nstack-testing = Testowanie\n\ntest-check-pins = Sprawdź złącza\ntest-number-of-runs = Ilość prób testowych\ntest-replace-switch = Zamień przełącznik\ntest-serial = Numer seryjny\n\nuntitled-layout = Układ Bez Tytułu"
  },
  {
    "path": "i18n/pl/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = Zablokowany\nmode-solid-color = Jednolity Kolor na warstwę\nmode-per-key = Jednolity Kolor na klawisz\nmode-active-keys = Tylko Powiązane Klawisze\nmode-cycle-all = Tło Kosmiczne\nmode-cycle-left-right = Skan Horyzontalny\nmode-cycle-up-down = Skan Wertykalny\nmode-cycle-out-in = Horyzont Zdarzeń\nmode-cycle-out-in-dual = Podwójne Galaktyki\nmode-rainbow-moving-chevron = Czasoprzestrzeń\nmode-cycle-pinwheel = Galaktyka Wiatraczek\nmode-cycle-spiral = Galaktyka Spiralna\nmode-raindrops = Elementy\nmode-splash = Wodowanie\nmode-multisplash = Deszcz Meteorytów\n\nno-board = Brak klawiatury"
  },
  {
    "path": "i18n/pl/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = Kolor\nbutton-cancel = Anuluj\nbutton-save = Zapisz\n\nchoose-color = Ustaw Kolor\n\nerror-set-color = Błąd ustawienia koloru klawiatury\nerror-set-brightness = Błąd ustawienia jasności klawiatury\n\nlabel-hue = Odcień\nlabel-saturation = Nasycenie\n\nscale-brightness = Jasność\n"
  },
  {
    "path": "i18n/pt-BR/system76_keyboard_configurator.ftl",
    "content": "-name = Configurador do Teclado\n\napp-about = Sobre {-name}\napp-title = System76 {-name}\n\nboard-fake = {$model}, falso\n\nbutton-cancel = Cancelar\nbutton-configure = Configurar Teclado\nbutton-disable = Desabilitar\nbutton-import = Importar\nbutton-test = Testar\nbutton-start = Iniciar\nbutton-stop = Parar\n\nerror-disable-key = Falha ao desabilitar tecla\nerror-export-keymap = Falha ao exportar mapa do teclado\nerror-import-keymap = Falha ao importar mapa do teclado\nerror-key-led =  Falha no LED da tecla\nerror-open-file =  Falha ao abrir arquivo\nerror-save-leds =  Falha ao salvar LEDs\nerror-set-keyboard-brightness = Erro ao configurar brilho\nerror-set-keyboard-mode = Erro ao configurar modo do teclado\nerror-set-keymap = Falha ao definir mapa do teclado\nerror-set-layer-brightness = Falha ao definir brilho da camada\nerror-set-layer-color = Falha ao definir cor da camada\nerror-set-layer-mode = Falha ao definir modo da camada\nerror-unsupported-keymap = Arquivo do mapa do teclado não suportado\nerror-unsupported-keymap-desc = Arquivo do mapa do teclado aparenta ser de uma versão mais recente do Configurador do Teclado.\n\nfirmware-version = Versão de Firmware {$version} não suporta a configuração do mapa do teclado.\n\nkeyboard-brightness = Brilho:\nkeyboard-color = Cor:\n\nkey-color = Cor da tecla:\n\nkeymap-for-board = Mapa do teclado é para a placa '{$model}'\n\nlayer-all-brightness = Brilho (tadas camadas):\nlayer-animation-speed = Velociade da Animação da Camada:\nlayer-color = Cor da Camada:\nlayer-color-pattern = Padrão de Cor da Camada:\nlayer-saturation = Saturação da Camada:\n\nlayout-export = Exportar Layout\nlayout-import = Importar Layout\nlayout-reset = Restaurar Layout\nlayout-invert-f-keys = Inverter Teclas F\n\nloading = Teclado(s) detectado(s). Carregando...\nloading-keyboard = Carregando mapa do teclado e LEDs para {$keyboard}\n\npage-electrical = Elétrico\npage-keycaps = Keycaps\npage-layer1 = Camada 1\npage-layer2 = Camada 2\npage-layer3 = Camada 3\npage-layer4 = Camada 4\npage-leds = LEDs\npage-logical = Lógico\n\nno-boards = Nenhum teclado detectado\nno-boards-msg = Certifique-se que seu teclado integrado possui atualizado\n System76 Open Firmware.\n Se estiver usando um teclado externo, certifique-se que ele está\n conectado adequadamente\n\nshow-help-overlay = Atalhos do Teclado\n\nstack-keymap = Mapa do Teclado\nstack-keymap-desc =\n Selecione a tecla no mapa do teclado para alterar as suas configurações. Shift + clique para selecionar mais de um clique. Suas configurações são salvas automaticamente no firmware.\n\nstack-leds = LEDs\nstack-leds-desc = Selecione a tecla no mapa do teclado para alterar as suas configurações. Escolha um Padrão Sólido para customizar a cor do LED de cada tecla. Shift + clique para selecionar mais de uma tecla. Suas configurações são salvas automaticamente no firmware.\nstack-leds-desc-builtin = As configurações de LED irão ser restauradas depois de reiniciar. Mais funcionalidades estarão vindo no futuro.\n\nstack-testing = Testando\n\ntest-check-pins = Verifique os pinos\ntest-number-of-runs = Número de tentativas\ntest-replace-switch = Substitua o switch\ntest-serial = Serial\ntest-spurious-keypress = Teclagens não genuínas\n\nuntitled-layout = Layout sem título\n"
  },
  {
    "path": "i18n/pt-BR/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = Desabilitado\nmode-solid-color = Cor Sólida por Camada\nmode-per-key = Sólido por Tecla\nmode-active-keys = Vincular Apenas Teclas\nmode-cycle-all = Fundo Cósmico\nmode-cycle-left-right = Varredura Horizontal\nmode-cycle-up-down = Varredura Vertical\nmode-cycle-out-in = Horizonte de Eventos\nmode-cycle-out-in-dual = Galáxias Binárias\nmode-rainbow-moving-chevron = Tempo no espaço\nmode-cycle-pinwheel = Galáxia Cata-Vento\nmode-cycle-spiral = Galáxia Espiral \nmode-raindrops = Gotas\nmode-splash = Amaragem\nmode-multisplash = Chuva de Meteóros\n\nno-board = Sem placa"
  },
  {
    "path": "i18n/pt-BR/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = Cor\nbutton-cancel = Cancelar\nbutton-save = Salvar\n\nchoose-color = Definir Cor\n\nerror-set-color = Falha ao definir a cor do teclado\nerror-set-brightness = Falha ao definir o brilho do teclado\n\nlabel-hue = Matiz\nlabel-saturation = Saturação\n\nscale-brightness = Brilho"
  },
  {
    "path": "i18n/ru/system76_keyboard_configurator.ftl",
    "content": "-name = Конфигуратор клавиатуры\n\napp-about = О программе {-name}\napp-title = {-name} System76\n\nboard-fake = {$model}, подделка\n\nbutton-cancel = Отменить\nbutton-configure = Настроить клавиатуру\nbutton-disable = Отключить\nbutton-import = Импорт\nbutton-test = Тест\nbutton-start = Начать\nbutton-stop = Стоп\n\nerror-disable-key = Не удалось отключить клавишу\nerror-export-keymap = Не удалось экспортировать раскладку\nerror-import-keymap = Не удалось импортировать раскладку\nerror-key-led = Не удалось установить подсветку\nerror-open-file = Не удалось открыть файл\nerror-save-leds = Не удалось сохранить подсветку\nerror-set-keyboard-brightness = Ошибка установки яркости\nerror-set-keyboard-mode = Ошибка установки режима клавиатуры\nerror-set-keymap = Не удалось применить раскладку\nerror-set-layer-brightness = Не удалось установить яркость слоя\nerror-set-layer-color = Не удалось установить цвет слоя\nerror-set-layer-mode = Не удалось установить режим слоя\nerror-unsupported-keymap = Неподдерживаемый файл карты клавиш\nerror-unsupported-keymap-desc = Похоже, это файл раскладки для более новой версии Конфигуратора.\n\nfirmware-version = Версия прошивки {$version} не поддерживает настройку раскладки.\n\nkeyboard-brightness = Яркость:\nkeyboard-color = Цвет:\n\nkey-color = Цвет клавиши:\n\nkeymap-for-board = Раскладка для клавиатуры '{$model}'\n\nlayer-all-brightness = Яркость (все слои):\nlayer-animation-speed = Скорость анимации слоя:\nlayer-color = Цвет слоя:\nlayer-color-pattern = Цветовая схема слоя:\nlayer-saturation = Насыщенность слоя:\n\nlayout-export = Экспортировать раскладку\nlayout-import = Импортировать раскладку\nlayout-reset = Сбросить раскладку\nlayout-invert-f-keys = Инвертировать F-клавиши\n\nflash-to-launch-heavy = Прошить на Launch Heavy 1\nflash-to-launch-2 = Прошить на Launch 2\nflash-to-launch-1 = Прошить на Launch 1\nflash-to-launch-lite-1 = Прошить на Launch Lite 1\n\nloading = Клавиатур(ы) обнаружен(ы). Загрузка...\nloading-keyboard = Загрузка раскладки и подсветки для {$keyboard}\nfirmware-update-required = Требуется обновление прошивки клавиатуры!\n\npage-electrical = Электрика\npage-keycaps = Кейкапы\npage-layer1 = Слой 1\npage-layer2 = Слой 2\npage-layer3 = Слой 3\npage-layer4 = Слой 4\npage-leds = Подсветка\npage-logical = Логика\n\nno-boards = Клавиатура не обнаружена\nno-boards-msg = Убедитесь, что встроенная клавиатура имеет\n актуальную версию System76 Open Firmware.\n Если используется внешняя клавиатура, убедитесь,\n что она правильно подключена.\n\nshow-help-overlay = Сочетания клавиш\n\nstack-keymap = Раскладка\nstack-keymap-desc =\n Выберите клавишу на схеме, чтобы изменить её настройки. Нажимайте, удерживая Shift, чтобы выбрать несколько клавиш. Ваши настройки будет автоматически сохранены в прошивке.\n\nstack-leds = Подсветка\nstack-leds-desc = Выберите клавишу на схеме, чтобы изменить её настройки. Выберите схему 'Сплошной цвет, поклавишно', чтобы настроить подсветку каждой клавиши. Нажимайте, удерживая Shift, чтобы выбрать несколько клавиш. Ваши настройки будет автоматически сохранены в прошивке.\nstack-leds-desc-builtin = Настройки подсветки будут сброшены после перезагрузки. В будущем планируется расширение функциональности. В будущем появится больше функций.\n\nstack-testing = Тестирование\n\ntest-check-pins = Проверка пинов (отсутствие)\ntest-check-key = Проверка клавиш (залипание)\ntest-number-of-runs = Количество прогонов\ntest-replace-switch = Замените переключатель\ntest-spurious-keypress = Ложное срабатывание клавиши\n\nuntitled-layout = Безымянная раскладка\n"
  },
  {
    "path": "i18n/ru/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = Нет\nmode-solid-color = Сплошной цвет, послойно\nmode-per-key = Сплошной цвет, поклавишно\nmode-active-keys = Только активные клавиши\nmode-cycle-all = Космический фон\nmode-cycle-left-right = Горизонтальная развёртка\nmode-cycle-up-down = Вертикальная развёртка\nmode-cycle-out-in = Горизонт событий\nmode-cycle-out-in-dual = Двойная галактика\nmode-rainbow-moving-chevron = Пространство-время\nmode-cycle-pinwheel = Галактика Вертушка\nmode-cycle-spiral = Спиральная галактика\nmode-raindrops = Частицы\nmode-splash = Приводнение\nmode-multisplash = Метеоритный дождь\n\nno-board = Нет клавиатуры"
  },
  {
    "path": "i18n/ru/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = Цвет\nbutton-cancel = Отменить\nbutton-save = Сохранить\n\nchoose-color = Выберите цвет\n\nerror-set-color = Не удалось установить цвет клавиатуры\nerror-set-brightness = Не удалось установить яркость клавиатуры\n\nlabel-hue = Оттенок\nlabel-saturation = Насыщенность\n\nscale-brightness = Яркость"
  },
  {
    "path": "i18n/sl/system76_keyboard_configurator.ftl",
    "content": "-name = Keyboard Configurator\n\napp-about = O {-name}\napp-title = System76 {-name}\n\nboard-fake = {$model}, lažen\n\nbutton-cancel = Prekliči\nbutton-configure = Nastavi tipkovnico\nbutton-disable = Izklopi\nbutton-import = Uvozi\nbutton-test = Testiraj\n\nerror-disable-key = Tipke ni bilo mogoče onemogočiti\nerror-export-keymap = Mape tipk ni bilo mogoče izvoziti\nerror-import-keymap = Mape tipk ni bilo mogoče uvoziti\nerror-key-led = LED ni uspelo vklopiti\nerror-open-file = Datoteke ni bilo mogoče odpreti\nerror-save-leds = LED diod ni bilo mogoče shraniti\nerror-set-keyboard-brightness = Napaka pri nastavitvi svetlosti\nerror-set-keyboard-mode = Napaka pri nastavitvi načina tipkovnice\nerror-set-keymap = Ni bilo mogoče nastaviti mape tipk\nerror-set-layer-brightness = Ni bilo mogoče nastaviti svetlosti plasti\nerror-set-layer-color = Barve sloja ni bilo mogoče nastaviti\nerror-set-layer-mode = Ni bilo mogoče nastaviti načina sloja\nerror-unsupported-keymap = Nepodprta datoteka z zemljevidi tipk\nerror-unsupported-keymap-desc = Zdi se, da je datoteka tipkovnice iz novejše različice programa Configurator.\n\nfirmware-version = Različica vdelane programske opreme {$version} ne podpira konfiguracije tipkovnice.\n\nkeyboard-brightness = Svetlost:\nkeyboard-color = Barva:\n\nkey-color = Barva tipke:\n\nkeymap-for-board = Mapa tipk je za ploščo '{$model}'\n\nlayer-all-brightness = Svetlost (vsi sloji):\nlayer-animation-speed = Hitrost animacije sloja:\nlayer-color = Barva sloja:\nlayer-color-pattern = Barvni vzorec sloja:\nlayer-saturation = Nasičenost plasti:\n\nlayout-export = Izvozi postavitev\nlayout-import = Uvozi postavitev\nlayout-reset = Ponastavi postavitev\n\nloading = Tipkovnica/-e zaznana/-e. Nalaganje...\nloading-keyboard = Nalaganje mape tipk in LED za {$keyboard}\n\npage-electrical = Električna\npage-keycaps = Tipke\npage-layer1 = Plast 1\npage-layer2 = Plast 2\npage-layer3 = Plast 3\npage-layer4 = Plast 4\npage-leds = LED diode\npage-logical = Logična\n\nno-boards = Tipkovnica ni zaznana\nno-boards-msg = Prepričajte se, da ima vgrajena tipkovnica posodobljeno\n  System76 Odprto vdelano programsko opremo.\n  Če uporabljate zunanjo tipkovnico, se prepričajte, da je\n  pravilno priključena\n\nshow-help-overlay = Bližnjice na tipkovnici\n\nstack-keymap = Mapa tipk\nstack-keymap-desc =\n Izberite tipko na mapi tipk, da spremenite njene nastavitve. Shift + klik, da izberete več kot en klik. Vaše nastavitve se samodejno shranijo v vdelano programsko opremo.\n\nstack-leds = LED diode\nstack-leds-desc = Izberite tipko na mapi tipk, da spremenite njene nastavitve. Za vsako tipko izberite Solid Pattern, da prilagodite barvo LED posamezne tipke. Shift + klik, da izberete več kot eno tipko. Vaše nastavitve se samodejno shranijo v vdelano programsko opremo.\nstack-leds-desc-builtin = Nastavitve LED se bodo ponastavile po ponovnem zagonu. V prihodnosti bo na voljo več funkcionalnosti.\n\nstack-testing = Testiranje\n\ntest-check-pins = Preverite zatiči\ntest-number-of-runs = Število tekov\ntest-replace-switch = Zamenjajte stikalo\ntest-serial = Serijski\n\nuntitled-layout = Neimenovana postavitev\n"
  },
  {
    "path": "i18n/sl/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = Izklopljeno\nmode-solid-color = Na plast enobarvna\nmode-per-key = Na tipko trdno\nmode-active-keys = Samo vezane tipke\nmode-cycle-all = Kozmično ozadje\nmode-cycle-left-right = Vodoravno skeniranje\nmode-cycle-up-down = Navpično skeniranje\nmode-cycle-out-in = Obzorje dogodkov\nmode-cycle-out-in-dual = Binarne galaksije\nmode-rainbow-moving-chevron = Vesolje-čas\nmode-cycle-pinwheel = Galaksija vrtiljaka\nmode-cycle-spiral = Spiralna galaksija\nmode-raindrops = Elementi\nmode-splash = Pljusk dol\nmode-multisplash = Meteorni dež\n\nno-board = Brez plošče\n"
  },
  {
    "path": "i18n/sl/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = Barva\nbutton-cancel = Prekliči\nbutton-save = Shrani\n\nchoose-color = Nastavi barvo\n\nerror-set-color = Ni uspelo nastaviti barve tipkovnice\nerror-set-brightness = Ni uspelo nastaviti svetlost tipkovnice\n\nlabel-hue = Odtenek\nlabel-saturation = Nasičenost\n\nscale-brightness = Svetlost\n"
  },
  {
    "path": "i18n/tr/system76_keyboard_configurator.ftl",
    "content": "-name = Klavye Yapılandırıcısı\n\napp-about = {-name} Hakkında\napp-title = System76 {-name}\n\nboard-fake = {$model}, sahte\n\nbutton-cancel = İptal\nbutton-configure = Klavyeyi Yapılandır\nbutton-disable = Etkisizleştir\nbutton-import = İçeri Aktar\nbutton-test = Test\n\nerror-disable-key = Tuşu etkisizleştirmek başarısız oldu\nerror-export-keymap = Tuş haritasını dışarı aktarmak başarısız oldu\nerror-import-keymap = Tuş haritasını içeri aktarmak başarısız oldu\nerror-key-led = Tuş LED'i hatalı\nerror-open-file = Dosya açılamadı\nerror-save-leds = LED'ler kaydedilemedi\nerror-set-keyboard-brightness = Parlaklık değeri atanamadı\nerror-set-keyboard-mode = Klavye modu atanamadı\nerror-set-keymap = Tuş haritası atanamadı\nerror-set-layer-brightness = Katman parlaklığı atanamadı\nerror-set-layer-color = Katman rengi atanamadı\nerror-set-layer-mode = Katman modu atanamadı\nerror-unsupported-keymap = Tuş haritası dosyası desteklenmiyor\nerror-unsupported-keymap-desc = Tuş haritası dosyası daha yeni bir yapılandırıcıya ait.\n\nfirmware-version = Aygıt yazılımı {$version} tuş haritası yapılandırmasını desteklemiyor.\n\nkeyboard-brightness = Parlaklık:\nkeyboard-color = Renk:\n\nkey-color = Tuş Rengi:\n\nkeymap-for-board = Tuş haritası şu kart modeline ait '{$model}'\n\nlayer-all-brightness = Parlaklık (tüm katmanlar):\nlayer-animation-speed = Katman Animasyon Hızı:\nlayer-color = Katman Rengi:\nlayer-color-pattern = Katman Rengi Deseni:\nlayer-saturation = Katman Doygunluğu:\n\nlayout-export = Düzeni Dışarı Aktar\nlayout-import = Düzeni İçeri Aktar\nlayout-reset = Düzeni Sıfırla\n\nloading = Klavye(ler) tanımlandı. Yükleniyor...\nloading-keyboard = Tuş haritası ve {$keyboard} için LED ayarları yükleniyor\n\npage-electrical = Elektronik\npage-keycaps = Tuş başlıkları\npage-layer1 = Katman 1\npage-layer2 = Katman 2\npage-layer3 = Katman 3\npage-layer4 = Katman 4\npage-leds = LEDler\npage-logical = Mantıksal\n\nno-boards = Hiç bir klavye tanımlanamadı\nno-boards-msg = Dahili klavyenizin güncel System76 aygıt yazılımına \n sahip olduğundan emin olun.\n Eğer harici bir klavye kullanıyorsanız, doğru \n şekilde takılı olduğundan emin olun.\n\nshow-help-overlay = Klavye Kısayolları\n\nstack-keymap = Tuş haritası\nstack-keymap-desc =\n Ayarlarını değiştirmek için tuş haritasından bir tuş seçin. Birden fazla seçmek için Shift tuşunu kullanabilirsiniz.\n Ayarlarınız otomatik olarak aygıt yazılımına kaydedilir.\n\nstack-leds = LEDler\nstack-leds-desc = Ayarlarını değiştirmek içiin tuş haritasından bir tuş seçin. Tuşların LED rengini değiştirmek için\n tuş başına tek parça desen seçilmeli. Birden fazla seçmek için Shift tuşunu kullanabilirsiniz. Ayarlarınız otomatik\n olarak aygıt yazılımına kaydedilir.\nstack-leds-desc-builtin = Bilgisayar tekrar başlayınca LED ayarları sıfırlanacak. Yakında daha fazla özellik gelecek.\n\nstack-testing = Test ediliyor\n\ntest-check-pins = Pinleri kontrol eidn\ntest-number-of-runs = Çalıştırma sayısı\ntest-replace-switch = Anahtarı değiştir\ntest-serial = Seri\n\nuntitled-layout = İsimsiz Düzen\n"
  },
  {
    "path": "i18n/tr/system76_keyboard_configurator_backend.ftl",
    "content": "mode-disabled = Etkisizleştirilmiş\nmode-solid-color = Katman Başına Tek Parça Renk\nmode-per-key = Tuş Başına Tek Parça\nmode-active-keys = Yalnızca Bağlı Tuşlar\nmode-cycle-all = Cosmic Arkaplanı\nmode-cycle-left-right = Yatay Tarama\nmode-cycle-up-down = Dikey Tarama\nmode-cycle-out-in = Olay Ufku\nmode-cycle-out-in-dual = İkili Galaksiler\nmode-rainbow-moving-chevron = Uzay Zamanı\nmode-cycle-pinwheel = Fırıldak Galaksi\nmode-cycle-spiral = Sarmal Galaksi\nmode-raindrops = Elementler\nmode-splash = Denize İniş\nmode-multisplash = Meteor Duşu\n\nno-board = Kart bulunamadı\n"
  },
  {
    "path": "i18n/tr/system76_keyboard_configurator_widgets.ftl",
    "content": "button-color = Renk\nbutton-cancel = İptal\nbutton-save = Kaydet\n\nchoose-color = Rengi Ata\n\nerror-set-color = Klavye rengi atanamadı\nerror-set-brightness = Klavye parlaklığı atanamadı\n\nlabel-hue = Ton\nlabel-saturation = Doygunluk\n\nscale-brightness = Parlaklık\n"
  },
  {
    "path": "i18n.toml",
    "content": "fallback_language = \"en\"\n\n[fluent]\nassets_dir = \"i18n\"\n"
  },
  {
    "path": "layouts/README.md",
    "content": "`picker.json` defines the groups of keycodes that appear in the keycode picker. The labels here are used both in the picker and on the keyboard.\n\nWithin each layout:\n* `default.json` - The default keymap and LED settings, in the same format the Configurator can import/export through its UI.\n* `meta.json` - Micellanous values associated with the keyboard.\n\n`meta.json` includes a `keyboard` key that refers to a subdirectory of `keyboards/`, since multiple laptop models have the same keyboard, so they share this data.\n\nIn `keyboards/`:\n* `keymap.json` - Maps keycode names to their numerical values.\n* `layout.json` - Maps key position to electrical matrix indices.\n* `leds.json` - For a keyboard with per-key LEDs, maps key position to LED index.\n* `physical.json` - Defines the physical layout of keys, the colors to display as their backgrounds, and labels (only shown in a tab when `--debug-layers` is passed to the Configurator).\n\nOther than `meta.json` and `physical.json`, these files are generated from the EC/QMK source using `layouts.py` from the root of this repository. `meta.json` is written manually, with other keys added by `layouts.py`. `physical.json` is created with <http://www.keyboard-layout-editor.com>.\n"
  },
  {
    "path": "layouts/keyboards/system76/14in_81/layout.json",
    "content": "{\n  \"K00\": [\n    7,\n    7\n  ],\n  \"K01\": [\n    9,\n    7\n  ],\n  \"K02\": [\n    8,\n    6\n  ],\n  \"K03\": [\n    8,\n    7\n  ],\n  \"K04\": [\n    9,\n    5\n  ],\n  \"K05\": [\n    10,\n    7\n  ],\n  \"K06\": [\n    10,\n    6\n  ],\n  \"K07\": [\n    11,\n    7\n  ],\n  \"K08\": [\n    11,\n    6\n  ],\n  \"K09\": [\n    12,\n    7\n  ],\n  \"K0A\": [\n    12,\n    6\n  ],\n  \"K0B\": [\n    13,\n    5\n  ],\n  \"K0C\": [\n    15,\n    4\n  ],\n  \"K0D\": [\n    13,\n    2\n  ],\n  \"K0E\": [\n    13,\n    6\n  ],\n  \"K0F\": [\n    14,\n    5\n  ],\n  \"K0G\": [\n    14,\n    7\n  ],\n  \"K10\": [\n    7,\n    6\n  ],\n  \"K11\": [\n    5,\n    7\n  ],\n  \"K12\": [\n    7,\n    5\n  ],\n  \"K13\": [\n    8,\n    5\n  ],\n  \"K14\": [\n    9,\n    4\n  ],\n  \"K15\": [\n    8,\n    4\n  ],\n  \"K16\": [\n    9,\n    6\n  ],\n  \"K17\": [\n    9,\n    1\n  ],\n  \"K18\": [\n    10,\n    5\n  ],\n  \"K19\": [\n    10,\n    4\n  ],\n  \"K1A\": [\n    10,\n    0\n  ],\n  \"K1B\": [\n    12,\n    5\n  ],\n  \"K1C\": [\n    13,\n    4\n  ],\n  \"K1D\": [\n    14,\n    3\n  ],\n  \"K20\": [\n    4,\n    4\n  ],\n  \"K21\": [\n    4,\n    7\n  ],\n  \"K22\": [\n    9,\n    0\n  ],\n  \"K23\": [\n    5,\n    4\n  ],\n  \"K24\": [\n    6,\n    4\n  ],\n  \"K25\": [\n    8,\n    3\n  ],\n  \"K26\": [\n    7,\n    4\n  ],\n  \"K27\": [\n    6,\n    2\n  ],\n  \"K28\": [\n    8,\n    0\n  ],\n  \"K29\": [\n    10,\n    3\n  ],\n  \"K2A\": [\n    11,\n    4\n  ],\n  \"K2B\": [\n    12,\n    4\n  ],\n  \"K2C\": [\n    13,\n    3\n  ],\n  \"K2D\": [\n    14,\n    1\n  ],\n  \"K30\": [\n    4,\n    2\n  ],\n  \"K31\": [\n    5,\n    3\n  ],\n  \"K32\": [\n    7,\n    0\n  ],\n  \"K33\": [\n    4,\n    3\n  ],\n  \"K34\": [\n    8,\n    2\n  ],\n  \"K35\": [\n    6,\n    3\n  ],\n  \"K36\": [\n    7,\n    2\n  ],\n  \"K37\": [\n    11,\n    1\n  ],\n  \"K38\": [\n    9,\n    2\n  ],\n  \"K39\": [\n    10,\n    2\n  ],\n  \"K3A\": [\n    11,\n    3\n  ],\n  \"K3B\": [\n    12,\n    3\n  ],\n  \"K3C\": [\n    15,\n    2\n  ],\n  \"K40\": [\n    3,\n    2\n  ],\n  \"K41\": [\n    4,\n    1\n  ],\n  \"K42\": [\n    5,\n    1\n  ],\n  \"K43\": [\n    4,\n    5\n  ],\n  \"K44\": [\n    6,\n    6\n  ],\n  \"K45\": [\n    6,\n    1\n  ],\n  \"K46\": [\n    7,\n    1\n  ],\n  \"K47\": [\n    8,\n    1\n  ],\n  \"K48\": [\n    10,\n    1\n  ],\n  \"K49\": [\n    11,\n    2\n  ],\n  \"K4A\": [\n    3,\n    1\n  ],\n  \"K4B\": [\n    11,\n    0\n  ],\n  \"K4C\": [\n    12,\n    2\n  ],\n  \"K50\": [\n    1,\n    6\n  ],\n  \"K51\": [\n    6,\n    0\n  ],\n  \"K52\": [\n    0,\n    7\n  ],\n  \"K53\": [\n    2,\n    4\n  ],\n  \"K54\": [\n    0,\n    3\n  ],\n  \"K55\": [\n    2,\n    3\n  ],\n  \"K56\": [\n    1,\n    5\n  ],\n  \"K57\": [\n    14,\n    2\n  ],\n  \"K58\": [\n    15,\n    7\n  ],\n  \"K59\": [\n    13,\n    7\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/14in_81/leds.json",
    "content": "{}\n"
  },
  {
    "path": "layouts/keyboards/system76/14in_81/physical.json",
    "content": "[\n  {\n    \"name\": \"System76 Lemur Pro - 81 Key\",\n    \"author\": \"Levi Portenier\"\n  },\n  [\n    {\n      \"c\": \"#141414\",\n      \"t\": \"#ffffff\",\n      \"a\": 7,\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"Esc\",\n    {\n      \"a\": 4,\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F1\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F2\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F3\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F4\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F5\",\n    {\n      \"x\": 8.881784197001252e-16,\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F6\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F7\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F8\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F9\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F10\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F11\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F12\",\n    {\n      \"x\": -1.7763568394002505e-15,\n      \"a\": 7,\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"Home\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"End\",\n    {\n      \"x\": -1.7763568394002505e-15,\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"PrtSc\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"Del\"\n  ],\n  [\n    {\n      \"y\": -0.25,\n      \"a\": 4,\n      \"w\": 0.889\n    },\n    \"~\\n`\",\n    {\n      \"x\": 0.0010000000000000009\n    },\n    \"!\\n1\",\n    {\n      \"x\": 1.1102230246251565e-15\n    },\n    \"@\\n2\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"#\\n3\",\n    \"$\\n4\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"%\\n5\",\n    \"^\\n6\",\n    \"&\\n7\",\n    \"*\\n8\",\n    \"(\\n9\",\n    \")\\n0\",\n    \"_\\n-\",\n    \"+\\n=\",\n    {\n      \"a\": 6,\n      \"w\": 1.75\n    },\n    \"Backspace\"\n  ],\n  [\n    {\n      \"w\": 1.389\n    },\n    \"Tab\",\n    {\n      \"x\": 0.0009999999999998899,\n      \"a\": 4\n    },\n    \"Q\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"W\",\n    \"E\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"R\",\n    \"T\",\n    \"Y\",\n    \"U\",\n    \"I\",\n    \"O\",\n    \"P\",\n    \"{\\n[\",\n    \"}\\n]\",\n    {\n      \"w\": 1.25\n    },\n    \"|\\n\\\\\"\n  ],\n  [\n    {\n      \"a\": 6,\n      \"w\": 1.639\n    },\n    \"Caps Lock\",\n    {\n      \"x\": 0.0009999999999998899,\n      \"a\": 4\n    },\n    \"A\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"S\",\n    \"D\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"F\",\n    \"G\",\n    \"H\",\n    \"J\",\n    \"K\",\n    \"L\",\n    \":\\n;\",\n    \"\\\"\\n'\",\n    {\n      \"a\": 6,\n      \"w\": 2\n    },\n    \"Enter\"\n  ],\n  [\n    {\n      \"w\": 2.139\n    },\n    \"Shift\",\n    {\n      \"x\": 0.001000000000000334,\n      \"a\": 4\n    },\n    \"Z\",\n    \"X\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"C\",\n    \"V\",\n    \"B\",\n    \"N\",\n    \"M\",\n    \"<\\n,\",\n    \">\\n.\",\n    {\n      \"a\": 5,\n      \"w\": 1.5\n    },\n    \"?\\n/\",\n    {\n      \"a\": 6\n    },\n    \"Shift\",\n    {\n      \"a\": 7\n    },\n    \"Up\"\n  ],\n  [\n    {\n      \"a\": 6,\n      \"w\": 1.139\n    },\n    \"Ctrl\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"Fn\",\n    {\n      \"x\": 4.440892098500626e-16,\n      \"a\": 7\n    },\n    \"Super\",\n    {\n      \"a\": 6\n    },\n    \"Alt\",\n    {\n      \"x\": -8.881784197001252e-16,\n      \"a\": 7,\n      \"w\": 5\n    },\n    \"\",\n    {\n      \"a\": 6\n    },\n    \"Alt\",\n    {\n      \"w\": 1.5\n    },\n    \"Ctrl\",\n    {\n      \"a\": 7\n    },\n    \"Left\",\n    \"Right\",\n    \"Down\"\n  ]\n]\n"
  },
  {
    "path": "layouts/keyboards/system76/14in_83/layout.json",
    "content": "{\n  \"K00\": [\n    7,\n    7\n  ],\n  \"K01\": [\n    8,\n    7\n  ],\n  \"K02\": [\n    8,\n    6\n  ],\n  \"K03\": [\n    9,\n    7\n  ],\n  \"K04\": [\n    9,\n    6\n  ],\n  \"K05\": [\n    10,\n    7\n  ],\n  \"K06\": [\n    10,\n    6\n  ],\n  \"K07\": [\n    11,\n    7\n  ],\n  \"K08\": [\n    11,\n    6\n  ],\n  \"K09\": [\n    12,\n    7\n  ],\n  \"K0A\": [\n    12,\n    6\n  ],\n  \"K0B\": [\n    13,\n    7\n  ],\n  \"K0C\": [\n    15,\n    5\n  ],\n  \"K0D\": [\n    13,\n    2\n  ],\n  \"K0E\": [\n    13,\n    6\n  ],\n  \"K0F\": [\n    14,\n    5\n  ],\n  \"K0G\": [\n    14,\n    7\n  ],\n  \"K10\": [\n    7,\n    6\n  ],\n  \"K11\": [\n    7,\n    5\n  ],\n  \"K12\": [\n    7,\n    4\n  ],\n  \"K13\": [\n    8,\n    5\n  ],\n  \"K14\": [\n    8,\n    4\n  ],\n  \"K15\": [\n    8,\n    3\n  ],\n  \"K16\": [\n    9,\n    5\n  ],\n  \"K17\": [\n    9,\n    4\n  ],\n  \"K18\": [\n    10,\n    5\n  ],\n  \"K19\": [\n    10,\n    4\n  ],\n  \"K1A\": [\n    11,\n    5\n  ],\n  \"K1B\": [\n    12,\n    5\n  ],\n  \"K1C\": [\n    13,\n    4\n  ],\n  \"K1D\": [\n    14,\n    3\n  ],\n  \"K20\": [\n    4,\n    4\n  ],\n  \"K21\": [\n    4,\n    7\n  ],\n  \"K22\": [\n    9,\n    0\n  ],\n  \"K23\": [\n    5,\n    7\n  ],\n  \"K24\": [\n    6,\n    4\n  ],\n  \"K25\": [\n    6,\n    5\n  ],\n  \"K26\": [\n    7,\n    3\n  ],\n  \"K27\": [\n    8,\n    2\n  ],\n  \"K28\": [\n    8,\n    0\n  ],\n  \"K29\": [\n    10,\n    3\n  ],\n  \"K2A\": [\n    11,\n    4\n  ],\n  \"K2B\": [\n    12,\n    4\n  ],\n  \"K2C\": [\n    13,\n    3\n  ],\n  \"K2D\": [\n    14,\n    1\n  ],\n  \"K30\": [\n    4,\n    2\n  ],\n  \"K31\": [\n    4,\n    3\n  ],\n  \"K32\": [\n    10,\n    0\n  ],\n  \"K33\": [\n    5,\n    3\n  ],\n  \"K34\": [\n    6,\n    2\n  ],\n  \"K35\": [\n    6,\n    3\n  ],\n  \"K36\": [\n    7,\n    2\n  ],\n  \"K37\": [\n    9,\n    1\n  ],\n  \"K38\": [\n    9,\n    2\n  ],\n  \"K39\": [\n    10,\n    2\n  ],\n  \"K3A\": [\n    11,\n    3\n  ],\n  \"K3B\": [\n    12,\n    3\n  ],\n  \"K3C\": [\n    15,\n    2\n  ],\n  \"K40\": [\n    3,\n    6\n  ],\n  \"K41\": [\n    4,\n    1\n  ],\n  \"K42\": [\n    4,\n    0\n  ],\n  \"K43\": [\n    5,\n    1\n  ],\n  \"K44\": [\n    5,\n    0\n  ],\n  \"K45\": [\n    6,\n    1\n  ],\n  \"K46\": [\n    7,\n    1\n  ],\n  \"K47\": [\n    8,\n    1\n  ],\n  \"K48\": [\n    10,\n    1\n  ],\n  \"K49\": [\n    11,\n    2\n  ],\n  \"K4A\": [\n    12,\n    2\n  ],\n  \"K4B\": [\n    3,\n    7\n  ],\n  \"K50\": [\n    1,\n    6\n  ],\n  \"K51\": [\n    6,\n    0\n  ],\n  \"K52\": [\n    0,\n    6\n  ],\n  \"K53\": [\n    2,\n    6\n  ],\n  \"K54\": [\n    4,\n    6\n  ],\n  \"K55\": [\n    2,\n    7\n  ],\n  \"K56\": [\n    1,\n    7\n  ],\n  \"K57\": [\n    14,\n    4\n  ],\n  \"K58\": [\n    11,\n    1\n  ],\n  \"K59\": [\n    15,\n    7\n  ],\n  \"K60\": [\n    14,\n    2\n  ],\n  \"K61\": [\n    15,\n    4\n  ],\n  \"K62\": [\n    13,\n    5\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/14in_83/leds.json",
    "content": "{}\n"
  },
  {
    "path": "layouts/keyboards/system76/14in_83/physical.json",
    "content": "[\n  {\n    \"name\": \"System76 Lemur Pro - Simple\",\n    \"author\": \"Jeremy Soller\"\n  },\n  [\n    {\n      \"c\": \"#141414\",\n      \"t\": \"#ffffff\",\n      \"a\": 7,\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"Esc\",\n    {\n      \"a\": 4,\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F1\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F2\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F3\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F4\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F5\",\n    {\n      \"x\": 8.881784197001252e-16,\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F6\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F7\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F8\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F9\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F10\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F11\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"F12\",\n    {\n      \"x\": -1.7763568394002505e-15,\n      \"a\": 7,\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"Home\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"End\",\n    {\n      \"x\": -1.7763568394002505e-15,\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"PrtSc\",\n    {\n      \"w\": 0.861,\n      \"h\": 0.75\n    },\n    \"Del\"\n  ],\n  [\n    {\n      \"y\": -0.25,\n      \"a\": 4,\n      \"w\": 0.889\n    },\n    \"~\\n`\",\n    {\n      \"x\": 0.0010000000000000009\n    },\n    \"!\\n1\",\n    {\n      \"x\": 8.881784197001252e-16\n    },\n    \"@\\n2\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"#\\n3\",\n    \"$\\n4\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"%\\n5\",\n    \"^\\n6\",\n    \"&\\n7\",\n    \"*\\n8\",\n    \"(\\n9\",\n    \")\\n0\",\n    \"_\\n-\",\n    \"+\\n=\",\n    {\n      \"a\": 6,\n      \"w\": 1.75\n    },\n    \"Backspace\"\n  ],\n  [\n    {\n      \"w\": 1.389\n    },\n    \"Tab\",\n    {\n      \"x\": 0.0009999999999998899,\n      \"a\": 4\n    },\n    \"Q\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"W\",\n    \"E\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"R\",\n    \"T\",\n    \"Y\",\n    \"U\",\n    \"I\",\n    \"O\",\n    \"P\",\n    \"{\\n[\",\n    \"}\\n]\",\n    {\n      \"w\": 1.25\n    },\n    \"|\\n\\\\\"\n  ],\n  [\n    {\n      \"a\": 6,\n      \"w\": 1.639\n    },\n    \"Caps Lock\",\n    {\n      \"x\": 0.0009999999999998899,\n      \"a\": 4\n    },\n    \"A\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"S\",\n    \"D\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"F\",\n    \"G\",\n    \"H\",\n    \"J\",\n    \"K\",\n    \"L\",\n    \":\\n;\",\n    \"\\\"\\n'\",\n    {\n      \"a\": 6,\n      \"w\": 2\n    },\n    \"Enter\"\n  ],\n  [\n    {\n      \"w\": 2.139\n    },\n    \"Shift\",\n    {\n      \"x\": 0.001000000000000334,\n      \"a\": 4\n    },\n    \"Z\",\n    \"X\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"C\",\n    \"V\",\n    \"B\",\n    \"N\",\n    \"M\",\n    \"<\\n,\",\n    \">\\n.\",\n    \"?\\n/\",\n    {\n      \"a\": 6,\n      \"w\": 2.5\n    },\n    \"Shift\"\n  ],\n  [\n    {\n      \"w\": 1.139\n    },\n    \"Ctrl\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"Fn\",\n    {\n      \"x\": 4.440892098500626e-16,\n      \"a\": 7\n    },\n    \"Super\",\n    {\n      \"a\": 6\n    },\n    \"Alt\",\n    {\n      \"x\": -8.881784197001252e-16,\n      \"a\": 7,\n      \"w\": 5\n    },\n    \"\",\n    {\n      \"a\": 6\n    },\n    \"Alt\",\n    {\n      \"w\": 1.5\n    },\n    \"Ctrl\",\n    {\n      \"a\": 7,\n      \"h\": 0.5\n    },\n    \"PgUp\",\n    {\n      \"h\": 0.5\n    },\n    \"Up\",\n    {\n      \"h\": 0.5\n    },\n    \"PgDn\"\n  ],\n  [\n    {\n      \"y\": -0.5,\n      \"x\": 11.64,\n      \"h\": 0.5\n    },\n    \"Left\",\n    {\n      \"h\": 0.5\n    },\n    \"Down\",\n    {\n      \"h\": 0.5\n    },\n    \"Right\"\n  ]\n]"
  },
  {
    "path": "layouts/keyboards/system76/14in_86/layout.json",
    "content": "{\n  \"K00\": [\n    7,\n    7\n  ],\n  \"K01\": [\n    8,\n    7\n  ],\n  \"K02\": [\n    8,\n    6\n  ],\n  \"K03\": [\n    9,\n    7\n  ],\n  \"K04\": [\n    9,\n    6\n  ],\n  \"K05\": [\n    10,\n    7\n  ],\n  \"K06\": [\n    10,\n    6\n  ],\n  \"K07\": [\n    11,\n    7\n  ],\n  \"K08\": [\n    11,\n    6\n  ],\n  \"K09\": [\n    12,\n    7\n  ],\n  \"K0A\": [\n    12,\n    6\n  ],\n  \"K0B\": [\n    13,\n    7\n  ],\n  \"K0C\": [\n    15,\n    5\n  ],\n  \"K0D\": [\n    13,\n    2\n  ],\n  \"K0E\": [\n    13,\n    6\n  ],\n  \"K0F\": [\n    14,\n    5\n  ],\n  \"K0G\": [\n    14,\n    7\n  ],\n  \"K10\": [\n    7,\n    6\n  ],\n  \"K11\": [\n    7,\n    5\n  ],\n  \"K12\": [\n    7,\n    4\n  ],\n  \"K13\": [\n    8,\n    5\n  ],\n  \"K14\": [\n    8,\n    4\n  ],\n  \"K15\": [\n    8,\n    3\n  ],\n  \"K16\": [\n    9,\n    5\n  ],\n  \"K17\": [\n    9,\n    4\n  ],\n  \"K18\": [\n    10,\n    5\n  ],\n  \"K19\": [\n    10,\n    4\n  ],\n  \"K1A\": [\n    11,\n    5\n  ],\n  \"K1B\": [\n    12,\n    5\n  ],\n  \"K1C\": [\n    13,\n    4\n  ],\n  \"K1D\": [\n    14,\n    3\n  ],\n  \"K1E\": [\n    14,\n    6\n  ],\n  \"K20\": [\n    4,\n    4\n  ],\n  \"K21\": [\n    4,\n    7\n  ],\n  \"K22\": [\n    9,\n    0\n  ],\n  \"K23\": [\n    5,\n    7\n  ],\n  \"K24\": [\n    6,\n    4\n  ],\n  \"K25\": [\n    6,\n    5\n  ],\n  \"K26\": [\n    7,\n    3\n  ],\n  \"K27\": [\n    8,\n    2\n  ],\n  \"K28\": [\n    8,\n    0\n  ],\n  \"K29\": [\n    10,\n    3\n  ],\n  \"K2A\": [\n    11,\n    4\n  ],\n  \"K2B\": [\n    12,\n    4\n  ],\n  \"K2C\": [\n    13,\n    3\n  ],\n  \"K2D\": [\n    14,\n    1\n  ],\n  \"K2E\": [\n    14,\n    4\n  ],\n  \"K30\": [\n    4,\n    2\n  ],\n  \"K31\": [\n    4,\n    3\n  ],\n  \"K32\": [\n    10,\n    0\n  ],\n  \"K33\": [\n    5,\n    3\n  ],\n  \"K34\": [\n    6,\n    2\n  ],\n  \"K35\": [\n    6,\n    3\n  ],\n  \"K36\": [\n    7,\n    2\n  ],\n  \"K37\": [\n    9,\n    1\n  ],\n  \"K38\": [\n    9,\n    2\n  ],\n  \"K39\": [\n    10,\n    2\n  ],\n  \"K3A\": [\n    11,\n    3\n  ],\n  \"K3B\": [\n    12,\n    3\n  ],\n  \"K3C\": [\n    15,\n    2\n  ],\n  \"K3D\": [\n    15,\n    7\n  ],\n  \"K40\": [\n    3,\n    6\n  ],\n  \"K41\": [\n    4,\n    1\n  ],\n  \"K42\": [\n    4,\n    0\n  ],\n  \"K43\": [\n    5,\n    1\n  ],\n  \"K44\": [\n    5,\n    0\n  ],\n  \"K45\": [\n    6,\n    1\n  ],\n  \"K46\": [\n    7,\n    1\n  ],\n  \"K47\": [\n    8,\n    1\n  ],\n  \"K48\": [\n    10,\n    1\n  ],\n  \"K49\": [\n    11,\n    2\n  ],\n  \"K4A\": [\n    12,\n    2\n  ],\n  \"K4B\": [\n    3,\n    7\n  ],\n  \"K4C\": [\n    11,\n    1\n  ],\n  \"K4D\": [\n    15,\n    6\n  ],\n  \"K50\": [\n    1,\n    6\n  ],\n  \"K51\": [\n    6,\n    0\n  ],\n  \"K52\": [\n    0,\n    6\n  ],\n  \"K53\": [\n    2,\n    6\n  ],\n  \"K54\": [\n    4,\n    6\n  ],\n  \"K55\": [\n    2,\n    7\n  ],\n  \"K56\": [\n    15,\n    0\n  ],\n  \"K57\": [\n    1,\n    7\n  ],\n  \"K58\": [\n    14,\n    2\n  ],\n  \"K59\": [\n    15,\n    4\n  ],\n  \"K5A\": [\n    13,\n    5\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/14in_86/leds.json",
    "content": "{}\n"
  },
  {
    "path": "layouts/keyboards/system76/14in_86/physical.json",
    "content": "[\n  {\n      \"name\": \"System76 Galago Pro (galp4)\",\n      \"author\": \"Jeremy Soller\"\n  },\n  [\n    {\n      \"c\": \"#141414\",\n      \"t\": \"#ffffff\",\n      \"a\": 7,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"Esc\",\n    {\n      \"x\": -0.0006000000000000449,\n      \"a\": 4,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F1\",\n    {\n      \"x\": -0.0005999999999999339,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F2\",\n    {\n      \"x\": -0.0005999999999999339,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F3\",\n    {\n      \"x\": -0.0005999999999999339,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F4\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F5\",\n    {\n      \"x\": 0.009400000000000297,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F6\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F7\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F8\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F9\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F10\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F11\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F12\",\n    {\n      \"x\": -0.000600000000000378,\n      \"a\": 5,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"PrtSc\\nSysRq\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"Pause\\nBreak\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"Insert\\nNumLk\",\n    {\n      \"x\": -0.0009999999999976694,\n      \"a\": 7,\n      \"h\": 0.75\n    },\n    \"Del\"\n  ],\n  [\n    {\n      \"y\": -0.25,\n      \"a\": 4,\n      \"w\": 0.889\n    },\n    \"~\\n`\",\n    {\n      \"x\": 0.0010000000000000009,\n      \"a\": 5\n    },\n    \"!\\n1\",\n    {\n      \"x\": 2.220446049250313e-16\n    },\n    \"@\\n2\",\n    \"#\\n3\",\n    \"$\\n4\",\n    \"%\\n5\",\n    \"^\\n6\",\n    \"&\\n7\",\n    \"*\\n8\",\n    \"(\\n9\",\n    \")\\n0\",\n    \"_\\n-\",\n    \"+\\n=\",\n    {\n      \"a\": 7,\n      \"w\": 2\n    },\n    \"Backspace\",\n    \"Home\"\n  ],\n  [\n    {\n      \"w\": 1.389\n    },\n    \"Tab\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"Q\",\n    \"W\",\n    \"E\",\n    \"R\",\n    \"T\",\n    \"Y\",\n    \"U\",\n    \"I\",\n    \"O\",\n    \"P\",\n    {\n      \"a\": 5\n    },\n    \"{\\n[\",\n    \"}\\n]\",\n    {\n      \"w\": 1.5\n    },\n    \"|\\n\\\\\",\n    {\n      \"a\": 7\n    },\n    \"PgUp\"\n  ],\n  [\n    {\n      \"w\": 1.639\n    },\n    \"Caps Lock\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"A\",\n    \"S\",\n    \"D\",\n    \"F\",\n    \"G\",\n    \"H\",\n    \"J\",\n    \"K\",\n    \"L\",\n    {\n      \"a\": 5\n    },\n    \":\\n;\",\n    \"\\\"\\n'\",\n    {\n      \"a\": 7,\n      \"w\": 2.25\n    },\n    \"Enter\",\n    \"PgDn\"\n  ],\n  [\n    {\n      \"w\": 2.139\n    },\n    \"Shift\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"Z\",\n    \"X\",\n    \"C\",\n    \"V\",\n    \"B\",\n    \"N\",\n    \"M\",\n    {\n      \"a\": 5\n    },\n    \"<\\n,\",\n    \">\\n.\",\n    \"?\\n/\",\n    {\n      \"a\": 7,\n      \"w\": 1.75\n    },\n    \"Shift\",\n    \"Up\",\n    \"End\"\n  ],\n  [\n    {\n      \"w\": 1.139\n    },\n    \"Ctrl\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"Fn\",\n    \"Super\",\n    \"Alt\",\n    {\n      \"w\": 5\n    },\n    \"\",\n    \"Alt\",\n    \"App\",\n    {\n      \"w\": 1.75\n    },\n    \"Ctrl\",\n    \"Left\",\n    \"Down\",\n    \"Right\"\n  ]\n]\n"
  },
  {
    "path": "layouts/keyboards/system76/15in_102/layout.json",
    "content": "{\n  \"K00\": [\n    7,\n    7\n  ],\n  \"K01\": [\n    8,\n    7\n  ],\n  \"K02\": [\n    9,\n    3\n  ],\n  \"K03\": [\n    12,\n    5\n  ],\n  \"K04\": [\n    14,\n    3\n  ],\n  \"K05\": [\n    13,\n    7\n  ],\n  \"K06\": [\n    10,\n    6\n  ],\n  \"K07\": [\n    8,\n    5\n  ],\n  \"K08\": [\n    10,\n    5\n  ],\n  \"K09\": [\n    13,\n    3\n  ],\n  \"K0A\": [\n    14,\n    1\n  ],\n  \"K0B\": [\n    16,\n    6\n  ],\n  \"K0C\": [\n    16,\n    7\n  ],\n  \"K0D\": [\n    13,\n    2\n  ],\n  \"K0E\": [\n    14,\n    5\n  ],\n  \"K0F\": [\n    14,\n    6\n  ],\n  \"K0G\": [\n    16,\n    1\n  ],\n  \"K0H\": [\n    16,\n    0\n  ],\n  \"K0I\": [\n    5,\n    0\n  ],\n  \"K0J\": [\n    6,\n    0\n  ],\n  \"K10\": [\n    16,\n    5\n  ],\n  \"K11\": [\n    11,\n    6\n  ],\n  \"K12\": [\n    10,\n    7\n  ],\n  \"K13\": [\n    15,\n    6\n  ],\n  \"K14\": [\n    14,\n    7\n  ],\n  \"K15\": [\n    13,\n    6\n  ],\n  \"K16\": [\n    12,\n    7\n  ],\n  \"K17\": [\n    11,\n    2\n  ],\n  \"K18\": [\n    8,\n    6\n  ],\n  \"K19\": [\n    8,\n    3\n  ],\n  \"K1A\": [\n    7,\n    2\n  ],\n  \"K1B\": [\n    6,\n    1\n  ],\n  \"K1C\": [\n    17,\n    1\n  ],\n  \"K1D\": [\n    15,\n    7\n  ],\n  \"K1E\": [\n    5,\n    4\n  ],\n  \"K1F\": [\n    10,\n    0\n  ],\n  \"K1G\": [\n    11,\n    0\n  ],\n  \"K1H\": [\n    4,\n    1\n  ],\n  \"K20\": [\n    7,\n    6\n  ],\n  \"K21\": [\n    14,\n    0\n  ],\n  \"K22\": [\n    5,\n    1\n  ],\n  \"K23\": [\n    6,\n    2\n  ],\n  \"K24\": [\n    7,\n    3\n  ],\n  \"K25\": [\n    8,\n    4\n  ],\n  \"K26\": [\n    7,\n    1\n  ],\n  \"K27\": [\n    15,\n    4\n  ],\n  \"K28\": [\n    12,\n    6\n  ],\n  \"K29\": [\n    13,\n    5\n  ],\n  \"K2A\": [\n    11,\n    7\n  ],\n  \"K2B\": [\n    10,\n    3\n  ],\n  \"K2C\": [\n    8,\n    2\n  ],\n  \"K2D\": [\n    12,\n    0\n  ],\n  \"K2E\": [\n    14,\n    2\n  ],\n  \"K2F\": [\n    4,\n    3\n  ],\n  \"K2G\": [\n    15,\n    5\n  ],\n  \"K2H\": [\n    15,\n    3\n  ],\n  \"K30\": [\n    5,\n    7\n  ],\n  \"K31\": [\n    12,\n    2\n  ],\n  \"K32\": [\n    10,\n    4\n  ],\n  \"K33\": [\n    11,\n    3\n  ],\n  \"K34\": [\n    9,\n    1\n  ],\n  \"K35\": [\n    17,\n    0\n  ],\n  \"K36\": [\n    9,\n    2\n  ],\n  \"K37\": [\n    8,\n    1\n  ],\n  \"K38\": [\n    7,\n    0\n  ],\n  \"K39\": [\n    6,\n    3\n  ],\n  \"K3A\": [\n    7,\n    5\n  ],\n  \"K3B\": [\n    9,\n    6\n  ],\n  \"K3C\": [\n    15,\n    2\n  ],\n  \"K3D\": [\n    5,\n    5\n  ],\n  \"K3E\": [\n    14,\n    4\n  ],\n  \"K3F\": [\n    5,\n    6\n  ],\n  \"K40\": [\n    2,\n    6\n  ],\n  \"K41\": [\n    4,\n    0\n  ],\n  \"K42\": [\n    15,\n    1\n  ],\n  \"K43\": [\n    16,\n    2\n  ],\n  \"K44\": [\n    13,\n    1\n  ],\n  \"K45\": [\n    9,\n    7\n  ],\n  \"K46\": [\n    13,\n    4\n  ],\n  \"K47\": [\n    6,\n    6\n  ],\n  \"K48\": [\n    10,\n    1\n  ],\n  \"K49\": [\n    11,\n    1\n  ],\n  \"K4A\": [\n    12,\n    3\n  ],\n  \"K4B\": [\n    2,\n    7\n  ],\n  \"K4C\": [\n    16,\n    3\n  ],\n  \"K4D\": [\n    17,\n    4\n  ],\n  \"K4E\": [\n    4,\n    4\n  ],\n  \"K4F\": [\n    17,\n    2\n  ],\n  \"K4G\": [\n    9,\n    5\n  ],\n  \"K50\": [\n    0,\n    6\n  ],\n  \"K51\": [\n    17,\n    3\n  ],\n  \"K52\": [\n    3,\n    0\n  ],\n  \"K53\": [\n    1,\n    6\n  ],\n  \"K54\": [\n    3,\n    7\n  ],\n  \"K55\": [\n    1,\n    7\n  ],\n  \"K56\": [\n    15,\n    0\n  ],\n  \"K57\": [\n    0,\n    7\n  ],\n  \"K58\": [\n    17,\n    5\n  ],\n  \"K59\": [\n    16,\n    4\n  ],\n  \"K5A\": [\n    17,\n    6\n  ],\n  \"K5B\": [\n    8,\n    0\n  ],\n  \"K5C\": [\n    9,\n    0\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/15in_102/leds.json",
    "content": "{}\n"
  },
  {
    "path": "layouts/keyboards/system76/15in_102/physical.json",
    "content": "[\n  {\n    \"name\": \"System76 Darter Pro - Simple\",\n    \"author\": \"Jeremy Soller\"\n  },\n  [\n    {\n      \"c\": \"#141414\",\n      \"t\": \"#ffffff\",\n      \"a\": 7,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"Esc\",\n    {\n      \"x\": -0.0005999999999999339,\n      \"a\": 4,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F1\",\n    {\n      \"x\": -0.000600000000000156,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F2\",\n    {\n      \"x\": -0.0005999999999999339,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F3\",\n    {\n      \"x\": -0.0005999999999999339,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F4\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F5\",\n    {\n      \"x\": 0.009400000000000297,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F6\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F7\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F8\",\n    {\n      \"x\": -0.0005999999999986017,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F9\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F10\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F11\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F12\",\n    {\n      \"x\": -0.0005999999999986017,\n      \"a\": 5,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"PrtSc\\nSysRq\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"Insert\\nScrLk\",\n    {\n      \"x\": -0.000600000000000378,\n      \"a\": 7,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"Del\",\n    {\n      \"x\": 0.10939999999999905,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"Home\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"End\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 5,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"PgUp\\nPause\",\n    {\n      \"x\": -0.028999999999999915,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"PgDn\\nBreak\"\n  ],\n  [\n    {\n      \"y\": -0.25,\n      \"a\": 4,\n      \"w\": 0.889\n    },\n    \"~\\n`\",\n    {\n      \"x\": 0.0010000000000000009,\n      \"a\": 5\n    },\n    \"!\\n1\",\n    {\n      \"x\": 6.661338147750939e-16\n    },\n    \"@\\n2\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"#\\n3\",\n    \"$\\n4\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"%\\n5\",\n    \"^\\n6\",\n    \"&\\n7\",\n    \"*\\n8\",\n    \"(\\n9\",\n    \")\\n0\",\n    \"_\\n-\",\n    \"+\\n=\",\n    {\n      \"a\": 7,\n      \"w\": 2\n    },\n    \"Backspace\",\n    {\n      \"x\": 0.10999999999999943,\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"Num\\nLk\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 7,\n      \"w\": 0.889\n    },\n    \"/\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"*\",\n    {\n      \"x\": -0.028999999999999915,\n      \"w\": 0.889\n    },\n    \"-\"\n  ],\n  [\n    {\n      \"w\": 1.389\n    },\n    \"Tab\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"Q\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"W\",\n    \"E\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"R\",\n    \"T\",\n    \"Y\",\n    \"U\",\n    \"I\",\n    \"O\",\n    \"P\",\n    {\n      \"a\": 5\n    },\n    \"{\\n[\",\n    \"}\\n]\",\n    {\n      \"w\": 1.5\n    },\n    \"|\\n\\\\\",\n    {\n      \"x\": 0.10999999999999943,\n      \"w\": 0.889\n    },\n    \"7\\nHome\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"8\\nUp\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"9\\nPgUp\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 7,\n      \"w\": 0.889,\n      \"h\": 2\n    },\n    \"+\"\n  ],\n  [\n    {\n      \"w\": 1.639\n    },\n    \"Caps Lock\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"A\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"S\",\n    \"D\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"F\",\n    \"G\",\n    \"H\",\n    \"J\",\n    \"K\",\n    \"L\",\n    {\n      \"a\": 5\n    },\n    \":\\n;\",\n    \"\\\"\\n'\",\n    {\n      \"a\": 7,\n      \"w\": 2.25\n    },\n    \"Enter\",\n    {\n      \"x\": 0.10999999999999943,\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"4\\nLeft\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"5\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"6\\nRight\"\n  ],\n  [\n    {\n      \"a\": 7,\n      \"w\": 2.139\n    },\n    \"Shift\",\n    {\n      \"x\": 0.001000000000000334\n    },\n    \"Z\",\n    \"X\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"C\",\n    \"V\",\n    \"B\",\n    \"N\",\n    \"M\",\n    {\n      \"a\": 5\n    },\n    \"<\\n,\",\n    \">\\n.\",\n    \"?\\n/\",\n    {\n      \"a\": 7,\n      \"w\": 1.75\n    },\n    \"Shift\",\n    \"Up\",\n    {\n      \"x\": 0.10999999999999943,\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"1\\nEnd\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"2\\nDown\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"3\\nPgDn\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 7,\n      \"w\": 0.889,\n      \"h\": 2\n    },\n    \"Enter\"\n  ],\n  [\n    {\n      \"w\": 1.139\n    },\n    \"Ctrl\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"Fn\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"Super\",\n    \"Alt\",\n    {\n      \"x\": -8.881784197001252e-16,\n      \"w\": 5\n    },\n    \"\",\n    \"Alt\",\n    \"App\",\n    {\n      \"w\": 1.75\n    },\n    \"Ctrl\",\n    \"Left\",\n    \"Down\",\n    \"Right\",\n    {\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"0\\nIns\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \".\\nDel\"\n  ]\n]"
  },
  {
    "path": "layouts/keyboards/system76/15in_102_nkey/layout.json",
    "content": "{\n  \"K00\": [\n    6,\n    0\n  ],\n  \"K01\": [\n    12,\n    0\n  ],\n  \"K02\": [\n    1,\n    1\n  ],\n  \"K03\": [\n    7,\n    1\n  ],\n  \"K04\": [\n    11,\n    1\n  ],\n  \"K05\": [\n    15,\n    1\n  ],\n  \"K06\": [\n    4,\n    2\n  ],\n  \"K07\": [\n    6,\n    2\n  ],\n  \"K08\": [\n    10,\n    2\n  ],\n  \"K09\": [\n    6,\n    3\n  ],\n  \"K0A\": [\n    11,\n    3\n  ],\n  \"K0B\": [\n    13,\n    3\n  ],\n  \"K0C\": [\n    6,\n    4\n  ],\n  \"K0D\": [\n    9,\n    4\n  ],\n  \"K0E\": [\n    6,\n    5\n  ],\n  \"K0F\": [\n    11,\n    5\n  ],\n  \"K0G\": [\n    12,\n    5\n  ],\n  \"K0H\": [\n    4,\n    6\n  ],\n  \"K0I\": [\n    13,\n    6\n  ],\n  \"K0J\": [\n    10,\n    7\n  ],\n  \"K10\": [\n    0,\n    0\n  ],\n  \"K11\": [\n    10,\n    0\n  ],\n  \"K12\": [\n    2,\n    1\n  ],\n  \"K13\": [\n    4,\n    1\n  ],\n  \"K14\": [\n    12,\n    1\n  ],\n  \"K15\": [\n    1,\n    2\n  ],\n  \"K16\": [\n    5,\n    2\n  ],\n  \"K17\": [\n    9,\n    2\n  ],\n  \"K18\": [\n    2,\n    3\n  ],\n  \"K19\": [\n    9,\n    3\n  ],\n  \"K1A\": [\n    12,\n    3\n  ],\n  \"K1B\": [\n    3,\n    4\n  ],\n  \"K1C\": [\n    7,\n    4\n  ],\n  \"K1D\": [\n    7,\n    5\n  ],\n  \"K1E\": [\n    0,\n    6\n  ],\n  \"K1F\": [\n    5,\n    6\n  ],\n  \"K1G\": [\n    6,\n    6\n  ],\n  \"K1H\": [\n    11,\n    7\n  ],\n  \"K20\": [\n    5,\n    0\n  ],\n  \"K21\": [\n    8,\n    0\n  ],\n  \"K22\": [\n    3,\n    1\n  ],\n  \"K23\": [\n    10,\n    1\n  ],\n  \"K24\": [\n    13,\n    1\n  ],\n  \"K25\": [\n    2,\n    2\n  ],\n  \"K26\": [\n    8,\n    2\n  ],\n  \"K27\": [\n    0,\n    3\n  ],\n  \"K28\": [\n    5,\n    3\n  ],\n  \"K29\": [\n    0,\n    4\n  ],\n  \"K2A\": [\n    2,\n    4\n  ],\n  \"K2B\": [\n    8,\n    4\n  ],\n  \"K2C\": [\n    10,\n    4\n  ],\n  \"K2D\": [\n    9,\n    5\n  ],\n  \"K2E\": [\n    1,\n    6\n  ],\n  \"K2F\": [\n    7,\n    6\n  ],\n  \"K2G\": [\n    10,\n    6\n  ],\n  \"K2H\": [\n    12,\n    7\n  ],\n  \"K30\": [\n    2,\n    0\n  ],\n  \"K31\": [\n    0,\n    1\n  ],\n  \"K32\": [\n    6,\n    1\n  ],\n  \"K33\": [\n    8,\n    1\n  ],\n  \"K34\": [\n    14,\n    1\n  ],\n  \"K35\": [\n    3,\n    2\n  ],\n  \"K36\": [\n    1,\n    3\n  ],\n  \"K37\": [\n    4,\n    3\n  ],\n  \"K38\": [\n    7,\n    3\n  ],\n  \"K39\": [\n    10,\n    3\n  ],\n  \"K3A\": [\n    4,\n    4\n  ],\n  \"K3B\": [\n    1,\n    5\n  ],\n  \"K3C\": [\n    8,\n    5\n  ],\n  \"K3D\": [\n    2,\n    6\n  ],\n  \"K3E\": [\n    9,\n    6\n  ],\n  \"K3F\": [\n    11,\n    6\n  ],\n  \"K40\": [\n    3,\n    0\n  ],\n  \"K41\": [\n    9,\n    0\n  ],\n  \"K42\": [\n    5,\n    1\n  ],\n  \"K43\": [\n    9,\n    1\n  ],\n  \"K44\": [\n    0,\n    2\n  ],\n  \"K45\": [\n    7,\n    2\n  ],\n  \"K46\": [\n    3,\n    3\n  ],\n  \"K47\": [\n    8,\n    3\n  ],\n  \"K48\": [\n    1,\n    4\n  ],\n  \"K49\": [\n    5,\n    4\n  ],\n  \"K4A\": [\n    0,\n    5\n  ],\n  \"K4B\": [\n    4,\n    5\n  ],\n  \"K4C\": [\n    10,\n    5\n  ],\n  \"K4D\": [\n    3,\n    6\n  ],\n  \"K4E\": [\n    8,\n    6\n  ],\n  \"K4F\": [\n    12,\n    6\n  ],\n  \"K4G\": [\n    14,\n    7\n  ],\n  \"K50\": [\n    1,\n    0\n  ],\n  \"K51\": [\n    4,\n    0\n  ],\n  \"K52\": [\n    11,\n    0\n  ],\n  \"K53\": [\n    13,\n    0\n  ],\n  \"K54\": [\n    15,\n    0\n  ],\n  \"K55\": [\n    2,\n    7\n  ],\n  \"K56\": [\n    3,\n    7\n  ],\n  \"K57\": [\n    4,\n    7\n  ],\n  \"K58\": [\n    5,\n    7\n  ],\n  \"K59\": [\n    6,\n    7\n  ],\n  \"K5A\": [\n    7,\n    7\n  ],\n  \"K5B\": [\n    8,\n    7\n  ],\n  \"K5C\": [\n    9,\n    7\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/15in_102_nkey/leds.json",
    "content": "{}\n"
  },
  {
    "path": "layouts/keyboards/system76/15in_102_nkey/physical.json",
    "content": "[\n  {\n    \"name\": \"System76 Darter Pro - Simple\",\n    \"author\": \"Jeremy Soller\"\n  },\n  [\n    {\n      \"c\": \"#141414\",\n      \"t\": \"#ffffff\",\n      \"a\": 7,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"Esc\",\n    {\n      \"x\": -0.0005999999999999339,\n      \"a\": 4,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F1\",\n    {\n      \"x\": -0.000600000000000156,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F2\",\n    {\n      \"x\": -0.0005999999999999339,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F3\",\n    {\n      \"x\": -0.0005999999999999339,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F4\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F5\",\n    {\n      \"x\": 0.009400000000000297,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F6\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F7\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F8\",\n    {\n      \"x\": -0.0005999999999986017,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F9\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F10\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F11\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F12\",\n    {\n      \"x\": -0.0005999999999986017,\n      \"a\": 5,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"PrtSc\\nSysRq\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"Insert\\nScrLk\",\n    {\n      \"x\": -0.000600000000000378,\n      \"a\": 7,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"Del\",\n    {\n      \"x\": 0.10939999999999905,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"Home\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"End\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 5,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"PgUp\\nPause\",\n    {\n      \"x\": -0.028999999999999915,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"PgDn\\nBreak\"\n  ],\n  [\n    {\n      \"y\": -0.25,\n      \"a\": 4,\n      \"w\": 0.889\n    },\n    \"~\\n`\",\n    {\n      \"x\": 0.0010000000000000009,\n      \"a\": 5\n    },\n    \"!\\n1\",\n    {\n      \"x\": 6.661338147750939e-16\n    },\n    \"@\\n2\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"#\\n3\",\n    \"$\\n4\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"%\\n5\",\n    \"^\\n6\",\n    \"&\\n7\",\n    \"*\\n8\",\n    \"(\\n9\",\n    \")\\n0\",\n    \"_\\n-\",\n    \"+\\n=\",\n    {\n      \"a\": 7,\n      \"w\": 2\n    },\n    \"Backspace\",\n    {\n      \"x\": 0.10999999999999943,\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"Num\\nLk\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 7,\n      \"w\": 0.889\n    },\n    \"/\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"*\",\n    {\n      \"x\": -0.028999999999999915,\n      \"w\": 0.889\n    },\n    \"-\"\n  ],\n  [\n    {\n      \"w\": 1.389\n    },\n    \"Tab\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"Q\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"W\",\n    \"E\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"R\",\n    \"T\",\n    \"Y\",\n    \"U\",\n    \"I\",\n    \"O\",\n    \"P\",\n    {\n      \"a\": 5\n    },\n    \"{\\n[\",\n    \"}\\n]\",\n    {\n      \"w\": 1.5\n    },\n    \"|\\n\\\\\",\n    {\n      \"x\": 0.10999999999999943,\n      \"w\": 0.889\n    },\n    \"7\\nHome\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"8\\nUp\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"9\\nPgUp\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 7,\n      \"w\": 0.889,\n      \"h\": 2\n    },\n    \"+\"\n  ],\n  [\n    {\n      \"w\": 1.639\n    },\n    \"Caps Lock\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"A\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"S\",\n    \"D\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"F\",\n    \"G\",\n    \"H\",\n    \"J\",\n    \"K\",\n    \"L\",\n    {\n      \"a\": 5\n    },\n    \":\\n;\",\n    \"\\\"\\n'\",\n    {\n      \"a\": 7,\n      \"w\": 2.25\n    },\n    \"Enter\",\n    {\n      \"x\": 0.10999999999999943,\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"4\\nLeft\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"5\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"6\\nRight\"\n  ],\n  [\n    {\n      \"a\": 7,\n      \"w\": 2.139\n    },\n    \"Shift\",\n    {\n      \"x\": 0.001000000000000334\n    },\n    \"Z\",\n    \"X\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"C\",\n    \"V\",\n    \"B\",\n    \"N\",\n    \"M\",\n    {\n      \"a\": 5\n    },\n    \"<\\n,\",\n    \">\\n.\",\n    \"?\\n/\",\n    {\n      \"a\": 7,\n      \"w\": 1.75\n    },\n    \"Shift\",\n    \"Up\",\n    {\n      \"x\": 0.10999999999999943,\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"1\\nEnd\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"2\\nDown\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"3\\nPgDn\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 7,\n      \"w\": 0.889,\n      \"h\": 2\n    },\n    \"Enter\"\n  ],\n  [\n    {\n      \"w\": 1.139\n    },\n    \"Ctrl\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"Fn\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"Super\",\n    \"Alt\",\n    {\n      \"x\": -8.881784197001252e-16,\n      \"w\": 5\n    },\n    \"\",\n    \"Alt\",\n    \"App\",\n    {\n      \"w\": 1.75\n    },\n    \"Ctrl\",\n    \"Left\",\n    \"Down\",\n    \"Right\",\n    {\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"0\\nIns\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \".\\nDel\"\n  ]\n]"
  },
  {
    "path": "layouts/keyboards/system76/18H9LHA04/layout.json",
    "content": "{\n  \"K00\": [\n    7,\n    7\n  ],\n  \"K01\": [\n    8,\n    7\n  ],\n  \"K02\": [\n    9,\n    3\n  ],\n  \"K03\": [\n    12,\n    5\n  ],\n  \"K04\": [\n    14,\n    3\n  ],\n  \"K05\": [\n    13,\n    7\n  ],\n  \"K06\": [\n    10,\n    6\n  ],\n  \"K07\": [\n    8,\n    5\n  ],\n  \"K08\": [\n    10,\n    5\n  ],\n  \"K09\": [\n    13,\n    3\n  ],\n  \"K0A\": [\n    14,\n    1\n  ],\n  \"K0B\": [\n    16,\n    6\n  ],\n  \"K0C\": [\n    16,\n    7\n  ],\n  \"K0D\": [\n    13,\n    2\n  ],\n  \"K0E\": [\n    14,\n    5\n  ],\n  \"K0F\": [\n    14,\n    6\n  ],\n  \"K0G\": [\n    16,\n    1\n  ],\n  \"K0H\": [\n    16,\n    0\n  ],\n  \"K0I\": [\n    5,\n    0\n  ],\n  \"K0J\": [\n    6,\n    0\n  ],\n  \"K10\": [\n    16,\n    5\n  ],\n  \"K11\": [\n    11,\n    6\n  ],\n  \"K12\": [\n    10,\n    7\n  ],\n  \"K13\": [\n    15,\n    6\n  ],\n  \"K14\": [\n    14,\n    7\n  ],\n  \"K15\": [\n    13,\n    6\n  ],\n  \"K16\": [\n    12,\n    7\n  ],\n  \"K17\": [\n    11,\n    2\n  ],\n  \"K18\": [\n    8,\n    6\n  ],\n  \"K19\": [\n    8,\n    3\n  ],\n  \"K1A\": [\n    7,\n    2\n  ],\n  \"K1B\": [\n    6,\n    1\n  ],\n  \"K1C\": [\n    17,\n    1\n  ],\n  \"K1D\": [\n    15,\n    7\n  ],\n  \"K1E\": [\n    5,\n    4\n  ],\n  \"K1F\": [\n    10,\n    0\n  ],\n  \"K1G\": [\n    11,\n    0\n  ],\n  \"K1H\": [\n    4,\n    1\n  ],\n  \"K20\": [\n    7,\n    6\n  ],\n  \"K21\": [\n    14,\n    0\n  ],\n  \"K22\": [\n    5,\n    1\n  ],\n  \"K23\": [\n    6,\n    2\n  ],\n  \"K24\": [\n    7,\n    3\n  ],\n  \"K25\": [\n    8,\n    4\n  ],\n  \"K26\": [\n    7,\n    1\n  ],\n  \"K27\": [\n    15,\n    4\n  ],\n  \"K28\": [\n    12,\n    6\n  ],\n  \"K29\": [\n    13,\n    5\n  ],\n  \"K2A\": [\n    11,\n    7\n  ],\n  \"K2B\": [\n    10,\n    3\n  ],\n  \"K2C\": [\n    8,\n    2\n  ],\n  \"K2D\": [\n    12,\n    0\n  ],\n  \"K2E\": [\n    14,\n    2\n  ],\n  \"K2F\": [\n    4,\n    3\n  ],\n  \"K2G\": [\n    15,\n    5\n  ],\n  \"K2H\": [\n    15,\n    3\n  ],\n  \"K30\": [\n    5,\n    7\n  ],\n  \"K31\": [\n    12,\n    2\n  ],\n  \"K32\": [\n    10,\n    4\n  ],\n  \"K33\": [\n    11,\n    3\n  ],\n  \"K34\": [\n    9,\n    1\n  ],\n  \"K35\": [\n    17,\n    0\n  ],\n  \"K36\": [\n    9,\n    2\n  ],\n  \"K37\": [\n    8,\n    1\n  ],\n  \"K38\": [\n    7,\n    0\n  ],\n  \"K39\": [\n    6,\n    3\n  ],\n  \"K3A\": [\n    7,\n    5\n  ],\n  \"K3B\": [\n    9,\n    6\n  ],\n  \"K3C\": [\n    15,\n    2\n  ],\n  \"K3D\": [\n    5,\n    5\n  ],\n  \"K3E\": [\n    14,\n    4\n  ],\n  \"K3F\": [\n    5,\n    6\n  ],\n  \"K40\": [\n    2,\n    6\n  ],\n  \"K41\": [\n    4,\n    0\n  ],\n  \"K42\": [\n    15,\n    1\n  ],\n  \"K43\": [\n    16,\n    2\n  ],\n  \"K44\": [\n    13,\n    1\n  ],\n  \"K45\": [\n    9,\n    7\n  ],\n  \"K46\": [\n    13,\n    4\n  ],\n  \"K47\": [\n    6,\n    6\n  ],\n  \"K48\": [\n    10,\n    1\n  ],\n  \"K49\": [\n    11,\n    1\n  ],\n  \"K4A\": [\n    12,\n    3\n  ],\n  \"K4B\": [\n    2,\n    7\n  ],\n  \"K4C\": [\n    16,\n    3\n  ],\n  \"K4D\": [\n    17,\n    4\n  ],\n  \"K4E\": [\n    4,\n    4\n  ],\n  \"K4F\": [\n    17,\n    2\n  ],\n  \"K4G\": [\n    9,\n    5\n  ],\n  \"K50\": [\n    0,\n    6\n  ],\n  \"K51\": [\n    17,\n    3\n  ],\n  \"K52\": [\n    3,\n    0\n  ],\n  \"K53\": [\n    1,\n    6\n  ],\n  \"K54\": [\n    3,\n    7\n  ],\n  \"K55\": [\n    1,\n    7\n  ],\n  \"K56\": [\n    15,\n    0\n  ],\n  \"K57\": [\n    0,\n    7\n  ],\n  \"K58\": [\n    17,\n    5\n  ],\n  \"K59\": [\n    16,\n    4\n  ],\n  \"K5A\": [\n    17,\n    6\n  ],\n  \"K5B\": [\n    8,\n    0\n  ],\n  \"K5C\": [\n    9,\n    0\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/18H9LHA04/leds.json",
    "content": "{}\n"
  },
  {
    "path": "layouts/keyboards/system76/18H9LHA04/physical.json",
    "content": "[\n  {\n    \"name\": \"System76 Darter Pro - Simple\",\n    \"author\": \"Jeremy Soller\"\n  },\n  [\n    {\n      \"c\": \"#141414\",\n      \"t\": \"#ffffff\",\n      \"a\": 7,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"Esc\",\n    {\n      \"x\": -0.0005999999999999339,\n      \"a\": 4,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F1\",\n    {\n      \"x\": -0.000600000000000156,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F2\",\n    {\n      \"x\": -0.0005999999999999339,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F3\",\n    {\n      \"x\": -0.0005999999999999339,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F4\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F5\",\n    {\n      \"x\": 0.009400000000000297,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F6\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F7\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F8\",\n    {\n      \"x\": -0.0005999999999986017,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F9\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F10\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F11\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F12\",\n    {\n      \"x\": -0.0005999999999986017,\n      \"a\": 5,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"PrtSc\\nSysRq\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"Insert\\nScrLk\",\n    {\n      \"x\": -0.000600000000000378,\n      \"a\": 7,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"Del\",\n    {\n      \"x\": 0.10939999999999905,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"Home\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"End\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 5,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"PgUp\\nPause\",\n    {\n      \"x\": -0.028999999999999915,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"PgDn\\nBreak\"\n  ],\n  [\n    {\n      \"y\": -0.25,\n      \"a\": 4,\n      \"w\": 0.889\n    },\n    \"~\\n`\",\n    {\n      \"x\": 0.0010000000000000009,\n      \"a\": 5\n    },\n    \"!\\n1\",\n    {\n      \"x\": 6.661338147750939e-16\n    },\n    \"@\\n2\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"#\\n3\",\n    \"$\\n4\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"%\\n5\",\n    \"^\\n6\",\n    \"&\\n7\",\n    \"*\\n8\",\n    \"(\\n9\",\n    \")\\n0\",\n    \"_\\n-\",\n    \"+\\n=\",\n    {\n      \"a\": 7,\n      \"w\": 2\n    },\n    \"Backspace\",\n    {\n      \"x\": 0.10999999999999943,\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"Num\\nLk\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 7,\n      \"w\": 0.889\n    },\n    \"/\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"*\",\n    {\n      \"x\": -0.028999999999999915,\n      \"w\": 0.889\n    },\n    \"-\"\n  ],\n  [\n    {\n      \"w\": 1.389\n    },\n    \"Tab\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"Q\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"W\",\n    \"E\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"R\",\n    \"T\",\n    \"Y\",\n    \"U\",\n    \"I\",\n    \"O\",\n    \"P\",\n    {\n      \"a\": 5\n    },\n    \"{\\n[\",\n    \"}\\n]\",\n    {\n      \"w\": 1.5\n    },\n    \"|\\n\\\\\",\n    {\n      \"x\": 0.10999999999999943,\n      \"w\": 0.889\n    },\n    \"7\\nHome\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"8\\nUp\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"9\\nPgUp\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 7,\n      \"w\": 0.889,\n      \"h\": 2\n    },\n    \"+\"\n  ],\n  [\n    {\n      \"w\": 1.639\n    },\n    \"Caps Lock\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"A\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"S\",\n    \"D\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"F\",\n    \"G\",\n    \"H\",\n    \"J\",\n    \"K\",\n    \"L\",\n    {\n      \"a\": 5\n    },\n    \":\\n;\",\n    \"\\\"\\n'\",\n    {\n      \"a\": 7,\n      \"w\": 2.25\n    },\n    \"Enter\",\n    {\n      \"x\": 0.10999999999999943,\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"4\\nLeft\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"5\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"6\\nRight\"\n  ],\n  [\n    {\n      \"a\": 7,\n      \"w\": 2.139\n    },\n    \"Shift\",\n    {\n      \"x\": 0.001000000000000334\n    },\n    \"Z\",\n    \"X\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"C\",\n    \"V\",\n    \"B\",\n    \"N\",\n    \"M\",\n    {\n      \"a\": 5\n    },\n    \"<\\n,\",\n    \">\\n.\",\n    \"?\\n/\",\n    {\n      \"a\": 7,\n      \"w\": 1.75\n    },\n    \"Shift\",\n    \"Up\",\n    {\n      \"x\": 0.10999999999999943,\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"1\\nEnd\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"2\\nDown\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"3\\nPgDn\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 7,\n      \"w\": 0.889,\n      \"h\": 2\n    },\n    \"Enter\"\n  ],\n  [\n    {\n      \"w\": 1.139\n    },\n    \"Ctrl\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"Fn\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"Super\",\n    \"Alt\",\n    {\n      \"x\": -8.881784197001252e-16,\n      \"w\": 5\n    },\n    \"\",\n    \"Alt\",\n    \"App\",\n    {\n      \"w\": 1.75\n    },\n    \"Ctrl\",\n    \"Left\",\n    \"Down\",\n    \"Right\",\n    {\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"0\\nIns\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \".\\nDel\"\n  ]\n]"
  },
  {
    "path": "layouts/keyboards/system76/18H9LHA05/layout.json",
    "content": "{\n  \"K00\": [\n    7,\n    7\n  ],\n  \"K01\": [\n    8,\n    7\n  ],\n  \"K02\": [\n    9,\n    3\n  ],\n  \"K03\": [\n    12,\n    5\n  ],\n  \"K04\": [\n    14,\n    3\n  ],\n  \"K05\": [\n    13,\n    7\n  ],\n  \"K06\": [\n    10,\n    6\n  ],\n  \"K07\": [\n    8,\n    5\n  ],\n  \"K08\": [\n    10,\n    5\n  ],\n  \"K09\": [\n    13,\n    3\n  ],\n  \"K0A\": [\n    14,\n    1\n  ],\n  \"K0B\": [\n    16,\n    6\n  ],\n  \"K0C\": [\n    16,\n    7\n  ],\n  \"K0D\": [\n    13,\n    2\n  ],\n  \"K0E\": [\n    14,\n    5\n  ],\n  \"K0F\": [\n    14,\n    6\n  ],\n  \"K0G\": [\n    16,\n    1\n  ],\n  \"K0H\": [\n    16,\n    0\n  ],\n  \"K0I\": [\n    5,\n    0\n  ],\n  \"K0J\": [\n    6,\n    0\n  ],\n  \"K10\": [\n    16,\n    5\n  ],\n  \"K11\": [\n    11,\n    6\n  ],\n  \"K12\": [\n    10,\n    7\n  ],\n  \"K13\": [\n    15,\n    6\n  ],\n  \"K14\": [\n    14,\n    7\n  ],\n  \"K15\": [\n    13,\n    6\n  ],\n  \"K16\": [\n    12,\n    7\n  ],\n  \"K17\": [\n    11,\n    2\n  ],\n  \"K18\": [\n    8,\n    6\n  ],\n  \"K19\": [\n    8,\n    3\n  ],\n  \"K1A\": [\n    7,\n    2\n  ],\n  \"K1B\": [\n    6,\n    1\n  ],\n  \"K1C\": [\n    17,\n    1\n  ],\n  \"K1D\": [\n    15,\n    7\n  ],\n  \"K1E\": [\n    5,\n    4\n  ],\n  \"K1F\": [\n    10,\n    0\n  ],\n  \"K1G\": [\n    11,\n    0\n  ],\n  \"K1H\": [\n    4,\n    1\n  ],\n  \"K20\": [\n    7,\n    6\n  ],\n  \"K21\": [\n    14,\n    0\n  ],\n  \"K22\": [\n    5,\n    1\n  ],\n  \"K23\": [\n    6,\n    2\n  ],\n  \"K24\": [\n    7,\n    3\n  ],\n  \"K25\": [\n    8,\n    4\n  ],\n  \"K26\": [\n    7,\n    1\n  ],\n  \"K27\": [\n    15,\n    4\n  ],\n  \"K28\": [\n    12,\n    6\n  ],\n  \"K29\": [\n    13,\n    5\n  ],\n  \"K2A\": [\n    11,\n    7\n  ],\n  \"K2B\": [\n    10,\n    3\n  ],\n  \"K2C\": [\n    8,\n    2\n  ],\n  \"K2D\": [\n    12,\n    0\n  ],\n  \"K2E\": [\n    14,\n    2\n  ],\n  \"K2F\": [\n    4,\n    3\n  ],\n  \"K2G\": [\n    15,\n    5\n  ],\n  \"K2H\": [\n    15,\n    3\n  ],\n  \"K30\": [\n    5,\n    7\n  ],\n  \"K31\": [\n    12,\n    2\n  ],\n  \"K32\": [\n    10,\n    4\n  ],\n  \"K33\": [\n    11,\n    3\n  ],\n  \"K34\": [\n    9,\n    1\n  ],\n  \"K35\": [\n    17,\n    0\n  ],\n  \"K36\": [\n    9,\n    2\n  ],\n  \"K37\": [\n    8,\n    1\n  ],\n  \"K38\": [\n    7,\n    0\n  ],\n  \"K39\": [\n    6,\n    3\n  ],\n  \"K3A\": [\n    7,\n    5\n  ],\n  \"K3B\": [\n    9,\n    6\n  ],\n  \"K3C\": [\n    15,\n    2\n  ],\n  \"K3D\": [\n    5,\n    5\n  ],\n  \"K3E\": [\n    14,\n    4\n  ],\n  \"K3F\": [\n    5,\n    6\n  ],\n  \"K40\": [\n    2,\n    6\n  ],\n  \"K41\": [\n    4,\n    0\n  ],\n  \"K42\": [\n    15,\n    1\n  ],\n  \"K43\": [\n    16,\n    2\n  ],\n  \"K44\": [\n    13,\n    1\n  ],\n  \"K45\": [\n    9,\n    7\n  ],\n  \"K46\": [\n    13,\n    4\n  ],\n  \"K47\": [\n    6,\n    6\n  ],\n  \"K48\": [\n    10,\n    1\n  ],\n  \"K49\": [\n    11,\n    1\n  ],\n  \"K4A\": [\n    12,\n    3\n  ],\n  \"K4B\": [\n    2,\n    7\n  ],\n  \"K4C\": [\n    16,\n    3\n  ],\n  \"K4D\": [\n    17,\n    4\n  ],\n  \"K4E\": [\n    4,\n    4\n  ],\n  \"K4F\": [\n    17,\n    2\n  ],\n  \"K4G\": [\n    9,\n    5\n  ],\n  \"K50\": [\n    0,\n    6\n  ],\n  \"K51\": [\n    17,\n    3\n  ],\n  \"K52\": [\n    3,\n    0\n  ],\n  \"K53\": [\n    1,\n    6\n  ],\n  \"K54\": [\n    3,\n    7\n  ],\n  \"K55\": [\n    1,\n    7\n  ],\n  \"K56\": [\n    15,\n    0\n  ],\n  \"K57\": [\n    0,\n    7\n  ],\n  \"K58\": [\n    17,\n    5\n  ],\n  \"K59\": [\n    16,\n    4\n  ],\n  \"K5A\": [\n    17,\n    6\n  ],\n  \"K5B\": [\n    8,\n    0\n  ],\n  \"K5C\": [\n    9,\n    0\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/18H9LHA05/leds.json",
    "content": "{}\n"
  },
  {
    "path": "layouts/keyboards/system76/18H9LHA05/physical.json",
    "content": "[\n  {\n    \"name\": \"System76 Darter Pro - Simple\",\n    \"author\": \"Jeremy Soller\"\n  },\n  [\n    {\n      \"c\": \"#141414\",\n      \"t\": \"#ffffff\",\n      \"a\": 7,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"Esc\",\n    {\n      \"x\": -0.0005999999999999339,\n      \"a\": 4,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F1\",\n    {\n      \"x\": -0.000600000000000156,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F2\",\n    {\n      \"x\": -0.0005999999999999339,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F3\",\n    {\n      \"x\": -0.0005999999999999339,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F4\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F5\",\n    {\n      \"x\": 0.009400000000000297,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F6\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F7\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F8\",\n    {\n      \"x\": -0.0005999999999986017,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F9\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F10\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F11\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"F12\",\n    {\n      \"x\": -0.0005999999999986017,\n      \"a\": 5,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"PrtSc\\nSysRq\",\n    {\n      \"x\": -0.000600000000000378,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"Insert\\nScrLk\",\n    {\n      \"x\": -0.000600000000000378,\n      \"a\": 7,\n      \"w\": 0.9306,\n      \"h\": 0.75\n    },\n    \"Del\",\n    {\n      \"x\": 0.10939999999999905,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"Home\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"End\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 5,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"PgUp\\nPause\",\n    {\n      \"x\": -0.028999999999999915,\n      \"w\": 0.889,\n      \"h\": 0.75\n    },\n    \"PgDn\\nBreak\"\n  ],\n  [\n    {\n      \"y\": -0.25,\n      \"a\": 4,\n      \"w\": 0.889\n    },\n    \"~\\n`\",\n    {\n      \"x\": 0.0010000000000000009,\n      \"a\": 5\n    },\n    \"!\\n1\",\n    {\n      \"x\": 6.661338147750939e-16\n    },\n    \"@\\n2\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"#\\n3\",\n    \"$\\n4\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"%\\n5\",\n    \"^\\n6\",\n    \"&\\n7\",\n    \"*\\n8\",\n    \"(\\n9\",\n    \")\\n0\",\n    \"_\\n-\",\n    \"+\\n=\",\n    {\n      \"a\": 7,\n      \"w\": 2\n    },\n    \"Backspace\",\n    {\n      \"x\": 0.10999999999999943,\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"Num\\nLk\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 7,\n      \"w\": 0.889\n    },\n    \"/\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"*\",\n    {\n      \"x\": -0.028999999999999915,\n      \"w\": 0.889\n    },\n    \"-\"\n  ],\n  [\n    {\n      \"w\": 1.389\n    },\n    \"Tab\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"Q\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"W\",\n    \"E\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"R\",\n    \"T\",\n    \"Y\",\n    \"U\",\n    \"I\",\n    \"O\",\n    \"P\",\n    {\n      \"a\": 5\n    },\n    \"{\\n[\",\n    \"}\\n]\",\n    {\n      \"w\": 1.5\n    },\n    \"|\\n\\\\\",\n    {\n      \"x\": 0.10999999999999943,\n      \"w\": 0.889\n    },\n    \"7\\nHome\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"8\\nUp\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"9\\nPgUp\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 7,\n      \"w\": 0.889,\n      \"h\": 2\n    },\n    \"+\"\n  ],\n  [\n    {\n      \"w\": 1.639\n    },\n    \"Caps Lock\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"A\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"S\",\n    \"D\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"F\",\n    \"G\",\n    \"H\",\n    \"J\",\n    \"K\",\n    \"L\",\n    {\n      \"a\": 5\n    },\n    \":\\n;\",\n    \"\\\"\\n'\",\n    {\n      \"a\": 7,\n      \"w\": 2.25\n    },\n    \"Enter\",\n    {\n      \"x\": 0.10999999999999943,\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"4\\nLeft\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"5\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"6\\nRight\"\n  ],\n  [\n    {\n      \"a\": 7,\n      \"w\": 2.139\n    },\n    \"Shift\",\n    {\n      \"x\": 0.001000000000000334\n    },\n    \"Z\",\n    \"X\",\n    {\n      \"x\": -8.881784197001252e-16\n    },\n    \"C\",\n    \"V\",\n    \"B\",\n    \"N\",\n    \"M\",\n    {\n      \"a\": 5\n    },\n    \"<\\n,\",\n    \">\\n.\",\n    \"?\\n/\",\n    {\n      \"a\": 7,\n      \"w\": 1.75\n    },\n    \"Shift\",\n    \"Up\",\n    {\n      \"x\": 0.10999999999999943,\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"1\\nEnd\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"2\\nDown\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \"3\\nPgDn\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"a\": 7,\n      \"w\": 0.889,\n      \"h\": 2\n    },\n    \"Enter\"\n  ],\n  [\n    {\n      \"w\": 1.139\n    },\n    \"Ctrl\",\n    {\n      \"x\": 0.0009999999999998899\n    },\n    \"Fn\",\n    {\n      \"x\": 4.440892098500626e-16\n    },\n    \"Super\",\n    \"Alt\",\n    {\n      \"x\": -8.881784197001252e-16,\n      \"w\": 5\n    },\n    \"\",\n    \"Alt\",\n    \"App\",\n    {\n      \"w\": 1.75\n    },\n    \"Ctrl\",\n    \"Left\",\n    \"Down\",\n    \"Right\",\n    {\n      \"a\": 5,\n      \"w\": 0.889\n    },\n    \"0\\nIns\",\n    {\n      \"x\": 0.0010000000000012221,\n      \"w\": 0.889\n    },\n    \".\\nDel\"\n  ]\n]"
  },
  {
    "path": "layouts/keyboards/system76/launch_1/layout.json",
    "content": "{\n  \"K00\": [\n    0,\n    0\n  ],\n  \"K01\": [\n    0,\n    1\n  ],\n  \"K02\": [\n    0,\n    2\n  ],\n  \"K03\": [\n    0,\n    3\n  ],\n  \"K04\": [\n    0,\n    4\n  ],\n  \"K05\": [\n    0,\n    5\n  ],\n  \"K06\": [\n    0,\n    6\n  ],\n  \"K07\": [\n    0,\n    7\n  ],\n  \"K08\": [\n    0,\n    8\n  ],\n  \"K09\": [\n    0,\n    9\n  ],\n  \"K0A\": [\n    0,\n    10\n  ],\n  \"K0B\": [\n    0,\n    11\n  ],\n  \"K0C\": [\n    0,\n    12\n  ],\n  \"K0D\": [\n    0,\n    13\n  ],\n  \"K0E\": [\n    3,\n    13\n  ],\n  \"K10\": [\n    1,\n    0\n  ],\n  \"K11\": [\n    1,\n    1\n  ],\n  \"K12\": [\n    1,\n    2\n  ],\n  \"K13\": [\n    1,\n    3\n  ],\n  \"K14\": [\n    1,\n    4\n  ],\n  \"K15\": [\n    1,\n    5\n  ],\n  \"K16\": [\n    1,\n    6\n  ],\n  \"K17\": [\n    1,\n    7\n  ],\n  \"K18\": [\n    1,\n    8\n  ],\n  \"K19\": [\n    1,\n    9\n  ],\n  \"K1A\": [\n    1,\n    10\n  ],\n  \"K1B\": [\n    1,\n    11\n  ],\n  \"K1C\": [\n    1,\n    12\n  ],\n  \"K1D\": [\n    1,\n    13\n  ],\n  \"K1E\": [\n    4,\n    13\n  ],\n  \"K20\": [\n    2,\n    0\n  ],\n  \"K21\": [\n    2,\n    1\n  ],\n  \"K22\": [\n    2,\n    2\n  ],\n  \"K23\": [\n    2,\n    3\n  ],\n  \"K24\": [\n    2,\n    4\n  ],\n  \"K25\": [\n    2,\n    5\n  ],\n  \"K26\": [\n    2,\n    6\n  ],\n  \"K27\": [\n    2,\n    7\n  ],\n  \"K28\": [\n    2,\n    8\n  ],\n  \"K29\": [\n    2,\n    9\n  ],\n  \"K2A\": [\n    2,\n    10\n  ],\n  \"K2B\": [\n    2,\n    11\n  ],\n  \"K2C\": [\n    2,\n    12\n  ],\n  \"K2D\": [\n    2,\n    13\n  ],\n  \"K2E\": [\n    5,\n    13\n  ],\n  \"K30\": [\n    3,\n    0\n  ],\n  \"K31\": [\n    3,\n    1\n  ],\n  \"K32\": [\n    3,\n    2\n  ],\n  \"K33\": [\n    3,\n    3\n  ],\n  \"K34\": [\n    3,\n    4\n  ],\n  \"K35\": [\n    3,\n    5\n  ],\n  \"K36\": [\n    3,\n    6\n  ],\n  \"K37\": [\n    3,\n    7\n  ],\n  \"K38\": [\n    3,\n    8\n  ],\n  \"K39\": [\n    3,\n    9\n  ],\n  \"K3A\": [\n    3,\n    10\n  ],\n  \"K3B\": [\n    3,\n    11\n  ],\n  \"K3C\": [\n    3,\n    12\n  ],\n  \"K3D\": [\n    5,\n    5\n  ],\n  \"K40\": [\n    4,\n    0\n  ],\n  \"K41\": [\n    4,\n    1\n  ],\n  \"K42\": [\n    4,\n    2\n  ],\n  \"K43\": [\n    4,\n    3\n  ],\n  \"K44\": [\n    4,\n    4\n  ],\n  \"K45\": [\n    4,\n    5\n  ],\n  \"K46\": [\n    4,\n    6\n  ],\n  \"K47\": [\n    4,\n    7\n  ],\n  \"K48\": [\n    4,\n    8\n  ],\n  \"K49\": [\n    4,\n    9\n  ],\n  \"K4A\": [\n    4,\n    10\n  ],\n  \"K4B\": [\n    4,\n    11\n  ],\n  \"K4C\": [\n    4,\n    12\n  ],\n  \"K50\": [\n    5,\n    0\n  ],\n  \"K51\": [\n    5,\n    1\n  ],\n  \"K52\": [\n    5,\n    2\n  ],\n  \"K53\": [\n    5,\n    3\n  ],\n  \"K54\": [\n    5,\n    4\n  ],\n  \"K55\": [\n    5,\n    6\n  ],\n  \"K56\": [\n    5,\n    7\n  ],\n  \"K57\": [\n    5,\n    8\n  ],\n  \"K58\": [\n    5,\n    9\n  ],\n  \"K59\": [\n    5,\n    10\n  ],\n  \"K5A\": [\n    5,\n    11\n  ],\n  \"K5B\": [\n    5,\n    12\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_1/leds.json",
    "content": "{\n  \"K00\": [\n    69\n  ],\n  \"K01\": [\n    70\n  ],\n  \"K02\": [\n    71\n  ],\n  \"K03\": [\n    72\n  ],\n  \"K04\": [\n    73\n  ],\n  \"K05\": [\n    74\n  ],\n  \"K06\": [\n    75\n  ],\n  \"K07\": [\n    76\n  ],\n  \"K08\": [\n    77\n  ],\n  \"K09\": [\n    78\n  ],\n  \"K0A\": [\n    79\n  ],\n  \"K0B\": [\n    80\n  ],\n  \"K0C\": [\n    81\n  ],\n  \"K0D\": [\n    82\n  ],\n  \"K0E\": [\n    83\n  ],\n  \"K10\": [\n    68\n  ],\n  \"K11\": [\n    67\n  ],\n  \"K12\": [\n    66\n  ],\n  \"K13\": [\n    65\n  ],\n  \"K14\": [\n    64\n  ],\n  \"K15\": [\n    63\n  ],\n  \"K16\": [\n    62\n  ],\n  \"K17\": [\n    61\n  ],\n  \"K18\": [\n    60\n  ],\n  \"K19\": [\n    59\n  ],\n  \"K1A\": [\n    58\n  ],\n  \"K1B\": [\n    57\n  ],\n  \"K1C\": [\n    56\n  ],\n  \"K1D\": [\n    55\n  ],\n  \"K1E\": [\n    54\n  ],\n  \"K20\": [\n    39\n  ],\n  \"K21\": [\n    40\n  ],\n  \"K22\": [\n    41\n  ],\n  \"K23\": [\n    42\n  ],\n  \"K24\": [\n    43\n  ],\n  \"K25\": [\n    44\n  ],\n  \"K26\": [\n    45\n  ],\n  \"K27\": [\n    46\n  ],\n  \"K28\": [\n    47\n  ],\n  \"K29\": [\n    48\n  ],\n  \"K2A\": [\n    49\n  ],\n  \"K2B\": [\n    50\n  ],\n  \"K2C\": [\n    51\n  ],\n  \"K2D\": [\n    52\n  ],\n  \"K2E\": [\n    53\n  ],\n  \"K30\": [\n    38\n  ],\n  \"K31\": [\n    37\n  ],\n  \"K32\": [\n    36\n  ],\n  \"K33\": [\n    35\n  ],\n  \"K34\": [\n    34\n  ],\n  \"K35\": [\n    33\n  ],\n  \"K36\": [\n    32\n  ],\n  \"K37\": [\n    31\n  ],\n  \"K38\": [\n    30\n  ],\n  \"K39\": [\n    29\n  ],\n  \"K3A\": [\n    28\n  ],\n  \"K3B\": [\n    27\n  ],\n  \"K3C\": [\n    26\n  ],\n  \"K3D\": [\n    25\n  ],\n  \"K40\": [\n    12\n  ],\n  \"K41\": [\n    11\n  ],\n  \"K42\": [\n    10\n  ],\n  \"K43\": [\n    9\n  ],\n  \"K44\": [\n    8\n  ],\n  \"K45\": [\n    7\n  ],\n  \"K46\": [\n    6\n  ],\n  \"K47\": [\n    5\n  ],\n  \"K48\": [\n    4\n  ],\n  \"K49\": [\n    3\n  ],\n  \"K4A\": [\n    2\n  ],\n  \"K4B\": [\n    1\n  ],\n  \"K4C\": [\n    0\n  ],\n  \"K50\": [\n    13\n  ],\n  \"K51\": [\n    14\n  ],\n  \"K52\": [\n    15\n  ],\n  \"K53\": [\n    16\n  ],\n  \"K54\": [\n    17\n  ],\n  \"K55\": [\n    18\n  ],\n  \"K56\": [\n    19\n  ],\n  \"K57\": [\n    20\n  ],\n  \"K58\": [\n    21\n  ],\n  \"K59\": [\n    22\n  ],\n  \"K5A\": [\n    23\n  ],\n  \"K5B\": [\n    24\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_1/physical.json",
    "content": "[\n  {\n    \"name\": \"System76 Launch Configurable Keyboard 1.0\",\n    \"author\": \"Jeremy Soller\",\n    \"switchMount\": \"cherry\",\n    \"switchBrand\": \"kailh\",\n    \"plate\": true\n  },\n  [\n    {\n      \"c\": \"#755841\",\n      \"a\": 7\n    },\n    \"Esc\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"F1\",\n    \"F2\",\n    \"F3\",\n    \"F4\",\n    \"F5\",\n    \"F6\",\n    \"F7\",\n    \"F8\",\n    \"F9\",\n    \"F10\",\n    \"F11\",\n    \"F12\",\n    {\n      \"w\": 1.5\n    },\n    \"Del\",\n    {\n      \"x\": 0.25\n    },\n    \"Home\"\n  ],\n  [\n    {\n      \"c\": \"#ffe8d6\",\n      \"a\": 5\n    },\n    \"~\\n`\",\n    \"!\\n1\",\n    \"@\\n2\",\n    \"#\\n3\",\n    \"$\\n4\",\n    \"%\\n5\",\n    \"^\\n6\",\n    \"&\\n7\",\n    \"*\\n8\",\n    \"(\\n9\",\n    \")\\n0\",\n    \"_\\n-\",\n    \"+\\n=\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Bksp\",\n    {\n      \"x\": 0.25\n    },\n    \"PgUp\"\n  ],\n  [\n    {\n      \"w\": 1.5\n    },\n    \"Tab\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Q\",\n    \"W\",\n    \"E\",\n    \"R\",\n    \"T\",\n    \"Y\",\n    \"U\",\n    \"I\",\n    \"O\",\n    \"P\",\n    {\n      \"a\": 5\n    },\n    \"{\\n[\",\n    \"}\\n]\",\n    \"|\\n\\\\\",\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"a\": 7\n    },\n    \"PgDn\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"w\": 1.5\n    },\n    \"Caps\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"A\",\n    \"S\",\n    \"D\",\n    {\n      \"n\": true\n    },\n    \"F\",\n    \"G\",\n    \"H\",\n    {\n      \"n\": true\n    },\n    \"J\",\n    \"K\",\n    \"L\",\n    {\n      \"a\": 5\n    },\n    \":\\n;\",\n    \"\\\"\\n'\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Enter\",\n    {\n      \"x\": 0.5\n    },\n    \"End\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"w\": 2\n    },\n    \"Shift\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Z\",\n    \"X\",\n    \"C\",\n    \"V\",\n    \"B\",\n    \"N\",\n    \"M\",\n    {\n      \"a\": 5\n    },\n    \"<\\n,\",\n    \">\\n.\",\n    \"?\\n/\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Shift\",\n    {\n      \"c\": \"#755841\"\n    },\n    \"Up\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"w\": 1.5\n    },\n    \"Ctrl\",\n    \"Alt\",\n    \"Fn\",\n    \"Super\",\n    {\n      \"c\": \"#ffe8d6\",\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"Ctrl\",\n    \"Alt\",\n    {\n      \"w\": 1.5\n    },\n    \"Fn\",\n    {\n      \"x\": 0.5,\n      \"c\": \"#755841\"\n    },\n    \"Left\",\n    {\n      \"n\": true\n    },\n    \"Down\",\n    \"Right\"\n  ]\n]\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_2/layout.json",
    "content": "{\n  \"K00\": [\n    0,\n    0\n  ],\n  \"K01\": [\n    0,\n    1\n  ],\n  \"K02\": [\n    0,\n    2\n  ],\n  \"K03\": [\n    0,\n    3\n  ],\n  \"K04\": [\n    0,\n    4\n  ],\n  \"K05\": [\n    0,\n    5\n  ],\n  \"K06\": [\n    0,\n    6\n  ],\n  \"K07\": [\n    0,\n    7\n  ],\n  \"K08\": [\n    0,\n    8\n  ],\n  \"K09\": [\n    0,\n    9\n  ],\n  \"K0A\": [\n    0,\n    10\n  ],\n  \"K0B\": [\n    0,\n    11\n  ],\n  \"K0C\": [\n    0,\n    12\n  ],\n  \"K0D\": [\n    0,\n    13\n  ],\n  \"K0E\": [\n    3,\n    13\n  ],\n  \"K10\": [\n    1,\n    0\n  ],\n  \"K11\": [\n    1,\n    1\n  ],\n  \"K12\": [\n    1,\n    2\n  ],\n  \"K13\": [\n    1,\n    3\n  ],\n  \"K14\": [\n    1,\n    4\n  ],\n  \"K15\": [\n    1,\n    5\n  ],\n  \"K16\": [\n    1,\n    6\n  ],\n  \"K17\": [\n    1,\n    7\n  ],\n  \"K18\": [\n    1,\n    8\n  ],\n  \"K19\": [\n    1,\n    9\n  ],\n  \"K1A\": [\n    1,\n    10\n  ],\n  \"K1B\": [\n    1,\n    11\n  ],\n  \"K1C\": [\n    1,\n    12\n  ],\n  \"K1D\": [\n    1,\n    13\n  ],\n  \"K1E\": [\n    4,\n    13\n  ],\n  \"K20\": [\n    2,\n    0\n  ],\n  \"K21\": [\n    2,\n    1\n  ],\n  \"K22\": [\n    2,\n    2\n  ],\n  \"K23\": [\n    2,\n    3\n  ],\n  \"K24\": [\n    2,\n    4\n  ],\n  \"K25\": [\n    2,\n    5\n  ],\n  \"K26\": [\n    2,\n    6\n  ],\n  \"K27\": [\n    2,\n    7\n  ],\n  \"K28\": [\n    2,\n    8\n  ],\n  \"K29\": [\n    2,\n    9\n  ],\n  \"K2A\": [\n    2,\n    10\n  ],\n  \"K2B\": [\n    2,\n    11\n  ],\n  \"K2C\": [\n    2,\n    12\n  ],\n  \"K2D\": [\n    2,\n    13\n  ],\n  \"K2E\": [\n    5,\n    13\n  ],\n  \"K30\": [\n    3,\n    0\n  ],\n  \"K31\": [\n    3,\n    1\n  ],\n  \"K32\": [\n    3,\n    2\n  ],\n  \"K33\": [\n    3,\n    3\n  ],\n  \"K34\": [\n    3,\n    4\n  ],\n  \"K35\": [\n    3,\n    5\n  ],\n  \"K36\": [\n    3,\n    6\n  ],\n  \"K37\": [\n    3,\n    7\n  ],\n  \"K38\": [\n    3,\n    8\n  ],\n  \"K39\": [\n    3,\n    9\n  ],\n  \"K3A\": [\n    3,\n    10\n  ],\n  \"K3B\": [\n    3,\n    11\n  ],\n  \"K3C\": [\n    3,\n    12\n  ],\n  \"K3D\": [\n    5,\n    5\n  ],\n  \"K40\": [\n    4,\n    0\n  ],\n  \"K41\": [\n    4,\n    1\n  ],\n  \"K42\": [\n    4,\n    2\n  ],\n  \"K43\": [\n    4,\n    3\n  ],\n  \"K44\": [\n    4,\n    4\n  ],\n  \"K45\": [\n    4,\n    5\n  ],\n  \"K46\": [\n    4,\n    6\n  ],\n  \"K47\": [\n    4,\n    7\n  ],\n  \"K48\": [\n    4,\n    8\n  ],\n  \"K49\": [\n    4,\n    9\n  ],\n  \"K4A\": [\n    4,\n    10\n  ],\n  \"K4B\": [\n    4,\n    11\n  ],\n  \"K4C\": [\n    4,\n    12\n  ],\n  \"K50\": [\n    5,\n    0\n  ],\n  \"K51\": [\n    5,\n    1\n  ],\n  \"K52\": [\n    5,\n    2\n  ],\n  \"K53\": [\n    5,\n    3\n  ],\n  \"K54\": [\n    5,\n    4\n  ],\n  \"K55\": [\n    5,\n    6\n  ],\n  \"K56\": [\n    5,\n    7\n  ],\n  \"K57\": [\n    5,\n    8\n  ],\n  \"K58\": [\n    5,\n    9\n  ],\n  \"K59\": [\n    5,\n    10\n  ],\n  \"K5A\": [\n    5,\n    11\n  ],\n  \"K5B\": [\n    5,\n    12\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_2/leds.json",
    "content": "{\n  \"K00\": [\n    69\n  ],\n  \"K01\": [\n    70\n  ],\n  \"K02\": [\n    71\n  ],\n  \"K03\": [\n    72\n  ],\n  \"K04\": [\n    73\n  ],\n  \"K05\": [\n    74\n  ],\n  \"K06\": [\n    75\n  ],\n  \"K07\": [\n    76\n  ],\n  \"K08\": [\n    77\n  ],\n  \"K09\": [\n    78\n  ],\n  \"K0A\": [\n    79\n  ],\n  \"K0B\": [\n    80\n  ],\n  \"K0C\": [\n    81\n  ],\n  \"K0D\": [\n    82\n  ],\n  \"K0E\": [\n    83\n  ],\n  \"K10\": [\n    68\n  ],\n  \"K11\": [\n    67\n  ],\n  \"K12\": [\n    66\n  ],\n  \"K13\": [\n    65\n  ],\n  \"K14\": [\n    64\n  ],\n  \"K15\": [\n    63\n  ],\n  \"K16\": [\n    62\n  ],\n  \"K17\": [\n    61\n  ],\n  \"K18\": [\n    60\n  ],\n  \"K19\": [\n    59\n  ],\n  \"K1A\": [\n    58\n  ],\n  \"K1B\": [\n    57\n  ],\n  \"K1C\": [\n    56\n  ],\n  \"K1D\": [\n    55\n  ],\n  \"K1E\": [\n    54\n  ],\n  \"K20\": [\n    39\n  ],\n  \"K21\": [\n    40\n  ],\n  \"K22\": [\n    41\n  ],\n  \"K23\": [\n    42\n  ],\n  \"K24\": [\n    43\n  ],\n  \"K25\": [\n    44\n  ],\n  \"K26\": [\n    45\n  ],\n  \"K27\": [\n    46\n  ],\n  \"K28\": [\n    47\n  ],\n  \"K29\": [\n    48\n  ],\n  \"K2A\": [\n    49\n  ],\n  \"K2B\": [\n    50\n  ],\n  \"K2C\": [\n    51\n  ],\n  \"K2D\": [\n    52\n  ],\n  \"K2E\": [\n    53\n  ],\n  \"K30\": [\n    38\n  ],\n  \"K31\": [\n    37\n  ],\n  \"K32\": [\n    36\n  ],\n  \"K33\": [\n    35\n  ],\n  \"K34\": [\n    34\n  ],\n  \"K35\": [\n    33\n  ],\n  \"K36\": [\n    32\n  ],\n  \"K37\": [\n    31\n  ],\n  \"K38\": [\n    30\n  ],\n  \"K39\": [\n    29\n  ],\n  \"K3A\": [\n    28\n  ],\n  \"K3B\": [\n    27\n  ],\n  \"K3C\": [\n    26\n  ],\n  \"K3D\": [\n    25\n  ],\n  \"K40\": [\n    12\n  ],\n  \"K41\": [\n    11\n  ],\n  \"K42\": [\n    10\n  ],\n  \"K43\": [\n    9\n  ],\n  \"K44\": [\n    8\n  ],\n  \"K45\": [\n    7\n  ],\n  \"K46\": [\n    6\n  ],\n  \"K47\": [\n    5\n  ],\n  \"K48\": [\n    4\n  ],\n  \"K49\": [\n    3\n  ],\n  \"K4A\": [\n    2\n  ],\n  \"K4B\": [\n    1\n  ],\n  \"K4C\": [\n    0\n  ],\n  \"K50\": [\n    13\n  ],\n  \"K51\": [\n    14\n  ],\n  \"K52\": [\n    15\n  ],\n  \"K53\": [\n    16\n  ],\n  \"K54\": [\n    17\n  ],\n  \"K55\": [\n    18\n  ],\n  \"K56\": [\n    19\n  ],\n  \"K57\": [\n    20\n  ],\n  \"K58\": [\n    21\n  ],\n  \"K59\": [\n    22\n  ],\n  \"K5A\": [\n    23\n  ],\n  \"K5B\": [\n    24\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_2/physical.json",
    "content": "[\n  {\n    \"name\": \"System76 Launch Configurable Keyboard 1.0\",\n    \"author\": \"Jeremy Soller\",\n    \"switchMount\": \"cherry\",\n    \"switchBrand\": \"kailh\",\n    \"plate\": true\n  },\n  [\n    {\n      \"c\": \"#755841\",\n      \"a\": 7\n    },\n    \"Esc\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"F1\",\n    \"F2\",\n    \"F3\",\n    \"F4\",\n    \"F5\",\n    \"F6\",\n    \"F7\",\n    \"F8\",\n    \"F9\",\n    \"F10\",\n    \"F11\",\n    \"F12\",\n    {\n      \"w\": 1.5\n    },\n    \"Del\",\n    {\n      \"x\": 0.25\n    },\n    \"Home\"\n  ],\n  [\n    {\n      \"c\": \"#ffe8d6\",\n      \"a\": 5\n    },\n    \"~\\n`\",\n    \"!\\n1\",\n    \"@\\n2\",\n    \"#\\n3\",\n    \"$\\n4\",\n    \"%\\n5\",\n    \"^\\n6\",\n    \"&\\n7\",\n    \"*\\n8\",\n    \"(\\n9\",\n    \")\\n0\",\n    \"_\\n-\",\n    \"+\\n=\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Bksp\",\n    {\n      \"x\": 0.25\n    },\n    \"PgUp\"\n  ],\n  [\n    {\n      \"w\": 1.5\n    },\n    \"Tab\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Q\",\n    \"W\",\n    \"E\",\n    \"R\",\n    \"T\",\n    \"Y\",\n    \"U\",\n    \"I\",\n    \"O\",\n    \"P\",\n    {\n      \"a\": 5\n    },\n    \"{\\n[\",\n    \"}\\n]\",\n    \"|\\n\\\\\",\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"a\": 7\n    },\n    \"PgDn\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"w\": 1.5\n    },\n    \"Caps\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"A\",\n    \"S\",\n    \"D\",\n    {\n      \"n\": true\n    },\n    \"F\",\n    \"G\",\n    \"H\",\n    {\n      \"n\": true\n    },\n    \"J\",\n    \"K\",\n    \"L\",\n    {\n      \"a\": 5\n    },\n    \":\\n;\",\n    \"\\\"\\n'\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Enter\",\n    {\n      \"x\": 0.5\n    },\n    \"End\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"w\": 2\n    },\n    \"Shift\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Z\",\n    \"X\",\n    \"C\",\n    \"V\",\n    \"B\",\n    \"N\",\n    \"M\",\n    {\n      \"a\": 5\n    },\n    \"<\\n,\",\n    \">\\n.\",\n    \"?\\n/\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Shift\",\n    {\n      \"c\": \"#755841\"\n    },\n    \"Up\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"w\": 1.5\n    },\n    \"Ctrl\",\n    \"Alt\",\n    \"Fn\",\n    \"Super\",\n    {\n      \"c\": \"#ffe8d6\",\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"Ctrl\",\n    \"Alt\",\n    {\n      \"w\": 1.5\n    },\n    \"Fn\",\n    {\n      \"x\": 0.5,\n      \"c\": \"#755841\"\n    },\n    \"Left\",\n    {\n      \"n\": true\n    },\n    \"Down\",\n    \"Right\"\n  ]\n]\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_3/layout.json",
    "content": "{\n  \"K00\": [\n    0,\n    0\n  ],\n  \"K01\": [\n    0,\n    1\n  ],\n  \"K02\": [\n    0,\n    2\n  ],\n  \"K03\": [\n    0,\n    3\n  ],\n  \"K04\": [\n    0,\n    4\n  ],\n  \"K05\": [\n    0,\n    5\n  ],\n  \"K06\": [\n    0,\n    6\n  ],\n  \"K07\": [\n    0,\n    7\n  ],\n  \"K08\": [\n    0,\n    8\n  ],\n  \"K09\": [\n    0,\n    9\n  ],\n  \"K0A\": [\n    0,\n    10\n  ],\n  \"K0B\": [\n    0,\n    11\n  ],\n  \"K0C\": [\n    0,\n    12\n  ],\n  \"K0D\": [\n    0,\n    13\n  ],\n  \"K0E\": [\n    3,\n    13\n  ],\n  \"K10\": [\n    1,\n    0\n  ],\n  \"K11\": [\n    1,\n    1\n  ],\n  \"K12\": [\n    1,\n    2\n  ],\n  \"K13\": [\n    1,\n    3\n  ],\n  \"K14\": [\n    1,\n    4\n  ],\n  \"K15\": [\n    1,\n    5\n  ],\n  \"K16\": [\n    1,\n    6\n  ],\n  \"K17\": [\n    1,\n    7\n  ],\n  \"K18\": [\n    1,\n    8\n  ],\n  \"K19\": [\n    1,\n    9\n  ],\n  \"K1A\": [\n    1,\n    10\n  ],\n  \"K1B\": [\n    1,\n    11\n  ],\n  \"K1C\": [\n    1,\n    12\n  ],\n  \"K1D\": [\n    1,\n    13\n  ],\n  \"K1E\": [\n    4,\n    13\n  ],\n  \"K20\": [\n    2,\n    0\n  ],\n  \"K21\": [\n    2,\n    1\n  ],\n  \"K22\": [\n    2,\n    2\n  ],\n  \"K23\": [\n    2,\n    3\n  ],\n  \"K24\": [\n    2,\n    4\n  ],\n  \"K25\": [\n    2,\n    5\n  ],\n  \"K26\": [\n    2,\n    6\n  ],\n  \"K27\": [\n    2,\n    7\n  ],\n  \"K28\": [\n    2,\n    8\n  ],\n  \"K29\": [\n    2,\n    9\n  ],\n  \"K2A\": [\n    2,\n    10\n  ],\n  \"K2B\": [\n    2,\n    11\n  ],\n  \"K2C\": [\n    2,\n    12\n  ],\n  \"K2D\": [\n    2,\n    13\n  ],\n  \"K2E\": [\n    5,\n    13\n  ],\n  \"K30\": [\n    3,\n    0\n  ],\n  \"K31\": [\n    3,\n    1\n  ],\n  \"K32\": [\n    3,\n    2\n  ],\n  \"K33\": [\n    3,\n    3\n  ],\n  \"K34\": [\n    3,\n    4\n  ],\n  \"K35\": [\n    3,\n    5\n  ],\n  \"K36\": [\n    3,\n    6\n  ],\n  \"K37\": [\n    3,\n    7\n  ],\n  \"K38\": [\n    3,\n    8\n  ],\n  \"K39\": [\n    3,\n    9\n  ],\n  \"K3A\": [\n    3,\n    10\n  ],\n  \"K3B\": [\n    3,\n    11\n  ],\n  \"K3C\": [\n    3,\n    12\n  ],\n  \"K3D\": [\n    5,\n    5\n  ],\n  \"K40\": [\n    4,\n    0\n  ],\n  \"K41\": [\n    4,\n    1\n  ],\n  \"K42\": [\n    4,\n    2\n  ],\n  \"K43\": [\n    4,\n    3\n  ],\n  \"K44\": [\n    4,\n    4\n  ],\n  \"K45\": [\n    4,\n    5\n  ],\n  \"K46\": [\n    4,\n    6\n  ],\n  \"K47\": [\n    4,\n    7\n  ],\n  \"K48\": [\n    4,\n    8\n  ],\n  \"K49\": [\n    4,\n    9\n  ],\n  \"K4A\": [\n    4,\n    10\n  ],\n  \"K4B\": [\n    4,\n    11\n  ],\n  \"K4C\": [\n    4,\n    12\n  ],\n  \"K50\": [\n    5,\n    0\n  ],\n  \"K51\": [\n    5,\n    1\n  ],\n  \"K52\": [\n    5,\n    2\n  ],\n  \"K53\": [\n    5,\n    3\n  ],\n  \"K54\": [\n    5,\n    4\n  ],\n  \"K55\": [\n    5,\n    6\n  ],\n  \"K56\": [\n    5,\n    7\n  ],\n  \"K57\": [\n    5,\n    8\n  ],\n  \"K58\": [\n    5,\n    9\n  ],\n  \"K59\": [\n    5,\n    10\n  ],\n  \"K5A\": [\n    5,\n    11\n  ],\n  \"K5B\": [\n    5,\n    12\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_3/leds.json",
    "content": "{\n  \"K00\": [\n    69\n  ],\n  \"K01\": [\n    70\n  ],\n  \"K02\": [\n    71\n  ],\n  \"K03\": [\n    72\n  ],\n  \"K04\": [\n    73\n  ],\n  \"K05\": [\n    74\n  ],\n  \"K06\": [\n    75\n  ],\n  \"K07\": [\n    76\n  ],\n  \"K08\": [\n    77\n  ],\n  \"K09\": [\n    78\n  ],\n  \"K0A\": [\n    79\n  ],\n  \"K0B\": [\n    80\n  ],\n  \"K0C\": [\n    81\n  ],\n  \"K0D\": [\n    82\n  ],\n  \"K0E\": [\n    83\n  ],\n  \"K10\": [\n    68\n  ],\n  \"K11\": [\n    67\n  ],\n  \"K12\": [\n    66\n  ],\n  \"K13\": [\n    65\n  ],\n  \"K14\": [\n    64\n  ],\n  \"K15\": [\n    63\n  ],\n  \"K16\": [\n    62\n  ],\n  \"K17\": [\n    61\n  ],\n  \"K18\": [\n    60\n  ],\n  \"K19\": [\n    59\n  ],\n  \"K1A\": [\n    58\n  ],\n  \"K1B\": [\n    57\n  ],\n  \"K1C\": [\n    56\n  ],\n  \"K1D\": [\n    55\n  ],\n  \"K1E\": [\n    54\n  ],\n  \"K20\": [\n    39\n  ],\n  \"K21\": [\n    40\n  ],\n  \"K22\": [\n    41\n  ],\n  \"K23\": [\n    42\n  ],\n  \"K24\": [\n    43\n  ],\n  \"K25\": [\n    44\n  ],\n  \"K26\": [\n    45\n  ],\n  \"K27\": [\n    46\n  ],\n  \"K28\": [\n    47\n  ],\n  \"K29\": [\n    48\n  ],\n  \"K2A\": [\n    49\n  ],\n  \"K2B\": [\n    50\n  ],\n  \"K2C\": [\n    51\n  ],\n  \"K2D\": [\n    52\n  ],\n  \"K2E\": [\n    53\n  ],\n  \"K30\": [\n    38\n  ],\n  \"K31\": [\n    37\n  ],\n  \"K32\": [\n    36\n  ],\n  \"K33\": [\n    35\n  ],\n  \"K34\": [\n    34\n  ],\n  \"K35\": [\n    33\n  ],\n  \"K36\": [\n    32\n  ],\n  \"K37\": [\n    31\n  ],\n  \"K38\": [\n    30\n  ],\n  \"K39\": [\n    29\n  ],\n  \"K3A\": [\n    28\n  ],\n  \"K3B\": [\n    27\n  ],\n  \"K3C\": [\n    26\n  ],\n  \"K3D\": [\n    25\n  ],\n  \"K40\": [\n    12\n  ],\n  \"K41\": [\n    11\n  ],\n  \"K42\": [\n    10\n  ],\n  \"K43\": [\n    9\n  ],\n  \"K44\": [\n    8\n  ],\n  \"K45\": [\n    7\n  ],\n  \"K46\": [\n    6\n  ],\n  \"K47\": [\n    5\n  ],\n  \"K48\": [\n    4\n  ],\n  \"K49\": [\n    3\n  ],\n  \"K4A\": [\n    2\n  ],\n  \"K4B\": [\n    1\n  ],\n  \"K4C\": [\n    0\n  ],\n  \"K50\": [\n    13\n  ],\n  \"K51\": [\n    14\n  ],\n  \"K52\": [\n    15\n  ],\n  \"K53\": [\n    16\n  ],\n  \"K54\": [\n    17\n  ],\n  \"K55\": [\n    18\n  ],\n  \"K56\": [\n    19\n  ],\n  \"K57\": [\n    20\n  ],\n  \"K58\": [\n    21\n  ],\n  \"K59\": [\n    22\n  ],\n  \"K5A\": [\n    23\n  ],\n  \"K5B\": [\n    24\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_3/physical.json",
    "content": "[\n  {\n    \"name\": \"System76 Launch Configurable Keyboard 1.0\",\n    \"author\": \"Jeremy Soller\",\n    \"switchMount\": \"cherry\",\n    \"switchBrand\": \"kailh\",\n    \"plate\": true\n  },\n  [\n    {\n      \"c\": \"#755841\",\n      \"a\": 7\n    },\n    \"Esc\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"F1\",\n    \"F2\",\n    \"F3\",\n    \"F4\",\n    \"F5\",\n    \"F6\",\n    \"F7\",\n    \"F8\",\n    \"F9\",\n    \"F10\",\n    \"F11\",\n    \"F12\",\n    {\n      \"w\": 1.5\n    },\n    \"Del\",\n    {\n      \"x\": 0.25\n    },\n    \"Home\"\n  ],\n  [\n    {\n      \"c\": \"#ffe8d6\",\n      \"a\": 5\n    },\n    \"~\\n`\",\n    \"!\\n1\",\n    \"@\\n2\",\n    \"#\\n3\",\n    \"$\\n4\",\n    \"%\\n5\",\n    \"^\\n6\",\n    \"&\\n7\",\n    \"*\\n8\",\n    \"(\\n9\",\n    \")\\n0\",\n    \"_\\n-\",\n    \"+\\n=\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Bksp\",\n    {\n      \"x\": 0.25\n    },\n    \"PgUp\"\n  ],\n  [\n    {\n      \"w\": 1.5\n    },\n    \"Tab\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Q\",\n    \"W\",\n    \"E\",\n    \"R\",\n    \"T\",\n    \"Y\",\n    \"U\",\n    \"I\",\n    \"O\",\n    \"P\",\n    {\n      \"a\": 5\n    },\n    \"{\\n[\",\n    \"}\\n]\",\n    \"|\\n\\\\\",\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"a\": 7\n    },\n    \"PgDn\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"w\": 1.5\n    },\n    \"Caps\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"A\",\n    \"S\",\n    \"D\",\n    {\n      \"n\": true\n    },\n    \"F\",\n    \"G\",\n    \"H\",\n    {\n      \"n\": true\n    },\n    \"J\",\n    \"K\",\n    \"L\",\n    {\n      \"a\": 5\n    },\n    \":\\n;\",\n    \"\\\"\\n'\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Enter\",\n    {\n      \"x\": 0.5\n    },\n    \"End\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"w\": 2\n    },\n    \"Shift\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Z\",\n    \"X\",\n    \"C\",\n    \"V\",\n    \"B\",\n    \"N\",\n    \"M\",\n    {\n      \"a\": 5\n    },\n    \"<\\n,\",\n    \">\\n.\",\n    \"?\\n/\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Shift\",\n    {\n      \"c\": \"#755841\"\n    },\n    \"Up\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"w\": 1.5\n    },\n    \"Ctrl\",\n    \"Alt\",\n    \"Fn\",\n    \"Super\",\n    {\n      \"c\": \"#ffe8d6\",\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"Ctrl\",\n    \"Alt\",\n    {\n      \"w\": 1.5\n    },\n    \"Fn\",\n    {\n      \"x\": 0.5,\n      \"c\": \"#755841\"\n    },\n    \"Left\",\n    {\n      \"n\": true\n    },\n    \"Down\",\n    \"Right\"\n  ]\n]\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_alpha_1/layout.json",
    "content": "{\n  \"K00\": [\n    0,\n    0\n  ],\n  \"K01\": [\n    0,\n    1\n  ],\n  \"K02\": [\n    0,\n    2\n  ],\n  \"K03\": [\n    0,\n    3\n  ],\n  \"K04\": [\n    0,\n    4\n  ],\n  \"K05\": [\n    0,\n    5\n  ],\n  \"K06\": [\n    0,\n    6\n  ],\n  \"K07\": [\n    0,\n    7\n  ],\n  \"K08\": [\n    0,\n    8\n  ],\n  \"K09\": [\n    0,\n    9\n  ],\n  \"K0A\": [\n    0,\n    10\n  ],\n  \"K0B\": [\n    0,\n    11\n  ],\n  \"K0C\": [\n    0,\n    12\n  ],\n  \"K0D\": [\n    0,\n    13\n  ],\n  \"K10\": [\n    1,\n    0\n  ],\n  \"K11\": [\n    1,\n    1\n  ],\n  \"K12\": [\n    1,\n    2\n  ],\n  \"K13\": [\n    1,\n    3\n  ],\n  \"K14\": [\n    1,\n    4\n  ],\n  \"K15\": [\n    1,\n    5\n  ],\n  \"K16\": [\n    1,\n    6\n  ],\n  \"K17\": [\n    1,\n    7\n  ],\n  \"K18\": [\n    1,\n    8\n  ],\n  \"K19\": [\n    1,\n    9\n  ],\n  \"K1A\": [\n    1,\n    10\n  ],\n  \"K1B\": [\n    1,\n    11\n  ],\n  \"K1C\": [\n    1,\n    12\n  ],\n  \"K1D\": [\n    1,\n    13\n  ],\n  \"K20\": [\n    2,\n    0\n  ],\n  \"K21\": [\n    2,\n    1\n  ],\n  \"K22\": [\n    2,\n    2\n  ],\n  \"K23\": [\n    2,\n    3\n  ],\n  \"K24\": [\n    2,\n    4\n  ],\n  \"K25\": [\n    2,\n    5\n  ],\n  \"K26\": [\n    2,\n    6\n  ],\n  \"K27\": [\n    2,\n    7\n  ],\n  \"K28\": [\n    2,\n    8\n  ],\n  \"K29\": [\n    2,\n    9\n  ],\n  \"K2A\": [\n    2,\n    10\n  ],\n  \"K2B\": [\n    2,\n    11\n  ],\n  \"K2C\": [\n    2,\n    12\n  ],\n  \"K2D\": [\n    2,\n    13\n  ],\n  \"K30\": [\n    3,\n    0\n  ],\n  \"K31\": [\n    3,\n    1\n  ],\n  \"K32\": [\n    3,\n    2\n  ],\n  \"K33\": [\n    3,\n    3\n  ],\n  \"K34\": [\n    3,\n    4\n  ],\n  \"K35\": [\n    3,\n    5\n  ],\n  \"K36\": [\n    3,\n    6\n  ],\n  \"K37\": [\n    3,\n    7\n  ],\n  \"K38\": [\n    3,\n    8\n  ],\n  \"K39\": [\n    3,\n    9\n  ],\n  \"K3A\": [\n    3,\n    10\n  ],\n  \"K3B\": [\n    3,\n    11\n  ],\n  \"K3C\": [\n    3,\n    12\n  ],\n  \"K40\": [\n    4,\n    0\n  ],\n  \"K41\": [\n    4,\n    1\n  ],\n  \"K42\": [\n    4,\n    2\n  ],\n  \"K43\": [\n    4,\n    3\n  ],\n  \"K44\": [\n    4,\n    4\n  ],\n  \"K45\": [\n    4,\n    5\n  ],\n  \"K46\": [\n    4,\n    6\n  ],\n  \"K47\": [\n    4,\n    7\n  ],\n  \"K48\": [\n    4,\n    8\n  ],\n  \"K49\": [\n    4,\n    9\n  ],\n  \"K4A\": [\n    4,\n    10\n  ],\n  \"K4B\": [\n    4,\n    11\n  ],\n  \"K4C\": [\n    4,\n    12\n  ],\n  \"K50\": [\n    5,\n    0\n  ],\n  \"K51\": [\n    5,\n    1\n  ],\n  \"K52\": [\n    5,\n    2\n  ],\n  \"K53\": [\n    5,\n    3\n  ],\n  \"K54\": [\n    5,\n    4\n  ],\n  \"K55\": [\n    5,\n    6\n  ],\n  \"K56\": [\n    5,\n    7\n  ],\n  \"K57\": [\n    5,\n    8\n  ],\n  \"K58\": [\n    5,\n    9\n  ],\n  \"K59\": [\n    5,\n    10\n  ],\n  \"K5A\": [\n    5,\n    11\n  ],\n  \"K5B\": [\n    5,\n    12\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_alpha_1/leds.json",
    "content": "{}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_alpha_1/physical.json",
    "content": "[\n  {\n    \"name\": \"System76 Launch Configurable Keyboard Alpha 1\",\n    \"author\": \"Jeremy Soller\",\n    \"switchMount\": \"cherry\",\n    \"switchBrand\": \"kailh\",\n    \"plate\": true\n  },\n  [\n    {\n      \"c\": \"#755841\",\n      \"a\": 7\n    },\n    \"Esc\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"F1\",\n    \"F2\",\n    \"F3\",\n    \"F4\",\n    \"F5\",\n    \"F6\",\n    \"F7\",\n    \"F8\",\n    \"F9\",\n    \"F10\",\n    \"F11\",\n    \"F12\",\n    {\n      \"w\": 1.5\n    },\n    \"Del\"\n  ],\n  [\n    {\n      \"c\": \"#ffe8d6\",\n      \"a\": 5\n    },\n    \"~\\n`\",\n    \"!\\n1\",\n    \"@\\n2\",\n    \"#\\n3\",\n    \"$\\n4\",\n    \"%\\n5\",\n    \"^\\n6\",\n    \"&\\n7\",\n    \"*\\n8\",\n    \"(\\n9\",\n    \")\\n0\",\n    \"_\\n-\",\n    \"+\\n=\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Bksp\"\n  ],\n  [\n    {\n      \"w\": 1.5\n    },\n    \"Tab\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Q\",\n    \"W\",\n    \"E\",\n    \"R\",\n    \"T\",\n    \"Y\",\n    \"U\",\n    \"I\",\n    \"O\",\n    \"P\",\n    {\n      \"a\": 5\n    },\n    \"{\\n[\",\n    \"}\\n]\",\n    \"|\\n\\\\\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Caps\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"A\",\n    \"S\",\n    \"D\",\n    {\n      \"n\": true\n    },\n    \"F\",\n    \"G\",\n    \"H\",\n    {\n      \"n\": true\n    },\n    \"J\",\n    \"K\",\n    \"L\",\n    {\n      \"a\": 5\n    },\n    \":\\n;\",\n    \"\\\"\\n'\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Enter\"\n  ],\n  [\n    {\n      \"x\": 0.75,\n      \"w\": 1.5\n    },\n    \"Shift\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Z\",\n    \"X\",\n    \"C\",\n    \"V\",\n    \"B\",\n    \"N\",\n    \"M\",\n    {\n      \"a\": 5\n    },\n    \"<\\n,\",\n    \">\\n.\",\n    \"?\\n/\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7\n    },\n    \"Shift\",\n    {\n      \"c\": \"#755841\"\n    },\n    \"Up\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"w\": 1.5\n    },\n    \"Ctrl\",\n    \"Alt\",\n    \"Fn\",\n    \"Super\",\n    {\n      \"c\": \"#ffe8d6\",\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"Ctrl\",\n    \"Alt\",\n    {\n      \"w\": 1.5\n    },\n    \"Fn\",\n    {\n      \"c\": \"#755841\"\n    },\n    \"Left\",\n    {\n      \"n\": true\n    },\n    \"Down\",\n    \"Right\"\n  ]\n]"
  },
  {
    "path": "layouts/keyboards/system76/launch_alpha_2/layout.json",
    "content": "{\n  \"K00\": [\n    0,\n    0\n  ],\n  \"K01\": [\n    0,\n    1\n  ],\n  \"K02\": [\n    0,\n    2\n  ],\n  \"K03\": [\n    0,\n    3\n  ],\n  \"K04\": [\n    0,\n    4\n  ],\n  \"K05\": [\n    0,\n    5\n  ],\n  \"K06\": [\n    0,\n    6\n  ],\n  \"K07\": [\n    0,\n    7\n  ],\n  \"K08\": [\n    0,\n    8\n  ],\n  \"K09\": [\n    0,\n    9\n  ],\n  \"K0A\": [\n    0,\n    10\n  ],\n  \"K0B\": [\n    0,\n    11\n  ],\n  \"K0C\": [\n    0,\n    12\n  ],\n  \"K0D\": [\n    0,\n    13\n  ],\n  \"K0E\": [\n    0,\n    14\n  ],\n  \"K10\": [\n    1,\n    0\n  ],\n  \"K11\": [\n    1,\n    1\n  ],\n  \"K12\": [\n    1,\n    2\n  ],\n  \"K13\": [\n    1,\n    3\n  ],\n  \"K14\": [\n    1,\n    4\n  ],\n  \"K15\": [\n    1,\n    5\n  ],\n  \"K16\": [\n    1,\n    6\n  ],\n  \"K17\": [\n    1,\n    7\n  ],\n  \"K18\": [\n    1,\n    8\n  ],\n  \"K19\": [\n    1,\n    9\n  ],\n  \"K1A\": [\n    1,\n    10\n  ],\n  \"K1B\": [\n    1,\n    11\n  ],\n  \"K1C\": [\n    1,\n    12\n  ],\n  \"K1D\": [\n    1,\n    13\n  ],\n  \"K1E\": [\n    1,\n    14\n  ],\n  \"K20\": [\n    2,\n    0\n  ],\n  \"K21\": [\n    2,\n    1\n  ],\n  \"K22\": [\n    2,\n    2\n  ],\n  \"K23\": [\n    2,\n    3\n  ],\n  \"K24\": [\n    2,\n    4\n  ],\n  \"K25\": [\n    2,\n    5\n  ],\n  \"K26\": [\n    2,\n    6\n  ],\n  \"K27\": [\n    2,\n    7\n  ],\n  \"K28\": [\n    2,\n    8\n  ],\n  \"K29\": [\n    2,\n    9\n  ],\n  \"K2A\": [\n    2,\n    10\n  ],\n  \"K2B\": [\n    2,\n    11\n  ],\n  \"K2C\": [\n    2,\n    12\n  ],\n  \"K2D\": [\n    2,\n    13\n  ],\n  \"K2E\": [\n    2,\n    14\n  ],\n  \"K30\": [\n    3,\n    0\n  ],\n  \"K31\": [\n    3,\n    1\n  ],\n  \"K32\": [\n    3,\n    2\n  ],\n  \"K33\": [\n    3,\n    3\n  ],\n  \"K34\": [\n    3,\n    4\n  ],\n  \"K35\": [\n    3,\n    5\n  ],\n  \"K36\": [\n    3,\n    6\n  ],\n  \"K37\": [\n    3,\n    7\n  ],\n  \"K38\": [\n    3,\n    8\n  ],\n  \"K39\": [\n    3,\n    9\n  ],\n  \"K3A\": [\n    3,\n    10\n  ],\n  \"K3B\": [\n    3,\n    11\n  ],\n  \"K3C\": [\n    3,\n    12\n  ],\n  \"K3D\": [\n    3,\n    14\n  ],\n  \"K40\": [\n    4,\n    0\n  ],\n  \"K41\": [\n    4,\n    1\n  ],\n  \"K42\": [\n    4,\n    2\n  ],\n  \"K43\": [\n    4,\n    3\n  ],\n  \"K44\": [\n    4,\n    4\n  ],\n  \"K45\": [\n    4,\n    5\n  ],\n  \"K46\": [\n    4,\n    6\n  ],\n  \"K47\": [\n    4,\n    7\n  ],\n  \"K48\": [\n    4,\n    8\n  ],\n  \"K49\": [\n    4,\n    9\n  ],\n  \"K4A\": [\n    4,\n    10\n  ],\n  \"K4B\": [\n    4,\n    11\n  ],\n  \"K4C\": [\n    4,\n    12\n  ],\n  \"K50\": [\n    5,\n    0\n  ],\n  \"K51\": [\n    5,\n    1\n  ],\n  \"K52\": [\n    5,\n    2\n  ],\n  \"K53\": [\n    5,\n    3\n  ],\n  \"K54\": [\n    5,\n    4\n  ],\n  \"K55\": [\n    5,\n    6\n  ],\n  \"K56\": [\n    5,\n    7\n  ],\n  \"K57\": [\n    5,\n    8\n  ],\n  \"K58\": [\n    5,\n    9\n  ],\n  \"K59\": [\n    5,\n    10\n  ],\n  \"K5A\": [\n    5,\n    11\n  ],\n  \"K5B\": [\n    5,\n    12\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_alpha_2/leds.json",
    "content": "{}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_alpha_2/physical.json",
    "content": "[\n  {\n    \"name\": \"System76 Launch Configurable Keyboard Alpha 2\",\n    \"author\": \"Jeremy Soller\",\n    \"switchMount\": \"cherry\",\n    \"switchBrand\": \"kailh\",\n    \"plate\": true\n  },\n  [\n    {\n      \"c\": \"#755841\",\n      \"a\": 7\n    },\n    \"Esc\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"F1\",\n    \"F2\",\n    \"F3\",\n    \"F4\",\n    \"F5\",\n    \"F6\",\n    \"F7\",\n    \"F8\",\n    \"F9\",\n    \"F10\",\n    \"F11\",\n    \"F12\",\n    {\n      \"w\": 1.5\n    },\n    \"Del\",\n    {\n      \"x\": 0.25\n    },\n    \"Home\"\n  ],\n  [\n    {\n      \"c\": \"#ffe8d6\",\n      \"a\": 5\n    },\n    \"~\\n`\",\n    \"!\\n1\",\n    \"@\\n2\",\n    \"#\\n3\",\n    \"$\\n4\",\n    \"%\\n5\",\n    \"^\\n6\",\n    \"&\\n7\",\n    \"*\\n8\",\n    \"(\\n9\",\n    \")\\n0\",\n    \"_\\n-\",\n    \"+\\n=\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Bksp\",\n    {\n      \"x\": 0.25\n    },\n    \"PgUp\"\n  ],\n  [\n    {\n      \"w\": 1.5\n    },\n    \"Tab\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Q\",\n    \"W\",\n    \"E\",\n    \"R\",\n    \"T\",\n    \"Y\",\n    \"U\",\n    \"I\",\n    \"O\",\n    \"P\",\n    {\n      \"a\": 5\n    },\n    \"{\\n[\",\n    \"}\\n]\",\n    \"|\\n\\\\\",\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"a\": 7\n    },\n    \"PgDn\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"w\": 1.5\n    },\n    \"Caps\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"A\",\n    \"S\",\n    \"D\",\n    {\n      \"n\": true\n    },\n    \"F\",\n    \"G\",\n    \"H\",\n    {\n      \"n\": true\n    },\n    \"J\",\n    \"K\",\n    \"L\",\n    {\n      \"a\": 5\n    },\n    \":\\n;\",\n    \"\\\"\\n'\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Enter\",\n    {\n      \"x\": 0.5\n    },\n    \"End\"\n  ],\n  [\n    {\n      \"x\": 0.75,\n      \"w\": 1.5\n    },\n    \"Shift\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Z\",\n    \"X\",\n    \"C\",\n    \"V\",\n    \"B\",\n    \"N\",\n    \"M\",\n    {\n      \"a\": 5\n    },\n    \"<\\n,\",\n    \">\\n.\",\n    \"?\\n/\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Shift\",\n    {\n      \"c\": \"#755841\"\n    },\n    \"Up\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"w\": 1.5\n    },\n    \"Ctrl\",\n    \"Alt\",\n    \"Fn\",\n    \"Super\",\n    {\n      \"c\": \"#ffe8d6\",\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"Ctrl\",\n    \"Alt\",\n    {\n      \"w\": 1.5\n    },\n    \"Fn\",\n    {\n      \"x\": 0.5,\n      \"c\": \"#755841\"\n    },\n    \"Left\",\n    {\n      \"n\": true\n    },\n    \"Down\",\n    \"Right\"\n  ]\n]"
  },
  {
    "path": "layouts/keyboards/system76/launch_heavy_1/layout.json",
    "content": "{\n  \"K00\": [\n    0,\n    0\n  ],\n  \"K01\": [\n    0,\n    1\n  ],\n  \"K02\": [\n    0,\n    2\n  ],\n  \"K03\": [\n    0,\n    3\n  ],\n  \"K04\": [\n    0,\n    4\n  ],\n  \"K05\": [\n    0,\n    5\n  ],\n  \"K06\": [\n    0,\n    6\n  ],\n  \"K07\": [\n    0,\n    7\n  ],\n  \"K08\": [\n    0,\n    8\n  ],\n  \"K09\": [\n    0,\n    9\n  ],\n  \"K0A\": [\n    0,\n    10\n  ],\n  \"K0B\": [\n    0,\n    11\n  ],\n  \"K0C\": [\n    0,\n    12\n  ],\n  \"K0D\": [\n    0,\n    13\n  ],\n  \"K0E\": [\n    3,\n    13\n  ],\n  \"K0F\": [\n    6,\n    12\n  ],\n  \"K0G\": [\n    6,\n    5\n  ],\n  \"K0H\": [\n    6,\n    4\n  ],\n  \"K0I\": [\n    6,\n    3\n  ],\n  \"K10\": [\n    1,\n    0\n  ],\n  \"K11\": [\n    1,\n    1\n  ],\n  \"K12\": [\n    1,\n    2\n  ],\n  \"K13\": [\n    1,\n    3\n  ],\n  \"K14\": [\n    1,\n    4\n  ],\n  \"K15\": [\n    1,\n    5\n  ],\n  \"K16\": [\n    1,\n    6\n  ],\n  \"K17\": [\n    1,\n    7\n  ],\n  \"K18\": [\n    1,\n    8\n  ],\n  \"K19\": [\n    1,\n    9\n  ],\n  \"K1A\": [\n    1,\n    10\n  ],\n  \"K1B\": [\n    1,\n    11\n  ],\n  \"K1C\": [\n    1,\n    12\n  ],\n  \"K1D\": [\n    1,\n    13\n  ],\n  \"K1E\": [\n    4,\n    13\n  ],\n  \"K1F\": [\n    7,\n    12\n  ],\n  \"K1G\": [\n    7,\n    5\n  ],\n  \"K1H\": [\n    7,\n    4\n  ],\n  \"K1I\": [\n    7,\n    3\n  ],\n  \"K20\": [\n    2,\n    0\n  ],\n  \"K21\": [\n    2,\n    1\n  ],\n  \"K22\": [\n    2,\n    2\n  ],\n  \"K23\": [\n    2,\n    3\n  ],\n  \"K24\": [\n    2,\n    4\n  ],\n  \"K25\": [\n    2,\n    5\n  ],\n  \"K26\": [\n    2,\n    6\n  ],\n  \"K27\": [\n    2,\n    7\n  ],\n  \"K28\": [\n    2,\n    8\n  ],\n  \"K29\": [\n    2,\n    9\n  ],\n  \"K2A\": [\n    2,\n    10\n  ],\n  \"K2B\": [\n    2,\n    11\n  ],\n  \"K2C\": [\n    2,\n    12\n  ],\n  \"K2D\": [\n    2,\n    13\n  ],\n  \"K2E\": [\n    5,\n    13\n  ],\n  \"K2F\": [\n    8,\n    12\n  ],\n  \"K2G\": [\n    8,\n    5\n  ],\n  \"K2H\": [\n    8,\n    4\n  ],\n  \"K2I\": [\n    8,\n    3\n  ],\n  \"K30\": [\n    3,\n    0\n  ],\n  \"K31\": [\n    3,\n    1\n  ],\n  \"K32\": [\n    3,\n    2\n  ],\n  \"K33\": [\n    3,\n    3\n  ],\n  \"K34\": [\n    3,\n    4\n  ],\n  \"K35\": [\n    3,\n    5\n  ],\n  \"K36\": [\n    3,\n    6\n  ],\n  \"K37\": [\n    3,\n    7\n  ],\n  \"K38\": [\n    3,\n    8\n  ],\n  \"K39\": [\n    3,\n    9\n  ],\n  \"K3A\": [\n    3,\n    10\n  ],\n  \"K3B\": [\n    3,\n    11\n  ],\n  \"K3C\": [\n    3,\n    12\n  ],\n  \"K3D\": [\n    5,\n    5\n  ],\n  \"K3E\": [\n    9,\n    12\n  ],\n  \"K3F\": [\n    9,\n    5\n  ],\n  \"K3G\": [\n    9,\n    4\n  ],\n  \"K40\": [\n    4,\n    0\n  ],\n  \"K41\": [\n    4,\n    1\n  ],\n  \"K42\": [\n    4,\n    2\n  ],\n  \"K43\": [\n    4,\n    3\n  ],\n  \"K44\": [\n    4,\n    4\n  ],\n  \"K45\": [\n    4,\n    5\n  ],\n  \"K46\": [\n    4,\n    6\n  ],\n  \"K47\": [\n    4,\n    7\n  ],\n  \"K48\": [\n    4,\n    8\n  ],\n  \"K49\": [\n    4,\n    9\n  ],\n  \"K4A\": [\n    4,\n    10\n  ],\n  \"K4B\": [\n    4,\n    11\n  ],\n  \"K4C\": [\n    4,\n    12\n  ],\n  \"K4D\": [\n    10,\n    12\n  ],\n  \"K4E\": [\n    10,\n    5\n  ],\n  \"K4F\": [\n    10,\n    4\n  ],\n  \"K4G\": [\n    10,\n    3\n  ],\n  \"K50\": [\n    5,\n    0\n  ],\n  \"K51\": [\n    5,\n    1\n  ],\n  \"K52\": [\n    5,\n    2\n  ],\n  \"K53\": [\n    5,\n    3\n  ],\n  \"K54\": [\n    5,\n    4\n  ],\n  \"K55\": [\n    5,\n    6\n  ],\n  \"K56\": [\n    5,\n    7\n  ],\n  \"K57\": [\n    5,\n    8\n  ],\n  \"K58\": [\n    5,\n    9\n  ],\n  \"K59\": [\n    5,\n    10\n  ],\n  \"K5A\": [\n    5,\n    11\n  ],\n  \"K5B\": [\n    5,\n    12\n  ],\n  \"K5C\": [\n    11,\n    12\n  ],\n  \"K5D\": [\n    11,\n    4\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_heavy_1/leds.json",
    "content": "{\n  \"K00\": [\n    69\n  ],\n  \"K01\": [\n    70\n  ],\n  \"K02\": [\n    71\n  ],\n  \"K03\": [\n    72\n  ],\n  \"K04\": [\n    73\n  ],\n  \"K05\": [\n    74\n  ],\n  \"K06\": [\n    75\n  ],\n  \"K07\": [\n    76\n  ],\n  \"K08\": [\n    77\n  ],\n  \"K09\": [\n    78\n  ],\n  \"K0A\": [\n    79\n  ],\n  \"K0B\": [\n    80\n  ],\n  \"K0C\": [\n    81\n  ],\n  \"K0D\": [\n    82\n  ],\n  \"K0E\": [\n    83\n  ],\n  \"K0F\": [\n    101\n  ],\n  \"K0G\": [\n    102\n  ],\n  \"K0H\": [\n    103\n  ],\n  \"K0I\": [\n    104\n  ],\n  \"K10\": [\n    68\n  ],\n  \"K11\": [\n    67\n  ],\n  \"K12\": [\n    66\n  ],\n  \"K13\": [\n    65\n  ],\n  \"K14\": [\n    64\n  ],\n  \"K15\": [\n    63\n  ],\n  \"K16\": [\n    62\n  ],\n  \"K17\": [\n    61\n  ],\n  \"K18\": [\n    60\n  ],\n  \"K19\": [\n    59\n  ],\n  \"K1A\": [\n    58\n  ],\n  \"K1B\": [\n    57\n  ],\n  \"K1C\": [\n    56\n  ],\n  \"K1D\": [\n    55\n  ],\n  \"K1E\": [\n    54\n  ],\n  \"K1F\": [\n    100\n  ],\n  \"K1G\": [\n    99\n  ],\n  \"K1H\": [\n    98\n  ],\n  \"K1I\": [\n    97\n  ],\n  \"K20\": [\n    39\n  ],\n  \"K21\": [\n    40\n  ],\n  \"K22\": [\n    41\n  ],\n  \"K23\": [\n    42\n  ],\n  \"K24\": [\n    43\n  ],\n  \"K25\": [\n    44\n  ],\n  \"K26\": [\n    45\n  ],\n  \"K27\": [\n    46\n  ],\n  \"K28\": [\n    47\n  ],\n  \"K29\": [\n    48\n  ],\n  \"K2A\": [\n    49\n  ],\n  \"K2B\": [\n    50\n  ],\n  \"K2C\": [\n    51\n  ],\n  \"K2D\": [\n    52\n  ],\n  \"K2E\": [\n    53\n  ],\n  \"K2F\": [\n    93\n  ],\n  \"K2G\": [\n    94\n  ],\n  \"K2H\": [\n    95\n  ],\n  \"K2I\": [\n    96\n  ],\n  \"K30\": [\n    38\n  ],\n  \"K31\": [\n    37\n  ],\n  \"K32\": [\n    36\n  ],\n  \"K33\": [\n    35\n  ],\n  \"K34\": [\n    34\n  ],\n  \"K35\": [\n    33\n  ],\n  \"K36\": [\n    32\n  ],\n  \"K37\": [\n    31\n  ],\n  \"K38\": [\n    30\n  ],\n  \"K39\": [\n    29\n  ],\n  \"K3A\": [\n    28\n  ],\n  \"K3B\": [\n    27\n  ],\n  \"K3C\": [\n    26\n  ],\n  \"K3D\": [\n    25\n  ],\n  \"K3E\": [\n    92\n  ],\n  \"K3F\": [\n    91\n  ],\n  \"K3G\": [\n    90\n  ],\n  \"K40\": [\n    12\n  ],\n  \"K41\": [\n    11\n  ],\n  \"K42\": [\n    10\n  ],\n  \"K43\": [\n    9\n  ],\n  \"K44\": [\n    8\n  ],\n  \"K45\": [\n    7\n  ],\n  \"K46\": [\n    6\n  ],\n  \"K47\": [\n    5\n  ],\n  \"K48\": [\n    4\n  ],\n  \"K49\": [\n    3\n  ],\n  \"K4A\": [\n    2\n  ],\n  \"K4B\": [\n    1\n  ],\n  \"K4C\": [\n    0\n  ],\n  \"K4D\": [\n    87\n  ],\n  \"K4E\": [\n    88\n  ],\n  \"K4F\": [\n    89\n  ],\n  \"K4G\": [\n    84\n  ],\n  \"K50\": [\n    13\n  ],\n  \"K51\": [\n    14\n  ],\n  \"K52\": [\n    15\n  ],\n  \"K53\": [\n    16\n  ],\n  \"K54\": [\n    17\n  ],\n  \"K55\": [\n    18\n  ],\n  \"K56\": [\n    19\n  ],\n  \"K57\": [\n    20\n  ],\n  \"K58\": [\n    21\n  ],\n  \"K59\": [\n    22\n  ],\n  \"K5A\": [\n    23\n  ],\n  \"K5B\": [\n    24\n  ],\n  \"K5C\": [\n    86\n  ],\n  \"K5D\": [\n    85\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_heavy_1/physical.json",
    "content": "[\n  {\n    \"backcolor\": \"#373737\",\n    \"name\": \"Launch Heavy\",\n    \"author\": \"Levi\",\n    \"radii\": \"24px\"\n  },\n  [\n    {\n      \"y\": 0.5,\n      \"c\": \"#755841\",\n      \"a\": 7\n    },\n    \"Esc\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"F1\",\n    \"F2\",\n    \"F3\",\n    \"F4\",\n    \"F5\",\n    \"F6\",\n    \"F7\",\n    \"F8\",\n    \"F9\",\n    \"F10\",\n    \"F11\",\n    \"F12\",\n    {\n      \"w\": 1.5\n    },\n    \"Del\",\n    {\n      \"x\": 0.25\n    },\n    \"Home\",\n    {\n      \"x\": 0.25\n    },\n    \"Print Screen\",\n    \"<i class='fa fa-step-backward'></i>\",\n    \"<i class='fa fa-play'></i> / <i class='fa fa-pause'></i>\",\n    \"<i class='fa fa-step-forward'></i>\"\n  ],\n  [\n    {\n      \"c\": \"#ffe8d6\",\n      \"a\": 5\n    },\n    \"~\\n`\",\n    \"!\\n1\",\n    \"@\\n2\",\n    \"#\\n3\",\n    \"$\\n4\",\n    \"%\\n5\",\n    \"^\\n6\",\n    \"&\\n7\",\n    \"*\\n8\",\n    \"(\\n9\",\n    \")\\n0\",\n    \"_\\n-\",\n    \"+\\n=\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Bksp\",\n    {\n      \"x\": 0.25\n    },\n    \"PgUp\",\n    {\n      \"x\": 0.25\n    },\n    \"Num Lock\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"/\",\n    \"*\",\n    \"-\"\n  ],\n  [\n    {\n      \"c\": \"#636363\",\n      \"w\": 1.5\n    },\n    \"Tab\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Q\",\n    \"W\",\n    \"E\",\n    \"R\",\n    \"T\",\n    \"Y\",\n    \"U\",\n    \"I\",\n    \"O\",\n    \"P\",\n    {\n      \"a\": 5\n    },\n    \"{\\n[\",\n    \"}\\n]\",\n    \"|\\n\\\\\",\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"a\": 7\n    },\n    \"PgDn\",\n    {\n      \"x\": 0.25,\n      \"c\": \"#ffe8d6\",\n      \"a\": 5\n    },\n    \"7\\nHome\",\n    \"8\\n↑\",\n    \"9\\nPgUp\",\n    {\n      \"a\": 7,\n      \"h\": 2\n    },\n    \"+\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"w\": 1.5\n    },\n    \"Caps\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"A\",\n    \"S\",\n    \"D\",\n    {\n      \"n\": true\n    },\n    \"F\",\n    \"G\",\n    \"H\",\n    {\n      \"n\": true\n    },\n    \"J\",\n    \"K\",\n    \"L\",\n    {\n      \"a\": 5\n    },\n    \":\\n;\",\n    \"\\\"\\n'\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Enter\",\n    {\n      \"x\": 0.5\n    },\n    \"End\",\n    {\n      \"x\": 0.25,\n      \"c\": \"#ffe8d6\",\n      \"a\": 5\n    },\n    \"4\\n←\",\n    {\n      \"n\": true\n    },\n    \"5\",\n    \"6\\n→\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 2\n    },\n    \"Shift\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Z\",\n    \"X\",\n    \"C\",\n    \"V\",\n    \"B\",\n    \"N\",\n    \"M\",\n    {\n      \"a\": 5\n    },\n    \"<\\n,\",\n    \">\\n.\",\n    \"?\\n/\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Shift\",\n    {\n      \"c\": \"#755841\"\n    },\n    \"Up\",\n    {\n      \"x\": 1.25,\n      \"c\": \"#ffe8d6\",\n      \"a\": 5\n    },\n    \"1\\nEnd\",\n    \"2\\n↓\",\n    \"3\\nPgDn\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"h\": 2\n    },\n    \"Enter\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"w\": 1.5\n    },\n    \"Ctrl\",\n    \"Alt\",\n    \"Fn\",\n    \"Super\",\n    {\n      \"c\": \"#ffe8d6\",\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"Ctrl\",\n    \"Alt\",\n    {\n      \"w\": 1.5\n    },\n    \"Fn\",\n    {\n      \"x\": 0.5,\n      \"c\": \"#755841\"\n    },\n    \"Left\",\n    {\n      \"n\": true\n    },\n    \"Down\",\n    \"Right\",\n    {\n      \"x\": 0.25,\n      \"c\": \"#ffe8d6\",\n      \"a\": 5,\n      \"w\": 2\n    },\n    \"0\\nIns\",\n    \".\\nDel\"\n  ]\n]"
  },
  {
    "path": "layouts/keyboards/system76/launch_heavy_3/layout.json",
    "content": "{\n  \"K00\": [\n    0,\n    0\n  ],\n  \"K01\": [\n    0,\n    1\n  ],\n  \"K02\": [\n    0,\n    2\n  ],\n  \"K03\": [\n    0,\n    3\n  ],\n  \"K04\": [\n    0,\n    4\n  ],\n  \"K05\": [\n    0,\n    5\n  ],\n  \"K06\": [\n    0,\n    6\n  ],\n  \"K07\": [\n    0,\n    7\n  ],\n  \"K08\": [\n    0,\n    8\n  ],\n  \"K09\": [\n    0,\n    9\n  ],\n  \"K0A\": [\n    0,\n    10\n  ],\n  \"K0B\": [\n    0,\n    11\n  ],\n  \"K0C\": [\n    0,\n    12\n  ],\n  \"K0D\": [\n    0,\n    13\n  ],\n  \"K0E\": [\n    3,\n    13\n  ],\n  \"K0F\": [\n    6,\n    12\n  ],\n  \"K0G\": [\n    6,\n    5\n  ],\n  \"K0H\": [\n    6,\n    4\n  ],\n  \"K0I\": [\n    6,\n    3\n  ],\n  \"K10\": [\n    1,\n    0\n  ],\n  \"K11\": [\n    1,\n    1\n  ],\n  \"K12\": [\n    1,\n    2\n  ],\n  \"K13\": [\n    1,\n    3\n  ],\n  \"K14\": [\n    1,\n    4\n  ],\n  \"K15\": [\n    1,\n    5\n  ],\n  \"K16\": [\n    1,\n    6\n  ],\n  \"K17\": [\n    1,\n    7\n  ],\n  \"K18\": [\n    1,\n    8\n  ],\n  \"K19\": [\n    1,\n    9\n  ],\n  \"K1A\": [\n    1,\n    10\n  ],\n  \"K1B\": [\n    1,\n    11\n  ],\n  \"K1C\": [\n    1,\n    12\n  ],\n  \"K1D\": [\n    1,\n    13\n  ],\n  \"K1E\": [\n    4,\n    13\n  ],\n  \"K1F\": [\n    7,\n    12\n  ],\n  \"K1G\": [\n    7,\n    5\n  ],\n  \"K1H\": [\n    7,\n    4\n  ],\n  \"K1I\": [\n    7,\n    3\n  ],\n  \"K20\": [\n    2,\n    0\n  ],\n  \"K21\": [\n    2,\n    1\n  ],\n  \"K22\": [\n    2,\n    2\n  ],\n  \"K23\": [\n    2,\n    3\n  ],\n  \"K24\": [\n    2,\n    4\n  ],\n  \"K25\": [\n    2,\n    5\n  ],\n  \"K26\": [\n    2,\n    6\n  ],\n  \"K27\": [\n    2,\n    7\n  ],\n  \"K28\": [\n    2,\n    8\n  ],\n  \"K29\": [\n    2,\n    9\n  ],\n  \"K2A\": [\n    2,\n    10\n  ],\n  \"K2B\": [\n    2,\n    11\n  ],\n  \"K2C\": [\n    2,\n    12\n  ],\n  \"K2D\": [\n    2,\n    13\n  ],\n  \"K2E\": [\n    5,\n    13\n  ],\n  \"K2F\": [\n    8,\n    12\n  ],\n  \"K2G\": [\n    8,\n    5\n  ],\n  \"K2H\": [\n    8,\n    4\n  ],\n  \"K2I\": [\n    8,\n    3\n  ],\n  \"K30\": [\n    3,\n    0\n  ],\n  \"K31\": [\n    3,\n    1\n  ],\n  \"K32\": [\n    3,\n    2\n  ],\n  \"K33\": [\n    3,\n    3\n  ],\n  \"K34\": [\n    3,\n    4\n  ],\n  \"K35\": [\n    3,\n    5\n  ],\n  \"K36\": [\n    3,\n    6\n  ],\n  \"K37\": [\n    3,\n    7\n  ],\n  \"K38\": [\n    3,\n    8\n  ],\n  \"K39\": [\n    3,\n    9\n  ],\n  \"K3A\": [\n    3,\n    10\n  ],\n  \"K3B\": [\n    3,\n    11\n  ],\n  \"K3C\": [\n    3,\n    12\n  ],\n  \"K3D\": [\n    5,\n    5\n  ],\n  \"K3E\": [\n    9,\n    12\n  ],\n  \"K3F\": [\n    9,\n    5\n  ],\n  \"K3G\": [\n    9,\n    4\n  ],\n  \"K40\": [\n    4,\n    0\n  ],\n  \"K41\": [\n    4,\n    1\n  ],\n  \"K42\": [\n    4,\n    2\n  ],\n  \"K43\": [\n    4,\n    3\n  ],\n  \"K44\": [\n    4,\n    4\n  ],\n  \"K45\": [\n    4,\n    5\n  ],\n  \"K46\": [\n    4,\n    6\n  ],\n  \"K47\": [\n    4,\n    7\n  ],\n  \"K48\": [\n    4,\n    8\n  ],\n  \"K49\": [\n    4,\n    9\n  ],\n  \"K4A\": [\n    4,\n    10\n  ],\n  \"K4B\": [\n    4,\n    11\n  ],\n  \"K4C\": [\n    4,\n    12\n  ],\n  \"K4D\": [\n    10,\n    12\n  ],\n  \"K4E\": [\n    10,\n    5\n  ],\n  \"K4F\": [\n    10,\n    4\n  ],\n  \"K4G\": [\n    10,\n    3\n  ],\n  \"K50\": [\n    5,\n    0\n  ],\n  \"K51\": [\n    5,\n    1\n  ],\n  \"K52\": [\n    5,\n    2\n  ],\n  \"K53\": [\n    5,\n    3\n  ],\n  \"K54\": [\n    5,\n    4\n  ],\n  \"K55\": [\n    5,\n    6\n  ],\n  \"K56\": [\n    5,\n    7\n  ],\n  \"K57\": [\n    5,\n    8\n  ],\n  \"K58\": [\n    5,\n    9\n  ],\n  \"K59\": [\n    5,\n    10\n  ],\n  \"K5A\": [\n    5,\n    11\n  ],\n  \"K5B\": [\n    5,\n    12\n  ],\n  \"K5C\": [\n    11,\n    12\n  ],\n  \"K5D\": [\n    11,\n    4\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_heavy_3/leds.json",
    "content": "{\n  \"K00\": [\n    69\n  ],\n  \"K01\": [\n    70\n  ],\n  \"K02\": [\n    71\n  ],\n  \"K03\": [\n    72\n  ],\n  \"K04\": [\n    73\n  ],\n  \"K05\": [\n    74\n  ],\n  \"K06\": [\n    75\n  ],\n  \"K07\": [\n    76\n  ],\n  \"K08\": [\n    77\n  ],\n  \"K09\": [\n    78\n  ],\n  \"K0A\": [\n    79\n  ],\n  \"K0B\": [\n    80\n  ],\n  \"K0C\": [\n    81\n  ],\n  \"K0D\": [\n    82\n  ],\n  \"K0E\": [\n    83\n  ],\n  \"K0F\": [\n    101\n  ],\n  \"K0G\": [\n    102\n  ],\n  \"K0H\": [\n    103\n  ],\n  \"K0I\": [\n    104\n  ],\n  \"K10\": [\n    68\n  ],\n  \"K11\": [\n    67\n  ],\n  \"K12\": [\n    66\n  ],\n  \"K13\": [\n    65\n  ],\n  \"K14\": [\n    64\n  ],\n  \"K15\": [\n    63\n  ],\n  \"K16\": [\n    62\n  ],\n  \"K17\": [\n    61\n  ],\n  \"K18\": [\n    60\n  ],\n  \"K19\": [\n    59\n  ],\n  \"K1A\": [\n    58\n  ],\n  \"K1B\": [\n    57\n  ],\n  \"K1C\": [\n    56\n  ],\n  \"K1D\": [\n    55\n  ],\n  \"K1E\": [\n    54\n  ],\n  \"K1F\": [\n    100\n  ],\n  \"K1G\": [\n    99\n  ],\n  \"K1H\": [\n    98\n  ],\n  \"K1I\": [\n    97\n  ],\n  \"K20\": [\n    39\n  ],\n  \"K21\": [\n    40\n  ],\n  \"K22\": [\n    41\n  ],\n  \"K23\": [\n    42\n  ],\n  \"K24\": [\n    43\n  ],\n  \"K25\": [\n    44\n  ],\n  \"K26\": [\n    45\n  ],\n  \"K27\": [\n    46\n  ],\n  \"K28\": [\n    47\n  ],\n  \"K29\": [\n    48\n  ],\n  \"K2A\": [\n    49\n  ],\n  \"K2B\": [\n    50\n  ],\n  \"K2C\": [\n    51\n  ],\n  \"K2D\": [\n    52\n  ],\n  \"K2E\": [\n    53\n  ],\n  \"K2F\": [\n    93\n  ],\n  \"K2G\": [\n    94\n  ],\n  \"K2H\": [\n    95\n  ],\n  \"K2I\": [\n    96\n  ],\n  \"K30\": [\n    38\n  ],\n  \"K31\": [\n    37\n  ],\n  \"K32\": [\n    36\n  ],\n  \"K33\": [\n    35\n  ],\n  \"K34\": [\n    34\n  ],\n  \"K35\": [\n    33\n  ],\n  \"K36\": [\n    32\n  ],\n  \"K37\": [\n    31\n  ],\n  \"K38\": [\n    30\n  ],\n  \"K39\": [\n    29\n  ],\n  \"K3A\": [\n    28\n  ],\n  \"K3B\": [\n    27\n  ],\n  \"K3C\": [\n    26\n  ],\n  \"K3D\": [\n    25\n  ],\n  \"K3E\": [\n    92\n  ],\n  \"K3F\": [\n    91\n  ],\n  \"K3G\": [\n    90\n  ],\n  \"K40\": [\n    12\n  ],\n  \"K41\": [\n    11\n  ],\n  \"K42\": [\n    10\n  ],\n  \"K43\": [\n    9\n  ],\n  \"K44\": [\n    8\n  ],\n  \"K45\": [\n    7\n  ],\n  \"K46\": [\n    6\n  ],\n  \"K47\": [\n    5\n  ],\n  \"K48\": [\n    4\n  ],\n  \"K49\": [\n    3\n  ],\n  \"K4A\": [\n    2\n  ],\n  \"K4B\": [\n    1\n  ],\n  \"K4C\": [\n    0\n  ],\n  \"K4D\": [\n    87\n  ],\n  \"K4E\": [\n    88\n  ],\n  \"K4F\": [\n    89\n  ],\n  \"K4G\": [\n    84\n  ],\n  \"K50\": [\n    13\n  ],\n  \"K51\": [\n    14\n  ],\n  \"K52\": [\n    15\n  ],\n  \"K53\": [\n    16\n  ],\n  \"K54\": [\n    17\n  ],\n  \"K55\": [\n    18\n  ],\n  \"K56\": [\n    19\n  ],\n  \"K57\": [\n    20\n  ],\n  \"K58\": [\n    21\n  ],\n  \"K59\": [\n    22\n  ],\n  \"K5A\": [\n    23\n  ],\n  \"K5B\": [\n    24\n  ],\n  \"K5C\": [\n    86\n  ],\n  \"K5D\": [\n    85\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_heavy_3/physical.json",
    "content": "[\n  {\n    \"backcolor\": \"#373737\",\n    \"name\": \"Launch Heavy\",\n    \"author\": \"Levi\",\n    \"radii\": \"24px\"\n  },\n  [\n    {\n      \"y\": 0.5,\n      \"c\": \"#755841\",\n      \"a\": 7\n    },\n    \"Esc\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"F1\",\n    \"F2\",\n    \"F3\",\n    \"F4\",\n    \"F5\",\n    \"F6\",\n    \"F7\",\n    \"F8\",\n    \"F9\",\n    \"F10\",\n    \"F11\",\n    \"F12\",\n    {\n      \"w\": 1.5\n    },\n    \"Del\",\n    {\n      \"x\": 0.25\n    },\n    \"Home\",\n    {\n      \"x\": 0.25\n    },\n    \"Print Screen\",\n    \"<i class='fa fa-step-backward'></i>\",\n    \"<i class='fa fa-play'></i> / <i class='fa fa-pause'></i>\",\n    \"<i class='fa fa-step-forward'></i>\"\n  ],\n  [\n    {\n      \"c\": \"#ffe8d6\",\n      \"a\": 5\n    },\n    \"~\\n`\",\n    \"!\\n1\",\n    \"@\\n2\",\n    \"#\\n3\",\n    \"$\\n4\",\n    \"%\\n5\",\n    \"^\\n6\",\n    \"&\\n7\",\n    \"*\\n8\",\n    \"(\\n9\",\n    \")\\n0\",\n    \"_\\n-\",\n    \"+\\n=\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Bksp\",\n    {\n      \"x\": 0.25\n    },\n    \"PgUp\",\n    {\n      \"x\": 0.25\n    },\n    \"Num Lock\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"/\",\n    \"*\",\n    \"-\"\n  ],\n  [\n    {\n      \"c\": \"#636363\",\n      \"w\": 1.5\n    },\n    \"Tab\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Q\",\n    \"W\",\n    \"E\",\n    \"R\",\n    \"T\",\n    \"Y\",\n    \"U\",\n    \"I\",\n    \"O\",\n    \"P\",\n    {\n      \"a\": 5\n    },\n    \"{\\n[\",\n    \"}\\n]\",\n    \"|\\n\\\\\",\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"a\": 7\n    },\n    \"PgDn\",\n    {\n      \"x\": 0.25,\n      \"c\": \"#ffe8d6\",\n      \"a\": 5\n    },\n    \"7\\nHome\",\n    \"8\\n↑\",\n    \"9\\nPgUp\",\n    {\n      \"a\": 7,\n      \"h\": 2\n    },\n    \"+\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"w\": 1.5\n    },\n    \"Caps\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"A\",\n    \"S\",\n    \"D\",\n    {\n      \"n\": true\n    },\n    \"F\",\n    \"G\",\n    \"H\",\n    {\n      \"n\": true\n    },\n    \"J\",\n    \"K\",\n    \"L\",\n    {\n      \"a\": 5\n    },\n    \":\\n;\",\n    \"\\\"\\n'\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Enter\",\n    {\n      \"x\": 0.5\n    },\n    \"End\",\n    {\n      \"x\": 0.25,\n      \"c\": \"#ffe8d6\",\n      \"a\": 5\n    },\n    \"4\\n←\",\n    {\n      \"n\": true\n    },\n    \"5\",\n    \"6\\n→\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 2\n    },\n    \"Shift\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Z\",\n    \"X\",\n    \"C\",\n    \"V\",\n    \"B\",\n    \"N\",\n    \"M\",\n    {\n      \"a\": 5\n    },\n    \"<\\n,\",\n    \">\\n.\",\n    \"?\\n/\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Shift\",\n    {\n      \"c\": \"#755841\"\n    },\n    \"Up\",\n    {\n      \"x\": 1.25,\n      \"c\": \"#ffe8d6\",\n      \"a\": 5\n    },\n    \"1\\nEnd\",\n    \"2\\n↓\",\n    \"3\\nPgDn\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"h\": 2\n    },\n    \"Enter\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"w\": 1.5\n    },\n    \"Ctrl\",\n    \"Alt\",\n    \"Fn\",\n    \"Super\",\n    {\n      \"c\": \"#ffe8d6\",\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"Ctrl\",\n    \"Alt\",\n    {\n      \"w\": 1.5\n    },\n    \"Fn\",\n    {\n      \"x\": 0.5,\n      \"c\": \"#755841\"\n    },\n    \"Left\",\n    {\n      \"n\": true\n    },\n    \"Down\",\n    \"Right\",\n    {\n      \"x\": 0.25,\n      \"c\": \"#ffe8d6\",\n      \"a\": 5,\n      \"w\": 2\n    },\n    \"0\\nIns\",\n    \".\\nDel\"\n  ]\n]"
  },
  {
    "path": "layouts/keyboards/system76/launch_lite_1/layout.json",
    "content": "{\n  \"K00\": [\n    0,\n    0\n  ],\n  \"K01\": [\n    0,\n    1\n  ],\n  \"K02\": [\n    0,\n    2\n  ],\n  \"K03\": [\n    0,\n    3\n  ],\n  \"K04\": [\n    0,\n    4\n  ],\n  \"K05\": [\n    0,\n    5\n  ],\n  \"K06\": [\n    0,\n    6\n  ],\n  \"K07\": [\n    0,\n    7\n  ],\n  \"K08\": [\n    0,\n    8\n  ],\n  \"K09\": [\n    0,\n    9\n  ],\n  \"K0A\": [\n    0,\n    10\n  ],\n  \"K0B\": [\n    0,\n    11\n  ],\n  \"K0C\": [\n    0,\n    12\n  ],\n  \"K0D\": [\n    0,\n    13\n  ],\n  \"K0E\": [\n    2,\n    13\n  ],\n  \"K10\": [\n    1,\n    0\n  ],\n  \"K11\": [\n    1,\n    1\n  ],\n  \"K12\": [\n    1,\n    2\n  ],\n  \"K13\": [\n    1,\n    3\n  ],\n  \"K14\": [\n    1,\n    4\n  ],\n  \"K15\": [\n    1,\n    5\n  ],\n  \"K16\": [\n    1,\n    6\n  ],\n  \"K17\": [\n    1,\n    7\n  ],\n  \"K18\": [\n    1,\n    8\n  ],\n  \"K19\": [\n    1,\n    9\n  ],\n  \"K1A\": [\n    1,\n    10\n  ],\n  \"K1B\": [\n    1,\n    11\n  ],\n  \"K1C\": [\n    1,\n    12\n  ],\n  \"K1D\": [\n    1,\n    13\n  ],\n  \"K1E\": [\n    3,\n    13\n  ],\n  \"K20\": [\n    2,\n    0\n  ],\n  \"K21\": [\n    2,\n    1\n  ],\n  \"K22\": [\n    2,\n    2\n  ],\n  \"K23\": [\n    2,\n    3\n  ],\n  \"K24\": [\n    2,\n    4\n  ],\n  \"K25\": [\n    2,\n    5\n  ],\n  \"K26\": [\n    2,\n    6\n  ],\n  \"K27\": [\n    2,\n    7\n  ],\n  \"K28\": [\n    2,\n    8\n  ],\n  \"K29\": [\n    2,\n    9\n  ],\n  \"K2A\": [\n    2,\n    10\n  ],\n  \"K2B\": [\n    2,\n    11\n  ],\n  \"K2C\": [\n    2,\n    12\n  ],\n  \"K2D\": [\n    4,\n    13\n  ],\n  \"K30\": [\n    3,\n    0\n  ],\n  \"K31\": [\n    3,\n    1\n  ],\n  \"K32\": [\n    3,\n    2\n  ],\n  \"K33\": [\n    3,\n    3\n  ],\n  \"K34\": [\n    3,\n    4\n  ],\n  \"K35\": [\n    3,\n    5\n  ],\n  \"K36\": [\n    3,\n    6\n  ],\n  \"K37\": [\n    3,\n    7\n  ],\n  \"K38\": [\n    3,\n    8\n  ],\n  \"K39\": [\n    3,\n    9\n  ],\n  \"K3A\": [\n    3,\n    10\n  ],\n  \"K3B\": [\n    3,\n    11\n  ],\n  \"K3C\": [\n    3,\n    12\n  ],\n  \"K3D\": [\n    4,\n    5\n  ],\n  \"K40\": [\n    4,\n    0\n  ],\n  \"K41\": [\n    4,\n    1\n  ],\n  \"K42\": [\n    4,\n    2\n  ],\n  \"K43\": [\n    4,\n    3\n  ],\n  \"K44\": [\n    4,\n    4\n  ],\n  \"K45\": [\n    4,\n    6\n  ],\n  \"K46\": [\n    4,\n    7\n  ],\n  \"K47\": [\n    4,\n    8\n  ],\n  \"K48\": [\n    4,\n    9\n  ],\n  \"K49\": [\n    4,\n    10\n  ],\n  \"K4A\": [\n    4,\n    11\n  ],\n  \"K4B\": [\n    4,\n    12\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_lite_1/leds.json",
    "content": "{\n  \"K00\": [\n    68\n  ],\n  \"K01\": [\n    67\n  ],\n  \"K02\": [\n    66\n  ],\n  \"K03\": [\n    65\n  ],\n  \"K04\": [\n    64\n  ],\n  \"K05\": [\n    63\n  ],\n  \"K06\": [\n    62\n  ],\n  \"K07\": [\n    61\n  ],\n  \"K08\": [\n    60\n  ],\n  \"K09\": [\n    59\n  ],\n  \"K0A\": [\n    58\n  ],\n  \"K0B\": [\n    57\n  ],\n  \"K0C\": [\n    56\n  ],\n  \"K0D\": [\n    55\n  ],\n  \"K0E\": [\n    69\n  ],\n  \"K10\": [\n    39\n  ],\n  \"K11\": [\n    40\n  ],\n  \"K12\": [\n    41\n  ],\n  \"K13\": [\n    42\n  ],\n  \"K14\": [\n    43\n  ],\n  \"K15\": [\n    44\n  ],\n  \"K16\": [\n    45\n  ],\n  \"K17\": [\n    46\n  ],\n  \"K18\": [\n    47\n  ],\n  \"K19\": [\n    48\n  ],\n  \"K1A\": [\n    49\n  ],\n  \"K1B\": [\n    50\n  ],\n  \"K1C\": [\n    51\n  ],\n  \"K1D\": [\n    52\n  ],\n  \"K1E\": [\n    54\n  ],\n  \"K20\": [\n    38\n  ],\n  \"K21\": [\n    37\n  ],\n  \"K22\": [\n    36\n  ],\n  \"K23\": [\n    35\n  ],\n  \"K24\": [\n    34\n  ],\n  \"K25\": [\n    33\n  ],\n  \"K26\": [\n    32\n  ],\n  \"K27\": [\n    31\n  ],\n  \"K28\": [\n    30\n  ],\n  \"K29\": [\n    29\n  ],\n  \"K2A\": [\n    28\n  ],\n  \"K2B\": [\n    27\n  ],\n  \"K2C\": [\n    26\n  ],\n  \"K2D\": [\n    53\n  ],\n  \"K30\": [\n    12\n  ],\n  \"K31\": [\n    11\n  ],\n  \"K32\": [\n    10\n  ],\n  \"K33\": [\n    9\n  ],\n  \"K34\": [\n    8\n  ],\n  \"K35\": [\n    7\n  ],\n  \"K36\": [\n    6\n  ],\n  \"K37\": [\n    5\n  ],\n  \"K38\": [\n    4\n  ],\n  \"K39\": [\n    3\n  ],\n  \"K3A\": [\n    2\n  ],\n  \"K3B\": [\n    1\n  ],\n  \"K3C\": [\n    0\n  ],\n  \"K3D\": [\n    25\n  ],\n  \"K40\": [\n    13\n  ],\n  \"K41\": [\n    14\n  ],\n  \"K42\": [\n    15\n  ],\n  \"K43\": [\n    16\n  ],\n  \"K44\": [\n    17\n  ],\n  \"K45\": [\n    18\n  ],\n  \"K46\": [\n    19\n  ],\n  \"K47\": [\n    20\n  ],\n  \"K48\": [\n    21\n  ],\n  \"K49\": [\n    22\n  ],\n  \"K4A\": [\n    23\n  ],\n  \"K4B\": [\n    24\n  ]\n}\n"
  },
  {
    "path": "layouts/keyboards/system76/launch_lite_1/physical.json",
    "content": "[\n  {\n    \"backcolor\": \"#373737\",\n    \"name\": \"Launch Lite\",\n    \"author\": \"Levi\",\n    \"radii\": \"24px\"\n  },\n  [\n    {\n      \"c\": \"#755841\"\n    },\n    \"`\\n\\n~\\n\\n\\n\\n\\n\\n\\n\\nEsc\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"\\n1\\n\\n!\\n\\n\\n\\n\\nF1\",\n    \"\\n2\\n\\n@\\n\\n\\n\\n\\nF2\",\n    \"\\n3\\n\\n#\\n\\n\\n\\n\\nF3\",\n    \"\\n4\\n\\n$\\n\\n\\n\\n\\nF4\",\n    \"\\n5\\n\\n%\\n\\n\\n\\n\\nF5\",\n    \"\\n6\\n\\n^\\n\\n\\n\\n\\nF6\",\n    \"\\n7\\n\\n&\\n\\n\\n\\n\\nF7\",\n    \"\\n8\\n\\n*\\n\\n\\n\\n\\nF8\",\n    \"\\n9\\n\\n(\\n\\n\\n\\n\\nF9\",\n    \"\\n0\\n\\n)\\n\\n\\n\\n\\nF10\",\n    \"\\n-\\n\\n_\\n\\n\\n\\n\\nF11\",\n    \"\\n=\\n\\n+\\n\\n\\n\\n\\nF12\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 5,\n      \"w\": 1.5\n    },\n    \"Del\\nBksp\",\n    {\n      \"x\": 0.25,\n      \"a\": 7\n    },\n    \"Home\"\n  ],\n  [\n    {\n      \"w\": 1.5\n    },\n    \"Tab\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Q\",\n    \"W\",\n    \"E\",\n    \"R\",\n    \"T\",\n    \"Y\",\n    \"U\",\n    \"I\",\n    \"O\",\n    \"P\",\n    {\n      \"a\": 5\n    },\n    \"{\\n[\",\n    \"}\\n]\",\n    \"|\\n\\\\\",\n    {\n      \"x\": 0.25,\n      \"c\": \"#636363\",\n      \"a\": 7\n    },\n    \"PgUp\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"w\": 1.5\n    },\n    \"Caps\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"A\",\n    \"S\",\n    \"D\",\n    {\n      \"n\": true\n    },\n    \"F\",\n    \"G\",\n    \"H\",\n    {\n      \"n\": true\n    },\n    \"J\",\n    \"K\",\n    \"L\",\n    {\n      \"a\": 5\n    },\n    \":\\n;\",\n    \"\\\"\\n'\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Enter\",\n    {\n      \"x\": 0.5\n    },\n    \"PgDn\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"w\": 2\n    },\n    \"Shift\",\n    {\n      \"c\": \"#ffe8d6\"\n    },\n    \"Z\",\n    \"X\",\n    \"C\",\n    \"V\",\n    \"B\",\n    \"N\",\n    \"M\",\n    {\n      \"a\": 5\n    },\n    \"<\\n,\",\n    \">\\n.\",\n    \"?\\n/\",\n    {\n      \"c\": \"#636363\",\n      \"a\": 7,\n      \"w\": 1.5\n    },\n    \"Shift\",\n    {\n      \"c\": \"#755841\"\n    },\n    \"Up\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"End\"\n  ],\n  [\n    {\n      \"x\": 0.25,\n      \"w\": 1.5\n    },\n    \"Ctrl\",\n    \"Alt\",\n    \"Fn\",\n    \"Super\",\n    {\n      \"c\": \"#ffe8d6\",\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"w\": 2\n    },\n    \"Space\",\n    {\n      \"c\": \"#636363\"\n    },\n    \"Ctrl\",\n    \"Alt\",\n    {\n      \"w\": 1.5\n    },\n    \"Fn\",\n    {\n      \"x\": 0.5,\n      \"c\": \"#755841\"\n    },\n    \"Left\",\n    {\n      \"n\": true\n    },\n    \"Down\",\n    \"Right\"\n  ]\n]"
  },
  {
    "path": "layouts/keymap/ec.json",
    "content": "{\n  \"NONE\": 0,\n  \"FN\": 4096,\n  \"DISPLAY_MODE\": 8192,\n  \"PRINT_SCREEN\": 8193,\n  \"PAUSE\": 8194,\n  \"DISPLAY_TOGGLE\": 16395,\n  \"BRIGHTNESS_DOWN\": 16401,\n  \"BRIGHTNESS_UP\": 16402,\n  \"CAMERA_TOGGLE\": 16403,\n  \"AIRPLANE_MODE\": 16404,\n  \"SUSPEND\": 16405,\n  \"KBD_COLOR\": 32896,\n  \"KBD_DOWN\": 32897,\n  \"KBD_UP\": 32898,\n  \"KBD_BKL\": 32906,\n  \"KBD_TOGGLE\": 32927,\n  \"FAN_TOGGLE\": 33010,\n  \"PLAY_PAUSE\": 308,\n  \"MUTE\": 291,\n  \"VOLUME_DOWN\": 289,\n  \"VOLUME_UP\": 306,\n  \"MEDIA_NEXT\": 333,\n  \"MEDIA_PREV\": 277,\n  \"TOUCHPAD\": 355,\n  \"MIC_MUTE\": 374,\n  \"F1\": 5,\n  \"F2\": 6,\n  \"F3\": 4,\n  \"F4\": 12,\n  \"F5\": 3,\n  \"F6\": 11,\n  \"F7\": 131,\n  \"F8\": 10,\n  \"F9\": 1,\n  \"F10\": 9,\n  \"F11\": 120,\n  \"F12\": 7,\n  \"0\": 69,\n  \"1\": 22,\n  \"2\": 30,\n  \"3\": 38,\n  \"4\": 37,\n  \"5\": 46,\n  \"6\": 54,\n  \"7\": 61,\n  \"8\": 62,\n  \"9\": 70,\n  \"A\": 28,\n  \"B\": 50,\n  \"C\": 33,\n  \"D\": 35,\n  \"E\": 36,\n  \"F\": 43,\n  \"G\": 52,\n  \"H\": 51,\n  \"I\": 67,\n  \"J\": 59,\n  \"K\": 66,\n  \"L\": 75,\n  \"M\": 58,\n  \"N\": 49,\n  \"O\": 68,\n  \"P\": 77,\n  \"Q\": 21,\n  \"R\": 45,\n  \"S\": 27,\n  \"T\": 44,\n  \"U\": 60,\n  \"V\": 42,\n  \"W\": 29,\n  \"X\": 34,\n  \"Y\": 53,\n  \"Z\": 26,\n  \"ESC\": 118,\n  \"SCROLL_LOCK\": 126,\n  \"TICK\": 14,\n  \"MINUS\": 78,\n  \"EQUALS\": 85,\n  \"BKSP\": 102,\n  \"TAB\": 13,\n  \"BRACE_OPEN\": 84,\n  \"BRACE_CLOSE\": 91,\n  \"BACKSLASH\": 93,\n  \"CAPS\": 88,\n  \"SEMICOLON\": 76,\n  \"QUOTE\": 82,\n  \"ENTER\": 90,\n  \"LEFT_SHIFT\": 18,\n  \"COMMA\": 65,\n  \"PERIOD\": 73,\n  \"SLASH\": 74,\n  \"RIGHT_SHIFT\": 89,\n  \"LEFT_CTRL\": 20,\n  \"LEFT_SUPER\": 287,\n  \"LEFT_ALT\": 17,\n  \"SPACE\": 41,\n  \"RIGHT_ALT\": 273,\n  \"RIGHT_SUPER\": 295,\n  \"APP\": 303,\n  \"RIGHT_CTRL\": 276,\n  \"INSERT\": 368,\n  \"DEL\": 369,\n  \"HOME\": 364,\n  \"END\": 361,\n  \"PGUP\": 381,\n  \"PGDN\": 378,\n  \"UP\": 373,\n  \"LEFT\": 363,\n  \"DOWN\": 370,\n  \"RIGHT\": 372,\n  \"NUM_LOCK\": 119,\n  \"NUM_SLASH\": 330,\n  \"NUM_ASTERISK\": 124,\n  \"NUM_MINUS\": 123,\n  \"NUM_PLUS\": 121,\n  \"NUM_PERIOD\": 113,\n  \"NUM_ENTER\": 346,\n  \"NUM_0\": 112,\n  \"NUM_1\": 105,\n  \"NUM_2\": 114,\n  \"NUM_3\": 122,\n  \"NUM_4\": 107,\n  \"NUM_5\": 115,\n  \"NUM_6\": 116,\n  \"NUM_7\": 108,\n  \"NUM_8\": 117,\n  \"NUM_9\": 125,\n  \"FNLOCK\": 513\n}\n"
  },
  {
    "path": "layouts/keymap/qmk.json",
    "content": "{\n  \"NONE\": 0,\n  \"ROLL_OVER\": 1,\n  \"A\": 4,\n  \"B\": 5,\n  \"C\": 6,\n  \"D\": 7,\n  \"E\": 8,\n  \"F\": 9,\n  \"G\": 10,\n  \"H\": 11,\n  \"I\": 12,\n  \"J\": 13,\n  \"K\": 14,\n  \"L\": 15,\n  \"M\": 16,\n  \"N\": 17,\n  \"O\": 18,\n  \"P\": 19,\n  \"Q\": 20,\n  \"R\": 21,\n  \"S\": 22,\n  \"T\": 23,\n  \"U\": 24,\n  \"V\": 25,\n  \"W\": 26,\n  \"X\": 27,\n  \"Y\": 28,\n  \"Z\": 29,\n  \"1\": 30,\n  \"2\": 31,\n  \"3\": 32,\n  \"4\": 33,\n  \"5\": 34,\n  \"6\": 35,\n  \"7\": 36,\n  \"8\": 37,\n  \"9\": 38,\n  \"0\": 39,\n  \"ENTER\": 40,\n  \"ESC\": 41,\n  \"BKSP\": 42,\n  \"TAB\": 43,\n  \"SPACE\": 44,\n  \"MINUS\": 45,\n  \"EQUALS\": 46,\n  \"BRACE_OPEN\": 47,\n  \"BRACE_CLOSE\": 48,\n  \"BACKSLASH\": 49,\n  \"NONUS_HASH\": 50,\n  \"SEMICOLON\": 51,\n  \"QUOTE\": 52,\n  \"TICK\": 53,\n  \"COMMA\": 54,\n  \"PERIOD\": 55,\n  \"SLASH\": 56,\n  \"CAPS\": 57,\n  \"F1\": 58,\n  \"F2\": 59,\n  \"F3\": 60,\n  \"F4\": 61,\n  \"F5\": 62,\n  \"F6\": 63,\n  \"F7\": 64,\n  \"F8\": 65,\n  \"F9\": 66,\n  \"F10\": 67,\n  \"F11\": 68,\n  \"F12\": 69,\n  \"PRINT_SCREEN\": 70,\n  \"SCROLL_LOCK\": 71,\n  \"PAUSE\": 72,\n  \"INSERT\": 73,\n  \"HOME\": 74,\n  \"PGUP\": 75,\n  \"DEL\": 76,\n  \"END\": 77,\n  \"PGDN\": 78,\n  \"RIGHT\": 79,\n  \"LEFT\": 80,\n  \"DOWN\": 81,\n  \"UP\": 82,\n  \"NUM_LOCK\": 83,\n  \"NUM_SLASH\": 84,\n  \"NUM_ASTERISK\": 85,\n  \"NUM_MINUS\": 86,\n  \"NUM_PLUS\": 87,\n  \"NUM_ENTER\": 88,\n  \"NUM_1\": 89,\n  \"NUM_2\": 90,\n  \"NUM_3\": 91,\n  \"NUM_4\": 92,\n  \"NUM_5\": 93,\n  \"NUM_6\": 94,\n  \"NUM_7\": 95,\n  \"NUM_8\": 96,\n  \"NUM_9\": 97,\n  \"NUM_0\": 98,\n  \"NUM_PERIOD\": 99,\n  \"NONUS_BACKSLASH\": 100,\n  \"APP\": 101,\n  \"KB_POWER\": 102,\n  \"NUM_EQUALS\": 103,\n  \"F13\": 104,\n  \"F14\": 105,\n  \"F15\": 106,\n  \"F16\": 107,\n  \"F17\": 108,\n  \"F18\": 109,\n  \"F19\": 110,\n  \"F20\": 111,\n  \"F21\": 112,\n  \"F22\": 113,\n  \"F23\": 114,\n  \"F24\": 115,\n  \"EXECUTE\": 116,\n  \"HELP\": 117,\n  \"MENU\": 118,\n  \"SELECT\": 119,\n  \"STOP\": 120,\n  \"AGAIN\": 121,\n  \"UNDO\": 122,\n  \"CUT\": 123,\n  \"COPY\": 124,\n  \"PASTE\": 125,\n  \"FIND\": 126,\n  \"KB_MUTE\": 127,\n  \"KB_VOLUME_UP\": 128,\n  \"KB_VOLUME_DOWN\": 129,\n  \"LOCKING_CAPS_LOCK\": 130,\n  \"LOCKING_NUM_LOCK\": 131,\n  \"LOCKING_SCROLL_LOCK\": 132,\n  \"NUM_COMMA\": 133,\n  \"KP_EQUAL_AS400\": 134,\n  \"INT1\": 135,\n  \"INT2\": 136,\n  \"INT3\": 137,\n  \"INT4\": 138,\n  \"INT5\": 139,\n  \"INT6\": 140,\n  \"INT7\": 141,\n  \"INT8\": 142,\n  \"INT9\": 143,\n  \"LANGUAGE_1\": 144,\n  \"LANGUAGE_2\": 145,\n  \"LANGUAGE_3\": 146,\n  \"LANGUAGE_4\": 147,\n  \"LANGUAGE_5\": 148,\n  \"LANGUAGE_6\": 149,\n  \"LANGUAGE_7\": 150,\n  \"LANGUAGE_8\": 151,\n  \"LANGUAGE_9\": 152,\n  \"ALTERNATE_ERASE\": 153,\n  \"SYSTEM_REQUEST\": 154,\n  \"CANCEL\": 155,\n  \"CLEAR\": 156,\n  \"PRIOR\": 157,\n  \"RETURN\": 158,\n  \"SEPARATOR\": 159,\n  \"OUT\": 160,\n  \"OPER\": 161,\n  \"CLEAR_AGAIN\": 162,\n  \"CRSEL\": 163,\n  \"EXSEL\": 164,\n  \"SYSTEM_POWER\": 165,\n  \"SUSPEND\": 166,\n  \"SYSTEM_WAKE\": 167,\n  \"MUTE\": 168,\n  \"VOLUME_UP\": 169,\n  \"VOLUME_DOWN\": 170,\n  \"MEDIA_NEXT\": 171,\n  \"MEDIA_PREV\": 172,\n  \"MEDIA_STOP\": 173,\n  \"PLAY_PAUSE\": 174,\n  \"MEDIA_SELECT\": 175,\n  \"MEDIA_EJECT\": 176,\n  \"MAIL\": 177,\n  \"CALCULATOR\": 178,\n  \"MY_COMPUTER\": 179,\n  \"WWW_SEARCH\": 180,\n  \"WWW_HOME\": 181,\n  \"WWW_BACK\": 182,\n  \"WWW_FORWARD\": 183,\n  \"WWW_STOP\": 184,\n  \"WWW_REFRESH\": 185,\n  \"WWW_FAVORITES\": 186,\n  \"MEDIA_FAST_FORWARD\": 187,\n  \"MEDIA_REWIND\": 188,\n  \"BRIGHTNESS_UP\": 189,\n  \"BRIGHTNESS_DOWN\": 190,\n  \"CONTROL_PANEL\": 191,\n  \"ASSISTANT\": 192,\n  \"MS_UP\": 205,\n  \"MS_DOWN\": 206,\n  \"MS_LEFT\": 207,\n  \"MS_RIGHT\": 208,\n  \"MS_BTN1\": 209,\n  \"MS_BTN2\": 210,\n  \"MS_BTN3\": 211,\n  \"MS_BTN4\": 212,\n  \"MS_BTN5\": 213,\n  \"MS_BTN6\": 214,\n  \"MS_BTN7\": 215,\n  \"MS_BTN8\": 216,\n  \"MS_WH_UP\": 217,\n  \"MS_WH_DOWN\": 218,\n  \"MS_WH_LEFT\": 219,\n  \"MS_WH_RIGHT\": 220,\n  \"MS_ACCEL0\": 221,\n  \"MS_ACCEL1\": 222,\n  \"MS_ACCEL2\": 223,\n  \"LEFT_CTRL\": 224,\n  \"LEFT_SHIFT\": 225,\n  \"LEFT_ALT\": 226,\n  \"LEFT_SUPER\": 227,\n  \"RIGHT_CTRL\": 228,\n  \"RIGHT_SHIFT\": 229,\n  \"RIGHT_ALT\": 230,\n  \"RIGHT_SUPER\": 231,\n  \"KBD_TOGGLE\": 30752,\n  \"RGB_MODE_FORWARD\": 30753,\n  \"RGB_MODE_REVERSE\": 30754,\n  \"RGB_HUI\": 30755,\n  \"RGB_HUD\": 30756,\n  \"RGB_SAI\": 30757,\n  \"RGB_SAD\": 30758,\n  \"KBD_UP\": 30759,\n  \"KBD_DOWN\": 30760,\n  \"RGB_SPI\": 30761,\n  \"RGB_SPD\": 30762,\n  \"RGB_MODE_PLAIN\": 30763,\n  \"RGB_MODE_BREATHE\": 30764,\n  \"RGB_MODE_RAINBOW\": 30765,\n  \"RGB_MODE_SWIRL\": 30766,\n  \"RGB_MODE_SNAKE\": 30767,\n  \"RGB_MODE_KNIGHT\": 30768,\n  \"RGB_MODE_XMAS\": 30769,\n  \"RGB_MODE_GRADIENT\": 30770,\n  \"RGB_MODE_RGBTEST\": 30771,\n  \"RGB_MODE_TWINKLE\": 30772,\n  \"BASIC_MAX\": 255,\n  \"MODS\": 256,\n  \"MODS_MAX\": 8191,\n  \"MOD_TAP\": 8192,\n  \"MOD_TAP_MAX\": 16383,\n  \"LAYER_TAP\": 16384,\n  \"LAYER_TAP_MAX\": 20479,\n  \"LAYER_MOD\": 20480,\n  \"LAYER_MOD_MAX\": 20991,\n  \"LAYER_SWITCH_1\": 20992,\n  \"TO_MAX\": 21023,\n  \"LAYER_ACCESS_1\": 21024,\n  \"MOMENTARY_MAX\": 21055,\n  \"DEF_LAYER\": 21056,\n  \"DEF_LAYER_MAX\": 21087,\n  \"LAYER_TOGGLE_1\": 21088,\n  \"TOGGLE_LAYER_MAX\": 21119,\n  \"ONE_SHOT_LAYER\": 21120,\n  \"ONE_SHOT_LAYER_MAX\": 21151,\n  \"ONE_SHOT_MOD\": 21152,\n  \"ONE_SHOT_MOD_MAX\": 21183,\n  \"LAYER_TAP_TOGGLE\": 21184,\n  \"LAYER_TAP_TOGGLE_MAX\": 21215,\n  \"SWAP_HANDS\": 22016,\n  \"SWAP_HANDS_MAX\": 22271,\n  \"TAP_DANCE\": 22272,\n  \"TAP_DANCE_MAX\": 22527,\n  \"MAGIC\": 28672,\n  \"MAGIC_MAX\": 28927,\n  \"MIDI_ON\": 28928,\n  \"MIDI_MAX\": 29183,\n  \"SEQUENCER\": 29184,\n  \"SEQUENCER_MAX\": 29695,\n  \"JOYSTICK\": 29696,\n  \"JOYSTICK_MAX\": 29759,\n  \"PROGRAMMABLE_BUTTON\": 29760,\n  \"PROGRAMMABLE_BUTTON_MAX\": 29823,\n  \"AUDIO_ON\": 29824,\n  \"AUDIO_MAX\": 29887,\n  \"STENO\": 29888,\n  \"STENO_MAX\": 29951,\n  \"MACRO_0\": 30464,\n  \"MACRO_MAX\": 30591,\n  \"BACKLIGHT_ON\": 30720,\n  \"LIGHTING_MAX\": 30975,\n  \"RESET\": 31744,\n  \"QUANTUM_MAX\": 32255,\n  \"KB\": 32256,\n  \"KB_MAX\": 32511,\n  \"USER\": 32512,\n  \"USER_MAX\": 32767,\n  \"UNICODE\": 32768,\n  \"UNICODE_MAX\": 65535,\n  \"MIDI_OFF\": 28929,\n  \"MIDI_TOGGLE\": 28930,\n  \"MIDI_NOTE_C_0\": 28944,\n  \"MIDI_NOTE_C_SHARP_0\": 28945,\n  \"MIDI_NOTE_D_0\": 28946,\n  \"MIDI_NOTE_D_SHARP_0\": 28947,\n  \"MIDI_NOTE_E_0\": 28948,\n  \"MIDI_NOTE_F_0\": 28949,\n  \"MIDI_NOTE_F_SHARP_0\": 28950,\n  \"MIDI_NOTE_G_0\": 28951,\n  \"MIDI_NOTE_G_SHARP_0\": 28952,\n  \"MIDI_NOTE_A_0\": 28953,\n  \"MIDI_NOTE_A_SHARP_0\": 28954,\n  \"MIDI_NOTE_B_0\": 28955,\n  \"MIDI_NOTE_C_1\": 28960,\n  \"MIDI_NOTE_C_SHARP_1\": 28961,\n  \"MIDI_NOTE_D_1\": 28962,\n  \"MIDI_NOTE_D_SHARP_1\": 28963,\n  \"MIDI_NOTE_E_1\": 28964,\n  \"MIDI_NOTE_F_1\": 28965,\n  \"MIDI_NOTE_F_SHARP_1\": 28966,\n  \"MIDI_NOTE_G_1\": 28967,\n  \"MIDI_NOTE_G_SHARP_1\": 28968,\n  \"MIDI_NOTE_A_1\": 28969,\n  \"MIDI_NOTE_A_SHARP_1\": 28970,\n  \"MIDI_NOTE_B_1\": 28971,\n  \"MIDI_NOTE_C_2\": 28976,\n  \"MIDI_NOTE_C_SHARP_2\": 28977,\n  \"MIDI_NOTE_D_2\": 28978,\n  \"MIDI_NOTE_D_SHARP_2\": 28979,\n  \"MIDI_NOTE_E_2\": 28980,\n  \"MIDI_NOTE_F_2\": 28981,\n  \"MIDI_NOTE_F_SHARP_2\": 28982,\n  \"MIDI_NOTE_G_2\": 28983,\n  \"MIDI_NOTE_G_SHARP_2\": 28984,\n  \"MIDI_NOTE_A_2\": 28985,\n  \"MIDI_NOTE_A_SHARP_2\": 28986,\n  \"MIDI_NOTE_B_2\": 28987,\n  \"MIDI_NOTE_C_3\": 28992,\n  \"MIDI_NOTE_C_SHARP_3\": 28993,\n  \"MIDI_NOTE_D_3\": 28994,\n  \"MIDI_NOTE_D_SHARP_3\": 28995,\n  \"MIDI_NOTE_E_3\": 28996,\n  \"MIDI_NOTE_F_3\": 28997,\n  \"MIDI_NOTE_F_SHARP_3\": 28998,\n  \"MIDI_NOTE_G_3\": 28999,\n  \"MIDI_NOTE_G_SHARP_3\": 29000,\n  \"MIDI_NOTE_A_3\": 29001,\n  \"MIDI_NOTE_A_SHARP_3\": 29002,\n  \"MIDI_NOTE_B_3\": 29003,\n  \"MIDI_NOTE_C_4\": 29008,\n  \"MIDI_NOTE_C_SHARP_4\": 29009,\n  \"MIDI_NOTE_D_4\": 29010,\n  \"MIDI_NOTE_D_SHARP_4\": 29011,\n  \"MIDI_NOTE_E_4\": 29012,\n  \"MIDI_NOTE_F_4\": 29013,\n  \"MIDI_NOTE_F_SHARP_4\": 29014,\n  \"MIDI_NOTE_G_4\": 29015,\n  \"MIDI_NOTE_G_SHARP_4\": 29016,\n  \"MIDI_NOTE_A_4\": 29017,\n  \"MIDI_NOTE_A_SHARP_4\": 29018,\n  \"MIDI_NOTE_B_4\": 29019,\n  \"MIDI_NOTE_C_5\": 29024,\n  \"MIDI_NOTE_C_SHARP_5\": 29025,\n  \"MIDI_NOTE_D_5\": 29026,\n  \"MIDI_NOTE_D_SHARP_5\": 29027,\n  \"MIDI_NOTE_E_5\": 29028,\n  \"MIDI_NOTE_F_5\": 29029,\n  \"MIDI_NOTE_F_SHARP_5\": 29030,\n  \"MIDI_NOTE_G_5\": 29031,\n  \"MIDI_NOTE_G_SHARP_5\": 29032,\n  \"MIDI_NOTE_A_5\": 29033,\n  \"MIDI_NOTE_A_SHARP_5\": 29034,\n  \"MIDI_NOTE_B_5\": 29035,\n  \"MIDI_OCTAVE_N2\": 29040,\n  \"MIDI_OCTAVE_N1\": 29041,\n  \"MIDI_OCTAVE_0\": 29042,\n  \"MIDI_OCTAVE_1\": 29043,\n  \"MIDI_OCTAVE_2\": 29044,\n  \"MIDI_OCTAVE_3\": 29045,\n  \"MIDI_OCTAVE_4\": 29046,\n  \"MIDI_OCTAVE_5\": 29047,\n  \"MIDI_OCTAVE_6\": 29048,\n  \"MIDI_OCTAVE_7\": 29049,\n  \"MIDI_OCTAVE_DOWN\": 29050,\n  \"MIDI_OCTAVE_UP\": 29051,\n  \"MIDI_TRANSPOSE_N6\": 29056,\n  \"MIDI_TRANSPOSE_N5\": 29057,\n  \"MIDI_TRANSPOSE_N4\": 29058,\n  \"MIDI_TRANSPOSE_N3\": 29059,\n  \"MIDI_TRANSPOSE_N2\": 29060,\n  \"MIDI_TRANSPOSE_N1\": 29061,\n  \"MIDI_TRANSPOSE_0\": 29062,\n  \"MIDI_TRANSPOSE_1\": 29063,\n  \"MIDI_TRANSPOSE_2\": 29064,\n  \"MIDI_TRANSPOSE_3\": 29065,\n  \"MIDI_TRANSPOSE_4\": 29066,\n  \"MIDI_TRANSPOSE_5\": 29067,\n  \"MIDI_TRANSPOSE_6\": 29068,\n  \"MIDI_TRANSPOSE_DOWN\": 29069,\n  \"MIDI_TRANSPOSE_UP\": 29070,\n  \"MIDI_VELOCITY_0\": 29072,\n  \"MIDI_VELOCITY_1\": 29073,\n  \"MIDI_VELOCITY_2\": 29074,\n  \"MIDI_VELOCITY_3\": 29075,\n  \"MIDI_VELOCITY_4\": 29076,\n  \"MIDI_VELOCITY_5\": 29077,\n  \"MIDI_VELOCITY_6\": 29078,\n  \"MIDI_VELOCITY_7\": 29079,\n  \"MIDI_VELOCITY_8\": 29080,\n  \"MIDI_VELOCITY_9\": 29081,\n  \"MIDI_VELOCITY_10\": 29082,\n  \"MIDI_VELOCITY_DOWN\": 29083,\n  \"MIDI_VELOCITY_UP\": 29084,\n  \"MIDI_CHANNEL_1\": 29088,\n  \"MIDI_CHANNEL_2\": 29089,\n  \"MIDI_CHANNEL_3\": 29090,\n  \"MIDI_CHANNEL_4\": 29091,\n  \"MIDI_CHANNEL_5\": 29092,\n  \"MIDI_CHANNEL_6\": 29093,\n  \"MIDI_CHANNEL_7\": 29094,\n  \"MIDI_CHANNEL_8\": 29095,\n  \"MIDI_CHANNEL_9\": 29096,\n  \"MIDI_CHANNEL_10\": 29097,\n  \"MIDI_CHANNEL_11\": 29098,\n  \"MIDI_CHANNEL_12\": 29099,\n  \"MIDI_CHANNEL_13\": 29100,\n  \"MIDI_CHANNEL_14\": 29101,\n  \"MIDI_CHANNEL_15\": 29102,\n  \"MIDI_CHANNEL_16\": 29103,\n  \"MIDI_CHANNEL_DOWN\": 29104,\n  \"MIDI_CHANNEL_UP\": 29105,\n  \"MIDI_ALL_NOTES_OFF\": 29120,\n  \"MIDI_SUSTAIN\": 29121,\n  \"MIDI_PORTAMENTO\": 29122,\n  \"MIDI_SOSTENUTO\": 29123,\n  \"MIDI_SOFT\": 29124,\n  \"MIDI_LEGATO\": 29125,\n  \"MIDI_MODULATION\": 29126,\n  \"MIDI_MODULATION_SPEED_DOWN\": 29127,\n  \"MIDI_MODULATION_SPEED_UP\": 29128,\n  \"MIDI_PITCH_BEND_DOWN\": 29129,\n  \"MIDI_PITCH_BEND_UP\": 29130,\n  \"JOYSTICK_BUTTON_1\": 29697,\n  \"JOYSTICK_BUTTON_2\": 29698,\n  \"JOYSTICK_BUTTON_3\": 29699,\n  \"JOYSTICK_BUTTON_4\": 29700,\n  \"JOYSTICK_BUTTON_5\": 29701,\n  \"JOYSTICK_BUTTON_6\": 29702,\n  \"JOYSTICK_BUTTON_7\": 29703,\n  \"JOYSTICK_BUTTON_8\": 29704,\n  \"JOYSTICK_BUTTON_9\": 29705,\n  \"JOYSTICK_BUTTON_10\": 29706,\n  \"JOYSTICK_BUTTON_11\": 29707,\n  \"JOYSTICK_BUTTON_12\": 29708,\n  \"JOYSTICK_BUTTON_13\": 29709,\n  \"JOYSTICK_BUTTON_14\": 29710,\n  \"JOYSTICK_BUTTON_15\": 29711,\n  \"JOYSTICK_BUTTON_16\": 29712,\n  \"JOYSTICK_BUTTON_17\": 29713,\n  \"JOYSTICK_BUTTON_18\": 29714,\n  \"JOYSTICK_BUTTON_19\": 29715,\n  \"JOYSTICK_BUTTON_20\": 29716,\n  \"JOYSTICK_BUTTON_21\": 29717,\n  \"JOYSTICK_BUTTON_22\": 29718,\n  \"JOYSTICK_BUTTON_23\": 29719,\n  \"JOYSTICK_BUTTON_24\": 29720,\n  \"JOYSTICK_BUTTON_25\": 29721,\n  \"JOYSTICK_BUTTON_26\": 29722,\n  \"JOYSTICK_BUTTON_27\": 29723,\n  \"JOYSTICK_BUTTON_28\": 29724,\n  \"JOYSTICK_BUTTON_29\": 29725,\n  \"JOYSTICK_BUTTON_30\": 29726,\n  \"JOYSTICK_BUTTON_31\": 29727,\n  \"PROGRAMMABLE_BUTTON_2\": 29761,\n  \"PROGRAMMABLE_BUTTON_3\": 29762,\n  \"PROGRAMMABLE_BUTTON_4\": 29763,\n  \"PROGRAMMABLE_BUTTON_5\": 29764,\n  \"PROGRAMMABLE_BUTTON_6\": 29765,\n  \"PROGRAMMABLE_BUTTON_7\": 29766,\n  \"PROGRAMMABLE_BUTTON_8\": 29767,\n  \"PROGRAMMABLE_BUTTON_9\": 29768,\n  \"PROGRAMMABLE_BUTTON_10\": 29769,\n  \"PROGRAMMABLE_BUTTON_11\": 29770,\n  \"PROGRAMMABLE_BUTTON_12\": 29771,\n  \"PROGRAMMABLE_BUTTON_13\": 29772,\n  \"PROGRAMMABLE_BUTTON_14\": 29773,\n  \"PROGRAMMABLE_BUTTON_15\": 29774,\n  \"PROGRAMMABLE_BUTTON_16\": 29775,\n  \"PROGRAMMABLE_BUTTON_17\": 29776,\n  \"PROGRAMMABLE_BUTTON_18\": 29777,\n  \"PROGRAMMABLE_BUTTON_19\": 29778,\n  \"PROGRAMMABLE_BUTTON_20\": 29779,\n  \"PROGRAMMABLE_BUTTON_21\": 29780,\n  \"PROGRAMMABLE_BUTTON_22\": 29781,\n  \"PROGRAMMABLE_BUTTON_23\": 29782,\n  \"PROGRAMMABLE_BUTTON_24\": 29783,\n  \"PROGRAMMABLE_BUTTON_25\": 29784,\n  \"PROGRAMMABLE_BUTTON_26\": 29785,\n  \"PROGRAMMABLE_BUTTON_27\": 29786,\n  \"PROGRAMMABLE_BUTTON_28\": 29787,\n  \"PROGRAMMABLE_BUTTON_29\": 29788,\n  \"PROGRAMMABLE_BUTTON_30\": 29789,\n  \"PROGRAMMABLE_BUTTON_31\": 29790,\n  \"PROGRAMMABLE_BUTTON_32\": 29791,\n  \"AUDIO_OFF\": 29825,\n  \"AUDIO_TOGGLE\": 29826,\n  \"AUDIO_CLICKY_TOGGLE\": 29834,\n  \"AUDIO_CLICKY_ON\": 29835,\n  \"AUDIO_CLICKY_OFF\": 29836,\n  \"AUDIO_CLICKY_UP\": 29837,\n  \"AUDIO_CLICKY_DOWN\": 29838,\n  \"AUDIO_CLICKY_RESET\": 29839,\n  \"MUSIC_ON\": 29840,\n  \"MUSIC_OFF\": 29841,\n  \"MUSIC_TOGGLE\": 29842,\n  \"MUSIC_MODE_NEXT\": 29843,\n  \"AUDIO_VOICE_NEXT\": 29844,\n  \"AUDIO_VOICE_PREVIOUS\": 29845,\n  \"STENO_BOLT\": 29936,\n  \"STENO_GEMINI\": 29937,\n  \"STENO_COMB\": 29938,\n  \"STENO_COMB_MAX\": 29948,\n  \"MACRO_1\": 30465,\n  \"MACRO_2\": 30466,\n  \"MACRO_3\": 30467,\n  \"MACRO_4\": 30468,\n  \"MACRO_5\": 30469,\n  \"MACRO_6\": 30470,\n  \"MACRO_7\": 30471,\n  \"MACRO_8\": 30472,\n  \"MACRO_9\": 30473,\n  \"MACRO_10\": 30474,\n  \"MACRO_11\": 30475,\n  \"MACRO_12\": 30476,\n  \"MACRO_13\": 30477,\n  \"MACRO_14\": 30478,\n  \"MACRO_15\": 30479,\n  \"MACRO_16\": 30480,\n  \"MACRO_17\": 30481,\n  \"MACRO_18\": 30482,\n  \"MACRO_19\": 30483,\n  \"MACRO_20\": 30484,\n  \"MACRO_21\": 30485,\n  \"MACRO_22\": 30486,\n  \"MACRO_23\": 30487,\n  \"MACRO_24\": 30488,\n  \"MACRO_25\": 30489,\n  \"MACRO_26\": 30490,\n  \"MACRO_27\": 30491,\n  \"MACRO_28\": 30492,\n  \"MACRO_29\": 30493,\n  \"MACRO_30\": 30494,\n  \"MACRO_31\": 30495,\n  \"BACKLIGHT_OFF\": 30721,\n  \"BACKLIGHT_TOGGLE\": 30722,\n  \"BACKLIGHT_DOWN\": 30723,\n  \"BACKLIGHT_UP\": 30724,\n  \"BACKLIGHT_STEP\": 30725,\n  \"BACKLIGHT_TOGGLE_BREATHING\": 30726,\n  \"REBOOT\": 31745,\n  \"DEBUG_TOGGLE\": 31746,\n  \"CLEAR_EEPROM\": 31747,\n  \"MAKE\": 31748,\n  \"AUTO_SHIFT_DOWN\": 31760,\n  \"AUTO_SHIFT_UP\": 31761,\n  \"AUTO_SHIFT_REPORT\": 31762,\n  \"AUTO_SHIFT_ON\": 31763,\n  \"AUTO_SHIFT_OFF\": 31764,\n  \"AUTO_SHIFT_TOGGLE\": 31765,\n  \"GRAVE_ESCAPE\": 31766,\n  \"VELOCIKEY_TOGGLE\": 31767,\n  \"SPACE_CADET_LEFT_CTRL_PARENTHESIS_OPEN\": 31768,\n  \"SPACE_CADET_RIGHT_CTRL_PARENTHESIS_CLOSE\": 31769,\n  \"SPACE_CADET_LEFT_SHIFT_PARENTHESIS_OPEN\": 31770,\n  \"SPACE_CADET_RIGHT_SHIFT_PARENTHESIS_CLOSE\": 31771,\n  \"SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN\": 31772,\n  \"SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE\": 31773,\n  \"SPACE_CADET_RIGHT_SHIFT_ENTER\": 31774,\n  \"OUTPUT_AUTO\": 31776,\n  \"OUTPUT_USB\": 31777,\n  \"OUTPUT_BLUETOOTH\": 31778,\n  \"UNICODE_MODE_NEXT\": 31792,\n  \"UNICODE_MODE_PREVIOUS\": 31793,\n  \"UNICODE_MODE_MACOS\": 31794,\n  \"UNICODE_MODE_LINUX\": 31795,\n  \"UNICODE_MODE_WINDOWS\": 31796,\n  \"UNICODE_MODE_BSD\": 31797,\n  \"UNICODE_MODE_WINCOMPOSE\": 31798,\n  \"UNICODE_MODE_EMACS\": 31799,\n  \"HAPTIC_ON\": 31808,\n  \"HAPTIC_OFF\": 31809,\n  \"HAPTIC_TOGGLE\": 31810,\n  \"HAPTIC_RESET\": 31811,\n  \"HAPTIC_FEEDBACK_TOGGLE\": 31812,\n  \"HAPTIC_BUZZ_TOGGLE\": 31813,\n  \"HAPTIC_MODE_NEXT\": 31814,\n  \"HAPTIC_MODE_PREVIOUS\": 31815,\n  \"HAPTIC_CONTINUOUS_TOGGLE\": 31816,\n  \"HAPTIC_CONTINUOUS_UP\": 31817,\n  \"HAPTIC_CONTINUOUS_DOWN\": 31818,\n  \"HAPTIC_DWELL_UP\": 31819,\n  \"HAPTIC_DWELL_DOWN\": 31820,\n  \"COMBO_ON\": 31824,\n  \"COMBO_OFF\": 31825,\n  \"COMBO_TOGGLE\": 31826,\n  \"DYNAMIC_MACRO_RECORD_START_1\": 31827,\n  \"DYNAMIC_MACRO_RECORD_START_2\": 31828,\n  \"DYNAMIC_MACRO_RECORD_STOP\": 31829,\n  \"DYNAMIC_MACRO_PLAY_1\": 31830,\n  \"DYNAMIC_MACRO_PLAY_2\": 31831,\n  \"LEADER\": 31832,\n  \"LOCK\": 31833,\n  \"ONE_SHOT_ON\": 31834,\n  \"ONE_SHOT_OFF\": 31835,\n  \"ONE_SHOT_TOGGLE\": 31836,\n  \"KEY_OVERRIDE_TOGGLE\": 31837,\n  \"KEY_OVERRIDE_ON\": 31838,\n  \"KEY_OVERRIDE_OFF\": 31839,\n  \"SECURE_LOCK\": 31840,\n  \"SECURE_UNLOCK\": 31841,\n  \"SECURE_TOGGLE\": 31842,\n  \"SECURE_REQUEST\": 31843,\n  \"DYNAMIC_TAPPING_TERM_PRINT\": 31856,\n  \"DYNAMIC_TAPPING_TERM_UP\": 31857,\n  \"DYNAMIC_TAPPING_TERM_DOWN\": 31858,\n  \"CAPS_WORD_TOGGLE\": 31859,\n  \"AUTOCORRECT_ON\": 31860,\n  \"AUTOCORRECT_OFF\": 31861,\n  \"AUTOCORRECT_TOGGLE\": 31862,\n  \"LAYER_TOGGLE_2\": 21089,\n  \"LAYER_TOGGLE_3\": 21090,\n  \"LAYER_TOGGLE_4\": 21091,\n  \"LAYER_SWITCH_2\": 20993,\n  \"LAYER_SWITCH_3\": 20994,\n  \"LAYER_SWITCH_4\": 20995,\n  \"FN\": 21025,\n  \"LAYER_ACCESS_3\": 21026,\n  \"LAYER_ACCESS_4\": 21027\n}\n"
  },
  {
    "path": "layouts/keymap/qmk_legacy.json",
    "content": "{\n  \"NONE\": 0,\n  \"ROLL_OVER\": 1,\n  \"POST_FAIL\": 2,\n  \"UNDEFINED\": 3,\n  \"A\": 4,\n  \"B\": 5,\n  \"C\": 6,\n  \"D\": 7,\n  \"E\": 8,\n  \"F\": 9,\n  \"G\": 10,\n  \"H\": 11,\n  \"I\": 12,\n  \"J\": 13,\n  \"K\": 14,\n  \"L\": 15,\n  \"M\": 16,\n  \"N\": 17,\n  \"O\": 18,\n  \"P\": 19,\n  \"Q\": 20,\n  \"R\": 21,\n  \"S\": 22,\n  \"T\": 23,\n  \"U\": 24,\n  \"V\": 25,\n  \"W\": 26,\n  \"X\": 27,\n  \"Y\": 28,\n  \"Z\": 29,\n  \"1\": 30,\n  \"2\": 31,\n  \"3\": 32,\n  \"4\": 33,\n  \"5\": 34,\n  \"6\": 35,\n  \"7\": 36,\n  \"8\": 37,\n  \"9\": 38,\n  \"0\": 39,\n  \"ENTER\": 40,\n  \"ESC\": 41,\n  \"BKSP\": 42,\n  \"TAB\": 43,\n  \"SPACE\": 44,\n  \"MINUS\": 45,\n  \"EQUALS\": 46,\n  \"BRACE_OPEN\": 47,\n  \"BRACE_CLOSE\": 48,\n  \"BACKSLASH\": 49,\n  \"NONUS_HASH\": 50,\n  \"SEMICOLON\": 51,\n  \"QUOTE\": 52,\n  \"TICK\": 53,\n  \"COMMA\": 54,\n  \"PERIOD\": 55,\n  \"SLASH\": 56,\n  \"CAPS\": 57,\n  \"F1\": 58,\n  \"F2\": 59,\n  \"F3\": 60,\n  \"F4\": 61,\n  \"F5\": 62,\n  \"F6\": 63,\n  \"F7\": 64,\n  \"F8\": 65,\n  \"F9\": 66,\n  \"F10\": 67,\n  \"F11\": 68,\n  \"F12\": 69,\n  \"PRINT_SCREEN\": 70,\n  \"SCROLL_LOCK\": 71,\n  \"PAUSE\": 72,\n  \"INSERT\": 73,\n  \"HOME\": 74,\n  \"PGUP\": 75,\n  \"DEL\": 76,\n  \"END\": 77,\n  \"PGDN\": 78,\n  \"RIGHT\": 79,\n  \"LEFT\": 80,\n  \"DOWN\": 81,\n  \"UP\": 82,\n  \"NUM_LOCK\": 83,\n  \"NUM_SLASH\": 84,\n  \"NUM_ASTERISK\": 85,\n  \"NUM_MINUS\": 86,\n  \"NUM_PLUS\": 87,\n  \"NUM_ENTER\": 88,\n  \"NUM_1\": 89,\n  \"NUM_2\": 90,\n  \"NUM_3\": 91,\n  \"NUM_4\": 92,\n  \"NUM_5\": 93,\n  \"NUM_6\": 94,\n  \"NUM_7\": 95,\n  \"NUM_8\": 96,\n  \"NUM_9\": 97,\n  \"NUM_0\": 98,\n  \"NUM_PERIOD\": 99,\n  \"NONUS_BSLASH\": 100,\n  \"APP\": 101,\n  \"POWER\": 102,\n  \"NUM_EQUALS\": 103,\n  \"F13\": 104,\n  \"F14\": 105,\n  \"F15\": 106,\n  \"F16\": 107,\n  \"F17\": 108,\n  \"F18\": 109,\n  \"F19\": 110,\n  \"F20\": 111,\n  \"F21\": 112,\n  \"F22\": 113,\n  \"F23\": 114,\n  \"F24\": 115,\n  \"EXECUTE\": 116,\n  \"HELP\": 117,\n  \"MENU\": 118,\n  \"SELECT\": 119,\n  \"STOP\": 120,\n  \"AGAIN\": 121,\n  \"UNDO\": 122,\n  \"CUT\": 123,\n  \"COPY\": 124,\n  \"PASTE\": 125,\n  \"FIND\": 126,\n  \"_MUTE\": 127,\n  \"_VOLUP\": 128,\n  \"_VOLDOWN\": 129,\n  \"LOCKING_CAPS\": 130,\n  \"LOCKING_NUM\": 131,\n  \"LOCKING_SCROLL\": 132,\n  \"NUM_COMMA\": 133,\n  \"KP_EQUAL_AS400\": 134,\n  \"INT1\": 135,\n  \"INT2\": 136,\n  \"INT3\": 137,\n  \"INT4\": 138,\n  \"INT5\": 139,\n  \"INT6\": 140,\n  \"INT7\": 141,\n  \"INT8\": 142,\n  \"INT9\": 143,\n  \"LANG1\": 144,\n  \"LANG2\": 145,\n  \"LANG3\": 146,\n  \"LANG4\": 147,\n  \"LANG5\": 148,\n  \"LANG6\": 149,\n  \"LANG7\": 150,\n  \"LANG8\": 151,\n  \"LANG9\": 152,\n  \"ALT_ERASE\": 153,\n  \"SYSREQ\": 154,\n  \"CANCEL\": 155,\n  \"CLEAR\": 156,\n  \"PRIOR\": 157,\n  \"RETURN\": 158,\n  \"SEPARATOR\": 159,\n  \"OUT\": 160,\n  \"OPER\": 161,\n  \"CLEAR_AGAIN\": 162,\n  \"CRSEL\": 163,\n  \"EXSEL\": 164,\n  \"LEFT_CTRL\": 224,\n  \"LEFT_SHIFT\": 225,\n  \"LEFT_ALT\": 226,\n  \"LEFT_SUPER\": 227,\n  \"RIGHT_CTRL\": 228,\n  \"RIGHT_SHIFT\": 229,\n  \"RIGHT_ALT\": 230,\n  \"RIGHT_SUPER\": 231,\n  \"SYSTEM_POWER\": 165,\n  \"SUSPEND\": 166,\n  \"SYSTEM_WAKE\": 167,\n  \"MUTE\": 168,\n  \"VOLUME_UP\": 169,\n  \"VOLUME_DOWN\": 170,\n  \"MEDIA_NEXT\": 171,\n  \"MEDIA_PREV\": 172,\n  \"MEDIA_STOP\": 173,\n  \"PLAY_PAUSE\": 174,\n  \"MEDIA_SELECT\": 175,\n  \"MEDIA_EJECT\": 176,\n  \"MAIL\": 177,\n  \"CALCULATOR\": 178,\n  \"MY_COMPUTER\": 179,\n  \"WWW_SEARCH\": 180,\n  \"WWW_HOME\": 181,\n  \"WWW_BACK\": 182,\n  \"WWW_FORWARD\": 183,\n  \"WWW_STOP\": 184,\n  \"WWW_REFRESH\": 185,\n  \"WWW_FAVORITES\": 186,\n  \"MEDIA_FAST_FORWARD\": 187,\n  \"MEDIA_REWIND\": 188,\n  \"BRIGHTNESS_UP\": 189,\n  \"BRIGHTNESS_DOWN\": 190,\n  \"FN0\": 192,\n  \"FN1\": 193,\n  \"FN2\": 194,\n  \"FN3\": 195,\n  \"FN4\": 196,\n  \"FN5\": 197,\n  \"FN6\": 198,\n  \"FN7\": 199,\n  \"FN8\": 200,\n  \"FN9\": 201,\n  \"FN10\": 202,\n  \"FN11\": 203,\n  \"FN12\": 204,\n  \"FN13\": 205,\n  \"FN14\": 206,\n  \"FN15\": 207,\n  \"FN16\": 208,\n  \"FN17\": 209,\n  \"FN18\": 210,\n  \"FN19\": 211,\n  \"FN20\": 212,\n  \"FN21\": 213,\n  \"FN22\": 214,\n  \"FN23\": 215,\n  \"FN24\": 216,\n  \"FN25\": 217,\n  \"FN26\": 218,\n  \"FN27\": 219,\n  \"FN28\": 220,\n  \"FN29\": 221,\n  \"FN30\": 222,\n  \"FN31\": 223,\n  \"MS_UP\": 237,\n  \"MS_DOWN\": 238,\n  \"MS_LEFT\": 239,\n  \"MS_RIGHT\": 240,\n  \"MS_BTN1\": 241,\n  \"MS_BTN2\": 242,\n  \"MS_BTN3\": 243,\n  \"MS_BTN4\": 244,\n  \"MS_BTN5\": 245,\n  \"MS_BTN6\": 246,\n  \"MS_BTN7\": 247,\n  \"MS_BTN8\": 248,\n  \"MS_WH_UP\": 249,\n  \"MS_WH_DOWN\": 250,\n  \"MS_WH_LEFT\": 251,\n  \"MS_WH_RIGHT\": 252,\n  \"MS_ACCEL0\": 253,\n  \"MS_ACCEL1\": 254,\n  \"MS_ACCEL2\": 255,\n  \"KBD_TOGGLE\": 23747,\n  \"RGB_MODE_FORWARD\": 23748,\n  \"RGB_MODE_REVERSE\": 23749,\n  \"RGB_HUI\": 23750,\n  \"RGB_HUD\": 23751,\n  \"RGB_SAI\": 23752,\n  \"RGB_SAD\": 23753,\n  \"KBD_UP\": 23754,\n  \"KBD_DOWN\": 23755,\n  \"RGB_SPI\": 23756,\n  \"RGB_SPD\": 23757,\n  \"RGB_MODE_PLAIN\": 23758,\n  \"RGB_MODE_BREATHE\": 23759,\n  \"RGB_MODE_RAINBOW\": 23760,\n  \"RGB_MODE_SWIRL\": 23761,\n  \"RGB_MODE_SNAKE\": 23762,\n  \"RGB_MODE_KNIGHT\": 23763,\n  \"RGB_MODE_XMAS\": 23764,\n  \"RGB_MODE_GRADIENT\": 23765,\n  \"RGB_MODE_RGBTEST\": 23766,\n  \"LAYER_TOGGLE_1\": 21248,\n  \"LAYER_TOGGLE_2\": 21249,\n  \"LAYER_TOGGLE_3\": 21250,\n  \"LAYER_TOGGLE_4\": 21251,\n  \"LAYER_SWITCH_1\": 20496,\n  \"LAYER_SWITCH_2\": 20497,\n  \"LAYER_SWITCH_3\": 20498,\n  \"LAYER_SWITCH_4\": 20499,\n  \"LAYER_ACCESS_1\": 20736,\n  \"FN\": 20737,\n  \"LAYER_ACCESS_3\": 20738,\n  \"LAYER_ACCESS_4\": 20739,\n  \"RESET\": 23552\n}\n"
  },
  {
    "path": "layouts/picker.json",
    "content": "[\n  {\n    \"label\": \"Alphabet keys\",\n    \"cols\": 9,\n    \"width\": 1,\n    \"keys\": [\n      {\n        \"keysym\": \"A\",\n        \"label\": \"A\"\n      },\n      {\n        \"keysym\": \"B\",\n        \"label\": \"B\"\n      },\n      {\n        \"keysym\": \"C\",\n        \"label\": \"C\"\n      },\n      {\n        \"keysym\": \"D\",\n        \"label\": \"D\"\n      },\n      {\n        \"keysym\": \"E\",\n        \"label\": \"E\"\n      },\n      {\n        \"keysym\": \"F\",\n        \"label\": \"F\"\n      },\n      {\n        \"keysym\": \"G\",\n        \"label\": \"G\"\n      },\n      {\n        \"keysym\": \"H\",\n        \"label\": \"H\"\n      },\n      {\n        \"keysym\": \"I\",\n        \"label\": \"I\"\n      },\n      {\n        \"keysym\": \"J\",\n        \"label\": \"J\"\n      },\n      {\n        \"keysym\": \"K\",\n        \"label\": \"K\"\n      },\n      {\n        \"keysym\": \"L\",\n        \"label\": \"L\"\n      },\n      {\n        \"keysym\": \"M\",\n        \"label\": \"M\"\n      },\n      {\n        \"keysym\": \"N\",\n        \"label\": \"N\"\n      },\n      {\n        \"keysym\": \"O\",\n        \"label\": \"O\"\n      },\n      {\n        \"keysym\": \"P\",\n        \"label\": \"P\"\n      },\n      {\n        \"keysym\": \"Q\",\n        \"label\": \"Q\"\n      },\n      {\n        \"keysym\": \"R\",\n        \"label\": \"R\"\n      },\n      {\n        \"keysym\": \"S\",\n        \"label\": \"S\"\n      },\n      {\n        \"keysym\": \"T\",\n        \"label\": \"T\"\n      },\n      {\n        \"keysym\": \"U\",\n        \"label\": \"U\"\n      },\n      {\n        \"keysym\": \"V\",\n        \"label\": \"V\"\n      },\n      {\n        \"keysym\": \"W\",\n        \"label\": \"W\"\n      },\n      {\n        \"keysym\": \"X\",\n        \"label\": \"X\"\n      },\n      {\n        \"keysym\": \"Y\",\n        \"label\": \"Y\"\n      },\n      {\n        \"keysym\": \"Z\",\n        \"label\": \"Z\"\n      }\n    ]\n  },\n  {\n    \"label\": \"Number keys\",\n    \"cols\": 4,\n    \"width\": 1,\n    \"keys\": [\n      {\n        \"keysym\": \"1\",\n        \"label\": \"!\\n1\"\n      },\n      {\n        \"keysym\": \"2\",\n        \"label\": \"@\\n2\"\n      },\n      {\n        \"keysym\": \"3\",\n        \"label\": \"#\\n3\"\n      },\n      {\n        \"keysym\": \"4\",\n        \"label\": \"$\\n4\"\n      },\n      {\n        \"keysym\": \"5\",\n        \"label\": \"%\\n5\"\n      },\n      {\n        \"keysym\": \"6\",\n        \"label\": \"^\\n6\"\n      },\n      {\n        \"keysym\": \"7\",\n        \"label\": \"&\\n7\"\n      },\n      {\n        \"keysym\": \"8\",\n        \"label\": \"*\\n8\"\n      },\n      {\n        \"keysym\": \"9\",\n        \"label\": \"(\\n9\"\n      },\n      {\n        \"keysym\": \"0\",\n        \"label\": \")\\n0\"\n      }\n    ]\n  },\n  {\n    \"label\": \"Modifier keys\",\n    \"cols\": 4,\n    \"width\": 1,\n    \"keys\": [\n      {\n        \"keysym\": \"LEFT_ALT\",\n        \"label\": \"Left Alt\"\n      },\n      {\n        \"keysym\": \"RIGHT_ALT\",\n        \"label\": \"Right Alt\"\n      },\n      {\n        \"keysym\": \"LEFT_CTRL\",\n        \"label\": \"Left Ctrl\"\n      },\n      {\n        \"keysym\": \"RIGHT_CTRL\",\n        \"label\": \"Right Ctrl\"\n      },\n      {\n        \"keysym\": \"LEFT_SHIFT\",\n        \"label\": \"Left Shift\"\n      },\n      {\n        \"keysym\": \"RIGHT_SHIFT\",\n        \"label\": \"Right Shift\"\n      },\n      {\n        \"keysym\": \"LEFT_SUPER\",\n        \"label\": \"Left Super\"\n      },\n      {\n        \"keysym\": \"RIGHT_SUPER\",\n        \"label\": \"Right Super\"\n      }\n    ]\n  },\n  {\n    \"label\": \"Actions\",\n    \"cols\": 4,\n    \"width\": 1,\n    \"keys\": [\n      {\n        \"keysym\": \"ENTER\",\n        \"label\": \"Enter\"\n      },\n      {\n        \"keysym\": \"BKSP\",\n        \"label\": \"Bksp\"\n      },\n      {\n        \"keysym\": \"DEL\",\n        \"label\": \"Del\"\n      },\n      {\n        \"keysym\": \"TAB\",\n        \"label\": \"Tab\"\n      },\n      {\n        \"keysym\": \"SPACE\",\n        \"label\": \"Space\"\n      },\n      {\n        \"keysym\": \"CAPS\",\n        \"label\": \"Caps\"\n      },\n      {\n        \"keysym\": \"APP\",\n        \"label\": \"Menu\"\n      },\n      {\n        \"keysym\": \"ESC\",\n        \"label\": \"Esc\"\n      },\n      {\n        \"keysym\": \"PRINT_SCREEN\",\n        \"label\": \"PrtSc\\nSysrq\"\n      },\n      {\n        \"keysym\": \"INSERT\",\n        \"label\": \"Ins\"\n      },\n      {\n        \"keysym\": \"SCROLL_LOCK\",\n        \"label\": \"Scroll Lock\"\n      },\n      {\n        \"keysym\": \"PAUSE\",\n        \"label\": \"Pause\\nBreak\"\n      },\n      {\n        \"keysym\": \"RESET\",\n        \"label\": \"Reset\"\n      },\n      {\n        \"keysym\": \"ROLL_OVER\",\n        \"label\": \"Reuse\"\n      },\n      {\n        \"keysym\": \"NONE\",\n        \"label\": \"None\"\n      }\n    ]\n  },\n  {\n    \"label\": \"Function keys\",\n    \"cols\": 4,\n    \"width\": 1,\n    \"keys\": [\n      {\n        \"keysym\": \"F1\",\n        \"label\": \"F1\"\n      },\n      {\n        \"keysym\": \"F2\",\n        \"label\": \"F2\"\n      },\n      {\n        \"keysym\": \"F3\",\n        \"label\": \"F3\"\n      },\n      {\n        \"keysym\": \"F4\",\n        \"label\": \"F4\"\n      },\n      {\n        \"keysym\": \"F5\",\n        \"label\": \"F5\"\n      },\n      {\n        \"keysym\": \"F6\",\n        \"label\": \"F6\"\n      },\n      {\n        \"keysym\": \"F7\",\n        \"label\": \"F7\"\n      },\n      {\n        \"keysym\": \"F8\",\n        \"label\": \"F8\"\n      },\n      {\n        \"keysym\": \"F9\",\n        \"label\": \"F9\"\n      },\n      {\n        \"keysym\": \"F10\",\n        \"label\": \"F10\"\n      },\n      {\n        \"keysym\": \"F11\",\n        \"label\": \"F11\"\n      },\n      {\n        \"keysym\": \"F12\",\n        \"label\": \"F12\"\n      }\n    ]\n  },\n  {\n    \"label\": \"Numpad\",\n    \"cols\": 6,\n    \"width\": 1,\n    \"keys\": [\n      {\n        \"keysym\": \"NUM_LOCK\",\n        \"label\": \"Num Lock\"\n      },\n      {\n        \"keysym\": \"NUM_7\",\n        \"label\": \"7\"\n      },\n      {\n        \"keysym\": \"NUM_8\",\n        \"label\": \"8\"\n      },\n      {\n        \"keysym\": \"NUM_9\",\n        \"label\": \"9\"\n      },\n      {\n        \"keysym\": \"NUM_MINUS\",\n        \"label\": \"-\"\n      },\n      {\n        \"keysym\": \"NUM_PLUS\",\n        \"label\": \"+\"\n      },\n      {\n        \"keysym\": \"NUM_SLASH\",\n        \"label\": \"/\"\n      },\n      {\n        \"keysym\": \"NUM_4\",\n        \"label\": \"4\"\n      },\n      {\n        \"keysym\": \"NUM_5\",\n        \"label\": \"5\"\n      },\n      {\n        \"keysym\": \"NUM_6\",\n        \"label\": \"6\"\n      },\n      {\n        \"keysym\": \"NUM_ASTERISK\",\n        \"label\": \"*\"\n      },\n      {\n        \"keysym\": \"NUM_ENTER\",\n        \"label\": \"Enter\"\n      },\n      {\n        \"keysym\": \"NUM_0\",\n        \"label\": \"0\"\n      },\n      {\n        \"keysym\": \"NUM_1\",\n        \"label\": \"1\"\n      },\n      {\n        \"keysym\": \"NUM_2\",\n        \"label\": \"2\"\n      },\n      {\n        \"keysym\": \"NUM_3\",\n        \"label\": \"3\"\n      },\n      {\n        \"keysym\": \"NUM_PERIOD\",\n        \"label\": \".\"\n      }\n    ]\n  },\n  {\n    \"label\": \"Symbols\",\n    \"cols\": 6,\n    \"width\": 1,\n    \"keys\": [\n      {\n        \"keysym\": \"TICK\",\n        \"label\": \"~\\n`\"\n      },\n      {\n        \"keysym\": \"QUOTE\",\n        \"label\": \"\\\"\\n'\"\n      },\n      {\n        \"keysym\": \"SEMICOLON\",\n        \"label\": \":\\n;\"\n      },\n      {\n        \"keysym\": \"MINUS\",\n        \"label\": \"_\\n-\"\n      },\n      {\n        \"keysym\": \"EQUALS\",\n        \"label\": \"+\\n=\"\n      },\n      {\n        \"keysym\": \"SLASH\",\n        \"label\": \"?\\n/\"\n      },\n      {\n        \"keysym\": \"COMMA\",\n        \"label\": \"<\\n,\"\n      },\n      {\n        \"keysym\": \"PERIOD\",\n        \"label\": \">\\n.\"\n      },\n      {\n        \"keysym\": \"BACKSLASH\",\n        \"label\": \"|\\n\\\\\"\n      },\n      {\n        \"keysym\": \"BRACE_OPEN\",\n        \"label\": \"{\\n[\"\n      },\n      {\n        \"keysym\": \"BRACE_CLOSE\",\n        \"label\": \"}\\n]\"\n      },\n      {\n        \"keysym\": \"NONUS_HASH\",\n\t\"label\": \"Non-US #\"\n      },\n      {\n        \"keysym\": \"NONUS_BSLASH\",\n\t\"label\": \"Non-US \\\\\"\n      }\n    ]\n  },\n  {\n    \"label\": \"Navigation\",\n    \"cols\": 4,\n    \"width\": 1,\n    \"keys\": [\n      {\n        \"keysym\": \"LEFT\",\n        \"label\": \"Left\"\n      },\n      {\n        \"keysym\": \"UP\",\n        \"label\": \"Up\"\n      },\n      {\n        \"keysym\": \"DOWN\",\n        \"label\": \"Down\"\n      },\n      {\n        \"keysym\": \"RIGHT\",\n        \"label\": \"Right\"\n      },\n      {\n        \"keysym\": \"HOME\",\n        \"label\": \"Home\"\n      },\n      {\n        \"keysym\": \"PGUP\",\n        \"label\": \"PgUp\"\n      },\n      {\n        \"keysym\": \"PGDN\",\n        \"label\": \"PgDn\"\n      },\n      {\n        \"keysym\": \"END\",\n        \"label\": \"End\"\n      }\n    ]\n  },\n  {\n    \"label\": \"Media\",\n    \"cols\": 3,\n    \"width\": 1,\n    \"keys\": [\n      {\n        \"keysym\": \"MUTE\",\n        \"label\": \"Mute\"\n      },\n      {\n        \"keysym\": \"VOLUME_UP\",\n        \"label\": \"Vol Up\"\n      },\n      {\n        \"keysym\": \"VOLUME_DOWN\",\n        \"label\": \"Vol Down\"\n      },\n      {\n        \"keysym\": \"PLAY_PAUSE\",\n        \"label\": \"Play Pause\"\n      },\n      {\n        \"keysym\": \"MEDIA_NEXT\",\n        \"label\": \"Next Track\"\n      },\n      {\n        \"keysym\": \"MEDIA_PREV\",\n        \"label\": \"Prev Track\"\n      },\n      {\n        \"keysym\": \"MIC_MUTE\",\n        \"label\": \"Mic Mute\"\n      }\n    ]\n  },\n  {\n    \"label\": \"Controls\",\n    \"cols\": 4,\n    \"width\": 2,\n    \"keys\": [\n      {\n        \"keysym\": \"FAN_TOGGLE\",\n        \"label\": \"Fan Toggle\"\n      },\n      {\n        \"keysym\": \"DISPLAY_TOGGLE\",\n        \"label\": \"Screen Toggle\"\n      },\n      {\n        \"keysym\": \"BRIGHTNESS_UP\",\n        \"label\": \"Screen Up\"\n      },\n      {\n        \"keysym\": \"BRIGHTNESS_DOWN\",\n        \"label\": \"Screen Down\"\n      },\n      {\n        \"keysym\": \"DISPLAY_MODE\",\n        \"label\": \"Screen Mode\"\n      },\n      {\n        \"keysym\": \"SUSPEND\",\n        \"label\": \"Suspend\"\n      },\n      {\n        \"keysym\": \"CAMERA_TOGGLE\",\n        \"label\": \"Camera Toggle\"\n      },\n      {\n        \"keysym\": \"AIRPLANE_MODE\",\n        \"label\": \"Airplane Mode\"\n      },\n      {\n        \"keysym\": \"TOUCHPAD\",\n        \"label\": \"Touchpad Toggle\"\n      },\n      {\n        \"keysym\": \"SYSTEM_POWER\",\n        \"label\": \"Power\"\n      }\n    ]\n  },\n  {\n    \"label\": \"LED controls\",\n    \"cols\": 4,\n    \"width\": 1,\n    \"keys\": [\n      {\n        \"keysym\": \"KBD_TOGGLE\",\n        \"label\": \"LED On Off\"\n      },\n      {\n        \"keysym\": \"KBD_UP\",\n        \"label\": \"LED Brighten\"\n      },\n      {\n        \"keysym\": \"KBD_DOWN\",\n        \"label\": \"LED Darken\"\n      },\n      {\n        \"keysym\": \"KBD_BKL\",\n        \"label\": \"LED Cycle\"\n      },\n      {\n        \"keysym\": \"KBD_COLOR\",\n        \"label\": \"LED Color\"\n      }\n    ]\n  },\n  {\n    \"label\": \"Layer keys\",\n    \"cols\": 4,\n    \"width\": 2,\n    \"keys\": [\n      {\n        \"keysym\": \"LAYER_ACCESS_1\",\n        \"label\": \"Access Layer\\u00a01\"\n      },\n      {\n        \"keysym\": \"FN\",\n        \"label\": \"Access Layer\\u00a02\"\n      },\n      {\n        \"keysym\": \"LAYER_ACCESS_3\",\n        \"label\": \"Access Layer\\u00a03\"\n      },\n      {\n        \"keysym\": \"LAYER_ACCESS_4\",\n        \"label\": \"Access Layer\\u00a04\"\n      },\n      {\n        \"keysym\": \"LAYER_SWITCH_1\",\n        \"label\": \"Switch to\\nLayer\\u00a01\"\n      },\n      {\n        \"keysym\": \"LAYER_SWITCH_2\",\n        \"label\": \"Switch to\\nLayer\\u00a02\"\n      },\n      {\n        \"keysym\": \"LAYER_SWITCH_3\",\n        \"label\": \"Switch to\\nLayer\\u00a03\"\n      },\n      {\n        \"keysym\": \"LAYER_SWITCH_4\",\n        \"label\": \"Switch to\\nLayer\\u00a04\"\n      },\n      {\n        \"keysym\": \"FNLOCK\",\n        \"label\": \"FnLock\"\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "layouts/system76/addw1/default.json",
    "content": "{\n  \"model\": \"system76/addw1\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/addw1/meta.json",
    "content": "{\n  \"display_name\": \"Adder WS\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/addw2/default.json",
    "content": "{\n  \"model\": \"system76/addw2\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/addw2/meta.json",
    "content": "{\n  \"display_name\": \"Adder WS\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/addw3/default.json",
    "content": "{\n  \"model\": \"system76/addw3\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/addw3/meta.json",
    "content": "{\n  \"display_name\": \"Adder WS\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/addw4/default.json",
    "content": "{\n  \"model\": \"system76/addw4\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"MIC_MUTE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/addw4/meta.json",
    "content": "{\n  \"display_name\": \"Adder WS\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/18H9LHA04\"\n}\n"
  },
  {
    "path": "layouts/system76/bonw14/default.json",
    "content": "{\n  \"model\": \"system76/bonw14\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/bonw14/meta.json",
    "content": "{\n  \"display_name\": \"Bonobo WS\",\n  \"has_brightness\": false,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102_nkey\"\n}\n"
  },
  {
    "path": "layouts/system76/bonw15/default.json",
    "content": "{\n  \"model\": \"system76/bonw15\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/bonw15/meta.json",
    "content": "{\n  \"display_name\": \"Bonobo WS\",\n  \"has_brightness\": false,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/darp10/default.json",
    "content": "{\n  \"model\": \"system76/darp10\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"MIC_MUTE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"NUM_SLASH\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/darp10/meta.json",
    "content": "{\n  \"display_name\": \"Darter Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/18H9LHA05\"\n}\n"
  },
  {
    "path": "layouts/system76/darp10-b/default.json",
    "content": "{\n  \"model\": \"system76/darp10-b\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"MIC_MUTE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"KBD_BKL\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0E\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0F\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0G\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"PGUP\",\n      \"PGUP\"\n    ],\n    \"K58\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K59\": [\n      \"PGDN\",\n      \"PGDN\"\n    ],\n    \"K60\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K61\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K62\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/darp10-b/meta.json",
    "content": "{\n  \"display_name\": \"Darter Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/14in_83\"\n}\n"
  },
  {
    "path": "layouts/system76/darp11/default.json",
    "content": "{\n  \"model\": \"system76/darp11\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"MIC_MUTE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"NUM_SLASH\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/darp11/meta.json",
    "content": "{\n  \"display_name\": \"Darter Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/18H9LHA05\"\n}\n"
  },
  {
    "path": "layouts/system76/darp11-b/default.json",
    "content": "{\n  \"model\": \"system76/darp11-b\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"MIC_MUTE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"KBD_BKL\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0E\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0F\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0G\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"PGUP\",\n      \"PGUP\"\n    ],\n    \"K58\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K59\": [\n      \"PGDN\",\n      \"PGDN\"\n    ],\n    \"K60\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K61\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K62\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/darp11-b/meta.json",
    "content": "{\n  \"display_name\": \"Darter Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/14in_83\"\n}\n"
  },
  {
    "path": "layouts/system76/darp5/default.json",
    "content": "{\n  \"model\": \"system76/darp5\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/darp5/meta.json",
    "content": "{\n  \"display_name\": \"Darter Pro\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/darp6/default.json",
    "content": "{\n  \"model\": \"system76/darp6\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/darp6/meta.json",
    "content": "{\n  \"display_name\": \"Darter Pro\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/darp7/default.json",
    "content": "{\n  \"model\": \"system76/darp7\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/darp7/meta.json",
    "content": "{\n  \"display_name\": \"Darter Pro\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/darp8/default.json",
    "content": "{\n  \"model\": \"system76/darp8\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/darp8/meta.json",
    "content": "{\n  \"display_name\": \"Darter Pro\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/darp9/default.json",
    "content": "{\n  \"model\": \"system76/darp9\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"MIC_MUTE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_BKL\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/darp9/meta.json",
    "content": "{\n  \"display_name\": \"Darter Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/18H9LHA05\"\n}\n"
  },
  {
    "path": "layouts/system76/galp3-c/default.json",
    "content": "{\n  \"model\": \"system76/galp3-c\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"KBD_BKL\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"PAUSE\",\n      \"PAUSE\"\n    ],\n    \"K0F\": [\n      \"INSERT\",\n      \"NUM_LOCK\"\n    ],\n    \"K0G\": [\n      \"DEL\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"NUM_7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"NUM_8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"NUM_9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"NUM_ASTERISK\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"NUM_4\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"NUM_5\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"NUM_6\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"NUM_SLASH\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"PGUP\",\n      \"PGUP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"NUM_1\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"NUM_2\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"NUM_3\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"NUM_MINUS\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K3D\": [\n      \"PGDN\",\n      \"PGDN\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"NUM_0\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"NUM_PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"NUM_PLUS\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/galp3-c/meta.json",
    "content": "{\n  \"display_name\": \"Galago Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/14in_86\"\n}\n"
  },
  {
    "path": "layouts/system76/galp4/default.json",
    "content": "{\n  \"model\": \"system76/galp4\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"KBD_BKL\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"PAUSE\",\n      \"PAUSE\"\n    ],\n    \"K0F\": [\n      \"INSERT\",\n      \"NUM_LOCK\"\n    ],\n    \"K0G\": [\n      \"DEL\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"NUM_7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"NUM_8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"NUM_9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"NUM_ASTERISK\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"NUM_4\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"NUM_5\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"NUM_6\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"NUM_SLASH\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"PGUP\",\n      \"PGUP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"NUM_1\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"NUM_2\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"NUM_3\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"NUM_MINUS\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K3D\": [\n      \"PGDN\",\n      \"PGDN\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"NUM_0\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"NUM_PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"NUM_PLUS\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/galp4/meta.json",
    "content": "{\n  \"display_name\": \"Galago Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/14in_86\"\n}\n"
  },
  {
    "path": "layouts/system76/galp5/default.json",
    "content": "{\n  \"model\": \"system76/galp5\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"KBD_BKL\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0E\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0F\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0G\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"PGUP\",\n      \"PGUP\"\n    ],\n    \"K58\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K59\": [\n      \"PGDN\",\n      \"PGDN\"\n    ],\n    \"K60\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K61\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K62\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/galp5/meta.json",
    "content": "{\n  \"display_name\": \"Galago Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/14in_83\"\n}\n"
  },
  {
    "path": "layouts/system76/galp6/default.json",
    "content": "{\n  \"model\": \"system76/galp6\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"KBD_BKL\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0E\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0F\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0G\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"PGUP\",\n      \"PGUP\"\n    ],\n    \"K58\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K59\": [\n      \"PGDN\",\n      \"PGDN\"\n    ],\n    \"K60\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K61\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K62\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/galp6/meta.json",
    "content": "{\n  \"display_name\": \"Galago Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/14in_83\"\n}\n"
  },
  {
    "path": "layouts/system76/galp7/default.json",
    "content": "{\n  \"model\": \"system76/galp7\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"KBD_BKL\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0E\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0F\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0G\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"PGUP\",\n      \"PGUP\"\n    ],\n    \"K58\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K59\": [\n      \"PGDN\",\n      \"PGDN\"\n    ],\n    \"K60\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K61\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K62\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/galp7/meta.json",
    "content": "{\n  \"display_name\": \"Galago Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/14in_83\"\n}\n"
  },
  {
    "path": "layouts/system76/gaze15/default.json",
    "content": "{\n  \"model\": \"system76/gaze15\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/gaze15/meta.json",
    "content": "{\n  \"display_name\": \"Gazelle\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/gaze16-3050/default.json",
    "content": "{\n  \"model\": \"system76/gaze16-3050\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/gaze16-3050/meta.json",
    "content": "{\n  \"display_name\": \"Gazelle\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/gaze16-3060/default.json",
    "content": "{\n  \"model\": \"system76/gaze16-3060\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/gaze16-3060/meta.json",
    "content": "{\n  \"display_name\": \"Gazelle\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/gaze16-3060-b/default.json",
    "content": "{\n  \"model\": \"system76/gaze16-3060-b\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/gaze16-3060-b/meta.json",
    "content": "{\n  \"display_name\": \"Gazelle\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/gaze17-3050/default.json",
    "content": "{\n  \"model\": \"system76/gaze17-3050\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/gaze17-3050/meta.json",
    "content": "{\n  \"display_name\": \"Gazelle\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/gaze17-3060-b/default.json",
    "content": "{\n  \"model\": \"system76/gaze17-3060-b\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/gaze17-3060-b/meta.json",
    "content": "{\n  \"display_name\": \"Gazelle\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/gaze18/default.json",
    "content": "{\n  \"model\": \"system76/gaze18\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/gaze18/meta.json",
    "content": "{\n  \"display_name\": \"Gazelle\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/gaze20/default.json",
    "content": "{\n  \"model\": \"system76/gaze20\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"MIC_MUTE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/gaze20/meta.json",
    "content": "{\n  \"display_name\": \"Gazelle\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/launch_1/default.json",
    "content": "{\n  \"model\": \"system76/launch_1\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"RESET\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0D\": [\n      \"DEL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0E\": [\n      \"HOME\",\n      \"PLAY_PAUSE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"KBD_TOGGLE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"KBD_DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"KBD_UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1E\": [\n      \"PGUP\",\n      \"VOLUME_UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"PRINT_SCREEN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"HOME\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"PGDN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"PGUP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"END\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2E\": [\n      \"PGDN\",\n      \"VOLUME_DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"LEFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"RIGHT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3D\": [\n      \"END\",\n      \"MUTE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"PGUP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K51\": [\n      \"LEFT_ALT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K52\": [\n      \"FN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K53\": [\n      \"LEFT_SUPER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K55\": [\n      \"SPACE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K57\": [\n      \"RIGHT_ALT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K58\": [\n      \"FN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K59\": [\n      \"LEFT\",\n      \"HOME\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K5A\": [\n      \"DOWN\",\n      \"PGDN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K5B\": [\n      \"RIGHT\",\n      \"END\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ]\n  },\n  \"key_leds\": {\n    \"K00\": null,\n    \"K01\": null,\n    \"K02\": null,\n    \"K03\": null,\n    \"K04\": null,\n    \"K05\": null,\n    \"K06\": null,\n    \"K07\": null,\n    \"K08\": null,\n    \"K09\": null,\n    \"K0A\": null,\n    \"K0B\": null,\n    \"K0C\": null,\n    \"K0D\": null,\n    \"K0E\": null,\n    \"K10\": null,\n    \"K11\": null,\n    \"K12\": null,\n    \"K13\": null,\n    \"K14\": null,\n    \"K15\": null,\n    \"K16\": null,\n    \"K17\": null,\n    \"K18\": null,\n    \"K19\": null,\n    \"K1A\": null,\n    \"K1B\": null,\n    \"K1C\": null,\n    \"K1D\": null,\n    \"K1E\": null,\n    \"K20\": null,\n    \"K21\": null,\n    \"K22\": null,\n    \"K23\": null,\n    \"K24\": null,\n    \"K25\": null,\n    \"K26\": null,\n    \"K27\": null,\n    \"K28\": null,\n    \"K29\": null,\n    \"K2A\": null,\n    \"K2B\": null,\n    \"K2C\": null,\n    \"K2D\": null,\n    \"K2E\": null,\n    \"K30\": null,\n    \"K31\": null,\n    \"K32\": null,\n    \"K33\": null,\n    \"K34\": null,\n    \"K35\": null,\n    \"K36\": null,\n    \"K37\": null,\n    \"K38\": null,\n    \"K39\": null,\n    \"K3A\": null,\n    \"K3B\": null,\n    \"K3C\": null,\n    \"K3D\": null,\n    \"K40\": null,\n    \"K41\": null,\n    \"K42\": null,\n    \"K43\": null,\n    \"K44\": null,\n    \"K45\": null,\n    \"K46\": null,\n    \"K47\": null,\n    \"K48\": null,\n    \"K49\": null,\n    \"K4A\": null,\n    \"K4B\": null,\n    \"K4C\": null,\n    \"K50\": null,\n    \"K51\": null,\n    \"K52\": null,\n    \"K53\": null,\n    \"K54\": null,\n    \"K55\": null,\n    \"K56\": null,\n    \"K57\": null,\n    \"K58\": null,\n    \"K59\": null,\n    \"K5A\": null,\n    \"K5B\": null\n  },\n  \"layers\": [\n    {\n      \"mode\": [\n        7,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/launch_1/meta.json",
    "content": "{\n  \"display_name\": \"Launch Keyboard\",\n  \"has_mode\": true,\n  \"has_per_layer\": true,\n  \"num_layers\": 4,\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"is_qmk\": true,\n  \"has_mod_tap\": true,\n  \"no_fn_f\": true,\n  \"pressed_color\": \"#202020\",\n  \"keyboard\": \"system76/launch_1\"\n}\n"
  },
  {
    "path": "layouts/system76/launch_2/default.json",
    "content": "{\n  \"model\": \"system76/launch_2\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"RESET\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0D\": [\n      \"DEL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0E\": [\n      \"HOME\",\n      \"PLAY_PAUSE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"KBD_TOGGLE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"KBD_DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"KBD_UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1E\": [\n      \"PGUP\",\n      \"VOLUME_UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"PRINT_SCREEN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"HOME\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"PGDN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"PGUP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"END\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2E\": [\n      \"PGDN\",\n      \"VOLUME_DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"LEFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"RIGHT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3D\": [\n      \"END\",\n      \"MUTE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"PGUP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K51\": [\n      \"LEFT_ALT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K52\": [\n      \"FN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K53\": [\n      \"LEFT_SUPER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K55\": [\n      \"SPACE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K57\": [\n      \"RIGHT_ALT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K58\": [\n      \"FN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K59\": [\n      \"LEFT\",\n      \"HOME\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K5A\": [\n      \"DOWN\",\n      \"PGDN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K5B\": [\n      \"RIGHT\",\n      \"END\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ]\n  },\n  \"key_leds\": {\n    \"K00\": null,\n    \"K01\": null,\n    \"K02\": null,\n    \"K03\": null,\n    \"K04\": null,\n    \"K05\": null,\n    \"K06\": null,\n    \"K07\": null,\n    \"K08\": null,\n    \"K09\": null,\n    \"K0A\": null,\n    \"K0B\": null,\n    \"K0C\": null,\n    \"K0D\": null,\n    \"K0E\": null,\n    \"K10\": null,\n    \"K11\": null,\n    \"K12\": null,\n    \"K13\": null,\n    \"K14\": null,\n    \"K15\": null,\n    \"K16\": null,\n    \"K17\": null,\n    \"K18\": null,\n    \"K19\": null,\n    \"K1A\": null,\n    \"K1B\": null,\n    \"K1C\": null,\n    \"K1D\": null,\n    \"K1E\": null,\n    \"K20\": null,\n    \"K21\": null,\n    \"K22\": null,\n    \"K23\": null,\n    \"K24\": null,\n    \"K25\": null,\n    \"K26\": null,\n    \"K27\": null,\n    \"K28\": null,\n    \"K29\": null,\n    \"K2A\": null,\n    \"K2B\": null,\n    \"K2C\": null,\n    \"K2D\": null,\n    \"K2E\": null,\n    \"K30\": null,\n    \"K31\": null,\n    \"K32\": null,\n    \"K33\": null,\n    \"K34\": null,\n    \"K35\": null,\n    \"K36\": null,\n    \"K37\": null,\n    \"K38\": null,\n    \"K39\": null,\n    \"K3A\": null,\n    \"K3B\": null,\n    \"K3C\": null,\n    \"K3D\": null,\n    \"K40\": null,\n    \"K41\": null,\n    \"K42\": null,\n    \"K43\": null,\n    \"K44\": null,\n    \"K45\": null,\n    \"K46\": null,\n    \"K47\": null,\n    \"K48\": null,\n    \"K49\": null,\n    \"K4A\": null,\n    \"K4B\": null,\n    \"K4C\": null,\n    \"K50\": null,\n    \"K51\": null,\n    \"K52\": null,\n    \"K53\": null,\n    \"K54\": null,\n    \"K55\": null,\n    \"K56\": null,\n    \"K57\": null,\n    \"K58\": null,\n    \"K59\": null,\n    \"K5A\": null,\n    \"K5B\": null\n  },\n  \"layers\": [\n    {\n      \"mode\": [\n        7,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/launch_2/meta.json",
    "content": "{\n  \"display_name\": \"Launch Keyboard\",\n  \"has_mode\": true,\n  \"has_per_layer\": true,\n  \"num_layers\": 4,\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"is_qmk\": true,\n  \"has_mod_tap\": true,\n  \"no_fn_f\": true,\n  \"pressed_color\": \"#202020\",\n  \"keyboard\": \"system76/launch_2\"\n}\n"
  },
  {
    "path": "layouts/system76/launch_3/default.json",
    "content": "{\n  \"model\": \"system76/launch_3\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"RESET\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0D\": [\n      \"DEL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0E\": [\n      \"HOME\",\n      \"PLAY_PAUSE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"KBD_TOGGLE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"KBD_DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"KBD_UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1E\": [\n      \"PGUP\",\n      \"VOLUME_UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"PRINT_SCREEN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"HOME\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"PGDN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"PGUP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"END\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2E\": [\n      \"PGDN\",\n      \"VOLUME_DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"LEFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"RIGHT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3D\": [\n      \"END\",\n      \"MUTE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"PGUP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K51\": [\n      \"LEFT_ALT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K52\": [\n      \"FN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K53\": [\n      \"LEFT_SUPER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K55\": [\n      \"SPACE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K57\": [\n      \"RIGHT_ALT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K58\": [\n      \"FN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K59\": [\n      \"LEFT\",\n      \"HOME\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K5A\": [\n      \"DOWN\",\n      \"PGDN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K5B\": [\n      \"RIGHT\",\n      \"END\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ]\n  },\n  \"key_leds\": {\n    \"K00\": null,\n    \"K01\": null,\n    \"K02\": null,\n    \"K03\": null,\n    \"K04\": null,\n    \"K05\": null,\n    \"K06\": null,\n    \"K07\": null,\n    \"K08\": null,\n    \"K09\": null,\n    \"K0A\": null,\n    \"K0B\": null,\n    \"K0C\": null,\n    \"K0D\": null,\n    \"K0E\": null,\n    \"K10\": null,\n    \"K11\": null,\n    \"K12\": null,\n    \"K13\": null,\n    \"K14\": null,\n    \"K15\": null,\n    \"K16\": null,\n    \"K17\": null,\n    \"K18\": null,\n    \"K19\": null,\n    \"K1A\": null,\n    \"K1B\": null,\n    \"K1C\": null,\n    \"K1D\": null,\n    \"K1E\": null,\n    \"K20\": null,\n    \"K21\": null,\n    \"K22\": null,\n    \"K23\": null,\n    \"K24\": null,\n    \"K25\": null,\n    \"K26\": null,\n    \"K27\": null,\n    \"K28\": null,\n    \"K29\": null,\n    \"K2A\": null,\n    \"K2B\": null,\n    \"K2C\": null,\n    \"K2D\": null,\n    \"K2E\": null,\n    \"K30\": null,\n    \"K31\": null,\n    \"K32\": null,\n    \"K33\": null,\n    \"K34\": null,\n    \"K35\": null,\n    \"K36\": null,\n    \"K37\": null,\n    \"K38\": null,\n    \"K39\": null,\n    \"K3A\": null,\n    \"K3B\": null,\n    \"K3C\": null,\n    \"K3D\": null,\n    \"K40\": null,\n    \"K41\": null,\n    \"K42\": null,\n    \"K43\": null,\n    \"K44\": null,\n    \"K45\": null,\n    \"K46\": null,\n    \"K47\": null,\n    \"K48\": null,\n    \"K49\": null,\n    \"K4A\": null,\n    \"K4B\": null,\n    \"K4C\": null,\n    \"K50\": null,\n    \"K51\": null,\n    \"K52\": null,\n    \"K53\": null,\n    \"K54\": null,\n    \"K55\": null,\n    \"K56\": null,\n    \"K57\": null,\n    \"K58\": null,\n    \"K59\": null,\n    \"K5A\": null,\n    \"K5B\": null\n  },\n  \"layers\": [\n    {\n      \"mode\": [\n        7,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/launch_3/meta.json",
    "content": "{\n  \"display_name\": \"Launch Keyboard\",\n  \"has_mode\": true,\n  \"has_per_layer\": true,\n  \"num_layers\": 4,\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"is_qmk\": true,\n  \"has_mod_tap\": true,\n  \"no_fn_f\": true,\n  \"pressed_color\": \"#202020\",\n  \"keyboard\": \"system76/launch_3\"\n}\n"
  },
  {
    "path": "layouts/system76/launch_alpha_1/default.json",
    "content": "{\n  \"model\": \"system76/launch_alpha_1\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"RESET\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"ROLL_OVER\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"ROLL_OVER\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"ROLL_OVER\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"ROLL_OVER\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"ROLL_OVER\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"ROLL_OVER\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"ROLL_OVER\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"ROLL_OVER\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"ROLL_OVER\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"ROLL_OVER\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"ROLL_OVER\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"ROLL_OVER\"\n    ],\n    \"K0D\": [\n      \"DEL\",\n      \"ROLL_OVER\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"ROLL_OVER\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"ROLL_OVER\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"ROLL_OVER\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"ROLL_OVER\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"ROLL_OVER\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"ROLL_OVER\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"ROLL_OVER\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"ROLL_OVER\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"ROLL_OVER\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"ROLL_OVER\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"ROLL_OVER\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"ROLL_OVER\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"ROLL_OVER\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"ROLL_OVER\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"ROLL_OVER\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"ROLL_OVER\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"ROLL_OVER\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"ROLL_OVER\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"ROLL_OVER\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"ROLL_OVER\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"ROLL_OVER\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"ROLL_OVER\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"ROLL_OVER\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"ROLL_OVER\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"ROLL_OVER\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"ROLL_OVER\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"ROLL_OVER\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"ROLL_OVER\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"ROLL_OVER\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"ROLL_OVER\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"ROLL_OVER\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"ROLL_OVER\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"ROLL_OVER\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"ROLL_OVER\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"ROLL_OVER\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"ROLL_OVER\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"ROLL_OVER\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"ROLL_OVER\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"ROLL_OVER\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"ROLL_OVER\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ROLL_OVER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"ROLL_OVER\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"ROLL_OVER\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"ROLL_OVER\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"ROLL_OVER\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"ROLL_OVER\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"ROLL_OVER\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"ROLL_OVER\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"ROLL_OVER\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"ROLL_OVER\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"ROLL_OVER\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"ROLL_OVER\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"ROLL_OVER\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"PGUP\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"ROLL_OVER\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"ROLL_OVER\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"ROLL_OVER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"ROLL_OVER\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"ROLL_OVER\"\n    ],\n    \"K55\": [\n      \"SPACE\",\n      \"ROLL_OVER\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"ROLL_OVER\"\n    ],\n    \"K57\": [\n      \"RIGHT_ALT\",\n      \"ROLL_OVER\"\n    ],\n    \"K58\": [\n      \"FN\",\n      \"ROLL_OVER\"\n    ],\n    \"K59\": [\n      \"LEFT\",\n      \"HOME\"\n    ],\n    \"K5A\": [\n      \"DOWN\",\n      \"PGDN\"\n    ],\n    \"K5B\": [\n      \"RIGHT\",\n      \"END\"\n    ]\n  },\n  \"key_leds\": {\n    \"K00\": null,\n    \"K01\": null,\n    \"K02\": null,\n    \"K03\": null,\n    \"K04\": null,\n    \"K05\": null,\n    \"K06\": null,\n    \"K07\": null,\n    \"K08\": null,\n    \"K09\": null,\n    \"K0A\": null,\n    \"K0B\": null,\n    \"K0C\": null,\n    \"K0D\": null,\n    \"K10\": null,\n    \"K11\": null,\n    \"K12\": null,\n    \"K13\": null,\n    \"K14\": null,\n    \"K15\": null,\n    \"K16\": null,\n    \"K17\": null,\n    \"K18\": null,\n    \"K19\": null,\n    \"K1A\": null,\n    \"K1B\": null,\n    \"K1C\": null,\n    \"K1D\": null,\n    \"K20\": null,\n    \"K21\": null,\n    \"K22\": null,\n    \"K23\": null,\n    \"K24\": null,\n    \"K25\": null,\n    \"K26\": null,\n    \"K27\": null,\n    \"K28\": null,\n    \"K29\": null,\n    \"K2A\": null,\n    \"K2B\": null,\n    \"K2C\": null,\n    \"K2D\": null,\n    \"K30\": null,\n    \"K31\": null,\n    \"K32\": null,\n    \"K33\": null,\n    \"K34\": null,\n    \"K35\": null,\n    \"K36\": null,\n    \"K37\": null,\n    \"K38\": null,\n    \"K39\": null,\n    \"K3A\": null,\n    \"K3B\": null,\n    \"K3C\": null,\n    \"K40\": null,\n    \"K41\": null,\n    \"K42\": null,\n    \"K43\": null,\n    \"K44\": null,\n    \"K45\": null,\n    \"K46\": null,\n    \"K47\": null,\n    \"K48\": null,\n    \"K49\": null,\n    \"K4A\": null,\n    \"K4B\": null,\n    \"K4C\": null,\n    \"K50\": null,\n    \"K51\": null,\n    \"K52\": null,\n    \"K53\": null,\n    \"K54\": null,\n    \"K55\": null,\n    \"K56\": null,\n    \"K57\": null,\n    \"K58\": null,\n    \"K59\": null,\n    \"K5A\": null,\n    \"K5B\": null\n  },\n  \"layers\": [\n    {\n      \"mode\": [\n        7,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/launch_alpha_1/meta.json",
    "content": "{\n  \"display_name\": \"Launch Alpha Keyboard\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"is_qmk\": true,\n  \"pressed_color\": \"#202020\",\n  \"keyboard\": \"system76/launch_alpha_1\"\n}\n"
  },
  {
    "path": "layouts/system76/launch_alpha_2/default.json",
    "content": "{\n  \"model\": \"system76/launch_alpha_2\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"RESET\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"ROLL_OVER\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"ROLL_OVER\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"ROLL_OVER\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"ROLL_OVER\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"ROLL_OVER\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"ROLL_OVER\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"ROLL_OVER\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"ROLL_OVER\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"ROLL_OVER\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"ROLL_OVER\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"ROLL_OVER\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"ROLL_OVER\"\n    ],\n    \"K0D\": [\n      \"DEL\",\n      \"ROLL_OVER\"\n    ],\n    \"K0E\": [\n      \"HOME\",\n      \"ROLL_OVER\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"ROLL_OVER\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"ROLL_OVER\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"ROLL_OVER\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"ROLL_OVER\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"ROLL_OVER\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"ROLL_OVER\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"ROLL_OVER\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"ROLL_OVER\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"ROLL_OVER\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"ROLL_OVER\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"ROLL_OVER\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"ROLL_OVER\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"ROLL_OVER\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"ROLL_OVER\"\n    ],\n    \"K1E\": [\n      \"PGUP\",\n      \"ROLL_OVER\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"ROLL_OVER\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"ROLL_OVER\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"ROLL_OVER\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"ROLL_OVER\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"ROLL_OVER\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"ROLL_OVER\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"ROLL_OVER\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"ROLL_OVER\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"ROLL_OVER\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"ROLL_OVER\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"ROLL_OVER\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"ROLL_OVER\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"ROLL_OVER\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"ROLL_OVER\"\n    ],\n    \"K2E\": [\n      \"PGDN\",\n      \"ROLL_OVER\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"ROLL_OVER\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"ROLL_OVER\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"ROLL_OVER\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"ROLL_OVER\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"ROLL_OVER\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"ROLL_OVER\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"ROLL_OVER\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"ROLL_OVER\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"ROLL_OVER\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"ROLL_OVER\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"ROLL_OVER\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"ROLL_OVER\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3D\": [\n      \"END\",\n      \"ROLL_OVER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"ROLL_OVER\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"ROLL_OVER\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"ROLL_OVER\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"ROLL_OVER\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"ROLL_OVER\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"ROLL_OVER\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"ROLL_OVER\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"ROLL_OVER\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"ROLL_OVER\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"ROLL_OVER\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"ROLL_OVER\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"ROLL_OVER\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"PGUP\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"ROLL_OVER\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"ROLL_OVER\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"ROLL_OVER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"ROLL_OVER\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"ROLL_OVER\"\n    ],\n    \"K55\": [\n      \"SPACE\",\n      \"ROLL_OVER\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"ROLL_OVER\"\n    ],\n    \"K57\": [\n      \"RIGHT_ALT\",\n      \"ROLL_OVER\"\n    ],\n    \"K58\": [\n      \"FN\",\n      \"ROLL_OVER\"\n    ],\n    \"K59\": [\n      \"LEFT\",\n      \"HOME\"\n    ],\n    \"K5A\": [\n      \"DOWN\",\n      \"PGDN\"\n    ],\n    \"K5B\": [\n      \"RIGHT\",\n      \"END\"\n    ]\n  },\n  \"key_leds\": {\n    \"K00\": null,\n    \"K01\": null,\n    \"K02\": null,\n    \"K03\": null,\n    \"K04\": null,\n    \"K05\": null,\n    \"K06\": null,\n    \"K07\": null,\n    \"K08\": null,\n    \"K09\": null,\n    \"K0A\": null,\n    \"K0B\": null,\n    \"K0C\": null,\n    \"K0D\": null,\n    \"K0E\": null,\n    \"K10\": null,\n    \"K11\": null,\n    \"K12\": null,\n    \"K13\": null,\n    \"K14\": null,\n    \"K15\": null,\n    \"K16\": null,\n    \"K17\": null,\n    \"K18\": null,\n    \"K19\": null,\n    \"K1A\": null,\n    \"K1B\": null,\n    \"K1C\": null,\n    \"K1D\": null,\n    \"K1E\": null,\n    \"K20\": null,\n    \"K21\": null,\n    \"K22\": null,\n    \"K23\": null,\n    \"K24\": null,\n    \"K25\": null,\n    \"K26\": null,\n    \"K27\": null,\n    \"K28\": null,\n    \"K29\": null,\n    \"K2A\": null,\n    \"K2B\": null,\n    \"K2C\": null,\n    \"K2D\": null,\n    \"K2E\": null,\n    \"K30\": null,\n    \"K31\": null,\n    \"K32\": null,\n    \"K33\": null,\n    \"K34\": null,\n    \"K35\": null,\n    \"K36\": null,\n    \"K37\": null,\n    \"K38\": null,\n    \"K39\": null,\n    \"K3A\": null,\n    \"K3B\": null,\n    \"K3C\": null,\n    \"K3D\": null,\n    \"K40\": null,\n    \"K41\": null,\n    \"K42\": null,\n    \"K43\": null,\n    \"K44\": null,\n    \"K45\": null,\n    \"K46\": null,\n    \"K47\": null,\n    \"K48\": null,\n    \"K49\": null,\n    \"K4A\": null,\n    \"K4B\": null,\n    \"K4C\": null,\n    \"K50\": null,\n    \"K51\": null,\n    \"K52\": null,\n    \"K53\": null,\n    \"K54\": null,\n    \"K55\": null,\n    \"K56\": null,\n    \"K57\": null,\n    \"K58\": null,\n    \"K59\": null,\n    \"K5A\": null,\n    \"K5B\": null\n  },\n  \"layers\": [\n    {\n      \"mode\": [\n        7,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/launch_alpha_2/meta.json",
    "content": "{\n  \"display_name\": \"Launch Alpha Keyboard\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"is_qmk\": true,\n  \"pressed_color\": \"#202020\",\n  \"keyboard\": \"system76/launch_alpha_2\"\n}\n"
  },
  {
    "path": "layouts/system76/launch_heavy_1/default.json",
    "content": "{\n  \"model\": \"system76/launch_heavy_1\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"RESET\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0D\": [\n      \"DEL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0E\": [\n      \"HOME\",\n      \"PLAY_PAUSE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0F\": [\n      \"PRINT_SCREEN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0G\": [\n      \"MEDIA_PREV\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0H\": [\n      \"PLAY_PAUSE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0I\": [\n      \"MEDIA_NEXT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"KBD_TOGGLE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"KBD_DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"KBD_UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1E\": [\n      \"PGUP\",\n      \"VOLUME_UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1F\": [\n      \"NUM_LOCK\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1G\": [\n      \"NUM_SLASH\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1H\": [\n      \"NUM_ASTERISK\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1I\": [\n      \"NUM_MINUS\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"PRINT_SCREEN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"HOME\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"PGDN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"PGUP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"END\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2E\": [\n      \"PGDN\",\n      \"VOLUME_DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2F\": [\n      \"NUM_7\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2G\": [\n      \"NUM_8\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2H\": [\n      \"NUM_9\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2I\": [\n      \"NUM_PLUS\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"LEFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"RIGHT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3D\": [\n      \"END\",\n      \"MUTE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3E\": [\n      \"NUM_4\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3F\": [\n      \"NUM_5\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3G\": [\n      \"NUM_6\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"PGUP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K51\": [\n      \"LEFT_ALT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K52\": [\n      \"FN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K53\": [\n      \"LEFT_SUPER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K55\": [\n      \"SPACE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K57\": [\n      \"RIGHT_ALT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K58\": [\n      \"FN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K59\": [\n      \"LEFT\",\n      \"HOME\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K5A\": [\n      \"DOWN\",\n      \"PGDN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K5B\": [\n      \"RIGHT\",\n      \"END\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K5C\": [\n      \"NUM_0\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K5D\": [\n      \"NUM_PERIOD\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ]\n  },\n  \"key_leds\": {\n    \"K00\": null,\n    \"K01\": null,\n    \"K02\": null,\n    \"K03\": null,\n    \"K04\": null,\n    \"K05\": null,\n    \"K06\": null,\n    \"K07\": null,\n    \"K08\": null,\n    \"K09\": null,\n    \"K0A\": null,\n    \"K0B\": null,\n    \"K0C\": null,\n    \"K0D\": null,\n    \"K0E\": null,\n    \"K0F\": null,\n    \"K0G\": null,\n    \"K0H\": null,\n    \"K0I\": null,\n    \"K10\": null,\n    \"K11\": null,\n    \"K12\": null,\n    \"K13\": null,\n    \"K14\": null,\n    \"K15\": null,\n    \"K16\": null,\n    \"K17\": null,\n    \"K18\": null,\n    \"K19\": null,\n    \"K1A\": null,\n    \"K1B\": null,\n    \"K1C\": null,\n    \"K1D\": null,\n    \"K1E\": null,\n    \"K1F\": null,\n    \"K1G\": null,\n    \"K1H\": null,\n    \"K1I\": null,\n    \"K20\": null,\n    \"K21\": null,\n    \"K22\": null,\n    \"K23\": null,\n    \"K24\": null,\n    \"K25\": null,\n    \"K26\": null,\n    \"K27\": null,\n    \"K28\": null,\n    \"K29\": null,\n    \"K2A\": null,\n    \"K2B\": null,\n    \"K2C\": null,\n    \"K2D\": null,\n    \"K2E\": null,\n    \"K2F\": null,\n    \"K2G\": null,\n    \"K2H\": null,\n    \"K2I\": null,\n    \"K30\": null,\n    \"K31\": null,\n    \"K32\": null,\n    \"K33\": null,\n    \"K34\": null,\n    \"K35\": null,\n    \"K36\": null,\n    \"K37\": null,\n    \"K38\": null,\n    \"K39\": null,\n    \"K3A\": null,\n    \"K3B\": null,\n    \"K3C\": null,\n    \"K3D\": null,\n    \"K3E\": null,\n    \"K3F\": null,\n    \"K3G\": null,\n    \"K40\": null,\n    \"K41\": null,\n    \"K42\": null,\n    \"K43\": null,\n    \"K44\": null,\n    \"K45\": null,\n    \"K46\": null,\n    \"K47\": null,\n    \"K48\": null,\n    \"K49\": null,\n    \"K4A\": null,\n    \"K4B\": null,\n    \"K4C\": null,\n    \"K4D\": null,\n    \"K4E\": null,\n    \"K4F\": null,\n    \"K4G\": null,\n    \"K50\": null,\n    \"K51\": null,\n    \"K52\": null,\n    \"K53\": null,\n    \"K54\": null,\n    \"K55\": null,\n    \"K56\": null,\n    \"K57\": null,\n    \"K58\": null,\n    \"K59\": null,\n    \"K5A\": null,\n    \"K5B\": null,\n    \"K5C\": null,\n    \"K5D\": null\n  },\n  \"layers\": [\n    {\n      \"mode\": [\n        7,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/launch_heavy_1/meta.json",
    "content": "{\n  \"display_name\": \"Launch Heavy Keyboard\",\n  \"has_mode\": true,\n  \"has_per_layer\": true,\n  \"num_layers\": 4,\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"is_qmk\": true,\n  \"has_mod_tap\": true,\n  \"no_fn_f\": true,\n  \"pressed_color\": \"#202020\",\n  \"keyboard\": \"system76/launch_heavy_1\"\n}\n"
  },
  {
    "path": "layouts/system76/launch_heavy_3/default.json",
    "content": "{\n  \"model\": \"system76/launch_heavy_3\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"RESET\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0D\": [\n      \"DEL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0E\": [\n      \"HOME\",\n      \"PLAY_PAUSE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0F\": [\n      \"PRINT_SCREEN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0G\": [\n      \"MEDIA_PREV\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0H\": [\n      \"PLAY_PAUSE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0I\": [\n      \"MEDIA_NEXT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"KBD_TOGGLE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"KBD_DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"KBD_UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1E\": [\n      \"PGUP\",\n      \"VOLUME_UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1F\": [\n      \"NUM_LOCK\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1G\": [\n      \"NUM_SLASH\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1H\": [\n      \"NUM_ASTERISK\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1I\": [\n      \"NUM_MINUS\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"PRINT_SCREEN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"HOME\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"PGDN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"PGUP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"END\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2E\": [\n      \"PGDN\",\n      \"VOLUME_DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2F\": [\n      \"NUM_7\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2G\": [\n      \"NUM_8\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2H\": [\n      \"NUM_9\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2I\": [\n      \"NUM_PLUS\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"LEFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"RIGHT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3D\": [\n      \"END\",\n      \"MUTE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3E\": [\n      \"NUM_4\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3F\": [\n      \"NUM_5\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3G\": [\n      \"NUM_6\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"PGUP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K51\": [\n      \"LEFT_ALT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K52\": [\n      \"FN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K53\": [\n      \"LEFT_SUPER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K55\": [\n      \"SPACE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K57\": [\n      \"RIGHT_ALT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K58\": [\n      \"FN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K59\": [\n      \"LEFT\",\n      \"HOME\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K5A\": [\n      \"DOWN\",\n      \"PGDN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K5B\": [\n      \"RIGHT\",\n      \"END\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K5C\": [\n      \"NUM_0\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K5D\": [\n      \"NUM_PERIOD\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ]\n  },\n  \"key_leds\": {\n    \"K00\": null,\n    \"K01\": null,\n    \"K02\": null,\n    \"K03\": null,\n    \"K04\": null,\n    \"K05\": null,\n    \"K06\": null,\n    \"K07\": null,\n    \"K08\": null,\n    \"K09\": null,\n    \"K0A\": null,\n    \"K0B\": null,\n    \"K0C\": null,\n    \"K0D\": null,\n    \"K0E\": null,\n    \"K0F\": null,\n    \"K0G\": null,\n    \"K0H\": null,\n    \"K0I\": null,\n    \"K10\": null,\n    \"K11\": null,\n    \"K12\": null,\n    \"K13\": null,\n    \"K14\": null,\n    \"K15\": null,\n    \"K16\": null,\n    \"K17\": null,\n    \"K18\": null,\n    \"K19\": null,\n    \"K1A\": null,\n    \"K1B\": null,\n    \"K1C\": null,\n    \"K1D\": null,\n    \"K1E\": null,\n    \"K1F\": null,\n    \"K1G\": null,\n    \"K1H\": null,\n    \"K1I\": null,\n    \"K20\": null,\n    \"K21\": null,\n    \"K22\": null,\n    \"K23\": null,\n    \"K24\": null,\n    \"K25\": null,\n    \"K26\": null,\n    \"K27\": null,\n    \"K28\": null,\n    \"K29\": null,\n    \"K2A\": null,\n    \"K2B\": null,\n    \"K2C\": null,\n    \"K2D\": null,\n    \"K2E\": null,\n    \"K2F\": null,\n    \"K2G\": null,\n    \"K2H\": null,\n    \"K2I\": null,\n    \"K30\": null,\n    \"K31\": null,\n    \"K32\": null,\n    \"K33\": null,\n    \"K34\": null,\n    \"K35\": null,\n    \"K36\": null,\n    \"K37\": null,\n    \"K38\": null,\n    \"K39\": null,\n    \"K3A\": null,\n    \"K3B\": null,\n    \"K3C\": null,\n    \"K3D\": null,\n    \"K3E\": null,\n    \"K3F\": null,\n    \"K3G\": null,\n    \"K40\": null,\n    \"K41\": null,\n    \"K42\": null,\n    \"K43\": null,\n    \"K44\": null,\n    \"K45\": null,\n    \"K46\": null,\n    \"K47\": null,\n    \"K48\": null,\n    \"K49\": null,\n    \"K4A\": null,\n    \"K4B\": null,\n    \"K4C\": null,\n    \"K4D\": null,\n    \"K4E\": null,\n    \"K4F\": null,\n    \"K4G\": null,\n    \"K50\": null,\n    \"K51\": null,\n    \"K52\": null,\n    \"K53\": null,\n    \"K54\": null,\n    \"K55\": null,\n    \"K56\": null,\n    \"K57\": null,\n    \"K58\": null,\n    \"K59\": null,\n    \"K5A\": null,\n    \"K5B\": null,\n    \"K5C\": null,\n    \"K5D\": null\n  },\n  \"layers\": [\n    {\n      \"mode\": [\n        7,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/launch_heavy_3/meta.json",
    "content": "{\n  \"display_name\": \"Launch Heavy Keyboard\",\n  \"has_mode\": true,\n  \"has_per_layer\": true,\n  \"num_layers\": 4,\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"is_qmk\": true,\n  \"has_mod_tap\": true,\n  \"no_fn_f\": true,\n  \"pressed_color\": \"#202020\",\n  \"keyboard\": \"system76/launch_heavy_3\"\n}\n"
  },
  {
    "path": "layouts/system76/launch_lite_1/default.json",
    "content": "{\n  \"model\": \"system76/launch_lite_1\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"TICK\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K01\": [\n      \"1\",\n      \"F1\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K02\": [\n      \"2\",\n      \"F2\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K03\": [\n      \"3\",\n      \"F3\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K04\": [\n      \"4\",\n      \"F4\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K05\": [\n      \"5\",\n      \"F5\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K06\": [\n      \"6\",\n      \"F6\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K07\": [\n      \"7\",\n      \"F7\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K08\": [\n      \"8\",\n      \"F8\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K09\": [\n      \"9\",\n      \"F9\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0A\": [\n      \"0\",\n      \"F10\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0B\": [\n      \"MINUS\",\n      \"F11\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0C\": [\n      \"EQUALS\",\n      \"F12\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0D\": [\n      \"BKSP\",\n      \"DEL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K0E\": [\n      \"HOME\",\n      \"PLAY_PAUSE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K10\": [\n      \"TAB\",\n      \"PRINT_SCREEN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K11\": [\n      \"Q\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K12\": [\n      \"W\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K13\": [\n      \"E\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K14\": [\n      \"R\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K15\": [\n      \"T\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K16\": [\n      \"Y\",\n      \"HOME\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K17\": [\n      \"U\",\n      \"PGDN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K18\": [\n      \"I\",\n      \"PGUP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K19\": [\n      \"O\",\n      \"END\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1A\": [\n      \"P\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1B\": [\n      \"BRACE_OPEN\",\n      \"KBD_DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1C\": [\n      \"BRACE_CLOSE\",\n      \"KBD_UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1D\": [\n      \"BACKSLASH\",\n      \"KBD_TOGGLE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K1E\": [\n      \"PGUP\",\n      \"VOLUME_UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K20\": [\n      \"CAPS\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K21\": [\n      \"A\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K22\": [\n      \"S\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K23\": [\n      \"D\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K24\": [\n      \"F\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K25\": [\n      \"G\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K26\": [\n      \"H\",\n      \"LEFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K27\": [\n      \"J\",\n      \"DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K28\": [\n      \"K\",\n      \"UP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K29\": [\n      \"L\",\n      \"RIGHT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2A\": [\n      \"SEMICOLON\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2B\": [\n      \"QUOTE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2C\": [\n      \"ENTER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K2D\": [\n      \"PGDN\",\n      \"VOLUME_DOWN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K30\": [\n      \"LEFT_SHIFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K31\": [\n      \"Z\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K32\": [\n      \"X\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K33\": [\n      \"C\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K34\": [\n      \"V\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K35\": [\n      \"B\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K36\": [\n      \"N\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K37\": [\n      \"M\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K38\": [\n      \"COMMA\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K39\": [\n      \"PERIOD\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3A\": [\n      \"SLASH\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3B\": [\n      \"RIGHT_SHIFT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3C\": [\n      \"UP\",\n      \"PGUP\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K3D\": [\n      \"END\",\n      \"MUTE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K40\": [\n      \"LEFT_CTRL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K41\": [\n      \"LEFT_ALT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K42\": [\n      \"FN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K43\": [\n      \"LEFT_SUPER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K44\": [\n      \"SPACE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K45\": [\n      \"SPACE\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K46\": [\n      \"RIGHT_CTRL\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K47\": [\n      \"RIGHT_ALT\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K48\": [\n      \"FN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K49\": [\n      \"LEFT\",\n      \"HOME\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4A\": [\n      \"DOWN\",\n      \"PGDN\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ],\n    \"K4B\": [\n      \"RIGHT\",\n      \"END\",\n      \"ROLL_OVER\",\n      \"ROLL_OVER\"\n    ]\n  },\n  \"key_leds\": {\n    \"K00\": null,\n    \"K01\": null,\n    \"K02\": null,\n    \"K03\": null,\n    \"K04\": null,\n    \"K05\": null,\n    \"K06\": null,\n    \"K07\": null,\n    \"K08\": null,\n    \"K09\": null,\n    \"K0A\": null,\n    \"K0B\": null,\n    \"K0C\": null,\n    \"K0D\": null,\n    \"K0E\": null,\n    \"K10\": null,\n    \"K11\": null,\n    \"K12\": null,\n    \"K13\": null,\n    \"K14\": null,\n    \"K15\": null,\n    \"K16\": null,\n    \"K17\": null,\n    \"K18\": null,\n    \"K19\": null,\n    \"K1A\": null,\n    \"K1B\": null,\n    \"K1C\": null,\n    \"K1D\": null,\n    \"K1E\": null,\n    \"K20\": null,\n    \"K21\": null,\n    \"K22\": null,\n    \"K23\": null,\n    \"K24\": null,\n    \"K25\": null,\n    \"K26\": null,\n    \"K27\": null,\n    \"K28\": null,\n    \"K29\": null,\n    \"K2A\": null,\n    \"K2B\": null,\n    \"K2C\": null,\n    \"K2D\": null,\n    \"K30\": null,\n    \"K31\": null,\n    \"K32\": null,\n    \"K33\": null,\n    \"K34\": null,\n    \"K35\": null,\n    \"K36\": null,\n    \"K37\": null,\n    \"K38\": null,\n    \"K39\": null,\n    \"K3A\": null,\n    \"K3B\": null,\n    \"K3C\": null,\n    \"K3D\": null,\n    \"K40\": null,\n    \"K41\": null,\n    \"K42\": null,\n    \"K43\": null,\n    \"K44\": null,\n    \"K45\": null,\n    \"K46\": null,\n    \"K47\": null,\n    \"K48\": null,\n    \"K49\": null,\n    \"K4A\": null,\n    \"K4B\": null\n  },\n  \"layers\": [\n    {\n      \"mode\": [\n        7,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    },\n    {\n      \"mode\": [\n        13,\n        127\n      ],\n      \"brightness\": 176,\n      \"color\": [\n        142,\n        255\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/launch_lite_1/meta.json",
    "content": "{\n  \"display_name\": \"Launch Lite Keyboard\",\n  \"has_mode\": true,\n  \"has_per_layer\": true,\n  \"num_layers\": 4,\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"is_qmk\": true,\n  \"has_mod_tap\": true,\n  \"no_fn_f\": true,\n  \"pressed_color\": \"#202020\",\n  \"keyboard\": \"system76/launch_lite_1\"\n}\n"
  },
  {
    "path": "layouts/system76/lemp10/default.json",
    "content": "{\n  \"model\": \"system76/lemp10\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"KBD_BKL\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0E\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0F\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0G\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"PGUP\",\n      \"PGUP\"\n    ],\n    \"K58\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K59\": [\n      \"PGDN\",\n      \"PGDN\"\n    ],\n    \"K60\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K61\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K62\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/lemp10/meta.json",
    "content": "{\n  \"display_name\": \"Lemur Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/14in_83\"\n}\n"
  },
  {
    "path": "layouts/system76/lemp11/default.json",
    "content": "{\n  \"model\": \"system76/lemp11\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"KBD_BKL\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0E\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0F\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0G\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"PGUP\",\n      \"PGUP\"\n    ],\n    \"K58\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K59\": [\n      \"PGDN\",\n      \"PGDN\"\n    ],\n    \"K60\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K61\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K62\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/lemp11/meta.json",
    "content": "{\n  \"display_name\": \"Lemur Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/14in_83\"\n}\n"
  },
  {
    "path": "layouts/system76/lemp12/default.json",
    "content": "{\n  \"model\": \"system76/lemp12\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"KBD_BKL\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0E\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0F\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0G\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"PGUP\",\n      \"PGUP\"\n    ],\n    \"K58\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K59\": [\n      \"PGDN\",\n      \"PGDN\"\n    ],\n    \"K60\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K61\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K62\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/lemp12/meta.json",
    "content": "{\n  \"display_name\": \"Lemur Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/14in_83\"\n}\n"
  },
  {
    "path": "layouts/system76/lemp13/default.json",
    "content": "{\n  \"model\": \"system76/lemp13\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"MIC_MUTE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"KBD_BKL\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"INSERT\"\n    ],\n    \"K0F\": [\n      \"PAUSE\",\n      \"PAUSE\"\n    ],\n    \"K0G\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"PGUP\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"LEFT\",\n      \"HOME\"\n    ],\n    \"K58\": [\n      \"RIGHT\",\n      \"END\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"PGDN\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/lemp13/meta.json",
    "content": "{\n  \"display_name\": \"Lemur Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/14in_81\"\n}\n"
  },
  {
    "path": "layouts/system76/lemp13-b/default.json",
    "content": "{\n  \"model\": \"system76/lemp13-b\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"MIC_MUTE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"KBD_BKL\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0E\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0F\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0G\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"PGUP\",\n      \"PGUP\"\n    ],\n    \"K58\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K59\": [\n      \"PGDN\",\n      \"PGDN\"\n    ],\n    \"K60\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K61\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K62\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/lemp13-b/meta.json",
    "content": "{\n  \"display_name\": \"Lemur Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/14in_83\"\n}\n"
  },
  {
    "path": "layouts/system76/lemp9/default.json",
    "content": "{\n  \"model\": \"system76/lemp9\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"KBD_BKL\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0E\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0F\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0G\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"RIGHT_CTRL\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"PGUP\",\n      \"PGUP\"\n    ],\n    \"K58\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K59\": [\n      \"PGDN\",\n      \"PGDN\"\n    ],\n    \"K60\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K61\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K62\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/lemp9/meta.json",
    "content": "{\n  \"display_name\": \"Lemur Pro\",\n  \"has_brightness\": true,\n  \"has_color\": false,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/14in_83\"\n}\n"
  },
  {
    "path": "layouts/system76/oryp10/default.json",
    "content": "{\n  \"model\": \"system76/oryp10\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/oryp10/meta.json",
    "content": "{\n  \"display_name\": \"Oryx Pro\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/oryp11/default.json",
    "content": "{\n  \"model\": \"system76/oryp11\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"MIC_MUTE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/oryp11/meta.json",
    "content": "{\n  \"display_name\": \"Oryx Pro\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/18H9LHA04\"\n}\n"
  },
  {
    "path": "layouts/system76/oryp12/default.json",
    "content": "{\n  \"model\": \"system76/oryp12\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"MIC_MUTE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/oryp12/meta.json",
    "content": "{\n  \"display_name\": \"Oryx Pro\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/18H9LHA04\"\n}\n"
  },
  {
    "path": "layouts/system76/oryp5/default.json",
    "content": "{\n  \"model\": \"system76/oryp5\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/oryp5/meta.json",
    "content": "{\n  \"display_name\": \"Oryx Pro\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/oryp6/default.json",
    "content": "{\n  \"model\": \"system76/oryp6\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/oryp6/meta.json",
    "content": "{\n  \"display_name\": \"Oryx Pro\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/oryp7/default.json",
    "content": "{\n  \"model\": \"system76/oryp7\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/oryp7/meta.json",
    "content": "{\n  \"display_name\": \"Oryx Pro\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/oryp8/default.json",
    "content": "{\n  \"model\": \"system76/oryp8\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/oryp8/meta.json",
    "content": "{\n  \"display_name\": \"Oryx Pro\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/oryp9/default.json",
    "content": "{\n  \"model\": \"system76/oryp9\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/oryp9/meta.json",
    "content": "{\n  \"display_name\": \"Oryx Pro\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts/system76/serw13/default.json",
    "content": "{\n  \"model\": \"system76/serw13\",\n  \"version\": 1,\n  \"map\": {\n    \"K00\": [\n      \"ESC\",\n      \"ESC\"\n    ],\n    \"K01\": [\n      \"F1\",\n      \"TOUCHPAD\"\n    ],\n    \"K02\": [\n      \"F2\",\n      \"DISPLAY_TOGGLE\"\n    ],\n    \"K03\": [\n      \"F3\",\n      \"MUTE\"\n    ],\n    \"K04\": [\n      \"F4\",\n      \"F4\"\n    ],\n    \"K05\": [\n      \"F5\",\n      \"VOLUME_DOWN\"\n    ],\n    \"K06\": [\n      \"F6\",\n      \"VOLUME_UP\"\n    ],\n    \"K07\": [\n      \"F7\",\n      \"DISPLAY_MODE\"\n    ],\n    \"K08\": [\n      \"F8\",\n      \"BRIGHTNESS_DOWN\"\n    ],\n    \"K09\": [\n      \"F9\",\n      \"BRIGHTNESS_UP\"\n    ],\n    \"K0A\": [\n      \"F10\",\n      \"CAMERA_TOGGLE\"\n    ],\n    \"K0B\": [\n      \"F11\",\n      \"AIRPLANE_MODE\"\n    ],\n    \"K0C\": [\n      \"F12\",\n      \"SUSPEND\"\n    ],\n    \"K0D\": [\n      \"PRINT_SCREEN\",\n      \"PRINT_SCREEN\"\n    ],\n    \"K0E\": [\n      \"INSERT\",\n      \"SCROLL_LOCK\"\n    ],\n    \"K0F\": [\n      \"DEL\",\n      \"DEL\"\n    ],\n    \"K0G\": [\n      \"HOME\",\n      \"HOME\"\n    ],\n    \"K0H\": [\n      \"END\",\n      \"END\"\n    ],\n    \"K0I\": [\n      \"PGUP\",\n      \"PAUSE\"\n    ],\n    \"K0J\": [\n      \"PGDN\",\n      \"PAUSE\"\n    ],\n    \"K10\": [\n      \"TICK\",\n      \"PLAY_PAUSE\"\n    ],\n    \"K11\": [\n      \"1\",\n      \"FAN_TOGGLE\"\n    ],\n    \"K12\": [\n      \"2\",\n      \"2\"\n    ],\n    \"K13\": [\n      \"3\",\n      \"3\"\n    ],\n    \"K14\": [\n      \"4\",\n      \"4\"\n    ],\n    \"K15\": [\n      \"5\",\n      \"5\"\n    ],\n    \"K16\": [\n      \"6\",\n      \"6\"\n    ],\n    \"K17\": [\n      \"7\",\n      \"7\"\n    ],\n    \"K18\": [\n      \"8\",\n      \"8\"\n    ],\n    \"K19\": [\n      \"9\",\n      \"9\"\n    ],\n    \"K1A\": [\n      \"0\",\n      \"0\"\n    ],\n    \"K1B\": [\n      \"MINUS\",\n      \"MINUS\"\n    ],\n    \"K1C\": [\n      \"EQUALS\",\n      \"EQUALS\"\n    ],\n    \"K1D\": [\n      \"BKSP\",\n      \"BKSP\"\n    ],\n    \"K1E\": [\n      \"NUM_LOCK\",\n      \"NUM_LOCK\"\n    ],\n    \"K1F\": [\n      \"NUM_SLASH\",\n      \"KBD_COLOR\"\n    ],\n    \"K1G\": [\n      \"NUM_ASTERISK\",\n      \"KBD_TOGGLE\"\n    ],\n    \"K1H\": [\n      \"NUM_MINUS\",\n      \"KBD_DOWN\"\n    ],\n    \"K20\": [\n      \"TAB\",\n      \"TAB\"\n    ],\n    \"K21\": [\n      \"Q\",\n      \"Q\"\n    ],\n    \"K22\": [\n      \"W\",\n      \"W\"\n    ],\n    \"K23\": [\n      \"E\",\n      \"E\"\n    ],\n    \"K24\": [\n      \"R\",\n      \"R\"\n    ],\n    \"K25\": [\n      \"T\",\n      \"T\"\n    ],\n    \"K26\": [\n      \"Y\",\n      \"Y\"\n    ],\n    \"K27\": [\n      \"U\",\n      \"U\"\n    ],\n    \"K28\": [\n      \"I\",\n      \"I\"\n    ],\n    \"K29\": [\n      \"O\",\n      \"O\"\n    ],\n    \"K2A\": [\n      \"P\",\n      \"P\"\n    ],\n    \"K2B\": [\n      \"BRACE_OPEN\",\n      \"BRACE_OPEN\"\n    ],\n    \"K2C\": [\n      \"BRACE_CLOSE\",\n      \"BRACE_CLOSE\"\n    ],\n    \"K2D\": [\n      \"BACKSLASH\",\n      \"BACKSLASH\"\n    ],\n    \"K2E\": [\n      \"NUM_7\",\n      \"NUM_7\"\n    ],\n    \"K2F\": [\n      \"NUM_8\",\n      \"NUM_8\"\n    ],\n    \"K2G\": [\n      \"NUM_9\",\n      \"NUM_9\"\n    ],\n    \"K2H\": [\n      \"NUM_PLUS\",\n      \"KBD_UP\"\n    ],\n    \"K30\": [\n      \"CAPS\",\n      \"CAPS\"\n    ],\n    \"K31\": [\n      \"A\",\n      \"A\"\n    ],\n    \"K32\": [\n      \"S\",\n      \"S\"\n    ],\n    \"K33\": [\n      \"D\",\n      \"D\"\n    ],\n    \"K34\": [\n      \"F\",\n      \"F\"\n    ],\n    \"K35\": [\n      \"G\",\n      \"G\"\n    ],\n    \"K36\": [\n      \"H\",\n      \"H\"\n    ],\n    \"K37\": [\n      \"J\",\n      \"J\"\n    ],\n    \"K38\": [\n      \"K\",\n      \"K\"\n    ],\n    \"K39\": [\n      \"L\",\n      \"L\"\n    ],\n    \"K3A\": [\n      \"SEMICOLON\",\n      \"SEMICOLON\"\n    ],\n    \"K3B\": [\n      \"QUOTE\",\n      \"QUOTE\"\n    ],\n    \"K3C\": [\n      \"ENTER\",\n      \"ENTER\"\n    ],\n    \"K3D\": [\n      \"NUM_4\",\n      \"NUM_4\"\n    ],\n    \"K3E\": [\n      \"NUM_5\",\n      \"NUM_5\"\n    ],\n    \"K3F\": [\n      \"NUM_6\",\n      \"NUM_6\"\n    ],\n    \"K40\": [\n      \"LEFT_SHIFT\",\n      \"LEFT_SHIFT\"\n    ],\n    \"K41\": [\n      \"Z\",\n      \"Z\"\n    ],\n    \"K42\": [\n      \"X\",\n      \"X\"\n    ],\n    \"K43\": [\n      \"C\",\n      \"C\"\n    ],\n    \"K44\": [\n      \"V\",\n      \"V\"\n    ],\n    \"K45\": [\n      \"B\",\n      \"B\"\n    ],\n    \"K46\": [\n      \"N\",\n      \"N\"\n    ],\n    \"K47\": [\n      \"M\",\n      \"M\"\n    ],\n    \"K48\": [\n      \"COMMA\",\n      \"COMMA\"\n    ],\n    \"K49\": [\n      \"PERIOD\",\n      \"PERIOD\"\n    ],\n    \"K4A\": [\n      \"SLASH\",\n      \"SLASH\"\n    ],\n    \"K4B\": [\n      \"RIGHT_SHIFT\",\n      \"RIGHT_SHIFT\"\n    ],\n    \"K4C\": [\n      \"UP\",\n      \"UP\"\n    ],\n    \"K4D\": [\n      \"NUM_1\",\n      \"NUM_1\"\n    ],\n    \"K4E\": [\n      \"NUM_2\",\n      \"NUM_2\"\n    ],\n    \"K4F\": [\n      \"NUM_3\",\n      \"NUM_3\"\n    ],\n    \"K4G\": [\n      \"NUM_ENTER\",\n      \"NUM_ENTER\"\n    ],\n    \"K50\": [\n      \"LEFT_CTRL\",\n      \"LEFT_CTRL\"\n    ],\n    \"K51\": [\n      \"FN\",\n      \"FN\"\n    ],\n    \"K52\": [\n      \"LEFT_SUPER\",\n      \"LEFT_SUPER\"\n    ],\n    \"K53\": [\n      \"LEFT_ALT\",\n      \"LEFT_ALT\"\n    ],\n    \"K54\": [\n      \"SPACE\",\n      \"SPACE\"\n    ],\n    \"K55\": [\n      \"RIGHT_ALT\",\n      \"RIGHT_ALT\"\n    ],\n    \"K56\": [\n      \"APP\",\n      \"APP\"\n    ],\n    \"K57\": [\n      \"RIGHT_CTRL\",\n      \"RIGHT_CTRL\"\n    ],\n    \"K58\": [\n      \"LEFT\",\n      \"LEFT\"\n    ],\n    \"K59\": [\n      \"DOWN\",\n      \"DOWN\"\n    ],\n    \"K5A\": [\n      \"RIGHT\",\n      \"RIGHT\"\n    ],\n    \"K5B\": [\n      \"NUM_0\",\n      \"NUM_0\"\n    ],\n    \"K5C\": [\n      \"NUM_PERIOD\",\n      \"NUM_PERIOD\"\n    ]\n  },\n  \"key_leds\": {},\n  \"layers\": [\n    {\n      \"mode\": null,\n      \"brightness\": 0,\n      \"color\": [\n        0,\n        0\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "layouts/system76/serw13/meta.json",
    "content": "{\n  \"display_name\": \"Serval WS\",\n  \"has_brightness\": true,\n  \"has_color\": true,\n  \"pressed_color\": \"#dfdfdf\",\n  \"keyboard\": \"system76/15in_102\"\n}\n"
  },
  {
    "path": "layouts.py",
    "content": "#!/usr/bin/env python3\n\nimport argparse\nfrom collections import OrderedDict\nimport json\nimport os\nimport re\nimport shutil\nimport subprocess\nimport sys\nimport tempfile\nimport typing\nfrom typing import List, Tuple, Dict\n\nEXCLUDED_SCANCODES = ['INT_1', 'INT_2']\nQMK_MAPPING = {\n    'APPLICATION': 'APP',\n    'AUDIO_MUTE': 'MUTE',\n    'AUDIO_MUTE': 'MUTE',\n    'AUDIO_VOL_DOWN': 'VOLUME_DOWN',\n    'AUDIO_VOL_UP': 'VOLUME_UP',\n    'AGIN': 'AGAIN',\n    'VOLD': 'VOLUME_DOWN',\n    'VOLU': 'VOLUME_UP',\n    'BSLASH': 'BACKSLASH',\n    'BSLS': 'BACKSLASH',\n    'SLSH': 'SLASH',\n    'BSPACE': 'BKSP',\n    'BACKSPACE': 'BKSP',\n    'BSPC': 'BKSP',\n    'BOOT': 'RESET',\n    'BOOTLOADER': 'RESET',\n    'SPC': 'SPACE',\n    'SLCT': 'SELECT',\n    'CAPSLOCK': 'CAPS',\n    'CAPS_LOCK': 'CAPS',\n    'LCAP': 'LOCKING_CAPS_LOCK',\n    'LEAD': 'LEADER',\n    'DELETE': 'DEL',\n    'DOT': 'PERIOD',\n    'EQUAL': 'EQUALS',\n    'EQL': 'EQUALS',\n    'ESCAPE': 'ESC',\n    'EXSL': 'EXSEL',\n    'GRAVE': 'TICK',\n    'GESC': 'GRAVE_ESCAPE',\n    'GRV': 'TICK',\n    'KP_0': 'NUM_0',\n    'KP_1': 'NUM_1',\n    'KP_2': 'NUM_2',\n    'KP_3': 'NUM_3',\n    'KP_4': 'NUM_4',\n    'KP_5': 'NUM_5',\n    'KP_6': 'NUM_6',\n    'KP_7': 'NUM_7',\n    'KP_8': 'NUM_8',\n    'KP_9': 'NUM_9',\n    'P0': 'NUM_0',\n    'P1': 'NUM_1',\n    'P2': 'NUM_2',\n    'P3': 'NUM_3',\n    'P4': 'NUM_4',\n    'P5': 'NUM_5',\n    'P6': 'NUM_6',\n    'P7': 'NUM_7',\n    'P8': 'NUM_8',\n    'P9': 'NUM_9',\n    'KP_ASTERISK': 'NUM_ASTERISK',\n    'PAST': 'NUM_ASTERISK',\n    'INS': 'INSERT',\n    'KP_COMMA': 'NUM_COMMA',\n    'PCMM': 'NUM_COMMA',\n    'COMM': 'COMMA',\n    'CNCL': 'CANCEL',\n    'CLR': 'CLEAR',\n    'CLAG': 'CLEAR_AGAIN',\n    'CRSL': 'CRSEL',\n    'CALC': 'CALCULATOR',\n    'KP_DOT': 'NUM_PERIOD',\n    'PDOT': 'NUM_PERIOD',\n    'KP_ENTER': 'NUM_ENTER',\n    'ENT': 'ENTER',\n    'EXEC': 'EXECUTE',\n    'PENT': 'NUM_ENTER',\n    'KP_EQUAL': 'NUM_EQUALS',\n    'PEQL': 'NUM_EQUALS',\n    'KP_MINUS': 'NUM_MINUS',\n    'PMNS': 'NUM_MINUS',\n    'MINS': 'MINUS',\n    'KP_PLUS': 'NUM_PLUS',\n    'PPLS': 'NUM_PLUS',\n    'KP_SLASH': 'NUM_SLASH',\n    'PSLS': 'NUM_SLASH',\n    'LALT': 'LEFT_ALT',\n    'ALGL': 'LEFT_ALT',\n    'LOPT': 'LEFT_ALT',\n    'LBRACKET': 'BRACE_OPEN',\n    'LEFT_BRACKET': 'BRACE_OPEN',\n    'LBRC': 'BRACE_OPEN',\n    'LCTRL': 'LEFT_CTRL',\n    'LCTL': 'LEFT_CTRL',\n    'LGUI': 'LEFT_SUPER',\n    'LWIN': 'LEFT_SUPER',\n    'LCMD': 'LEFT_SUPER',\n    'LEFT_GUI': 'LEFT_SUPER',\n    'LSHIFT': 'LEFT_SHIFT',\n    'LSFT': 'LEFT_SHIFT',\n    'NO': 'NONE',\n    'BASIC': 'NONE',\n    'MEDIA_NEXT_TRACK': 'MEDIA_NEXT',\n    'MNXT': 'MEDIA_NEXT',\n    'MEDIA_PLAY_PAUSE': 'PLAY_PAUSE',\n    'MPLY': 'PLAY_PAUSE',\n    'MFFD': 'MEDIA_FAST_FORWARD',\n    'MRWD': 'MEDIA_REWIND',\n    'PAUS': 'PAUSE',\n    'BRK': 'PAUSE',\n    'BRMU': 'PAUSE',\n    'ERAS': 'ALTERNATE_ERASE',\n    'ASST': 'ASSISTANT',\n    'MEDIA_PREV_TRACK': 'MEDIA_PREV',\n    'MPRV': 'MEDIA_PREV',\n    'MSTP': 'MEDIA_STOP',\n    'MSEL': 'MEDIA_SELECT',\n    'MS_U': 'MS_UP',\n    'MS_D': 'MS_DOWN',\n    'MS_L': 'MS_LEFT',\n    'MS_R': 'MS_RIGHT',\n    'EJCT': 'MEDIA_EJECT',\n    'MYCM': 'MY_COMPUTER',\n    'COMPUTER': 'MY_COMPUTER',\n    'CPNL': 'CONTROL_PANEL',\n    'WSCH': 'WWW_SEARCH',\n    'WHOM': 'WWW_HOME',\n    'WBAK': 'WWW_BACK',\n    'WFWD': 'WWW_FORWARD',\n    'WSTP': 'WWW_STOP',\n    'WREF': 'WWW_REFRESH',\n    'WFAV': 'WWW_FAVORITES',\n    'WH_U': 'MS_WH_UP',\n    'WH_D': 'MS_WH_DOWN',\n    'WH_L': 'MS_WH_LEFT',\n    'WH_R': 'MS_WH_RIGHT',\n    'ACL0': 'MS_ACCEL0',\n    'ACL1': 'MS_ACCEL1',\n    'ACL2': 'MS_ACCEL2',\n    'NUMLOCK': 'NUM_LOCK',\n    'NUM': 'NUM_LOCK',\n    'LNUM': 'LOCKING_NUM_LOCK',\n    'NUHS': 'NONUS_HASH',\n    'NUBS': 'NONUS_BACKSLASH',\n    'PGDOWN': 'PGDN',\n    'PAGE_DOWN': 'PGDN',\n    'PAGE_UP': 'PGUP',\n    'PSCREEN': 'PRINT_SCREEN',\n    'PSCR': 'PRINT_SCREEN',\n    'PRIR': 'PRIOR',\n    'PWR': 'SYSTEM_POWER',\n    'INTERNATIONAL_1': 'INT1',\n    'INTERNATIONAL_2': 'INT2',\n    'INTERNATIONAL_3': 'INT3',\n    'INTERNATIONAL_4': 'INT4',\n    'INTERNATIONAL_5': 'INT5',\n    'INTERNATIONAL_6': 'INT6',\n    'INTERNATIONAL_7': 'INT7',\n    'INTERNATIONAL_8': 'INT8',\n    'INTERNATIONAL_9': 'INT9',\n    'LNG1': 'LANGUAGE_1',\n    'LNG2': 'LANGUAGE_2',\n    'LNG3': 'LANGUAGE_3',\n    'LNG4': 'LANGUAGE_4',\n    'LNG5': 'LANGUAGE_5',\n    'LNG6': 'LANGUAGE_6',\n    'LNG7': 'LANGUAGE_7',\n    'LNG8': 'LANGUAGE_8',\n    'LNG9': 'LANGUAGE_9',\n    'PSTE': 'PASTE',\n    'PROGRAMMABLE_BUTTON_1': 'PROGRAMMABLE_BUTTON',\n    'QUOT': 'QUOTE',\n    'QUANTUM': 'RESET',\n    'RALT': 'RIGHT_ALT',\n    'ALGR': 'RIGHT_ALT',\n    'ROPT': 'RIGHT_ALT',\n    'RBRACKET': 'BRACE_CLOSE',\n    'RIGHT_BRACKET': 'BRACE_CLOSE',\n    'RBRC': 'BRACE_CLOSE',\n    'RCTRL': 'RIGHT_CTRL',\n    'RCTL': 'RIGHT_CTRL',\n    'RGB_TOG': 'KBD_TOGGLE',\n    'RGB_VAD': 'KBD_DOWN',\n    'RGB_VAI': 'KBD_UP',\n    'RGB_MOD': 'RGB_MODE_FORWARD',\n    'RGB_RMOD': 'RGB_MODE_REVERSE',\n    'RGB_M_P': 'RGB_MODE_PLAIN',\n    'RGB_M_B': 'RGB_MODE_BREATHE',\n    'RGB_M_R': 'RGB_MODE_RAINBOW',\n    'RGB_M_SW': 'RGB_MODE_SWIRL',\n    'RGB_M_SN': 'RGB_MODE_SNAKE',\n    'RGB_M_K': 'RGB_MODE_KNIGHT',\n    'RGB_M_X': 'RGB_MODE_XMAS',\n    'RGB_M_G': 'RGB_MODE_GRADIENT',\n    'RGB_M_T': 'RGB_MODE_RGBTEST',\n    'RGB_MODE_TEST': 'RGB_MODE_RGBTEST',\n    'RGB_M_TW': 'RGB_MODE_TWINKLE',\n    'LIGHTING': 'BACKLIGHT_ON',\n    'BRIU': 'BRIGHTNESS_UP',\n    'BRID': 'BRIGHTNESS_DOWN',\n    'RGHT': 'RIGHT',\n    'RGUI': 'RIGHT_SUPER',\n    'RWIN': 'RIGHT_SUPER',\n    'RCMD': 'RIGHT_SUPER',\n    'RIGHT_GUI': 'RIGHT_SUPER',\n    'RSHIFT': 'RIGHT_SHIFT',\n    'RSFT': 'RIGHT_SHIFT',\n    'RETN': 'RETURN',\n    'RBT': 'REBOOT',\n    'SCOLON': 'SEMICOLON',\n    'SCLN': 'SEMICOLON',\n    'SCROLLLOCK': 'SCROLL_LOCK',\n    'LSCR': 'LOCKING_SCROLL_LOCK',\n    'SCRL': 'SCROLL_LOCK',\n    'BRMD': 'SCROLL_LOCK',\n    'JOYSTICK_BUTTON_0': 'JOYSTICK',\n    'BTN1': 'MS_BTN1',\n    'BTN2': 'MS_BTN2',\n    'BTN3': 'MS_BTN3',\n    'BTN4': 'MS_BTN4',\n    'BTN5': 'MS_BTN5',\n    'BTN6': 'MS_BTN6',\n    'BTN7': 'MS_BTN7',\n    'BTN8': 'MS_BTN8',\n    'MIDI': 'MIDI_ON',\n    'AUDIO': 'AUDIO_ON',\n    'MACRO': 'MACRO_0',\n    'SYSTEM_SLEEP': 'SUSPEND',\n    'SLEP': 'SUSPEND',\n    'SYRQ': 'SYSTEM_REQUEST',\n    'WAKE': 'SYSTEM_WAKE',\n    'SEPR': 'SEPARATOR',\n    'TRANSPARENT': 'ROLL_OVER',\n    'TRNS': 'ROLL_OVER',\n    'TG(0)': 'LAYER_TOGGLE_1',\n    'TOGGLE_LAYER': 'LAYER_TOGGLE_1',\n    'TG(1)': 'LAYER_TOGGLE_2',\n    'TG(2)': 'LAYER_TOGGLE_3',\n    'TG(3)': 'LAYER_TOGGLE_4',\n    'TO(0)': 'LAYER_SWITCH_1',\n    'TO':    'LAYER_SWITCH_1',\n    'TO(1)': 'LAYER_SWITCH_2',\n    'TO(2)': 'LAYER_SWITCH_3',\n    'TO(3)': 'LAYER_SWITCH_4',\n    'MO(0)': 'LAYER_ACCESS_1',\n    'MOMENTARY': 'LAYER_ACCESS_1',\n    'MO(1)': 'FN',\n    'MO(2)': 'LAYER_ACCESS_3',\n    'MO(3)': 'LAYER_ACCESS_4',\n    '_______': 'ROLL_OVER',\n}\nQMK_EXTRA_SCANCODES = [\n    \"TG(0)\",\n    \"TG(1)\",\n    \"TG(2)\",\n    \"TG(3)\",\n    \"TO(0)\",\n    \"TO(1)\",\n    \"TO(2)\",\n    \"TO(3)\",\n    \"MO(0)\",\n    \"MO(1)\",\n    \"MO(2)\",\n    \"MO(3)\",\n]\nEXCLUDE_BOARDS = [\n    'system76/ortho_split_2u',\n    'system76/launch_test',\n    'system76/virgo',\n]\n\nALIAS_RE = '#define\\s+KC_([A-Z_]*)\\s+KC_([A-Z_]+]*)\\s*$'\n\n# keycode_h = open('tmk_core/common/keycode.h').read()\n# [(i.group(1), i.group(2)) for i in (re.match('#define\\s+KC_([A-Z_]*)\\s+KC_([A-Z_]+]*)\\s*$', i) for i in keycode_h.splitlines()) if i]\n\ndef call_preprocessor(input: str) -> str:\n    return subprocess.check_output([\"gcc\", \"-E\", \"-nostdinc\", \"-\"], stderr=subprocess.DEVNULL, input=input, universal_newlines=True)\n\ndef read_stripping_includes(path: str) -> str:\n    output = ''\n    with open(path) as f:\n        for line in f:\n            if not line.startswith('#include'):\n                output += line\n    return output\n\ndef extract_scancodes(ecdir: str, is_qmk: bool) -> Tuple[typing.OrderedDict[str, int], Dict[str, str]]:\n    \"Extract mapping from scancode names to numbers\"\n\n    is_old_qmk = False\n    if is_qmk:\n        version = subprocess.check_output([\"git\", \"-C\", ecdir, \"describe\", \"--tags\"], stderr=subprocess.DEVNULL, universal_newlines=True)\n        is_old_qmk = \"0.7.103\" in version or \"0.7.104\" in version or \"0.12.20\" in version\n        if is_old_qmk:\n            include_paths = [f\"{ecdir}/tmk_core/common/keycode.h\", f\"{ecdir}/quantum/quantum_keycodes.h\", f\"{ecdir}/tmk_core/common/action_code.h\"]\n            includes = [read_stripping_includes(i) for i in include_paths]\n            common_keymap_h = call_preprocessor(includes[0])\n            quantum_keycode_h = call_preprocessor(includes[1])\n            scancode_defines = re.findall(\n                '    (KC_[^,\\s]+)', common_keymap_h)\n            scancode_defines += re.findall(\n                '    (RGB_[^,\\s]+)', quantum_keycode_h)\n        else:\n            include_paths = [ f\"{ecdir}/quantum/keycodes.h\", f\"{ecdir}/quantum/quantum_keycodes.h\", f\"{ecdir}/quantum/action_code.h\" ]\n            includes = [read_stripping_includes(i) for i in include_paths]\n            keycodes_h = call_preprocessor(includes[0])\n            quantum_keycode_h = call_preprocessor(includes[1])\n            scancode_defines = re.findall(\n                '    (KC_[^,\\s]+)', keycodes_h)\n            scancode_defines += re.findall(\n                '    (RGB_[^,\\s]+)', keycodes_h)\n            scancode_defines += re.findall(\n                '    (QK_[^,\\s]+)', keycodes_h)\n            scancode_defines += re.findall(\n                '    (QK_[^,\\s]+)', quantum_keycode_h)\n        define_aliases = [(i.group(1), i.group(2)) for i in (re.match(ALIAS_RE, i) for i in includes[0].splitlines()) if i]\n        mapping = QMK_MAPPING\n        mapping.update({alias: QMK_MAPPING.get(keycode, keycode) for alias, keycode in define_aliases})\n        for (alias, keycode) in define_aliases:\n            mapping[alias] = QMK_MAPPING.get(keycode, keycode)\n        scancode_defines += QMK_EXTRA_SCANCODES\n    else:\n        includes = [open(f\"{ecdir}/src/common/include/common/keymap.h\").read()]\n        common_keymap_h = includes[0]\n        scancode_defines = re.findall(\n            '#define.*((?:K_\\S+)|(?:KT_FN))', common_keymap_h)\n        mapping = {}\n\n    tmpdir = tempfile.mkdtemp()\n    with open(f'{tmpdir}/keysym-extract.c', 'w') as f:\n        f.write('#include <stdint.h>\\n')\n        for i in includes:\n            f.write(i.replace('#pragma once', ''))\n            f.write('\\n')\n        f.write('#include <stdio.h>\\n')\n        f.write('int main() {\\n')\n        for i in scancode_defines:\n            f.write(f'printf(\"%d \", {i});\\n')\n        f.write('}\\n')\n\n    cmd = ['gcc']\n    cmd += ['-o', f'{tmpdir}/keysym-extract', f'{tmpdir}/keysym-extract.c']\n    subprocess.check_call(cmd)\n\n    output = subprocess.check_output(\n        f'{tmpdir}/keysym-extract', universal_newlines=True)\n    scancodes = (int(i) for i in output.split())\n\n    shutil.rmtree(tmpdir)\n\n    scancode_names = []\n    for name in scancode_defines:\n        if '_' in name and name.split('_')[0] != 'RGB':\n            name = name.split('_', 1)[1]\n        if is_qmk:\n            name = mapping.get(name, name)\n        scancode_names.append(name)\n    scancode_list = OrderedDict(zip(scancode_names, scancodes))\n\n    if is_qmk:\n        if is_old_qmk:\n            scancode_list['RESET'] = 0x5C00\n    else:\n        scancode_list['NONE'] = 0x0000\n\n    scancode_list = OrderedDict((name, code) for (name, code) in scancode_list.items() if name not in EXCLUDED_SCANCODES)\n\n    # Make sure scancodes are unique\n    assert len(scancode_list.keys()) == len(set(scancode_list.values()))\n\n    return scancode_list, mapping\n\n\ndef parse_layout_define(keymap_h: str, is_qmk) -> Tuple[List[str], List[List[str]]]:\n    keymap_h = re.sub(r'/\\*.*?\\*/', '', keymap_h)\n    # XXX split up regex?\n    m = re.search(\n        r'LAYOUT\\((.*?)\\)[\\s\\\\]*({[^{}]*({[^{}]*}[^{}]*)+)[^{}]*}', keymap_h, re.MULTILINE | re.DOTALL)\n    assert m is not None\n    physical = m.group(1).replace(',', ' ').replace('\\\\', '').split()\n    # XXX name?\n    physical2 = [i.replace('\\\\', '').replace(',', '').split()\n                 for i in m.group(2).replace('{', '').split('}')[:-1]]\n    assert is_qmk or all(len(i) == len(physical2[0]) for i in physical2)\n    return physical, physical2\n\ndef parse_led_config(led_c: str, physical2: List[List[str]]) -> Dict[str, List[int]]:\n    led_c = re.sub(r'//.*', '', led_c)\n    led_c = re.sub(r'/\\*.*?\\*/', '', led_c)\n    m = re.search(r'g_led_config.*{ \\{(.*?)^},', led_c, re.MULTILINE | re.DOTALL)\n    leds: Dict[str, List[int]] = {}\n    if m is None:\n        return leds\n    for i, line in enumerate(re.findall(r'{(.*)?}', m.group(1))):\n        for j, led_index in enumerate(line.replace(',', ' ').split()):\n            if led_index != '__':\n                leds[physical2[i][j]] = [int(led_index)]\n    return leds\n\ndef parse_keymap(keymap_c: str, mapping: Dict[str, str], physical: List[str], is_qmk: bool) -> Dict[str, List[str]]:\n    # XXX for launch\n    keymap_c = keymap_c.replace('MO(1)', 'FN')\n    keymap_c = re.sub(r'/\\*.*?\\*/', '', keymap_c)\n\n    layer_scancodes: List[List[str]] = []\n    for layer in re.finditer(r'LAYOUT\\((.*?)\\)', keymap_c, re.MULTILINE | re.DOTALL):\n        scancodes = layer.group(1).replace(',', ' ').split()\n        assert len(scancodes) == len(physical)\n\n        def scancode_map(x: int, code: str) -> str:\n            if code == '0':\n                return 'NONE'\n\n            code = code.replace('QK_', '').replace('K_', '').replace('KC_', '').replace('KT_', '')\n\n            if is_qmk:\n                code = mapping.get(code, code)\n\n            return code\n\n        scancodes = [scancode_map(x, i) for x, i in enumerate(scancodes)]\n        layer_scancodes.append(scancodes)\n\n    keymap = {}\n    for i, physical_name in enumerate(physical):\n        keymap[physical_name] = [j[i] for j in layer_scancodes]\n\n    return keymap\n\n\ndef gen_layout_json(path: str, physical: List[str], physical2: List[List[str]]) -> None:\n    \"Generate layout.json file\"\n\n    layout = {}\n    for p in physical:\n        x, y = next((x, y) for x, i in enumerate(physical2)\n                    for y, j in enumerate(i) if j == p)\n        layout[p] = (x, y)\n\n    write_json_file(path, layout)\n\ndef gen_keymap_json(path: str, scancodes: typing.OrderedDict[str, int]) -> None:\n    \"Generate keymap.json file\"\n\n    write_json_file(path, scancodes)\n\ndef gen_leds_json(path: str, leds: [str, List[int]]) -> None:\n    \"Generate leds.json file\"\n\n    write_json_file(path, leds, sort_keys=True)\n\ndef gen_default_json(path: str, board: str, keymap: Dict[str, List[str]], is_qmk: bool) -> None:\n    \"Generate default.json file\"\n\n    if is_qmk:\n        key_leds = {k: None for k in keymap.keys()}\n        layers = [\n            {\"mode\": (7, 127), \"brightness\": 176, \"color\": (142, 255)},\n            {\"mode\": (13, 127), \"brightness\": 176, \"color\": (142, 255)},\n            {\"mode\": (13, 127), \"brightness\": 176, \"color\": (142, 255)},\n            {\"mode\": (13, 127), \"brightness\": 176, \"color\": (142, 255)},\n        ]\n    else:\n        key_leds = {}\n        layers = [{\"mode\": None, \"brightness\": 0, \"color\": (0, 0)}]\n\n    write_json_file(path, {\"model\": board, \"version\": 1, \"map\": keymap, \"key_leds\": key_leds, \"layers\": layers})\n\n\ndef update_meta_json(meta_json: str, has_brightness: bool, has_color: bool, keyboard: str):\n    meta = {}\n    if os.path.exists(meta_json):\n        with open(meta_json, 'r') as f:\n            meta = json.load(f, object_pairs_hook=OrderedDict)\n\n    meta['has_brightness'] = has_brightness\n    meta['has_color'] = has_color\n    meta['keyboard'] = keyboard\n\n    write_json_file(meta_json, meta)\n\n\ndef write_json_file(path: str, data, sort_keys=False):\n    with open(path, 'w') as f:\n        json.dump(data, f, indent=2, sort_keys=sort_keys)\n        f.write('\\n')\n\n\ndef generate_layout_dir(ecdir: str, board: str, is_qmk: bool) -> None:\n    print(f'Generating layouts/{board}...')\n\n    has_brightness = True\n    has_color = True\n\n    if is_qmk:\n        keymap_h = open(\n            f\"{ecdir}/keyboards/{board}/{board.split('/')[-1]}.h\").read()\n        default_c = open(\n            f\"{ecdir}/keyboards/{board}/keymaps/default/keymap.c\").read()\n        led_c = open(\n            f\"{ecdir}/keyboards/{board}/{board.split('/')[-1]}.c\").read()\n        keyboard = board\n    else:\n        with open(f\"{ecdir}/src/board/{board}/board.mk\") as f:\n            board_mk = f.read()\n\n        m = re.search('^KEYBOARD=(.*)$', board_mk, re.MULTILINE)\n        assert m is not None\n        keyboard = board.rsplit('/', 1)[0] + '/' + m.group(1)\n\n        m = re.search('^KBLED=(.*)$', board_mk, re.MULTILINE)\n        assert m is not None\n        kbled = m.group(1)\n        # Some models use PWM and support RGB, but only ship with a white-backlit keyboard\n        if kbled == 'white_dac' or board in ['system76/darp9', 'system76/darp10', 'system76/darp11']:\n            has_color = False\n        # bonw14/bonw15: Handled through USB. Can configurator support this?\n        elif kbled in ['none', 'bonw14', 'bonw15']:\n            has_brightness = False\n            has_color = False\n        elif kbled not in ['rgb_pwm', 'oryp5', 'darp5']:\n            raise Exception(f\"KBLED='{kbled}' not handled by layouts.py\")\n\n        keymap_h = open(\n            f\"{ecdir}/src/keyboard/{keyboard}/include/board/keymap.h\").read()\n        default_c = open(f\"{ecdir}/src/keyboard/{keyboard}/keymap/default.c\").read()\n        led_c = \"\"\n\n    os.makedirs(f'layouts/{board}', exist_ok=True)\n    os.makedirs(f'layouts/keyboards/{keyboard}', exist_ok=True)\n\n    physical, physical2 = parse_layout_define(keymap_h, is_qmk)\n    leds = parse_led_config(led_c, physical2)\n    _scancodes, mapping = extract_scancodes(ecdir, is_qmk)\n    default_keymap = parse_keymap(default_c, mapping, physical, is_qmk)\n    gen_layout_json(f'layouts/keyboards/{keyboard}/layout.json', physical, physical2)\n    gen_leds_json(f'layouts/keyboards/{keyboard}/leds.json', leds)\n    gen_default_json(f'layouts/{board}/default.json', board, default_keymap, is_qmk)\n    update_meta_json(f'layouts/{board}/meta.json', has_brightness, has_color, keyboard)\n\nparser = argparse.ArgumentParser(usage=\"./layouts.py --qmk ../qmk_firmware system76/launch_heavy_1\")\nparser.add_argument(\"ecdir\", help='For QMK boards that is the qmk_firmware (github.com/system76/qmk_firmware) directory itself, otherwise use the ec directory (github.com/system76/ec)')\nparser.add_argument(\"board\", help='The name of the manufacturer and board name. Example: \"system76/launch_2\"')\nparser.add_argument(\"--qmk\", action=\"store_true\", help=\"Required if you plan on using a keyboard with QMK firmware.\")\nparser.add_argument(\"--qmk-legacy\", action=\"store_true\", help=\"Re-generate keymap json for old qmk version. (pre 0.19)\")\nargs = parser.parse_args()\n\n# Generate keymap file, used for all ec or qmk boards\nscancodes, _mapping = extract_scancodes(args.ecdir, args.qmk or args.qmk_legacy)\nif args.qmk_legacy:\n    keymap_path = 'layouts/keymap/qmk_legacy.json'\nelif args.qmk:\n    keymap_path = 'layouts/keymap/qmk.json'\nelse:\n    keymap_path = 'layouts/keymap/ec.json'\ngen_keymap_json(keymap_path, scancodes)\n\nif args.qmk_legacy:\n    # Only keymap differs for legacy qmk, so don't generate anything related to individial boards\n    sys.exit(0)\n\nif args.board == 'all':\n    if args.qmk:\n        boarddir = f'{args.ecdir}/keyboards/system76'\n    else:\n        boarddir = f'{args.ecdir}/src/board/system76'\n    for i in os.listdir(boarddir):\n        if i == 'common' or not os.path.isdir(f'{boarddir}/{i}') or f\"system76/{i}\" in EXCLUDE_BOARDS:\n            continue\n        generate_layout_dir(args.ecdir, f'system76/{i}', args.qmk)\nelse:\n    generate_layout_dir(args.ecdir, args.board, args.qmk)\n\n\n"
  },
  {
    "path": "linux/build.py",
    "content": "#!/usr/bin/env python3\n\nimport argparse\nimport glob\nimport os\nimport shutil\nimport subprocess\nfrom urllib.request import urlopen\n\n# Handle commandline arguments\nparser = argparse.ArgumentParser()\nparser.add_argument('--release', action='store_true', help=\"Build in release mode\")\nparser.add_argument('--arm64', action='store_true', help=\"Build for ARM64 architecture\")\nargs = parser.parse_args()\n\n# Executables to install\nTARGET_DIR = \"../target/\" + ('release' if args.release else 'debug')\nICON = \"../data/icons/scalable/apps/com.system76.keyboardconfigurator.svg\"\n\n# Appimage packaging\nPKG = \"keyboard-configurator\"\nAPPID = \"com.system76.keyboardconfigurator\"\nARCH = \"aarch64\" if args.arm64 else \"x86_64\"\n\n# Remove previous build\nfor i in glob.glob(f\"{PKG}*.AppImage\"):\n    os.remove(i)\nif os.path.exists(f\"{PKG}.AppDir\"):\n    shutil.rmtree(f\"{PKG}.AppDir\")\nif os.path.exists(PKG):\n    os.remove(PKG)\n\n# Build the application\ncmd = [\"cargo\", \"build\", \"--features\", \"appimage\"]\nif args.release:\n    cmd.append('--release')\nsubprocess.check_call(cmd)\n\n# Copy executable\nsubprocess.check_call([f\"strip\", '-o', \"system76-keyboard-configurator\", f\"{TARGET_DIR}/system76-keyboard-configurator\"])\n\n# Download linuxdeploy\nLINUXDEPLOY = f\"linuxdeploy-{ARCH}.AppImage\"\nLINUXDEPLOY_URL = f\"https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/{LINUXDEPLOY}\"\nif not os.path.exists(LINUXDEPLOY):\n    print(f\"Downloading {LINUXDEPLOY}...\")\n    with urlopen(LINUXDEPLOY_URL) as u:\n        with open(LINUXDEPLOY, 'wb') as f:\n            f.write(u.read())\n    os.chmod(LINUXDEPLOY, os.stat(LINUXDEPLOY).st_mode | 0o111)\n    print(\"Download complete.\")\n\n# Copy appdata\nos.makedirs(f\"{PKG}.AppDir/usr/share/metainfo\", exist_ok=True)\nshutil.copy(\"com.system76.keyboardconfigurator.appdata.xml\", f\"{PKG}.AppDir/usr/share/metainfo\")\n\n# Build appimage\nprint(f\"Building AppImage for {ARCH}...\")\nsubprocess.check_call([\n    f\"./{LINUXDEPLOY}\",\n    f\"--appdir={PKG}.AppDir\",\n    f\"--executable=system76-keyboard-configurator\",\n    f\"--desktop-file={APPID}.desktop\",\n    f\"--icon-file={ICON}\",\n    \"--plugin\", \"gtk\",\n    \"--output\", \"appimage\"\n])\noutput_file = f\"{PKG}-{ARCH}.AppImage\"\nshutil.move(f\"System76_Keyboard_Configurator-{ARCH}.AppImage\", output_file)\nprint(f\"AppImage built: {output_file}\")"
  },
  {
    "path": "linux/com.system76.keyboardconfigurator.appdata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<component type=\"desktop-application\">\n\t<id>com.system76.keyboardconfigurator</id>\n\t<metadata_license>CC0-1.0</metadata_license>\n\t<project_license>GPL-3.0-or-later</project_license>\n\t<developer_name>System76</developer_name>\n\t<update_contact>idscott@system76.com</update_contact>\n\t<url type=\"homepage\">https://github.com/pop-os/keyboard-configurator</url>\n\t<url type=\"bugtracker\">https://github.com/pop-os/keyboard-configurator</url>\n\t<name>Keyboard Configurator</name>\n\t<summary>Configure System76 keyboards</summary>\n\t<description>\n\t\t<p>\n\t\tThe System76 Keyboard Configrator app places control back into your hands. Remap keys, swap keycaps, and configure multiple layers to your liking. Compatible with Linux, Windows, and macOS, this application will work with the Launch Configurable Keyboard as well as any System76 laptop with Open Firmware.\n\t\t</p>\n\t</description>\n\t<categories>\n\t\t<category>Utility</category>\n\t</categories>\n\t<launchable type=\"desktop-id\">com.system76.keyboardconfigurator.desktop</launchable>\n\t<screenshots>\n\t\t<screenshot type=\"default\">\n\t\t\t<image>https://raw.githubusercontent.com/pop-os/keyboard-configurator/master/screenshots/screenshot-01.png</image>\n\t\t</screenshot>\n\t</screenshots>\n\t<project_group>Pop!_OS</project_group>\n\t<provides>\n\t\t<binary>system76-keyboard-configurator</binary>\n\t</provides>\n\t<content_rating type=\"oars-1.0\" />\n</component>\n"
  },
  {
    "path": "linux/com.system76.keyboardconfigurator.desktop",
    "content": "[Desktop Entry]\nName=System76 Keyboard Configurator\nName[hu]=System76 Billentyűzet-konfigurátor\nExec=system76-keyboard-configurator\nIcon=com.system76.keyboardconfigurator\nType=Application\nStartupNotify=true\nCategories=Utility;\n"
  },
  {
    "path": "linux/com.system76.keyboardconfiguratorlaunchtest.desktop",
    "content": "[Desktop Entry]\nName=System76 Keyboard Tester\nName[hu]=System76 Billentyűzet-tesztelő\nExec=system76-keyboard-configurator --launch-test\nIcon=com.system76.keyboardconfigurator\nType=Application\nStartupNotify=true\nCategories=Utility;\n"
  },
  {
    "path": "linux/linuxdeploy-plugin-gtk.sh",
    "content": "#! /usr/bin/env bash\n\n# GTK3 environment variables: https://developer.gnome.org/gtk3/stable/gtk-running.html\n# GTK4 environment variables: https://developer.gnome.org/gtk4/stable/gtk-running.html\n\n# abort on all errors\nset -e\n\nif [ \"$DEBUG\" != \"\" ]; then\n    set -x\n    verbose=\"--verbose\"\nfi\n\nSCRIPT=\"$(basename \"$(readlink -f \"$0\")\")\"\n\nshow_usage() {\n    echo \"Usage: $SCRIPT --appdir <path to AppDir>\"\n    echo\n    echo \"Bundles resources for applications that use GTK into an AppDir\"\n    echo\n    echo \"Required variables:\"\n    echo \"  LINUXDEPLOY=\\\".../linuxdeploy\\\" path to linuxdeploy (e.g., AppImage); set automatically when plugin is run directly by linuxdeploy\"\n    echo\n    echo \"Optional variables:\"\n    echo \"  DEPLOY_GTK_VERSION (major version of GTK to deploy, e.g. '2', '3' or '4'; auto-detect by default)\"\n}\n\nvariable_is_true() {\n    local var=\"$1\"\n\n    if [ -n \"$var\" ] && { [ \"$var\" == \"true\" ] || [ \"$var\" -gt 0 ]; } 2> /dev/null; then\n        return 0 # true\n    else\n        return 1 # false\n    fi\n}\n\nget_pkgconf_variable() {\n    local variable=\"$1\"\n    local library=\"$2\"\n    local default_value=\"$3\"\n\n    pkgconfig_ret=\"$(\"$PKG_CONFIG\" --variable=\"$variable\" \"$library\")\"\n    if [ -n \"$pkgconfig_ret\" ]; then\n        echo \"$pkgconfig_ret\"\n    elif [ -n \"$default_value\" ]; then\n        echo \"$default_value\"\n    else\n        echo \"$0: there is no '$variable' variable for '$library' library.\" > /dev/stderr\n        echo \"Please check the '$library.pc' file is present in \\$PKG_CONFIG_PATH (you may need to install the appropriate -dev/-devel package).\" > /dev/stderr\n        exit 1\n    fi\n}\n\ncopy_tree() {\n    local src=(\"${@:1:$#-1}\")\n    local dst=\"${*:$#}\"\n\n    for elem in \"${src[@]}\"; do\n        mkdir -p \"${dst::-1}$elem\"\n        cp \"$elem\" --archive --parents --target-directory=\"$dst\" $verbose\n    done\n}\n\ncopy_lib_tree() {\n    # The source lib directory could be /usr/lib, /usr/lib64, or /usr/lib/x86_64-linux-gnu\n    # Therefore, when copying lib directories, we need to transform that target path\n    # to a consistent /usr/lib\n    local src=(\"${@:1:$#-1}\")\n    local dst=\"${*:$#}\"\n\n    for elem in \"${src[@]}\"; do\n        mkdir -p \"${dst::-1}${elem/$LD_GTK_LIBRARY_PATH//usr/lib}\"\n        pushd \"$LD_GTK_LIBRARY_PATH\"\n        cp \"$(realpath --relative-to=\"$LD_GTK_LIBRARY_PATH\" \"$elem\")\" --archive --parents --target-directory=\"$dst/usr/lib\" $verbose\n        popd\n    done\n}\n\nget_triplet_path() {\n    if command -v dpkg-architecture > /dev/null; then\n        echo \"/usr/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH)\"\n    fi\n}\n\n\n\nsearch_library_path() {\n    PATH_ARRAY=(\n        \"$(get_triplet_path)\"\n        \"/usr/lib64\"\n        \"/usr/lib\"\n    )\n\n    for path in \"${PATH_ARRAY[@]}\"; do\n        if [ -d \"$path\" ]; then\n            echo \"$path\"\n            return 0\n        fi\n    done\n}\n\nsearch_tool() {\n    local tool=\"$1\"\n    local directory=\"$2\"\n\n    if command -v \"$tool\"; then\n        return 0\n    fi\n\n    PATH_ARRAY=(\n        \"$(get_triplet_path)/$directory/$tool\"\n        \"/usr/lib64/$directory/$tool\"\n        \"/usr/lib/$directory/$tool\"\n        \"/usr/bin/$tool\"\n        \"/usr/bin/$tool-64\"\n        \"/usr/bin/$tool-32\"\n    )\n\n    for path in \"${PATH_ARRAY[@]}\"; do\n        if [ -x \"$path\" ]; then\n            echo \"$path\"\n            return 0\n        fi\n    done\n}\n\nDEPLOY_GTK_VERSION=\"${DEPLOY_GTK_VERSION:-0}\" # When not set by user, this variable use the integer '0' as a sentinel value\nAPPDIR=\n\nwhile [ \"$1\" != \"\" ]; do\n    case \"$1\" in\n        --plugin-api-version)\n            echo \"0\"\n            exit 0\n            ;;\n        --appdir)\n            APPDIR=\"$2\"\n            shift\n            shift\n            ;;\n        --help)\n            show_usage\n            exit 0\n            ;;\n        *)\n            echo \"Invalid argument: $1\"\n            echo\n            show_usage\n            exit 1\n            ;;\n    esac\ndone\n\nif [ \"$APPDIR\" == \"\" ]; then\n    show_usage\n    exit 1\nfi\n\nAPPDIR=\"$(realpath \"$APPDIR\")\"\nmkdir -p \"$APPDIR\"\n\n. /etc/os-release\nif [ \"$ID\" = \"debian\" ] || [ \"$ID\" = \"ubuntu\" ]; then\n    if ! command -v dpkg-architecture  &>/dev/null; then\n        echo -e \"$0: dpkg-architecture not found.\\nInstall dpkg-dev then re-run the plugin.\"\n        exit 1\n    fi\nfi\n\nif command -v pkgconf > /dev/null; then\n    PKG_CONFIG=\"pkgconf\"\nelif command -v pkg-config > /dev/null; then\n    PKG_CONFIG=\"pkg-config\"\nelse\n    echo \"$0: pkg-config/pkgconf not found in PATH, aborting\"\n    exit 1\nfi\n\n# GTK's library path *must not* have a trailing slash for later parameter substitution to work properly\nLD_GTK_LIBRARY_PATH=\"$(realpath \"${LD_GTK_LIBRARY_PATH:-$(search_library_path)}\")\"\n\nif ! command -v find &>/dev/null && ! type find &>/dev/null; then\n    echo -e \"$0: find not found.\\nInstall findutils then re-run the plugin.\"\n    exit 1\nfi\n\nif [ -z \"$LINUXDEPLOY\" ]; then\n    echo -e \"$0: LINUXDEPLOY environment variable is not set.\\nDownload a suitable linuxdeploy AppImage, set the environment variable and re-run the plugin.\"\n    exit 1\nfi\n\ngtk_versions=0 # Count major versions of GTK when auto-detect GTK version\nif [ \"$DEPLOY_GTK_VERSION\" -eq 0 ]; then\n    echo \"Determining which GTK version to deploy\"\n    while IFS= read -r -d '' file; do\n        if [ \"$DEPLOY_GTK_VERSION\" -ne 2 ] && ldd \"$file\" | grep -q \"libgtk-x11-2.0.so\"; then\n            DEPLOY_GTK_VERSION=2\n            gtk_versions=\"$((gtk_versions+1))\"\n        fi\n        if [ \"$DEPLOY_GTK_VERSION\" -ne 3 ] && ldd \"$file\" | grep -q \"libgtk-3.so\"; then\n            DEPLOY_GTK_VERSION=3\n            gtk_versions=\"$((gtk_versions+1))\"\n        fi\n        if [ \"$DEPLOY_GTK_VERSION\" -ne 4 ] && ldd \"$file\" | grep -q \"libgtk-4.so\"; then\n            DEPLOY_GTK_VERSION=4\n            gtk_versions=\"$((gtk_versions+1))\"\n        fi\n    done < <(find \"$APPDIR/usr/bin\" -executable -type f -print0)\nfi\n\nif [ \"$gtk_versions\" -gt 1 ]; then\n    echo \"$0: can not deploy multiple GTK versions at the same time.\"\n    echo \"Please set DEPLOY_GTK_VERSION to {2, 3, 4}.\"\n    exit 1\nelif [ \"$DEPLOY_GTK_VERSION\" -eq 0 ]; then\n    echo \"$0: failed to auto-detect GTK version.\"\n    echo \"Please set DEPLOY_GTK_VERSION to {2, 3, 4}.\"\n    exit 1\nfi\n\necho \"Installing AppRun hook\"\nHOOKSDIR=\"$APPDIR/apprun-hooks\"\nHOOKFILE=\"$HOOKSDIR/linuxdeploy-plugin-gtk.sh\"\nmkdir -p \"$HOOKSDIR\"\ncat > \"$HOOKFILE\" <<\\EOF\n#! /usr/bin/env bash\n\nCOLOR_SCHEME=\"$(dbus-send --session --dest=org.freedesktop.portal.Desktop --type=method_call --print-reply --reply-timeout=1000 /org/freedesktop/portal/desktop org.freedesktop.portal.Settings.Read 'string:org.freedesktop.appearance' 'string:color-scheme' 2> /dev/null | tail -n1 | cut -b35- | cut -d' ' -f2 || printf '')\"\nif [ -z \"$COLOR_SCHEME\" ]; then\n    COLOR_SCHEME=\"$(gsettings get org.gnome.desktop.interface color-scheme 2> /dev/null || printf '')\"\nfi\ncase \"$COLOR_SCHEME\" in\n    \"1\"|\"'prefer-dark'\")  GTK_THEME_VARIANT=\"dark\";;\n    \"2\"|\"'prefer-light'\") GTK_THEME_VARIANT=\"light\";;\n    *)                    GTK_THEME_VARIANT=\"light\";;\nesac\nAPPIMAGE_GTK_THEME=\"${APPIMAGE_GTK_THEME:-\"Adwaita:$GTK_THEME_VARIANT\"}\" # Allow user to override theme (discouraged)\n\nexport APPDIR=\"${APPDIR:-\"$(dirname \"$(realpath \"$0\")\")\"}\" # Workaround to run extracted AppImage\nexport GTK_DATA_PREFIX=\"$APPDIR\"\nexport GTK_THEME=\"$APPIMAGE_GTK_THEME\" # Custom themes are broken\nexport GDK_BACKEND=x11 # Crash with Wayland backend on Wayland\nexport XDG_DATA_DIRS=\"$APPDIR/usr/share:/usr/share:$XDG_DATA_DIRS\" # g_get_system_data_dirs() from GLib\nEOF\n\necho \"Installing GLib schemas\"\n# Note: schemasdir is undefined on Ubuntu 16.04\nglib_schemasdir=\"$(get_pkgconf_variable \"schemasdir\" \"gio-2.0\" \"/usr/share/glib-2.0/schemas\")\"\ncopy_tree \"$glib_schemasdir\" \"$APPDIR/\"\nglib-compile-schemas \"$APPDIR/$glib_schemasdir\"\ncat >> \"$HOOKFILE\" <<EOF\nexport GSETTINGS_SCHEMA_DIR=\"\\$APPDIR/$glib_schemasdir\"\nEOF\n\necho \"Installing GIRepository Typelibs\"\ngi_typelibsdir=\"$(get_pkgconf_variable \"typelibdir\" \"gobject-introspection-1.0\" \"$LD_GTK_LIBRARY_PATH/girepository-1.0\")\"\ncopy_lib_tree \"$gi_typelibsdir\" \"$APPDIR/\"\ncat >> \"$HOOKFILE\" <<EOF\nexport GI_TYPELIB_PATH=\"\\$APPDIR/${gi_typelibsdir/$LD_GTK_LIBRARY_PATH//usr/lib}\"\nEOF\n\ncase \"$DEPLOY_GTK_VERSION\" in\n    2)\n        # https://github.com/linuxdeploy/linuxdeploy-plugin-gtk/pull/20#issuecomment-826354261\n        echo \"WARNING: Gtk+2 applications are not fully supported by this plugin\"\n        ;;\n    3)\n        echo \"Installing GTK 3.0 modules\"\n        gtk3_exec_prefix=\"$(get_pkgconf_variable \"exec_prefix\" \"gtk+-3.0\" \"/usr\")\"\n        gtk3_libdir=\"$(get_pkgconf_variable \"libdir\" \"gtk+-3.0\" \"$LD_GTK_LIBRARY_PATH\")/gtk-3.0\"\n        gtk3_path=\"$gtk3_libdir\"\n        gtk3_immodulesdir=\"$gtk3_libdir/$(get_pkgconf_variable \"gtk_binary_version\" \"gtk+-3.0\" \"3.0.0\")/immodules\"\n        gtk3_printbackendsdir=\"$gtk3_libdir/$(get_pkgconf_variable \"gtk_binary_version\" \"gtk+-3.0\" \"3.0.0\")/printbackends\"\n        gtk3_immodules_cache_file=\"$(dirname \"$gtk3_immodulesdir\")/immodules.cache\"\n        gtk3_immodules_query=\"$(search_tool \"gtk-query-immodules-3.0\" \"libgtk-3-0\")\"\n        copy_lib_tree \"$gtk3_libdir\" \"$APPDIR/\"\n        cat >> \"$HOOKFILE\" <<EOF\nexport GTK_EXE_PREFIX=\"\\$APPDIR/$gtk3_exec_prefix\"\nexport GTK_PATH=\"\\$APPDIR/${gtk3_path/$LD_GTK_LIBRARY_PATH//usr/lib}\"\nexport GTK_IM_MODULE_FILE=\"\\$APPDIR/${gtk3_immodules_cache_file/$LD_GTK_LIBRARY_PATH//usr/lib}\"\nEOF\n\n        if [ -x \"$gtk3_immodules_query\" ]; then\n            echo \"Updating immodules cache in $APPDIR/${gtk3_immodules_cache_file/$LD_GTK_LIBRARY_PATH//usr/lib}\"\n            \"$gtk3_immodules_query\" > \"$APPDIR/${gtk3_immodules_cache_file/$LD_GTK_LIBRARY_PATH//usr/lib}\"\n        else\n            echo \"WARNING: gtk-query-immodules-3.0 not found\"\n        fi\n        if [ ! -f \"$APPDIR/${gtk3_immodules_cache_file/$LD_GTK_LIBRARY_PATH//usr/lib}\" ]; then\n            echo \"WARNING: immodules.cache file is missing\"\n        fi\n        sed -i \"s|$gtk3_libdir/3.0.0/immodules/||g\" \"$APPDIR/${gtk3_immodules_cache_file/$LD_GTK_LIBRARY_PATH//usr/lib}\"\n        ;;\n    4)\n        echo \"Installing GTK 4.0 modules\"\n        gtk4_exec_prefix=\"$(get_pkgconf_variable \"exec_prefix\" \"gtk4\" \"/usr\")\"\n        gtk4_libdir=\"$(get_pkgconf_variable \"libdir\" \"gtk4\")/gtk-4.0\"\n        gtk4_path=\"$gtk4_libdir\"\n        copy_lib_tree \"$gtk4_libdir\" \"$APPDIR/\"\n        cat >> \"$HOOKFILE\" <<EOF\nexport GTK_EXE_PREFIX=\"\\$APPDIR/$gtk4_exec_prefix\"\nexport GTK_PATH=\"\\$APPDIR/${gtk4_path/$LD_GTK_LIBRARY_PATH//usr/lib}\"\nEOF\n        ;;\n    *)\n        echo \"$0: '$DEPLOY_GTK_VERSION' is not a valid GTK major version.\"\n        echo \"Please set DEPLOY_GTK_VERSION to {2, 3, 4}.\"\n        exit 1\nesac\n\necho \"Installing GDK PixBufs\"\ngdk_libdir=\"$(get_pkgconf_variable \"libdir\" \"gdk-pixbuf-2.0\" \"$LD_GTK_LIBRARY_PATH\")\"\ngdk_pixbuf_binarydir=\"$(get_pkgconf_variable \"gdk_pixbuf_binarydir\" \"gdk-pixbuf-2.0\" \"$gdk_libdir/gdk-pixbuf-2.0/2.10.0\")\"\ngdk_pixbuf_cache_file=\"$(get_pkgconf_variable \"gdk_pixbuf_cache_file\" \"gdk-pixbuf-2.0\" \"$gdk_pixbuf_binarydir/loaders.cache\")\"\ngdk_pixbuf_moduledir=\"$(get_pkgconf_variable \"gdk_pixbuf_moduledir\" \"gdk-pixbuf-2.0\" \"$gdk_pixbuf_binarydir/loaders\")\"\n# Note: gdk_pixbuf_query_loaders variable is not defined on some systems\ngdk_pixbuf_query=\"$(search_tool \"gdk-pixbuf-query-loaders\" \"gdk-pixbuf-2.0\")\"\ncopy_lib_tree \"$gdk_pixbuf_binarydir\" \"$APPDIR/\"\ncat >> \"$HOOKFILE\" <<EOF\nexport GDK_PIXBUF_MODULE_FILE=\"\\$APPDIR/${gdk_pixbuf_cache_file/$LD_GTK_LIBRARY_PATH//usr/lib}\"\nEOF\nif [ -x \"$gdk_pixbuf_query\" ]; then\n    echo \"Updating pixbuf cache in $APPDIR/${gdk_pixbuf_cache_file/$LD_GTK_LIBRARY_PATH//usr/lib}\"\n    \"$gdk_pixbuf_query\" > \"$APPDIR/${gdk_pixbuf_cache_file/$LD_GTK_LIBRARY_PATH//usr/lib}\"\nelse\n    echo \"WARNING: gdk-pixbuf-query-loaders not found\"\nfi\nif [ ! -f \"$APPDIR/${gdk_pixbuf_cache_file/$LD_GTK_LIBRARY_PATH//usr/lib}\" ]; then\n    echo \"WARNING: loaders.cache file is missing\"\nfi\nsed -i \"s|$gdk_pixbuf_moduledir/||g\" \"$APPDIR/${gdk_pixbuf_cache_file/$LD_GTK_LIBRARY_PATH//usr/lib}\"\n\necho \"Copying more libraries\"\ngobject_libdir=\"$(get_pkgconf_variable \"libdir\" \"gobject-2.0\" \"$LD_GTK_LIBRARY_PATH\")\"\ngio_libdir=\"$(get_pkgconf_variable \"libdir\" \"gio-2.0\" \"$LD_GTK_LIBRARY_PATH\")\"\nlibrsvg_libdir=\"$(get_pkgconf_variable \"libdir\" \"librsvg-2.0\" \"$LD_GTK_LIBRARY_PATH\")\"\npango_libdir=\"$(get_pkgconf_variable \"libdir\" \"pango\" \"$LD_GTK_LIBRARY_PATH\")\"\npangocairo_libdir=\"$(get_pkgconf_variable \"libdir\" \"pangocairo\" \"$LD_GTK_LIBRARY_PATH\")\"\npangoft2_libdir=\"$(get_pkgconf_variable \"libdir\" \"pangoft2\" \"$LD_GTK_LIBRARY_PATH\")\"\nFIND_ARRAY=(\n    \"$gdk_libdir\"        \"libgdk_pixbuf-*.so*\"\n    \"$gobject_libdir\"    \"libgobject-*.so*\"\n    \"$gio_libdir\"        \"libgio-*.so*\"\n    \"$librsvg_libdir\"    \"librsvg-*.so*\"\n    \"$pango_libdir\"      \"libpango-*.so*\"\n    \"$pangocairo_libdir\" \"libpangocairo-*.so*\"\n    \"$pangoft2_libdir\"   \"libpangoft2-*.so*\"\n)\nLIBRARIES=()\nfor (( i=0; i<${#FIND_ARRAY[@]}; i+=2 )); do\n    directory=${FIND_ARRAY[i]}\n    library=${FIND_ARRAY[i+1]}\n    while IFS= read -r -d '' file; do\n        LIBRARIES+=( \"--library=$file\" )\n    done < <(find \"$directory\" \\( -type l -o -type f \\) -name \"$library\" -print0)\ndone\n\nenv LINUXDEPLOY_PLUGIN_MODE=1 \"$LINUXDEPLOY\" --appdir=\"$APPDIR\" \"${LIBRARIES[@]}\"\n\n# Create symbolic links as a workaround\n# Details: https://github.com/linuxdeploy/linuxdeploy-plugin-gtk/issues/24#issuecomment-1030026529\necho \"Manually setting rpath for GTK modules\"\nPATCH_ARRAY=(\n    \"$gtk3_immodulesdir\"\n    \"$gtk3_printbackendsdir\"\n    \"$gdk_pixbuf_moduledir\"\n)\nfor directory in \"${PATCH_ARRAY[@]}\"; do\n    while IFS= read -r -d '' file; do\n        ln $verbose -sf \"${file/$LD_GTK_LIBRARY_PATH\\//}\" \"$APPDIR/usr/lib\"\n    done < <(find \"$directory\" -name '*.so' -print0)\ndone\n"
  },
  {
    "path": "macos/Info.plist.in",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleExecutable</key>\n  <string>keyboard-configurator</string>\n  <key>CFBundlePackageType</key>\n  <string>APPL</string>\n  <key>CFBundleVersion</key>\n  <string>{crate_version}</string>\n  <key>CFBundleIconFile</key>\n  <string>keyboard-configurator</string>\n  <key>CFBundleIdentifier</key>\n  <string>com.system76.keyboardconfigurator</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleDisplayName</key>\n  <string>System76 Keyboard Configurator</string>\n  <key>CFBundleName</key>\n  <string>System76 Keyboard Configurator</string>\n  <key>NSHighResolutionCapable</key>\n  <true/>\n</dict>\n</plist>\n\n"
  },
  {
    "path": "macos/README.md",
    "content": "### Files\n- `build.py` - Builds with Cargo, generates a `.app` bundle, and build a `.dmg`\n- `Info.plist.in` - Used to generate `Info.plist`, processing with Python `.format()`\n- `appdmg.json` - Configuration file for [node-appdmg](https://github.com/LinusU/node-appdmg)\n\n### Building\n`./build.py --release` should generate a `.dmg`\n"
  },
  {
    "path": "macos/appdmg.json",
    "content": "{\n  \"title\": \"Keyboard Configurator\",\n  \"icon\": \"keyboard-configurator.icns\",\n  \"background\": \"background.png\",\n  \"contents\": [\n    { \"x\": 448, \"y\": 334, \"type\": \"link\", \"path\": \"/Applications\" },\n    { \"x\": 192, \"y\": 334, \"type\": \"file\", \"path\": \"System76 Keyboard Configurator.app\" }\n  ]\n}\n"
  },
  {
    "path": "macos/build.py",
    "content": "#!/usr/bin/env python3\n\nimport argparse\nimport json\nimport os\nimport shutil\nimport subprocess\nimport sys\nimport tempfile\n\nfrom deploy import deploy_with_deps\n\n# Handle commandline arguments\nparser = argparse.ArgumentParser()\nparser.add_argument('--release', action='store_true')\nparser.add_argument('--sign')\nargs = parser.parse_args()\n\n# Executables to install\nTARGET_DIR = \"../target/\" + ('release' if args.release else 'debug')\nICON = \"../data/icons/scalable/apps/com.system76.keyboardconfigurator.svg\"\nAPPDIR = 'System76 Keyboard Configurator.app'\n\n# Build the application\ncmd = [\"cargo\", \"build\"]\nif args.release:\n    cmd.append('--release')\nsubprocess.check_call(cmd)\n\n# Extract crate version from cargo\nmeta_str = subprocess.check_output([\"cargo\", \"metadata\", \"--format-version\", \"1\", \"--no-deps\"])\nmeta = json.loads(meta_str)\npackage = next(i for i in meta['packages'] if i['name'] == 'system76-keyboard-configurator')\ncrate_version = package['version']\n\n# Remove old app dir\nif os.path.exists(APPDIR):\n    shutil.rmtree(APPDIR)\nos.makedirs(APPDIR + '/Contents/Resources', exist_ok=True)\n\n# Generate Info.plist from Info.plist.in\nwith open(\"Info.plist.in\") as f:\n    plist = f.read().format(crate_version=crate_version)\nwith open(APPDIR + '/Contents/Info.plist', \"w\") as f:\n    f.write(plist)\n\n# Generate .icns icon file\nwith tempfile.TemporaryDirectory('.iconset') as d:\n    for i in [16, 32, 64, 128, 256, 512]:\n        outname = \"{}/icon_{}x{}.png\".format(d, i, i)\n        subprocess.check_call([\"rsvg-convert\", \"--width\", str(i), \"--height\", str(i), \"-o\", outname, ICON])\n\n        # hidpi icon\n        outname = \"{}/icon_{}x{}x2.png\".format(d, i, i)\n        subprocess.check_call([\"rsvg-convert\", \"--width\", str(i * 2), \"--height\", str(i * 2), \"-o\", outname, ICON])\n\n    subprocess.check_call([\"iconutil\", \"--convert\", \"icns\", \"--output\", 'keyboard-configurator.icns', d])\n    shutil.copy('keyboard-configurator.icns', f'{APPDIR}/Contents/Resources/keyboard-configurator.icns')\n\n# Generate background png\nsubprocess.check_call([\"rsvg-convert\", \"--width\", \"640\", \"--height\", \"480\", \"-o\", \"background.png\", \"background.svg\"])\n\n# Copy executable\nsubprocess.check_call([f\"strip\", '-o', f\"keyboard-configurator\", f\"{TARGET_DIR}/system76-keyboard-configurator\"])\n\n# Build .app bundle\ndeploy_with_deps('keyboard-configurator')\n\nif args.sign is not None:\n    # Sign all .dylib files in the Resources folder\n    subprocess.check_call([\n        \"find\", APPDIR + \"/Contents/Resources\",\n        \"-name\", \"*.dylib\",\n        \"-exec\", \"codesign\", \"--force\", \"--verbose\", \"--sign\", args.sign, \"{}\", \";\"])\n    # Sign all .so files in the Resources folder\n    subprocess.check_call([\n        \"find\", APPDIR + \"/Contents/Resources\",\n        \"-name\", \"*.so\",\n        \"-exec\", \"codesign\", \"--force\", \"--verbose\", \"--sign\", args.sign, \"{}\", \";\"])\n    # Sign app bundle (with hardened runtime)\n    subprocess.check_call([\"codesign\", \"--force\", \"--verbose\", \"--deep\", \"--options\", \"runtime\", \"--sign\", args.sign, APPDIR])\n\n# Build .dmg\nif os.path.exists(\"keyboard-configurator.dmg\"):\n    os.remove(\"keyboard-configurator.dmg\")\nsubprocess.check_call([\"appdmg\", \"appdmg.json\", \"keyboard-configurator.dmg\"])\n"
  },
  {
    "path": "macos/deploy.py",
    "content": "import hashlib\nimport platform\nimport os\nimport re\nimport shutil\nimport subprocess\n\nAPPDIR = 'System76 Keyboard Configurator.app'\nBINDIR = APPDIR + '/Contents/MacOS'\nRESOURCEDIR = APPDIR + '/Contents/Resources'\nif platform.machine() == 'arm64':\n    PREFIX = '/opt/homebrew'\nelse:\n    PREFIX = '/usr/local'\nif not os.path.exists(PREFIX):\n    if os.path.exists('/opt/local'):\n        print(\"Homebrew not found, using MacPorts\")\n        PREFIX = '/opt/local'\n    else:\n        print(\"Homebrew and MacPorts not found\")\n        sys.exit(1)\n\nADWAITA_FILES = [\n    'index.theme',\n    'symbolic/actions/open-menu-symbolic.svg',\n    'symbolic/ui/window-close-symbolic.svg',\n    'symbolic/ui/window-maximize-symbolic.svg',\n    'symbolic/ui/window-minimize-symbolic.svg',\n    'symbolic/ui/window-restore-symbolic.svg',\n    'symbolic/actions/edit-delete-symbolic.svg',\n    'symbolic/actions/go-previous-symbolic.svg',\n    'symbolic/actions/list-remove-symbolic.svg',\n    'symbolic/actions/list-add-symbolic.svg',\n    'symbolic/actions/edit-find-symbolic.svg',\n]\nADWAITA_FILES = [f'share/icons/Adwaita/{i}' for i in ADWAITA_FILES]\nADDITIONAL_FILES = ['share/glib-2.0/schemas/org.gtk.Settings.FileChooser.gschema.xml'] + ADWAITA_FILES\n\ndef copy(srcdir, destdir, path):\n    src = f\"{srcdir}/{path}\"\n    dest = f\"{destdir}/{path}\"\n    os.makedirs(os.path.dirname(dest), exist_ok=True)\n    print(f\"Copy {src} -> {dest}\")\n    if os.path.isdir(src):\n        shutil.copytree(src, dest)\n    else:\n        shutil.copy(src, dest)\n\ndef otool_recursive(path, libs):\n    output = subprocess.check_output([\"otool\", \"-L\", path]).decode()\n    for i in output.splitlines():\n        m = re.match('\\t(' + PREFIX + '.*.dylib)', i)\n        if m is not None:\n            dep = m.group(1)\n            if dep not in libs:\n                libs.add(dep)\n                otool_recursive(dep, libs)\n    return libs\n\ndef shasum(path):\n    m = hashlib.sha256()\n    with open(path, 'rb') as f:\n        m.update(f.read())\n    return m.digest()\n\ndef newpath(path):\n    relpath = os.path.relpath(path, PREFIX)\n    return os.path.join(RESOURCEDIR, relpath)\n\ndef deploy_with_deps(binpath):\n    pixbuf_ver = subprocess.check_output(['pkg-config', '--variable=gdk_pixbuf_binary_version', 'gdk-pixbuf-2.0']).decode().strip()\n    pixbuf_dir = f\"{PREFIX}/lib/gdk-pixbuf-2.0/{pixbuf_ver}/loaders\"\n    pixbuf_libs = [f\"{pixbuf_dir}/{i}\" for i in os.listdir(pixbuf_dir) if i.endswith('.so')]\n\n    deps = set()\n    otool_recursive(binpath, deps)\n    for lib in pixbuf_libs:\n        otool_recursive(lib, deps)\n\n    # TODO: Parse `LC_RPATH` instead of special casing?\n    rsvg_libdir = subprocess.check_output(['pkg-config', 'librsvg-2.0', '--variable=libdir']).decode().strip()\n    rsvg_lib = f\"{rsvg_libdir}/librsvg-2.2.dylib\"\n    deps.add(rsvg_lib)\n\n    duplicates = {}\n    shasums = {}\n    for i in deps:\n        cksum = shasum(i)\n        if cksum in shasums:\n            duplicates[i] = shasums[cksum]\n        else:\n            shasums[cksum] = i\n\n    cmd = ['install_name_tool']\n    for i in deps:\n        dest = newpath(duplicates.get(i, i))\n        cmd += ['-change', i, '@executable_path/' + os.path.relpath(dest, BINDIR)]\n    cmd += ['-change', '@rpath/librsvg-2.2.dylib', '@executable_path/' + os.path.relpath(newpath(rsvg_lib), BINDIR)]\n\n    def copy_and_install_name_tool(src, dest):\n        os.makedirs(os.path.dirname(dest), exist_ok=True)\n        shutil.copy(src, dest)\n        subprocess.check_call(cmd + [dest])\n        # Generate new \"adhoc\" signature for modified binary (required on arm64)\n        subprocess.check_call(['codesign', '-f', '-s', '-', dest])\n\n    copy_and_install_name_tool(binpath, os.path.join(BINDIR, os.path.basename(binpath) + '-bin'))\n    for i in deps.union(set(pixbuf_libs)):\n        if i not in duplicates:\n            copy_and_install_name_tool(i, newpath(i))\n    shutil.copy(f'launcher.sh', os.path.join(BINDIR, os.path.basename(binpath)))\n\n    with open(f'{APPDIR}/Contents/PkgInfo', 'w') as f:\n        f.write('APPL????')\n\n    shutil.copytree(f'{PREFIX}/share/icons/hicolor', f'{APPDIR}/Contents/Resources/share/icons/hicolor')\n\n    for i in ADDITIONAL_FILES:\n        copy(PREFIX, f'{APPDIR}/Contents/Resources', i)\n    subprocess.check_call([\"glib-compile-schemas\", f\"{APPDIR}/Contents/Resources/share/glib-2.0/schemas\"])\n\n    module_dir = f\"{RESOURCEDIR}/lib/gdk-pixbuf-2.0/{pixbuf_ver}\"\n    with open(f\"{module_dir}/loaders.cache\", 'w') as cachefile:\n        cache = subprocess.check_output(['gdk-pixbuf-query-loaders'], env=dict(os.environ, GDK_PIXBUF_MODULEDIR=pixbuf_dir)).decode()\n        cachefile.write(re.sub(f'{PREFIX}/.+/gdk-pixbuf-2.0/', '@executable_path/../Resources/lib/gdk-pixbuf-2.0/', cache))\n"
  },
  {
    "path": "macos/launcher.sh",
    "content": "#!/bin/sh\n\n# https://gitlab.gnome.org/GNOME/gtk-mac-bundler/-/blob/master/examples/gtk3-launcher.sh\n\nif test \"x$GTK_DEBUG_LAUNCHER\" != x; then\n    set -x\nfi\n\nif test \"x$GTK_DEBUG_GDB\" != x; then\n    EXEC=\"gdb --args\"\nelse\n    EXEC=exec\nfi\n\nname=`basename \"$0\"`\ntmp=\"$0\"\ntmp=`dirname \"$tmp\"`\ntmp=`dirname \"$tmp\"`\nbundle=`dirname \"$tmp\"`\nbundle_contents=\"$bundle\"/Contents\nbundle_res=\"$bundle_contents\"/Resources\nbundle_lib=\"$bundle_res\"/lib\nbundle_bin=\"$bundle_res\"/bin\nbundle_data=\"$bundle_res\"/share\nbundle_etc=\"$bundle_res\"/etc\n\nexport XDG_CONFIG_DIRS=\"$bundle_etc\"/xdg\nexport XDG_DATA_DIRS=\"$bundle_data\"\nexport GTK_DATA_PREFIX=\"$bundle_res\"\nexport GTK_EXE_PREFIX=\"$bundle_res\"\nexport GTK_PATH=\"$bundle_res\"\n\nexport GDK_PIXBUF_MODULE_FILE=\"$bundle_lib/gdk-pixbuf-2.0/2.10.0/loaders.cache\"\nif [ `uname -r | cut -d . -f 1` -ge 10 ]; then\n    export GTK_IM_MODULE_FILE=\"$bundle_lib/gtk-3.0/3.0.0/immodules.cache\"\nfi\n\nAPP=$name\nI18NDIR=\"$bundle_data/locale\"\n# Set the locale-related variables appropriately:\nunset LANG LC_MESSAGES LC_MONETARY LC_COLLATE\n\n# Has a language ordering been set?\n# If so, set LC_MESSAGES and LANG accordingly; otherwise skip it.\n# First step uses sed to clean off the quotes and commas, to change - to _, and change the names for the chinese scripts from \"Hans\" to CN and \"Hant\" to TW.\nAPPLELANGUAGES=`defaults read .GlobalPreferences AppleLanguages | sed -En   -e 's/\\-/_/' -e 's/Hant/TW/' -e 's/Hans/CN/' -e 's/[[:space:]]*\\\"?([[:alnum:]_]+)\\\"?,?/\\1/p' `\nif test \"$APPLELANGUAGES\"; then\n    # A language ordering exists.\n    # Test, item per item, to see whether there is an corresponding locale.\n    for L in $APPLELANGUAGES; do\n        #test for exact matches:\n       if test -f \"$I18NDIR/${L}/LC_MESSAGES/$APP.mo\"; then\n            export LANG=$L\n            break\n        fi\n        # This is a special case, because often the original strings are in US\n        # English and there is no translation file.\n        if test \"x$L\" == \"xen_US\"; then\n            export LANG=$L\n            break\n        fi\n        #OK, now test for just the first two letters:\n        if test -f \"$I18NDIR/${L:0:2}/LC_MESSAGES/$APP.mo\"; then\n            export LANG=${L:0:2}\n            break\n        fi\n        #Same thing, but checking for any english variant.\n        if test \"x${L:0:2}\" == \"xen\"; then\n            export LANG=$L\n            break\n        fi;\n    done\nfi\nunset APPLELANGUAGES L\n\n# If we didn't get a language from the language list, try the Collation preference, in case it's the only setting that exists.\nAPPLECOLLATION=`defaults read .GlobalPreferences AppleCollationOrder`\nif test -z ${LANG} && test -n $APPLECOLLATION; then\n    if test -f \"$I18NDIR/${APPLECOLLATION:0:2}/LC_MESSAGES/$APP.mo\"; then\n        export LANG=${APPLECOLLATION:0:2}\n    fi\nfi\nif test -n $APPLECOLLATION; then\n    export LC_COLLATE=$APPLECOLLATION\nfi\nunset APPLECOLLATION\n\n# Continue by attempting to find the Locale preference.\nAPPLELOCALE=`defaults read .GlobalPreferences AppleLocale`\n\nif test -f \"$I18NDIR/${APPLELOCALE:0:5}/LC_MESSAGES/$APP.mo\"; then\n    if test -z $LANG; then\n        export LANG=\"${APPLELOCALE:0:5}\"\n    fi\n\nelif test -z $LANG && test -f \"$I18NDIR/${APPLELOCALE:0:2}/LC_MESSAGES/$APP.mo\"; then\n    export LANG=\"${APPLELOCALE:0:2}\"\nfi\n\n# Next we need to set LC_MESSAGES. If at all possible, we want a full\n# 5-character locale to avoid the \"Locale not supported by C library\"\n# warning from Gtk -- even though Gtk will translate with a\n# two-character code.\nif test -n $LANG; then\n    # If the language code matches the applelocale, then that's the message\n    # locale; otherwise, if it's longer than two characters, then it's\n    # probably a good message locale and we'll go with it.\n    if test $LANG == ${APPLELOCALE:0:5} || test $LANG != ${LANG:0:2}; then\n        export LC_MESSAGES=$LANG\n# Next try if the Applelocale is longer than 2 chars and the language\n# bit matches $LANG\n    elif test $LANG == ${APPLELOCALE:0:2} && test $APPLELOCALE > ${APPLELOCALE:0:2}; then\n        export LC_MESSAGES=${APPLELOCALE:0:5}\n    # Fail. Get a list of the locales in $I18DIR that match\n    # our two letter language code and pick the first one, special casing\n    # english to set en_US\n    elif test $LANG == \"en\"; then\n        export LC_MESSAGES=\"en_US\"\n    else\n        LOC=`find $I18DIR -name $LANG???`\n        for L in $LOC; do\n            export LC_MESSAGES=$L\n        done\n    fi\nelse\n    # All efforts have failed, so default to US english\n    export LANG=\"en_US\"\n    export LC_MESSAGES=\"en_US\"\nfi\nCURRENCY=`echo $APPLELOCALE |  sed -En 's/.*currency=([[:alpha:]]+).*/\\1/p'`\nif test -n \"$CURRENCY\"; then\n   # The user has set a special currency. Gtk doesn't install\n   # LC_MONETARY files, but Apple does in /usr/share/locale, so we're\n   # going to look there for a locale to set LC_CURRENCY to.\n    if test -f /usr/local/share/$LC_MESSAGES/LC_MONETARY; then\n        if test `cat /usr/local/share/$LC_MESSAGES/LC_MONETARY` == $CURRENCY; then\n            export LC_MONETARY=$LC_MESSAGES\n        fi\n    fi\n    if test -z \"$LC_MONETARY\"; then\n        FILES=`find /usr/share/locale -name LC_MONETARY -exec grep -H $CURRENCY {} \\;`\n        if test -n \"$FILES\"; then\n            export LC_MONETARY=`echo $FILES | sed -En 's%/usr/share/locale/([[:alpha:]_]+)/LC_MONETARY.*%\\1%p'`\n        fi\n    fi\nfi\n# No currency value means that the AppleLocale governs:\nif test -z \"$LC_MONETARY\"; then\n    LC_MONETARY=${APPLELOCALE:0:5}\nfi\n# For Gtk, which only looks at LC_ALL:\nexport LC_ALL=$LC_MESSAGES\n\nunset APPLELOCALE FILES LOC\n\nif test -f \"$bundle_lib/charset.alias\"; then\n    export CHARSETALIASDIR=\"$bundle_lib\"\nfi\n\n# Extra arguments can be added in environment.sh.\nEXTRA_ARGS=\nif test -f \"$bundle_res/environment.sh\"; then\n    source \"$bundle_res/environment.sh\"\nfi\n\n# Strip out the argument added by the OS.\nif /bin/expr \"x$1\" : '^x-psn_' > /dev/null; then\n    shift 1\nfi\n\n$EXEC \"$bundle_contents/MacOS/$name-bin\" \"$@\" $EXTRA_ARGS\n"
  },
  {
    "path": "macos/signing.sh",
    "content": "#!/usr/bin/env bash\n\nset -e\n\nif [ -z \"${MACOS_CERTIFICATE}\" ]\nthen\n\techo \"Set MACOS_CERTIFICATE to base64 encoded certificate\" >&2\n\texit 1\nfi\n\n# Set up keychain\nKEYCHAIN=system76-keyboard-configurator.keychain\nPASSWORD=\"$(uuidgen)\"\nsecurity create-keychain -p \"${PASSWORD}\" \"${KEYCHAIN}\"\nsecurity default-keychain -s \"${KEYCHAIN}\"\nsecurity unlock-keychain -p \"${PASSWORD}\" \"${KEYCHAIN}\"\nsecurity set-keychain-settings -t 3600 -u \"${KEYCHAIN}\"\necho \"${MACOS_CERTIFICATE}\" | base64 --decode > certificate.p12\nsecurity import certificate.p12 -P \"\" -k \"${KEYCHAIN}\" -T /usr/bin/codesign\nrm -f certificate.p12\nsecurity set-key-partition-list -S apple-tool:,apple: -s -k \"${PASSWORD}\" \"${KEYCHAIN}\"\n\n# Build with signing\n./build.py --sign System76 \"$@\"\n\n# Delete keychain\nsecurity delete-keychain \"${KEYCHAIN}\"\n\n# Submit for notarization\nxcrun notarytool submit \\\n    --apple-id \"${AC_USERNAME}\" \\\n    --team-id 'Y3W4TDQXXQ' \\\n    --password \"${AC_PASSWORD}\" \\\n    --wait \\\n    keyboard-configurator.dmg\n\n# Try to staple notarization\nset +e\nattempts=30\nfor attempt in $(seq 1 $attempts)\ndo\n    echo \"Staple attempt $attempt/$attempts\"\n    xcrun stapler staple keyboard-configurator.dmg\n    exit_status=\"$?\"\n\techo \"Staple exit status: ${exit_status}\"\n\tcase \"${exit_status}\" in\n\t\t0)\n\t\t\techo \"Staple successful\"\n\t\t\texit 0\n\t\t\t;;\n\t\t65)\n\t\t\techo \"Notarization may still be in progress\"\n\t\t\t;;\n\t\t*)\n\t\t\techo \"Staple exit status unknown\"\n\t\t\texit 1\n\t\t\t;;\n\tesac\n\tsleep 10\ndone\necho \"Staple timeout\"\nexit 1\n"
  },
  {
    "path": "rust-toolchain.toml",
    "content": "[toolchain]\nchannel = \"1.70.0\"\n"
  },
  {
    "path": "src/about_dialog.rs",
    "content": "use crate::fl;\nuse cascade::cascade;\nuse gtk::prelude::*;\n\npub fn show_about_dialog() {\n    cascade! {\n        gtk::AboutDialog::new();\n        ..set_titlebar(Some(&cascade! {\n            gtk::HeaderBar::new();\n            ..set_show_close_button(true);\n            ..show();\n        }));\n        ..set_title(&fl!(\"app-about\"));\n        ..set_program_name(&fl!(\"app-title\"));\n        ..set_version(Some(env!(\"CARGO_PKG_VERSION\")));\n        ..set_license_type(gtk::License::Gpl30);\n        ..set_logo_icon_name(Some(\"com.system76.keyboardconfigurator\"));\n        ..connect_response(|dialog, _| dialog.close());\n        ..show();\n    };\n}\n"
  },
  {
    "path": "src/backlight.rs",
    "content": "use crate::fl;\nuse cascade::cascade;\nuse futures::{prelude::*, stream::FuturesUnordered};\nuse gtk::{\n    glib::{self, clone, ControlFlow},\n    prelude::*,\n    subclass::prelude::*,\n};\nuse once_cell::sync::Lazy;\nuse std::cell::{Cell, RefCell};\n\nuse backend::{Board, DerefCell, Hs, Mode};\nuse widgets::{KeyboardColor, KeyboardColorIndex, SelectedKeys};\n\n#[derive(Default)]\npub struct BacklightInner {\n    board: DerefCell<Board>,\n    disable_color_button: DerefCell<gtk::Button>,\n    keyboard_color: DerefCell<KeyboardColor>,\n    color_label: DerefCell<gtk::Label>,\n    color_row: DerefCell<gtk::ListBoxRow>,\n    brightness_scale: DerefCell<gtk::Scale>,\n    brightness_label: DerefCell<gtk::Label>,\n    brightness_row: DerefCell<gtk::ListBoxRow>,\n    saturation_scale: DerefCell<gtk::Scale>,\n    saturation_row: DerefCell<gtk::ListBoxRow>,\n    mode_combobox: DerefCell<gtk::ComboBoxText>,\n    mode_row: DerefCell<gtk::ListBoxRow>,\n    speed_scale: DerefCell<gtk::Scale>,\n    speed_row: DerefCell<gtk::ListBoxRow>,\n    layer: Cell<usize>,\n    do_not_set: Cell<bool>,\n    selected: RefCell<SelectedKeys>,\n}\n\n#[glib::object_subclass]\nimpl ObjectSubclass for BacklightInner {\n    const NAME: &'static str = \"S76Backlight\";\n    type ParentType = gtk::ListBox;\n    type Type = Backlight;\n}\n\nimpl ObjectImpl for BacklightInner {\n    fn constructed(&self) {\n        let obj = self.obj();\n\n        self.do_not_set.set(true);\n\n        let mode_combobox = cascade! {\n            gtk::ComboBoxText::new();\n            ..connect_changed(clone!(@weak obj => move |_|\n                obj.mode_speed_changed();\n            ));\n        };\n\n        for mode in Mode::all() {\n            mode_combobox.append(Some(mode.id), &mode.name);\n        }\n\n        let speed_scale = cascade! {\n            gtk::Scale::with_range(gtk::Orientation::Horizontal, 0., 255., 1.);\n            ..set_halign(gtk::Align::Fill);\n            ..set_value_pos(gtk::PositionType::Right);\n            ..set_size_request(200, 0);\n            ..connect_value_changed(clone!(@weak obj => move |_|\n                obj.mode_speed_changed();\n            ));\n        };\n\n        let brightness_scale = cascade! {\n            gtk::Scale::with_range(gtk::Orientation::Horizontal, 0., 100., 1.);\n            ..set_halign(gtk::Align::Fill);\n            ..set_value_pos(gtk::PositionType::Right);\n            ..set_size_request(200, 0);\n            ..connect_value_changed(clone!(@weak obj => move |_|\n                obj.brightness_changed();\n            ));\n        };\n\n        let keyboard_color = KeyboardColor::new(None, KeyboardColorIndex::Layer(0));\n\n        let saturation_adjustment = cascade! {\n            gtk::Adjustment::new(0., 0., 100., 1., 1., 0.);\n            ..bind_property(\"value\", &keyboard_color, \"hs\")\n                .transform_from(|_, value: glib::Value| {\n                    let hs: &Hs = value.get().unwrap();\n                    Some((hs.s * 100.).to_value())\n                })\n                .transform_to(|_, value: glib::Value| {\n                    let s: f64 = value.get().unwrap();\n                    Some(Hs::new(0., s / 100.).to_value())\n                })\n                .flags(glib::BindingFlags::BIDIRECTIONAL)\n                .build();\n        };\n\n        let saturation_scale = cascade! {\n            gtk::Scale::new(gtk::Orientation::Horizontal, Some(&saturation_adjustment));\n            ..set_halign(gtk::Align::Fill);\n            ..set_value_pos(gtk::PositionType::Right);\n            ..set_digits(0);\n            ..set_size_request(200, 0);\n        };\n\n        fn row(widget: &impl IsA<gtk::Widget>) -> gtk::ListBoxRow {\n            cascade! {\n                gtk::ListBoxRow::new();\n                ..set_selectable(false);\n                ..set_activatable(false);\n                ..set_margin(8);\n                ..add(widget);\n            }\n        }\n\n        fn label_row(label: &str, widget: &impl IsA<gtk::Widget>) -> gtk::ListBoxRow {\n            row(&cascade! {\n                gtk::Box::new(gtk::Orientation::Horizontal, 8);\n                ..add(&cascade! {\n                    gtk::Label::new(Some(label));\n                    ..set_halign(gtk::Align::Start);\n                });\n                ..pack_end(widget, false, false, 0);\n            })\n        }\n\n        let disable_color_button = cascade! {\n            gtk::Button::with_label(&fl!(\"button-disable\"));\n            ..set_no_show_all(true);\n            ..connect_clicked(clone!(@weak obj => move |_| obj.disable_color_clicked()));\n        };\n\n        let color_label = gtk::Label::new(None);\n        let brightness_label = gtk::Label::new(Some(&fl!(\"layer-all-brightness\")));\n\n        let mode_row = label_row(&fl!(\"layer-color-pattern\"), &mode_combobox);\n        let speed_row = label_row(&fl!(\"layer-animation-speed\"), &speed_scale);\n        let saturation_row = label_row(&fl!(\"layer-saturation\"), &saturation_scale);\n        let color_row = row(&cascade! {\n            gtk::Box::new(gtk::Orientation::Horizontal, 8);\n            ..add(&color_label);\n            ..pack_end(&keyboard_color, false, false, 0);\n            ..pack_end(&disable_color_button, false, false, 0);\n        });\n        let brightness_row = row(&cascade! {\n            gtk::Box::new(gtk::Orientation::Horizontal, 8);\n            ..add(&brightness_label);\n            ..pack_end(&brightness_scale, false, false, 0);\n        });\n\n        cascade! {\n            obj;\n            ..set_valign(gtk::Align::Start);\n            ..style_context().add_class(\"frame\");\n            ..add(&mode_row);\n            ..add(&speed_row);\n            ..add(&saturation_row);\n            ..add(&color_row);\n            ..add(&brightness_row);\n        };\n\n        self.disable_color_button.set(disable_color_button);\n        self.keyboard_color.set(keyboard_color);\n        self.color_label.set(color_label);\n        self.color_row.set(color_row);\n        self.brightness_label.set(brightness_label);\n        self.brightness_scale.set(brightness_scale);\n        self.brightness_row.set(brightness_row);\n        self.mode_combobox.set(mode_combobox);\n        self.mode_row.set(mode_row);\n        self.speed_scale.set(speed_scale);\n        self.speed_row.set(speed_row);\n        self.saturation_scale.set(saturation_scale);\n        self.saturation_row.set(saturation_row);\n    }\n\n    fn dispose(&self) {\n        self.obj().led_save();\n    }\n\n    fn properties() -> &'static [glib::ParamSpec] {\n        static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {\n            vec![\n                glib::ParamSpecString::builder(\"mode\").read_only().build(),\n                glib::ParamSpecBoxed::builder::<SelectedKeys>(\"selected\")\n                    .write_only()\n                    .build(),\n                glib::ParamSpecBoolean::builder(\"is-per-key\")\n                    .read_only()\n                    .build(),\n            ]\n        });\n\n        PROPERTIES.as_ref()\n    }\n\n    fn set_property(&self, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) {\n        match pspec.name() {\n            \"selected\" => {\n                let selected: &SelectedKeys = value.get().unwrap();\n                self.selected.replace(selected.clone());\n                self.obj().update_per_key();\n            }\n            _ => unimplemented!(),\n        }\n    }\n\n    fn property(&self, _id: usize, pspec: &glib::ParamSpec) -> glib::Value {\n        match pspec.name() {\n            \"mode\" => self.obj().mode().id.to_value(),\n            \"is-per-key\" => self.obj().mode().is_per_key().to_value(),\n            _ => unimplemented!(),\n        }\n    }\n}\n\nimpl WidgetImpl for BacklightInner {}\nimpl ContainerImpl for BacklightInner {}\nimpl ListBoxImpl for BacklightInner {}\n\nglib::wrapper! {\n    pub struct Backlight(ObjectSubclass<BacklightInner>)\n        @extends gtk::ListBox, gtk::Container, gtk::Widget;\n}\n\nimpl Backlight {\n    pub fn new(board: Board) -> Self {\n        let max_brightness = board.max_brightness() as f64;\n        let has_led_save = board.has_led_save();\n\n        let obj: Self = glib::Object::new();\n        obj.inner().board.set(board.clone());\n        obj.inner().keyboard_color.set_board(Some(board));\n        obj.inner().brightness_scale.set_range(0.0, max_brightness);\n        obj.invalidate_filter();\n        obj.set_layer(0);\n        obj.set_filter_func(Some(Box::new(\n            clone!(@weak obj => @default-panic, move |row|\n                obj.filter_func(row)\n            ),\n        )));\n        obj.set_header_func(Some(Box::new(clone!(@weak obj => move |row, before|\n            obj.header_func(row, before)\n        ))));\n\n        if !obj.board().layout().meta.has_per_layer {\n            obj.inner()\n                .brightness_label\n                .set_label(&fl!(\"keyboard-brightness\"));\n        }\n\n        if has_led_save {\n            glib::timeout_add_seconds_local(\n                10,\n                clone!(@weak obj => @default-return ControlFlow::Break, move || {\n                    obj.led_save();\n                    ControlFlow::Continue\n                }),\n            );\n        }\n\n        obj\n    }\n\n    fn inner(&self) -> &BacklightInner {\n        BacklightInner::from_obj(self)\n    }\n\n    fn board(&self) -> &Board {\n        &self.inner().board\n    }\n\n    pub fn mode(&self) -> &'static Mode {\n        if let Some(id) = self.inner().mode_combobox.active_id() {\n            if let Some(mode) = Mode::from_id(id.as_str()) {\n                return mode;\n            }\n        }\n        Mode::from_id(\"SOLID_COLOR\").unwrap()\n    }\n\n    fn header_func(&self, row: &gtk::ListBoxRow, before: Option<&gtk::ListBoxRow>) {\n        if before.is_none() {\n            row.set_header(None::<&gtk::Widget>)\n        } else if row.header().is_none() {\n            row.set_header(Some(&cascade! {\n                gtk::Separator::new(gtk::Orientation::Horizontal);\n                ..show();\n            }));\n        }\n    }\n\n    fn filter_func(&self, row: &gtk::ListBoxRow) -> bool {\n        let inner = self.inner();\n        let layout = inner.board.layout();\n        if row == &*inner.mode_row {\n            layout.meta.has_mode\n        } else if row == &*inner.speed_row {\n            layout.meta.has_mode && self.mode().has_speed\n        } else if row == &*inner.color_row {\n            layout.meta.has_color && (!layout.meta.has_mode || self.mode().has_hue)\n        } else if row == &*inner.saturation_row {\n            !self.mode().has_hue && !self.mode().is_disabled()\n        } else if row == &*inner.brightness_row {\n            layout.meta.has_brightness && (!layout.meta.has_mode || !self.mode().is_disabled())\n        } else {\n            true\n        }\n    }\n\n    fn mode_speed_changed(&self) {\n        self.notify(\"mode\");\n        self.notify(\"is-per-key\");\n\n        if self.mode().is_per_key() {\n            self.update_per_key();\n            self.inner().color_label.set_label(&fl!(\"key-color\"));\n        } else {\n            self.inner().keyboard_color.set_sensitive(true);\n            self.inner()\n                .keyboard_color\n                .set_index(KeyboardColorIndex::Layer(self.inner().layer.get()));\n            if self.board().layout().meta.has_per_layer {\n                self.inner().color_label.set_label(&fl!(\"layer-color\"));\n            } else {\n                self.inner().color_label.set_label(&fl!(\"keyboard-color\"));\n            }\n        }\n        self.inner()\n            .disable_color_button\n            .set_visible(self.mode().is_per_key());\n        self.invalidate_filter();\n\n        if self.inner().do_not_set.get() {\n            return;\n        }\n\n        let board = self.board().clone();\n        let speed = self.inner().speed_scale.value();\n        let mode = self.mode();\n        let layer = self.inner().layer.get();\n        glib::MainContext::default().spawn_local(async move {\n            let layer = &board.layers()[layer];\n            if let Err(err) = layer.set_mode(mode, speed as u8).await {\n                error!(\"{}: {}\", fl!(\"error-set-keyboard-mode\"), err);\n            }\n        });\n    }\n\n    fn brightness_changed(&self) {\n        if self.inner().do_not_set.get() {\n            return;\n        }\n        let value = self.inner().brightness_scale.value() as i32;\n        let board = self.board().clone();\n        glib::MainContext::default().spawn_local(async move {\n            for layer in board.layers() {\n                if let Err(err) = layer.set_brightness(value).await {\n                    error!(\"{}: {}\", fl!(\"error-set-keyboard-brightness\"), err);\n                }\n            }\n        });\n        debug!(\"Brightness: {}\", value)\n    }\n\n    pub fn set_layer(&self, mut layer: usize) {\n        if !self.board().layout().meta.has_per_layer {\n            layer = 0;\n        }\n\n        self.inner().layer.set(layer);\n\n        let layer = &self.board().layers()[layer];\n\n        let (mode, speed) = layer.mode().unwrap_or((&Mode::all()[0], 128));\n        let brightness = layer.brightness() as f64;\n\n        self.inner().do_not_set.set(true);\n\n        self.inner().mode_combobox.set_active_id(Some(mode.id));\n        self.inner().speed_scale.set_value(speed.into());\n        self.inner().brightness_scale.set_value(brightness);\n        if !self.mode().is_per_key() {\n            self.inner()\n                .keyboard_color\n                .set_index(KeyboardColorIndex::Layer(self.inner().layer.get()));\n        }\n\n        self.inner().do_not_set.set(false);\n    }\n\n    fn update_per_key(&self) {\n        if !self.mode().is_per_key() {\n            return;\n        }\n\n        let selected = self.inner().selected.borrow();\n        self.inner()\n            .keyboard_color\n            .set_index(KeyboardColorIndex::Keys(selected.clone()));\n        self.inner()\n            .keyboard_color\n            .set_sensitive(!selected.is_empty());\n        self.inner()\n            .disable_color_button\n            .set_sensitive(!selected.is_empty());\n    }\n\n    fn disable_color_clicked(&self) {\n        let self_ = self.clone();\n        let selected = self.inner().selected.borrow().clone();\n        glib::MainContext::default().spawn_local(async move {\n            let futures = FuturesUnordered::new();\n            for i in selected.iter() {\n                futures.push(self_.board().keys()[*i].set_color(None));\n            }\n            if let Err(err) = futures.try_collect::<()>().await {\n                error!(\"{}: {}\", fl!(\"error-disable-key\"), err);\n            }\n            self_.update_per_key();\n        });\n    }\n\n    fn led_save(&self) {\n        if self.board().has_led_save() {\n            let board = self.board().clone();\n            glib::MainContext::default().spawn_local(async move {\n                if let Err(err) = board.led_save().await {\n                    error!(\"{}: {}\", fl!(\"error-save-leds\"), err);\n                }\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/configurator_app.rs",
    "content": "use cascade::cascade;\nuse gtk::{gdk, gio, glib, prelude::*, subclass::prelude::*};\nuse std::cell::Cell;\nuse std::process::Command;\n\nuse crate::{about_dialog, fl, MainWindow, Page};\nuse backend::DerefCell;\n\n#[derive(Default)]\npub struct ConfiguratorAppInner {\n    phony_board_names: DerefCell<Vec<String>>,\n    debug_layers: Cell<bool>,\n    launch_test: Cell<bool>,\n}\n\n#[glib::object_subclass]\nimpl ObjectSubclass for ConfiguratorAppInner {\n    const NAME: &'static str = \"S76ConfiguratorApp\";\n    type ParentType = gtk::Application;\n    type Type = ConfiguratorApp;\n}\n\nimpl ObjectImpl for ConfiguratorAppInner {\n    fn constructed(&self) {\n        let app = self.obj();\n\n        app.set_application_id(Some(\"com.system76.keyboardconfigurator\"));\n\n        self.parent_constructed();\n\n        app.add_main_option(\n            \"fake-keyboard\",\n            glib::Char::from(b'k'),\n            glib::OptionFlags::NONE,\n            glib::OptionArg::String,\n            \"\",\n            None,\n        );\n        app.add_main_option(\n            \"debug-layers\",\n            glib::Char::from(b'\\0'),\n            glib::OptionFlags::NONE,\n            glib::OptionArg::None,\n            \"\",\n            None,\n        );\n        app.add_main_option(\n            \"launch-test\",\n            glib::Char::from(b'\\0'),\n            glib::OptionFlags::NONE,\n            glib::OptionArg::None,\n            \"\",\n            None,\n        );\n    }\n}\n\nimpl ApplicationImpl for ConfiguratorAppInner {\n    fn handle_local_options(&self, opts: &glib::VariantDict) -> glib::ExitCode {\n        fn lookup<T: glib::FromVariant>(opts: &glib::VariantDict, key: &str) -> Option<T> {\n            opts.lookup_value(key, None)?.get()\n        }\n\n        let board_names = match lookup::<String>(opts, \"fake-keyboard\").as_deref() {\n            Some(\"all\") => backend::layouts().iter().map(|s| s.to_string()).collect(),\n            Some(value) => value.split(',').map(str::to_string).collect(),\n            None => vec![],\n        };\n\n        self.phony_board_names.set(board_names);\n        self.debug_layers.set(opts.contains(\"debug-layers\"));\n        self.launch_test.set(opts.contains(\"launch-test\"));\n\n        self.parent_handle_local_options(opts)\n    }\n\n    fn startup(&self) {\n        self.parent_startup();\n\n        let about_action = cascade! {\n            gio::SimpleAction::new(\"about\", None);\n            ..connect_activate(|_, _| about_dialog::show_about_dialog());\n        };\n\n        let flash_1 = cascade! {\n            gio::SimpleAction::new(\"flash-to-launch-1\", None);\n            ..connect_activate(|_, _| {\n                let _ = Command::new(\"dfu-programmer\").args([\"atmega32u4\", \"erase\"]).status();\n                let _ = Command::new(\"dfu-programmer\").args([\"atmega32u4\", \"flash\", \"/var/lib/system76-keyboard-configurator/system76_launch_1_default.hex\", \"--suppress-bootloader-mem\"]).status();\n                let _ = Command::new(\"dfu-programmer\").args([\"atmega32u4\", \"start\"]).status();\n            });\n        };\n        let flash_2 = cascade! {\n            gio::SimpleAction::new(\"flash-to-launch-2\", None);\n            ..connect_activate(|_, _| {\n                let _ = Command::new(\"dfu-programmer\").args([\"at90usb646\", \"flash\", \"/var/lib/system76-keyboard-configurator/system76_launch_2_default.hex\", \"--suppress-bootloader-mem\"]).status();\n                let _ = Command::new(\"dfu-programmer\").args([\"at90usb646\", \"reset\"]).status();\n            });\n        };\n        let flash_lite_1 = cascade! {\n            gio::SimpleAction::new(\"flash-to-launch-lite-1\", None);\n            ..connect_activate(|_, _| {\n                let _ = Command::new(\"dfu-programmer\").args([\"at90usb646\", \"flash\", \"/var/lib/system76-keyboard-configurator/system76_launch_lite_1_default.hex\", \"--suppress-bootloader-mem\"]).status();\n                let _ = Command::new(\"dfu-programmer\").args([\"at90usb646\", \"reset\"]).status();\n            });\n        };\n        let flash_heavy_1 = cascade! {\n            gio::SimpleAction::new(\"flash-to-launch-heavy-1\", None);\n            ..connect_activate(|_, _| {\n                let _ = Command::new(\"dfu-programmer\").args([\"at90usb646\", \"flash\", \"/var/lib/system76-keyboard-configurator/system76_launch_heavy_1_default.hex\", \"--suppress-bootloader-mem\"]).status();\n                let _ = Command::new(\"dfu-programmer\").args([\"at90usb646\", \"reset\"]).status();\n            });\n        };\n\n        let app = self.obj();\n        app.add_action(&about_action);\n        app.add_action(&flash_heavy_1);\n        app.add_action(&flash_2);\n        app.add_action(&flash_1);\n        app.add_action(&flash_lite_1);\n        app.set_accels_for_action(\"kbd.import\", &[\"<Primary>o\"]);\n        app.set_accels_for_action(\"kbd.export\", &[\"<Primary>e\"]);\n        for (i, _) in Page::iter_all().enumerate() {\n            app.set_accels_for_action(&format!(\"kbd.page{}\", i), &[&format!(\"<Primary>{}\", i + 1)]);\n        }\n    }\n\n    fn activate(&self) {\n        self.parent_activate();\n\n        if let Some(window) = self.obj().active_window() {\n            info!(\"Focusing current window\");\n            window.present();\n        } else {\n            MainWindow::new(&self.obj());\n        }\n    }\n}\n\nimpl GtkApplicationImpl for ConfiguratorAppInner {}\n\nglib::wrapper! {\n    pub struct ConfiguratorApp(ObjectSubclass<ConfiguratorAppInner>)\n        @extends gtk::Application, gio::Application,\n        @implements gio::ActionGroup, gio::ActionMap;\n}\n\nimpl ConfiguratorApp {\n    fn new() -> Self {\n        glib::Object::new()\n    }\n\n    fn inner(&self) -> &ConfiguratorAppInner {\n        ConfiguratorAppInner::from_obj(self)\n    }\n\n    pub fn phony_board_names(&self) -> &[String] {\n        &self.inner().phony_board_names\n    }\n\n    pub fn debug_layers(&self) -> bool {\n        self.inner().debug_layers.get()\n    }\n\n    pub fn launch_test(&self) -> bool {\n        self.inner().launch_test.get()\n    }\n}\n\n#[cfg(target_os = \"macos\")]\nfn macos_init() {\n    use std::process;\n    let mut prefer_dark = false;\n    // This command returns Dark if we should use the dark theme\n    // defaults read -g AppleInterfaceStyle\n    if let Ok(output) = process::Command::new(\"defaults\")\n        .arg(\"read\")\n        .arg(\"-g\")\n        .arg(\"AppleInterfaceStyle\")\n        .output()\n    {\n        prefer_dark = output.stdout.starts_with(b\"Dark\");\n    }\n\n    if let Some(settings) = gtk::Settings::default() {\n        settings.set_gtk_decoration_layout(Some(\"close,minimize,maximize:menu\"));\n        settings.set_gtk_application_prefer_dark_theme(prefer_dark);\n        settings.set_gtk_enable_animations(false);\n    }\n\n    let css_provider = cascade! {\n        gtk::CssProvider::new();\n        ..load_from_data(b\"\n            button, button:hover {\n                box-shadow: none;\n                -gtk-icon-shadow: none;\n                text-shadow: none;\n            }\n        \").unwrap();\n    };\n\n    gtk::StyleContext::add_provider_for_screen(\n        &gdk::Screen::default().unwrap(),\n        &css_provider,\n        gtk::STYLE_PROVIDER_PRIORITY_APPLICATION,\n    );\n}\n\n#[cfg(target_os = \"windows\")]\nfn windows_init() {\n    // This is a dword with a value of 0 if we should use the dark theme:\n    // HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize\\AppsUseLightTheme\n    use winreg::RegKey;\n    let mut prefer_dark = false;\n    let hkcu = RegKey::predef(winreg::enums::HKEY_CURRENT_USER);\n    if let Ok(subkey) =\n        hkcu.open_subkey(\"Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Themes\\\\Personalize\")\n    {\n        if let Ok(dword) = subkey.get_value::<u32, _>(\"AppsUseLightTheme\") {\n            prefer_dark = dword == 0;\n        }\n    }\n\n    if let Some(settings) = gtk::Settings::default() {\n        settings.set_gtk_application_prefer_dark_theme(prefer_dark);\n    }\n}\n\npub fn run() -> glib::ExitCode {\n    gtk::init().unwrap();\n\n    glib::set_prgname(Some(\"com.system76.keyboardconfigurator\"));\n    glib::set_application_name(&fl!(\"app-title\"));\n    gdk::set_program_class(&fl!(\"app-title\"));\n\n    #[cfg(target_os = \"macos\")]\n    macos_init();\n\n    #[cfg(target_os = \"windows\")]\n    windows_init();\n\n    gio::resources_register_include!(\"compiled.gresource\").unwrap();\n    gtk::Window::set_default_icon_name(\"com.system76.keyboardconfigurator\");\n\n    let application = ConfiguratorApp::new();\n    application.run()\n}\n"
  },
  {
    "path": "src/error_dialog.rs",
    "content": "use cascade::cascade;\nuse gtk::prelude::*;\nuse std::fmt::Display;\n\npub fn show_error_dialog<W: IsA<gtk::Window>, E: Display>(parent: &W, title: &str, err: E) {\n    let label = cascade! {\n        gtk::Label::new(Some(&format!(\"<b>{}</b>:\\n{}\", title, err)));\n        ..set_use_markup(true);\n        ..show();\n    };\n\n    let dialog = cascade! {\n        gtk::Dialog::with_buttons(Some(title), Some(parent), gtk::DialogFlags::MODAL | gtk::DialogFlags::USE_HEADER_BAR, &[(\"Ok\", gtk::ResponseType::Ok)]);\n        ..connect_response(|dialog, _| dialog.close());\n    };\n\n    let header = dialog.header_bar().unwrap();\n    header.set_show_close_button(false);\n\n    let content = dialog.content_area();\n    content.add(&label);\n    content.set_margin(24);\n\n    dialog.show();\n}\n"
  },
  {
    "path": "src/keyboard.rs",
    "content": "use crate::fl;\nuse cascade::cascade;\nuse futures::{prelude::*, stream::FuturesUnordered};\nuse gtk::{\n    gio,\n    glib::{self, clone, object::WeakRef},\n    prelude::*,\n    subclass::prelude::*,\n};\nuse std::{\n    cell::{Cell, RefCell},\n    collections::HashMap,\n    fs::File,\n    pin::Pin,\n    str,\n};\n\nuse crate::{show_error_dialog, Backlight, KeyboardLayer, MainWindow, Page, Picker, Testing};\nuse backend::{Board, BoardEvent, DerefCell, KeyMap, Layout, Mode};\nuse widgets::SelectedKeys;\n\n#[derive(Default)]\npub struct KeyboardInner {\n    action_group: DerefCell<gio::SimpleActionGroup>,\n    invert_f_action: DerefCell<gio::SimpleAction>,\n    board: DerefCell<Board>,\n    page: Cell<Page>,\n    picker: RefCell<WeakRef<Picker>>,\n    selected: RefCell<SelectedKeys>,\n    layer_stack: DerefCell<gtk::Stack>,\n    stack: DerefCell<gtk::Stack>,\n    picker_box: DerefCell<gtk::Box>,\n    backlight: DerefCell<Backlight>,\n    testing: DerefCell<Option<Testing>>,\n}\n\n#[glib::object_subclass]\nimpl ObjectSubclass for KeyboardInner {\n    const NAME: &'static str = \"S76Keyboard\";\n    type ParentType = gtk::Box;\n    type Type = Keyboard;\n}\n\nimpl ObjectImpl for KeyboardInner {\n    fn constructed(&self) {\n        self.parent_constructed();\n\n        let keyboard = self.obj();\n\n        let layer_stack = cascade! {\n            gtk::Stack::new();\n            ..set_transition_duration(0);\n            ..connect_visible_child_notify(\n                clone!(@weak keyboard => move |stack| {\n                    let page = stack\n                        .visible_child()\n                        .map(|c| c.downcast_ref::<KeyboardLayer>().unwrap().page());\n\n                    debug!(\"{:?}\", page);\n                    let last_layer = keyboard.layer();\n                    keyboard.inner().page.set(page.unwrap_or(Page::Layer1));\n                    let layer = keyboard.layer();\n                    if layer != last_layer {\n                        keyboard.set_selected(keyboard.selected());\n                        keyboard.inner().backlight.set_sensitive(layer.is_some());\n                        if let Some(layer) = layer {\n                            keyboard.inner().backlight.set_layer(layer);\n                        }\n                    }\n                })\n            );\n        };\n\n        let picker_box = gtk::Box::new(gtk::Orientation::Vertical, 0);\n\n        let stack = cascade! {\n            gtk::Stack::new();\n            ..set_homogeneous(false);\n            ..connect_visible_child_notify(clone!(@weak keyboard => move |_| keyboard.update_selectable()));\n        };\n\n        let stack_switcher = cascade! {\n            gtk::StackSwitcher::new();\n            ..set_margin_top(12);\n            ..set_halign(gtk::Align::Center);\n            ..set_stack(Some(&stack));\n        };\n\n        cascade! {\n            &keyboard;\n            ..set_orientation(gtk::Orientation::Vertical);\n            ..set_spacing(32);\n            ..add(&stack_switcher);\n            ..add(&layer_stack);\n            ..add(&stack);\n        };\n\n        let invert_f_action = cascade! {\n            gio::SimpleAction::new(\"invert-f-keys\", None);\n            ..connect_activate(clone!(@weak keyboard => move |_, _|\n                glib::MainContext::default().spawn_local(async move {\n                    keyboard.invert_f_keys().await;\n                });\n            ));\n        };\n\n        let action_group = cascade! {\n            gio::SimpleActionGroup::new();\n            ..add_action(&cascade! {\n                gio::SimpleAction::new(\"import\", None);\n                ..connect_activate(clone!(@weak keyboard => move |_, _|\n                    keyboard.import();\n                ));\n            });\n            ..add_action(&cascade! {\n                gio::SimpleAction::new(\"export\", None);\n                ..connect_activate(clone!(@weak keyboard => move |_, _|\n                    keyboard.export();\n                ));\n            });\n            ..add_action(&cascade! {\n                gio::SimpleAction::new(\"reset\", None);\n                ..connect_activate(clone!(@weak keyboard => move |_, _|\n                    glib::MainContext::default().spawn_local(async move {\n                        keyboard.reset().await;\n                    });\n                ));\n            });\n            ..add_action(&invert_f_action);\n        };\n\n        self.action_group.set(action_group);\n        self.invert_f_action.set(invert_f_action);\n        self.layer_stack.set(layer_stack);\n        self.stack.set(stack);\n        self.picker_box.set(picker_box);\n    }\n\n    fn properties() -> &'static [glib::ParamSpec] {\n        use once_cell::sync::Lazy;\n        static PROPERTIES: Lazy<Vec<glib::ParamSpec>> =\n            Lazy::new(|| vec![glib::ParamSpecBoxed::builder::<SelectedKeys>(\"selected\").build()]);\n\n        PROPERTIES.as_ref()\n    }\n\n    fn set_property(&self, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) {\n        match pspec.name() {\n            \"selected\" => self\n                .obj()\n                .set_selected(value.get::<&SelectedKeys>().unwrap().clone()),\n            _ => unimplemented!(),\n        }\n    }\n\n    fn property(&self, _id: usize, pspec: &glib::ParamSpec) -> glib::Value {\n        match pspec.name() {\n            \"selected\" => self.obj().selected().to_value(),\n            _ => unimplemented!(),\n        }\n    }\n}\n\nimpl WidgetImpl for KeyboardInner {}\nimpl ContainerImpl for KeyboardInner {}\nimpl BoxImpl for KeyboardInner {}\n\nglib::wrapper! {\n    pub struct Keyboard(ObjectSubclass<KeyboardInner>)\n        @extends gtk::Box, gtk::Container, gtk::Widget, @implements gtk::Orientable;\n}\n\nimpl Keyboard {\n    pub fn new(board: Board, debug_layers: bool, launch_test: bool) -> Self {\n        let keyboard: Self = glib::Object::new();\n\n        keyboard\n            .inner()\n            .invert_f_action\n            .set_enabled(!board.layout().meta.no_fn_f);\n\n        let stack = &keyboard.inner().stack;\n\n        if launch_test {\n            let testing = cascade! {\n                Testing::new(&board, &keyboard);\n                ..set_halign(gtk::Align::Center);\n            };\n            stack.add_titled(&testing, \"testing\", &fl!(\"stack-testing\"));\n            keyboard.inner().testing.set(Some(testing));\n        } else {\n            keyboard.inner().testing.set(None);\n        }\n\n        stack.add_titled(\n            &cascade! {\n                gtk::Box::new(gtk::Orientation::Vertical, 32);\n                ..add(&cascade! {\n                    gtk::Label::new(Some(&fl!(\"stack-keymap-desc\")));\n                    ..set_line_wrap(true);\n                    ..set_max_width_chars(100);\n                    ..set_halign(gtk::Align::Center);\n                });\n                ..add(&*keyboard.inner().picker_box);\n            },\n            \"keymap\",\n            &fl!(\"stack-keymap\"),\n        );\n\n        let backlight = cascade! {\n            Backlight::new(board.clone());\n            ..set_halign(gtk::Align::Center);\n            ..connect_local(\"notify::is-per-key\", false, clone!(@weak keyboard => @default-panic, move |_| { keyboard.update_selectable(); None }));\n        };\n\n        let leds_desc = if board.layout().meta.has_per_layer {\n            fl!(\"stack-leds-desc\")\n        } else {\n            fl!(\"stack-leds-desc-builtin\")\n        };\n\n        keyboard\n            .bind_property(\"selected\", &backlight, \"selected\")\n            .build();\n        if board.layout().meta.has_brightness {\n            stack.add_titled(\n                &cascade! {\n                    gtk::Box::new(gtk::Orientation::Vertical, 32);\n                    ..add(&cascade! {\n                        gtk::Label::new(Some(&leds_desc));\n                        ..set_line_wrap(true);\n                        ..set_max_width_chars(100);\n                        ..set_halign(gtk::Align::Center);\n                    });\n                    ..add(&backlight);\n                },\n                \"leds\",\n                &fl!(\"stack-leds\"),\n            );\n        }\n\n        keyboard.inner().board.set(board);\n        keyboard.inner().backlight.set(backlight);\n\n        keyboard.add_pages(debug_layers);\n        keyboard.update_selectable();\n\n        keyboard\n    }\n\n    fn inner(&self) -> &KeyboardInner {\n        KeyboardInner::from_obj(self)\n    }\n\n    pub fn handle_backend_event(&self, event: BoardEvent) {\n        match event {\n            BoardEvent::KeymapChanged => self.queue_draw(),\n            BoardEvent::LedsChanged => {}\n            BoardEvent::MatrixChanged => {\n                self.queue_draw();\n                if let Some(testing) = self.inner().testing.as_ref() {\n                    testing.selma_update_colors();\n                }\n            }\n        }\n    }\n\n    pub fn action_group(&self) -> &gio::ActionGroup {\n        self.inner().action_group.upcast_ref()\n    }\n\n    pub fn board(&self) -> &Board {\n        &self.inner().board\n    }\n\n    pub fn display_name(&self) -> String {\n        let name = &self.layout().meta.display_name;\n        let model = self.board().model().split_once('/').unwrap().1;\n        if self.board().is_fake() {\n            format!(\"{} ({})\", name, fl!(\"board-fake\", model = model))\n        } else {\n            format!(\"{} ({})\", name, model)\n        }\n    }\n\n    fn layout(&self) -> &Layout {\n        self.inner().board.layout()\n    }\n\n    fn window(&self) -> Option<gtk::Window> {\n        self.toplevel()?.downcast().ok()\n    }\n\n    pub fn layer(&self) -> Option<usize> {\n        self.inner().page.get().layer()\n    }\n\n    pub fn selected(&self) -> SelectedKeys {\n        self.inner().selected.borrow().clone()\n    }\n\n    pub fn layer_stack(&self) -> &gtk::Stack {\n        &self.inner().layer_stack\n    }\n\n    pub fn has_scancode(&self, scancode_name: &str) -> bool {\n        self.layout().scancode_from_name(scancode_name).is_some()\n    }\n\n    pub async fn keymap_set(&self, key_index: usize, layer: usize, scancode_name: &str) {\n        if let Err(err) = self.board().keys()[key_index]\n            .set_scancode(layer, scancode_name)\n            .await\n        {\n            error!(\"{}: {:?}\", fl!(\"error-set-keymap\"), err);\n        }\n\n        self.set_selected(self.selected());\n    }\n\n    pub fn export_keymap(&self) -> KeyMap {\n        self.board().export_keymap()\n    }\n\n    pub async fn import_keymap(&self, keymap: KeyMap) {\n        // TODO: Ideally don't want this function to be O(Keys^2)\n        // TODO: Make sure it doesn't panic with invalid json with invalid indexes?\n\n        if keymap.model != self.board().model() {\n            show_error_dialog(\n                &self.window().unwrap(),\n                &fl!(\"error-import-keymap\"),\n                fl!(\"keymap-for-board\", model = keymap.model),\n            );\n            return;\n        }\n\n        let _loader = self.toplevel().and_then(|x| {\n            Some(\n                x.downcast_ref::<MainWindow>()?\n                    .display_loader(&fl!(\"loading-keyboard\", keyboard = self.display_name())),\n            )\n        });\n\n        let key_indices = self\n            .board()\n            .keys()\n            .iter()\n            .enumerate()\n            .map(|(i, k)| (&k.logical_name, i))\n            .collect::<HashMap<_, _>>();\n\n        let futures = FuturesUnordered::<Pin<Box<dyn Future<Output = ()>>>>::new();\n\n        for (k, v) in &keymap.map {\n            for (layer, scancode_name) in v.iter().enumerate() {\n                let n = key_indices[&k];\n                futures.push(Box::pin(async move {\n                    if let Err(err) = self.board().keys()[n]\n                        .set_scancode(layer, scancode_name)\n                        .await\n                    {\n                        error!(\"{}: {:?}\", fl!(\"error-set-keymap\"), err);\n                    }\n                }));\n            }\n        }\n\n        for (k, hs) in &keymap.key_leds {\n            let res = self.board().keys()[key_indices[&k]].set_color(*hs);\n            futures.push(Box::pin(async move {\n                if let Err(err) = res.await {\n                    error!(\"{}: {}\", fl!(\"error-key-led\"), err);\n                }\n            }));\n        }\n\n        for (i, keymap_layer) in keymap.layers.iter().enumerate() {\n            let layer = &self.board().layers()[i];\n            if let Some((mode, speed)) = keymap_layer.mode {\n                futures.push(Box::pin(async move {\n                    if let Err(err) = layer.set_mode(Mode::from_index(mode).unwrap(), speed).await {\n                        error!(\"{}: {}\", fl!(\"error-set-layer-mode\"), err)\n                    }\n                }));\n            }\n            futures.push(Box::pin(async move {\n                if let Err(err) = layer.set_brightness(keymap_layer.brightness).await {\n                    error!(\"{}: {}\", fl!(\"error-set-layer-brightness\"), err)\n                }\n            }));\n            futures.push(Box::pin(async move {\n                if let Err(err) = layer.set_color(keymap_layer.color).await {\n                    error!(\"{}: {}\", fl!(\"error-set-layer-color\"), err)\n                }\n            }));\n        }\n\n        futures.collect::<()>().await;\n    }\n\n    fn import(&self) {\n        let filter = cascade! {\n            gtk::FileFilter::new();\n            ..set_name(Some(\"json\"));\n            ..add_pattern(\"*.json\");\n        };\n\n        let chooser = cascade! {\n            gtk::FileChooserNative::new(Some(&fl!(\"layout-import\")), None::<&gtk::Window>, gtk::FileChooserAction::Open, Some(&fl!(\"button-import\")), Some(&fl!(\"button-cancel\")));\n            ..add_filter(filter);\n        };\n\n        if chooser.run() == gtk::ResponseType::Accept {\n            let path = chooser.filename().unwrap();\n            match File::open(path) {\n                Ok(file) => match KeyMap::from_reader(file) {\n                    Ok(keymap) => {\n                        let self_ = self.clone();\n                        glib::MainContext::default().spawn_local(async move {\n                            self_.import_keymap(keymap).await;\n                        });\n                    }\n                    Err(err) => {\n                        show_error_dialog(&self.window().unwrap(), \"Failed to import keymap\", err)\n                    }\n                },\n                Err(err) => show_error_dialog(&self.window().unwrap(), \"Failed to open file\", err),\n            }\n        }\n    }\n\n    fn export(&self) {\n        let filter = cascade! {\n            gtk::FileFilter::new();\n            ..set_name(Some(\"json\"));\n            ..add_pattern(\"*.json\");\n        };\n\n        let chooser = cascade! {\n            gtk::FileChooserNative::new(Some(&fl!(\"layout-export\")), None::<&gtk::Window>, gtk::FileChooserAction::Save, Some(\"Export\"), Some(\"Cancel\"));\n            ..add_filter(filter);\n            ..set_current_name(&format!(\"{}.json\", fl!(\"untitled-layout\")));\n            ..set_do_overwrite_confirmation(true);\n        };\n\n        if chooser.run() == gtk::ResponseType::Accept {\n            let path = chooser.filename().unwrap();\n            let keymap = self.export_keymap();\n\n            if keymap.version != 1 {\n                show_error_dialog(\n                    &self.window().unwrap(),\n                    &fl!(\"error-unsupported-keymap\"),\n                    fl!(\"error-unsupported-keymap-desc\"),\n                )\n            }\n\n            match File::create(path) {\n                Ok(file) => match keymap.to_writer_pretty(file) {\n                    Ok(()) => {}\n                    Err(err) => {\n                        show_error_dialog(&self.window().unwrap(), &fl!(\"error-export-keymap\"), err)\n                    }\n                },\n                Err(err) => {\n                    show_error_dialog(&self.window().unwrap(), &fl!(\"error-open-file\"), err)\n                }\n            }\n        }\n    }\n\n    pub async fn reset(&self) {\n        self.import_keymap(self.layout().default.clone()).await;\n    }\n\n    async fn invert_f_keys(&self) {\n        let key_indices = self\n            .board()\n            .keys()\n            .iter()\n            .enumerate()\n            .map(|(i, k)| (k.logical_name.as_str(), i))\n            .collect::<HashMap<_, _>>();\n\n        let futures = FuturesUnordered::<Pin<Box<dyn Future<Output = ()>>>>::new();\n\n        for i in self.layout().f_keys() {\n            let k = &self.board().keys()[key_indices[i]];\n            let layer0_keycode = k.get_scancode(0).unwrap().1;\n            let layer1_keycode = k.get_scancode(1).unwrap().1;\n\n            if layer1_keycode == \"ROLL_OVER\" {\n                continue;\n            }\n\n            futures.push(Box::pin(async move {\n                if let Err(err) = k.set_scancode(0, &layer1_keycode).await {\n                    error!(\"{}: {:?}\", fl!(\"error-set-keymap\"), err);\n                }\n            }));\n            futures.push(Box::pin(async move {\n                if let Err(err) = k.set_scancode(1, &layer0_keycode).await {\n                    error!(\"{}: {:?}\", fl!(\"error-set-keymap\"), err);\n                }\n            }));\n        }\n\n        futures.collect::<()>().await;\n    }\n\n    fn update_selectable(&self) {\n        if !self.inner().backlight.is_some() {\n            return;\n        }\n\n        let tab_name = self.inner().stack.visible_child_name();\n        let tab_name = tab_name.as_deref();\n        let is_per_key = self.inner().backlight.mode().is_per_key();\n\n        let selectable = tab_name == Some(\"keymap\") || (tab_name == Some(\"leds\") && is_per_key);\n\n        self.inner().layer_stack.foreach(|layer| {\n            let layer = layer.downcast_ref::<KeyboardLayer>().unwrap();\n            layer.set_selectable(selectable);\n        });\n    }\n\n    fn add_pages(&self, debug_layers: bool) {\n        let layer_stack = &*self.inner().layer_stack;\n\n        for (i, page) in Page::iter_all().enumerate() {\n            if !debug_layers && page.is_debug() {\n                continue;\n            } else if let Some(layer) = page.layer() {\n                if layer >= self.layout().meta.num_layers.into() {\n                    continue;\n                }\n            }\n\n            let keyboard_layer = cascade! {\n                KeyboardLayer::new(page, self.board().clone());\n                ..set_selectable(true);\n            };\n            self.bind_property(\"selected\", &keyboard_layer, \"selected\")\n                .flags(glib::BindingFlags::BIDIRECTIONAL)\n                .build();\n            if let Some(testing) = &*self.inner().testing {\n                testing\n                    .bind_property(\"colors\", &keyboard_layer, \"testing-colors\")\n                    .flags(glib::BindingFlags::SYNC_CREATE)\n                    .build();\n            }\n            layer_stack.add_titled(&keyboard_layer, &page.name(), &page.name());\n\n            self.inner().action_group.add_action(&cascade! {\n                gio::SimpleAction::new(&format!(\"page{}\", i), None);\n                ..connect_activate(clone!(@weak layer_stack, @weak keyboard_layer => move |_, _|\n                    layer_stack.set_visible_child(&keyboard_layer);\n                ));\n            });\n        }\n    }\n\n    pub(super) fn set_picker(&self, picker: Option<&Picker>) {\n        // This function is called by Picker::set_keyboard()\n        *self.inner().picker.borrow_mut() = match picker {\n            Some(picker) => {\n                self.inner().picker_box.add(picker);\n                picker.set_sensitive(!self.selected().is_empty() && self.layer().is_some());\n                picker.downgrade()\n            }\n            None => WeakRef::new(),\n        };\n    }\n\n    fn set_selected(&self, selected: SelectedKeys) {\n        let picker = match self.inner().picker.borrow().upgrade() {\n            Some(picker) => picker,\n            None => {\n                return;\n            }\n        };\n        let keys = self.board().keys();\n\n        let mut selected_scancodes = Vec::new();\n        for i in selected.iter() {\n            let k = &keys[*i];\n            debug!(\"{:#?}\", k);\n            if let Some(layer) = self.layer() {\n                if let Some((_scancode, scancode_name)) = k.get_scancode(layer) {\n                    selected_scancodes.push(scancode_name);\n                }\n            }\n        }\n        picker.set_selected(selected_scancodes);\n\n        picker.set_sensitive(selected.len() > 0 && self.layer().is_some());\n\n        self.inner().selected.replace(selected);\n\n        self.queue_draw();\n        self.notify(\"selected\");\n    }\n}\n"
  },
  {
    "path": "src/keyboard_layer.rs",
    "content": "use cascade::cascade;\nuse gtk::{cairo, gdk, glib, glib::Propagation, pango, prelude::*, subclass::prelude::*};\nuse once_cell::unsync::OnceCell;\nuse std::{\n    cell::{Cell, RefCell},\n    f64::consts::PI,\n};\n\nuse crate::{Page, TestingColors};\nuse backend::{Board, DerefCell, Key, Rect, Rgb};\nuse widgets::SelectedKeys;\n\nconst SCALE: f64 = 64.;\nconst MARGIN: f64 = 2.;\nconst RADIUS: f64 = 4.;\nconst HALF_KEYBOARD_VSPACING: f64 = 16.;\n\n#[derive(Default)]\npub struct KeyboardLayerInner {\n    page: Cell<Page>,\n    board: DerefCell<Board>,\n    selected: RefCell<SelectedKeys>,\n    selectable: Cell<bool>,\n    wide_width: OnceCell<i32>,\n    wide_height: OnceCell<i32>,\n    narrow_width: OnceCell<i32>,\n    testing_colors: RefCell<TestingColors>,\n}\n\n#[glib::object_subclass]\nimpl ObjectSubclass for KeyboardLayerInner {\n    const NAME: &'static str = \"S76KeyboardLayer\";\n    type ParentType = gtk::DrawingArea;\n    type Type = KeyboardLayer;\n}\n\nimpl ObjectImpl for KeyboardLayerInner {\n    fn constructed(&self) {\n        self.parent_constructed();\n\n        self.obj().add_events(gdk::EventMask::BUTTON_PRESS_MASK);\n    }\n\n    fn properties() -> &'static [glib::ParamSpec] {\n        use once_cell::sync::Lazy;\n        static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {\n            vec![\n                glib::ParamSpecBoxed::builder::<SelectedKeys>(\"selected\").build(),\n                glib::ParamSpecBoxed::builder::<TestingColors>(\"testing-colors\").build(),\n            ]\n        });\n\n        PROPERTIES.as_ref()\n    }\n\n    fn set_property(&self, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) {\n        match pspec.name() {\n            \"selected\" => self\n                .obj()\n                .set_selected(value.get::<&SelectedKeys>().unwrap().clone()),\n            \"testing-colors\" => {\n                self.testing_colors\n                    .replace(value.get::<&TestingColors>().unwrap().clone());\n                self.obj().queue_draw();\n            }\n            _ => unimplemented!(),\n        }\n    }\n\n    fn property(&self, _id: usize, pspec: &glib::ParamSpec) -> glib::Value {\n        match pspec.name() {\n            \"selected\" => self.selected.borrow().to_value(),\n            \"testing-colors\" => self.testing_colors.borrow().to_value(),\n            _ => unimplemented!(),\n        }\n    }\n}\n\nimpl WidgetImpl for KeyboardLayerInner {\n    fn draw(&self, cr: &cairo::Context) -> Propagation {\n        self.parent_draw(cr);\n\n        let selected = Rgb::new(0xfb, 0xb8, 0x6c).to_floats();\n\n        let testing_colors = self.testing_colors.borrow();\n\n        for (i, k) in self.obj().keys().iter().enumerate() {\n            let Rect { x, y, w, h } = self.obj().key_position(k);\n\n            let mut bg = if let Some(rgb) = testing_colors\n                .0\n                .get(&(k.electrical.0 as usize, k.electrical.1 as usize))\n            {\n                rgb\n            } else {\n                &k.background_color\n            }\n            .to_floats();\n\n            if k.pressed() {\n                bg = self.board.layout().meta.pressed_color.to_floats();\n            }\n\n            let fg = if (bg.0 + bg.1 + bg.2) / 3. >= 0.5 {\n                (0., 0., 0.)\n            } else {\n                (1., 1., 1.)\n            };\n\n            let mut text_alpha = 1.;\n            let mut bg_alpha = 1.;\n            if let Some(layer) = self.page.get().layer() {\n                let scancode_name = k.get_scancode(layer).unwrap().1;\n                if scancode_name == \"NONE\" || scancode_name == \"ROLL_OVER\" {\n                    text_alpha = 0.5;\n                    bg_alpha = 0.75;\n                }\n            }\n\n            // Rounded rectangle\n            cr.new_sub_path();\n            cr.arc(x + w - RADIUS, y + RADIUS, RADIUS, -0.5 * PI, 0.);\n            cr.arc(x + w - RADIUS, y + h - RADIUS, RADIUS, 0., 0.5 * PI);\n            cr.arc(x + RADIUS, y + h - RADIUS, RADIUS, 0.5 * PI, PI);\n            cr.arc(x + RADIUS, y + RADIUS, RADIUS, PI, 1.5 * PI);\n            cr.close_path();\n\n            cr.set_source_rgba(bg.0, bg.1, bg.2, bg_alpha);\n            cr.fill_preserve().unwrap();\n\n            if self.selectable.get() && self.obj().selected().contains(&i) {\n                cr.set_source_rgb(selected.0, selected.1, selected.2);\n                cr.set_line_width(4.);\n                cr.stroke().unwrap();\n            }\n\n            // Draw label\n            let text = self.obj().page().get_label(k);\n            let layout = cascade! {\n                self.obj().create_pango_layout(Some(&text));\n                ..set_width((w * pango::SCALE as f64) as i32);\n                ..set_alignment(pango::Alignment::Center);\n            };\n            let text_height = layout.pixel_size().1 as f64;\n            cr.new_path();\n            cr.move_to(x, y + (h - text_height) / 2.);\n            cr.set_source_rgba(fg.0, fg.1, fg.2, text_alpha);\n            pangocairo::show_layout(cr, &layout);\n        }\n\n        Propagation::Proceed\n    }\n\n    fn button_press_event(&self, evt: &gdk::EventButton) -> Propagation {\n        self.parent_button_press_event(evt);\n\n        if !self.selectable.get() {\n            return Propagation::Proceed;\n        }\n\n        let pos = evt.position();\n        let pressed = self\n            .obj()\n            .keys()\n            .iter()\n            .position(|k| self.obj().key_position(k).contains(pos.0, pos.1));\n\n        if let Some(pressed) = pressed {\n            let shift = evt.state().contains(gdk::ModifierType::SHIFT_MASK);\n            let mut selected = self.obj().selected();\n            if shift {\n                if selected.contains(&pressed) {\n                    selected.remove(&pressed);\n                } else {\n                    selected.insert(pressed);\n                }\n            } else if selected.contains(&pressed) {\n                selected.clear();\n            } else {\n                selected.clear();\n                selected.insert(pressed);\n            }\n            self.obj().set_selected(selected);\n        }\n\n        Propagation::Proceed\n    }\n\n    fn request_mode(&self) -> gtk::SizeRequestMode {\n        gtk::SizeRequestMode::HeightForWidth\n    }\n\n    fn preferred_width(&self) -> (i32, i32) {\n        (self.obj().narrow_width(), self.obj().wide_width())\n    }\n\n    fn preferred_height(&self) -> (i32, i32) {\n        let height = self.obj().narrow_height();\n        (height, height)\n    }\n\n    fn preferred_height_for_width(&self, width: i32) -> (i32, i32) {\n        let height = if width < self.obj().wide_width() {\n            self.obj().narrow_height()\n        } else {\n            self.obj().wide_height()\n        };\n        (height, height)\n    }\n\n    fn preferred_width_for_height(&self, _width: i32) -> (i32, i32) {\n        self.preferred_width()\n    }\n}\n\nimpl DrawingAreaImpl for KeyboardLayerInner {}\n\nglib::wrapper! {\n    pub struct KeyboardLayer(ObjectSubclass<KeyboardLayerInner>)\n        @extends gtk::DrawingArea, gtk::Widget;\n}\n\nimpl KeyboardLayer {\n    pub fn new(page: Page, board: Board) -> Self {\n        let obj = glib::Object::new::<Self>();\n        obj.inner().page.set(page);\n        obj.inner().board.set(board);\n        obj\n    }\n\n    fn inner(&self) -> &KeyboardLayerInner {\n        KeyboardLayerInner::from_obj(self)\n    }\n\n    pub fn page(&self) -> Page {\n        self.inner().page.get()\n    }\n\n    pub fn set_page(&self, page: Page) {\n        self.inner().page.set(page);\n        self.queue_draw();\n    }\n\n    pub fn keys(&self) -> &[Key] {\n        self.inner().board.keys()\n    }\n\n    pub fn selected(&self) -> SelectedKeys {\n        self.inner().selected.borrow().clone()\n    }\n\n    pub fn set_selected(&self, i: SelectedKeys) {\n        self.inner().selected.replace(i);\n        self.queue_draw();\n        self.notify(\"selected\");\n    }\n\n    pub fn set_selectable(&self, selectable: bool) {\n        self.inner().selectable.set(selectable);\n        self.queue_draw();\n    }\n\n    fn keys_maximize<F: Fn(&Key) -> i32>(&self, cell: &OnceCell<i32>, cb: F) -> i32 {\n        *cell.get_or_init(|| self.keys().iter().map(cb).max().unwrap())\n    }\n\n    fn wide_width(&self) -> i32 {\n        self.keys_maximize(&self.inner().wide_width, |k| {\n            let pos = self.key_position_wide(k);\n            (pos.x + pos.w) as i32\n        })\n    }\n\n    fn wide_height(&self) -> i32 {\n        self.keys_maximize(&self.inner().wide_height, |k| {\n            let pos = self.key_position_wide(k);\n            (pos.y + pos.h + 4.) as i32\n        })\n    }\n\n    fn narrow_width(&self) -> i32 {\n        self.keys_maximize(&self.inner().narrow_width, |k| {\n            let mut pos = self.key_position_wide(k);\n            let width = self.wide_width() as f64 / 2.;\n            if pos.x + pos.w / 2. > width {\n                pos.x -= width;\n            }\n            (pos.x + pos.w) as i32\n        })\n    }\n\n    fn narrow_height(&self) -> i32 {\n        self.wide_height() * 2 + HALF_KEYBOARD_VSPACING as i32\n    }\n\n    fn key_position_wide(&self, k: &Key) -> Rect {\n        Rect {\n            x: (k.physical.x * SCALE) + MARGIN,\n            y: -(k.physical.y * SCALE) + MARGIN,\n            w: (k.physical.w * SCALE) - MARGIN * 2.,\n            h: (k.physical.h * SCALE) - MARGIN * 2.,\n        }\n    }\n\n    fn key_position_narrow(&self, k: &Key) -> Rect {\n        let mut rect = self.key_position_wide(k);\n        let width = self.wide_width() as f64 / 2.;\n        if rect.x + rect.w / 2. > width {\n            rect.x -= (self.wide_width() - self.narrow_width()) as f64;\n            rect.y += self.wide_height() as f64 + HALF_KEYBOARD_VSPACING;\n        }\n        rect\n    }\n\n    fn key_position(&self, k: &Key) -> Rect {\n        let (mut pos, width) = if self.allocated_width() < self.wide_width() {\n            (self.key_position_narrow(k), self.narrow_width())\n        } else {\n            (self.key_position_wide(k), self.wide_width())\n        };\n        pos.x += (self.allocated_width() - width) as f64 / 2.;\n        pos\n    }\n}\n"
  },
  {
    "path": "src/localize.rs",
    "content": "use i18n_embed::{\n    fluent::{fluent_language_loader, FluentLanguageLoader},\n    DefaultLocalizer, LanguageLoader, Localizer,\n};\nuse once_cell::sync::Lazy;\nuse rust_embed::RustEmbed;\n\n#[derive(RustEmbed)]\n#[folder = \"i18n/\"]\nstruct Localizations;\n\npub static LANGUAGE_LOADER: Lazy<FluentLanguageLoader> = Lazy::new(|| {\n    let loader: FluentLanguageLoader = fluent_language_loader!();\n\n    loader\n        .load_fallback_language(&Localizations)\n        .expect(\"Error while loading fallback language\");\n\n    loader\n});\n\n#[macro_export]\nmacro_rules! fl {\n    ($message_id:literal) => {{\n        i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id)\n    }};\n\n    ($message_id:literal, $($args:expr),*) => {{\n        i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id, $($args), *)\n    }};\n}\n\n// Get the `Localizer` to be used for localizing this library.\npub fn localizer() -> Box<dyn Localizer> {\n    Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER, &Localizations))\n}\n"
  },
  {
    "path": "src/main.rs",
    "content": "#![windows_subsystem = \"windows\"]\n\n#[macro_use]\nextern crate log;\n\nuse i18n_embed::DesktopLanguageRequester;\nuse std::env;\n\nmod about_dialog;\nmod backlight;\nmod configurator_app;\nmod error_dialog;\nmod keyboard;\nmod keyboard_layer;\nmod localize;\nmod main_window;\nmod page;\nmod picker;\nmod shortcuts_window;\nmod testing;\n\nuse gtk::glib;\n\npub use self::configurator_app::run;\nuse self::{\n    backlight::*, configurator_app::*, error_dialog::*, keyboard::*, keyboard_layer::*,\n    main_window::*, page::*, picker::*, shortcuts_window::*, testing::*,\n};\n\nfn main() -> glib::ExitCode {\n    translate();\n    env_logger::Builder::from_env(\n        env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, \"info\"),\n    )\n    .format_timestamp(None)\n    .format_module_path(false)\n    .init();\n\n    let args = env::args().collect::<Vec<_>>();\n    for arg in args.iter().skip(1) {\n        if arg.as_str() == \"--daemon\" {\n            backend::run_daemon();\n        }\n    }\n\n    crate::run()\n}\n\nfn translate() {\n    let requested_languages = DesktopLanguageRequester::requested_languages();\n\n    let localizers = vec![\n        (\"keyboard-configurator\", crate::localize::localizer()),\n        (\"backend\", backend::localizer()),\n        (\"widgets\", widgets::localizer()),\n    ];\n\n    for (crate_name, localizer) in localizers {\n        if let Err(error) = localizer.select(&requested_languages) {\n            eprintln!(\"Error while loading languages for {} {}\", crate_name, error);\n        }\n    }\n}\n"
  },
  {
    "path": "src/main_window.rs",
    "content": "use crate::fl;\nuse cascade::cascade;\nuse futures::StreamExt;\nuse gtk::{\n    gio,\n    glib::{self, clone, ControlFlow},\n    pango,\n    prelude::*,\n    subclass::prelude::*,\n};\nuse std::{\n    cell::RefCell,\n    sync::atomic::{AtomicBool, Ordering},\n    time::Duration,\n};\n\nuse crate::{shortcuts_window, ConfiguratorApp, Keyboard, KeyboardLayer, Page, Picker};\nuse backend::{Backend, Board, BoardId, Bootloaded, DerefCell};\n\npub struct Loader(MainWindow, gtk::Box);\n\npub static REFRESH_DISABLED: AtomicBool = AtomicBool::new(false);\n\nimpl Drop for Loader {\n    fn drop(&mut self) {\n        self.0.inner().load_box.remove(&self.1);\n        let mut empty = true;\n        self.0.inner().load_box.foreach(|_| empty = true);\n        if empty {\n            self.0.inner().load_revealer.set_reveal_child(false);\n        }\n    }\n}\n\n#[derive(Default)]\npub struct MainWindowInner {\n    backend: DerefCell<Backend>,\n    back_button: DerefCell<gtk::Button>,\n    flash_menu: DerefCell<gio::Menu>,\n    flash_button: DerefCell<gtk::MenuButton>,\n    header_bar: DerefCell<gtk::HeaderBar>,\n    keyboard_box: DerefCell<gtk::Box>,\n    layer_switcher: DerefCell<gtk::StackSwitcher>,\n    load_box: DerefCell<gtk::Box>,\n    load_revealer: DerefCell<gtk::Revealer>,\n    picker: DerefCell<Picker>,\n    stack: DerefCell<gtk::Stack>,\n    keyboards: RefCell<Vec<(Keyboard, gtk::Box)>>,\n    board_loading: RefCell<Option<Loader>>,\n    board_list_stack: DerefCell<gtk::Stack>,\n    is_testing_mode: DerefCell<bool>,\n}\n\n#[glib::object_subclass]\nimpl ObjectSubclass for MainWindowInner {\n    const NAME: &'static str = \"S76ConfiguratorMainWindow\";\n    type ParentType = gtk::ApplicationWindow;\n    type Type = MainWindow;\n}\n\nimpl ObjectImpl for MainWindowInner {\n    fn constructed(&self) {\n        self.parent_constructed();\n\n        let window = self.obj();\n        let back_button = cascade! {\n            gtk::Button::new();\n            ..add(&gtk::Image::from_icon_name(Some(\"go-previous-symbolic\"), gtk::IconSize::Button));\n            ..connect_clicked(clone!(@weak window => move |_| {\n                window.show_keyboard_list();\n            }));\n        };\n\n        let layer_switcher = cascade! {\n            gtk::StackSwitcher::new();\n            ..show();\n        };\n\n        let flash_menu = cascade! {\n            gio::Menu::new();\n            ..append_section(None, &cascade! {\n                gio::Menu::new();\n            });\n        };\n        let flash_button = cascade! {\n                gtk::MenuButton::new();\n                ..set_menu_model(Some(&flash_menu));\n                ..add(&cascade! {\n                    gtk::Image::from_icon_name(Some(\"applications-system-symbolic\"), gtk::IconSize::Button);\n                });\n        };\n\n        let menu = cascade! {\n            gio::Menu::new();\n            ..append_section(None, &cascade! {\n                gio::Menu::new();\n                ..append(Some(&fl!(\"layout-import\")), Some(\"kbd.import\"));\n                ..append(Some(&fl!(\"layout-export\")), Some(\"kbd.export\"));\n                ..append(Some(&fl!(\"layout-reset\")), Some(\"kbd.reset\"));\n                ..append(Some(&fl!(\"layout-invert-f-keys\")), Some(\"kbd.invert-f-keys\"));\n            });\n            ..append_section(None, &cascade! {\n                gio::Menu::new();\n                ..append(Some(&fl!(\"show-help-overlay\")), Some(\"win.show-help-overlay\"));\n                ..append(Some(&fl!(\"app-about\")), Some(\"app.about\"));\n            });\n        };\n\n        let header_bar = cascade! {\n            gtk::HeaderBar::new();\n            ..set_title(Some(&fl!(\"app-title\")));\n            ..set_show_close_button(true);\n            ..pack_start(&back_button);\n            ..pack_end(&cascade! {\n                gtk::MenuButton::new();\n                ..set_menu_model(Some(&menu));\n                ..add(&cascade! {\n                    gtk::Image::from_icon_name(Some(\"open-menu-symbolic\"), gtk::IconSize::Button);\n                });\n            });\n            ..pack_end(&flash_button);\n        };\n\n        let no_boards_msg = format!(\n            \"<span size='xx-large' weight='bold'>{}</span>\\n\\n{}\",\n            fl!(\"no-boards\"),\n            fl!(\"no-boards-msg\")\n        );\n\n        let no_boards = cascade! {\n            gtk::Box::new(gtk::Orientation::Vertical, 24);\n            ..set_vexpand(true);\n            ..set_valign(gtk::Align::Center);\n            ..set_margin(12);\n            ..add(&cascade! {\n                gtk::Image::from_icon_name(Some(\"launch-keyboard-not-found\"), gtk::IconSize::Invalid);\n                ..set_pixel_size(384);\n                ..set_halign(gtk::Align::Center);\n            });\n            ..add(&cascade! {\n                gtk::Label::new(Some(&no_boards_msg));\n                ..set_justify(gtk::Justification::Center);\n                ..set_use_markup(true);\n            });\n        };\n\n        let board_list_stack = cascade! {\n            gtk::Stack::new();\n            ..set_homogeneous(false);\n            ..add_named(&no_boards, \"no_boards\");\n        };\n\n        let keyboard_box = cascade! {\n            gtk::Box::new(gtk::Orientation::Vertical, 0);\n            ..set_halign(gtk::Align::Center);\n        };\n        board_list_stack.add_named(&keyboard_box, \"keyboards\");\n\n        let stack = cascade! {\n            gtk::Stack::new();\n            ..set_margin(6);\n            ..set_homogeneous(false);\n            ..add(&board_list_stack);\n        };\n\n        let picker = Picker::new();\n\n        let load_box = cascade! {\n            gtk::Box::new(gtk::Orientation::Vertical, 6);\n            ..set_margin(6);\n            ..show();\n        };\n\n        let load_revealer = cascade! {\n            gtk::Revealer::new();\n            ..set_valign(gtk::Align::Start);\n            ..set_vexpand(false);\n            ..set_transition_type(gtk::RevealerTransitionType::SlideDown);\n            ..add(&load_box);\n        };\n\n        cascade! {\n            window;\n            ..set_title(&fl!(\"app-title\"));\n            ..set_position(gtk::WindowPosition::Center);\n            ..set_default_size(1280, 768);\n            ..set_titlebar(Some(&header_bar));\n            ..add(&cascade! {\n                gtk::Overlay::new();\n                ..add_overlay(&load_revealer);\n                ..add(&cascade! {\n                    gtk::ScrolledWindow::new(None::<&gtk::Adjustment>, None::<&gtk::Adjustment>);\n                    ..set_hscrollbar_policy(gtk::PolicyType::Never);\n                    ..set_overlay_scrolling(false);\n                    ..add(&stack);\n                });\n            });\n            ..set_help_overlay(Some(&shortcuts_window()));\n            ..set_focus(None::<&gtk::Widget>);\n            ..show_all();\n        };\n        back_button.set_visible(false);\n        flash_button.set_visible(false);\n\n        self.back_button.set(back_button);\n        self.flash_button.set(flash_button);\n        self.flash_menu.set(flash_menu);\n        self.header_bar.set(header_bar);\n        self.keyboard_box.set(keyboard_box);\n        self.layer_switcher.set(layer_switcher);\n        self.load_box.set(load_box);\n        self.load_revealer.set(load_revealer);\n        self.picker.set(picker);\n        self.stack.set(stack);\n        self.board_list_stack.set(board_list_stack);\n    }\n}\nimpl WidgetImpl for MainWindowInner {\n    fn destroy(&self) {\n        self.parent_destroy();\n        info!(\"Window close\");\n    }\n}\nimpl ContainerImpl for MainWindowInner {}\nimpl BinImpl for MainWindowInner {}\nimpl WindowImpl for MainWindowInner {}\nimpl ApplicationWindowImpl for MainWindowInner {}\n\nglib::wrapper! {\n    pub struct MainWindow(ObjectSubclass<MainWindowInner>)\n        @extends gtk::ApplicationWindow, gtk::Window, gtk::Bin, gtk::Container, gtk::Widget,\n        @implements gio::ActionGroup, gio::ActionMap;\n}\n\nimpl MainWindow {\n    pub fn new(app: &ConfiguratorApp) -> Self {\n        let window: Self = glib::Object::new();\n        let is_testing_mode = app.launch_test();\n        app.add_window(&window);\n\n        let (backend, receiver) = daemon();\n        window.handle_backend_event_stream(receiver, false);\n        backend.refresh();\n\n        // Refresh key matrix only when window is visible\n        backend.set_matrix_get_rate(if window.is_active() {\n            Some(Duration::from_millis(50))\n        } else {\n            None\n        });\n        window.connect_is_active_notify(|window| {\n            window\n                .inner()\n                .backend\n                .set_matrix_get_rate(if window.is_active() {\n                    Some(Duration::from_millis(50))\n                } else {\n                    None\n                });\n        });\n\n        let phony_board_names = app.phony_board_names().to_vec();\n        if !phony_board_names.is_empty() {\n            match Backend::new_dummy(phony_board_names) {\n                Ok((backend, receiver)) => {\n                    window.handle_backend_event_stream(receiver, true);\n                    backend.refresh();\n                }\n                Err(err) => error!(\"{}\", err),\n            }\n        }\n\n        window.inner().backend.set(backend);\n        window.inner().is_testing_mode.set(is_testing_mode);\n        glib::timeout_add_seconds_local(\n            1,\n            clone!(@weak window => @default-return ControlFlow::Break, move || {\n                if !REFRESH_DISABLED.load(Ordering::Relaxed) {\n                  let inner = window.inner();\n                  inner.backend.refresh();\n                  if *inner.is_testing_mode && !inner.back_button.is_visible() {\n                      inner.backend.check_for_bootloader()\n                  }\n                }\n                ControlFlow::Continue\n            }),\n        );\n\n        window\n    }\n\n    fn inner(&self) -> &MainWindowInner {\n        MainWindowInner::from_obj(self)\n    }\n\n    fn handle_backend_event_stream(&self, mut receiver: backend::Events, is_dummy: bool) {\n        let window_weak = self.downgrade();\n        glib::MainContext::default().spawn_local(async move {\n            while let (Some(event), Some(window)) = (receiver.next().await, window_weak.upgrade()) {\n                window.handle_backend_event(event, is_dummy);\n            }\n        });\n    }\n\n    fn handle_backend_event(&self, event: backend::Event, is_dummy: bool) {\n        match event {\n            // Ignore these events for dummy; only use for real keyboard\n            backend::Event::BoardLoading\n            | backend::Event::BoardLoadingDone\n            | backend::Event::BoardNotUpdated\n                if is_dummy => {}\n            backend::Event::BoardLoading => {\n                info!(\"loading\");\n                let loader = self.display_loader(&fl!(\"loading\"));\n                *self.inner().board_loading.borrow_mut() = Some(loader);\n            }\n            backend::Event::BoardLoadingDone => {\n                self.inner().board_loading.borrow_mut().take();\n            }\n            backend::Event::BoardNotUpdated => {\n                info!(\"board not updated\");\n                self.inner().board_loading.borrow_mut().take();\n                let loader = self.display_loader(&fl!(\"firmware-update-required\"));\n                *self.inner().board_loading.borrow_mut() = Some(loader);\n            }\n            backend::Event::BoardAdded(board) => {\n                self.add_keyboard(board);\n            }\n            backend::Event::Board(id, event) => {\n                if let backend::BoardEvent::MatrixChanged = &event {\n                    self.inner().keyboard_box.queue_draw();\n                }\n                for (keyboard, _) in &*self.inner().keyboards.borrow() {\n                    if keyboard.board().board() == id {\n                        keyboard.handle_backend_event(event);\n                        break;\n                    }\n                }\n            }\n            backend::Event::BoardRemoved(id) => {\n                self.remove_keyboard(id);\n            }\n            backend::Event::BootloadedAdded(board) => {\n                self.add_flash_menu(board);\n            }\n            backend::Event::BootloadedRemoved => {\n                self.remove_flash_menu();\n            }\n        }\n    }\n\n    fn show_keyboard_list(&self) {\n        let inner = self.inner();\n        inner\n            .stack\n            .set_transition_type(gtk::StackTransitionType::SlideRight);\n        inner.stack.set_visible_child(&*inner.board_list_stack);\n        inner.header_bar.set_custom_title(None::<&gtk::Widget>);\n        inner.layer_switcher.set_stack(None::<&gtk::Stack>);\n        self.insert_action_group(\"kbd\", None::<&gio::ActionGroup>);\n        inner.back_button.set_visible(false);\n\n        inner.picker.set_keyboard(None);\n    }\n\n    fn show_keyboard(&self, keyboard: &Keyboard) {\n        let inner = self.inner();\n\n        inner\n            .stack\n            .set_transition_type(gtk::StackTransitionType::SlideLeft);\n        inner.stack.set_visible_child(keyboard);\n        inner\n            .header_bar\n            .set_custom_title(Some(&*inner.layer_switcher));\n        inner.layer_switcher.set_stack(Some(keyboard.layer_stack()));\n        self.insert_action_group(\"kbd\", Some(keyboard.action_group()));\n        inner.back_button.set_visible(true);\n\n        inner.picker.set_keyboard(Some(keyboard.clone()));\n    }\n\n    fn add_keyboard(&self, board: Board) {\n        let app: ConfiguratorApp = self.application().unwrap().downcast().unwrap();\n\n        let keyboard = cascade! {\n            Keyboard::new(board.clone(), app.debug_layers(), app.launch_test());\n            ..set_halign(gtk::Align::Center);\n            ..show_all();\n        };\n\n        let attr_list = cascade! {\n            pango::AttrList::new();\n            ..insert(pango::AttrInt::new_weight(pango::Weight::Bold));\n        };\n        let label = cascade! {\n            gtk::Label::new(Some(&keyboard.display_name()));\n            ..set_attributes(Some(&attr_list));\n        };\n        let window = self;\n        let button = if !board.is_updated() && *self.inner().is_testing_mode {\n            cascade! {\n              gtk::Button::with_label(&fl!(\"firmware-update-required\"));\n              ..set_halign(gtk::Align::Center);\n            }\n        } else {\n            cascade! {\n                gtk::Button::with_label(&fl!(\"button-configure\"));\n                ..set_halign(gtk::Align::Center);\n                ..connect_clicked(clone!(@weak window, @weak keyboard => move |_| {\n                    window.show_keyboard(&keyboard);\n                }));\n            }\n        };\n\n        let keyboard_layer = cascade! {\n            KeyboardLayer::new(Page::Layer1, keyboard.board().clone());\n            ..set_halign(gtk::Align::Center);\n        };\n        let row = cascade! {\n            gtk::Box::new(gtk::Orientation::Vertical, 12);\n            ..set_margin(12);\n            ..add(&label);\n            ..add(&keyboard_layer);\n            ..add(&button);\n            ..show_all();\n        };\n        self.inner().keyboard_box.add(&row);\n\n        if !board.has_keymap() {\n            button.hide();\n            let label = cascade! {\n                gtk::Label::new(Some(&fl!(\"firmware-version\", version = board.version())));\n                ..set_attributes(Some(&cascade! {\n                    pango::AttrList::new();\n                    ..insert(pango::AttrColor::new_foreground(65535, 0, 0));\n                }));\n                ..show();\n            };\n            row.add(&label);\n        }\n\n        self.inner().stack.add(&keyboard);\n        self.inner().keyboards.borrow_mut().push((keyboard, row));\n\n        self.inner()\n            .board_list_stack\n            .set_visible_child_name(\"keyboards\");\n    }\n\n    fn remove_keyboard(&self, id: BoardId) {\n        let mut boards = self.inner().keyboards.borrow_mut();\n        if let Some(idx) = boards.iter().position(|(kb, _)| kb.board().board() == id) {\n            let (keyboard, row) = boards.remove(idx);\n            if self.inner().stack.visible_child().as_ref() == Some(keyboard.upcast_ref()) {\n                // Set picker keyboard to to `None` before destroying keyboard widget\n                self.inner().picker.set_keyboard(None);\n                self.show_keyboard_list();\n            }\n            self.inner().stack.remove(&keyboard);\n            self.inner().keyboard_box.remove(&row);\n\n            if self.num_keyboards() == 0 {\n                self.inner()\n                    .board_list_stack\n                    .set_visible_child_name(\"no_boards\");\n            }\n        }\n    }\n\n    fn add_flash_menu(&self, board: Bootloaded) {\n        let menu = &self.inner().flash_menu;\n        menu.remove_all();\n\n        match board {\n            Bootloaded::At90usb646 => {\n                menu.append(\n                    Some(&fl!(\"flash-to-launch-2\")),\n                    Some(\"app.flash-to-launch-2\"),\n                );\n                menu.append(\n                    Some(&fl!(\"flash-to-launch-heavy\")),\n                    Some(\"app.flash-to-launch-heavy-1\"),\n                );\n            }\n            Bootloaded::At90usb646Lite => {\n                menu.append(\n                    Some(&fl!(\"flash-to-launch-lite-1\")),\n                    Some(\"app.flash-to-launch-lite-1\"),\n                );\n            }\n            Bootloaded::AtMega32u4 => {\n                menu.append(\n                    Some(&fl!(\"flash-to-launch-1\")),\n                    Some(\"app.flash-to-launch-1\"),\n                );\n            }\n        }\n\n        self.inner().flash_button.set_visible(true);\n    }\n\n    fn remove_flash_menu(&self) {\n        self.inner().flash_button.set_visible(false);\n    }\n\n    fn num_keyboards(&self) -> usize {\n        let mut count = 0;\n        self.inner().keyboard_box.foreach(|_| count += 1);\n        count\n    }\n\n    pub fn display_loader(&self, text: &str) -> Loader {\n        info!(\"display loader called with {}\", text);\n        let load_hbox = cascade! {\n            gtk::Box::new(gtk::Orientation::Horizontal, 6);\n            ..add(&cascade! {\n                gtk::Spinner::new();\n                ..start();\n            });\n            ..add(&gtk::Label::new(Some(text)));\n            ..show_all();\n        };\n\n        self.inner().load_box.add(&load_hbox);\n        self.inner().load_revealer.set_reveal_child(true);\n\n        Loader(self.clone(), load_hbox)\n    }\n}\n\n#[cfg(target_os = \"linux\")]\nfn daemon() -> (Backend, backend::Events) {\n    if unsafe { libc::geteuid() == 0 } {\n        info!(\"Already running as root\");\n        Backend::new()\n    } else {\n        info!(\"Not running as root, spawning daemon with pkexec\");\n        Backend::new_pkexec()\n    }\n    .expect(\"Failed to create server\")\n}\n\n#[cfg(not(target_os = \"linux\"))]\nfn daemon() -> (Backend, backend::Events) {\n    Backend::new().expect(\"Failed to create server\")\n}\n"
  },
  {
    "path": "src/page.rs",
    "content": "use crate::fl;\nuse crate::picker::SCANCODE_LABELS;\nuse backend::Key;\n\n#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]\npub enum Page {\n    Layer1,\n    Layer2,\n    Layer3,\n    Layer4,\n    Keycaps,\n    Logical,\n    Electrical,\n    Leds,\n}\n\nimpl Page {\n    pub fn name(&self) -> String {\n        match self {\n            Self::Layer1 => fl!(\"page-layer1\"),\n            Self::Layer2 => fl!(\"page-layer2\"),\n            Self::Layer3 => fl!(\"page-layer3\"),\n            Self::Layer4 => fl!(\"page-layer4\"),\n            Self::Keycaps => fl!(\"page-keycaps\"),\n            Self::Logical => fl!(\"page-logical\"),\n            Self::Electrical => fl!(\"page-electrical\"),\n            Self::Leds => fl!(\"page-leds\"),\n        }\n    }\n\n    pub fn layer(&self) -> Option<usize> {\n        match self {\n            Self::Layer1 => Some(0),\n            Self::Layer2 => Some(1),\n            Self::Layer3 => Some(2),\n            Self::Layer4 => Some(3),\n            _ => None,\n        }\n    }\n\n    pub fn is_debug(&self) -> bool {\n        matches!(\n            self,\n            Self::Keycaps | Self::Logical | Self::Electrical | Self::Leds\n        )\n    }\n\n    pub fn iter_all() -> impl Iterator<Item = Self> {\n        vec![\n            Self::Layer1,\n            Self::Layer2,\n            Self::Layer3,\n            Self::Layer4,\n            Self::Keycaps,\n            Self::Logical,\n            Self::Electrical,\n            Self::Leds,\n        ]\n        .into_iter()\n    }\n\n    pub fn get_label(&self, key: &Key) -> String {\n        match self {\n            Page::Layer1 | Page::Layer2 | Page::Layer3 | Page::Layer4 => {\n                let scancode_name = key.get_scancode(self.layer().unwrap()).unwrap().1;\n                SCANCODE_LABELS\n                    .get(&scancode_name)\n                    .unwrap_or(&scancode_name)\n                    .into()\n            }\n            Page::Keycaps => key.physical_name.clone(),\n            Page::Logical => key.logical_name.clone(),\n            Page::Electrical => key.electrical_name.clone(),\n            Page::Leds => key.led_name.clone(),\n        }\n    }\n}\n\nimpl Default for Page {\n    fn default() -> Self {\n        Self::Layer1\n    }\n}\n"
  },
  {
    "path": "src/picker/mod.rs",
    "content": "use cascade::cascade;\nuse futures::{prelude::*, stream::FuturesUnordered};\nuse gtk::{\n    glib::{self, clone},\n    prelude::*,\n    subclass::prelude::*,\n};\nuse once_cell::sync::Lazy;\nuse std::{cell::RefCell, collections::HashMap};\n\nuse crate::Keyboard;\nuse backend::DerefCell;\n\nmod picker_group;\nmod picker_group_box;\nmod picker_json;\nmod picker_key;\n\nuse picker_group_box::PickerGroupBox;\nuse picker_json::picker_json;\nuse picker_key::PickerKey;\n\npub static SCANCODE_LABELS: Lazy<HashMap<String, String>> = Lazy::new(|| {\n    let mut labels = HashMap::new();\n    for group in picker_json() {\n        for key in group.keys {\n            labels.insert(key.keysym, key.label);\n        }\n    }\n    labels\n});\n\n#[derive(Default)]\npub struct PickerInner {\n    group_box: DerefCell<PickerGroupBox>,\n    keyboard: RefCell<Option<glib::WeakRef<Keyboard>>>,\n}\n\n#[glib::object_subclass]\nimpl ObjectSubclass for PickerInner {\n    const NAME: &'static str = \"S76KeyboardPicker\";\n    type ParentType = gtk::Box;\n    type Type = Picker;\n}\n\nimpl ObjectImpl for PickerInner {\n    fn constructed(&self) {\n        self.parent_constructed();\n\n        let picker = self.obj();\n\n        let group_box = cascade! {\n            PickerGroupBox::new();\n            ..connect_key_pressed(clone!(@weak picker => move |name| {\n                picker.key_pressed(name)\n            }));\n        };\n\n        cascade! {\n            picker;\n            ..add(&group_box);\n            ..show_all();\n        };\n\n        self.group_box.set(group_box);\n    }\n}\n\nimpl BoxImpl for PickerInner {}\n\nimpl WidgetImpl for PickerInner {}\n\nimpl ContainerImpl for PickerInner {}\n\nglib::wrapper! {\n    pub struct Picker(ObjectSubclass<PickerInner>)\n        @extends gtk::Box, gtk::Container, gtk::Widget, @implements gtk::Orientable;\n}\n\nimpl Picker {\n    pub fn new() -> Self {\n        glib::Object::new()\n    }\n\n    fn inner(&self) -> &PickerInner {\n        PickerInner::from_obj(self)\n    }\n\n    fn keyboard(&self) -> Option<Keyboard> {\n        self.inner()\n            .keyboard\n            .borrow()\n            .as_ref()\n            .and_then(|x| x.upgrade())\n    }\n\n    pub(crate) fn set_keyboard(&self, keyboard: Option<Keyboard>) {\n        if let Some(old_kb) = self.keyboard() {\n            old_kb.set_picker(None);\n        }\n\n        if let Some(widget) = self.parent() {\n            widget.downcast::<gtk::Container>().unwrap().remove(self);\n        }\n\n        if let Some(kb) = &keyboard {\n            // Check that scancode is available for the keyboard\n            self.inner()\n                .group_box\n                .set_key_visibility(|name| kb.has_scancode(name));\n            kb.set_picker(Some(self));\n        }\n\n        *self.inner().keyboard.borrow_mut() = keyboard.map(|x| x.downgrade());\n    }\n\n    pub(crate) fn set_selected(&self, scancode_names: Vec<String>) {\n        self.inner().group_box.set_selected(scancode_names);\n    }\n\n    fn key_pressed(&self, name: String) {\n        let kb = match self.keyboard() {\n            Some(kb) => kb,\n            None => {\n                return;\n            }\n        };\n        let layer = kb.layer();\n\n        if let Some(layer) = layer {\n            let futures = FuturesUnordered::new();\n            for i in kb.selected().iter() {\n                let i = *i;\n                futures.push(clone!(@strong kb, @strong name => async move {\n                    kb.keymap_set(i, layer, &name).await;\n                }));\n            }\n            glib::MainContext::default().spawn_local(async { futures.collect::<()>().await });\n        }\n    }\n}\n\nimpl Default for Picker {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::*;\n    use backend::{layouts, Layout};\n    use std::collections::HashSet;\n\n    #[test]\n    fn picker_has_keys() {\n        let mut missing = HashSet::new();\n        for i in layouts() {\n            let layout = Layout::from_board(i, \"dummy\").unwrap();\n            for j in layout.default.map.values().flatten() {\n                if !SCANCODE_LABELS.keys().any(|x| x == j) {\n                    missing.insert(j.to_owned());\n                }\n            }\n        }\n        assert_eq!(missing, HashSet::new());\n    }\n}\n"
  },
  {
    "path": "src/picker/picker_group.rs",
    "content": "use cascade::cascade;\nuse gtk::{pango, prelude::*};\nuse std::rc::Rc;\n\nuse super::PickerKey;\n\npub(super) struct PickerGroup {\n    /// Name of keys in this group\n    keys: Vec<Rc<PickerKey>>,\n    pub vbox: gtk::Box,\n    flow_box: gtk::FlowBox,\n}\n\nimpl PickerGroup {\n    pub fn new(name: String, cols: u32) -> Self {\n        let label = cascade! {\n            gtk::Label::new(Some(&name));\n            ..set_attributes(Some(&cascade! {\n                pango::AttrList::new();\n                ..insert(pango::AttrInt::new_weight(pango::Weight::Bold));\n            } ));\n            ..set_halign(gtk::Align::Start);\n            ..set_margin_bottom(8);\n        };\n\n        let flow_box = cascade! {\n            gtk::FlowBox::new();\n            ..set_column_spacing(4);\n            ..set_row_spacing(4);\n            ..set_max_children_per_line(cols);\n            ..set_min_children_per_line(cols);\n            ..set_filter_func(Some(Box::new(|child: &gtk::FlowBoxChild| child.child().unwrap().is_visible())));\n        };\n\n        let vbox = cascade! {\n            gtk::Box::new(gtk::Orientation::Vertical, 4);\n            ..add(&label);\n            ..add(&flow_box);\n        };\n\n        Self {\n            keys: Vec::new(),\n            vbox,\n            flow_box,\n        }\n    }\n\n    pub fn add_key(&mut self, key: Rc<PickerKey>) {\n        self.flow_box.add(&key.gtk);\n        self.keys.push(key);\n    }\n\n    pub fn iter_keys(&self) -> impl Iterator<Item = &PickerKey> {\n        self.keys.iter().map(|k| k.as_ref())\n    }\n\n    pub fn invalidate_filter(&self) {\n        self.flow_box.invalidate_filter();\n    }\n}\n"
  },
  {
    "path": "src/picker/picker_group_box.rs",
    "content": "use cascade::cascade;\nuse gtk::{\n    gdk,\n    glib::{self, clone, subclass::Signal, SignalHandlerId},\n    prelude::*,\n    subclass::prelude::*,\n};\nuse once_cell::sync::Lazy;\nuse std::{cell::RefCell, collections::HashMap, rc::Rc};\n\nuse backend::DerefCell;\n\nuse super::{picker_group::PickerGroup, picker_json::picker_json, picker_key::PickerKey};\n\nconst DEFAULT_COLS: usize = 3;\nconst HSPACING: i32 = 64;\nconst VSPACING: i32 = 32;\nconst PICKER_CSS: &str = r#\"\nbutton {\n    margin: 0;\n    padding: 0;\n}\n\n.selected {\n    border-color: #fbb86c;\n    border-width: 4px;\n}\n\"#;\n\n#[derive(Default)]\npub struct PickerGroupBoxInner {\n    groups: DerefCell<Vec<PickerGroup>>,\n    keys: DerefCell<HashMap<String, Rc<PickerKey>>>,\n    selected: RefCell<Vec<String>>,\n}\n\n#[glib::object_subclass]\nimpl ObjectSubclass for PickerGroupBoxInner {\n    const NAME: &'static str = \"S76KeyboardPickerGroupBox\";\n    type ParentType = gtk::Container;\n    type Type = PickerGroupBox;\n}\n\nimpl ObjectImpl for PickerGroupBoxInner {\n    fn constructed(&self) {\n        self.parent_constructed();\n\n        let style_provider = cascade! {\n            gtk::CssProvider::new();\n            ..load_from_data(PICKER_CSS.as_bytes()).expect(\"Failed to parse css\");\n        };\n\n        let mut groups = Vec::new();\n        let mut keys = HashMap::new();\n\n        for json_group in picker_json() {\n            let mut group = PickerGroup::new(json_group.label, json_group.cols);\n\n            for json_key in json_group.keys {\n                let key = PickerKey::new(\n                    json_key.keysym.clone(),\n                    json_key.label,\n                    json_group.width,\n                    &style_provider,\n                );\n\n                group.add_key(key.clone());\n                keys.insert(json_key.keysym, key);\n            }\n\n            groups.push(group);\n        }\n\n        for group in &groups {\n            group.vbox.show();\n            group.vbox.set_parent(&*self.obj());\n        }\n\n        self.keys.set(keys);\n        self.groups.set(groups);\n\n        cascade! {\n            self.obj();\n            ..connect_signals();\n            ..show_all();\n        };\n    }\n\n    fn signals() -> &'static [Signal] {\n        static SIGNALS: Lazy<Vec<Signal>> = Lazy::new(|| {\n            vec![Signal::builder(\"key-pressed\")\n                .param_types([String::static_type()])\n                .build()]\n        });\n        SIGNALS.as_ref()\n    }\n}\n\nimpl WidgetImpl for PickerGroupBoxInner {\n    fn request_mode(&self) -> gtk::SizeRequestMode {\n        gtk::SizeRequestMode::HeightForWidth\n    }\n\n    fn preferred_width(&self) -> (i32, i32) {\n        let minimum_width = self\n            .groups\n            .iter()\n            .map(|x| x.vbox.preferred_width().1)\n            .max()\n            .unwrap();\n        let natural_width = self\n            .groups\n            .chunks(3)\n            .map(|row| row.iter().map(|x| x.vbox.preferred_width().1).sum::<i32>())\n            .max()\n            .unwrap()\n            + 2 * HSPACING;\n        (minimum_width, natural_width)\n    }\n\n    fn preferred_height_for_width(&self, width: i32) -> (i32, i32) {\n        let obj = self.obj();\n        let rows = obj.rows_for_width(width);\n        let height = rows\n            .iter()\n            .map(|row| {\n                row.iter()\n                    .map(|x| x.vbox.preferred_height().1)\n                    .max()\n                    .unwrap()\n            })\n            .sum::<i32>()\n            + (rows.len() as i32 - 1) * VSPACING;\n\n        (height, height)\n    }\n\n    fn size_allocate(&self, allocation: &gtk::Allocation) {\n        self.parent_size_allocate(allocation);\n\n        let obj = self.obj();\n        let rows = obj.rows_for_width(allocation.width());\n\n        let total_width = rows\n            .iter()\n            .map(|row| {\n                row.iter().map(|x| x.vbox.preferred_width().1).sum::<i32>()\n                    + (row.len() as i32 - 1) * HSPACING\n            })\n            .max()\n            .unwrap();\n\n        let mut y = 0;\n        for row in rows {\n            let mut x = (allocation.width() - total_width) / 2;\n            for group in row {\n                let height = group.vbox.preferred_height().1;\n                let width = group.vbox.preferred_width().1;\n                group\n                    .vbox\n                    .size_allocate(&gtk::Allocation::new(x, y, width, height));\n                x += width + HSPACING;\n            }\n            y += row\n                .iter()\n                .map(|x| x.vbox.preferred_height().1)\n                .max()\n                .unwrap()\n                + VSPACING;\n        }\n    }\n\n    fn realize(&self) {\n        let widget = self.obj();\n\n        let allocation = widget.allocation();\n        widget.set_realized(true);\n\n        let attrs = gdk::WindowAttr {\n            x: Some(allocation.x()),\n            y: Some(allocation.y()),\n            width: allocation.width(),\n            height: allocation.height(),\n            window_type: gdk::WindowType::Child,\n            event_mask: widget.events(),\n            wclass: gdk::WindowWindowClass::InputOutput,\n            ..Default::default()\n        };\n\n        let window = gdk::Window::new(widget.parent_window().as_ref(), &attrs);\n        widget.register_window(&window);\n        widget.set_window(window);\n    }\n}\n\nimpl ContainerImpl for PickerGroupBoxInner {\n    fn forall(&self, _include_internals: bool, cb: &gtk::subclass::container::Callback) {\n        for group in self.groups.iter() {\n            cb.call(group.vbox.upcast_ref());\n        }\n    }\n\n    fn remove(&self, child: &gtk::Widget) {\n        child.unparent();\n    }\n}\n\nglib::wrapper! {\n    pub struct PickerGroupBox(ObjectSubclass<PickerGroupBoxInner>)\n        @extends gtk::Container, gtk::Widget, @implements gtk::Orientable;\n}\n\nimpl PickerGroupBox {\n    pub fn new() -> Self {\n        glib::Object::new()\n    }\n\n    fn inner(&self) -> &PickerGroupBoxInner {\n        PickerGroupBoxInner::from_obj(self)\n    }\n\n    fn connect_signals(&self) {\n        let picker = self;\n        for group in self.inner().groups.iter() {\n            for key in group.iter_keys() {\n                let button = &key.gtk;\n                let name = key.name.to_string();\n                button.connect_clicked(clone!(@weak picker => @default-panic, move |_| {\n                    picker.emit_by_name::<()>(\"key-pressed\", &[&name]);\n                }));\n            }\n        }\n    }\n\n    pub fn connect_key_pressed<F: Fn(String) + 'static>(&self, cb: F) -> SignalHandlerId {\n        self.connect_local(\"key-pressed\", false, move |values| {\n            cb(values[1].get::<String>().unwrap());\n            None\n        })\n    }\n\n    fn get_button(&self, scancode_name: &str) -> Option<&gtk::Button> {\n        self.inner().keys.get(scancode_name).map(|k| &k.gtk)\n    }\n\n    pub(crate) fn set_key_visibility<F: Fn(&str) -> bool>(&self, f: F) {\n        for key in self.inner().keys.values() {\n            key.gtk.set_visible(f(&key.name));\n        }\n\n        for group in self.inner().groups.iter() {\n            group.invalidate_filter();\n        }\n    }\n\n    pub(crate) fn set_selected(&self, scancode_names: Vec<String>) {\n        let mut selected = self.inner().selected.borrow_mut();\n\n        for i in selected.iter() {\n            if let Some(button) = self.get_button(i) {\n                button.style_context().remove_class(\"selected\");\n            }\n        }\n\n        *selected = scancode_names;\n\n        for i in selected.iter() {\n            if let Some(button) = self.get_button(i) {\n                button.style_context().add_class(\"selected\");\n            }\n        }\n    }\n\n    fn rows_for_width(&self, container_width: i32) -> Vec<&[PickerGroup]> {\n        let mut rows = Vec::new();\n        let groups = &*self.inner().groups;\n\n        let mut row_start = 0;\n        let mut row_width = 0;\n        for (i, group) in groups.iter().enumerate() {\n            let width = group.vbox.preferred_width().1;\n\n            row_width += width;\n            if i != 0 {\n                row_width += HSPACING;\n            }\n            if i - row_start >= DEFAULT_COLS || row_width > container_width {\n                rows.push(&groups[row_start..i]);\n                row_start = i;\n                row_width = width;\n            }\n        }\n\n        if !groups[row_start..].is_empty() {\n            rows.push(&groups[row_start..]);\n        }\n\n        rows\n    }\n}\n\nimpl Default for PickerGroupBox {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n"
  },
  {
    "path": "src/picker/picker_json.rs",
    "content": "use serde::Deserialize;\n\n#[derive(Deserialize)]\npub struct PickerJsonKey {\n    pub keysym: String,\n    pub label: String,\n}\n\n#[derive(Deserialize)]\npub struct PickerJsonGroup {\n    pub label: String,\n    pub cols: u32,\n    pub width: i32,\n    pub keys: Vec<PickerJsonKey>,\n}\n\npub fn picker_json() -> Vec<PickerJsonGroup> {\n    let picker_json = include_str!(\"../../layouts/picker.json\");\n    serde_json::from_str(picker_json).unwrap()\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_picker_json() {\n        picker_json();\n    }\n}\n"
  },
  {
    "path": "src/picker/picker_key.rs",
    "content": "use cascade::cascade;\nuse gtk::prelude::*;\nuse std::rc::Rc;\n\npub(super) struct PickerKey {\n    /// Symbolic name of the key\n    pub(super) name: String,\n    // GTK button\n    pub(super) gtk: gtk::Button,\n}\n\nimpl PickerKey {\n    pub(super) fn new<P: IsA<gtk::StyleProvider>>(\n        name: String,\n        text: String,\n        width: i32,\n        style_provider: &P,\n    ) -> Rc<Self> {\n        let label = cascade! {\n            gtk::Label::new(Some(&text));\n            ..set_line_wrap(true);\n            ..set_max_width_chars(1);\n            ..set_margin_start(5);\n            ..set_margin_end(5);\n            ..set_justify(gtk::Justification::Center);\n        };\n\n        let button = cascade! {\n            gtk::Button::new();\n            ..set_size_request(48 * width, 48);\n            ..style_context().add_provider(style_provider, gtk::STYLE_PROVIDER_PRIORITY_APPLICATION);\n            ..add(&label);\n        };\n\n        Rc::new(Self { name, gtk: button })\n    }\n}\n"
  },
  {
    "path": "src/shortcuts_window.rs",
    "content": "use crate::fl;\nuse gtk::prelude::*;\n\npub fn shortcuts_window() -> gtk::ShortcutsWindow {\n    // GtkShortcutWindow docs specifically say it should be used from\n    // GtkBuilder, and lacks things like a new function.\n\n    let xml = include_str!(\"shortcuts_window.ui\");\n    let builder = gtk::Builder::from_string(xml);\n\n    let import: gtk::ShortcutsShortcut = builder.object(\"import-layout\").unwrap();\n    import.set_title(Some(&fl!(\"layout-import\")));\n\n    let export: gtk::ShortcutsShortcut = builder.object(\"export-layout\").unwrap();\n    export.set_title(Some(&fl!(\"layout-export\")));\n\n    builder.object(\"shortcuts-window\").unwrap()\n}\n"
  },
  {
    "path": "src/shortcuts_window.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<interface>\n  <object class=\"GtkShortcutsWindow\" id=\"shortcuts-window\">\n    <property name=\"modal\">1</property>\n    <property name=\"section-name\">keyboard</property>\n    <child>\n      <object class=\"GtkShortcutsSection\" id=\"keyboard-section\">\n        <property name=\"visible\">True</property>\n        <property name=\"section-name\">keyboard</property>\n        <child>\n          <object class=\"GtkShortcutsGroup\">\n            <property name=\"visible\">True</property>\n            <child>\n              <object class=\"GtkShortcutsShortcut\" id=\"import-layout\">\n                <property name=\"visible\">True</property>\n                <property name=\"action-name\">kbd.import</property>\n              </object>\n            </child>\n            <child>\n              <object class=\"GtkShortcutsShortcut\" id=\"export-layout\">\n                <property name=\"visible\">True</property>\n                <property name=\"action-name\">kbd.export</property>\n              </object>\n            </child>\n          </object>\n        </child>\n      </object>\n    </child>\n  </object>\n</interface>\n"
  },
  {
    "path": "src/testing.rs",
    "content": "use crate::{fl, Keyboard, REFRESH_DISABLED};\nuse backend::{Board, DerefCell, NelsonKind, Rgb};\nuse cascade::cascade;\nuse futures::channel::oneshot;\nuse gtk::{\n    glib::{self, clone, Propagation},\n    prelude::*,\n    subclass::prelude::*,\n};\nuse once_cell::sync::{Lazy, OnceCell};\nuse std::{\n    cell::{Cell, RefCell},\n    collections::HashMap,\n    sync::{atomic::Ordering, RwLock},\n};\n\nstruct TestResults {\n    bench: RwLock<HashMap<&'static str, Result<f64, String>>>,\n}\n\nimpl TestResults {\n    fn global() -> &'static Self {\n        static TEST_RESULTS: OnceCell<TestResults> = OnceCell::new();\n        TEST_RESULTS.get_or_init(Self::new)\n    }\n\n    fn new() -> Self {\n        let test_results = Self {\n            bench: RwLock::new(HashMap::new()),\n        };\n        test_results.reset();\n        test_results\n    }\n\n    fn reset(&self) {\n        let mut bench = self.bench.write().unwrap();\n        bench.clear();\n        for port_desc in &[\n            \"USB 2.0: USB-A Left\",\n            \"USB 2.0: USB-A Right\",\n            \"USB 2.0: USB-C Left\",\n            \"USB 2.0: USB-C Right\",\n            \"USB 3.2 Gen 2: USB-A Left\",\n            \"USB 3.2 Gen 2: USB-A Right\",\n            \"USB 3.2 Gen 2: USB-C Left\",\n            \"USB 3.2 Gen 2: USB-C Right\",\n        ] {\n            bench.insert(*port_desc, Err(\"no benchmarks performed\".to_string()));\n        }\n    }\n}\n\n#[derive(Clone, Default, glib::Boxed)]\n#[boxed_type(name = \"S76TestingColor\")]\npub struct TestingColors(pub HashMap<(usize, usize), Rgb>);\n\n#[derive(Default)]\npub struct TestingInner {\n    board: DerefCell<Board>,\n    keyboard: DerefCell<glib::WeakRef<Keyboard>>,\n    reset_button: DerefCell<gtk::Button>,\n    usb_test: DerefCell<gtk::Box>,\n    bench_button: DerefCell<gtk::ToggleButton>,\n    bench_labels: DerefCell<HashMap<&'static str, gtk::Label>>,\n    num_runs_spin_2: DerefCell<gtk::SpinButton>,\n    test_buttons: DerefCell<[gtk::Button; 2]>,\n    test_labels: DerefCell<[gtk::Label; 3]>,\n    selma_start_button: DerefCell<gtk::Button>,\n    selma_stop_button: DerefCell<gtk::Button>,\n    selma_stop_sender: RefCell<Option<oneshot::Sender<()>>>,\n    selma_running: Cell<bool>,\n    colors: RefCell<TestingColors>,\n}\n\n#[glib::object_subclass]\nimpl ObjectSubclass for TestingInner {\n    const NAME: &'static str = \"S76Testing\";\n    type ParentType = gtk::Box;\n    type Type = Testing;\n}\n\nimpl ObjectImpl for TestingInner {\n    fn constructed(&self) {\n        fn row(widget: &impl IsA<gtk::Widget>) -> gtk::ListBoxRow {\n            cascade! {\n                gtk::ListBoxRow::new();\n                ..set_selectable(false);\n                ..set_activatable(false);\n                ..set_margin(8);\n                ..add(widget);\n            }\n        }\n\n        fn label_row(label: &str, widget: &impl IsA<gtk::Widget>) -> gtk::ListBoxRow {\n            row(&cascade! {\n                gtk::Box::new(gtk::Orientation::Horizontal, 8);\n                ..add(&cascade! {\n                    gtk::Label::new(Some(label));\n                    ..set_halign(gtk::Align::Start);\n                });\n                ..pack_end(widget, false, false, 0);\n            })\n        }\n\n        fn color_box(r: f64, g: f64, b: f64) -> gtk::DrawingArea {\n            cascade! {\n                gtk::DrawingArea::new();\n                ..set_size_request(18, 18);\n                ..connect_draw(move |_w, cr| {\n                    cr.set_source_rgb(r, g, b);\n                    cr.paint().unwrap();\n                    Propagation::Proceed\n                });\n            }\n        }\n\n        fn header_func(row: &gtk::ListBoxRow, before: Option<&gtk::ListBoxRow>) {\n            if before.is_none() {\n                row.set_header(None::<&gtk::Widget>)\n            } else if row.header().is_none() {\n                row.set_header(Some(&cascade! {\n                    gtk::Separator::new(gtk::Orientation::Horizontal);\n                    ..show();\n                }));\n            }\n        }\n\n        let reset_button = gtk::Button::with_label(\"Reset Testing\");\n\n        self.obj().add(&cascade! {\n            gtk::ListBox::new();\n            ..set_valign(gtk::Align::Start);\n            ..style_context().add_class(\"frame\");\n            ..add(&row(&reset_button));\n        });\n\n        let bench_list = gtk::ListBox::new();\n\n        let mut bench_labels = HashMap::new();\n        for (port_desc, _port_result) in TestResults::global().bench.read().unwrap().iter() {\n            let bench_label = gtk::Label::new(None);\n            bench_list.add(&label_row(port_desc, &bench_label));\n            bench_labels.insert(*port_desc, bench_label);\n        }\n\n        let bench_button = gtk::ToggleButton::with_label(\"Run USB test\");\n\n        let usb_test = cascade! {\n            gtk::Box::new(gtk::Orientation::Vertical, 12);\n            ..add(&gtk::Label::new(Some(\"USB Port Test\")));\n            ..add(&cascade! {\n                bench_list;\n                ..set_valign(gtk::Align::Start);\n                ..style_context().add_class(\"frame\");\n                ..add(&row(&bench_button));\n                ..set_header_func(Some(Box::new(header_func)));\n            });\n        };\n\n        let num_runs_spin_2 = gtk::SpinButton::with_range(1.0, 1000.0, 1.0);\n        num_runs_spin_2.set_value(100.0);\n\n        let test_buttons = [\n            gtk::Button::with_label(&fl!(\"button-test\")),\n            gtk::Button::with_label(&fl!(\"button-test\")),\n        ];\n        let test_labels = [\n            gtk::Label::new(None),\n            gtk::Label::new(None),\n            gtk::Label::new(None),\n        ];\n\n        let nelson_test_1 = &cascade! {\n            gtk::Box::new(gtk::Orientation::Vertical, 12);\n            ..add(&gtk::Label::new(Some(\"Nelson Test 1\")));\n            ..add(&cascade! {\n                gtk::ListBox::new();\n                ..set_valign(gtk::Align::Start);\n                ..style_context().add_class(\"frame\");\n                ..add(&row(&test_buttons[0]));\n                ..add(&row(&test_labels[0]));\n                ..add(&label_row(\"Check pins (missing)\", &color_box(1., 0., 0.)));\n                ..add(&label_row(\"Check key (sticking)\", &color_box(0., 1., 0.)));\n                ..set_header_func(Some(Box::new(header_func)));\n            });\n        };\n\n        let nelson_test_2 = &cascade! {\n            gtk::Box::new(gtk::Orientation::Vertical, 12);\n            ..add(&gtk::Label::new(Some(\"Nelson Test 2\")));\n            ..add(&cascade! {\n                gtk::ListBox::new();\n                ..set_valign(gtk::Align::Start);\n                ..style_context().add_class(\"frame\");\n                ..add(&label_row(&fl!(\"test-number-of-runs\"), &num_runs_spin_2));\n                ..add(&row(&test_buttons[1]));\n                ..add(&row(&test_labels[2]));\n                ..add(&label_row(&fl!(\"test-check-pins\"), &color_box(1., 0., 0.)));\n                ..add(&label_row(&fl!(\"test-check-key\"), &color_box(0., 1., 0.)));\n                ..set_header_func(Some(Box::new(header_func)));\n            });\n        };\n\n        let selma_start_button = gtk::Button::with_label(&fl!(\"button-start\"));\n        let selma_stop_button = cascade! {\n            gtk::Button::with_label(&fl!(\"button-stop\"));\n            ..set_sensitive(false);\n        };\n\n        let selma_test = &cascade! {\n            gtk::Box::new(gtk::Orientation::Vertical, 12);\n            ..add(&gtk::Label::new(Some(\"Selma Test\")));\n            ..add(&cascade! {\n                gtk::ListBox::new();\n                ..set_valign(gtk::Align::Start);\n                ..style_context().add_class(\"frame\");\n                ..add(&row(&cascade! {\n                    gtk::Box::new(gtk::Orientation::Horizontal, 8);\n                    ..set_halign(gtk::Align::Center);\n                    ..add(&selma_start_button);\n                    ..add(&selma_stop_button);\n                }));\n                ..add(&label_row(&fl!(\"test-spurious-keypress\"), &color_box(1., 0., 0.)));\n                ..set_header_func(Some(Box::new(header_func)));\n            });\n        };\n\n        self.obj().add(&cascade! {\n            gtk::Box::new(gtk::Orientation::Horizontal, 18);\n            ..set_valign(gtk::Align::Start);\n            ..add(&cascade! {\n                gtk::Box::new(gtk::Orientation::Vertical, 18);\n                ..set_valign(gtk::Align::Start);\n                ..add(&row(&usb_test));\n                ..add(&row(selma_test));\n            });\n            ..add(&cascade! {\n                gtk::Box::new(gtk::Orientation::Vertical, 18);\n                ..set_valign(gtk::Align::Start);\n                ..add(&row(nelson_test_1));\n                ..add(&row(nelson_test_2));\n            });\n        });\n\n        self.reset_button.set(reset_button);\n        self.usb_test.set(usb_test);\n        self.bench_button.set(bench_button);\n        self.bench_labels.set(bench_labels);\n        self.num_runs_spin_2.set(num_runs_spin_2);\n        self.test_buttons.set(test_buttons);\n        self.test_labels.set(test_labels);\n        self.selma_start_button.set(selma_start_button);\n        self.selma_stop_button.set(selma_stop_button);\n\n        cascade! {\n            self.obj();\n            ..set_orientation(gtk::Orientation::Vertical);\n            ..set_spacing(18);\n            ..show_all();\n        };\n    }\n\n    fn properties() -> &'static [glib::ParamSpec] {\n        static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {\n            vec![glib::ParamSpecBoxed::builder::<TestingColors>(\"colors\")\n                .read_only()\n                .build()]\n        });\n\n        PROPERTIES.as_ref()\n    }\n\n    fn property(&self, _id: usize, pspec: &glib::ParamSpec) -> glib::Value {\n        match pspec.name() {\n            \"colors\" => self.colors.borrow().to_value(),\n            _ => unimplemented!(),\n        }\n    }\n}\n\nimpl WidgetImpl for TestingInner {}\nimpl ContainerImpl for TestingInner {}\nimpl BoxImpl for TestingInner {}\n\nglib::wrapper! {\n    pub struct Testing(ObjectSubclass<TestingInner>)\n        @extends gtk::Box, gtk::Container, gtk::Widget, @implements gtk::Orientable;\n}\n\nimpl Testing {\n    fn update_benchmarks(&self) {\n        for (port_desc, port_result) in TestResults::global().bench.read().unwrap().iter() {\n            if let Some(bench_label) = self.inner().bench_labels.get(port_desc) {\n                match port_result {\n                    Ok(ok) => {\n                        bench_label.set_text(&format!(\"{:.2} MB/s ✅\", ok));\n                    }\n                    Err(err) => {\n                        bench_label.set_text(&format!(\"{} ❌\", err));\n                    }\n                }\n            } else {\n                error!(\"{} label not found\", port_desc);\n            }\n        }\n    }\n\n    async fn bench(&self) {\n        let testing = self.inner();\n\n        testing.bench_button.set_label(\"Running USB test\");\n\n        while testing.bench_button.is_active() {\n            match testing.board.benchmark().await {\n                Ok(benchmark) => {\n                    for (port_desc, port_result) in benchmark.port_results.iter() {\n                        let text = format!(\"{:.2?}\", port_result);\n                        info!(\"{}: {}\", port_desc, text);\n                        if let Some(bench_result) = TestResults::global()\n                            .bench\n                            .write()\n                            .unwrap()\n                            .get_mut(port_desc.as_str())\n                        {\n                            match bench_result {\n                                Ok(old) => match port_result {\n                                    Ok(new) => {\n                                        // Replace good results with better results\n                                        if new > old {\n                                            *bench_result = Ok(*new);\n                                        }\n                                    }\n                                    Err(_) => (),\n                                },\n                                Err(_err) => {\n                                    // Replace errors with newest results\n                                    *bench_result = port_result.clone();\n                                }\n                            }\n                        } else {\n                            error!(\"{} label result not found\", port_desc);\n                        }\n                    }\n                }\n                Err(err) => {\n                    let message = format!(\"Benchmark failed to run: {}\", err);\n                    error!(\"{}\", message);\n                    //TODO: have a global label?\n                    for (_, bench_label) in testing.bench_labels.iter() {\n                        bench_label.set_text(&message);\n                    }\n                }\n            }\n\n            self.update_benchmarks();\n\n            glib::timeout_future(std::time::Duration::new(1, 0)).await;\n        }\n\n        testing.bench_button.set_label(\"Run USB test\");\n    }\n\n    fn connect_bench_button(&self) {\n        self.inner()\n            .bench_button\n            .connect_clicked(clone!(@strong self as self_ => move |_| {\n                glib::MainContext::default().spawn_local(clone!(@strong self_ => async move {\n                    self_.bench().await;\n                }));\n            }));\n    }\n\n    fn test_buttons_sensitive(&self, sensitive: bool) {\n        for i in 0..2 {\n            self.inner().test_buttons[i].set_sensitive(sensitive);\n        }\n        self.inner().selma_start_button.set_sensitive(sensitive);\n    }\n\n    async fn nelson(&self, test_runs: i32, test_index: usize, nelson_kind: NelsonKind) {\n        let testing = self.inner();\n\n        info!(\"Disabling test buttons\");\n        self.test_buttons_sensitive(false);\n\n        let test_label = &testing.test_labels[test_index];\n\n        info!(\"Disable keyboard input events\");\n        self.set_no_input(true).await;\n\n        for test_run in 1..=test_runs {\n            let message = format!(\"Test {}/{} running\", test_run, test_runs);\n            info!(\"{}\", message);\n            test_label.set_text(&message);\n\n            let nelson = match testing.board.nelson(nelson_kind).await {\n                Ok(ok) => ok,\n                Err(err) => {\n                    let message = format!(\"Test {}/{} failed to run: {}\", test_run, test_runs, err);\n                    error!(\"{}\", message);\n                    test_label.set_text(&message);\n                    break;\n                }\n            };\n\n            for row in 0..nelson.max_rows() {\n                for col in 0..nelson.max_cols() {\n                    let r = if nelson.missing.get(row, col).unwrap_or(false) {\n                        255\n                    } else {\n                        0\n                    };\n                    let g = if nelson.sticking.get(row, col).unwrap_or(false) {\n                        255\n                    } else {\n                        0\n                    };\n                    let b = if nelson.bouncing.get(row, col).unwrap_or(false) {\n                        255\n                    } else {\n                        0\n                    };\n                    if r != 0 || g != 0 || b != 0 {\n                        testing\n                            .colors\n                            .borrow_mut()\n                            .0\n                            .insert((row, col), Rgb::new(r, g, b));\n                    } else {\n                        testing.colors.borrow_mut().0.remove(&(row, col));\n                    }\n                }\n            }\n\n            self.notify(\"colors\");\n\n            if nelson.success(testing.board.layout().layout()) {\n                let message = format!(\"Test {}/{} successful\", test_run, test_runs);\n                info!(\"{}\", message);\n                test_label.set_text(&message);\n            } else {\n                let message = format!(\"Test {}/{} failed\", test_run, test_runs);\n                error!(\"{}\", message);\n                test_label.set_text(&message);\n                break;\n            }\n        }\n\n        info!(\"Re-enable keyboard input events\");\n        self.set_no_input(false).await;\n\n        info!(\"Enabling test buttons\");\n        self.test_buttons_sensitive(true);\n    }\n\n    fn connect_test_button_1(&self) {\n        self.inner().test_buttons[0].connect_clicked(clone!(@strong self as self_ => move |_| {\n            glib::MainContext::default().spawn_local(clone!(@strong self_ => async move {\n                REFRESH_DISABLED.store(true, Ordering::Relaxed);\n                self_.nelson(1, 0, NelsonKind::Normal).await;\n                REFRESH_DISABLED.store(false, Ordering::Relaxed);\n            }));\n        }));\n    }\n\n    fn connect_test_button_2(&self) {\n        self.inner().test_buttons[1].connect_clicked(clone!(@strong self as self_ => move |_| {\n            glib::MainContext::default().spawn_local(clone!(@strong self_ => async move {\n                REFRESH_DISABLED.store(true, Ordering::Relaxed);\n                self_.nelson(\n                    self_.inner().num_runs_spin_2.value_as_int(),\n                    2,\n                    NelsonKind::Normal,\n                ).await;\n                REFRESH_DISABLED.store(false, Ordering::Relaxed);\n            }));\n        }));\n    }\n\n    pub fn selma_update_colors(&self) {\n        if !self.inner().selma_running.get() {\n            return;\n        }\n\n        let mut colors = self.inner().colors.borrow_mut();\n        for k in self.inner().board.keys() {\n            let (row, col) = k.electrical;\n            if k.pressed() {\n                colors\n                    .0\n                    .insert((row as usize, col as usize), Rgb::new(255, 0, 0));\n            }\n        }\n        drop(colors);\n        self.notify(\"colors\");\n    }\n\n    async fn selma(&self) {\n        let testing = self.inner();\n\n        info!(\"Disabling test buttons\");\n        self.test_buttons_sensitive(false);\n        testing.selma_stop_button.set_sensitive(true);\n\n        info!(\"Disable keyboard input events\");\n        self.set_no_input(true).await;\n\n        testing.colors.borrow_mut().0.clear();\n        self.selma_update_colors();\n        self.inner().selma_running.set(true);\n\n        // Wait for stop button to be pressed\n        let (sender, reciever) = oneshot::channel();\n        *testing.selma_stop_sender.borrow_mut() = Some(sender);\n        let _ = reciever.await;\n\n        self.inner().selma_running.set(false);\n\n        info!(\"Re-enable keyboard input events\");\n        self.set_no_input(false).await;\n\n        info!(\"Enabling test buttons\");\n        self.test_buttons_sensitive(true);\n        testing.selma_stop_button.set_sensitive(false);\n    }\n\n    fn connect_selma_buttons(&self) {\n        self.inner()\n            .selma_start_button\n            .connect_clicked(clone!(@strong self as self_ => move |_| {\n                glib::MainContext::default().spawn_local(clone!(@strong self_ => async move {\n                    self_.selma().await;\n                }));\n            }));\n\n        self.inner()\n            .selma_stop_button\n            .connect_clicked(clone!(@strong self as self_ => move |_| {\n                glib::MainContext::default().spawn_local(clone!(@strong self_ => async move {\n                    if let Some(sender) = self_.inner().selma_stop_sender.borrow_mut().take() {\n                        let _ = sender.send(());\n                    }\n                }));\n            }));\n    }\n\n    fn connect_reset_button(&self) {\n        let obj_btn = self.clone();\n        self.inner().reset_button.connect_clicked(move |_button| {\n            TestResults::global().reset();\n            obj_btn.update_benchmarks();\n        });\n    }\n\n    pub fn new(board: &Board, keyboard: &Keyboard) -> Self {\n        let obj: Self = glib::Object::new();\n        obj.inner().board.set(board.clone());\n        obj.inner().keyboard.set(keyboard.downgrade());\n        obj.connect_bench_button();\n        obj.connect_test_button_1();\n        obj.connect_test_button_2();\n        obj.connect_selma_buttons();\n        obj.connect_reset_button();\n        obj.update_benchmarks();\n        if board.is_lite() {\n            obj.inner().usb_test.set_sensitive(false);\n        }\n        obj\n    }\n\n    fn inner(&self) -> &TestingInner {\n        TestingInner::from_obj(self)\n    }\n\n    #[allow(dead_code)]\n    fn keyboard(&self) -> Keyboard {\n        self.inner().keyboard.upgrade().unwrap()\n    }\n\n    async fn set_no_input(&self, no_input: bool) {\n        if let Err(err) = self.inner().board.set_no_input(no_input).await {\n            error!(\"Error setting no input mode: {}\", err);\n        }\n    }\n}\n"
  },
  {
    "path": "tools/Cargo.toml",
    "content": "[package]\nname = \"tools\"\nversion = \"0.1.0\"\nauthors = [\"Michael Aaron Murphy <mmstick@pm.me>\"]\nedition = \"2018\"\ndescription = \"build tools used by this project\"\n\n[[bin]]\nname = \"pkgconfig\"\npath = \"src/pkgconfig.rs\"\n"
  },
  {
    "path": "tools/src/pkgconfig.rs",
    "content": "use std::{\n    env,\n    fs::{self, File},\n    io::{self, Write},\n};\n\nconst PKGCONFIG: &str = r#\"Name: ${name}\nDescription: {description}\nVersion: {version}\nCflags: -I${includedir}\nLibs: -L${libdir} -l${name}\"#;\n\nfn main() -> io::Result<()> {\n    let mut args = env::args();\n\n    let app = args.nth(1).expect(\"requires APP argument\");\n    let libdir = args.next().expect(\"requires libdir argument\");\n    let includedir = args.next().expect(\"requires includedir argument\");\n\n    fs::create_dir_all(\"target/\")?;\n\n    let target = [\"target/\", &app, \".pc\"].concat();\n    let mut file = File::create(target).expect(\"unable to create pkgconfig file\");\n\n    writeln!(\n        &mut file,\n        \"libdir={}\\nincludedir={}\\nname={}\\n{}\",\n        libdir, includedir, app, PKGCONFIG\n    )\n}\n"
  },
  {
    "path": "widgets/Cargo.toml",
    "content": "[package]\nname = \"system76-keyboard-configurator-widgets\"\nversion = \"0.1.0\"\nauthors = [\"Ian Douglas Scott <idscott@system76.com>\", \"Jeremy Soller <jeremy@system76.com>\"]\nlicense = \"GPL-3.0-or-later\"\nedition = \"2021\"\n\n[dependencies]\ncascade = \"1\"\nfutures = \"0.3.13\"\ngtk = { version = \"0.18.0\" }\nlibc = \"0.2\"\nonce_cell = \"1.4\"\nserde = { version = \"1.0\", features = [\"derive\"] }\nserde_json = \"1.0\"\nlog = \"0.4.0\"\nbackend = { package = \"system76-keyboard-configurator-backend\", features = [\"glib\"], path = \"../backend\" }\n\n# Translation support\ni18n-embed = { version = \"0.13.0\", features = [\"fluent-system\", \"desktop-requester\"] }\ni18n-embed-fl = \"0.6.0\"\nrust-embed = { version = \"6.2.0\", features = [\"debug-embed\"] }\n\n[build-dependencies]\ngio = \"0.18.0\"\n\n[target.'cfg(target_os = \"windows\")'.dependencies]\nwinreg = \"0.8\"\n\n[features]\nappimage = [\"backend/appimage\"]\n"
  },
  {
    "path": "widgets/examples/keyboard_color.rs",
    "content": "#![windows_subsystem = \"windows\"]\n\nuse cascade::cascade;\nuse gtk::{gio, glib, prelude::*};\n\nuse system76_keyboard_configurator_widgets::keyboard_backlight_widget;\n\nfn main() -> glib::ExitCode {\n    gtk::init().unwrap();\n\n    let application = cascade! {\n        gtk::Application::new(None, gio::ApplicationFlags::FLAGS_NONE);\n        ..connect_activate(move |app| {\n            let backlight_widget = cascade! {\n                keyboard_backlight_widget();\n                ..set_margin_top(12);\n                ..set_margin_bottom(12);\n                ..set_margin_start(12);\n                ..set_margin_end(12);\n            };\n\n            cascade! {\n                gtk::ApplicationWindow::new(app);\n                ..set_default_size(500, 500);\n                ..add(&backlight_widget);\n                ..show_all();\n            };\n        });\n    };\n\n    application.run()\n}\n"
  },
  {
    "path": "widgets/i18n.toml",
    "content": "fallback_language = \"en\"\n\n[fluent]\nassets_dir = \"../i18n\"\n"
  },
  {
    "path": "widgets/src/choose_color.rs",
    "content": "use crate::fl;\nuse cascade::cascade;\nuse futures::future::abortable;\nuse gtk::{\n    gio,\n    glib::{self, clone, Propagation},\n    prelude::*,\n};\nuse std::{cell::RefCell, rc::Rc};\n\nuse crate::{ColorWheel, KeyboardColorIndex};\nuse backend::{Board, Hs};\n\npub async fn choose_color<W: IsA<gtk::Widget>>(\n    board: Board,\n    w: &W,\n    title: &str,\n    color: Option<Hs>,\n    index: KeyboardColorIndex,\n    cancellable: Option<gio::Cancellable>,\n) -> Option<Hs> {\n    let index = Rc::new(index);\n    let original_colors = index.get_colors(&board);\n    let abort_handle = Rc::new(RefCell::new(None));\n    board.block_led_save();\n\n    let color_wheel = cascade! {\n        ColorWheel::new();\n        ..set_hs(color.unwrap_or_default());\n        ..set_size_request(300, 300);\n    };\n\n    let preview = cascade! {\n        gtk::DrawingArea::new();\n        ..set_halign(gtk::Align::Center);\n        ..set_size_request(300, 25);\n        ..connect_draw(clone!(@weak color_wheel => @default-panic, move |_w, cr| {\n            let (r, g, b) = color_wheel.hs().to_rgb().to_floats();\n            cr.set_source_rgb(r, g, b);\n            cr.paint().unwrap();\n            Propagation::Proceed\n        }));\n    };\n\n    color_wheel.connect_hs_changed(\n        clone!(@strong board, @strong index, @weak preview => @default-panic, move |wheel| {\n            glib::MainContext::default().spawn_local(clone!(@strong board, @strong wheel, @strong index, @strong abort_handle => async move {\n                let (res, new_abort_handle) = abortable(index.set_color(&board, wheel.hs()));\n                if let Some(handle) = abort_handle.replace(Some(new_abort_handle)) {\n                    handle.abort();\n                }\n                if let Ok(Err(err)) = res.await {\n                    error!(\"{}: {}\", fl!(\"error-set-color\"), err);\n                }\n            }));\n            preview.queue_draw();\n        }),\n    );\n\n    let hue_adjustment = gtk::Adjustment::new(0., 0., 360., 1., 1., 0.);\n    let saturation_adjustment = gtk::Adjustment::new(0., 0., 100., 1., 1., 0.);\n    let flags = glib::BindingFlags::BIDIRECTIONAL | glib::BindingFlags::SYNC_CREATE;\n    color_wheel\n        .bind_property(\"hue\", &hue_adjustment, \"value\")\n        .flags(flags)\n        .build();\n    color_wheel\n        .bind_property(\"saturation\", &saturation_adjustment, \"value\")\n        .flags(flags)\n        .build();\n\n    let hue_box = cascade! {\n        gtk::Box::new(gtk::Orientation::Horizontal, 0);\n        ..add(&gtk::Label::new(Some(&fl!(\"label-hue\"))));\n        ..add(&cascade! {\n            gtk::Scale::new(gtk::Orientation::Horizontal, Some(&hue_adjustment));\n            ..set_hexpand(true);\n            ..set_draw_value(false);\n        });\n        ..add(&gtk::SpinButton::new(Some(&hue_adjustment), 0., 0));\n    };\n\n    let saturation_box = cascade! {\n        gtk::Box::new(gtk::Orientation::Horizontal, 0);\n        ..add(&gtk::Label::new(Some(&fl!(\"label-saturation\"))));\n        ..add(&cascade! {\n            gtk::Scale::new(gtk::Orientation::Horizontal, Some(&saturation_adjustment));\n            ..set_hexpand(true);\n            ..set_draw_value(false);\n        });\n        ..add(&gtk::SpinButton::new(Some(&saturation_adjustment), 0., 0));\n    };\n\n    let vbox = cascade! {\n        gtk::Box::new(gtk::Orientation::Vertical, 12);\n        ..set_margin(24);\n        ..add(&color_wheel);\n        ..add(&preview);\n        ..add(&hue_box);\n        ..add(&saturation_box);\n    };\n\n    let window = w.toplevel().and_then(|x| x.downcast::<gtk::Window>().ok());\n\n    let dialog = cascade! {\n        gtk::Dialog::builder()\n            .title(title)\n            .use_header_bar(1)\n            .modal(true)\n            .build();\n        ..add_button(&fl!(\"button-cancel\"), gtk::ResponseType::Cancel);\n        ..add_button(&fl!(\"button-save\"), gtk::ResponseType::Ok);\n        ..content_area().add(&vbox);\n        ..set_transient_for(window.as_ref());\n        ..show_all();\n    };\n\n    if let Some(cancellable) = cancellable {\n        cancellable.connect_closure(\n            \"cancelled\",\n            false,\n            glib::closure_local!(@watch dialog => move |_: glib::Object| dialog.close()),\n        );\n    }\n\n    let response = dialog.run_future().await;\n\n    dialog.close();\n    board.unblock_led_save();\n\n    if response == gtk::ResponseType::Ok {\n        Some(color_wheel.hs())\n    } else {\n        if let Err(err) = index.set_colors(&board, &original_colors).await {\n            error!(\"{}: {}\", fl!(\"error-set-color\"), err);\n        }\n        None\n    }\n}\n"
  },
  {
    "path": "widgets/src/color_circle.rs",
    "content": "use cascade::cascade;\nuse gtk::{cairo, glib, glib::Propagation, prelude::*, subclass::prelude::*};\nuse std::{cell::RefCell, collections::BTreeSet, f64::consts::PI};\n\nuse backend::Hs;\n\nconst BORDER: f64 = 1.;\n\n#[derive(Default)]\npub struct ColorCircleInner {\n    colors: RefCell<BTreeSet<Hs>>,\n}\n\n#[glib::object_subclass]\nimpl ObjectSubclass for ColorCircleInner {\n    const NAME: &'static str = \"S76ColorCircle\";\n    type ParentType = gtk::Button;\n    type Type = ColorCircle;\n}\n\nimpl ObjectImpl for ColorCircleInner {}\n\nimpl WidgetImpl for ColorCircleInner {\n    fn draw(&self, cr: &cairo::Context) -> Propagation {\n        let width = f64::from(self.obj().allocated_width());\n        let height = f64::from(self.obj().allocated_height());\n\n        let flags = self.obj().state_flags();\n\n        let radius = width.min(height) / 2.;\n        let alpha = if flags.contains(gtk::StateFlags::INSENSITIVE) {\n            0.5\n        } else {\n            1.\n        };\n\n        let colors = self.colors.borrow();\n        let total = colors.len() as f64;\n\n        let mut angle1 = 0.;\n        for hs in colors.iter() {\n            let angle2 = angle1 + (2. * PI) / total;\n            cr.move_to(radius, radius);\n            cr.arc(radius, radius, radius - 2. * BORDER, angle1, angle2);\n            cr.close_path();\n            let (r, g, b) = hs.to_rgb().to_floats();\n            cr.set_source_rgba(r, g, b, alpha);\n            cr.fill().unwrap();\n            angle1 = angle2;\n        }\n\n        cr.arc(radius, radius, radius - 2. * BORDER, 0., 2. * PI);\n        if flags.contains(gtk::StateFlags::PRELIGHT) {\n            cr.set_source_rgba(0., 0., 0., 0.2);\n            cr.fill_preserve().unwrap();\n        }\n        cr.set_line_width(BORDER);\n        cr.set_source_rgb(0.5, 0.5, 0.5);\n        cr.stroke().unwrap();\n\n        Propagation::Proceed\n    }\n}\n\nimpl ContainerImpl for ColorCircleInner {}\nimpl BinImpl for ColorCircleInner {}\nimpl ButtonImpl for ColorCircleInner {}\n\nglib::wrapper! {\n    pub struct ColorCircle(ObjectSubclass<ColorCircleInner>)\n        @extends gtk::Button, gtk::Bin, gtk::Container, gtk::Widget;\n}\n\nimpl ColorCircle {\n    pub fn new(size: i32) -> Self {\n        cascade! {\n            glib::Object::new::<Self>();\n            ..set_size_request(size, size);\n        }\n    }\n\n    fn inner(&self) -> &ColorCircleInner {\n        ColorCircleInner::from_obj(self)\n    }\n\n    pub fn set_colors(&self, colors: BTreeSet<Hs>) {\n        self.inner().colors.replace(colors);\n        self.queue_draw();\n    }\n}\n"
  },
  {
    "path": "widgets/src/color_wheel.rs",
    "content": "// A hue/saturation color wheel that allows a color to be selected.\n\nuse cascade::cascade;\nuse futures::future::{abortable, AbortHandle};\nuse gtk::{\n    cairo, gdk,\n    glib::{self, clone, Propagation},\n    prelude::*,\n    subclass::prelude::*,\n};\nuse std::cell::{Cell, RefCell};\nuse std::f64::consts::PI;\n\nuse crate::DerefCell;\nuse backend::{Hs, Rgb};\n\n#[derive(Default)]\npub struct ColorWheelInner {\n    selected_hs: Cell<Hs>,\n    surface: RefCell<Option<cairo::ImageSurface>>,\n    thread_pool: DerefCell<glib::ThreadPool>,\n    abort_handle: RefCell<Option<AbortHandle>>,\n    gesture_drag: DerefCell<gtk::GestureDrag>,\n    drag_start_xy: Cell<(f64, f64)>,\n}\n\n#[glib::object_subclass]\nimpl ObjectSubclass for ColorWheelInner {\n    const NAME: &'static str = \"S76ColorWheel\";\n    type ParentType = gtk::DrawingArea;\n    type Type = ColorWheel;\n}\n\nimpl ObjectImpl for ColorWheelInner {\n    fn constructed(&self) {\n        self.parent_constructed();\n\n        self.thread_pool\n            .set(glib::ThreadPool::shared(None).unwrap());\n\n        let wheel = self.obj();\n        self.gesture_drag.set(cascade! {\n            gtk::GestureDrag::new(&*wheel);\n            ..set_propagation_phase(gtk::PropagationPhase::Bubble);\n            ..connect_drag_begin(clone!(@weak wheel => move |_, start_x, start_y| {\n                wheel.mouse_select((start_x, start_y));\n                wheel.inner().drag_start_xy.set((start_x, start_y))\n            }));\n            ..connect_drag_update(clone!(@weak wheel => move |_, offset_x, offset_y| {\n                let (start_x, start_y) = wheel.inner().drag_start_xy.get();\n                wheel.mouse_select((start_x + offset_x, start_y + offset_y));\n            }));\n        });\n    }\n\n    fn properties() -> &'static [glib::ParamSpec] {\n        use once_cell::sync::Lazy;\n        static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {\n            vec![\n                glib::ParamSpecBoxed::builder::<Hs>(\"hs\").build(),\n                glib::ParamSpecDouble::builder(\"hue\")\n                    .minimum(0.)\n                    .maximum(360.)\n                    .default_value(0.)\n                    .build(),\n                glib::ParamSpecDouble::builder(\"saturation\")\n                    .minimum(0.)\n                    .maximum(100.)\n                    .default_value(0.)\n                    .build(),\n            ]\n        });\n\n        PROPERTIES.as_ref()\n    }\n\n    fn set_property(&self, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) {\n        match pspec.name() {\n            \"hs\" => {\n                self.obj().set_hs(*value.get::<&Hs>().unwrap());\n            }\n            \"hue\" => {\n                let mut hue: f64 = value.get().unwrap();\n                hue = (hue * PI / 180.).max(0.).min(2. * PI);\n                let hs = self.obj().hs();\n                self.obj().set_hs(Hs::new(hue, *hs.s));\n            }\n            \"saturation\" => {\n                let mut saturation: f64 = value.get().unwrap();\n                saturation = (saturation / 100.).max(0.).min(1.);\n                let hs = self.obj().hs();\n                self.obj().set_hs(hs);\n                self.obj().set_hs(Hs::new(*hs.h, saturation));\n            }\n            _ => unimplemented!(),\n        }\n    }\n\n    fn property(&self, _id: usize, pspec: &glib::ParamSpec) -> glib::Value {\n        match pspec.name() {\n            \"hs\" => self.obj().hs().to_value(),\n            \"hue\" => {\n                let mut hue = *self.obj().hs().h * 180. / PI;\n                hue = (360. + hue) % 360.;\n                hue.to_value()\n            }\n            \"saturation\" => (self.obj().hs().s * 100.).to_value(),\n            _ => unimplemented!(),\n        }\n    }\n}\n\nimpl WidgetImpl for ColorWheelInner {\n    fn draw(&self, cr: &cairo::Context) -> Propagation {\n        self.parent_draw(cr);\n\n        let width = f64::from(self.obj().allocated_width());\n        let height = f64::from(self.obj().allocated_height());\n\n        let radius = width.min(height) / 2.;\n\n        cr.translate(width / 2. - radius, 0.);\n\n        // Draw color wheel\n        if let Some(surface) = self.surface.borrow().as_ref() {\n            let pattern = cairo::SurfacePattern::create(surface);\n            let scale = surface.width() as f64 / (radius * 2.);\n            let mut matrix = cairo::Matrix::identity();\n            matrix.scale(scale, scale);\n            pattern.set_matrix(matrix);\n            cr.set_source(&pattern).unwrap();\n        } else {\n            cr.set_source_rgba(0., 0., 0., 0.);\n        }\n        cr.arc(radius, radius, radius, 0., 2. * PI);\n        cr.fill().unwrap();\n\n        // Draw selector circle\n        let hs = self.obj().hs();\n        let x = radius + hs.h.cos() * (*hs.s) * radius;\n        let y = radius - hs.h.sin() * (*hs.s) * radius;\n        cr.arc(x, y, 7.5, 0., 2. * PI);\n        cr.set_source_rgb(1., 1., 1.);\n        cr.fill_preserve().unwrap();\n        cr.set_source_rgb(0., 0., 0.);\n        cr.set_line_width(1.);\n        cr.stroke().unwrap();\n\n        Propagation::Proceed\n    }\n\n    fn size_allocate(&self, rect: &gdk::Rectangle) {\n        self.parent_size_allocate(rect);\n        let wheel = self.obj();\n        let (future, abort_handle) = abortable(clone!(@weak wheel, @strong rect => async move {\n            let surface = Some(wheel.generate_surface(&rect).await);\n            wheel.inner().surface.replace(surface);\n            wheel.queue_draw();\n        }));\n        if let Some(abort_handle) = self.abort_handle.replace(Some(abort_handle)) {\n            abort_handle.abort();\n        }\n        glib::MainContext::default().spawn_local(async {\n            let _ = future.await;\n        });\n    }\n\n    fn request_mode(&self) -> gtk::SizeRequestMode {\n        gtk::SizeRequestMode::HeightForWidth\n    }\n\n    fn preferred_width(&self) -> (i32, i32) {\n        (0, 300)\n    }\n\n    fn preferred_height(&self) -> (i32, i32) {\n        (0, 300)\n    }\n\n    fn preferred_height_for_width(&self, width: i32) -> (i32, i32) {\n        (0, width)\n    }\n\n    fn preferred_width_for_height(&self, height: i32) -> (i32, i32) {\n        (0, height)\n    }\n}\n\nimpl DrawingAreaImpl for ColorWheelInner {}\n\nglib::wrapper! {\n    pub struct ColorWheel(ObjectSubclass<ColorWheelInner>)\n        @extends gtk::DrawingArea, gtk::Widget;\n}\n\nimpl ColorWheel {\n    pub fn new() -> Self {\n        glib::Object::new()\n    }\n\n    fn inner(&self) -> &ColorWheelInner {\n        ColorWheelInner::from_obj(self)\n    }\n\n    pub fn hs(&self) -> Hs {\n        self.inner().selected_hs.get()\n    }\n\n    pub fn set_hs(&self, hs: Hs) {\n        self.inner().selected_hs.set(hs);\n        self.queue_draw();\n        self.notify(\"hs\");\n        self.notify(\"hue\");\n        self.notify(\"saturation\");\n    }\n\n    pub fn connect_hs_changed<F: Fn(&Self) + 'static>(&self, f: F) {\n        self.connect_notify_local(Some(\"hs\"), move |wheel, _| f(wheel));\n    }\n\n    fn mouse_select(&self, pos: (f64, f64)) {\n        let width = f64::from(self.allocated_width());\n        let height = f64::from(self.allocated_height());\n\n        let radius = width.min(height) / 2.;\n        let (x, y) = (pos.0 - width / 2., radius - pos.1);\n\n        let angle = y.atan2(x);\n        let distance = y.hypot(x);\n\n        self.set_hs(Hs::new(angle, (distance / radius).min(1.)));\n    }\n\n    async fn generate_surface(&self, rect: &gtk::Rectangle) -> cairo::ImageSurface {\n        let size = rect.width().min(rect.height());\n        let stride = cairo::Format::Rgb24.stride_for_width(size as u32).unwrap();\n\n        let data = self\n            .inner()\n            .thread_pool\n            .push_future(move || {\n                let mut data = vec![0; (size * stride) as usize];\n\n                for row in 0..size {\n                    for col in 0..size {\n                        let radius = size as f64 / 2.;\n                        let (x, y) = (col as f64 - radius, radius - row as f64);\n\n                        let angle = y.atan2(x);\n                        let distance = y.hypot(x);\n\n                        let Rgb { r, g, b } = Hs::new(angle, distance / radius).to_rgb();\n\n                        let offset = (row * stride + col * 4) as usize;\n                        data[offset] = b;\n                        data[offset + 1] = g;\n                        data[offset + 2] = r;\n                    }\n                }\n\n                data\n            })\n            .unwrap()\n            .await\n            .unwrap();\n\n        cairo::ImageSurface::create_for_data(data, cairo::Format::Rgb24, size, size, stride)\n            .unwrap()\n    }\n}\n\nimpl Default for ColorWheel {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n"
  },
  {
    "path": "widgets/src/keyboard_backlight_widget.rs",
    "content": "// Intended for use in Gnome Control Center's Keyboard panel\n\nuse crate::fl;\nuse cascade::cascade;\nuse futures::StreamExt;\nuse gtk::{\n    glib::{self, clone, Propagation},\n    prelude::*,\n};\n\nuse crate::{KeyboardColor, KeyboardColorIndex};\nuse backend::{Backend, Board};\n\npub fn keyboard_backlight_widget() -> gtk::Widget {\n    let stack = cascade! {\n        gtk::Stack::new();\n        ..style_context().add_class(\"frame\");\n        ..set_transition_type(gtk::StackTransitionType::SlideLeftRight);\n    };\n\n    let stack_switcher = cascade! {\n        gtk::StackSwitcher::new();\n        ..set_stack(Some(&stack));\n    };\n\n    let vbox = cascade! {\n        gtk::Box::new(gtk::Orientation::Vertical, 12);\n        ..add(&stack_switcher);\n        ..add(&stack);\n    };\n\n    if let Err(err) = add_boards(&stack) {\n        eprintln!(\"Failed to get keyboards: {}\", err);\n    }\n\n    vbox.upcast()\n}\n\nfn add_boards(stack: &gtk::Stack) -> Result<(), String> {\n    let (backend, mut receiver) = Backend::new_s76power()?;\n    glib::MainContext::default().spawn_local(clone!(@strong stack => async move {\n        while let Some(event) = receiver.next().await {\n            if let backend::Event::BoardAdded(board) = event {\n                let name = board.model().to_owned();\n                stack.add_titled(&page(board), &name, &name);\n            }\n        }\n    }));\n    backend.refresh();\n\n    Ok(())\n}\n\nfn page(board: Board) -> gtk::Widget {\n    let max_brightness = board.max_brightness() as f64;\n    let brightness = board.layers()[0].brightness() as f64;\n    let brightness_scale = cascade! {\n        gtk::Scale::with_range(gtk::Orientation::Horizontal, 0., max_brightness, 1.);\n        ..set_hexpand(true);\n        ..set_draw_value(false);\n        ..set_value(brightness);\n        ..connect_change_value(clone!(@strong board => move |_scale, _, value| {\n            glib::MainContext::default().spawn_local(clone!(@strong board => async move {\n                if let Err(err) = board.layers()[0].set_brightness(value as i32).await {\n                    eprintln!(\"{}: {}\", fl!(\"error-set-brightness\"), err);\n                }\n            }));\n            Propagation::Proceed\n        }));\n    };\n\n    // TODO detect when brightness changed in daemon\n\n    let button = KeyboardColor::new(Some(board), KeyboardColorIndex::Layer(0));\n\n    let listbox = cascade! {\n        gtk::ListBox::new();\n        ..set_header_func(Some(Box::new(|row, before| {\n            let separator = gtk::Separator::new(gtk::Orientation::Horizontal);\n            row.set_header(before.and(Some(&separator)));\n        })));\n        ..add(&row(&fl!(\"scale-brightness\"), &brightness_scale, true));\n        ..add(&row(&fl!(\"button-color\"), &button, false));\n    };\n\n    listbox.upcast()\n}\n\nfn row<W: IsA<gtk::Widget>>(text: &str, widget: &W, expand: bool) -> gtk::ListBoxRow {\n    let label = cascade! {\n        gtk::Label::new(Some(text));\n        ..set_justify(gtk::Justification::Left);\n    };\n\n    let hbox = cascade! {\n        gtk::Box::new(gtk::Orientation::Horizontal, 24);\n        ..set_hexpand(true);\n        ..set_vexpand(true);\n        ..pack_start(&label, false, false, 0);\n        ..pack_end(widget, expand, expand, 0);\n    };\n\n    let list_box_row = cascade! {\n        gtk::ListBoxRow::new();\n        ..set_selectable(false);\n        ..set_activatable(false);\n        ..set_margin(12);\n        ..add(&hbox);\n    };\n\n    list_box_row\n}\n"
  },
  {
    "path": "widgets/src/keyboard_color.rs",
    "content": "use crate::fl;\nuse cascade::cascade;\nuse futures::{prelude::*, stream::FuturesUnordered};\nuse gtk::{\n    gio,\n    glib::{self, clone},\n    prelude::*,\n    subclass::prelude::*,\n};\nuse std::{\n    cell::{Cell, Ref, RefCell},\n    collections::{BTreeSet, HashMap},\n};\n\nuse crate::{choose_color, ColorCircle, DerefCell, SelectedKeys};\nuse backend::{Board, Hs};\n\n#[derive(Clone)]\npub enum KeyboardColorIndex {\n    Keys(SelectedKeys),\n    Layer(usize),\n}\n\nimpl KeyboardColorIndex {\n    pub async fn set_color(&self, board: &Board, hs: Hs) -> Result<(), String> {\n        match self {\n            KeyboardColorIndex::Keys(keys) => {\n                let futures = FuturesUnordered::new();\n                for i in keys.iter() {\n                    futures.push(board.keys()[*i].set_color(Some(hs)));\n                }\n                futures.try_collect::<()>().await?\n            }\n            KeyboardColorIndex::Layer(i) => board.layers()[*i].set_color(hs).await?,\n        };\n        Ok(())\n    }\n\n    pub fn get_color_set(&self, board: &Board) -> BTreeSet<Hs> {\n        match self {\n            KeyboardColorIndex::Keys(keys) => keys\n                .iter()\n                .filter_map(|i| board.keys()[*i].color())\n                .collect(),\n            KeyboardColorIndex::Layer(i) => cascade! {\n                BTreeSet::new();\n                ..insert(board.layers()[*i].color());\n            },\n        }\n    }\n\n    pub fn get_colors(&self, board: &Board) -> HashMap<usize, Hs> {\n        match self {\n            KeyboardColorIndex::Keys(keys) => keys\n                .iter()\n                .filter_map(|i| Some((*i, board.keys()[*i].color()?)))\n                .collect(),\n            KeyboardColorIndex::Layer(i) => cascade! {\n                HashMap::new();\n                ..insert(*i, board.layers()[*i].color());\n            },\n        }\n    }\n\n    pub async fn set_colors(\n        &self,\n        board: &Board,\n        colors: &HashMap<usize, Hs>,\n    ) -> Result<(), String> {\n        match self {\n            KeyboardColorIndex::Keys(keys) => {\n                let futures = FuturesUnordered::new();\n                for i in keys.iter() {\n                    futures.push(board.keys()[*i].set_color(colors.get(i).copied()));\n                }\n                futures.try_collect::<()>().await?\n            }\n            KeyboardColorIndex::Layer(i) => {\n                board.layers()[*i]\n                    .set_color(*colors.get(i).unwrap())\n                    .await?\n            }\n        };\n        Ok(())\n    }\n}\n\nimpl Default for KeyboardColorIndex {\n    fn default() -> Self {\n        Self::Layer(0)\n    }\n}\n\n#[derive(Default)]\npub struct KeyboardColorInner {\n    circle: DerefCell<ColorCircle>,\n    board: RefCell<Option<Board>>,\n    hs: Cell<Hs>,\n    index: RefCell<KeyboardColorIndex>,\n    dialog_cancellable: Cell<Option<gio::Cancellable>>,\n}\n\n#[glib::object_subclass]\nimpl ObjectSubclass for KeyboardColorInner {\n    const NAME: &'static str = \"S76KeyboardColor\";\n    type ParentType = gtk::Bin;\n    type Type = KeyboardColor;\n}\n\nimpl ObjectImpl for KeyboardColorInner {\n    fn constructed(&self) {\n        self.parent_constructed();\n\n        let wheel = self.obj();\n        let circle = cascade! {\n            ColorCircle::new(30);\n            ..connect_clicked(clone!(@weak wheel => move |_| wheel.circle_clicked()));\n        };\n\n        self.obj().add(&circle);\n\n        self.circle.set(circle);\n    }\n\n    fn properties() -> &'static [glib::ParamSpec] {\n        use once_cell::sync::Lazy;\n        static PROPERTIES: Lazy<Vec<glib::ParamSpec>> =\n            Lazy::new(|| vec![glib::ParamSpecBoxed::builder::<Hs>(\"hs\").build()]);\n\n        PROPERTIES.as_ref()\n    }\n\n    fn set_property(&self, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) {\n        match pspec.name() {\n            \"hs\" => {\n                let hs: &Hs = value.get().unwrap();\n                self.obj().set_hs(*hs);\n            }\n            _ => unimplemented!(),\n        }\n    }\n\n    fn property(&self, _id: usize, pspec: &glib::ParamSpec) -> glib::Value {\n        match pspec.name() {\n            \"hs\" => self.hs.get().to_value(),\n            _ => unimplemented!(),\n        }\n    }\n}\n\nimpl WidgetImpl for KeyboardColorInner {\n    fn destroy(&self) {\n        self.obj().cancel_dialog();\n    }\n}\n\nimpl ContainerImpl for KeyboardColorInner {}\nimpl BinImpl for KeyboardColorInner {}\n\nglib::wrapper! {\n    pub struct KeyboardColor(ObjectSubclass<KeyboardColorInner>)\n        @extends gtk::Bin, gtk::Container, gtk::Widget;\n}\n\nimpl KeyboardColor {\n    pub fn new(board: Option<Board>, index: KeyboardColorIndex) -> Self {\n        cascade! {\n            glib::Object::new::<Self>();\n            ..set_board(board);\n            ..set_index(index);\n        }\n    }\n\n    fn inner(&self) -> &KeyboardColorInner {\n        KeyboardColorInner::from_obj(self)\n    }\n\n    fn circle_clicked(&self) {\n        self.cancel_dialog();\n\n        let cancellable = gio::Cancellable::new();\n        glib::MainContext::default().spawn_local(\n            clone!(@weak self as self_, @strong cancellable => async move {\n                let title = fl!(\"choose-color\");\n                let resp = choose_color(\n                    self_.board().unwrap().clone(),\n                    &self_,\n                    &title,\n                    Some(self_.hs()),\n                    self_.index().clone(),\n                    Some(cancellable),\n                );\n                if let Some(color) = resp.await {\n                    self_.set_hs(color);\n                }\n            }),\n        );\n        self.inner().dialog_cancellable.set(Some(cancellable));\n    }\n\n    fn board(&self) -> Option<Ref<Board>> {\n        let board = self.inner().board.borrow();\n        if board.is_some() {\n            Some(Ref::map(board, |x| x.as_ref().unwrap()))\n        } else {\n            None\n        }\n    }\n\n    pub fn set_board(&self, board: Option<Board>) {\n        self.inner().circle.set_sensitive(board.is_some());\n        *self.inner().board.borrow_mut() = board;\n        self.read_color();\n    }\n\n    fn hs(&self) -> Hs {\n        self.inner().hs.get()\n    }\n\n    fn set_hs(&self, hs: Hs) {\n        let self_ = self.clone();\n        let board = self.board().unwrap().clone();\n        if self.inner().hs.replace(hs) != hs {\n            self.inner().circle.set_colors(cascade! {\n                BTreeSet::new();\n                ..insert(hs);\n            });\n            glib::MainContext::default().spawn_local(async move {\n                let index = self_.index().clone();\n                if let Err(err) = index.set_color(&board, hs).await {\n                    error!(\"Failed to set keyboard color: {}\", err);\n                }\n                self_.notify(\"hs\");\n            });\n        }\n    }\n\n    fn index(&self) -> Ref<KeyboardColorIndex> {\n        self.inner().index.borrow()\n    }\n\n    fn read_color(&self) {\n        if let Some(board) = self.board() {\n            let colors = self.index().get_color_set(&board);\n            let hs = colors\n                .iter()\n                .next()\n                .copied()\n                .unwrap_or_else(|| Hs::new(0., 0.));\n            if self.inner().hs.replace(hs) != hs {\n                self.notify(\"hs\");\n            }\n            self.inner().circle.set_colors(colors);\n        }\n    }\n\n    pub fn set_index(&self, value: KeyboardColorIndex) {\n        self.inner().index.replace(value);\n        self.read_color();\n    }\n\n    pub fn cancel_dialog(&self) {\n        if let Some(cancellable) = self.inner().dialog_cancellable.take() {\n            cancellable.cancel();\n        }\n    }\n}\n"
  },
  {
    "path": "widgets/src/lib.rs",
    "content": "#[macro_use]\nextern crate log;\n\nmod choose_color;\nmod color_circle;\nmod color_wheel;\nmod keyboard_color;\nmod localize;\nmod selected_keys;\n\npub use crate::{\n    choose_color::*, color_circle::*, color_wheel::*, keyboard_color::*, localize::*,\n    selected_keys::*,\n};\npub use backend;\nuse backend::DerefCell;\n\n#[cfg(target_os = \"linux\")]\nmod keyboard_backlight_widget;\n#[cfg(target_os = \"linux\")]\npub use keyboard_backlight_widget::keyboard_backlight_widget;\n"
  },
  {
    "path": "widgets/src/localize.rs",
    "content": "use i18n_embed::{\n    fluent::{fluent_language_loader, FluentLanguageLoader},\n    DefaultLocalizer, LanguageLoader, Localizer,\n};\nuse once_cell::sync::Lazy;\nuse rust_embed::RustEmbed;\n\n#[derive(RustEmbed)]\n#[folder = \"../i18n/\"]\nstruct Localizations;\n\npub static LANGUAGE_LOADER: Lazy<FluentLanguageLoader> = Lazy::new(|| {\n    let loader: FluentLanguageLoader = fluent_language_loader!();\n\n    loader\n        .load_fallback_language(&Localizations)\n        .expect(\"Error while loading fallback language\");\n\n    loader\n});\n\n#[macro_export]\nmacro_rules! fl {\n    ($message_id:literal) => {{\n        i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id)\n    }};\n\n    ($message_id:literal, $($args:expr),*) => {{\n        i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id, $($args), *)\n    }};\n}\n\n// Get the `Localizer` to be used for localizing this library.\npub fn localizer() -> Box<dyn Localizer> {\n    Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER, &Localizations))\n}\n"
  },
  {
    "path": "widgets/src/selected_keys.rs",
    "content": "use gtk::glib;\nuse std::collections::BTreeSet;\n\n#[derive(Clone, Default, glib::Boxed)]\n#[boxed_type(name = \"S76SelectedKeys\")]\npub struct SelectedKeys(BTreeSet<usize>);\n\nimpl SelectedKeys {\n    pub fn new() -> Self {\n        Self(BTreeSet::new())\n    }\n}\n\nimpl std::ops::Deref for SelectedKeys {\n    type Target = BTreeSet<usize>;\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\nimpl std::ops::DerefMut for SelectedKeys {\n    fn deref_mut(&mut self) -> &mut Self::Target {\n        &mut self.0\n    }\n}\n"
  },
  {
    "path": "windows/README.md",
    "content": "### Files\n- `build.py` - When invoked with mingw32 python, this builds with Rustup and generates a `.msi` with WiX.\n- `build.bat` - Wrapper to invoke `build.py` with the correct python executable.\n- `keyboard-configurator.wxs` - xml configuration for WiX to generate `.msi`.\n- `libraries.wxi` -  Generated automatically by `build.py` with a list of needed dlls. Included by `keyboard-configurator.wxs`.\n\n### Dependencies\n- [MSYS2](https://www.msys2.org/)\n- [WiX Toolset](https://wixtoolset.org/)\n\nIn msys2, run `pacman -S mingw-w64-i686-gtk3 mingw-w64-i686-rust mingw-w64-i686-toolchain mingw-w64-i686-ntldd mingw-w64-x86_64-imagemagick`.\n\n### Building\n`.\\build.bat` will build and generate a `.msi` installer.\n\n### Installation\nClick on the `.msi` in Windows explorer, or run `msiexec /i keyboard-configurator.msi`.\n\n### Uninstallation\nUninstall from *Add or Remove Programs* or with `msiexec /x keyboard-configurator.msi`.\n"
  },
  {
    "path": "windows/build.bat",
    "content": "set MSYSTEM_PREFIX=C:\\msys64\\mingw32\nC:\\msys64\\mingw32\\bin\\python build.py\n"
  },
  {
    "path": "windows/build.py",
    "content": "#!/usr/bin/env python3\n\nimport argparse\nimport os\nimport re\nimport shlex\nimport shutil\nimport subprocess\nimport sys\nimport json\nimport urllib.request\nfrom zipfile import ZipFile\n\n# Handle commandline arguments\nparser = argparse.ArgumentParser()\nparser.add_argument('--release', action='store_true')\nparser.add_argument('--sign', action='store_true')\nparser.add_argument('--cargo', default='cargo')\nparser.add_argument('--wix', default=None)\nargs = parser.parse_args()\n\nif args.wix == None:\n    # look for WiX.\n    # If there are somehow multiple versions, use newest.\n    program_files = \"C:/Program Files (x86)/\"\n    wix_dirs = sorted(i for i in os.listdir(program_files) if i.startswith(\"WiX Toolset v\"))\n    try:\n        wix_dir = program_files + wix_dirs[-1]\n    except IndexError:\n        sys.exit(\"WiX not found. Install or pass `--wix`.\")\nelse:\n    wix_dir = args.wix\n\nCARGO = shlex.split(args.cargo)\n# Executables to install\nTARGET_DIR = \"../target/\" + ('release' if args.release else 'debug')\nEXES = {\n    f\"{TARGET_DIR}/system76-keyboard-configurator.exe\",\n}\nICON = \"../data/icons/scalable/apps/com.system76.keyboardconfigurator.svg\"\n\nDLL_RE = r\"(?<==> )(.*\\\\mingw32)\\\\bin\\\\(\\S+.dll)\"\n\n# mingw32 version seems to no longer be packaged, and need to avoid unrelated\n# System32/convert\nCONVERT = os.path.dirname(os.environ['MSYSTEM_PREFIX']) + r'\\mingw64\\bin\\convert.exe'\n\nADWAITA_FILES = [\n    'index.theme',\n    'symbolic/actions/open-menu-symbolic.svg',\n    'symbolic/ui/window-close-symbolic.svg',\n    'symbolic/ui/window-maximize-symbolic.svg',\n    'symbolic/ui/window-minimize-symbolic.svg',\n    'symbolic/ui/window-restore-symbolic.svg',\n    'symbolic/actions/edit-delete-symbolic.svg',\n    'symbolic/actions/go-previous-symbolic.svg',\n    'symbolic/actions/list-remove-symbolic.svg',\n    'symbolic/actions/list-add-symbolic.svg',\n    'symbolic/actions/edit-find-symbolic.svg',\n]\nADWAITA_FILES = [f'share/icons/Adwaita/{i}' for i in ADWAITA_FILES]\nADDITIONAL_FILES = ['share/glib-2.0/schemas/org.gtk.Settings.FileChooser.gschema.xml', 'share/icons/hicolor/index.theme', 'lib/gdk-pixbuf-2.0'] + ADWAITA_FILES\n\n# Use ntldd to find the mingw dlls required by a .exe\ndef find_depends(exe):\n    if not os.path.exists(exe):\n        sys.exit(f\"'{exe}' does not exist\")\n    output = subprocess.check_output(['ntldd.exe', '-R', exe], universal_newlines=True)\n    dlls = set()\n    mingw_dir = None\n    for l in output.splitlines():\n        m = re.search(DLL_RE, l, re.IGNORECASE)\n        if m:\n            dlls.add((m.group(0), m.group(2)))\n            mingw_dir = m.group(1)\n    return mingw_dir, dlls\n\ndef check_call(args, **kwargs):\n    # NOTE: Important not to print all args, for `CodeSignTool` invocation\n    print(f\"RUN {args[0]}\")\n    try:\n        subprocess.check_call(args, **kwargs)\n    except subprocess.CalledProcessError as e:\n        sys.exit(f\"ERROR: {args[0]} failed with code {e.returncode}\")\n\n# Build application with rustup\ncmd = CARGO + ['build']\nif args.release:\n    cmd.append('--release')\ncheck_call(cmd)\n\n# Generate set of all required dlls\ndlls = set()\nmingw_dir = None\nfor i in EXES:\n    mingw_dir_new, dlls_new = find_depends(i)\n    dlls = dlls.union(dlls_new)\n    mingw_dir = mingw_dir or mingw_dir_new\n\n# The svg module is loaded at runtime, so it's dependencies are also needed\ndlls = dlls.union(find_depends(f\"{mingw_dir}/lib/gdk-pixbuf-2.0/2.10.0/loaders/pixbufloader_svg.dll\")[1])\n\ndef copy(srcdir, destdir, path):\n    src = f\"{srcdir}/{path}\"\n    dest = f\"{destdir}/{path}\"\n    os.makedirs(os.path.dirname(dest), exist_ok=True)\n    print(f\"Copy {src} -> {dest}\")\n    if os.path.isdir(src):\n        shutil.copytree(src, dest)\n    else:\n        shutil.copy(src, dest)\n\ndef strip(srcdir, destdir, path):\n    src = f\"{srcdir}/{path}\"\n    dest = f\"{destdir}/{path}\"\n    os.makedirs(os.path.dirname(dest), exist_ok=True)\n    print(f\"Strip {src} -> {dest}\")\n    check_call([f\"strip.exe\", '-o', dest, src])\n\n# Copy executables and libraries\nif os.path.exists('out'):\n    shutil.rmtree('out')\nfor i in EXES:\n    strip(os.path.dirname(i), 'out', os.path.basename(i))\nfor src, filename in dlls:\n    copy(os.path.dirname(src), 'out', filename)\n\n# This shouldn't be necessary\n# https://github.com/pop-os/keyboard-configurator/issues/39\ncopy('../data/icons', 'out/share/icons/Adwaita', 'scalable')\n\n# Copy additional data\nfor i in ADDITIONAL_FILES:\n    copy(mingw_dir, 'out', i)\ncheck_call([\"glib-compile-schemas\", \"out/share/glib-2.0/schemas\"])\n\n# Extract crate version from cargo\nmeta_str = subprocess.check_output(CARGO + [\"metadata\", \"--format-version\", \"1\", \"--no-deps\"])\nmeta = json.loads(meta_str)\npackage = next(i for i in meta['packages'] if i['name'] == 'system76-keyboard-configurator')\ncrate_version = package['version']\n\n# Generate Icon and installer banner\ncheck_call([\"rsvg-convert\", \"--width\", \"256\", \"--height\", \"256\", \"-o\", \"keyboard-configurator.png\", ICON])\ncheck_call([CONVERT, \"keyboard-configurator.png\", \"out/keyboard-configurator.ico\"])\ncheck_call([\"rsvg-convert\", \"--width\", \"493\", \"--height\", \"58\", \"-o\", \"banner.png\", \"banner.svg\"])\ncheck_call([CONVERT, \"banner.png\", \"banner.bmp\"])\ncheck_call([\"rsvg-convert\", \"--width\", \"493\", \"--height\", \"312\", \"-o\", \"dialog.png\", \"dialog.svg\"])\ncheck_call([CONVERT, \"dialog.png\", \"dialog.bmp\"])\n\n# Generate libraries.wxi\nwith open('libraries.wxi', 'w') as f:\n    f.write(\"<!-- Generated by build.py -->\\n\")\n    f.write('<Include>\\n')\n\n    def add_files(dirpath, indent):\n        id_ = os.path.relpath(dirpath, 'out').replace('\\\\', '_').replace('/', '_').replace('-', '_').replace('.', '_')\n        f.write(f\"{indent}<Directory Id='{id_}' Name='{os.path.basename(dirpath)}'>\\n\")\n        for i in os.scandir(dirpath):\n            if i.is_dir():\n                add_files(i.path, indent + ' ' * 4)\n            else:\n                id_ = i.path.replace('\\\\', '_').replace('-', '_').replace('.', '_')\n                f.write(f\"{indent}<Component Feature='Complete' Guid='*'>\\n\")\n                f.write(f\"{indent}    <File Id='{id_}' Name='{i.name}' Source='{i.path}' />\\n\")\n                f.write(f\"{indent}</Component>\\n\")\n        f.write(f\"{indent}</Directory>\\n\")\n\n    for i in ['lib', 'share']:\n        add_files(f\"out\\\\{i}\", ' ' * 4)\n\n    for _, i in dlls:\n        f.write(f\"    <Component Feature='Complete' Guid='*'>\\n\")\n        f.write(f\"        <File Name='{i}' Source='out/{i}' />\\n\")\n        f.write(f\"    </Component>\\n\")\n\n    f.write('</Include>\\n')\n\n# Build .msi\ncheck_call([f\"{wix_dir}/bin/candle.exe\", \".\\keyboard-configurator.wxs\", f\"-dcrate_version={crate_version}\"])\ncheck_call([f\"{wix_dir}/bin/light.exe\", \"-ext\", \"WixUIExtension\", \".\\keyboard-configurator.wixobj\"])\n\nif args.sign:\n    if not os.path.isdir('sign'):\n        os.mkdir(\"sign\")\n\n    # Download signing tool\n    tool_url = \"https://www.ssl.com/download/codesigntool-for-windows\"\n    tool_zip = \"sign/CodeSignTool.zip\"\n    if not os.path.isfile(tool_zip):\n        if os.path.isfile(tool_zip + \".partial\"):\n            os.remove(tool_zip + \".partial\")\n        urllib.request.urlretrieve(tool_url, tool_zip + \".partial\")\n        os.rename(tool_zip + \".partial\", tool_zip)\n\n    # Extract signing tool\n    tool_dir = \"sign/CodeSignTool\"\n    if not os.path.isdir(tool_dir):\n        if os.path.isdir(tool_dir + \".partial\"):\n            shutil.rmtree(tool_dir + \".partial\")\n        os.mkdir(tool_dir + \".partial\")\n        with ZipFile(tool_zip, \"r\") as zip:\n            zip.extractall(tool_dir + \".partial\")\n        os.rename(tool_dir + \".partial\", tool_dir)\n\n    # Sign with specified cloud signing key\n    check_call([\n        \"cmd\", \"/c\", \"CodeSignTool.bat\",\n        \"sign\",\n        \"-credential_id=\" + os.environ[\"SSL_COM_CREDENTIAL_ID\"],\n        \"-username=\" + os.environ[\"SSL_COM_USERNAME\"],\n        \"-password=\" + os.environ[\"SSL_COM_PASSWORD\"],\n        \"-totp_secret=\" + os.environ[\"SSL_COM_TOTP_SECRET\"],\n        \"-program_name=System76 Keyboard Configurator\",\n        \"-input_file_path=../../keyboard-configurator.msi\",\n        \"-output_dir_path=../\",\n    ], cwd=\"sign/CodeSignTool\")\n\n    # Update MSI\n    os.remove(\"keyboard-configurator.msi\")\n    os.rename(\"sign/keyboard-configurator.msi\", \"keyboard-configurator.msi\")\n"
  },
  {
    "path": "windows/gpl.rtf",
    "content": "{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0 \\fswiss Helvetica;}{\\f1 Courier;}}\n{\\colortbl;\\red255\\green0\\blue0;\\red0\\green0\\blue255;}\n\\widowctrl\\hyphauto\n\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs28 GNU GENERAL PUBLIC LICENSE\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Version 3, 29 June 2007\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Copyright \\u169? 2007 Free Software Foundation, Inc. <{\\field{\\*\\fldinst{HYPERLINK \"https://fsf.org/\"}}{\\fldrslt{\\ul\nhttps://fsf.org/\n}}}\n>\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs28 Preamble\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The GNU General Public License is a free, copyleft license for software and other kinds of works.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The precise terms and conditions for copying, distribution and modification follow.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs28 TERMS AND CONDITIONS\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 0. Definitions.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\u8220\"This License\\u8221\" refers to version 3 of the GNU General Public License.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\u8220\"Copyright\\u8221\" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\u8220\"The Program\\u8221\" refers to any copyrightable work licensed under this License. Each licensee is addressed as \\u8220\"you\\u8221\". \\u8220\"Licensees\\u8221\" and \\u8220\"recipients\\u8221\" may be individuals or organizations.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 To \\u8220\"modify\\u8221\" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a \\u8220\"modified version\\u8221\" of the earlier work or a work \\u8220\"based on\\u8221\" the earlier work.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A \\u8220\"covered work\\u8221\" means either the unmodified Program or a work based on the Program.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 To \\u8220\"propagate\\u8221\" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 To \\u8220\"convey\\u8221\" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 An interactive user interface displays \\u8220\"Appropriate Legal Notices\\u8221\" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 1. Source Code.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The \\u8220\"source code\\u8221\" for a work means the preferred form of the work for making modifications to it. \\u8220\"Object code\\u8221\" means any non-source form of a work.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A \\u8220\"Standard Interface\\u8221\" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The \\u8220\"System Libraries\\u8221\" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A \\u8220\"Major Component\\u8221\", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The \\u8220\"Corresponding Source\\u8221\" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The Corresponding Source for a work in source code form is that same work.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 2. Basic Permissions.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 3. Protecting Users' Legal Rights From Anti-Circumvention Law.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 4. Conveying Verbatim Copies.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 5. Conveying Modified Source Versions.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab a) The work must carry prominent notices stating that you modified it, and giving a relevant date.\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to \\u8220\"keep intact all notices\\u8221\".\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.\\sa180\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an \\u8220\"aggregate\\u8221\" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 6. Conveying Non-Source Forms.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.\\sa180\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A \\u8220\"User Product\\u8221\" is either (1) a \\u8220\"consumer product\\u8221\", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, \\u8220\"normally used\\u8221\" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\u8220\"Installation Information\\u8221\" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 7. Additional Terms.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\u8220\"Additional permissions\\u8221\" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab d) Limiting the use for publicity purposes of names of licensors or authors of the material; or\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.\\sa180\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 All other non-permissive additional terms are considered \\u8220\"further restrictions\\u8221\" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 8. Termination.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 9. Acceptance Not Required for Having Copies.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 10. Automatic Licensing of Downstream Recipients.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 An \\u8220\"entity transaction\\u8221\" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 11. Patents.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A \\u8220\"contributor\\u8221\" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's \\u8220\"contributor version\\u8221\".\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A contributor's \\u8220\"essential patent claims\\u8221\" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, \\u8220\"control\\u8221\" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 In the following three paragraphs, a \\u8220\"patent license\\u8221\" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To \\u8220\"grant\\u8221\" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. \\u8220\"Knowingly relying\\u8221\" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A patent license is \\u8220\"discriminatory\\u8221\" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 12. No Surrender of Others' Freedom.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 13. Use with the GNU Affero General Public License.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 14. Revised Versions of this License.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License \\u8220\"or any later version\\u8221\" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 15. Disclaimer of Warranty.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \\u8220\"AS IS\\u8221\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 16. Limitation of Liability.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 17. Interpretation of Sections 15 and 16.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 END OF TERMS AND CONDITIONS\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs28 How to Apply These Terms to Your New Programs\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the \\u8220\"copyright\\u8221\" line and a pointer to where the full notice is found.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\f1     <one line to give the program's name and a brief idea of what it does.>\\line\n    Copyright (C) <year>  <name of author>\\line\n\\line\n    This program is free software: you can redistribute it and/or modify\\line\n    it under the terms of the GNU General Public License as published by\\line\n    the Free Software Foundation, either version 3 of the License, or\\line\n    (at your option) any later version.\\line\n\\line\n    This program is distributed in the hope that it will be useful,\\line\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\\line\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\line\n    GNU General Public License for more details.\\line\n\\line\n    You should have received a copy of the GNU General Public License\\line\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Also add information on how to contact you by electronic and paper mail.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\f1     <program>  Copyright (C) <year>  <name of author>\\line\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\\line\n    This is free software, and you are welcome to redistribute it\\line\n    under certain conditions; type `show c' for details.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an \\u8220\"about box\\u8221\".\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You should also get your employer (if you work as a programmer) or school, if any, to sign a \\u8220\"copyright disclaimer\\u8221\" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <{\\field{\\*\\fldinst{HYPERLINK \"https://www.gnu.org/licenses/\"}}{\\fldrslt{\\ul\nhttps://www.gnu.org/licenses/\n}}}\n>.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <{\\field{\\*\\fldinst{HYPERLINK \"https://www.gnu.org/licenses/why-not-lgpl.html\"}}{\\fldrslt{\\ul\nhttps://www.gnu.org/licenses/why-not-lgpl.html\n}}}\n>.\\par}\n}\n"
  },
  {
    "path": "windows/keyboard-configurator.wxs",
    "content": "<?xml version='1.0' encoding='utf-8'?>\n<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>\n    <Product\n        Name='System76 Keyboard Configurator'\n        Manufacturer='System76, Inc.'\n        Id='*'\n        UpgradeCode='548e3064-0ff9-421a-91dc-1f1bd0afe9b6'\n        Language='1033'\n        Codepage='1252'\n        Version='$(var.crate_version)'\n            >\n\n        <!-- Comments='' -->\n        <Package\n            Id='*'\n            Keywords='Installer'\n            Description=\"System76 Keyboard Configurator $(var.crate_version) Installer\"\n            Manufacturer='System76, Inc.'\n            InstallerVersion='100'\n            Languages='1033'\n            Compressed='yes'\n            SummaryCodepage='1252'\n            InstallScope='perMachine'\n            />\n\n        <Media Id='1' Cabinet='KeyboardConfigurator.cab' EmbedCab='yes' CompressionLevel='high' />\n\n        <Icon Id=\"keyboard_configurator.ico\" SourceFile=\"out/keyboard-configurator.ico\"/>\n        <Property Id=\"ARPPRODUCTICON\" Value=\"keyboard_configurator.ico\" />\n\n        <Directory Id='TARGETDIR' Name='SourceDir'>\n            <Directory Id='ProgramFilesFolder' Name='PFiles'>\n                <Directory Id='System76' Name='System76'>\n                    <Directory Id='INSTALLDIR' Name='Keyboard Configurator'>\n                        <Component Id='MainExecutable' Feature='Complete' Guid='*'>\n                            <File Name='system76-keyboard-configurator.exe' Source='out/system76-keyboard-configurator.exe' KeyPath='yes'>\n                                <Shortcut Id=\"KeyboardConfiguratorShortcut\" Directory=\"ProgramMenuDir\" Name=\"System76 Keyboard Configurator\"\n                                    WorkingDirectory='INSTALLDIR' Advertise=\"yes\" Icon='keyboard_configurator.ico' />\n                            </File>\n                        </Component>\n                        <?include libraries.wxi ?>\n                    </Directory>\n                </Directory>\n            </Directory>\n\n            <Directory Id=\"ProgramMenuFolder\" Name=\"Programs\">\n                <Directory Id=\"ProgramMenuDir\" Name=\"System76 Keyboard Configurator\">\n                    <Component Id=\"ProgramMenuDir\" Feature=\"Complete\" Guid=\"*\">\n                        <RemoveFolder Id='ProgramMenuDir' On='uninstall' />\n                        <RegistryValue Root='HKCU' Key='Software\\[Manufacturer]\\[ProductName]' Type='string' Value='' KeyPath='yes' />\n                    </Component>\n                </Directory>\n            </Directory>\n        </Directory>\n\n        <Feature Id='Complete' Level='1' />\n\n        <WixVariable Id=\"WixUILicenseRtf\" Value=\"gpl.rtf\" />\n        <WixVariable Id=\"WixUIBannerBmp\" Value=\"banner.bmp\" />\n        <WixVariable Id=\"WixUIDialogBmp\" Value=\"dialog.bmp\" />\n\n        <UIRef Id=\"WixUI_Minimal\" />\n        <UIRef Id=\"WixUI_ErrorProgressText\" />\n\n        <MajorUpgrade DowngradeErrorMessage=\"A later version of [ProductName] is already installed. Setup will now exit.\"\n                      AllowSameVersionUpgrades=\"yes\" />\n    </Product>\n</Wix>\n"
  }
]