summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--etc/portage/binrepos.conf/gentoobinhost.conf7
-rw-r--r--etc/portage/env/debug.conf3
-rw-r--r--etc/portage/env/forcegxx.conf4
-rw-r--r--etc/portage/env/nolto.conf6
-rw-r--r--etc/portage/env/nvcc.conf4
-rw-r--r--etc/portage/env/sys-apps/systemd1
-rw-r--r--etc/portage/make.conf30
l---------etc/portage/make.profile1
-rw-r--r--etc/portage/package.accept_keywords/ghostty1
-rw-r--r--etc/portage/package.accept_keywords/howdy2
-rw-r--r--etc/portage/package.accept_keywords/hyprland17
-rw-r--r--etc/portage/package.accept_keywords/input-leap1
-rw-r--r--etc/portage/package.accept_keywords/numpy1
-rw-r--r--etc/portage/package.accept_keywords/ollama1
-rw-r--r--etc/portage/package.accept_keywords/waybar1
-rw-r--r--etc/portage/package.env/dlib-cuda1
-rw-r--r--etc/portage/package.env/gpsd1
-rw-r--r--etc/portage/package.env/qtconnectivity1
-rw-r--r--etc/portage/package.env/rofi-emoji1
-rw-r--r--etc/portage/package.mask/numpy-howdy1
-rw-r--r--etc/portage/package.use/00cpu-flags1
-rw-r--r--etc/portage/package.use/00video_cards5
-rw-r--r--etc/portage/package.use/compiler-rt-sanitizers2
-rw-r--r--etc/portage/package.use/curl1
-rw-r--r--etc/portage/package.use/dracut1
-rw-r--r--etc/portage/package.use/howdy3
-rw-r--r--etc/portage/package.use/input-leap3
-rw-r--r--etc/portage/package.use/installkernel1
-rw-r--r--etc/portage/package.use/latex2
-rw-r--r--etc/portage/package.use/networkmanager1
-rw-r--r--etc/portage/package.use/nodejs1
-rw-r--r--etc/portage/package.use/spotify-adblock5
-rw-r--r--etc/portage/package.use/swaync3
-rw-r--r--etc/portage/package.use/systemd2
-rw-r--r--etc/portage/patches/app-misc/cliphist/124.patch82
-rw-r--r--etc/portage/patches/dev-libs/hyprland-protocols/8.patch472
-rw-r--r--etc/portage/patches/gui-libs/libadwaita/theming_patch.diff74
-rw-r--r--etc/portage/patches/gui-libs/xdg-desktop-portal-hyprland/268.patch3843
-rw-r--r--etc/portage/patches/gui-wm/hyprland/7919.patch368
-rw-r--r--etc/portage/patches/sys-apps/portage/compressdebug-zstd.patch11
l---------etc/portage/postsync.d/50-eix-postsync1
-rw-r--r--etc/portage/repos.conf/eselect-repo.conf59
-rw-r--r--etc/portage/repos.conf/eselect-repo.conf~62
-rw-r--r--etc/portage/savedconfig/sys-kernel/linux-firmware-20250109-r14362
-rw-r--r--etc/portage/smart-live-rebuild.conf3
45 files changed, 9453 insertions, 0 deletions
diff --git a/etc/portage/binrepos.conf/gentoobinhost.conf b/etc/portage/binrepos.conf/gentoobinhost.conf
new file mode 100644
index 00000000..1d3b735a
--- /dev/null
+++ b/etc/portage/binrepos.conf/gentoobinhost.conf
@@ -0,0 +1,7 @@
+# These settings were set by the catalyst build script that automatically
+# built this stage.
+# Please consider using a local mirror.
+
+[gentoobinhost]
+priority = 1
+sync-uri = https://distfiles.gentoo.org/releases/amd64/binpackages/23.0/x86-64
diff --git a/etc/portage/env/debug.conf b/etc/portage/env/debug.conf
new file mode 100644
index 00000000..57a97496
--- /dev/null
+++ b/etc/portage/env/debug.conf
@@ -0,0 +1,3 @@
+CFLAGS="${CFLAGS} -ggdb3"
+CXXFLAGS="${CXXFLAGS} -ggdb3"
+FEATURES="nostrip"
diff --git a/etc/portage/env/forcegxx.conf b/etc/portage/env/forcegxx.conf
new file mode 100644
index 00000000..ca699306
--- /dev/null
+++ b/etc/portage/env/forcegxx.conf
@@ -0,0 +1,4 @@
+export CC="/usr/bin/gcc"
+export CXX="/usr/bin/g++"
+
+
diff --git a/etc/portage/env/nolto.conf b/etc/portage/env/nolto.conf
new file mode 100644
index 00000000..c0133784
--- /dev/null
+++ b/etc/portage/env/nolto.conf
@@ -0,0 +1,6 @@
+BIGLITTLE="-march=alderlake -mabm -mno-cldemote -mno-kl -mno-sgx -mno-widekl -mshstk --param=l1-cache-line-size=64 --param=l1-cache-size=48 --param=l2-cache-size=33792"
+COMMON_FLAGS="${BIGLITTLE} -mtune=native -fipa-pta -feliminate-unused-debug-types -fno-omit-frame-pointer -fno-semantic-interposition -O3 -pipe"
+CFLAGS="${COMMON_FLAGS}"
+CXXFLAGS="${COMMON_FLAGS}"
+FCFLAGS="${COMMON_FLAGS}"
+FFLAGS="${COMMON_FLAGS}"
diff --git a/etc/portage/env/nvcc.conf b/etc/portage/env/nvcc.conf
new file mode 100644
index 00000000..5fb5db68
--- /dev/null
+++ b/etc/portage/env/nvcc.conf
@@ -0,0 +1,4 @@
+export CC="/usr/x86_64-pc-linux-gnu/gcc-bin/13/gcc"
+export CXX="/usr/x86_64-pc-linux-gnu/gcc-bin/13/g++"
+
+
diff --git a/etc/portage/env/sys-apps/systemd b/etc/portage/env/sys-apps/systemd
new file mode 100644
index 00000000..0176684e
--- /dev/null
+++ b/etc/portage/env/sys-apps/systemd
@@ -0,0 +1 @@
+MYMESONARGS="-Ddefault-compression=zstd"
diff --git a/etc/portage/make.conf b/etc/portage/make.conf
new file mode 100644
index 00000000..c994438d
--- /dev/null
+++ b/etc/portage/make.conf
@@ -0,0 +1,30 @@
+FLTO="-flto -fdevirtualize-at-ltrans -fno-plt -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing"
+BIGLITTLE="-march=alderlake -mabm -mno-cldemote -mno-kl -mno-sgx -mno-widekl -mshstk --param=l1-cache-line-size=64 --param=l1-cache-size=48 --param=l2-cache-size=33792"
+UNHARDEN="-fno-stack-clash-protection -fno-stack-protector -fcf-protection=none"
+COMMON_FLAGS="${BIGLITTLE} -mtune=native -fipa-pta -feliminate-unused-debug-types -fno-omit-frame-pointer -fno-semantic-interposition -O3 -pipe ${UNHARDEN} ${FLTO}"
+CFLAGS="${COMMON_FLAGS}"
+LDFLAGS="-Wl,-O3 -Wl,-z,norelro -Wl,-z,common -Wl,--gc-sections"
+CXXFLAGS="${COMMON_FLAGS}"
+FCFLAGS="${COMMON_FLAGS}"
+FFLAGS="${COMMON_FLAGS}"
+RUSTFLAGS="-C target-cpu=native -C strip=debuginfo -C opt-level=3"
+MAKEOPTS="-j28 -l28"
+FEATURES="parallel-fetch parallel-install clean-logs"
+ACCEPT_LICENSE="*"
+ACCEPT_KEYWORDS="~amd64"
+ABI_X86="64 32"
+EMERGE_DEFAULT_OPTS="--jobs=28 --load-average=28 --keep-going --with-bdeps=y --complete-graph=y --deep"
+L10N="en en-US zh_CN zh_HK"
+LC_MESSAGES=C.utf8
+VIDEO_CARDS="nvidia"
+CLEAN_DELAY=0
+
+USECODEC="a52 aac aalib avif cairo dts dv encode exif flac gif heif jpeg jpeg2k jpegxl ladspa lame libass libcaca libsamplerate matroska mp3 mp4 mpeg ogg openal opus raw svg svga svt-av1 theora tiff v4l vorbis webp x264 x265 dec265 enc265 mpg123"
+USESYS="systemd boot caps compositor dbus dracut evdev initramfs multilib networkmanager pipewire pulseaudio alsa udev uefi wayland gpg gbm zstd policykit journald split-ucode sound acl kmod tmpfiles lvm network wifi gnutls"
+USECOMMON="acpi zsh-completion curl man ffmpeg harfbuzz inotify sasl sdl tools extra utils *git python native-symlinks system-png system-python-libs system-libevent system-librnp system-ssl system-boost cups cuda nvenc nvdec contrib"
+USEFONTS="ttf truetype fontforge fontconfig terminus sourcecodepro spacemono robotomono noto iosevka hack firacode table unicode pango"
+USEUSERSPACE="modern gstreamer qt6 client daemon sync sound-server geolocation geoclue screencast libnotify -adwaita mpris tray gps gpsd"
+USEGFX="gpu drm libdrm nvenv nvidia opengl text opencl vaapi vdpau vulkan egl gles gles2 gles3 video_cards_nvidia"
+USEOPTIMIZE="asm cxx lto-cet pgo jit xs orc tbb threads ithreads openmp smp sockets strip"
+USEOMIT="-telepathy -telemetry"
+USE="${USESYS} ${USECOMMON} ${USEGFX} ${USEUSERSPACE} ${USECODEC} ${USEFONTS} ${USEOPTIMIZE} ${USEOMIT}"
diff --git a/etc/portage/make.profile b/etc/portage/make.profile
new file mode 120000
index 00000000..55fe09af
--- /dev/null
+++ b/etc/portage/make.profile
@@ -0,0 +1 @@
+../../var/db/repos/gentoo/profiles/default/linux/amd64/23.0/desktop/systemd \ No newline at end of file
diff --git a/etc/portage/package.accept_keywords/ghostty b/etc/portage/package.accept_keywords/ghostty
new file mode 100644
index 00000000..ad878336
--- /dev/null
+++ b/etc/portage/package.accept_keywords/ghostty
@@ -0,0 +1 @@
+x11-terms/ghostty **
diff --git a/etc/portage/package.accept_keywords/howdy b/etc/portage/package.accept_keywords/howdy
new file mode 100644
index 00000000..d7ab747b
--- /dev/null
+++ b/etc/portage/package.accept_keywords/howdy
@@ -0,0 +1,2 @@
+sys-auth/howdy **
+sys-auth/howdy-models **
diff --git a/etc/portage/package.accept_keywords/hyprland b/etc/portage/package.accept_keywords/hyprland
new file mode 100644
index 00000000..71fc670c
--- /dev/null
+++ b/etc/portage/package.accept_keywords/hyprland
@@ -0,0 +1,17 @@
+dev-util/hyprwayland-scanner **
+gui-libs/hyprutils **
+dev-libs/hyprlang **
+dev-libs/hyprland-protocols **
+dev-libs/glaze **
+gui-libs/aquamarine **
+gui-libs/hyprcursor **
+gui-wm/hyprland **
+gui-libs/xdg-desktop-portal-hyprland **
+gui-libs/hyprland-qtutils **
+gui-apps/hyprsunset **
+gui-apps/hypridle **
+gui-apps/hyprlock **
+gui-wm/hyprland-contrib **
+gui-apps/hyprland-addons **
+gui-libs/hyprgraphics **
+dev-libs/hyprgraphics **
diff --git a/etc/portage/package.accept_keywords/input-leap b/etc/portage/package.accept_keywords/input-leap
new file mode 100644
index 00000000..f413a4dc
--- /dev/null
+++ b/etc/portage/package.accept_keywords/input-leap
@@ -0,0 +1 @@
+x11-misc/input-leap **
diff --git a/etc/portage/package.accept_keywords/numpy b/etc/portage/package.accept_keywords/numpy
new file mode 100644
index 00000000..69bdc35f
--- /dev/null
+++ b/etc/portage/package.accept_keywords/numpy
@@ -0,0 +1 @@
+dev-python/numpy 1.26.4
diff --git a/etc/portage/package.accept_keywords/ollama b/etc/portage/package.accept_keywords/ollama
new file mode 100644
index 00000000..5148358f
--- /dev/null
+++ b/etc/portage/package.accept_keywords/ollama
@@ -0,0 +1 @@
+app-misc/ollama **
diff --git a/etc/portage/package.accept_keywords/waybar b/etc/portage/package.accept_keywords/waybar
new file mode 100644
index 00000000..c5bc3890
--- /dev/null
+++ b/etc/portage/package.accept_keywords/waybar
@@ -0,0 +1 @@
+gui-apps/waybar **
diff --git a/etc/portage/package.env/dlib-cuda b/etc/portage/package.env/dlib-cuda
new file mode 100644
index 00000000..1c1cf400
--- /dev/null
+++ b/etc/portage/package.env/dlib-cuda
@@ -0,0 +1 @@
+sci-libs/dlib nvcc.conf nolto.conf
diff --git a/etc/portage/package.env/gpsd b/etc/portage/package.env/gpsd
new file mode 100644
index 00000000..989cb07b
--- /dev/null
+++ b/etc/portage/package.env/gpsd
@@ -0,0 +1 @@
+sci-geosciences/gpsd nolto.conf
diff --git a/etc/portage/package.env/qtconnectivity b/etc/portage/package.env/qtconnectivity
new file mode 100644
index 00000000..0f42f5bd
--- /dev/null
+++ b/etc/portage/package.env/qtconnectivity
@@ -0,0 +1 @@
+dev-qt/qtconnectivity nolto.conf
diff --git a/etc/portage/package.env/rofi-emoji b/etc/portage/package.env/rofi-emoji
new file mode 100644
index 00000000..e40f6d39
--- /dev/null
+++ b/etc/portage/package.env/rofi-emoji
@@ -0,0 +1 @@
+x11-misc/rofi-emoji forcegxx.conf
diff --git a/etc/portage/package.mask/numpy-howdy b/etc/portage/package.mask/numpy-howdy
new file mode 100644
index 00000000..e71dee2d
--- /dev/null
+++ b/etc/portage/package.mask/numpy-howdy
@@ -0,0 +1 @@
+>dev-python/numpy-1.26.4
diff --git a/etc/portage/package.use/00cpu-flags b/etc/portage/package.use/00cpu-flags
new file mode 100644
index 00000000..4ac6c07e
--- /dev/null
+++ b/etc/portage/package.use/00cpu-flags
@@ -0,0 +1 @@
+*/* CPU_FLAGS_X86: aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt rdrand sha sse sse2 sse3 sse4_1 sse4_2 ssse3 vpclmulqdq
diff --git a/etc/portage/package.use/00video_cards b/etc/portage/package.use/00video_cards
new file mode 100644
index 00000000..3ecee2dc
--- /dev/null
+++ b/etc/portage/package.use/00video_cards
@@ -0,0 +1,5 @@
+*/* VIDEO_CARDS: nvidia
+>=x11-libs/libdrm-2.4.124 video_cards_nouveau video_cards_radeon video_cards_amdgpu
+# required by dev-python/pycuda-2024.1::gentoo[-test]
+# required by pycuda (argument)
+>=dev-util/nvidia-cuda-toolkit-12.6.1 profiler
diff --git a/etc/portage/package.use/compiler-rt-sanitizers b/etc/portage/package.use/compiler-rt-sanitizers
new file mode 100644
index 00000000..f7342a46
--- /dev/null
+++ b/etc/portage/package.use/compiler-rt-sanitizers
@@ -0,0 +1,2 @@
+# move sys-libs/compiler-rt-sanitizers llvm-runtimes/compiler-rt-sanitizers
+llvm-runtimes/compiler-rt-sanitizers profile orc
diff --git a/etc/portage/package.use/curl b/etc/portage/package.use/curl
new file mode 100644
index 00000000..e273ad0f
--- /dev/null
+++ b/etc/portage/package.use/curl
@@ -0,0 +1 @@
+net-misc/curl -gnutls
diff --git a/etc/portage/package.use/dracut b/etc/portage/package.use/dracut
new file mode 100644
index 00000000..be2fd13b
--- /dev/null
+++ b/etc/portage/package.use/dracut
@@ -0,0 +1 @@
+sys-kernel/dracut dracut-cpio
diff --git a/etc/portage/package.use/howdy b/etc/portage/package.use/howdy
new file mode 100644
index 00000000..fbd7ab95
--- /dev/null
+++ b/etc/portage/package.use/howdy
@@ -0,0 +1,3 @@
+# required by sys-auth/howdy-9999::kcning
+# required by howdy (argument)
+>=media-libs/opencv-4.10.0 v4l -gtk3 qt6
diff --git a/etc/portage/package.use/input-leap b/etc/portage/package.use/input-leap
new file mode 100644
index 00000000..c46f6236
--- /dev/null
+++ b/etc/portage/package.use/input-leap
@@ -0,0 +1,3 @@
+# required by x11-misc/input-leap-9999::guru[gui]
+# required by input-leap (argument)
+>=net-dns/avahi-0.9_rc2 mdnsresponder-compat
diff --git a/etc/portage/package.use/installkernel b/etc/portage/package.use/installkernel
new file mode 100644
index 00000000..9057a1bc
--- /dev/null
+++ b/etc/portage/package.use/installkernel
@@ -0,0 +1 @@
+sys-kernel/installkernel systemd systemd-boot dracut
diff --git a/etc/portage/package.use/latex b/etc/portage/package.use/latex
new file mode 100644
index 00000000..a6788668
--- /dev/null
+++ b/etc/portage/package.use/latex
@@ -0,0 +1,2 @@
+app-text/texlive cjk xetex
+app-text/texlive-core cjk xetex
diff --git a/etc/portage/package.use/networkmanager b/etc/portage/package.use/networkmanager
new file mode 100644
index 00000000..3deb94af
--- /dev/null
+++ b/etc/portage/package.use/networkmanager
@@ -0,0 +1 @@
+net-misc/networkmanager -nss
diff --git a/etc/portage/package.use/nodejs b/etc/portage/package.use/nodejs
new file mode 100644
index 00000000..a90c1674
--- /dev/null
+++ b/etc/portage/package.use/nodejs
@@ -0,0 +1 @@
+net-libs/nodejs npm
diff --git a/etc/portage/package.use/spotify-adblock b/etc/portage/package.use/spotify-adblock
new file mode 100644
index 00000000..68fa223b
--- /dev/null
+++ b/etc/portage/package.use/spotify-adblock
@@ -0,0 +1,5 @@
+# required by dev-libs/libayatana-appindicator-0.5.93::gentoo
+# required by media-sound/spotify-1.2.52::gentoo
+# required by media-sound/spotify-adblock-1.0.3::guru
+# required by spotify-adblock (argument)
+>=dev-libs/libdbusmenu-16.04.0-r2 gtk3
diff --git a/etc/portage/package.use/swaync b/etc/portage/package.use/swaync
new file mode 100644
index 00000000..e615b73c
--- /dev/null
+++ b/etc/portage/package.use/swaync
@@ -0,0 +1,3 @@
+# required by gui-apps/swaync-0.10.1-r1::guru
+# required by swaync (argument)
+>=gui-libs/gtk-layer-shell-0.9.0 vala introspection
diff --git a/etc/portage/package.use/systemd b/etc/portage/package.use/systemd
new file mode 100644
index 00000000..20400dc4
--- /dev/null
+++ b/etc/portage/package.use/systemd
@@ -0,0 +1,2 @@
+sys-apps/systemd boot
+sys-kernel/installkernel systemd-boot
diff --git a/etc/portage/patches/app-misc/cliphist/124.patch b/etc/portage/patches/app-misc/cliphist/124.patch
new file mode 100644
index 00000000..7c803671
--- /dev/null
+++ b/etc/portage/patches/app-misc/cliphist/124.patch
@@ -0,0 +1,82 @@
+From 3e5f26db8f7962dc2afe9c2e034a048959fd156b Mon Sep 17 00:00:00 2001
+From: Khing <53417443+kRHYME7@users.noreply.github.com>
+Date: Thu, 24 Oct 2024 09:49:41 +0000
+Subject: [PATCH] Added image delimter and image path
+
+---
+ cliphist.go | 38 +++++++++++++++++++++++++++++++++++---
+ 1 file changed, 35 insertions(+), 3 deletions(-)
+
+diff --git a/cliphist.go b/cliphist.go
+index 8d4d6c0..2db3183 100644
+--- a/cliphist.go
++++ b/cliphist.go
+@@ -57,6 +57,8 @@ func main() {
+ previewWidth := flag.Uint("preview-width", 100, "maximum number of characters to preview")
+ dbPath := flag.String("db-path", filepath.Join(cacheHome, "cliphist", "db"), "path to db")
+ configPath := flag.String("config-path", filepath.Join(configHome, "cliphist", "config"), "overwrite config path to use instead of cli flags")
++ imgDelim := flag.String("image", "''", "list image data to path")
++ tempDir := flag.String("image-path", filepath.Join(os.Getenv("XDG_RUNTIME_DIR")), "path to store images")
+
+ flag.Parse()
+ flagconf.ParseEnv()
+@@ -72,7 +74,7 @@ func main() {
+ err = store(*dbPath, os.Stdin, *maxDedupeSearch, *maxItems)
+ }
+ case "list":
+- err = list(*dbPath, os.Stdout, *previewWidth)
++ err = list(*dbPath, os.Stdout, *previewWidth, *imgDelim, *tempDir)
+ case "decode":
+ err = decode(*dbPath, os.Stdin, os.Stdout, flag.Arg(1))
+ case "delete-query":
+@@ -180,7 +182,13 @@ func deduplicate(b *bolt.Bucket, input []byte, maxDedupeSearch uint64) error {
+ return nil
+ }
+
+-func list(dbPath string, out io.Writer, previewWidth uint) error {
++func list(dbPath string, out io.Writer, previewWidth uint, imgDelim string, tempDir string) error {
++
++ if tempDir == "" {
++ tempDir = os.TempDir()
++ }
++ imgDir := filepath.Join(tempDir, "cliphist")
++
+ db, err := initDBReadOnly(dbPath)
+ if err != nil {
+ return fmt.Errorf("opening db: %w", err)
+@@ -193,10 +201,34 @@ func list(dbPath string, out io.Writer, previewWidth uint) error {
+ }
+ defer tx.Rollback() //nolint:errcheck
+
++ if err := os.MkdirAll(imgDir, 0755); err != nil {
++ return fmt.Errorf("creating image directory: %w", err)
++ }
++ decodedImgDelim, err := strconv.Unquote(`"` + imgDelim + `"`)
++ if err != nil {
++ return fmt.Errorf("decoding image delimiter: %w", err)
++ }
++ imgDelim = decodedImgDelim
++
+ b := tx.Bucket([]byte(bucketKey))
+ c := b.Cursor()
++
+ for k, v := c.Last(); k != nil; k, v = c.Prev() {
+- fmt.Fprintln(out, preview(btoi(k), v, previewWidth))
++ id := btoi(k)
++ if imgDelim != "" {
++ if config, format, err := image.DecodeConfig(bytes.NewReader(v)); err == nil {
++ filePath := fmt.Sprintf("%s/%d.%s", imgDir, id, format)
++ if _, err := os.Stat(filePath); os.IsNotExist(err) {
++ if err := os.WriteFile(filePath, v, 0644); err != nil {
++ return fmt.Errorf("writing file: %w", err)
++ }
++ }
++ fmt.Fprintf(out, "%d%s[[ binary data %s %s %dx%d ]]%s%s\n",
++ id, fieldSep, sizeStr(len(v)), format, config.Width, config.Height, imgDelim, filePath)
++ continue
++ }
++ }
++ fmt.Fprintln(out, preview(id, v, previewWidth))
+ }
+ return nil
+ }
diff --git a/etc/portage/patches/dev-libs/hyprland-protocols/8.patch b/etc/portage/patches/dev-libs/hyprland-protocols/8.patch
new file mode 100644
index 00000000..a7976ed1
--- /dev/null
+++ b/etc/portage/patches/dev-libs/hyprland-protocols/8.patch
@@ -0,0 +1,472 @@
+From 1a70b1116184df4fb5fc0829013b73712c054505 Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Mon, 23 Sep 2024 11:12:11 +0200
+Subject: [PATCH 1/6] WIP: input capture
+
+---
+ meson.build | 1 +
+ protocols/hyprland-input-capture-v1.xml | 77 +++++++++++++++++++++++++
+ 2 files changed, 78 insertions(+)
+ create mode 100644 protocols/hyprland-input-capture-v1.xml
+
+diff --git a/meson.build b/meson.build
+index 53767d8..c3e441c 100644
+--- a/meson.build
++++ b/meson.build
+@@ -14,6 +14,7 @@ protocols = {
+ 'hyprland-ctm-control': ['v1'],
+ 'hyprland-surface': ['v1'],
+ 'hyprland-lock-notify': ['v1'],
++ 'hyprland-input-capture': ['v1'],
+ }
+
+ protocol_files = []
+diff --git a/protocols/hyprland-input-capture-v1.xml b/protocols/hyprland-input-capture-v1.xml
+new file mode 100644
+index 0000000..abf8e10
+--- /dev/null
++++ b/protocols/hyprland-input-capture-v1.xml
+@@ -0,0 +1,77 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<protocol name="hyprland_input_capture_v1">
++
++ <copyright>
++ Copyright © 2024 Fl0w
++ All rights reserved.
++
++ Redistribution and use in source and binary forms, with or without
++ modification, are permitted provided that the following conditions are met:
++
++ 1. Redistributions of source code must retain the above copyright notice, this
++ list of conditions and the following disclaimer.
++
++ 2. Redistributions in binary form must reproduce the above copyright notice,
++ this list of conditions and the following disclaimer in the documentation
++ and/or other materials provided with the distribution.
++
++ 3. Neither the name of the copyright holder nor the names of its
++ contributors may be used to endorse or promote products derived from
++ this software without specific prior written permission.
++
++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
++ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
++ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
++ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
++ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
++ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
++ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ </copyright>
++
++ <description summary="capture the inputs for sending it to a window">
++ This protocol allows clients to create bordel for when the mouse cross,
++ the inputs are send to the client.
++
++ Usefull for implementing the input capture portal.
++ </description>
++
++ <interface name="hyprland_input_capture_manager_v1" version="1">
++ <description summary="manager for capturing inputs">
++ This interface allow a client to capture inputs and receive events
++ </description>
++
++ <request name="capture">
++ <description summary="start capture">
++ Start the capturing of inputs.
++ </description>
++ </request>
++
++ <request name="release">
++ <description summary="end capture">
++ End the capturing of inputs.
++ </description>
++ </request>
++
++ <event name="absolute_motion">
++ <description summary="pointer motion">
++ Event trigger when the mouse cursor mouse. It contains
++ the absolute position of x and y and also the relative motion of the pointer.
++ Note that the dx and dy vectors can be accelerated, please use the relative motion protocol
++ for unaccelerated inputs.
++ </description>
++ <arg name="x"
++ type="fixed"
++ summary="the x position of the cursor" />
++ <arg name="y" type="fixed"
++ summary="the y position of the cursor" />
++ <arg name="dx" type="fixed"
++ summary="the x component of the motion vector" />
++ <arg name="dy" type="fixed"
++ summary="the y component of the motion vector" />
++ </event>
++
++ </interface>
++</protocol>
+
+From 0da96fe9fa0a41534ceea66a161f3f8b7d663e32 Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Wed, 25 Sep 2024 17:59:31 +0200
+Subject: [PATCH 2/6] input-capture: impl keyboard, mouse button & mouse wheel
+
+---
+ protocols/hyprland-input-capture-v1.xml | 132 ++++++++++++++++++++++++
+ 1 file changed, 132 insertions(+)
+
+diff --git a/protocols/hyprland-input-capture-v1.xml b/protocols/hyprland-input-capture-v1.xml
+index abf8e10..c5c26e3 100644
+--- a/protocols/hyprland-input-capture-v1.xml
++++ b/protocols/hyprland-input-capture-v1.xml
+@@ -73,5 +73,137 @@
+ summary="the y component of the motion vector" />
+ </event>
+
++ <enum name="key_state">
++ <description summary="physical key state">
++ Describes the physical state of a key that produced the key event.
++ </description>
++ <entry name="released" value="0" summary="key is not pressed" />
++ <entry name="pressed" value="1" summary="key is pressed" />
++ </enum>
++
++ <event name="key">
++ <description summary="key event">
++ A key was pressed or released.
++ The key is a platform-specific key code that can be interpreted
++ by feeding it to the keyboard mapping (see the keymap event).
++ </description>
++ <arg name="key" type="uint" summary="key that produced the event" />
++ <arg name="state" type="uint" enum="key_state" summary="physical state of the key" />
++ </event>
++
++ <enum name="button_state">
++ <description summary="physical button state">
++ Describes the physical state of a button that produced the button
++ event.
++ </description>
++ <entry name="released" value="0" summary="the button is not pressed" />
++ <entry name="pressed" value="1" summary="the button is pressed" />
++ </enum>
++
++ <event name="button">
++ <description summary="pointer button event">
++ Mouse button click and release notifications.
++
++ The location of the click is given by the last motion or
++ enter event.
++
++ The button is a button code as defined in the Linux kernel's
++ linux/input-event-codes.h header file, e.g. BTN_LEFT.
++ </description>
++ <arg name="button" type="uint" summary="button that produced the event" />
++ <arg name="state" type="uint" enum="button_state" summary="physical state of the button" />
++ </event>
++
++ <enum name="axis">
++ <description summary="axis types">
++ Describes the axis types of scroll events.
++ </description>
++ <entry name="vertical_scroll" value="0" summary="vertical axis" />
++ <entry name="horizontal_scroll" value="1" summary="horizontal axis" />
++ </enum>
++
++ <event name="axis">
++ <description summary="axis event">
++ Scroll and other axis notifications.
++
++ For scroll events (vertical and horizontal scroll axes), the
++ value parameter is the length of a vector along the specified
++ axis in a coordinate space identical to those of motion events,
++ representing a relative movement along the specified axis.
++
++ For devices that support movements non-parallel to axes multiple
++ axis events will be emitted.
++
++ When applicable, for example for touch pads, the server can
++ choose to emit scroll events where the motion vector is
++ equivalent to a motion event vector.
++
++ When applicable, a client can transform its content relative to the
++ scroll distance.
++ </description>
++ <arg name="axis" type="uint" enum="axis" summary="axis type" />
++ <arg name="value" type="fixed" summary="length of vector in surface-local coordinate space" />
++ </event>
++
++ <event name="axis_value120">
++ <description summary="axis high-resolution scroll event">
++ Discrete high-resolution scroll information.
++
++ This event carries high-resolution wheel scroll information,
++ with each multiple of 120 representing one logical scroll step
++ (a wheel detent). For example, an axis_value120 of 30 is one quarter of
++ a logical scroll step in the positive direction, a value120 of
++ -240 are two logical scroll steps in the negative direction within the
++ same hardware event.
++ Clients that rely on discrete scrolling should accumulate the
++ value120 to multiples of 120 before processing the event.
++
++ The value120 must not be zero.
++ </description>
++ <arg name="axis" type="uint" enum="axis" summary="axis type" />
++ <arg name="value120" type="int" summary="scroll distance as fraction of 120" />
++ </event>
++
++ <event name="axis_stop">
++ <description summary="axis stop event">
++ Stop notification for scroll and other axes.
++
++ A axis_stop event can be sent to notify a client that the
++ axis sequence has terminated.
++ This enables the client to implement kinetic scrolling.
++
++ The timestamp is to be interpreted identical to the timestamp in the
++ axis event. The timestamp value may be the same as a
++ preceding axis event.
++ </description>
++ <arg name="axis" type="uint" enum="axis" summary="the axis stopped with this event" />
++ </event>
++
++ <event name="frame">
++ <description summary="end of a pointer event sequence">
++ Indicates the end of a set of events that logically belong together.
++ A client is expected to accumulate the data in all events within the
++ frame before proceeding.
++
++ All wl_pointer events before a frame event belong
++ logically together. For example, in a diagonal scroll motion the
++ compositor will two axis events (horizontal and vertical) and
++ a frame event. The client may use this information to
++ calculate a diagonal vector for scrolling.
++
++ When multiple axis events occur within the same frame,
++ the motion vector is the combined motion of all events.
++ When a axis and a wl_pointer.axis_stop event occur within
++ the same frame, this indicates that axis movement in one axis has
++ stopped but continues in the other axis.
++ When multiple axis_stop events occur within the same
++ frame, this indicates that these axes stopped in the same instance.
++
++ A frame event is sent for every logical event group,
++ even if the group only contains a single wl_pointer event.
++ Specifically, a client may get a sequence: motion, frame, button,
++ frame, axis, frame, axis_stop, frame.
++ </description>
++ </event>
+ </interface>
+ </protocol>
+
+From b605e8d5f66f613cb90905e3a136a68825d43933 Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Mon, 30 Sep 2024 12:13:24 +0200
+Subject: [PATCH 3/6] Fix spelling & rephrase motion event
+
+---
+ protocols/hyprland-input-capture-v1.xml | 21 +++++++++++++--------
+ 1 file changed, 13 insertions(+), 8 deletions(-)
+
+diff --git a/protocols/hyprland-input-capture-v1.xml b/protocols/hyprland-input-capture-v1.xml
+index c5c26e3..3279295 100644
+--- a/protocols/hyprland-input-capture-v1.xml
++++ b/protocols/hyprland-input-capture-v1.xml
+@@ -32,15 +32,15 @@
+ </copyright>
+
+ <description summary="capture the inputs for sending it to a window">
+- This protocol allows clients to create bordel for when the mouse cross,
+- the inputs are send to the client.
++ This protocol allows clients to create borders, for which after crossing,
++ mouse events will be forwarded to the client
+
+- Usefull for implementing the input capture portal.
++ Useful for implementing the input capture portal.
+ </description>
+
+ <interface name="hyprland_input_capture_manager_v1" version="1">
+ <description summary="manager for capturing inputs">
+- This interface allow a client to capture inputs and receive events
++ This interface allows a client to capture inputs and receive events
+ </description>
+
+ <request name="capture">
+@@ -55,11 +55,15 @@
+ </description>
+ </request>
+
+- <event name="absolute_motion">
++ <event name="motion">
+ <description summary="pointer motion">
+- Event trigger when the mouse cursor mouse. It contains
+- the absolute position of x and y and also the relative motion of the pointer.
+- Note that the dx and dy vectors can be accelerated, please use the relative motion protocol
++ Notification of pointer location change.
++
++ It contains the absolute position of x and y and also the
++ relative motion of the pointer.
++
++ Note that the dx and dy vectors can be accelerated,
++ please use the relative motion protocol
+ for unaccelerated inputs.
+ </description>
+ <arg name="x"
+@@ -84,6 +88,7 @@
+ <event name="key">
+ <description summary="key event">
+ A key was pressed or released.
++
+ The key is a platform-specific key code that can be interpreted
+ by feeding it to the keyboard mapping (see the keymap event).
+ </description>
+
+From 7926613ef37613b34e67ff3c02963d6c6b16454a Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Mon, 7 Oct 2024 14:29:12 +0200
+Subject: [PATCH 4/6] input-capture: impl keymap
+
+---
+ protocols/hyprland-input-capture-v1.xml | 32 ++++++++++++++++++++++---
+ 1 file changed, 29 insertions(+), 3 deletions(-)
+
+diff --git a/protocols/hyprland-input-capture-v1.xml b/protocols/hyprland-input-capture-v1.xml
+index 3279295..a96863a 100644
+--- a/protocols/hyprland-input-capture-v1.xml
++++ b/protocols/hyprland-input-capture-v1.xml
+@@ -2,7 +2,11 @@
+ <protocol name="hyprland_input_capture_v1">
+
+ <copyright>
++ Copyright © 2008-2011 Kristian Høgsberg
++ Copyright © 2010-2011 Intel Corporation
++ Copyright © 2012-2013 Collabora, Ltd.
+ Copyright © 2024 Fl0w
++
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+@@ -77,6 +81,28 @@
+ summary="the y component of the motion vector" />
+ </event>
+
++ <enum name="keymap_format">
++ <description summary="keyboard mapping format">
++ This specifies the format of the keymap provided to the
++ client with the keymap event.
++ </description>
++ <entry name="no_keymap" value="0"
++ summary="no keymap; client must understand how to interpret the raw keycode" />
++ <entry name="xkb_v1" value="1"
++ summary="libxkbcommon compatible, null-terminated string; to determine the xkb keycode, clients must add 8 to the key event keycode" />
++ </enum>
++
++ <event name="keymap">
++ <description summary="keyboard mapping">
++ This event provides a file descriptor to the client which can be
++ memory-mapped in read-only mode to provide a keyboard mapping
++ description.
++ </description>
++ <arg name="format" type="uint" enum="keymap_format" summary="keymap format" />
++ <arg name="fd" type="fd" summary="keymap file descriptor" />
++ <arg name="size" type="uint" summary="keymap size, in bytes" />
++ </event>
++
+ <enum name="key_state">
+ <description summary="physical key state">
+ Describes the physical state of a key that produced the key event.
+@@ -190,7 +216,7 @@
+ A client is expected to accumulate the data in all events within the
+ frame before proceeding.
+
+- All wl_pointer events before a frame event belong
++ All pointer events before a frame event belong
+ logically together. For example, in a diagonal scroll motion the
+ compositor will two axis events (horizontal and vertical) and
+ a frame event. The client may use this information to
+@@ -198,14 +224,14 @@
+
+ When multiple axis events occur within the same frame,
+ the motion vector is the combined motion of all events.
+- When a axis and a wl_pointer.axis_stop event occur within
++ When a axis and a axis_stop event occur within
+ the same frame, this indicates that axis movement in one axis has
+ stopped but continues in the other axis.
+ When multiple axis_stop events occur within the same
+ frame, this indicates that these axes stopped in the same instance.
+
+ A frame event is sent for every logical event group,
+- even if the group only contains a single wl_pointer event.
++ even if the group only contains a single pointer event.
+ Specifically, a client may get a sequence: motion, frame, button,
+ frame, axis, frame, axis_stop, frame.
+ </description>
+
+From fa50e45099e762287c1811816be3163753ae62c4 Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Mon, 21 Oct 2024 10:21:08 +0200
+Subject: [PATCH 5/6] input-capture: add force_release event
+
+---
+ protocols/hyprland-input-capture-v1.xml | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/protocols/hyprland-input-capture-v1.xml b/protocols/hyprland-input-capture-v1.xml
+index a96863a..58401f2 100644
+--- a/protocols/hyprland-input-capture-v1.xml
++++ b/protocols/hyprland-input-capture-v1.xml
+@@ -59,6 +59,13 @@
+ </description>
+ </request>
+
++ <event name="force_release">
++ <description summary="force release">
++ This event is triggered by the compositor to tell that he has
++ released the capture of inputs
++ </description>
++ </event>
++
+ <event name="motion">
+ <description summary="pointer motion">
+ Notification of pointer location change.
+
+From 5341ab4d644daf092a97ec1935ac72315a3aa19b Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Fri, 13 Dec 2024 23:08:57 +0100
+Subject: [PATCH 6/6] input-capture: add modifiers event
+
+---
+ protocols/hyprland-input-capture-v1.xml | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+diff --git a/protocols/hyprland-input-capture-v1.xml b/protocols/hyprland-input-capture-v1.xml
+index 58401f2..37a82f3 100644
+--- a/protocols/hyprland-input-capture-v1.xml
++++ b/protocols/hyprland-input-capture-v1.xml
+@@ -129,6 +129,28 @@
+ <arg name="state" type="uint" enum="key_state" summary="physical state of the key" />
+ </event>
+
++ <event name="modifiers">
++ <description summary="modifier and group state">
++ Notifies clients that the modifier and/or group state has
++ changed, and it should update its local state.
++
++ The compositor may send this event without a surface of the client
++ having keyboard focus, for example to tie modifier information to
++ pointer focus instead. If a modifier event with pressed modifiers is sent
++ without a prior enter event, the client can assume the modifier state is
++ valid until it receives the next modifiers event. In order to
++ reset the modifier state again, the compositor can send a
++ modifiers event with no pressed modifiers.
++
++ In the wl_keyboard logical state, this event updates the modifiers and
++ group.
++ </description>
++ <arg name="mods_depressed" type="uint" summary="depressed modifiers"/>
++ <arg name="mods_latched" type="uint" summary="latched modifiers"/>
++ <arg name="mods_locked" type="uint" summary="locked modifiers"/>
++ <arg name="group" type="uint" summary="keyboard layout"/>
++ </event>
++
+ <enum name="button_state">
+ <description summary="physical button state">
+ Describes the physical state of a button that produced the button
diff --git a/etc/portage/patches/gui-libs/libadwaita/theming_patch.diff b/etc/portage/patches/gui-libs/libadwaita/theming_patch.diff
new file mode 100644
index 00000000..2d1514a3
--- /dev/null
+++ b/etc/portage/patches/gui-libs/libadwaita/theming_patch.diff
@@ -0,0 +1,74 @@
+diff --git a/src/adw-style-manager.c b/src/adw-style-manager.c
+index 71f6915d..a90c0df1 100644
+--- a/src/adw-style-manager.c
++++ b/src/adw-style-manager.c
+@@ -284,6 +284,23 @@ notify_high_contrast_cb (AdwStyleManager *self)
+ g_object_notify_by_pspec (G_OBJECT (self), props[PROP_HIGH_CONTRAST]);
+ }
+
++static void
++adw_style_manager_theme_changed(GSettings *settings, const char *key, GdkDisplay *display)
++{
++ char* theme = g_settings_get_string(settings, "gtk-theme");
++ char* color_scheme = g_settings_get_string(settings, "color-scheme");
++
++ if(!theme) {
++ theme = "Adwaita-empty";
++ }
++
++ gboolean is_dark_variant = NULL != strstr(theme, "-dark") || NULL != strstr(theme, "-Dark") || 0 == strcmp(color_scheme, "prefer-dark");
++
++ g_object_set(gtk_settings_get_for_display(display),
++ "gtk-theme-name", theme,
++ "gtk-application-prefer-dark-theme", is_dark_variant, NULL);
++}
++
+ static void
+ adw_style_manager_constructed (GObject *object)
+ {
+@@ -308,27 +325,6 @@ adw_style_manager_constructed (GObject *object)
+ self,
+ G_CONNECT_SWAPPED);
+
+- if (!adw_is_granite_present () && !g_getenv ("GTK_THEME")) {
+- g_object_set (gtk_settings_get_for_display (self->display),
+- "gtk-theme-name", "Adwaita-empty",
+- NULL);
+-
+- self->provider = gtk_css_provider_new ();
+- gtk_style_context_add_provider_for_display (self->display,
+- GTK_STYLE_PROVIDER (self->provider),
+- GTK_STYLE_PROVIDER_PRIORITY_THEME);
+-
+- self->colors_provider = gtk_css_provider_new ();
+- gtk_style_context_add_provider_for_display (self->display,
+- GTK_STYLE_PROVIDER (self->colors_provider),
+- GTK_STYLE_PROVIDER_PRIORITY_THEME);
+-
+- self->accent_provider = gtk_css_provider_new ();
+- gtk_style_context_add_provider_for_display (self->display,
+- GTK_STYLE_PROVIDER (self->accent_provider),
+- GTK_STYLE_PROVIDER_PRIORITY_THEME);
+- }
+-
+ self->animations_provider = gtk_css_provider_new ();
+ gtk_css_provider_load_from_string (self->animations_provider,
+ "* { transition: none; }");
+@@ -364,6 +360,17 @@ adw_style_manager_constructed (GObject *object)
+
+ update_dark (self);
+ update_stylesheet (self, UPDATE_ALL);
++
++ if (self->display && !adw_is_granite_present () && !g_getenv ("GTK_THEME")) {
++ GSettingsSchemaSource *schema_source =
++ g_settings_schema_source_get_default();
++ GSettingsSchema *schema = g_settings_schema_source_lookup(
++ schema_source, "org.gnome.desktop.interface", true);
++ GSettings *interface_settings = g_settings_new_full(schema, NULL, NULL);
++
++ adw_style_manager_theme_changed(interface_settings, "gtk-theme", self->display);
++ g_signal_connect (interface_settings, "changed", G_CALLBACK (adw_style_manager_theme_changed), self->display);
++ }
+ }
+
+ static void
diff --git a/etc/portage/patches/gui-libs/xdg-desktop-portal-hyprland/268.patch b/etc/portage/patches/gui-libs/xdg-desktop-portal-hyprland/268.patch
new file mode 100644
index 00000000..fddb15c5
--- /dev/null
+++ b/etc/portage/patches/gui-libs/xdg-desktop-portal-hyprland/268.patch
@@ -0,0 +1,3843 @@
+From 5656f5ff293ea5ce3178d64482b2f3b80b732f0f Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Wed, 25 Sep 2024 18:06:16 +0200
+Subject: [PATCH 01/17] WIP: input capture
+
+---
+ .gitmodules | 3 +-
+ CMakeLists.txt | 4 +
+ hyprland.portal | 2 +-
+ meson.build | 3 +
+ protocols/meson.build | 1 +
+ src/core/PortalManager.cpp | 31 +-
+ src/core/PortalManager.hpp | 14 +-
+ src/main.cpp | 2 +-
+ src/meson.build | 1 +
+ src/portals/InputCapture.cpp | 596 +++++++++++++++++++++++++++++++++
+ src/portals/InputCapture.hpp | 96 ++++++
+ src/shared/Eis.cpp | 287 ++++++++++++++++
+ src/shared/Eis.hpp | 49 +++
+ 14 files changed, 1077 insertions(+), 14 deletions(-)
+ create mode 100644 src/portals/InputCapture.cpp
+ create mode 100644 src/portals/InputCapture.hpp
+ create mode 100644 src/shared/Eis.cpp
+ create mode 100644 src/shared/Eis.hpp
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 871ca3c..3d21329 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -62,6 +62,8 @@ pkg_check_modules(
+ libpipewire-0.3>=1.1.82
+ libspa-0.2
+ libdrm
++ libeis-1.0
++ dbus-1
+ gbm
+ hyprlang>=0.2.0
+ hyprutils>=0.2.6
+@@ -130,6 +132,8 @@ protocolnew("${HYPRLAND_PROTOCOLS}/protocols" "hyprland-global-shortcuts-v1"
+ true)
+ protocolnew("${HYPRLAND_PROTOCOLS}/protocols" "hyprland-toplevel-export-v1"
+ true)
++protocolnew("${HYPRLAND_PROTOCOLS}/protocols" "hyprland-input-capture-v1"
++ true)
+ protocolnew("stable/linux-dmabuf" "linux-dmabuf-v1" false)
+
+ # Installation
+diff --git a/hyprland.portal b/hyprland.portal
+index d3e2cbe..cbaafa8 100644
+--- a/hyprland.portal
++++ b/hyprland.portal
+@@ -1,4 +1,4 @@
+ [portal]
+ DBusName=org.freedesktop.impl.portal.desktop.hyprland
+-Interfaces=org.freedesktop.impl.portal.Screenshot;org.freedesktop.impl.portal.ScreenCast;org.freedesktop.impl.portal.GlobalShortcuts;
++Interfaces=org.freedesktop.impl.portal.Screenshot;org.freedesktop.impl.portal.ScreenCast;org.freedesktop.impl.portal.GlobalShortcuts;org.freedesktop.impl.portal.InputCapture;
+ UseIn=wlroots;Hyprland;sway;Wayfire;river;
+diff --git a/meson.build b/meson.build
+index bcae2b2..c2a2675 100644
+--- a/meson.build
++++ b/meson.build
+@@ -61,6 +61,9 @@ install_data(
+ 'hyprland.portal',
+ install_dir: join_paths(get_option('datadir'), 'xdg-desktop-portal', 'portals'),
+ )
++version = run_command('cat', files('VERSION'), check: true).stdout().strip()
++
++add_project_arguments(f'-DXDPH_VERSION="@version@"', language : 'cpp')
+
+ inc = include_directories('.', 'protocols')
+
+diff --git a/protocols/meson.build b/protocols/meson.build
+index f10d4c8..d7805d1 100644
+--- a/protocols/meson.build
++++ b/protocols/meson.build
+@@ -22,6 +22,7 @@ client_protocols = [
+ 'wlr-foreign-toplevel-management-unstable-v1.xml',
+ hl_protocol_dir / 'protocols/hyprland-toplevel-export-v1.xml',
+ hl_protocol_dir / 'protocols/hyprland-global-shortcuts-v1.xml',
++ hl_protocol_dir / 'protocols/hyprland-input-capture-v1.xml',
+ wl_protocol_dir / 'stable/linux-dmabuf/linux-dmabuf-v1.xml',
+ ]
+
+diff --git a/src/core/PortalManager.cpp b/src/core/PortalManager.cpp
+index 9111870..a6d8589 100644
+--- a/src/core/PortalManager.cpp
++++ b/src/core/PortalManager.cpp
+@@ -1,7 +1,10 @@
+ #include "PortalManager.hpp"
+ #include "../helpers/Log.hpp"
+ #include "../helpers/MiscFunctions.hpp"
++#include "wayland.hpp"
+
++#include <hyprutils/memory/SharedPtr.hpp>
++#include <memory>
+ #include <pipewire/pipewire.h>
+ #include <poll.h>
+ #include <sys/mman.h>
+@@ -9,6 +12,7 @@
+ #include <unistd.h>
+
+ #include <thread>
++#include <vector>
+
+ SOutput::SOutput(SP<CCWlOutput> output_) : output(output_) {
+ output->setName([this](CCWlOutput* o, const char* name_) {
+@@ -19,13 +23,19 @@ SOutput::SOutput(SP<CCWlOutput> output_) : output(output_) {
+
+ Debug::log(LOG, "Found output name {}", name);
+ });
+- output->setMode([this](CCWlOutput* r, uint32_t flags, int32_t width, int32_t height, int32_t refresh) { //
+- refreshRate = refresh;
+- });
+- output->setGeometry([this](CCWlOutput* r, int32_t x, int32_t y, int32_t physical_width, int32_t physical_height, int32_t subpixel, const char* make, const char* model,
+- int32_t transform_) { //
+- transform = (wl_output_transform)transform_;
++ output->setMode([this](CCWlOutput* r, uint32_t flags, int32_t width, int32_t height, int32_t refresh) {
++ refreshRate = refresh;
++ this->width = width;
++ this->height = height;
+ });
++ output->setGeometry(
++ [this](CCWlOutput* r, int32_t x, int32_t y, int32_t physical_width, int32_t physical_height, int32_t subpixel, const char* make, const char* model, int32_t transform_) {
++ transform = (wl_output_transform)transform_;
++ this->x = x;
++ this->y = y;
++ });
++ output->setScale([this](CCWlOutput* r, uint32_t factor) { this->scale = factor; });
++ output->setDone([](CCWlOutput* r) { g_pPortalManager->m_sPortals.inputCapture->zonesChanged(); });
+ }
+
+ CPortalManager::CPortalManager() {
+@@ -63,7 +73,9 @@ void CPortalManager::onGlobal(uint32_t name, const char* interface, uint32_t ver
+ m_sPortals.globalShortcuts = std::make_unique<CGlobalShortcutsPortal>(makeShared<CCHyprlandGlobalShortcutsManagerV1>(
+ (wl_proxy*)wl_registry_bind((wl_registry*)m_sWaylandConnection.registry->resource(), name, &hyprland_global_shortcuts_manager_v1_interface, version)));
+ }
+-
++ if (INTERFACE == hyprland_input_capture_manager_v1_interface.name)
++ m_sPortals.inputCapture = std::make_unique<CInputCapturePortal>(makeShared<CCHyprlandInputCaptureManagerV1>(
++ (wl_proxy*)wl_registry_bind((wl_registry*)m_sWaylandConnection.registry->resource(), name, &hyprland_input_capture_manager_v1_interface, version)));
+ else if (INTERFACE == hyprland_toplevel_export_manager_v1_interface.name) {
+ m_sWaylandConnection.hyprlandToplevelMgr = makeShared<CCHyprlandToplevelExportManagerV1>(
+ (wl_proxy*)wl_registry_bind((wl_registry*)m_sWaylandConnection.registry->resource(), name, &hyprland_toplevel_export_manager_v1_interface, version));
+@@ -417,6 +429,7 @@ void CPortalManager::startEventLoop() {
+ m_sPortals.screencopy.reset();
+ m_sPortals.screenshot.reset();
+ m_sHelpers.toplevel.reset();
++ m_sPortals.inputCapture.reset();
+
+ m_pConnection.reset();
+ pw_loop_destroy(m_sPipewire.loop);
+@@ -438,6 +451,10 @@ SOutput* CPortalManager::getOutputFromName(const std::string& name) {
+ return nullptr;
+ }
+
++std::vector<std::unique_ptr<SOutput>> const& CPortalManager::getAllOutputs() {
++ return m_vOutputs;
++}
++
+ static char* gbm_find_render_node(drmDevice* device) {
+ drmDevice* devices[64];
+ char* render_node = NULL;
+diff --git a/src/core/PortalManager.hpp b/src/core/PortalManager.hpp
+index e0f2f03..6ca241d 100644
+--- a/src/core/PortalManager.hpp
++++ b/src/core/PortalManager.hpp
+@@ -1,13 +1,16 @@
+ #pragma once
+
++#include <cstdint>
+ #include <memory>
+ #include <sdbus-c++/sdbus-c++.h>
++
+ #include <hyprlang.hpp>
+
+ #include "wayland.hpp"
+ #include "../portals/Screencopy.hpp"
+ #include "../portals/Screenshot.hpp"
+ #include "../portals/GlobalShortcuts.hpp"
++#include "../portals/InputCapture.hpp"
+ #include "../helpers/Timer.hpp"
+ #include "../shared/ToplevelManager.hpp"
+ #include <gbm.h>
+@@ -33,6 +36,9 @@ struct SOutput {
+ uint32_t id = 0;
+ float refreshRate = 60.0;
+ wl_output_transform transform = WL_OUTPUT_TRANSFORM_NORMAL;
++ uint32_t width, height;
++ int32_t x, y;
++ int32_t scale;
+ };
+
+ struct SDMABUFModifier {
+@@ -44,13 +50,14 @@ class CPortalManager {
+ public:
+ CPortalManager();
+
+- void init();
++ void init();
+
+ void onGlobal(uint32_t name, const char* interface, uint32_t version);
+ void onGlobalRemoved(uint32_t name);
+
+- sdbus::IConnection* getConnection();
+- SOutput* getOutputFromName(const std::string& name);
++ sdbus::IConnection* getConnection();
++ SOutput* getOutputFromName(const std::string& name);
++ std::vector<std::unique_ptr<SOutput>> const& getAllOutputs();
+
+ struct {
+ pw_loop* loop = nullptr;
+@@ -60,6 +67,7 @@ class CPortalManager {
+ std::unique_ptr<CScreencopyPortal> screencopy;
+ std::unique_ptr<CScreenshotPortal> screenshot;
+ std::unique_ptr<CGlobalShortcutsPortal> globalShortcuts;
++ std::unique_ptr<CInputCapturePortal> inputCapture;
+ } m_sPortals;
+
+ struct {
+diff --git a/src/main.cpp b/src/main.cpp
+index cdeb83d..e5c3ed3 100644
+--- a/src/main.cpp
++++ b/src/main.cpp
+@@ -42,4 +42,4 @@ int main(int argc, char** argv, char** envp) {
+ g_pPortalManager->init();
+
+ return 0;
+-}
+\ No newline at end of file
++}
+diff --git a/src/meson.build b/src/meson.build
+index b76a85f..2f8d1e6 100644
+--- a/src/meson.build
++++ b/src/meson.build
+@@ -9,6 +9,7 @@ executable('xdg-desktop-portal-hyprland',
+ dependency('hyprlang'),
+ dependency('hyprutils'),
+ dependency('libdrm'),
++ dependency('libeis-1.0'),
+ dependency('libpipewire-0.3'),
+ dependency('sdbus-c++'),
+ dependency('threads'),
+diff --git a/src/portals/InputCapture.cpp b/src/portals/InputCapture.cpp
+new file mode 100644
+index 0000000..8f9557f
+--- /dev/null
++++ b/src/portals/InputCapture.cpp
+@@ -0,0 +1,596 @@
++#include "InputCapture.hpp"
++
++#include "../core/PortalManager.hpp"
++#include "../helpers/Log.hpp"
++#include "hyprland-input-capture-v1.hpp"
++#include "shared/Session.hpp"
++#include "src/shared/Eis.hpp"
++#include <cstddef>
++#include <cstdint>
++#include <memory>
++#include <sdbus-c++/IConnection.h>
++#include <sdbus-c++/Types.h>
++#include <string>
++#include <sys/socket.h>
++#include <sys/un.h>
++#include <unordered_map>
++#include <wayland-util.h>
++
++CInputCapturePortal::CInputCapturePortal(SP<CCHyprlandInputCaptureManagerV1> mgr) {
++ Debug::log(LOG, "[input-capture] initializing input capture portal");
++ m_sState.manager = mgr;
++ sessionCounter = 0;
++ lastZoneSet = 0;
++
++ mgr->setAbsoluteMotion([this](CCHyprlandInputCaptureManagerV1* r, wl_fixed_t x, wl_fixed_t y, wl_fixed_t dx, wl_fixed_t dy) {
++ onAbsoluteMotion(wl_fixed_to_double(x), wl_fixed_to_double(y), wl_fixed_to_double(dx), wl_fixed_to_double(dy));
++ });
++
++ mgr->setKey([this](CCHyprlandInputCaptureManagerV1* r, uint32_t key, hyprlandInputCaptureManagerV1KeyState state) { onKey(key, state); });
++
++ mgr->setButton([this](CCHyprlandInputCaptureManagerV1* r, uint32_t button, hyprlandInputCaptureManagerV1ButtonState state) { onButton(button, state); });
++
++ mgr->setAxis([this](CCHyprlandInputCaptureManagerV1* r, hyprlandInputCaptureManagerV1Axis axis, double value) { onAxis(axis, value); });
++
++ mgr->setAxisValue120([this](CCHyprlandInputCaptureManagerV1* r, hyprlandInputCaptureManagerV1Axis axis, int32_t value120) { onAxis(axis, value120); });
++
++ mgr->setAxisStop([this](CCHyprlandInputCaptureManagerV1* r, hyprlandInputCaptureManagerV1Axis axis) { onAxisStop(axis); });
++
++ mgr->setFrame([this](CCHyprlandInputCaptureManagerV1* r) { onFrame(); });
++
++ m_pObject = sdbus::createObject(*g_pPortalManager->getConnection(), OBJECT_PATH);
++
++ m_pObject->registerMethod(INTERFACE_NAME, "CreateSession", "oossa{sv}", "ua{sv}", [&](sdbus::MethodCall c) { onCreateSession(c); });
++ m_pObject->registerMethod(INTERFACE_NAME, "GetZones", "oosa{sv}", "ua{sv}", [&](sdbus::MethodCall c) { onGetZones(c); });
++ m_pObject->registerMethod(INTERFACE_NAME, "SetPointerBarriers", "oosa{sv}aa{sv}u", "ua{sv}", [&](sdbus::MethodCall c) { onSetPointerBarriers(c); });
++ m_pObject->registerMethod(INTERFACE_NAME, "Enable", "osa{sv}", "ua{sv}", [&](sdbus::MethodCall c) { onEnable(c); });
++ m_pObject->registerMethod(INTERFACE_NAME, "Disable", "osa{sv}", "ua{sv}", [&](sdbus::MethodCall c) { onDisable(c); });
++ m_pObject->registerMethod(INTERFACE_NAME, "Release", "osa{sv}", "ua{sv}", [&](sdbus::MethodCall c) { onRelease(c); });
++ m_pObject->registerMethod(INTERFACE_NAME, "ConnectToEIS", "osa{sv}", "h", [&](sdbus::MethodCall c) { onConnectToEIS(c); });
++
++ m_pObject->registerProperty(INTERFACE_NAME, "SupportedCapabilities", "u", [](sdbus::PropertyGetReply& reply) { reply << (uint)(1 | 2); });
++ m_pObject->registerProperty(INTERFACE_NAME, "version", "u", [](sdbus::PropertyGetReply& reply) { reply << (uint)1; });
++
++ m_pObject->finishRegistration();
++
++ for (auto& o : g_pPortalManager->getAllOutputs()) {
++ Debug::log(LOG, "{} {}x{}", o->name, o->width, o->height);
++ }
++
++ Debug::log(LOG, "[input-capture] init successful");
++}
++
++void complete(sdbus::MethodCall& call) {
++ auto reply = call.createReply();
++ reply << (uint32_t)0;
++ reply << std::unordered_map<std::string, sdbus::Variant>{};
++ reply.send();
++}
++
++void CInputCapturePortal::onCreateSession(sdbus::MethodCall& call) {
++ Debug::log(LOG, "[input-capture] New session:");
++
++ sdbus::ObjectPath requestHandle, sessionHandle;
++
++ call >> requestHandle;
++ call >> sessionHandle;
++
++ std::string appID;
++ call >> appID;
++
++ std::string parentWindow;
++ call >> parentWindow;
++
++ std::unordered_map<std::string, sdbus::Variant> options;
++ call >> options;
++ uint32_t capabilities = options["capabilities"];
++
++ Debug::log(LOG, "[input-capture] | {}", requestHandle.c_str());
++ Debug::log(LOG, "[input-capture] | {}", sessionHandle.c_str());
++ Debug::log(LOG, "[input-capture] | appid: {}", appID);
++ Debug::log(LOG, "[input-capture] | parent_window: {}", parentWindow);
++ Debug::log(LOG, "[input-capture] | capabilities : {}", capabilities);
++
++ std::string sessionId = "input-capture-" + std::to_string(sessionCounter++);
++ Debug::log(LOG, "[input-capture] | sessionId : {}", sessionId);
++
++ const std::shared_ptr<Session> session = std::make_shared<Session>();
++
++ session->appid = appID;
++ session->requestHandle = requestHandle;
++ session->sessionHandle = sessionHandle;
++ session->sessionId = sessionId;
++ session->capabilities = capabilities;
++ session->activationId = 0;
++ session->status = CREATED;
++
++ session->session = createDBusSession(sessionHandle);
++ session->session->onDestroy = [session, this]() {
++ if (session->status == ACTIVATED) {
++ disable(session->sessionHandle);
++ }
++ session->eis->stopServer();
++ Debug::log(LOG, "[input-capture] Session {} destroyed", session->sessionHandle.c_str());
++
++ session->session.release();
++ };
++
++ session->request = createDBusRequest(requestHandle);
++ session->request->onDestroy = [session]() { session->request.release(); };
++
++ session->eis = std::make_unique<EmulatedInputServer>("eis-" + sessionId);
++
++ sessions.emplace(sessionHandle, session);
++
++ std::unordered_map<std::string, sdbus::Variant> results;
++ results["capabilities"] = (uint)3;
++ results["session_id"] = sessionId;
++
++ auto reply = call.createReply();
++ reply << (uint32_t)0;
++ reply << results;
++ reply.send();
++}
++
++void CInputCapturePortal::onGetZones(sdbus::MethodCall& call) {
++ Debug::log(LOG, "[input-capture] New GetZones request:");
++
++ sdbus::ObjectPath requestHandle, sessionHandle;
++
++ call >> requestHandle;
++ call >> sessionHandle;
++
++ std::string appID;
++ call >> appID;
++
++ Debug::log(LOG, "[input-capture] | {}", requestHandle.c_str());
++ Debug::log(LOG, "[input-capture] | {}", sessionHandle.c_str());
++ Debug::log(LOG, "[input-capture] | appid: {}", appID);
++
++ if (!sessionValid(sessionHandle))
++ return;
++
++ std::vector<sdbus::Struct<uint32_t, uint32_t, int32_t, int32_t>> zones;
++ for (auto& o : g_pPortalManager->getAllOutputs()) {
++ zones.push_back(sdbus::Struct(o->width, o->height, o->x, o->y));
++ }
++
++ std::unordered_map<std::string, sdbus::Variant> results;
++ results["zones"] = zones;
++ results["zone_set"] = ++lastZoneSet;
++
++ auto reply = call.createReply();
++ reply << (uint32_t)0;
++ reply << results;
++ reply.send();
++}
++
++void CInputCapturePortal::onSetPointerBarriers(sdbus::MethodCall& call) {
++ Debug::log(LOG, "[input-capture] New SetPointerBarriers request:");
++
++ sdbus::ObjectPath requestHandle, sessionHandle;
++
++ call >> requestHandle;
++ call >> sessionHandle;
++
++ std::string appID;
++ call >> appID;
++
++ Debug::log(LOG, "[input-capture] | {}", requestHandle.c_str());
++ Debug::log(LOG, "[input-capture] | {}", sessionHandle.c_str());
++ Debug::log(LOG, "[input-capture] | appid: {}", appID);
++
++ if (!sessionValid(sessionHandle))
++ return complete(call);
++
++ std::unordered_map<std::string, sdbus::Variant> options;
++ call >> options;
++
++ std::vector<std::unordered_map<std::string, sdbus::Variant>> barriers;
++ call >> barriers;
++
++ uint32_t zoneSet;
++ call >> zoneSet;
++ Debug::log(LOG, "[input-capture] | zoneSet: {}", zoneSet);
++
++ if (zoneSet != lastZoneSet) {
++ Debug::log(WARN, "[input-capture] Invalid zone set discarding barriers");
++ complete(call); //TODO: We should return failed_barries
++ return;
++ }
++
++ sessions[sessionHandle]->barriers.clear();
++ for (const auto& b : barriers) {
++ uint id = b.at("barrier_id");
++ int x1, y1, x2, y2;
++
++ sdbus::Struct<int, int, int, int> p = b.at("position");
++ x1 = p.get<0>();
++ y1 = p.get<1>();
++ x2 = p.get<2>();
++ y2 = p.get<3>();
++
++ Debug::log(LOG, "[input-capture] | barrier: {}, [{}, {}] [{}, {}]", id, x1, y1, x2, y2);
++ sessions[sessionHandle]->barriers[id] = {id, x1, y1, x2, y2};
++ }
++
++ std::vector<uint> failedBarriers;
++
++ std::unordered_map<std::string, sdbus::Variant> results;
++ results["failed_barriers"] = failedBarriers;
++
++ auto reply = call.createReply();
++ reply << (uint32_t)0;
++ reply << results;
++ reply.send();
++}
++
++void CInputCapturePortal::onDisable(sdbus::MethodCall& call) {
++ Debug::log(LOG, "[input-capture] New Disable request:");
++
++ sdbus::ObjectPath sessionHandle;
++ call >> sessionHandle;
++
++ std::string appID;
++ call >> appID;
++
++ Debug::log(LOG, "[input-capture] | {}", sessionHandle.c_str());
++ Debug::log(LOG, "[input-capture] | appid: {}", appID);
++
++ if (!sessionValid(sessionHandle))
++ return complete(call);
++
++ disable(sessionHandle);
++
++ complete(call);
++}
++
++void CInputCapturePortal::onEnable(sdbus::MethodCall& call) {
++ Debug::log(LOG, "[input-capture] New Enable request:");
++
++ sdbus::ObjectPath sessionHandle;
++ call >> sessionHandle;
++
++ std::string appID;
++ call >> appID;
++
++ Debug::log(LOG, "[input-capture] | {}", sessionHandle.c_str());
++ Debug::log(LOG, "[input-capture] | appid: {}", appID);
++
++ if (!sessionValid(sessionHandle))
++ return complete(call);
++
++ sessions[sessionHandle]->status = ENABLED;
++
++ complete(call);
++}
++
++void CInputCapturePortal::onRelease(sdbus::MethodCall& call) {
++ Debug::log(LOG, "[input-capture] New Release request:");
++
++ sdbus::ObjectPath sessionHandle;
++ call >> sessionHandle;
++
++ std::string appID;
++ call >> appID;
++
++ Debug::log(LOG, "[input-capture] | {}", sessionHandle.c_str());
++ Debug::log(LOG, "[input-capture] | appid: {}", appID);
++
++ if (!sessionValid(sessionHandle))
++ return complete(call);
++
++ std::unordered_map<std::string, sdbus::Variant> options;
++ call >> options;
++ uint32_t activationId = options["activation_id"];
++ if (activationId != sessions[sessionHandle]->activationId) {
++ Debug::log(WARN, "[input-capture] Invalid activation id {} expected {}", activationId, sessions[sessionHandle]->activationId);
++ complete(call);
++ return;
++ }
++
++ deactivate(sessionHandle);
++
++ //TODO: maybe warp pointer
++
++ complete(call);
++}
++
++void CInputCapturePortal::onConnectToEIS(sdbus::MethodCall& call) {
++ Debug::log(LOG, "[input-capture] New ConnectToEIS request:");
++
++ sdbus::ObjectPath sessionHandle;
++ call >> sessionHandle;
++
++ std::string appID;
++ call >> appID;
++
++ std::unordered_map<std::string, sdbus::Variant> options;
++ call >> options;
++
++ Debug::log(LOG, "[input-capture] | {}", sessionHandle.c_str());
++ Debug::log(LOG, "[input-capture] | appid: {}", appID);
++
++ if (!sessionValid(sessionHandle))
++ return complete(call);
++
++ int sockfd = sessions[sessionHandle]->eis->getFileDescriptor();
++
++ Debug::log(LOG, "[input-capture] Connected to the socket. File descriptor: {}", sockfd);
++ auto reply = call.createReply();
++ reply << (sdbus::UnixFd)sockfd;
++ reply.send();
++}
++
++bool CInputCapturePortal::sessionValid(sdbus::ObjectPath sessionHandle) {
++ if (!sessions.contains(sessionHandle)) {
++ Debug::log(WARN, "[input-capture] Unknown session handle: {}", sessionHandle.c_str());
++ return false;
++ }
++
++ return sessions[sessionHandle]->status != STOPPED;
++}
++
++bool get_line_intersection(double p0_x, double p0_y, double p1_x, double p1_y, double p2_x, double p2_y, double p3_x, double p3_y, double* i_x, double* i_y) {
++ float s1_x, s1_y, s2_x, s2_y;
++ s1_x = p1_x - p0_x;
++ s1_y = p1_y - p0_y;
++ s2_x = p3_x - p2_x;
++ s2_y = p3_y - p2_y;
++
++ float s, t;
++ s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / (-s2_x * s1_y + s1_x * s2_y);
++ t = (s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / (-s2_x * s1_y + s1_x * s2_y);
++
++ if (s >= 0 && s <= 1 && t >= 0 && t <= 1) {
++ // Collision detected
++ if (i_x != NULL)
++ *i_x = p0_x + (t * s1_x);
++ if (i_y != NULL)
++ *i_y = p0_y + (t * s1_y);
++ return 1;
++ }
++
++ return 0; // No collision
++}
++
++bool testCollision(Barrier barrier, double px, double py, double nx, double ny) {
++ return get_line_intersection(barrier.x1, barrier.y1, barrier.x2, barrier.y2, px, py, nx, ny, nullptr, nullptr);
++}
++
++uint32_t CInputCapturePortal::Session::isColliding(double px, double py, double nx, double ny) {
++ for (const auto& [key, value] : barriers) {
++ if (testCollision(value, px, py, nx, ny)) {
++ return key;
++ }
++ }
++
++ return 0;
++}
++
++void CInputCapturePortal::onAbsoluteMotion(double x, double y, double dx, double dy) {
++ for (const auto& [key, session] : sessions) {
++ int matched = session->isColliding(x, y, x - dx, y - dy);
++ if (matched != 0) {
++ activate(key, x, y, matched);
++ }
++ session->motion(dx, dy);
++ }
++}
++
++void CInputCapturePortal::onKey(uint32_t key, bool pressed) {
++ for (const auto& [_, value] : sessions) {
++ value->key(key, pressed);
++ }
++}
++
++void CInputCapturePortal::onButton(uint32_t button, bool pressed) {
++ for (const auto& [_, session] : sessions) {
++ session->button(button, pressed);
++ }
++}
++
++void CInputCapturePortal::onAxis(bool axis, double value) {
++ for (const auto& [_, session] : sessions) {
++ session->axis(axis, value);
++ }
++}
++
++void CInputCapturePortal::onAxisValue120(bool axis, int32_t value120) {
++ for (const auto& [_, session] : sessions) {
++ session->axisValue120(axis, value120);
++ }
++}
++
++void CInputCapturePortal::onAxisStop(bool axis) {
++ for (const auto& [_, session] : sessions) {
++ session->axisStop(axis);
++ }
++}
++
++void CInputCapturePortal::onFrame() {
++ for (const auto& [_, session] : sessions) {
++ session->frame();
++ }
++}
++
++void CInputCapturePortal::activate(sdbus::ObjectPath sessionHandle, double x, double y, uint32_t borderId) {
++ if (!sessionValid(sessionHandle))
++ return;
++
++ auto session = sessions[sessionHandle];
++ if (!session->activate(x, y, borderId))
++ return;
++
++ auto signal = m_pObject->createSignal(INTERFACE_NAME, "Activated");
++ signal << sessionHandle;
++
++ g_pPortalManager->m_sPortals.inputCapture->INTERFACE_NAME;
++
++ std::unordered_map<std::string, sdbus::Variant> results;
++ results["activation_id"] = session->activationId;
++ results["cursor_position"] = sdbus::Struct<double, double>(x, y);
++ results["barrier_id"] = borderId;
++ signal << results;
++
++ m_pObject->emitSignal(signal);
++}
++
++bool CInputCapturePortal::Session::activate(double x, double y, uint32_t borderId) {
++ if (status != ENABLED) {
++ return false;
++ }
++
++ activationId += 5;
++ status = ACTIVATED;
++ Debug::log(LOG, "[input-capture] Input captured for {} activationId: {}", sessionHandle.c_str(), activationId);
++ eis->startEmulating(activationId);
++ //TODO: capture the pointer
++
++ return true;
++}
++
++void CInputCapturePortal::deactivate(sdbus::ObjectPath sessionHandle) {
++ if (!sessionValid(sessionHandle))
++ return;
++
++ auto session = sessions[sessionHandle];
++ if (!session->deactivate())
++ return;
++
++ auto signal = m_pObject->createSignal(INTERFACE_NAME, "Deactivated");
++ signal << sessionHandle;
++ std::unordered_map<std::string, sdbus::Variant> options;
++ options["activation_id"] = session->activationId;
++ signal << options;
++
++ m_pObject->emitSignal(signal);
++
++ //TODO: release the pointer
++}
++
++bool CInputCapturePortal::Session::deactivate() {
++ if (status != ACTIVATED) {
++ return false;
++ }
++
++ Debug::log(LOG, "[input-capture] Input released for {}", sessionHandle.c_str());
++ eis->stopEmulating();
++
++ status = ENABLED;
++
++ return true;
++}
++
++void CInputCapturePortal::zonesChanged() {
++ if (sessions.empty())
++ return;
++
++ Debug::log(LOG, "[input-capture] Monitor layout has changed, notifing clients");
++
++ for (auto& [key, value] : sessions) {
++ if (!value->zoneChanged())
++ continue;
++
++ auto signal = m_pObject->createSignal(INTERFACE_NAME, "Deactivated");
++ signal << key;
++
++ std::unordered_map<std::string, sdbus::Variant> options;
++ signal << options;
++
++ m_pObject->emitSignal(signal);
++ }
++}
++
++bool CInputCapturePortal::Session::zoneChanged() {
++ //TODO: notify EIS
++ return true;
++}
++
++void CInputCapturePortal::disable(sdbus::ObjectPath sessionHandle) {
++ if (!sessionValid(sessionHandle))
++ return;
++
++ auto session = sessions[sessionHandle];
++ if (!session->disable())
++ return;
++
++ if (session->status == ACTIVATED)
++ deactivate(sessionHandle);
++
++ auto signal = m_pObject->createSignal(INTERFACE_NAME, "Disable");
++ signal << sessionHandle;
++
++ std::unordered_map<std::string, sdbus::Variant> options;
++ signal << options;
++
++ m_pObject->emitSignal(signal);
++}
++
++bool CInputCapturePortal::Session::disable() {
++ status = STOPPED;
++
++ Debug::log(LOG, "[input-capture] Session {} disabled", sessionHandle.c_str());
++ return true;
++}
++
++void CInputCapturePortal::Session::motion(double dx, double dy) {
++ if (status != ACTIVATED)
++ return;
++
++ eis->sendMotion(dx, dy);
++}
++
++void CInputCapturePortal::Session::key(uint32_t key, bool pressed) {
++ if (status != ACTIVATED)
++ return;
++
++ eis->sendKey(key, pressed);
++}
++
++void CInputCapturePortal::Session::button(uint32_t button, bool pressed) {
++ if (status != ACTIVATED)
++ return;
++
++ eis->sendButton(button, pressed);
++}
++
++void CInputCapturePortal::Session::axis(bool axis, double value) {
++ if (status != ACTIVATED)
++ return;
++
++ double x = 0;
++ double y = 0;
++
++ if (axis) {
++ x = value;
++ } else {
++ y = value;
++ }
++
++ eis->sendScrollDelta(x, y);
++}
++
++void CInputCapturePortal::Session::axisValue120(bool axis, int32_t value) {
++ if (status != ACTIVATED)
++ return;
++
++ int32_t x = 0;
++ int32_t y = 0;
++
++ if (axis) {
++ x = value;
++ } else {
++ y = value;
++ }
++
++ eis->sendScrollDiscrete(x, y);
++}
++
++void CInputCapturePortal::Session::axisStop(bool axis) {
++ eis->sendScrollStop(axis, !axis);
++}
++
++void CInputCapturePortal::Session::frame() {
++ eis->sendPointerFrame();
++}
+diff --git a/src/portals/InputCapture.hpp b/src/portals/InputCapture.hpp
+new file mode 100644
+index 0000000..0ab78d1
+--- /dev/null
++++ b/src/portals/InputCapture.hpp
+@@ -0,0 +1,96 @@
++#pragma once
++#include "hyprland-input-capture-v1.hpp"
++#include "shared/Eis.hpp"
++#include <cstdint>
++#include <sdbus-c++/Types.h>
++#include <sdbus-c++/sdbus-c++.h>
++#include <string>
++#include <unordered_map>
++#include <wayland-client-protocol.h>
++#include "../includes.hpp"
++#include "../shared/Session.hpp"
++
++typedef int ClientStatus;
++const ClientStatus CREATED = 0; //Is ready to be activated
++const ClientStatus ENABLED = 1; //Is ready for receiving inputs
++const ClientStatus ACTIVATED = 2; //Currently receiving inputs
++const ClientStatus STOPPED = 3; //Can no longer be activated
++
++struct Barrier {
++ uint id;
++ int x1, y1, x2, y2;
++};
++
++class CInputCapturePortal {
++ public:
++ CInputCapturePortal(SP<CCHyprlandInputCaptureManagerV1> mgr);
++
++ void onCreateSession(sdbus::MethodCall& methodCall);
++ void onGetZones(sdbus::MethodCall& methodCall);
++ void onSetPointerBarriers(sdbus::MethodCall& methodCall);
++ void onEnable(sdbus::MethodCall& methodCall);
++ void onDisable(sdbus::MethodCall& methodCall);
++ void onRelease(sdbus::MethodCall& methodCall);
++ void onConnectToEIS(sdbus::MethodCall& methodCall);
++
++ void onAbsoluteMotion(double x, double y, double dx, double dy);
++ void onKey(uint32_t key, bool pressed);
++ void onButton(uint32_t button, bool pressed);
++ void onAxis(bool axis, double value);
++ void onAxisValue120(bool axis, int32_t value120);
++ void onAxisStop(bool axis);
++ void onFrame();
++
++ void zonesChanged();
++
++ struct Session {
++ std::string appid;
++ sdbus::ObjectPath requestHandle, sessionHandle;
++ std::string sessionId;
++ uint32_t capabilities;
++
++ std::unique_ptr<SDBusRequest> request;
++ std::unique_ptr<SDBusSession> session;
++ std::unique_ptr<EmulatedInputServer> eis;
++
++ std::unordered_map<uint32_t, Barrier> barriers;
++ uint32_t activationId;
++ ClientStatus status;
++
++ //
++ bool activate(double x, double y, uint32_t borderId);
++ bool deactivate();
++ bool disable();
++ bool zoneChanged();
++
++ void motion(double dx, double dy);
++ void key(uint32_t key, bool pressed);
++ void button(uint32_t button, bool pressed);
++ void axis(bool axis, double value);
++ void axisValue120(bool axis, int32_t value120);
++ void axisStop(bool axis);
++ void frame();
++
++ uint32_t isColliding(double px, double py, double nx, double ny);
++ };
++
++ private:
++ struct {
++ SP<CCHyprlandInputCaptureManagerV1> manager;
++ } m_sState;
++
++ std::unordered_map<std::string, const std::shared_ptr<Session>> sessions;
++ //
++ std::unique_ptr<sdbus::IObject> m_pObject;
++ uint sessionCounter;
++ uint lastZoneSet;
++
++ const std::string INTERFACE_NAME = "org.freedesktop.impl.portal.InputCapture";
++ const std::string OBJECT_PATH = "/org/freedesktop/portal/desktop";
++
++ bool sessionValid(sdbus::ObjectPath sessionHandle);
++
++ void activate(sdbus::ObjectPath sessionHandle, double x, double y, uint32_t borderId);
++ void deactivate(sdbus::ObjectPath sessionHandle);
++ void disable(sdbus::ObjectPath sessionHandle);
++};
+diff --git a/src/shared/Eis.cpp b/src/shared/Eis.cpp
+new file mode 100644
+index 0000000..2bab58c
+--- /dev/null
++++ b/src/shared/Eis.cpp
+@@ -0,0 +1,287 @@
++#include "Eis.hpp"
++#include "core/PortalManager.hpp"
++#include "src/helpers/Log.hpp"
++#include <libeis.h>
++#include <string>
++#include <sys/poll.h>
++#include <thread>
++
++EmulatedInputServer::EmulatedInputServer(std::string socketName) {
++ Debug::log(LOG, "[EIS] init socket: {}", socketName);
++
++ const char* xdg = getenv("XDG_RUNTIME_DIR");
++ if (xdg)
++ socketPath = std::string(xdg) + "/" + socketName;
++
++ if (socketPath.empty()) {
++ Debug::log(ERR, "[EIS] Socket path is empty");
++ return;
++ }
++
++ client.handle = NULL;
++ client.seat = NULL;
++ client.pointer = NULL;
++ client.keyboard = NULL;
++ eis = eis_new(NULL);
++
++ if (eis_setup_backend_socket(eis, socketPath.c_str())) {
++ Debug::log(ERR, "[EIS] Cannot init eis socket on {}", socketPath);
++ return;
++ }
++ Debug::log(LOG, "[EIS] Listening on {}", socketPath);
++
++ stop = false;
++ std::thread thread(&EmulatedInputServer::listen, this);
++ thread.detach();
++}
++
++void EmulatedInputServer::listen() {
++ struct pollfd fds = {
++ .fd = eis_get_fd(eis),
++ .events = POLLIN,
++ .revents = 0,
++ };
++ int nevents;
++ //Pull foverer events
++ while (!stop && (nevents = poll(&fds, 1, 1000)) > -1) {
++ eis_dispatch(eis);
++
++ //Pull every availaible events
++ while (true) {
++ eis_event* e = eis_get_event(eis);
++
++ if (!e) {
++ eis_event_unref(e);
++ break;
++ }
++
++ int rc = onEvent(e);
++ eis_event_unref(e);
++ if (rc != 0)
++ break;
++ }
++ }
++}
++
++int EmulatedInputServer::onEvent(eis_event* e) {
++ eis_client* client;
++ eis_seat* seat;
++ eis_device* device;
++
++ switch (eis_event_get_type(e)) {
++ case EIS_EVENT_CLIENT_CONNECT:
++ client = eis_event_get_client(e);
++ Debug::log(LOG, "[EIS] {} client connected: {}", eis_client_is_sender(client) ? "sender" : "receiver", eis_client_get_name(client));
++
++ if (eis_client_is_sender(client)) {
++ Debug::log(WARN, "[EIS] Unexpected sender client {} connected to input capture session", eis_client_get_name(client));
++ eis_client_disconnect(client);
++ return 0;
++ }
++
++ if (this->client.handle != nullptr) {
++ Debug::log(WARN, "[EIS] Unexpected additional client {} connected to input capture session", eis_client_get_name(client));
++ eis_client_disconnect(client);
++ return 0;
++ }
++
++ this->client.handle = client;
++
++ eis_client_connect(client);
++ Debug::log(LOG, "[EIS] creating new default seat");
++ seat = eis_client_new_seat(client, "default");
++
++ eis_seat_configure_capability(seat, EIS_DEVICE_CAP_POINTER);
++ eis_seat_configure_capability(seat, EIS_DEVICE_CAP_BUTTON);
++ eis_seat_configure_capability(seat, EIS_DEVICE_CAP_SCROLL);
++ eis_seat_configure_capability(seat, EIS_DEVICE_CAP_KEYBOARD);
++ eis_seat_add(seat);
++ this->client.seat = seat;
++ break;
++ case EIS_EVENT_CLIENT_DISCONNECT:
++ client = eis_event_get_client(e);
++ Debug::log(LOG, "[EIS] {} disconnected", eis_client_get_name(client));
++ eis_client_disconnect(client);
++
++ eis_seat_unref(this->client.seat);
++ clearPointer();
++ clearKeyboard();
++ this->client.handle = NULL;
++ break;
++ case EIS_EVENT_SEAT_BIND:
++ Debug::log(LOG, "[EIS] Binding seats...");
++
++ if (eis_event_seat_has_capability(e, EIS_DEVICE_CAP_POINTER) && eis_event_seat_has_capability(e, EIS_DEVICE_CAP_BUTTON) &&
++ eis_event_seat_has_capability(e, EIS_DEVICE_CAP_SCROLL))
++ ensurePointer(e);
++ else
++ clearPointer();
++
++ if (eis_event_seat_has_capability(e, EIS_DEVICE_CAP_KEYBOARD))
++ ensureKeyboard(e);
++ else
++ clearKeyboard();
++ break;
++ case EIS_EVENT_DEVICE_CLOSED:
++ device = eis_event_get_device(e);
++ if (device == this->client.pointer) {
++ clearPointer();
++ } else if (device == this->client.keyboard) {
++ Debug::log(LOG, "[EIS] Clearing keyboard");
++ clearKeyboard();
++ } else {
++ Debug::log(WARN, "[EIS] Unknown device to close");
++ }
++ break;
++ case EIS_EVENT_FRAME: Debug::log(LOG, "[EIS] Got event EIS_EVENT_FRAME"); break;
++ case EIS_EVENT_DEVICE_START_EMULATING: Debug::log(LOG, "[EIS] Got event EIS_EVENT_DEVICE_START_EMULATING"); break;
++ case EIS_EVENT_DEVICE_STOP_EMULATING: Debug::log(LOG, "[EIS] Got event EIS_EVENT_DEVICE_STOP_EMULATING"); break;
++ case EIS_EVENT_POINTER_MOTION: Debug::log(LOG, "[EIS] Got event EIS_EVENT_POINTER_MOTION"); break;
++ case EIS_EVENT_POINTER_MOTION_ABSOLUTE: Debug::log(LOG, "[EIS] Got event EIS_EVENT_POINTER_MOTION_ABSOLUTE"); break;
++ case EIS_EVENT_BUTTON_BUTTON: Debug::log(LOG, "[EIS] Got event EIS_EVENT_BUTTON_BUTTON"); break;
++ case EIS_EVENT_SCROLL_DELTA: Debug::log(LOG, "[EIS] Got event EIS_EVENT_SCROLL_DELTA"); break;
++ case EIS_EVENT_SCROLL_STOP: Debug::log(LOG, "[EIS] Got event EIS_EVENT_SCROLL_STOP"); break;
++ case EIS_EVENT_SCROLL_CANCEL: Debug::log(LOG, "[EIS] Got event EIS_EVENT_SCROLL_CANCEL"); break;
++ case EIS_EVENT_SCROLL_DISCRETE: Debug::log(LOG, "[EIS] Got event EIS_EVENT_SCROLL_DISCRETE"); break;
++ case EIS_EVENT_KEYBOARD_KEY: Debug::log(LOG, "[EIS] Got event EIS_EVENT_KEYBOARD_KEY"); break;
++ case EIS_EVENT_TOUCH_DOWN: Debug::log(LOG, "[EIS] Got event EIS_EVENT_TOUCH_DOWN"); break;
++ case EIS_EVENT_TOUCH_UP: Debug::log(LOG, "[EIS] Got event EIS_EVENT_TOUCH_UP"); break;
++ case EIS_EVENT_TOUCH_MOTION: Debug::log(LOG, "[EIS] Got event EIS_EVENT_TOUCH_MOTION"); break;
++ }
++ return 0;
++}
++
++void EmulatedInputServer::ensurePointer(eis_event* event) {
++ if (client.pointer != nullptr)
++ return;
++
++ struct eis_device* pointer = eis_seat_new_device(client.seat);
++ eis_device_configure_name(pointer, "captured relative pointer");
++ eis_device_configure_capability(pointer, EIS_DEVICE_CAP_POINTER);
++ eis_device_configure_capability(pointer, EIS_DEVICE_CAP_BUTTON);
++ eis_device_configure_capability(pointer, EIS_DEVICE_CAP_SCROLL);
++
++ for (auto& o : g_pPortalManager->getAllOutputs()) {
++ struct eis_region* r = eis_device_new_region(pointer);
++
++ eis_region_set_offset(r, o->x, o->y);
++ eis_region_set_size(r, o->width, o->height);
++ eis_region_set_physical_scale(r, o->scale);
++ eis_region_add(r);
++ eis_region_unref(r);
++ }
++
++ eis_device_add(pointer);
++ eis_device_resume(pointer);
++
++ client.pointer = pointer;
++}
++
++void EmulatedInputServer::ensureKeyboard(eis_event* event) {
++ if (client.keyboard != nullptr)
++ return;
++
++ struct eis_device* keyboard = eis_seat_new_device(client.seat);
++ eis_device_configure_name(keyboard, "captured keyboard");
++ eis_device_configure_capability(keyboard, EIS_DEVICE_CAP_KEYBOARD);
++ // TODO: layout
++ eis_device_add(keyboard);
++ eis_device_resume(keyboard);
++
++ client.keyboard = keyboard;
++}
++
++//TODO: remove and re-add devices when monitors change (see: mutter/meta-input-capture-session.c:1107)
++
++void EmulatedInputServer::clearPointer() {
++ if (client.pointer == nullptr)
++ return;
++ Debug::log(LOG, "[EIS] Clearing pointer");
++
++ eis_device_remove(client.pointer);
++ eis_device_unref(client.pointer);
++ client.pointer = nullptr;
++}
++
++void EmulatedInputServer::clearKeyboard() {
++ if (client.keyboard == nullptr)
++ return;
++ Debug::log(LOG, "[EIS] Clearing keyboard");
++
++ eis_device_remove(client.keyboard);
++ eis_device_unref(client.keyboard);
++ client.keyboard = nullptr;
++}
++
++int EmulatedInputServer::getFileDescriptor() {
++ return eis_backend_fd_add_client(eis);
++}
++
++void EmulatedInputServer::startEmulating(int sequence) {
++ Debug::log(LOG, "[EIS] Start Emulating");
++
++ if (client.pointer != nullptr)
++ eis_device_start_emulating(client.pointer, sequence);
++
++ if (client.keyboard != nullptr)
++ eis_device_start_emulating(client.keyboard, sequence);
++}
++
++void EmulatedInputServer::stopEmulating() {
++ Debug::log(LOG, "[EIS] Stop Emulating");
++
++ if (client.pointer != nullptr)
++ eis_device_stop_emulating(client.pointer);
++
++ if (client.keyboard != nullptr)
++ eis_device_stop_emulating(client.keyboard);
++}
++
++void EmulatedInputServer::sendMotion(double x, double y) {
++ if (client.pointer == nullptr)
++ return;
++ eis_device_pointer_motion(client.pointer, x, y);
++}
++
++void EmulatedInputServer::sendKey(uint32_t key, bool pressed) {
++ if (client.keyboard == nullptr)
++ return;
++ uint64_t now = eis_now(eis);
++ eis_device_keyboard_key(client.keyboard, key, pressed);
++ eis_device_frame(client.keyboard, now);
++}
++
++void EmulatedInputServer::sendButton(uint32_t button, bool pressed) {
++ if (client.pointer == nullptr)
++ return;
++ eis_device_button_button(client.pointer, button, pressed);
++}
++
++void EmulatedInputServer::sendScrollDiscrete(int32_t x, int32_t y) {
++ if (client.pointer == nullptr)
++ return;
++ eis_device_scroll_discrete(client.pointer, x, y);
++}
++
++void EmulatedInputServer::sendScrollDelta(double x, double y) {
++ if (client.pointer == nullptr)
++ return;
++ eis_device_scroll_delta(client.pointer, x, y);
++}
++
++void EmulatedInputServer::sendScrollStop(bool x, bool y) {
++ if (client.pointer == nullptr)
++ return;
++ eis_device_scroll_stop(client.pointer, x, y);
++}
++
++void EmulatedInputServer::sendPointerFrame() {
++ if (client.pointer == nullptr)
++ return;
++ uint64_t now = eis_now(eis);
++ eis_device_frame(client.pointer, now);
++}
++
++void EmulatedInputServer::stopServer() {
++ stop = true;
++}
+diff --git a/src/shared/Eis.hpp b/src/shared/Eis.hpp
+new file mode 100644
+index 0000000..63b4e78
+--- /dev/null
++++ b/src/shared/Eis.hpp
+@@ -0,0 +1,49 @@
++#pragma once
++
++#include <libeis.h>
++#include <string>
++#include <sys/socket.h>
++
++struct EisClient {
++ struct eis_client* handle;
++ struct eis_seat* seat;
++
++ struct eis_device* pointer;
++ struct eis_device* keyboard;
++};
++
++/*
++ * Responsible to creating a socket for input communication
++ */
++class EmulatedInputServer {
++ public:
++ EmulatedInputServer(std::string socketPath);
++ std::string socketPath;
++
++ void startEmulating(int activationId);
++ void stopEmulating();
++
++ void sendMotion(double x, double y);
++ void sendKey(uint32_t key, bool pressed);
++ void sendButton(uint32_t button, bool pressed);
++ void sendScrollDelta(double x, double y);
++ void sendScrollDiscrete(int32_t x, int32_t y);
++ void sendScrollStop(bool stopX, bool stopY);
++ void sendPointerFrame();
++
++ int getFileDescriptor();
++
++ void stopServer();
++
++ private:
++ bool stop;
++ struct eis* eis;
++ EisClient client;
++
++ int onEvent(eis_event* e);
++ void listen();
++ void ensurePointer(eis_event* event);
++ void ensureKeyboard(eis_event* event);
++ void clearPointer();
++ void clearKeyboard();
++};
+
+From 10a8c5a0d1a6d9bbdbec4534d25025c0ce49e332 Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Thu, 26 Sep 2024 08:51:21 +0200
+Subject: [PATCH 02/17] input-capture: inhibit inputs
+
+---
+ src/portals/InputCapture.cpp | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/src/portals/InputCapture.cpp b/src/portals/InputCapture.cpp
+index 8f9557f..266e0ef 100644
+--- a/src/portals/InputCapture.cpp
++++ b/src/portals/InputCapture.cpp
+@@ -422,6 +422,8 @@ void CInputCapturePortal::activate(sdbus::ObjectPath sessionHandle, double x, do
+ if (!session->activate(x, y, borderId))
+ return;
+
++ m_sState.manager->sendCapture();
++
+ auto signal = m_pObject->createSignal(INTERFACE_NAME, "Activated");
+ signal << sessionHandle;
+
+@@ -445,7 +447,6 @@ bool CInputCapturePortal::Session::activate(double x, double y, uint32_t borderI
+ status = ACTIVATED;
+ Debug::log(LOG, "[input-capture] Input captured for {} activationId: {}", sessionHandle.c_str(), activationId);
+ eis->startEmulating(activationId);
+- //TODO: capture the pointer
+
+ return true;
+ }
+@@ -458,6 +459,8 @@ void CInputCapturePortal::deactivate(sdbus::ObjectPath sessionHandle) {
+ if (!session->deactivate())
+ return;
+
++ m_sState.manager->sendRelease();
++
+ auto signal = m_pObject->createSignal(INTERFACE_NAME, "Deactivated");
+ signal << sessionHandle;
+ std::unordered_map<std::string, sdbus::Variant> options;
+@@ -465,8 +468,6 @@ void CInputCapturePortal::deactivate(sdbus::ObjectPath sessionHandle) {
+ signal << options;
+
+ m_pObject->emitSignal(signal);
+-
+- //TODO: release the pointer
+ }
+
+ bool CInputCapturePortal::Session::deactivate() {
+
+From 936f1fe0b7de76b1966f5671401b2cc0b1dd5f2b Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Thu, 26 Sep 2024 11:58:04 +0200
+Subject: [PATCH 03/17] input-capture: code cleanup
+
+---
+ CMakeLists.txt | 1 -
+ src/core/PortalManager.cpp | 4 ----
+ src/core/PortalManager.hpp | 2 --
+ src/portals/InputCapture.cpp | 5 +----
+ src/portals/InputCapture.hpp | 9 ++-------
+ src/shared/Eis.cpp | 3 +--
+ src/shared/Eis.hpp | 1 -
+ 7 files changed, 4 insertions(+), 21 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 3d21329..6486c7e 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -63,7 +63,6 @@ pkg_check_modules(
+ libspa-0.2
+ libdrm
+ libeis-1.0
+- dbus-1
+ gbm
+ hyprlang>=0.2.0
+ hyprutils>=0.2.6
+diff --git a/src/core/PortalManager.cpp b/src/core/PortalManager.cpp
+index a6d8589..5eccfbb 100644
+--- a/src/core/PortalManager.cpp
++++ b/src/core/PortalManager.cpp
+@@ -1,10 +1,7 @@
+ #include "PortalManager.hpp"
+ #include "../helpers/Log.hpp"
+ #include "../helpers/MiscFunctions.hpp"
+-#include "wayland.hpp"
+
+-#include <hyprutils/memory/SharedPtr.hpp>
+-#include <memory>
+ #include <pipewire/pipewire.h>
+ #include <poll.h>
+ #include <sys/mman.h>
+@@ -12,7 +9,6 @@
+ #include <unistd.h>
+
+ #include <thread>
+-#include <vector>
+
+ SOutput::SOutput(SP<CCWlOutput> output_) : output(output_) {
+ output->setName([this](CCWlOutput* o, const char* name_) {
+diff --git a/src/core/PortalManager.hpp b/src/core/PortalManager.hpp
+index 6ca241d..a2c34e4 100644
+--- a/src/core/PortalManager.hpp
++++ b/src/core/PortalManager.hpp
+@@ -1,9 +1,7 @@
+ #pragma once
+
+-#include <cstdint>
+ #include <memory>
+ #include <sdbus-c++/sdbus-c++.h>
+-
+ #include <hyprlang.hpp>
+
+ #include "wayland.hpp"
+diff --git a/src/portals/InputCapture.cpp b/src/portals/InputCapture.cpp
+index 266e0ef..8dcd8ee 100644
+--- a/src/portals/InputCapture.cpp
++++ b/src/portals/InputCapture.cpp
+@@ -2,14 +2,11 @@
+
+ #include "../core/PortalManager.hpp"
+ #include "../helpers/Log.hpp"
++#include "../shared/Session.hpp"
+ #include "hyprland-input-capture-v1.hpp"
+-#include "shared/Session.hpp"
+-#include "src/shared/Eis.hpp"
+ #include <cstddef>
+ #include <cstdint>
+ #include <memory>
+-#include <sdbus-c++/IConnection.h>
+-#include <sdbus-c++/Types.h>
+ #include <string>
+ #include <sys/socket.h>
+ #include <sys/un.h>
+diff --git a/src/portals/InputCapture.hpp b/src/portals/InputCapture.hpp
+index 0ab78d1..5e7a880 100644
+--- a/src/portals/InputCapture.hpp
++++ b/src/portals/InputCapture.hpp
+@@ -1,14 +1,9 @@
+ #pragma once
+ #include "hyprland-input-capture-v1.hpp"
+-#include "shared/Eis.hpp"
+-#include <cstdint>
+-#include <sdbus-c++/Types.h>
+-#include <sdbus-c++/sdbus-c++.h>
+-#include <string>
+-#include <unordered_map>
+-#include <wayland-client-protocol.h>
++#include "../shared/Eis.hpp"
+ #include "../includes.hpp"
+ #include "../shared/Session.hpp"
++#include <sdbus-c++/Types.h>
+
+ typedef int ClientStatus;
+ const ClientStatus CREATED = 0; //Is ready to be activated
+diff --git a/src/shared/Eis.cpp b/src/shared/Eis.cpp
+index 2bab58c..b950de9 100644
+--- a/src/shared/Eis.cpp
++++ b/src/shared/Eis.cpp
+@@ -1,8 +1,7 @@
+ #include "Eis.hpp"
+-#include "core/PortalManager.hpp"
++#include "../core/PortalManager.hpp"
+ #include "src/helpers/Log.hpp"
+ #include <libeis.h>
+-#include <string>
+ #include <sys/poll.h>
+ #include <thread>
+
+diff --git a/src/shared/Eis.hpp b/src/shared/Eis.hpp
+index 63b4e78..9c35bbd 100644
+--- a/src/shared/Eis.hpp
++++ b/src/shared/Eis.hpp
+@@ -2,7 +2,6 @@
+
+ #include <libeis.h>
+ #include <string>
+-#include <sys/socket.h>
+
+ struct EisClient {
+ struct eis_client* handle;
+
+From cba0cba3af5fa19c69536bd093c0fd2b7918ae11 Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Mon, 30 Sep 2024 17:53:33 +0200
+Subject: [PATCH 04/17] input-capture: various fixes
+
+---
+ src/core/PortalManager.cpp | 70 +++++++-------
+ src/core/PortalManager.hpp | 26 ++++--
+ src/portals/InputCapture.cpp | 108 ++++++++++------------
+ src/portals/InputCapture.hpp | 43 ++++-----
+ src/shared/Eis.cpp | 162 ++++++++++++++-------------------
+ src/shared/Eis.hpp | 35 ++++---
+ 7 files changed, 212 insertions(+), 234 deletions(-)
+
+diff --git a/src/core/PortalManager.cpp b/src/core/PortalManager.cpp
+index 5eccfbb..365b97a 100644
+--- a/src/core/PortalManager.cpp
++++ b/src/core/PortalManager.cpp
+@@ -3,7 +3,6 @@
+ #include "../helpers/MiscFunctions.hpp"
+
+ #include <pipewire/pipewire.h>
+-#include <poll.h>
+ #include <sys/mman.h>
+ #include <fcntl.h>
+ #include <unistd.h>
+@@ -19,18 +18,18 @@ SOutput::SOutput(SP<CCWlOutput> output_) : output(output_) {
+
+ Debug::log(LOG, "Found output name {}", name);
+ });
+- output->setMode([this](CCWlOutput* r, uint32_t flags, int32_t width, int32_t height, int32_t refresh) {
+- refreshRate = refresh;
+- this->width = width;
+- this->height = height;
++ output->setMode([this](CCWlOutput* r, uint32_t flags, int32_t width_, int32_t height_, int32_t refresh) {
++ refreshRate = refresh;
++ width = width_;
++ height = height_;
+ });
+ output->setGeometry(
+- [this](CCWlOutput* r, int32_t x, int32_t y, int32_t physical_width, int32_t physical_height, int32_t subpixel, const char* make, const char* model, int32_t transform_) {
++ [this](CCWlOutput* r, int32_t x_, int32_t y_, int32_t physical_width, int32_t physical_height, int32_t subpixel, const char* make, const char* model, int32_t transform_) {
+ transform = (wl_output_transform)transform_;
+- this->x = x;
+- this->y = y;
++ x = x_;
++ y = y_;
+ });
+- output->setScale([this](CCWlOutput* r, uint32_t factor) { this->scale = factor; });
++ output->setScale([this](CCWlOutput* r, uint32_t factor_) { scale = factor_; });
+ output->setDone([](CCWlOutput* r) { g_pPortalManager->m_sPortals.inputCapture->zonesChanged(); });
+ }
+
+@@ -277,32 +276,21 @@ void CPortalManager::init() {
+ }
+
+ void CPortalManager::startEventLoop() {
++ addFdToEventLoop(m_pConnection->getEventLoopPollData().fd, POLLIN, nullptr);
++ addFdToEventLoop(wl_display_get_fd(m_sWaylandConnection.display), POLLIN, nullptr);
++ addFdToEventLoop(pw_loop_get_fd(m_sPipewire.loop), POLLIN, nullptr);
+
+- pollfd pollfds[] = {
+- {
+- .fd = m_pConnection->getEventLoopPollData().fd,
+- .events = POLLIN,
+- },
+- {
+- .fd = wl_display_get_fd(m_sWaylandConnection.display),
+- .events = POLLIN,
+- },
+- {
+- .fd = pw_loop_get_fd(m_sPipewire.loop),
+- .events = POLLIN,
+- },
+- };
+-
+- std::thread pollThr([this, &pollfds]() {
++ std::thread pollThr([this]() {
+ while (1) {
+- int ret = poll(pollfds, 3, 5000 /* 5 seconds, reasonable. It's because we might need to terminate */);
++
++ int ret = poll(m_sEventLoopInternals.pollFds.data(), m_sEventLoopInternals.pollFds.size(), 5000 /* 5 seconds, reasonable. It's because we might need to terminate */);
+ if (ret < 0) {
+ Debug::log(CRIT, "[core] Polling fds failed with {}", strerror(errno));
+ g_pPortalManager->terminate();
+ }
+
+ for (size_t i = 0; i < 3; ++i) {
+- if (pollfds[i].revents & POLLHUP) {
++ if (m_sEventLoopInternals.pollFds.data()->revents & POLLHUP) {
+ Debug::log(CRIT, "[core] Disconnected from pollfd id {}", i);
+ g_pPortalManager->terminate();
+ }
+@@ -375,13 +363,13 @@ void CPortalManager::startEventLoop() {
+
+ m_mEventLock.lock();
+
+- if (pollfds[0].revents & POLLIN /* dbus */) {
+- while (m_pConnection->processPendingEvent()) {
++ if (m_sEventLoopInternals.pollFds[0].revents & POLLIN /* dbus */) {
++ while (m_pConnection->processPendingRequest()) {
+ ;
+ }
+ }
+
+- if (pollfds[1].revents & POLLIN /* wl */) {
++ if (m_sEventLoopInternals.pollFds[1].revents & POLLIN /* wl */) {
+ wl_display_flush(m_sWaylandConnection.display);
+ if (wl_display_prepare_read(m_sWaylandConnection.display) == 0) {
+ wl_display_read_events(m_sWaylandConnection.display);
+@@ -391,12 +379,18 @@ void CPortalManager::startEventLoop() {
+ }
+ }
+
+- if (pollfds[2].revents & POLLIN /* pw */) {
++ if (m_sEventLoopInternals.pollFds[2].revents & POLLIN /* pw */) {
+ while (pw_loop_iterate(m_sPipewire.loop, 0) != 0) {
+ ;
+ }
+ }
+
++ for (pollfd p : m_sEventLoopInternals.pollFds) {
++ if (p.revents & POLLIN && m_sEventLoopInternals.pollCallbacks.contains(p.fd)) {
++ m_sEventLoopInternals.pollCallbacks[p.fd]();
++ }
++ }
++
+ std::vector<CTimer*> toRemove;
+ for (auto& t : m_sTimersThread.timers) {
+ if (t->passed()) {
+@@ -500,6 +494,20 @@ void CPortalManager::addTimer(const CTimer& timer) {
+ m_sTimersThread.loopSignal.notify_all();
+ }
+
++void CPortalManager::addFdToEventLoop(int fd, short events, std::function<void()> callback) {
++ m_sEventLoopInternals.pollFds.emplace_back(pollfd{.fd = fd, .events = POLLIN});
++
++ if (callback == nullptr)
++ return;
++
++ m_sEventLoopInternals.pollCallbacks[fd] = callback;
++}
++
++void CPortalManager::removeFdFromEventLoop(int fd) {
++ std::erase_if(m_sEventLoopInternals.pollFds, [fd](const pollfd& p) { return p.fd == fd; });
++ m_sEventLoopInternals.pollCallbacks.erase(fd);
++}
++
+ void CPortalManager::terminate() {
+ m_bTerminate = true;
+
+diff --git a/src/core/PortalManager.hpp b/src/core/PortalManager.hpp
+index a2c34e4..c10e121 100644
+--- a/src/core/PortalManager.hpp
++++ b/src/core/PortalManager.hpp
+@@ -12,6 +12,7 @@
+ #include "../helpers/Timer.hpp"
+ #include "../shared/ToplevelManager.hpp"
+ #include <gbm.h>
++#include <poll.h>
+ #include <xf86drm.h>
+
+ #include "hyprland-toplevel-export-v1.hpp"
+@@ -34,9 +35,11 @@ struct SOutput {
+ uint32_t id = 0;
+ float refreshRate = 60.0;
+ wl_output_transform transform = WL_OUTPUT_TRANSFORM_NORMAL;
+- uint32_t width, height;
+- int32_t x, y;
+- int32_t scale;
++ uint32_t width = 0;
++ uint32_t height = 0;
++ int32_t x = 0;
++ int32_t y = 0;
++ int32_t scale = 1;
+ };
+
+ struct SDMABUFModifier {
+@@ -50,8 +53,8 @@ class CPortalManager {
+
+ void init();
+
+- void onGlobal(uint32_t name, const char* interface, uint32_t version);
+- void onGlobalRemoved(uint32_t name);
++ void onGlobal(uint32_t name, const char* interface, uint32_t version);
++ void onGlobalRemoved(uint32_t name);
+
+ sdbus::IConnection* getConnection();
+ SOutput* getOutputFromName(const std::string& name);
+@@ -98,6 +101,9 @@ class CPortalManager {
+
+ gbm_device* createGBMDevice(drmDevice* dev);
+
++ void addFdToEventLoop(int fd, short events, std::function<void()> callback);
++ void removeFdFromEventLoop(int fd);
++
+ // terminate after the event loop has been created. Before we can exit()
+ void terminate();
+
+@@ -108,10 +114,12 @@ class CPortalManager {
+ pid_t m_iPID = 0;
+
+ struct {
+- std::condition_variable loopSignal;
+- std::mutex loopMutex;
+- std::atomic<bool> shouldProcess = false;
+- std::mutex loopRequestMutex;
++ std::condition_variable loopSignal;
++ std::mutex loopMutex;
++ std::atomic<bool> shouldProcess = false;
++ std::mutex loopRequestMutex;
++ std::vector<pollfd> pollFds;
++ std::map<int, std::function<void()>> pollCallbacks;
+ } m_sEventLoopInternals;
+
+ struct {
+diff --git a/src/portals/InputCapture.cpp b/src/portals/InputCapture.cpp
+index 8dcd8ee..c3030b2 100644
+--- a/src/portals/InputCapture.cpp
++++ b/src/portals/InputCapture.cpp
+@@ -13,14 +13,11 @@
+ #include <unordered_map>
+ #include <wayland-util.h>
+
+-CInputCapturePortal::CInputCapturePortal(SP<CCHyprlandInputCaptureManagerV1> mgr) {
++CInputCapturePortal::CInputCapturePortal(SP<CCHyprlandInputCaptureManagerV1> mgr) : m_sState(mgr) {
+ Debug::log(LOG, "[input-capture] initializing input capture portal");
+- m_sState.manager = mgr;
+- sessionCounter = 0;
+- lastZoneSet = 0;
+
+- mgr->setAbsoluteMotion([this](CCHyprlandInputCaptureManagerV1* r, wl_fixed_t x, wl_fixed_t y, wl_fixed_t dx, wl_fixed_t dy) {
+- onAbsoluteMotion(wl_fixed_to_double(x), wl_fixed_to_double(y), wl_fixed_to_double(dx), wl_fixed_to_double(dy));
++ mgr->setMotion([this](CCHyprlandInputCaptureManagerV1* r, wl_fixed_t x, wl_fixed_t y, wl_fixed_t dx, wl_fixed_t dy) {
++ onMotion(wl_fixed_to_double(x), wl_fixed_to_double(y), wl_fixed_to_double(dx), wl_fixed_to_double(dy));
+ });
+
+ mgr->setKey([this](CCHyprlandInputCaptureManagerV1* r, uint32_t key, hyprlandInputCaptureManagerV1KeyState state) { onKey(key, state); });
+@@ -46,13 +43,12 @@ CInputCapturePortal::CInputCapturePortal(SP<CCHyprlandInputCaptureManagerV1> mgr
+ m_pObject->registerMethod(INTERFACE_NAME, "ConnectToEIS", "osa{sv}", "h", [&](sdbus::MethodCall c) { onConnectToEIS(c); });
+
+ m_pObject->registerProperty(INTERFACE_NAME, "SupportedCapabilities", "u", [](sdbus::PropertyGetReply& reply) { reply << (uint)(1 | 2); });
+- m_pObject->registerProperty(INTERFACE_NAME, "version", "u", [](sdbus::PropertyGetReply& reply) { reply << (uint)1; });
++ m_pObject->registerProperty(INTERFACE_NAME, "version", "u", [](sdbus::PropertyGetReply& reply) { reply << (uint32_t)1; });
+
+ m_pObject->finishRegistration();
+
+- for (auto& o : g_pPortalManager->getAllOutputs()) {
++ for (auto& o : g_pPortalManager->getAllOutputs())
+ Debug::log(LOG, "{} {}x{}", o->name, o->width, o->height);
+- }
+
+ Debug::log(LOG, "[input-capture] init successful");
+ }
+@@ -91,22 +87,20 @@ void CInputCapturePortal::onCreateSession(sdbus::MethodCall& call) {
+ std::string sessionId = "input-capture-" + std::to_string(sessionCounter++);
+ Debug::log(LOG, "[input-capture] | sessionId : {}", sessionId);
+
+- const std::shared_ptr<Session> session = std::make_shared<Session>();
++ const std::shared_ptr<SSession> session = std::make_shared<SSession>();
+
+ session->appid = appID;
+ session->requestHandle = requestHandle;
+ session->sessionHandle = sessionHandle;
+ session->sessionId = sessionId;
+ session->capabilities = capabilities;
+- session->activationId = 0;
+- session->status = CREATED;
+
+ session->session = createDBusSession(sessionHandle);
+ session->session->onDestroy = [session, this]() {
+- if (session->status == ACTIVATED) {
+- disable(session->sessionHandle);
+- }
++ disable(session->sessionHandle);
++
+ session->eis->stopServer();
++ session->eis = nullptr;
+ Debug::log(LOG, "[input-capture] Session {} destroyed", session->sessionHandle.c_str());
+
+ session->session.release();
+@@ -351,64 +345,56 @@ bool get_line_intersection(double p0_x, double p0_y, double p1_x, double p1_y, d
+ return 0; // No collision
+ }
+
+-bool testCollision(Barrier barrier, double px, double py, double nx, double ny) {
++bool testCollision(SBarrier barrier, double px, double py, double nx, double ny) {
+ return get_line_intersection(barrier.x1, barrier.y1, barrier.x2, barrier.y2, px, py, nx, ny, nullptr, nullptr);
+ }
+
+-uint32_t CInputCapturePortal::Session::isColliding(double px, double py, double nx, double ny) {
+- for (const auto& [key, value] : barriers) {
+- if (testCollision(value, px, py, nx, ny)) {
++uint32_t CInputCapturePortal::SSession::isColliding(double px, double py, double nx, double ny) {
++ for (const auto& [key, value] : barriers)
++ if (testCollision(value, px, py, nx, ny))
+ return key;
+- }
+- }
+
+ return 0;
+ }
+
+-void CInputCapturePortal::onAbsoluteMotion(double x, double y, double dx, double dy) {
++void CInputCapturePortal::onMotion(double x, double y, double dx, double dy) {
+ for (const auto& [key, session] : sessions) {
+ int matched = session->isColliding(x, y, x - dx, y - dy);
+- if (matched != 0) {
++ if (matched != 0)
+ activate(key, x, y, matched);
+- }
++
+ session->motion(dx, dy);
+ }
+ }
+
+-void CInputCapturePortal::onKey(uint32_t key, bool pressed) {
+- for (const auto& [_, value] : sessions) {
+- value->key(key, pressed);
+- }
++void CInputCapturePortal::onKey(uint32_t id, bool pressed) {
++ for (const auto& [key, value] : sessions)
++ value->key(id, pressed);
+ }
+
+ void CInputCapturePortal::onButton(uint32_t button, bool pressed) {
+- for (const auto& [_, session] : sessions) {
++ for (const auto& [key, session] : sessions)
+ session->button(button, pressed);
+- }
+ }
+
+ void CInputCapturePortal::onAxis(bool axis, double value) {
+- for (const auto& [_, session] : sessions) {
++ for (const auto& [key, session] : sessions)
+ session->axis(axis, value);
+- }
+ }
+
+ void CInputCapturePortal::onAxisValue120(bool axis, int32_t value120) {
+- for (const auto& [_, session] : sessions) {
++ for (const auto& [key, session] : sessions)
+ session->axisValue120(axis, value120);
+- }
+ }
+
+ void CInputCapturePortal::onAxisStop(bool axis) {
+- for (const auto& [_, session] : sessions) {
++ for (const auto& [_, session] : sessions)
+ session->axisStop(axis);
+- }
+ }
+
+ void CInputCapturePortal::onFrame() {
+- for (const auto& [_, session] : sessions) {
++ for (const auto& [_, session] : sessions)
+ session->frame();
+- }
+ }
+
+ void CInputCapturePortal::activate(sdbus::ObjectPath sessionHandle, double x, double y, uint32_t borderId) {
+@@ -435,7 +421,7 @@ void CInputCapturePortal::activate(sdbus::ObjectPath sessionHandle, double x, do
+ m_pObject->emitSignal(signal);
+ }
+
+-bool CInputCapturePortal::Session::activate(double x, double y, uint32_t borderId) {
++bool CInputCapturePortal::SSession::activate(double x, double y, uint32_t borderId) {
+ if (status != ENABLED) {
+ return false;
+ }
+@@ -467,10 +453,9 @@ void CInputCapturePortal::deactivate(sdbus::ObjectPath sessionHandle) {
+ m_pObject->emitSignal(signal);
+ }
+
+-bool CInputCapturePortal::Session::deactivate() {
+- if (status != ACTIVATED) {
++bool CInputCapturePortal::SSession::deactivate() {
++ if (status != ACTIVATED)
+ return false;
+- }
+
+ Debug::log(LOG, "[input-capture] Input released for {}", sessionHandle.c_str());
+ eis->stopEmulating();
+@@ -500,7 +485,7 @@ void CInputCapturePortal::zonesChanged() {
+ }
+ }
+
+-bool CInputCapturePortal::Session::zoneChanged() {
++bool CInputCapturePortal::SSession::zoneChanged() {
+ //TODO: notify EIS
+ return true;
+ }
+@@ -510,12 +495,13 @@ void CInputCapturePortal::disable(sdbus::ObjectPath sessionHandle) {
+ return;
+
+ auto session = sessions[sessionHandle];
+- if (!session->disable())
+- return;
+
+ if (session->status == ACTIVATED)
+ deactivate(sessionHandle);
+
++ if (!session->disable())
++ return;
++
+ auto signal = m_pObject->createSignal(INTERFACE_NAME, "Disable");
+ signal << sessionHandle;
+
+@@ -525,70 +511,74 @@ void CInputCapturePortal::disable(sdbus::ObjectPath sessionHandle) {
+ m_pObject->emitSignal(signal);
+ }
+
+-bool CInputCapturePortal::Session::disable() {
++bool CInputCapturePortal::SSession::disable() {
+ status = STOPPED;
+
+ Debug::log(LOG, "[input-capture] Session {} disabled", sessionHandle.c_str());
+ return true;
+ }
+
+-void CInputCapturePortal::Session::motion(double dx, double dy) {
++void CInputCapturePortal::SSession::motion(double dx, double dy) {
+ if (status != ACTIVATED)
+ return;
+
+ eis->sendMotion(dx, dy);
+ }
+
+-void CInputCapturePortal::Session::key(uint32_t key, bool pressed) {
++void CInputCapturePortal::SSession::key(uint32_t key, bool pressed) {
+ if (status != ACTIVATED)
+ return;
+
+ eis->sendKey(key, pressed);
+ }
+
+-void CInputCapturePortal::Session::button(uint32_t button, bool pressed) {
++void CInputCapturePortal::SSession::button(uint32_t button, bool pressed) {
+ if (status != ACTIVATED)
+ return;
+
+ eis->sendButton(button, pressed);
+ }
+
+-void CInputCapturePortal::Session::axis(bool axis, double value) {
++void CInputCapturePortal::SSession::axis(bool axis, double value) {
+ if (status != ACTIVATED)
+ return;
+
+ double x = 0;
+ double y = 0;
+
+- if (axis) {
++ if (axis)
+ x = value;
+- } else {
++ else
+ y = value;
+- }
+
+ eis->sendScrollDelta(x, y);
+ }
+
+-void CInputCapturePortal::Session::axisValue120(bool axis, int32_t value) {
++void CInputCapturePortal::SSession::axisValue120(bool axis, int32_t value) {
+ if (status != ACTIVATED)
+ return;
+
+ int32_t x = 0;
+ int32_t y = 0;
+
+- if (axis) {
++ if (axis)
+ x = value;
+- } else {
++ else
+ y = value;
+- }
+
+ eis->sendScrollDiscrete(x, y);
+ }
+
+-void CInputCapturePortal::Session::axisStop(bool axis) {
++void CInputCapturePortal::SSession::axisStop(bool axis) {
++ if (status != ACTIVATED)
++ return;
++
+ eis->sendScrollStop(axis, !axis);
+ }
+
+-void CInputCapturePortal::Session::frame() {
++void CInputCapturePortal::SSession::frame() {
++ if (status != ACTIVATED)
++ return;
++
+ eis->sendPointerFrame();
+ }
+diff --git a/src/portals/InputCapture.hpp b/src/portals/InputCapture.hpp
+index 5e7a880..31e5c80 100644
+--- a/src/portals/InputCapture.hpp
++++ b/src/portals/InputCapture.hpp
+@@ -5,13 +5,14 @@
+ #include "../shared/Session.hpp"
+ #include <sdbus-c++/Types.h>
+
+-typedef int ClientStatus;
+-const ClientStatus CREATED = 0; //Is ready to be activated
+-const ClientStatus ENABLED = 1; //Is ready for receiving inputs
+-const ClientStatus ACTIVATED = 2; //Currently receiving inputs
+-const ClientStatus STOPPED = 3; //Can no longer be activated
++enum ClientStatus {
++ CREATED, //Is ready to be activated
++ ENABLED, //Is ready for receiving inputs
++ ACTIVATED, //Currently receiving inputs
++ STOPPED //Can no longer be activated
++};
+
+-struct Barrier {
++struct SBarrier {
+ uint id;
+ int x1, y1, x2, y2;
+ };
+@@ -28,7 +29,7 @@ class CInputCapturePortal {
+ void onRelease(sdbus::MethodCall& methodCall);
+ void onConnectToEIS(sdbus::MethodCall& methodCall);
+
+- void onAbsoluteMotion(double x, double y, double dx, double dy);
++ void onMotion(double x, double y, double dx, double dy);
+ void onKey(uint32_t key, bool pressed);
+ void onButton(uint32_t button, bool pressed);
+ void onAxis(bool axis, double value);
+@@ -38,19 +39,19 @@ class CInputCapturePortal {
+
+ void zonesChanged();
+
+- struct Session {
+- std::string appid;
+- sdbus::ObjectPath requestHandle, sessionHandle;
+- std::string sessionId;
+- uint32_t capabilities;
++ struct SSession {
++ std::string appid;
++ sdbus::ObjectPath requestHandle, sessionHandle;
++ std::string sessionId;
++ uint32_t capabilities = 0;
+
+- std::unique_ptr<SDBusRequest> request;
+- std::unique_ptr<SDBusSession> session;
+- std::unique_ptr<EmulatedInputServer> eis;
++ std::unique_ptr<SDBusRequest> request;
++ std::unique_ptr<SDBusSession> session;
++ std::unique_ptr<EmulatedInputServer> eis;
+
+- std::unordered_map<uint32_t, Barrier> barriers;
+- uint32_t activationId;
+- ClientStatus status;
++ std::unordered_map<uint32_t, SBarrier> barriers;
++ uint32_t activationId = 0;
++ ClientStatus status = CREATED;
+
+ //
+ bool activate(double x, double y, uint32_t borderId);
+@@ -74,11 +75,11 @@ class CInputCapturePortal {
+ SP<CCHyprlandInputCaptureManagerV1> manager;
+ } m_sState;
+
+- std::unordered_map<std::string, const std::shared_ptr<Session>> sessions;
++ std::unordered_map<std::string, const std::shared_ptr<SSession>> sessions;
+ //
+ std::unique_ptr<sdbus::IObject> m_pObject;
+- uint sessionCounter;
+- uint lastZoneSet;
++ uint sessionCounter = 0;
++ uint lastZoneSet = 0;
+
+ const std::string INTERFACE_NAME = "org.freedesktop.impl.portal.InputCapture";
+ const std::string OBJECT_PATH = "/org/freedesktop/portal/desktop";
+diff --git a/src/shared/Eis.cpp b/src/shared/Eis.cpp
+index b950de9..46fbd93 100644
+--- a/src/shared/Eis.cpp
++++ b/src/shared/Eis.cpp
+@@ -2,11 +2,9 @@
+ #include "../core/PortalManager.hpp"
+ #include "src/helpers/Log.hpp"
+ #include <libeis.h>
+-#include <sys/poll.h>
+-#include <thread>
+
+ EmulatedInputServer::EmulatedInputServer(std::string socketName) {
+- Debug::log(LOG, "[EIS] init socket: {}", socketName);
++ Debug::log(LOG, "[EIS] Init socket: {}", socketName);
+
+ const char* xdg = getenv("XDG_RUNTIME_DIR");
+ if (xdg)
+@@ -17,95 +15,80 @@ EmulatedInputServer::EmulatedInputServer(std::string socketName) {
+ return;
+ }
+
+- client.handle = NULL;
+- client.seat = NULL;
+- client.pointer = NULL;
+- client.keyboard = NULL;
+- eis = eis_new(NULL);
++ eisCtx = eis_new(nullptr);
+
+- if (eis_setup_backend_socket(eis, socketPath.c_str())) {
++ if (eis_setup_backend_socket(eisCtx, socketPath.c_str())) {
+ Debug::log(ERR, "[EIS] Cannot init eis socket on {}", socketPath);
+ return;
+ }
+ Debug::log(LOG, "[EIS] Listening on {}", socketPath);
+
+- stop = false;
+- std::thread thread(&EmulatedInputServer::listen, this);
+- thread.detach();
++ g_pPortalManager->addFdToEventLoop(eis_get_fd(eisCtx), POLLIN, std::bind(&EmulatedInputServer::pollEvents, this));
+ }
+
+-void EmulatedInputServer::listen() {
+- struct pollfd fds = {
+- .fd = eis_get_fd(eis),
+- .events = POLLIN,
+- .revents = 0,
+- };
+- int nevents;
+- //Pull foverer events
+- while (!stop && (nevents = poll(&fds, 1, 1000)) > -1) {
+- eis_dispatch(eis);
+-
+- //Pull every availaible events
+- while (true) {
+- eis_event* e = eis_get_event(eis);
+-
+- if (!e) {
+- eis_event_unref(e);
+- break;
+- }
++void EmulatedInputServer::pollEvents() {
++ eis_dispatch(eisCtx);
++
++ //Pull every availaible events
++ while (true) {
++ eis_event* e = eis_get_event(eisCtx);
+
+- int rc = onEvent(e);
++ if (!e) {
+ eis_event_unref(e);
+- if (rc != 0)
+- break;
++ break;
+ }
++
++ int rc = onEvent(e);
++ eis_event_unref(e);
++ if (rc != 0)
++ break;
+ }
+ }
+
+ int EmulatedInputServer::onEvent(eis_event* e) {
+- eis_client* client;
+- eis_seat* seat;
+- eis_device* device;
++ eis_client* eisClient = nullptr;
++ eis_seat* seat = nullptr;
++ eis_device* device = nullptr;
+
+ switch (eis_event_get_type(e)) {
+ case EIS_EVENT_CLIENT_CONNECT:
+- client = eis_event_get_client(e);
+- Debug::log(LOG, "[EIS] {} client connected: {}", eis_client_is_sender(client) ? "sender" : "receiver", eis_client_get_name(client));
++ eisClient = eis_event_get_client(e);
++ Debug::log(LOG, "[EIS] {} client connected: {}", eis_client_is_sender(eisClient) ? "Sender" : "Receiver", eis_client_get_name(eisClient));
+
+- if (eis_client_is_sender(client)) {
+- Debug::log(WARN, "[EIS] Unexpected sender client {} connected to input capture session", eis_client_get_name(client));
+- eis_client_disconnect(client);
++ if (eis_client_is_sender(eisClient)) {
++ Debug::log(WARN, "[EIS] Unexpected sender client {} connected to input capture session", eis_client_get_name(eisClient));
++ eis_client_disconnect(eisClient);
+ return 0;
+ }
+
+- if (this->client.handle != nullptr) {
+- Debug::log(WARN, "[EIS] Unexpected additional client {} connected to input capture session", eis_client_get_name(client));
+- eis_client_disconnect(client);
++ if (client.handle) {
++ Debug::log(WARN, "[EIS] Unexpected additional client {} connected to input capture session", eis_client_get_name(eisClient));
++ eis_client_disconnect(eisClient);
+ return 0;
+ }
+
+- this->client.handle = client;
++ client.handle = eisClient;
+
+- eis_client_connect(client);
+- Debug::log(LOG, "[EIS] creating new default seat");
+- seat = eis_client_new_seat(client, "default");
++ eis_client_connect(eisClient);
++ Debug::log(LOG, "[EIS] Creating new default seat");
++ seat = eis_client_new_seat(eisClient, "default");
+
+ eis_seat_configure_capability(seat, EIS_DEVICE_CAP_POINTER);
+ eis_seat_configure_capability(seat, EIS_DEVICE_CAP_BUTTON);
+ eis_seat_configure_capability(seat, EIS_DEVICE_CAP_SCROLL);
+ eis_seat_configure_capability(seat, EIS_DEVICE_CAP_KEYBOARD);
+ eis_seat_add(seat);
+- this->client.seat = seat;
++ client.seat = seat;
+ break;
+ case EIS_EVENT_CLIENT_DISCONNECT:
+- client = eis_event_get_client(e);
+- Debug::log(LOG, "[EIS] {} disconnected", eis_client_get_name(client));
+- eis_client_disconnect(client);
++ eisClient = eis_event_get_client(e);
++ Debug::log(LOG, "[EIS] {} disconnected", eis_client_get_name(eisClient));
++ eis_client_disconnect(eisClient);
+
+- eis_seat_unref(this->client.seat);
++ eis_seat_unref(client.seat);
+ clearPointer();
+ clearKeyboard();
+- this->client.handle = NULL;
++ client.handle = nullptr;
+ break;
+ case EIS_EVENT_SEAT_BIND:
+ Debug::log(LOG, "[EIS] Binding seats...");
+@@ -123,45 +106,31 @@ int EmulatedInputServer::onEvent(eis_event* e) {
+ break;
+ case EIS_EVENT_DEVICE_CLOSED:
+ device = eis_event_get_device(e);
+- if (device == this->client.pointer) {
++ if (device == client.pointer)
+ clearPointer();
+- } else if (device == this->client.keyboard) {
++ else if (device == client.keyboard) {
+ Debug::log(LOG, "[EIS] Clearing keyboard");
+ clearKeyboard();
+- } else {
++ } else
+ Debug::log(WARN, "[EIS] Unknown device to close");
+- }
+ break;
+- case EIS_EVENT_FRAME: Debug::log(LOG, "[EIS] Got event EIS_EVENT_FRAME"); break;
+- case EIS_EVENT_DEVICE_START_EMULATING: Debug::log(LOG, "[EIS] Got event EIS_EVENT_DEVICE_START_EMULATING"); break;
+- case EIS_EVENT_DEVICE_STOP_EMULATING: Debug::log(LOG, "[EIS] Got event EIS_EVENT_DEVICE_STOP_EMULATING"); break;
+- case EIS_EVENT_POINTER_MOTION: Debug::log(LOG, "[EIS] Got event EIS_EVENT_POINTER_MOTION"); break;
+- case EIS_EVENT_POINTER_MOTION_ABSOLUTE: Debug::log(LOG, "[EIS] Got event EIS_EVENT_POINTER_MOTION_ABSOLUTE"); break;
+- case EIS_EVENT_BUTTON_BUTTON: Debug::log(LOG, "[EIS] Got event EIS_EVENT_BUTTON_BUTTON"); break;
+- case EIS_EVENT_SCROLL_DELTA: Debug::log(LOG, "[EIS] Got event EIS_EVENT_SCROLL_DELTA"); break;
+- case EIS_EVENT_SCROLL_STOP: Debug::log(LOG, "[EIS] Got event EIS_EVENT_SCROLL_STOP"); break;
+- case EIS_EVENT_SCROLL_CANCEL: Debug::log(LOG, "[EIS] Got event EIS_EVENT_SCROLL_CANCEL"); break;
+- case EIS_EVENT_SCROLL_DISCRETE: Debug::log(LOG, "[EIS] Got event EIS_EVENT_SCROLL_DISCRETE"); break;
+- case EIS_EVENT_KEYBOARD_KEY: Debug::log(LOG, "[EIS] Got event EIS_EVENT_KEYBOARD_KEY"); break;
+- case EIS_EVENT_TOUCH_DOWN: Debug::log(LOG, "[EIS] Got event EIS_EVENT_TOUCH_DOWN"); break;
+- case EIS_EVENT_TOUCH_UP: Debug::log(LOG, "[EIS] Got event EIS_EVENT_TOUCH_UP"); break;
+- case EIS_EVENT_TOUCH_MOTION: Debug::log(LOG, "[EIS] Got event EIS_EVENT_TOUCH_MOTION"); break;
++ default: return 0;
+ }
+ return 0;
+ }
+
+ void EmulatedInputServer::ensurePointer(eis_event* event) {
+- if (client.pointer != nullptr)
++ if (client.pointer)
+ return;
+
+- struct eis_device* pointer = eis_seat_new_device(client.seat);
++ eis_device* pointer = eis_seat_new_device(client.seat);
+ eis_device_configure_name(pointer, "captured relative pointer");
+ eis_device_configure_capability(pointer, EIS_DEVICE_CAP_POINTER);
+ eis_device_configure_capability(pointer, EIS_DEVICE_CAP_BUTTON);
+ eis_device_configure_capability(pointer, EIS_DEVICE_CAP_SCROLL);
+
+ for (auto& o : g_pPortalManager->getAllOutputs()) {
+- struct eis_region* r = eis_device_new_region(pointer);
++ eis_region* r = eis_device_new_region(pointer);
+
+ eis_region_set_offset(r, o->x, o->y);
+ eis_region_set_size(r, o->width, o->height);
+@@ -177,10 +146,10 @@ void EmulatedInputServer::ensurePointer(eis_event* event) {
+ }
+
+ void EmulatedInputServer::ensureKeyboard(eis_event* event) {
+- if (client.keyboard != nullptr)
++ if (client.keyboard)
+ return;
+
+- struct eis_device* keyboard = eis_seat_new_device(client.seat);
++ eis_device* keyboard = eis_seat_new_device(client.seat);
+ eis_device_configure_name(keyboard, "captured keyboard");
+ eis_device_configure_capability(keyboard, EIS_DEVICE_CAP_KEYBOARD);
+ // TODO: layout
+@@ -193,7 +162,7 @@ void EmulatedInputServer::ensureKeyboard(eis_event* event) {
+ //TODO: remove and re-add devices when monitors change (see: mutter/meta-input-capture-session.c:1107)
+
+ void EmulatedInputServer::clearPointer() {
+- if (client.pointer == nullptr)
++ if (!client.pointer)
+ return;
+ Debug::log(LOG, "[EIS] Clearing pointer");
+
+@@ -203,7 +172,7 @@ void EmulatedInputServer::clearPointer() {
+ }
+
+ void EmulatedInputServer::clearKeyboard() {
+- if (client.keyboard == nullptr)
++ if (!client.keyboard)
+ return;
+ Debug::log(LOG, "[EIS] Clearing keyboard");
+
+@@ -213,74 +182,77 @@ void EmulatedInputServer::clearKeyboard() {
+ }
+
+ int EmulatedInputServer::getFileDescriptor() {
+- return eis_backend_fd_add_client(eis);
++ return eis_backend_fd_add_client(eisCtx);
+ }
+
+ void EmulatedInputServer::startEmulating(int sequence) {
+ Debug::log(LOG, "[EIS] Start Emulating");
+
+- if (client.pointer != nullptr)
++ if (client.pointer)
+ eis_device_start_emulating(client.pointer, sequence);
+
+- if (client.keyboard != nullptr)
++ if (client.keyboard)
+ eis_device_start_emulating(client.keyboard, sequence);
+ }
+
+ void EmulatedInputServer::stopEmulating() {
+ Debug::log(LOG, "[EIS] Stop Emulating");
+
+- if (client.pointer != nullptr)
++ if (client.pointer)
+ eis_device_stop_emulating(client.pointer);
+
+- if (client.keyboard != nullptr)
++ if (client.keyboard)
+ eis_device_stop_emulating(client.keyboard);
+ }
+
+ void EmulatedInputServer::sendMotion(double x, double y) {
+- if (client.pointer == nullptr)
++ if (!client.pointer)
+ return;
+ eis_device_pointer_motion(client.pointer, x, y);
+ }
+
+ void EmulatedInputServer::sendKey(uint32_t key, bool pressed) {
+- if (client.keyboard == nullptr)
++ if (!client.keyboard)
+ return;
+- uint64_t now = eis_now(eis);
++ uint64_t now = eis_now(eisCtx);
+ eis_device_keyboard_key(client.keyboard, key, pressed);
+ eis_device_frame(client.keyboard, now);
+ }
+
+ void EmulatedInputServer::sendButton(uint32_t button, bool pressed) {
+- if (client.pointer == nullptr)
++ if (!client.pointer)
+ return;
+ eis_device_button_button(client.pointer, button, pressed);
+ }
+
+ void EmulatedInputServer::sendScrollDiscrete(int32_t x, int32_t y) {
+- if (client.pointer == nullptr)
++ if (!client.pointer)
+ return;
+ eis_device_scroll_discrete(client.pointer, x, y);
+ }
+
+ void EmulatedInputServer::sendScrollDelta(double x, double y) {
+- if (client.pointer == nullptr)
++ if (!client.pointer)
+ return;
+ eis_device_scroll_delta(client.pointer, x, y);
+ }
+
+ void EmulatedInputServer::sendScrollStop(bool x, bool y) {
+- if (client.pointer == nullptr)
++ if (!client.pointer)
+ return;
+ eis_device_scroll_stop(client.pointer, x, y);
+ }
+
+ void EmulatedInputServer::sendPointerFrame() {
+- if (client.pointer == nullptr)
++ if (!client.pointer)
+ return;
+- uint64_t now = eis_now(eis);
++ uint64_t now = eis_now(eisCtx);
+ eis_device_frame(client.pointer, now);
+ }
+
+ void EmulatedInputServer::stopServer() {
+- stop = true;
++ g_pPortalManager->removeFdFromEventLoop(eis_get_fd(eisCtx));
++ Debug::log(LOG, "[EIS] Server fd {} destroyed", eis_get_fd(eisCtx));
++ eis_unref(eisCtx);
++ eisCtx = nullptr;
+ }
+diff --git a/src/shared/Eis.hpp b/src/shared/Eis.hpp
+index 9c35bbd..2df8946 100644
+--- a/src/shared/Eis.hpp
++++ b/src/shared/Eis.hpp
+@@ -3,14 +3,6 @@
+ #include <libeis.h>
+ #include <string>
+
+-struct EisClient {
+- struct eis_client* handle;
+- struct eis_seat* seat;
+-
+- struct eis_device* pointer;
+- struct eis_device* keyboard;
+-};
+-
+ /*
+ * Responsible to creating a socket for input communication
+ */
+@@ -35,14 +27,21 @@ class EmulatedInputServer {
+ void stopServer();
+
+ private:
+- bool stop;
+- struct eis* eis;
+- EisClient client;
+-
+- int onEvent(eis_event* e);
+- void listen();
+- void ensurePointer(eis_event* event);
+- void ensureKeyboard(eis_event* event);
+- void clearPointer();
+- void clearKeyboard();
++ bool stop = false;
++ eis* eisCtx = nullptr;
++
++ struct Client {
++ eis_client* handle = nullptr;
++ eis_seat* seat = nullptr;
++
++ eis_device* pointer = nullptr;
++ eis_device* keyboard = nullptr;
++ } client;
++
++ int onEvent(eis_event* e);
++ void pollEvents();
++ void ensurePointer(eis_event* event);
++ void ensureKeyboard(eis_event* event);
++ void clearPointer();
++ void clearKeyboard();
+ };
+
+From ab40d7199a9c1ac12c1f24ea646b08385e5f76b4 Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Mon, 30 Sep 2024 18:05:23 +0200
+Subject: [PATCH 05/17] Free EIS server on disable
+
+---
+ src/portals/InputCapture.cpp | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/src/portals/InputCapture.cpp b/src/portals/InputCapture.cpp
+index c3030b2..3567e89 100644
+--- a/src/portals/InputCapture.cpp
++++ b/src/portals/InputCapture.cpp
+@@ -99,8 +99,6 @@ void CInputCapturePortal::onCreateSession(sdbus::MethodCall& call) {
+ session->session->onDestroy = [session, this]() {
+ disable(session->sessionHandle);
+
+- session->eis->stopServer();
+- session->eis = nullptr;
+ Debug::log(LOG, "[input-capture] Session {} destroyed", session->sessionHandle.c_str());
+
+ session->session.release();
+@@ -502,6 +500,9 @@ void CInputCapturePortal::disable(sdbus::ObjectPath sessionHandle) {
+ if (!session->disable())
+ return;
+
++ session->eis->stopServer();
++ session->eis.reset();
++
+ auto signal = m_pObject->createSignal(INTERFACE_NAME, "Disable");
+ signal << sessionHandle;
+
+
+From 3fab575e9771c3de3f497ed303ecf33396df2c6c Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Mon, 30 Sep 2024 18:09:26 +0200
+Subject: [PATCH 06/17] input-capture: various fixes
+
+---
+ src/portals/InputCapture.cpp | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/src/portals/InputCapture.cpp b/src/portals/InputCapture.cpp
+index 3567e89..ebfb507 100644
+--- a/src/portals/InputCapture.cpp
++++ b/src/portals/InputCapture.cpp
+@@ -42,7 +42,7 @@ CInputCapturePortal::CInputCapturePortal(SP<CCHyprlandInputCaptureManagerV1> mgr
+ m_pObject->registerMethod(INTERFACE_NAME, "Release", "osa{sv}", "ua{sv}", [&](sdbus::MethodCall c) { onRelease(c); });
+ m_pObject->registerMethod(INTERFACE_NAME, "ConnectToEIS", "osa{sv}", "h", [&](sdbus::MethodCall c) { onConnectToEIS(c); });
+
+- m_pObject->registerProperty(INTERFACE_NAME, "SupportedCapabilities", "u", [](sdbus::PropertyGetReply& reply) { reply << (uint)(1 | 2); });
++ m_pObject->registerProperty(INTERFACE_NAME, "SupportedCapabilities", "u", [](sdbus::PropertyGetReply& reply) { reply << (uint32_t)(1 | 2); });
+ m_pObject->registerProperty(INTERFACE_NAME, "version", "u", [](sdbus::PropertyGetReply& reply) { reply << (uint32_t)1; });
+
+ m_pObject->finishRegistration();
+@@ -420,9 +420,8 @@ void CInputCapturePortal::activate(sdbus::ObjectPath sessionHandle, double x, do
+ }
+
+ bool CInputCapturePortal::SSession::activate(double x, double y, uint32_t borderId) {
+- if (status != ENABLED) {
++ if (status != ENABLED)
+ return false;
+- }
+
+ activationId += 5;
+ status = ACTIVATED;
+
+From 12361f81a0760e9b7ca729cd5f0e7241f9fa3e11 Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Mon, 7 Oct 2024 15:17:25 +0200
+Subject: [PATCH 07/17] input-capture: impl keymap
+
+---
+ src/helpers/MiscFunctions.cpp | 85 ++++++++++++++++++++++++++++++++++
+ src/helpers/MiscFunctions.hpp | 4 +-
+ src/meson.build | 1 +
+ src/portals/InputCapture.cpp | 20 +++++++-
+ src/portals/InputCapture.hpp | 18 ++++---
+ src/shared/Eis.cpp | 54 ++++++++++++++++++++-
+ src/shared/Eis.hpp | 24 +++++++---
+ 8 files changed, 189 insertions(+), 19 deletions(-)
+
+diff --git a/src/helpers/MiscFunctions.cpp b/src/helpers/MiscFunctions.cpp
+index 7307ba3..9119b09 100644
+--- a/src/helpers/MiscFunctions.cpp
++++ b/src/helpers/MiscFunctions.cpp
+@@ -7,6 +7,10 @@
+ #include <vector>
+ #include <string>
+ #include <algorithm>
++#include <sys/mman.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++#include <uuid/uuid.h>
+
+ #include <hyprutils/os/Process.hpp>
+ using namespace Hyprutils::OS;
+@@ -55,3 +59,84 @@ bool inShellPath(const std::string& exec) {
+
+ return std::ranges::any_of(paths, [&exec](std::string& path) { return access((path + "/" + exec).c_str(), X_OK) == 0; });
+ }
++
++std::string getRandomUUID() {
++ std::string uuid;
++ uuid_t uuid_;
++ uuid_generate_random(uuid_);
++ return std::format("{:02x}{:02x}{:02x}{:02x}-{:02x}{:02x}-{:02x}{:02x}-{:02x}{:02x}-{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}", (uint16_t)uuid_[0], (uint16_t)uuid_[1],
++ (uint16_t)uuid_[2], (uint16_t)uuid_[3], (uint16_t)uuid_[4], (uint16_t)uuid_[5], (uint16_t)uuid_[6], (uint16_t)uuid_[7], (uint16_t)uuid_[8],
++ (uint16_t)uuid_[9], (uint16_t)uuid_[10], (uint16_t)uuid_[11], (uint16_t)uuid_[12], (uint16_t)uuid_[13], (uint16_t)uuid_[14], (uint16_t)uuid_[15]);
++}
++
++std::pair<int, std::string> openExclusiveShm() {
++ // Only absolute paths can be shared across different shm_open() calls
++ std::string name = "/" + getRandomUUID();
++
++ for (size_t i = 0; i < 69; ++i) {
++ int fd = shm_open(name.c_str(), O_RDWR | O_CREAT | O_EXCL, 0600);
++ if (fd >= 0)
++ return {fd, name};
++ }
++
++ return {-1, ""};
++}
++
++int allocateSHMFile(size_t len) {
++ auto [fd, name] = openExclusiveShm();
++ if (fd < 0)
++ return -1;
++
++ shm_unlink(name.c_str());
++
++ int ret;
++ do {
++ ret = ftruncate(fd, len);
++ } while (ret < 0 && errno == EINTR);
++
++ if (ret < 0) {
++ close(fd);
++ return -1;
++ }
++
++ return fd;
++}
++
++bool allocateSHMFilePair(size_t size, int* rw_fd_ptr, int* ro_fd_ptr) {
++ auto [fd, name] = openExclusiveShm();
++ if (fd < 0) {
++ return false;
++ }
++
++ // CLOEXEC is guaranteed to be set by shm_open
++ int ro_fd = shm_open(name.c_str(), O_RDONLY, 0);
++ if (ro_fd < 0) {
++ shm_unlink(name.c_str());
++ close(fd);
++ return false;
++ }
++
++ shm_unlink(name.c_str());
++
++ // Make sure the file cannot be re-opened in read-write mode (e.g. via
++ // "/proc/self/fd/" on Linux)
++ if (fchmod(fd, 0) != 0) {
++ close(fd);
++ close(ro_fd);
++ return false;
++ }
++
++ int ret;
++ do {
++ ret = ftruncate(fd, size);
++ } while (ret < 0 && errno == EINTR);
++ if (ret < 0) {
++ close(fd);
++ close(ro_fd);
++ return false;
++ }
++
++ *rw_fd_ptr = fd;
++ *ro_fd_ptr = ro_fd;
++ return true;
++}
+diff --git a/src/helpers/MiscFunctions.hpp b/src/helpers/MiscFunctions.hpp
+index f335a83..194d248 100644
+--- a/src/helpers/MiscFunctions.hpp
++++ b/src/helpers/MiscFunctions.hpp
+@@ -5,4 +5,6 @@
+ std::string execAndGet(const char* cmd);
+ void addHyprlandNotification(const std::string& icon, float timeMs, const std::string& color, const std::string& message);
+ bool inShellPath(const std::string& exec);
+-void sendEmptyDbusMethodReply(sdbus::MethodCall& call, u_int32_t responseCode);
+\ No newline at end of file
++void sendEmptyDbusMethodReply(sdbus::MethodCall& call, u_int32_t responseCode);
++int allocateSHMFile(size_t len);
++bool allocateSHMFilePair(size_t size, int* rw_fd_ptr, int* ro_fd_ptr);
+diff --git a/src/meson.build b/src/meson.build
+index 2f8d1e6..ad66f5b 100644
+--- a/src/meson.build
++++ b/src/meson.build
+@@ -14,6 +14,7 @@ executable('xdg-desktop-portal-hyprland',
+ dependency('sdbus-c++'),
+ dependency('threads'),
+ dependency('wayland-client'),
++ dependency('uuid'),
+ ],
+ include_directories: inc,
+ install: true,
+diff --git a/src/portals/InputCapture.cpp b/src/portals/InputCapture.cpp
+index ebfb507..6009760 100644
+--- a/src/portals/InputCapture.cpp
++++ b/src/portals/InputCapture.cpp
+@@ -20,6 +20,10 @@ CInputCapturePortal::CInputCapturePortal(SP<CCHyprlandInputCaptureManagerV1> mgr
+ onMotion(wl_fixed_to_double(x), wl_fixed_to_double(y), wl_fixed_to_double(dx), wl_fixed_to_double(dy));
+ });
+
++ mgr->setKeymap([this](CCHyprlandInputCaptureManagerV1* r, hyprlandInputCaptureManagerV1KeymapFormat format, int32_t fd, uint32_t size) {
++ onKeymap(format == HYPRLAND_INPUT_CAPTURE_MANAGER_V1_KEYMAP_FORMAT_XKB_V1 ? fd : 0, size);
++ });
++
+ mgr->setKey([this](CCHyprlandInputCaptureManagerV1* r, uint32_t key, hyprlandInputCaptureManagerV1KeyState state) { onKey(key, state); });
+
+ mgr->setButton([this](CCHyprlandInputCaptureManagerV1* r, uint32_t button, hyprlandInputCaptureManagerV1ButtonState state) { onButton(button, state); });
+@@ -107,7 +111,7 @@ void CInputCapturePortal::onCreateSession(sdbus::MethodCall& call) {
+ session->request = createDBusRequest(requestHandle);
+ session->request->onDestroy = [session]() { session->request.release(); };
+
+- session->eis = std::make_unique<EmulatedInputServer>("eis-" + sessionId);
++ session->eis = std::make_unique<EmulatedInputServer>("eis-" + sessionId, keymap);
+
+ sessions.emplace(sessionHandle, session);
+
+@@ -370,6 +374,13 @@ void CInputCapturePortal::onKey(uint32_t id, bool pressed) {
+ value->key(id, pressed);
+ }
+
++void CInputCapturePortal::onKeymap(int32_t fd, uint32_t size) {
++ keymap.fd = fd;
++ keymap.size = size;
++ for (const auto& [key, value] : sessions)
++ value->keymap(keymap);
++}
++
+ void CInputCapturePortal::onButton(uint32_t button, bool pressed) {
+ for (const auto& [key, session] : sessions)
+ session->button(button, pressed);
+@@ -525,6 +536,13 @@ void CInputCapturePortal::SSession::motion(double dx, double dy) {
+ eis->sendMotion(dx, dy);
+ }
+
++void CInputCapturePortal::SSession::keymap(Keymap keymap) {
++ if (status == STOPPED)
++ return;
++
++ eis->setKeymap(keymap);
++}
++
+ void CInputCapturePortal::SSession::key(uint32_t key, bool pressed) {
+ if (status != ACTIVATED)
+ return;
+diff --git a/src/portals/InputCapture.hpp b/src/portals/InputCapture.hpp
+index 31e5c80..75091f1 100644
+--- a/src/portals/InputCapture.hpp
++++ b/src/portals/InputCapture.hpp
+@@ -30,6 +30,7 @@ class CInputCapturePortal {
+ void onConnectToEIS(sdbus::MethodCall& methodCall);
+
+ void onMotion(double x, double y, double dx, double dy);
++ void onKeymap(int32_t fd, uint32_t size);
+ void onKey(uint32_t key, bool pressed);
+ void onButton(uint32_t button, bool pressed);
+ void onAxis(bool axis, double value);
+@@ -51,7 +52,7 @@ class CInputCapturePortal {
+
+ std::unordered_map<uint32_t, SBarrier> barriers;
+ uint32_t activationId = 0;
+- ClientStatus status = CREATED;
++ ClientStatus status = CREATED;
+
+ //
+ bool activate(double x, double y, uint32_t borderId);
+@@ -61,6 +62,7 @@ class CInputCapturePortal {
+
+ void motion(double dx, double dy);
+ void key(uint32_t key, bool pressed);
++ void keymap(Keymap keymap);
+ void button(uint32_t button, bool pressed);
+ void axis(bool axis, double value);
+ void axisValue120(bool axis, int32_t value120);
+@@ -81,12 +83,14 @@ class CInputCapturePortal {
+ uint sessionCounter = 0;
+ uint lastZoneSet = 0;
+
+- const std::string INTERFACE_NAME = "org.freedesktop.impl.portal.InputCapture";
+- const std::string OBJECT_PATH = "/org/freedesktop/portal/desktop";
++ Keymap keymap; //We store the active keymap ready to be sent when creating EIS
+
+- bool sessionValid(sdbus::ObjectPath sessionHandle);
++ const std::string INTERFACE_NAME = "org.freedesktop.impl.portal.InputCapture";
++ const std::string OBJECT_PATH = "/org/freedesktop/portal/desktop";
+
+- void activate(sdbus::ObjectPath sessionHandle, double x, double y, uint32_t borderId);
+- void deactivate(sdbus::ObjectPath sessionHandle);
+- void disable(sdbus::ObjectPath sessionHandle);
++ bool sessionValid(sdbus::ObjectPath sessionHandle);
++
++ void activate(sdbus::ObjectPath sessionHandle, double x, double y, uint32_t borderId);
++ void deactivate(sdbus::ObjectPath sessionHandle);
++ void disable(sdbus::ObjectPath sessionHandle);
+ };
+diff --git a/src/shared/Eis.cpp b/src/shared/Eis.cpp
+index 46fbd93..4c3a5a1 100644
+--- a/src/shared/Eis.cpp
++++ b/src/shared/Eis.cpp
+@@ -1,11 +1,17 @@
+ #include "Eis.hpp"
+ #include "../core/PortalManager.hpp"
++#include "../helpers/MiscFunctions.hpp"
+ #include "src/helpers/Log.hpp"
++#include <alloca.h>
+ #include <libeis.h>
++#include <sys/mman.h>
++#include <unistd.h>
+
+-EmulatedInputServer::EmulatedInputServer(std::string socketName) {
++EmulatedInputServer::EmulatedInputServer(std::string socketName, Keymap _keymap) {
+ Debug::log(LOG, "[EIS] Init socket: {}", socketName);
+
++ keymap = _keymap;
++
+ const char* xdg = getenv("XDG_RUNTIME_DIR");
+ if (xdg)
+ socketPath = std::string(xdg) + "/" + socketName;
+@@ -152,13 +158,53 @@ void EmulatedInputServer::ensureKeyboard(eis_event* event) {
+ eis_device* keyboard = eis_seat_new_device(client.seat);
+ eis_device_configure_name(keyboard, "captured keyboard");
+ eis_device_configure_capability(keyboard, EIS_DEVICE_CAP_KEYBOARD);
+- // TODO: layout
++
++ if (keymap.fd != 0) {
++ Keymap _keymap = openKeymap();
++ Debug::log(LOG, "Using keymap {}", _keymap.fd);
++ eis_keymap* eis_keymap = eis_device_new_keymap(keyboard, EIS_KEYMAP_TYPE_XKB, _keymap.fd, _keymap.size);
++ eis_keymap_add(eis_keymap);
++ eis_keymap_unref(eis_keymap);
++ }
++
+ eis_device_add(keyboard);
+ eis_device_resume(keyboard);
+
+ client.keyboard = keyboard;
+ }
+
++Keymap EmulatedInputServer::openKeymap() {
++ Keymap _keymap;
++
++ void* src = mmap(nullptr, keymap.size, PROT_READ, MAP_PRIVATE, keymap.fd, 0);
++ if (src == MAP_FAILED) {
++ Debug::log(ERR, "Failed to mmap the compositor keymap fd");
++ return _keymap;
++ }
++
++ int keymapFD = allocateSHMFile(keymap.size);
++ if (keymapFD < 0) {
++ Debug::log(ERR, "Failed to create a keymap file for keyboard grab");
++ return _keymap;
++ }
++
++ char* dst = (char*)mmap(nullptr, keymap.size, PROT_READ | PROT_WRITE, MAP_SHARED, keymapFD, 0);
++ if (dst == MAP_FAILED) {
++ Debug::log(ERR, "Failed to mmap a keymap file for keyboard grab");
++ close(keymapFD);
++ return _keymap;
++ }
++
++ memcpy(dst, src, keymap.size);
++ munmap(dst, keymap.size);
++ munmap(src, keymap.size);
++
++ _keymap.fd = keymapFD;
++ _keymap.size = keymap.size;
++
++ return _keymap;
++}
++
+ //TODO: remove and re-add devices when monitors change (see: mutter/meta-input-capture-session.c:1107)
+
+ void EmulatedInputServer::clearPointer() {
+@@ -205,6 +251,10 @@ void EmulatedInputServer::stopEmulating() {
+ eis_device_stop_emulating(client.keyboard);
+ }
+
++void EmulatedInputServer::setKeymap(Keymap _keymap) {
++ keymap = _keymap;
++}
++
+ void EmulatedInputServer::sendMotion(double x, double y) {
+ if (!client.pointer)
+ return;
+diff --git a/src/shared/Eis.hpp b/src/shared/Eis.hpp
+index 2df8946..918dc71 100644
+--- a/src/shared/Eis.hpp
++++ b/src/shared/Eis.hpp
+@@ -3,17 +3,24 @@
+ #include <libeis.h>
+ #include <string>
+
++struct Keymap {
++ int32_t fd = 0;
++ uint32_t size = 0;
++};
++
+ /*
+ * Responsible to creating a socket for input communication
+ */
+ class EmulatedInputServer {
+ public:
+- EmulatedInputServer(std::string socketPath);
++ EmulatedInputServer(std::string socketPath, Keymap keymap);
+ std::string socketPath;
+
+ void startEmulating(int activationId);
+ void stopEmulating();
+
++ void setKeymap(Keymap _keymap);
++
+ void sendMotion(double x, double y);
+ void sendKey(uint32_t key, bool pressed);
+ void sendButton(uint32_t button, bool pressed);
+@@ -38,10 +45,13 @@ class EmulatedInputServer {
+ eis_device* keyboard = nullptr;
+ } client;
+
+- int onEvent(eis_event* e);
+- void pollEvents();
+- void ensurePointer(eis_event* event);
+- void ensureKeyboard(eis_event* event);
+- void clearPointer();
+- void clearKeyboard();
++ Keymap keymap;
++
++ int onEvent(eis_event* e);
++ void pollEvents();
++ void ensurePointer(eis_event* event);
++ void ensureKeyboard(eis_event* event);
++ Keymap openKeymap();
++ void clearPointer();
++ void clearKeyboard();
+ };
+
+From d664ed6d22b867bc0f4ab966bc5402bee3077f42 Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Mon, 21 Oct 2024 10:46:56 +0200
+Subject: [PATCH 08/17] input-capture: impl force release
+
+---
+ src/portals/InputCapture.cpp | 24 +++++++++++++++++-------
+ src/portals/InputCapture.hpp | 1 +
+ 3 files changed, 19 insertions(+), 8 deletions(-)
+
+diff --git a/src/portals/InputCapture.cpp b/src/portals/InputCapture.cpp
+index 6009760..249f9a4 100644
+--- a/src/portals/InputCapture.cpp
++++ b/src/portals/InputCapture.cpp
+@@ -16,6 +16,8 @@
+ CInputCapturePortal::CInputCapturePortal(SP<CCHyprlandInputCaptureManagerV1> mgr) : m_sState(mgr) {
+ Debug::log(LOG, "[input-capture] initializing input capture portal");
+
++ mgr->setForceRelease([this](CCHyprlandInputCaptureManagerV1* r) { onForceRelease(); });
++
+ mgr->setMotion([this](CCHyprlandInputCaptureManagerV1* r, wl_fixed_t x, wl_fixed_t y, wl_fixed_t dx, wl_fixed_t dy) {
+ onMotion(wl_fixed_to_double(x), wl_fixed_to_double(y), wl_fixed_to_double(dx), wl_fixed_to_double(dy));
+ });
+@@ -102,6 +104,9 @@ void CInputCapturePortal::onCreateSession(sdbus::MethodCall& call) {
+ session->session = createDBusSession(sessionHandle);
+ session->session->onDestroy = [session, this]() {
+ disable(session->sessionHandle);
++ session->status = STOPPED;
++ session->eis->stopServer();
++ session->eis.reset();
+
+ Debug::log(LOG, "[input-capture] Session {} destroyed", session->sessionHandle.c_str());
+
+@@ -250,8 +255,10 @@ void CInputCapturePortal::onEnable(sdbus::MethodCall& call) {
+ Debug::log(LOG, "[input-capture] | {}", sessionHandle.c_str());
+ Debug::log(LOG, "[input-capture] | appid: {}", appID);
+
+- if (!sessionValid(sessionHandle))
++ if (!sessions.contains(sessionHandle)) {
++ Debug::log(WARN, "[input-capture] Unknown session handle: {}", sessionHandle.c_str());
+ return complete(call);
++ }
+
+ sessions[sessionHandle]->status = ENABLED;
+
+@@ -324,6 +331,12 @@ bool CInputCapturePortal::sessionValid(sdbus::ObjectPath sessionHandle) {
+ return sessions[sessionHandle]->status != STOPPED;
+ }
+
++void CInputCapturePortal::onForceRelease() {
++ Debug::log(LOG, "[input-capture] Released every captures");
++ for (auto [key, value] : sessions)
++ disable(key);
++}
++
+ bool get_line_intersection(double p0_x, double p0_y, double p1_x, double p1_y, double p2_x, double p2_y, double p3_x, double p3_y, double* i_x, double* i_y) {
+ float s1_x, s1_y, s2_x, s2_y;
+ s1_x = p1_x - p0_x;
+@@ -510,10 +523,7 @@ void CInputCapturePortal::disable(sdbus::ObjectPath sessionHandle) {
+ if (!session->disable())
+ return;
+
+- session->eis->stopServer();
+- session->eis.reset();
+-
+- auto signal = m_pObject->createSignal(INTERFACE_NAME, "Disable");
++ auto signal = m_pObject->createSignal(INTERFACE_NAME, "Disabled");
+ signal << sessionHandle;
+
+ std::unordered_map<std::string, sdbus::Variant> options;
+@@ -523,8 +533,8 @@ void CInputCapturePortal::disable(sdbus::ObjectPath sessionHandle) {
+ }
+
+ bool CInputCapturePortal::SSession::disable() {
+- status = STOPPED;
+-
++ status = CREATED;
++ barriers.clear();
+ Debug::log(LOG, "[input-capture] Session {} disabled", sessionHandle.c_str());
+ return true;
+ }
+diff --git a/src/portals/InputCapture.hpp b/src/portals/InputCapture.hpp
+index 75091f1..16095ee 100644
+--- a/src/portals/InputCapture.hpp
++++ b/src/portals/InputCapture.hpp
+@@ -29,6 +29,7 @@ class CInputCapturePortal {
+ void onRelease(sdbus::MethodCall& methodCall);
+ void onConnectToEIS(sdbus::MethodCall& methodCall);
+
++ void onForceRelease();
+ void onMotion(double x, double y, double dx, double dy);
+ void onKeymap(int32_t fd, uint32_t size);
+ void onKey(uint32_t key, bool pressed);
+
+From 4cd2e1ab77e56ccc61a75648032a210486b1b3e7 Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Sat, 26 Oct 2024 01:33:06 +0200
+Subject: [PATCH 09/17] input-capture: update to sdbus2.0
+
+---
+ src/core/PortalManager.cpp | 2 +-
+ src/portals/InputCapture.cpp | 237 +++++++++++------------------------
+ src/portals/InputCapture.hpp | 55 ++++----
+ 3 files changed, 106 insertions(+), 188 deletions(-)
+
+diff --git a/src/core/PortalManager.cpp b/src/core/PortalManager.cpp
+index 365b97a..4e3dc42 100644
+--- a/src/core/PortalManager.cpp
++++ b/src/core/PortalManager.cpp
+@@ -364,7 +364,7 @@ void CPortalManager::startEventLoop() {
+ m_mEventLock.lock();
+
+ if (m_sEventLoopInternals.pollFds[0].revents & POLLIN /* dbus */) {
+- while (m_pConnection->processPendingRequest()) {
++ while (m_pConnection->processPendingEvent()) {
+ ;
+ }
+ }
+diff --git a/src/portals/InputCapture.cpp b/src/portals/InputCapture.cpp
+index 249f9a4..70376a1 100644
+--- a/src/portals/InputCapture.cpp
++++ b/src/portals/InputCapture.cpp
+@@ -7,6 +7,8 @@
+ #include <cstddef>
+ #include <cstdint>
+ #include <memory>
++#include <sdbus-c++/Types.h>
++#include <sdbus-c++/VTableItems.h>
+ #include <string>
+ #include <sys/socket.h>
+ #include <sys/un.h>
+@@ -40,18 +42,36 @@ CInputCapturePortal::CInputCapturePortal(SP<CCHyprlandInputCaptureManagerV1> mgr
+
+ m_pObject = sdbus::createObject(*g_pPortalManager->getConnection(), OBJECT_PATH);
+
+- m_pObject->registerMethod(INTERFACE_NAME, "CreateSession", "oossa{sv}", "ua{sv}", [&](sdbus::MethodCall c) { onCreateSession(c); });
+- m_pObject->registerMethod(INTERFACE_NAME, "GetZones", "oosa{sv}", "ua{sv}", [&](sdbus::MethodCall c) { onGetZones(c); });
+- m_pObject->registerMethod(INTERFACE_NAME, "SetPointerBarriers", "oosa{sv}aa{sv}u", "ua{sv}", [&](sdbus::MethodCall c) { onSetPointerBarriers(c); });
+- m_pObject->registerMethod(INTERFACE_NAME, "Enable", "osa{sv}", "ua{sv}", [&](sdbus::MethodCall c) { onEnable(c); });
+- m_pObject->registerMethod(INTERFACE_NAME, "Disable", "osa{sv}", "ua{sv}", [&](sdbus::MethodCall c) { onDisable(c); });
+- m_pObject->registerMethod(INTERFACE_NAME, "Release", "osa{sv}", "ua{sv}", [&](sdbus::MethodCall c) { onRelease(c); });
+- m_pObject->registerMethod(INTERFACE_NAME, "ConnectToEIS", "osa{sv}", "h", [&](sdbus::MethodCall c) { onConnectToEIS(c); });
+-
+- m_pObject->registerProperty(INTERFACE_NAME, "SupportedCapabilities", "u", [](sdbus::PropertyGetReply& reply) { reply << (uint32_t)(1 | 2); });
+- m_pObject->registerProperty(INTERFACE_NAME, "version", "u", [](sdbus::PropertyGetReply& reply) { reply << (uint32_t)1; });
+-
+- m_pObject->finishRegistration();
++ m_pObject
++ ->addVTable(
++ sdbus::registerMethod("CreateSession")
++ .implementedAs([this](sdbus::ObjectPath o1, sdbus::ObjectPath o2, std::string s1, std::string s2, std::unordered_map<std::string, sdbus::Variant> m) {
++ return onCreateSession(o1, o2, s1, s2, m);
++ }),
++ sdbus::registerMethod("GetZones").implementedAs([this](sdbus::ObjectPath o1, sdbus::ObjectPath o2, std::string s, std::unordered_map<std::string, sdbus::Variant> m) {
++ return onGetZones(o1, o2, s, m);
++ }),
++ sdbus::registerMethod("SetPointerBarriers")
++ .implementedAs([this](sdbus::ObjectPath o1, sdbus::ObjectPath o2, std::string s, std::unordered_map<std::string, sdbus::Variant> m,
++ std::vector<std::unordered_map<std::string, sdbus::Variant>> v, uint32_t u) { return onSetPointerBarriers(o1, o2, s, m, v, u); }),
++ sdbus::registerMethod("Enable").implementedAs(
++ [this](sdbus::ObjectPath o, std::string s, std::unordered_map<std::string, sdbus::Variant> m) { return onEnable(o, s, m); }),
++
++ sdbus::registerMethod("Disable").implementedAs(
++ [this](sdbus::ObjectPath o, std::string s, std::unordered_map<std::string, sdbus::Variant> m) { return onDisable(o, s, m); }),
++
++ sdbus::registerMethod("Release").implementedAs(
++ [this](sdbus::ObjectPath o, std::string s, std::unordered_map<std::string, sdbus::Variant> m) { return onRelease(o, s, m); }),
++ sdbus::registerMethod("ConnectToEIS").implementedAs([this](sdbus::ObjectPath o, std::string s, std::unordered_map<std::string, sdbus::Variant> m) {
++ return onConnectToEIS(o, s, m);
++ }),
++ sdbus::registerProperty("SupportedCapabilities").withGetter([] { return (uint32_t)(1 | 2); }),
++ sdbus::registerProperty("version").withGetter([] { return (uint32_t)(1); }),
++ sdbus::registerSignal("Activated").withParameters<sdbus::ObjectPath, std::unordered_map<std::string, sdbus::Variant>>(),
++ sdbus::registerSignal("Disabled").withParameters<sdbus::ObjectPath, std::unordered_map<std::string, sdbus::Variant>>(),
++ sdbus::registerSignal("Deactivated").withParameters<sdbus::ObjectPath, std::unordered_map<std::string, sdbus::Variant>>(),
++ sdbus::registerSignal("ZonesChanged").withParameters<sdbus::ObjectPath, std::unordered_map<std::string, sdbus::Variant>>())
++ .forInterface(INTERFACE_NAME);
+
+ for (auto& o : g_pPortalManager->getAllOutputs())
+ Debug::log(LOG, "{} {}x{}", o->name, o->width, o->height);
+@@ -66,23 +86,11 @@ void complete(sdbus::MethodCall& call) {
+ reply.send();
+ }
+
+-void CInputCapturePortal::onCreateSession(sdbus::MethodCall& call) {
++dbUasv CInputCapturePortal::onCreateSession(sdbus::ObjectPath requestHandle, sdbus::ObjectPath sessionHandle, std::string appID, std::string parentWindow,
++ std::unordered_map<std::string, sdbus::Variant> options) {
+ Debug::log(LOG, "[input-capture] New session:");
+
+- sdbus::ObjectPath requestHandle, sessionHandle;
+-
+- call >> requestHandle;
+- call >> sessionHandle;
+-
+- std::string appID;
+- call >> appID;
+-
+- std::string parentWindow;
+- call >> parentWindow;
+-
+- std::unordered_map<std::string, sdbus::Variant> options;
+- call >> options;
+- uint32_t capabilities = options["capabilities"];
++ uint32_t capabilities = options["capabilities"].get<uint32_t>();
+
+ Debug::log(LOG, "[input-capture] | {}", requestHandle.c_str());
+ Debug::log(LOG, "[input-capture] | {}", sessionHandle.c_str());
+@@ -121,32 +129,19 @@ void CInputCapturePortal::onCreateSession(sdbus::MethodCall& call) {
+ sessions.emplace(sessionHandle, session);
+
+ std::unordered_map<std::string, sdbus::Variant> results;
+- results["capabilities"] = (uint)3;
+- results["session_id"] = sessionId;
+-
+- auto reply = call.createReply();
+- reply << (uint32_t)0;
+- reply << results;
+- reply.send();
++ results["capabilities"] = sdbus::Variant{(uint)3};
++ results["session_id"] = sdbus::Variant{sessionId};
++ return {0, results};
+ }
+
+-void CInputCapturePortal::onGetZones(sdbus::MethodCall& call) {
++dbUasv CInputCapturePortal::onGetZones(sdbus::ObjectPath requestHandle, sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts) {
+ Debug::log(LOG, "[input-capture] New GetZones request:");
+-
+- sdbus::ObjectPath requestHandle, sessionHandle;
+-
+- call >> requestHandle;
+- call >> sessionHandle;
+-
+- std::string appID;
+- call >> appID;
+-
+ Debug::log(LOG, "[input-capture] | {}", requestHandle.c_str());
+ Debug::log(LOG, "[input-capture] | {}", sessionHandle.c_str());
+ Debug::log(LOG, "[input-capture] | appid: {}", appID);
+
+ if (!sessionValid(sessionHandle))
+- return;
++ return {1, {}};
+
+ std::vector<sdbus::Struct<uint32_t, uint32_t, int32_t, int32_t>> zones;
+ for (auto& o : g_pPortalManager->getAllOutputs()) {
+@@ -154,55 +149,36 @@ void CInputCapturePortal::onGetZones(sdbus::MethodCall& call) {
+ }
+
+ std::unordered_map<std::string, sdbus::Variant> results;
+- results["zones"] = zones;
+- results["zone_set"] = ++lastZoneSet;
+-
+- auto reply = call.createReply();
+- reply << (uint32_t)0;
+- reply << results;
+- reply.send();
++ results["zones"] = sdbus::Variant{zones};
++ results["zone_set"] = sdbus::Variant{++lastZoneSet};
++ return {0, results};
+ }
+
+-void CInputCapturePortal::onSetPointerBarriers(sdbus::MethodCall& call) {
++dbUasv CInputCapturePortal::onSetPointerBarriers(sdbus::ObjectPath requestHandle, sdbus::ObjectPath sessionHandle, std::string appID,
++ std::unordered_map<std::string, sdbus::Variant> opts, std::vector<std::unordered_map<std::string, sdbus::Variant>> barriers,
++ uint32_t zoneSet) {
+ Debug::log(LOG, "[input-capture] New SetPointerBarriers request:");
+
+- sdbus::ObjectPath requestHandle, sessionHandle;
+-
+- call >> requestHandle;
+- call >> sessionHandle;
+-
+- std::string appID;
+- call >> appID;
+-
+ Debug::log(LOG, "[input-capture] | {}", requestHandle.c_str());
+ Debug::log(LOG, "[input-capture] | {}", sessionHandle.c_str());
+ Debug::log(LOG, "[input-capture] | appid: {}", appID);
+
+ if (!sessionValid(sessionHandle))
+- return complete(call);
+-
+- std::unordered_map<std::string, sdbus::Variant> options;
+- call >> options;
+-
+- std::vector<std::unordered_map<std::string, sdbus::Variant>> barriers;
+- call >> barriers;
++ return {1, {}};
+
+- uint32_t zoneSet;
+- call >> zoneSet;
+ Debug::log(LOG, "[input-capture] | zoneSet: {}", zoneSet);
+
+ if (zoneSet != lastZoneSet) {
+ Debug::log(WARN, "[input-capture] Invalid zone set discarding barriers");
+- complete(call); //TODO: We should return failed_barries
+- return;
++ return {1, {}}; //TODO: We should return failed_barries
+ }
+
+ sessions[sessionHandle]->barriers.clear();
+ for (const auto& b : barriers) {
+- uint id = b.at("barrier_id");
++ uint id = b.at("barrier_id").get<uint>();
+ int x1, y1, x2, y2;
+
+- sdbus::Struct<int, int, int, int> p = b.at("position");
++ sdbus::Struct<int, int, int, int> p = b.at("position").get<sdbus::Struct<int, int, int, int>>();
+ x1 = p.get<0>();
+ y1 = p.get<1>();
+ x2 = p.get<2>();
+@@ -215,111 +191,69 @@ void CInputCapturePortal::onSetPointerBarriers(sdbus::MethodCall& call) {
+ std::vector<uint> failedBarriers;
+
+ std::unordered_map<std::string, sdbus::Variant> results;
+- results["failed_barriers"] = failedBarriers;
+-
+- auto reply = call.createReply();
+- reply << (uint32_t)0;
+- reply << results;
+- reply.send();
++ results["failed_barriers"] = sdbus::Variant{failedBarriers};
++ return {0, results};
+ }
+
+-void CInputCapturePortal::onDisable(sdbus::MethodCall& call) {
++dbUasv CInputCapturePortal::onDisable(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts) {
+ Debug::log(LOG, "[input-capture] New Disable request:");
+-
+- sdbus::ObjectPath sessionHandle;
+- call >> sessionHandle;
+-
+- std::string appID;
+- call >> appID;
+-
+ Debug::log(LOG, "[input-capture] | {}", sessionHandle.c_str());
+ Debug::log(LOG, "[input-capture] | appid: {}", appID);
+
+ if (!sessionValid(sessionHandle))
+- return complete(call);
++ return {1, {}};
+
+ disable(sessionHandle);
+-
+- complete(call);
++ return {0, {}};
+ }
+
+-void CInputCapturePortal::onEnable(sdbus::MethodCall& call) {
++dbUasv CInputCapturePortal::onEnable(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts) {
+ Debug::log(LOG, "[input-capture] New Enable request:");
+-
+- sdbus::ObjectPath sessionHandle;
+- call >> sessionHandle;
+-
+- std::string appID;
+- call >> appID;
+-
+ Debug::log(LOG, "[input-capture] | {}", sessionHandle.c_str());
+ Debug::log(LOG, "[input-capture] | appid: {}", appID);
+
+ if (!sessions.contains(sessionHandle)) {
+ Debug::log(WARN, "[input-capture] Unknown session handle: {}", sessionHandle.c_str());
+- return complete(call);
++ return {1, {}};
+ }
+
+ sessions[sessionHandle]->status = ENABLED;
+-
+- complete(call);
++ return {0, {}};
+ }
+
+-void CInputCapturePortal::onRelease(sdbus::MethodCall& call) {
++dbUasv CInputCapturePortal::onRelease(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts) {
+ Debug::log(LOG, "[input-capture] New Release request:");
+-
+- sdbus::ObjectPath sessionHandle;
+- call >> sessionHandle;
+-
+- std::string appID;
+- call >> appID;
+-
+ Debug::log(LOG, "[input-capture] | {}", sessionHandle.c_str());
+ Debug::log(LOG, "[input-capture] | appid: {}", appID);
+
+ if (!sessionValid(sessionHandle))
+- return complete(call);
++ return {1, {}};
+
+- std::unordered_map<std::string, sdbus::Variant> options;
+- call >> options;
+- uint32_t activationId = options["activation_id"];
++ uint32_t activationId = opts["activation_id"].get<uint32_t>();
+ if (activationId != sessions[sessionHandle]->activationId) {
+ Debug::log(WARN, "[input-capture] Invalid activation id {} expected {}", activationId, sessions[sessionHandle]->activationId);
+- complete(call);
+- return;
++ return {1, {}};
+ }
+
+ deactivate(sessionHandle);
+
+ //TODO: maybe warp pointer
+
+- complete(call);
++ return {0, {}};
+ }
+
+-void CInputCapturePortal::onConnectToEIS(sdbus::MethodCall& call) {
++sdbus::UnixFd CInputCapturePortal::onConnectToEIS(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts) {
+ Debug::log(LOG, "[input-capture] New ConnectToEIS request:");
+-
+- sdbus::ObjectPath sessionHandle;
+- call >> sessionHandle;
+-
+- std::string appID;
+- call >> appID;
+-
+- std::unordered_map<std::string, sdbus::Variant> options;
+- call >> options;
+-
+ Debug::log(LOG, "[input-capture] | {}", sessionHandle.c_str());
+ Debug::log(LOG, "[input-capture] | appid: {}", appID);
+
+ if (!sessionValid(sessionHandle))
+- return complete(call);
++ return (sdbus::UnixFd)0;
+
+ int sockfd = sessions[sessionHandle]->eis->getFileDescriptor();
+
+ Debug::log(LOG, "[input-capture] Connected to the socket. File descriptor: {}", sockfd);
+- auto reply = call.createReply();
+- reply << (sdbus::UnixFd)sockfd;
+- reply.send();
++ return (sdbus::UnixFd)sockfd;
+ }
+
+ bool CInputCapturePortal::sessionValid(sdbus::ObjectPath sessionHandle) {
+@@ -334,7 +268,7 @@ bool CInputCapturePortal::sessionValid(sdbus::ObjectPath sessionHandle) {
+ void CInputCapturePortal::onForceRelease() {
+ Debug::log(LOG, "[input-capture] Released every captures");
+ for (auto [key, value] : sessions)
+- disable(key);
++ disable(value->sessionHandle);
+ }
+
+ bool get_line_intersection(double p0_x, double p0_y, double p1_x, double p1_y, double p2_x, double p2_y, double p3_x, double p3_y, double* i_x, double* i_y) {
+@@ -376,7 +310,7 @@ void CInputCapturePortal::onMotion(double x, double y, double dx, double dy) {
+ for (const auto& [key, session] : sessions) {
+ int matched = session->isColliding(x, y, x - dx, y - dy);
+ if (matched != 0)
+- activate(key, x, y, matched);
++ activate(session->sessionHandle, x, y, matched);
+
+ session->motion(dx, dy);
+ }
+@@ -429,18 +363,12 @@ void CInputCapturePortal::activate(sdbus::ObjectPath sessionHandle, double x, do
+
+ m_sState.manager->sendCapture();
+
+- auto signal = m_pObject->createSignal(INTERFACE_NAME, "Activated");
+- signal << sessionHandle;
+-
+- g_pPortalManager->m_sPortals.inputCapture->INTERFACE_NAME;
+-
+ std::unordered_map<std::string, sdbus::Variant> results;
+- results["activation_id"] = session->activationId;
+- results["cursor_position"] = sdbus::Struct<double, double>(x, y);
+- results["barrier_id"] = borderId;
+- signal << results;
++ results["activation_id"] = sdbus::Variant{session->activationId};
++ results["cursor_position"] = sdbus::Variant{sdbus::Struct<double, double>(x, y)};
++ results["barrier_id"] = sdbus::Variant{borderId};
+
+- m_pObject->emitSignal(signal);
++ m_pObject->emitSignal("Activated").onInterface(INTERFACE_NAME).withArguments(sessionHandle, results);
+ }
+
+ bool CInputCapturePortal::SSession::activate(double x, double y, uint32_t borderId) {
+@@ -465,13 +393,10 @@ void CInputCapturePortal::deactivate(sdbus::ObjectPath sessionHandle) {
+
+ m_sState.manager->sendRelease();
+
+- auto signal = m_pObject->createSignal(INTERFACE_NAME, "Deactivated");
+- signal << sessionHandle;
+ std::unordered_map<std::string, sdbus::Variant> options;
+- options["activation_id"] = session->activationId;
+- signal << options;
++ options["activation_id"] = sdbus::Variant{session->activationId};
+
+- m_pObject->emitSignal(signal);
++ m_pObject->emitSignal("Deactivated").onInterface(INTERFACE_NAME).withArguments(sessionHandle, options);
+ }
+
+ bool CInputCapturePortal::SSession::deactivate() {
+@@ -496,13 +421,8 @@ void CInputCapturePortal::zonesChanged() {
+ if (!value->zoneChanged())
+ continue;
+
+- auto signal = m_pObject->createSignal(INTERFACE_NAME, "Deactivated");
+- signal << key;
+-
+ std::unordered_map<std::string, sdbus::Variant> options;
+- signal << options;
+-
+- m_pObject->emitSignal(signal);
++ m_pObject->emitSignal("ZonesChanged").onInterface(INTERFACE_NAME).withArguments(key, options);
+ }
+ }
+
+@@ -523,13 +443,8 @@ void CInputCapturePortal::disable(sdbus::ObjectPath sessionHandle) {
+ if (!session->disable())
+ return;
+
+- auto signal = m_pObject->createSignal(INTERFACE_NAME, "Disabled");
+- signal << sessionHandle;
+-
+ std::unordered_map<std::string, sdbus::Variant> options;
+- signal << options;
+-
+- m_pObject->emitSignal(signal);
++ m_pObject->emitSignal("Disabled").onInterface(INTERFACE_NAME).withArguments(sessionHandle, options);
+ }
+
+ bool CInputCapturePortal::SSession::disable() {
+diff --git a/src/portals/InputCapture.hpp b/src/portals/InputCapture.hpp
+index 16095ee..9364a01 100644
+--- a/src/portals/InputCapture.hpp
++++ b/src/portals/InputCapture.hpp
+@@ -1,4 +1,5 @@
+ #pragma once
++#include "dbusDefines.hpp"
+ #include "hyprland-input-capture-v1.hpp"
+ #include "../shared/Eis.hpp"
+ #include "../includes.hpp"
+@@ -21,25 +22,27 @@ class CInputCapturePortal {
+ public:
+ CInputCapturePortal(SP<CCHyprlandInputCaptureManagerV1> mgr);
+
+- void onCreateSession(sdbus::MethodCall& methodCall);
+- void onGetZones(sdbus::MethodCall& methodCall);
+- void onSetPointerBarriers(sdbus::MethodCall& methodCall);
+- void onEnable(sdbus::MethodCall& methodCall);
+- void onDisable(sdbus::MethodCall& methodCall);
+- void onRelease(sdbus::MethodCall& methodCall);
+- void onConnectToEIS(sdbus::MethodCall& methodCall);
+-
+- void onForceRelease();
+- void onMotion(double x, double y, double dx, double dy);
+- void onKeymap(int32_t fd, uint32_t size);
+- void onKey(uint32_t key, bool pressed);
+- void onButton(uint32_t button, bool pressed);
+- void onAxis(bool axis, double value);
+- void onAxisValue120(bool axis, int32_t value120);
+- void onAxisStop(bool axis);
+- void onFrame();
+-
+- void zonesChanged();
++ dbUasv onCreateSession(sdbus::ObjectPath requestHandle, sdbus::ObjectPath sessionHandle, std::string appID, std::string parentWindow,
++ std::unordered_map<std::string, sdbus::Variant> options);
++ dbUasv onGetZones(sdbus::ObjectPath requestHandle, sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts);
++ dbUasv onSetPointerBarriers(sdbus::ObjectPath requestHandle, sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts,
++ std::vector<std::unordered_map<std::string, sdbus::Variant>> barriers, uint32_t zoneSet);
++ dbUasv onEnable(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts);
++ dbUasv onDisable(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts);
++ dbUasv onRelease(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts);
++ sdbus::UnixFd onConnectToEIS(sdbus::ObjectPath sessionHandle, std::string appID, std::unordered_map<std::string, sdbus::Variant> opts);
++
++ void onForceRelease();
++ void onMotion(double x, double y, double dx, double dy);
++ void onKeymap(int32_t fd, uint32_t size);
++ void onKey(uint32_t key, bool pressed);
++ void onButton(uint32_t button, bool pressed);
++ void onAxis(bool axis, double value);
++ void onAxisValue120(bool axis, int32_t value120);
++ void onAxisStop(bool axis);
++ void onFrame();
++
++ void zonesChanged();
+
+ struct SSession {
+ std::string appid;
+@@ -84,14 +87,14 @@ class CInputCapturePortal {
+ uint sessionCounter = 0;
+ uint lastZoneSet = 0;
+
+- Keymap keymap; //We store the active keymap ready to be sent when creating EIS
++ Keymap keymap; //We store the active keymap ready to be sent when creating EIS
+
+- const std::string INTERFACE_NAME = "org.freedesktop.impl.portal.InputCapture";
+- const std::string OBJECT_PATH = "/org/freedesktop/portal/desktop";
++ const sdbus::InterfaceName INTERFACE_NAME = sdbus::InterfaceName{"org.freedesktop.impl.portal.InputCapture"};
++ const sdbus::ObjectPath OBJECT_PATH = sdbus::ObjectPath{"/org/freedesktop/portal/desktop"};
+
+- bool sessionValid(sdbus::ObjectPath sessionHandle);
++ bool sessionValid(sdbus::ObjectPath sessionHandle);
+
+- void activate(sdbus::ObjectPath sessionHandle, double x, double y, uint32_t borderId);
+- void deactivate(sdbus::ObjectPath sessionHandle);
+- void disable(sdbus::ObjectPath sessionHandle);
++ void activate(sdbus::ObjectPath sessionHandle, double x, double y, uint32_t borderId);
++ void deactivate(sdbus::ObjectPath sessionHandle);
++ void disable(sdbus::ObjectPath sessionHandle);
+ };
+
+From df93f3ca76ea07b7fcdcc50b38362c434487ac3d Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Sat, 26 Oct 2024 15:53:56 +0200
+Subject: [PATCH 10/17] fix build
+
+---
+ src/portals/InputCapture.hpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/portals/InputCapture.hpp b/src/portals/InputCapture.hpp
+index 9364a01..0f5a108 100644
+--- a/src/portals/InputCapture.hpp
++++ b/src/portals/InputCapture.hpp
+@@ -1,5 +1,5 @@
+ #pragma once
+-#include "dbusDefines.hpp"
++#include "../dbusDefines.hpp"
+ #include "hyprland-input-capture-v1.hpp"
+ #include "../shared/Eis.hpp"
+ #include "../includes.hpp"
+
+From 52414bc1e5b08cde7e9f8c113d2e3a0614304a92 Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Tue, 17 Dec 2024 19:03:56 +0100
+Subject: [PATCH 11/17] input-capture: fix build
+
+---
+ hyprland-share-picker/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/hyprland-share-picker/meson.build b/hyprland-share-picker/meson.build
+index ef29621..7a42657 100644
+--- a/hyprland-share-picker/meson.build
++++ b/hyprland-share-picker/meson.build
+@@ -18,6 +18,6 @@ executable('hyprland-share-picker',
+ sources,
+ ui_files,
+ moc,
+- dependencies: qtdep,
++ dependencies: [qtdep, dependency('hyprutils')],
+ install: true
+ )
+
+From 763572a0c118fc07f320777abca28f9acf51954e Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Tue, 17 Dec 2024 19:21:42 +0100
+Subject: [PATCH 12/17] input-capture: send modifiers (highly experimental)
+
+---
+ src/core/PortalManager.cpp | 1 +
+ src/portals/InputCapture.cpp | 16 ++++++++++++++++
+ src/portals/InputCapture.hpp | 2 ++
+ src/shared/Eis.cpp | 8 ++++++++
+ src/shared/Eis.hpp | 1 +
+ 6 files changed, 29 insertions(+), 1 deletion(-)
+
+diff --git a/src/core/PortalManager.cpp b/src/core/PortalManager.cpp
+index 4e3dc42..8e0d266 100644
+--- a/src/core/PortalManager.cpp
++++ b/src/core/PortalManager.cpp
+@@ -22,6 +22,7 @@ SOutput::SOutput(SP<CCWlOutput> output_) : output(output_) {
+ refreshRate = refresh;
+ width = width_;
+ height = height_;
++ Debug::log(LOG, "??? {} {}", flags, refresh);
+ });
+ output->setGeometry(
+ [this](CCWlOutput* r, int32_t x_, int32_t y_, int32_t physical_width, int32_t physical_height, int32_t subpixel, const char* make, const char* model, int32_t transform_) {
+diff --git a/src/portals/InputCapture.cpp b/src/portals/InputCapture.cpp
+index 70376a1..4372a36 100644
+--- a/src/portals/InputCapture.cpp
++++ b/src/portals/InputCapture.cpp
+@@ -28,6 +28,10 @@ CInputCapturePortal::CInputCapturePortal(SP<CCHyprlandInputCaptureManagerV1> mgr
+ onKeymap(format == HYPRLAND_INPUT_CAPTURE_MANAGER_V1_KEYMAP_FORMAT_XKB_V1 ? fd : 0, size);
+ });
+
++ mgr->setModifiers([this](CCHyprlandInputCaptureManagerV1* r, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group) {
++ onModifiers(mods_depressed, mods_latched, mods_locked, group);
++ });
++
+ mgr->setKey([this](CCHyprlandInputCaptureManagerV1* r, uint32_t key, hyprlandInputCaptureManagerV1KeyState state) { onKey(key, state); });
+
+ mgr->setButton([this](CCHyprlandInputCaptureManagerV1* r, uint32_t button, hyprlandInputCaptureManagerV1ButtonState state) { onButton(button, state); });
+@@ -321,6 +325,11 @@ void CInputCapturePortal::onKey(uint32_t id, bool pressed) {
+ value->key(id, pressed);
+ }
+
++void CInputCapturePortal::onModifiers(uint32_t modsDepressed, uint32_t modsLatched, uint32_t modsLocked, uint32_t group) {
++ for (const auto& [key, value] : sessions)
++ value->modifiers(modsDepressed, modsLatched, modsLocked, group);
++}
++
+ void CInputCapturePortal::onKeymap(int32_t fd, uint32_t size) {
+ keymap.fd = fd;
+ keymap.size = size;
+@@ -475,6 +484,13 @@ void CInputCapturePortal::SSession::key(uint32_t key, bool pressed) {
+ eis->sendKey(key, pressed);
+ }
+
++void CInputCapturePortal::SSession::modifiers(uint32_t modsDepressed, uint32_t modsLatched, uint32_t modsLocked, uint32_t group) {
++ if (status != ACTIVATED)
++ return;
++
++ eis->sendModifiers(modsDepressed, modsLatched, modsLocked, group);
++}
++
+ void CInputCapturePortal::SSession::button(uint32_t button, bool pressed) {
+ if (status != ACTIVATED)
+ return;
+diff --git a/src/portals/InputCapture.hpp b/src/portals/InputCapture.hpp
+index 0f5a108..99dcd36 100644
+--- a/src/portals/InputCapture.hpp
++++ b/src/portals/InputCapture.hpp
+@@ -36,6 +36,7 @@ class CInputCapturePortal {
+ void onMotion(double x, double y, double dx, double dy);
+ void onKeymap(int32_t fd, uint32_t size);
+ void onKey(uint32_t key, bool pressed);
++ void onModifiers(uint32_t modsDepressed, uint32_t modsLatched, uint32_t modsLocked, uint32_t group);
+ void onButton(uint32_t button, bool pressed);
+ void onAxis(bool axis, double value);
+ void onAxisValue120(bool axis, int32_t value120);
+@@ -66,6 +67,7 @@ class CInputCapturePortal {
+
+ void motion(double dx, double dy);
+ void key(uint32_t key, bool pressed);
++ void modifiers(uint32_t modsDepressed, uint32_t modsLatched, uint32_t modsLocked, uint32_t group);
+ void keymap(Keymap keymap);
+ void button(uint32_t button, bool pressed);
+ void axis(bool axis, double value);
+diff --git a/src/shared/Eis.cpp b/src/shared/Eis.cpp
+index 4c3a5a1..6032fba 100644
+--- a/src/shared/Eis.cpp
++++ b/src/shared/Eis.cpp
+@@ -269,6 +269,14 @@ void EmulatedInputServer::sendKey(uint32_t key, bool pressed) {
+ eis_device_frame(client.keyboard, now);
+ }
+
++void EmulatedInputServer::sendModifiers(uint32_t modsDepressed, uint32_t modsLatched, uint32_t modsLocked, uint32_t group) {
++ if (!client.keyboard)
++ return;
++ uint64_t now = eis_now(eisCtx);
++ eis_device_keyboard_send_xkb_modifiers(client.keyboard, modsDepressed, modsLatched, modsLocked, group);
++ eis_device_frame(client.keyboard, now);
++}
++
+ void EmulatedInputServer::sendButton(uint32_t button, bool pressed) {
+ if (!client.pointer)
+ return;
+diff --git a/src/shared/Eis.hpp b/src/shared/Eis.hpp
+index 918dc71..3af8181 100644
+--- a/src/shared/Eis.hpp
++++ b/src/shared/Eis.hpp
+@@ -23,6 +23,7 @@ class EmulatedInputServer {
+
+ void sendMotion(double x, double y);
+ void sendKey(uint32_t key, bool pressed);
++ void sendModifiers(uint32_t modsDepressed, uint32_t modsLatched, uint32_t modsLocked, uint32_t group);
+ void sendButton(uint32_t button, bool pressed);
+ void sendScrollDelta(double x, double y);
+ void sendScrollDiscrete(int32_t x, int32_t y);
+
+From e9bb66603bfcd8c71c6a61c6e6d31edf32d807bb Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Thu, 9 Jan 2025 13:25:33 +0100
+Subject: [PATCH 13/17] input-capture: upstream protocols
+
+---
+
+From 79417bd179e186cb731f118a335e507449aae6af Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Sun, 26 Jan 2025 14:50:29 +0100
+Subject: [PATCH 15/17] input-capture: close leaked keymap fd
+
+---
+ src/shared/Eis.cpp | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/shared/Eis.cpp b/src/shared/Eis.cpp
+index 6032fba..ed3d111 100644
+--- a/src/shared/Eis.cpp
++++ b/src/shared/Eis.cpp
+@@ -165,6 +165,7 @@ void EmulatedInputServer::ensureKeyboard(eis_event* event) {
+ eis_keymap* eis_keymap = eis_device_new_keymap(keyboard, EIS_KEYMAP_TYPE_XKB, _keymap.fd, _keymap.size);
+ eis_keymap_add(eis_keymap);
+ eis_keymap_unref(eis_keymap);
++ close(_keymap.fd);
+ }
+
+ eis_device_add(keyboard);
+@@ -273,7 +274,7 @@ void EmulatedInputServer::sendModifiers(uint32_t modsDepressed, uint32_t modsLat
+ if (!client.keyboard)
+ return;
+ uint64_t now = eis_now(eisCtx);
+- eis_device_keyboard_send_xkb_modifiers(client.keyboard, modsDepressed, modsLatched, modsLocked, group);
++ eis_device_keyboard_send_xkb_modifiers(client.keyboard, modsDepressed, modsLatched, modsLocked, group);
+ eis_device_frame(client.keyboard, now);
+ }
+
+
+From 4701e990932e0598d4eeb589c5810c8313cfb630 Mon Sep 17 00:00:00 2001
+From: Gwilherm Folliot <gwilherm55fo@gmail.com>
+Date: Sun, 26 Jan 2025 22:37:24 +0100
+Subject: [PATCH 16/17] input-capture: properly send ZonesChanged signal &
+ reset eis pointer on zone change
+
+---
+ src/portals/InputCapture.cpp | 12 +++++++++---
+ src/shared/Eis.cpp | 14 ++++++++++----
+ src/shared/Eis.hpp | 5 +++--
+ 3 files changed, 22 insertions(+), 9 deletions(-)
+
+diff --git a/src/portals/InputCapture.cpp b/src/portals/InputCapture.cpp
+index 4372a36..9edd8c3 100644
+--- a/src/portals/InputCapture.cpp
++++ b/src/portals/InputCapture.cpp
+@@ -149,6 +149,7 @@ dbUasv CInputCapturePortal::onGetZones(sdbus::ObjectPath requestHandle, sdbus::O
+
+ std::vector<sdbus::Struct<uint32_t, uint32_t, int32_t, int32_t>> zones;
+ for (auto& o : g_pPortalManager->getAllOutputs()) {
++ Debug::log(LOG, "[input-capture] | w: {} h: {} x: {} y: {}", o->width, o->height, o->x, o->y);
+ zones.push_back(sdbus::Struct(o->width, o->height, o->x, o->y));
+ }
+
+@@ -174,7 +175,7 @@ dbUasv CInputCapturePortal::onSetPointerBarriers(sdbus::ObjectPath requestHandle
+
+ if (zoneSet != lastZoneSet) {
+ Debug::log(WARN, "[input-capture] Invalid zone set discarding barriers");
+- return {1, {}}; //TODO: We should return failed_barries
++ return {0, {}}; //TODO: We should return failed_barries
+ }
+
+ sessions[sessionHandle]->barriers.clear();
+@@ -425,18 +426,23 @@ void CInputCapturePortal::zonesChanged() {
+ return;
+
+ Debug::log(LOG, "[input-capture] Monitor layout has changed, notifing clients");
++ lastZoneSet++;
+
+ for (auto& [key, value] : sessions) {
++ if (!sessionValid(value->sessionHandle))
++ continue;
++ disable(value->sessionHandle);
+ if (!value->zoneChanged())
+ continue;
+
+ std::unordered_map<std::string, sdbus::Variant> options;
+- m_pObject->emitSignal("ZonesChanged").onInterface(INTERFACE_NAME).withArguments(key, options);
++ options["zone_set"] = sdbus::Variant{lastZoneSet - 1};
++ m_pObject->emitSignal("ZonesChanged").onInterface(INTERFACE_NAME).withArguments(value->sessionHandle, options);
+ }
+ }
+
+ bool CInputCapturePortal::SSession::zoneChanged() {
+- //TODO: notify EIS
++ eis->resetPointer();
+ return true;
+ }
+
+diff --git a/src/shared/Eis.cpp b/src/shared/Eis.cpp
+index ed3d111..c5f1163 100644
+--- a/src/shared/Eis.cpp
++++ b/src/shared/Eis.cpp
+@@ -101,12 +101,12 @@ int EmulatedInputServer::onEvent(eis_event* e) {
+
+ if (eis_event_seat_has_capability(e, EIS_DEVICE_CAP_POINTER) && eis_event_seat_has_capability(e, EIS_DEVICE_CAP_BUTTON) &&
+ eis_event_seat_has_capability(e, EIS_DEVICE_CAP_SCROLL))
+- ensurePointer(e);
++ ensurePointer();
+ else
+ clearPointer();
+
+ if (eis_event_seat_has_capability(e, EIS_DEVICE_CAP_KEYBOARD))
+- ensureKeyboard(e);
++ ensureKeyboard();
+ else
+ clearKeyboard();
+ break;
+@@ -125,10 +125,11 @@ int EmulatedInputServer::onEvent(eis_event* e) {
+ return 0;
+ }
+
+-void EmulatedInputServer::ensurePointer(eis_event* event) {
++void EmulatedInputServer::ensurePointer() {
+ if (client.pointer)
+ return;
+
++ Debug::log(LOG, "[EIS] Creating pointer");
+ eis_device* pointer = eis_seat_new_device(client.seat);
+ eis_device_configure_name(pointer, "captured relative pointer");
+ eis_device_configure_capability(pointer, EIS_DEVICE_CAP_POINTER);
+@@ -151,7 +152,7 @@ void EmulatedInputServer::ensurePointer(eis_event* event) {
+ client.pointer = pointer;
+ }
+
+-void EmulatedInputServer::ensureKeyboard(eis_event* event) {
++void EmulatedInputServer::ensureKeyboard() {
+ if (client.keyboard)
+ return;
+
+@@ -256,6 +257,11 @@ void EmulatedInputServer::setKeymap(Keymap _keymap) {
+ keymap = _keymap;
+ }
+
++void EmulatedInputServer::resetPointer() {
++ clearPointer();
++ ensurePointer();
++}
++
+ void EmulatedInputServer::sendMotion(double x, double y) {
+ if (!client.pointer)
+ return;
+diff --git a/src/shared/Eis.hpp b/src/shared/Eis.hpp
+index 3af8181..5688ed2 100644
+--- a/src/shared/Eis.hpp
++++ b/src/shared/Eis.hpp
+@@ -20,6 +20,7 @@ class EmulatedInputServer {
+ void stopEmulating();
+
+ void setKeymap(Keymap _keymap);
++ void resetPointer();
+
+ void sendMotion(double x, double y);
+ void sendKey(uint32_t key, bool pressed);
+@@ -50,8 +51,8 @@ class EmulatedInputServer {
+
+ int onEvent(eis_event* e);
+ void pollEvents();
+- void ensurePointer(eis_event* event);
+- void ensureKeyboard(eis_event* event);
++ void ensurePointer();
++ void ensureKeyboard();
+ Keymap openKeymap();
+ void clearPointer();
+ void clearKeyboard();
+
+From 331405afc284e2fb5c5e494f21d4cd8779c32fd1 Mon Sep 17 00:00:00 2001
+From: littleblack111 <littleblack11111@gmail.com>
+Date: Mon, 27 Jan 2025 15:19:10 +0800
+Subject: [PATCH 17/17] fix(cmake): UUID (#2)
+
+---
+ CMakeLists.txt | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 6486c7e..532fc02 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -63,6 +63,7 @@ pkg_check_modules(
+ libspa-0.2
+ libdrm
+ libeis-1.0
++ uuid
+ gbm
+ hyprlang>=0.2.0
+ hyprutils>=0.2.6
diff --git a/etc/portage/patches/gui-wm/hyprland/7919.patch b/etc/portage/patches/gui-wm/hyprland/7919.patch
new file mode 100644
index 00000000..a05fd2ad
--- /dev/null
+++ b/etc/portage/patches/gui-wm/hyprland/7919.patch
@@ -0,0 +1,368 @@
+diff --git a/.gitmodules b/.gitmodules
+index 638f8ba9..c1f681d0 100644
+--- a/.gitmodules
++++ b/.gitmodules
+@@ -1,6 +1,6 @@
+ [submodule "subprojects/hyprland-protocols"]
+ path = subprojects/hyprland-protocols
+- url = https://github.com/hyprwm/hyprland-protocols
++ url = https://github.com/littleblack111/hyprland-protocols
+ [submodule "subprojects/udis86"]
+ path = subprojects/udis86
+ url = https://github.com/canihavesomecoffee/udis86
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 9c286831..732c594e 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -369,6 +369,8 @@ protocolnew("staging/xdg-dialog" "xdg-dialog-v1" false)
+ protocolnew("staging/single-pixel-buffer" "single-pixel-buffer-v1" false)
+ protocolnew("staging/security-context" "security-context-v1" false)
+
++protocolnew("subprojects/hyprland-protocols/protocols" "hyprland-input-capture-v1"
++ true)
+ protocolwayland()
+
+ # tools
+diff --git a/hyprpm/src/core/PluginManager.cpp b/hyprpm/src/core/PluginManager.cpp
+index 80d0a402..d61f846e 100644
+--- a/hyprpm/src/core/PluginManager.cpp
++++ b/hyprpm/src/core/PluginManager.cpp
+@@ -463,7 +463,7 @@ bool CPluginManager::updateHeaders(bool force) {
+ return false;
+ }
+
+- progress.printMessageAbove(statusString("!", Colors::YELLOW, "Cloning https://github.com/hyprwm/Hyprland, this might take a moment."));
++ progress.printMessageAbove(statusString("!", Colors::YELLOW, "Cloning https://github.com/3l0w/Hyprland, this might take a moment."));
+
+ const bool bShallow = (HLVER.branch == "main") && !m_bNoShallow;
+
+@@ -474,12 +474,12 @@ bool CPluginManager::updateHeaders(bool force) {
+ if (m_bVerbose && bShallow)
+ progress.printMessageAbove(verboseString("will shallow since: {}", SHALLOW_DATE));
+
+- std::string ret = execAndGet(std::format("cd {} && git clone --recursive https://github.com/hyprwm/Hyprland hyprland-{}{}", getTempRoot(), USERNAME,
++ std::string ret = execAndGet(std::format("cd {} && git clone --recursive https://github.com/3l0w/Hyprland hyprland-{}{}", getTempRoot(), USERNAME,
+ (bShallow ? " --shallow-since='" + SHALLOW_DATE + "'" : "")));
+
+ if (!std::filesystem::exists(WORKINGDIR)) {
+ progress.printMessageAbove(failureString("Clone failed. Retrying without shallow."));
+- ret = execAndGet(std::format("cd {} && git clone --recursive https://github.com/hyprwm/hyprland hyprland-{}", getTempRoot(), USERNAME));
++ ret = execAndGet(std::format("cd {} && git clone --recursive https://github.com/3l0w/hyprland hyprland-{}", getTempRoot(), USERNAME));
+ }
+
+ if (!std::filesystem::exists(WORKINGDIR + "/.git")) {
+diff --git a/protocols/meson.build b/protocols/meson.build
+index aa20940d..e7be10cf 100644
+--- a/protocols/meson.build
++++ b/protocols/meson.build
+@@ -41,6 +41,7 @@ protocols = [
+ hyprland_protocol_dir / 'protocols/hyprland-ctm-control-v1.xml',
+ hyprland_protocol_dir / 'protocols/hyprland-surface-v1.xml',
+ hyprland_protocol_dir / 'protocols/hyprland-lock-notify-v1.xml',
++ hyprland_protocol_dir / 'protocols/hyprland-input-capture-v1.xml',
+ wayland_protocol_dir / 'staging/tearing-control/tearing-control-v1.xml',
+ wayland_protocol_dir / 'staging/fractional-scale/fractional-scale-v1.xml',
+ wayland_protocol_dir / 'unstable/xdg-output/xdg-output-unstable-v1.xml',
+diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
+index 247550ae..7f40a604 100644
+--- a/src/managers/KeybindManager.cpp
++++ b/src/managers/KeybindManager.cpp
+@@ -6,6 +6,7 @@
+ #include "../protocols/GlobalShortcuts.hpp"
+ #include "../protocols/core/DataDevice.hpp"
+ #include "../render/decorations/CHyprGroupBarDecoration.hpp"
++#include "../devices/IKeyboard.hpp"
+ #include "KeybindManager.hpp"
+ #include "PointerManager.hpp"
+ #include "Compositor.hpp"
+@@ -14,6 +15,7 @@
+ #include "debug/Log.hpp"
+ #include "helpers/varlist/VarList.hpp"
+ #include "../helpers/signal/Signal.hpp"
++#include "protocols/InputCapture.hpp"
+ #include "../managers/HookSystemManager.hpp"
+ #include "../managers/input/InputManager.hpp"
+ #include "../managers/LayoutManager.hpp"
+@@ -140,6 +142,7 @@ CKeybindManager::CKeybindManager() {
+ m_mDispatchers["event"] = event;
+ m_mDispatchers["global"] = global;
+ m_mDispatchers["setprop"] = setProp;
++ m_mDispatchers["releaseinputcapture"] = releaseInputCapture;
+
+ m_tScrollTimer.reset();
+
+@@ -763,6 +766,14 @@ SDispatchResult CKeybindManager::handleKeybinds(const uint32_t modmask, const SP
+
+ m_iPassPressed = (int)pressed;
+
++ // We only process the releaseinputcapture dispatcher when input capture is active
++ if (PROTO::inputCapture->isCaptured()) {
++ if (k->handler == "releaseinputcapture")
++ res = DISPATCHER->second(k->arg);
++ else
++ break;
++ }
++
+ // if the dispatchers says to pass event then we will
+ if (k->handler == "mouse")
+ res = DISPATCHER->second((pressed ? "1" : "0") + k->arg);
+@@ -3170,3 +3181,7 @@ SDispatchResult CKeybindManager::setProp(std::string args) {
+
+ return {};
+ }
++SDispatchResult CKeybindManager::releaseInputCapture(std::string args) {
++ PROTO::inputCapture->forceRelease();
++ return {};
++}
+diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp
+index 1848ca78..0d92c6d1 100644
+--- a/src/managers/KeybindManager.hpp
++++ b/src/managers/KeybindManager.hpp
+@@ -221,6 +221,7 @@ class CKeybindManager {
+ static SDispatchResult global(std::string);
+ static SDispatchResult event(std::string);
+ static SDispatchResult setProp(std::string);
++ static SDispatchResult releaseInputCapture(std::string);
+
+ friend class CCompositor;
+ friend class CInputManager;
+diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp
+index 48ef5e16..ba242bbe 100644
+--- a/src/managers/PointerManager.cpp
++++ b/src/managers/PointerManager.cpp
+@@ -14,6 +14,7 @@
+ #include "../render/Renderer.hpp"
+ #include "../render/OpenGL.hpp"
+ #include "SeatManager.hpp"
++#include "protocols/InputCapture.hpp"
+ #include <cstring>
+ #include <gbm.h>
+ #include <cairo/cairo.h>
+@@ -753,6 +754,13 @@ void CPointerManager::move(const Vector2D& deltaLogical) {
+ const auto oldPos = pointerPos;
+ auto newPos = oldPos + Vector2D{std::isnan(deltaLogical.x) ? 0.0 : deltaLogical.x, std::isnan(deltaLogical.y) ? 0.0 : deltaLogical.y};
+
++
++ if (!g_pInputManager->isLocked())
++ PROTO::inputCapture->sendMotion(newPos, deltaLogical);
++
++ if (PROTO::inputCapture->isCaptured())
++ return;
++
+ warpTo(newPos);
+ }
+
+@@ -924,14 +932,7 @@ void CPointerManager::attachPointer(SP<IPointer> pointer) {
+ });
+
+ listener->frame = pointer->pointerEvents.frame.registerListener([] (std::any e) {
+- bool shouldSkip = false;
+- if (!g_pSeatManager->mouse.expired() && g_pInputManager->isLocked()) {
+- auto PMONITOR = g_pCompositor->m_pLastMonitor.get();
+- shouldSkip = PMONITOR && PMONITOR->shouldSkipScheduleFrameOnMouseEvent();
+- }
+- g_pSeatManager->isPointerFrameSkipped = shouldSkip;
+- if (!g_pSeatManager->isPointerFrameSkipped)
+- g_pSeatManager->sendPointerFrame();
++ g_pInputManager->onMouseFrame();
+ });
+
+ listener->swipeBegin = pointer->pointerEvents.swipeBegin.registerListener([] (std::any e) {
+diff --git a/src/managers/ProtocolManager.cpp b/src/managers/ProtocolManager.cpp
+index d3270fe2..d20f7c7d 100644
+--- a/src/managers/ProtocolManager.cpp
++++ b/src/managers/ProtocolManager.cpp
+@@ -48,6 +48,7 @@
+ #include "../protocols/SinglePixel.hpp"
+ #include "../protocols/SecurityContext.hpp"
+ #include "../protocols/CTMControl.hpp"
++#include "../protocols/InputCapture.hpp"
+ #include "../protocols/HyprlandSurface.hpp"
+
+ #include "../protocols/core/Seat.hpp"
+@@ -168,6 +169,7 @@ CProtocolManager::CProtocolManager() {
+ PROTO::singlePixel = makeUnique<CSinglePixelProtocol>(&wp_single_pixel_buffer_manager_v1_interface, 1, "SinglePixel");
+ PROTO::securityContext = makeUnique<CSecurityContextProtocol>(&wp_security_context_manager_v1_interface, 1, "SecurityContext");
+ PROTO::ctm = makeUnique<CHyprlandCTMControlProtocol>(&hyprland_ctm_control_manager_v1_interface, 1, "CTMControl");
++ PROTO::inputCapture = makeUnique<CInputCaptureProtocol>(&hyprland_input_capture_manager_v1_interface, 1, "InputCapture");
+ PROTO::hyprlandSurface = makeUnique<CHyprlandSurfaceProtocol>(&hyprland_surface_manager_v1_interface, 2, "HyprlandSurface");
+
+ if (*PENABLEXXCM) {
+@@ -248,6 +250,7 @@ CProtocolManager::~CProtocolManager() {
+ PROTO::singlePixel.reset();
+ PROTO::securityContext.reset();
+ PROTO::ctm.reset();
++ PROTO::inputCapture.reset();
+ PROTO::hyprlandSurface.reset();
+
+ PROTO::lease.reset();
+diff --git a/src/managers/SeatManager.cpp b/src/managers/SeatManager.cpp
+index 6d2b906f..a22edef8 100644
+--- a/src/managers/SeatManager.cpp
++++ b/src/managers/SeatManager.cpp
+@@ -4,6 +4,7 @@
+ #include "../protocols/DataDeviceWlr.hpp"
+ #include "../protocols/PrimarySelection.hpp"
+ #include "../protocols/core/Compositor.hpp"
++#include "../protocols/InputCapture.hpp"
+ #include "../Compositor.hpp"
+ #include "../devices/IKeyboard.hpp"
+ #include "../desktop/LayerSurface.hpp"
+@@ -100,6 +101,7 @@ void CSeatManager::updateActiveKeyboardData() {
+ if (keyboard)
+ PROTO::seat->updateRepeatInfo(keyboard->repeatRate, keyboard->repeatDelay);
+ PROTO::seat->updateKeymap();
++ PROTO::inputCapture->updateKeymap();
+ }
+
+ void CSeatManager::setKeyboardFocus(SP<CWLSurfaceResource> surf) {
+diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp
+index 3d8c6de8..e6f3cd33 100644
+--- a/src/managers/input/InputManager.cpp
++++ b/src/managers/input/InputManager.cpp
+@@ -20,6 +20,7 @@
+ #include "../../protocols/core/DataDevice.hpp"
+ #include "../../protocols/core/Compositor.hpp"
+ #include "../../protocols/XDGShell.hpp"
++#include "../../protocols/InputCapture.hpp"
+
+ #include "../../devices/Mouse.hpp"
+ #include "../../devices/VirtualPointer.hpp"
+@@ -104,6 +105,9 @@ void CInputManager::onMouseMoved(IPointer::SMotionEvent e) {
+
+ g_pPointerManager->move(DELTA);
+
++ if (PROTO::inputCapture->isCaptured())
++ return;
++
+ mouseMoveUnified(e.timeMs, false, e.mouse);
+
+ m_tmrLastCursorMovement.reset();
+@@ -550,6 +554,11 @@ void CInputManager::onMouseButton(IPointer::SButtonEvent e) {
+ if (e.mouse)
+ recheckMouseWarpOnMouseInput();
+
++ PROTO::inputCapture->sendButton(e.button, (hyprlandInputCaptureManagerV1ButtonState)e.state);
++
++ if (PROTO::inputCapture->isCaptured())
++ return;
++
+ m_tmrLastCursorMovement.reset();
+
+ if (e.state == WL_POINTER_BUTTON_STATE_PRESSED) {
+@@ -787,7 +796,13 @@ void CInputManager::onMouseWheel(IPointer::SAxisEvent e) {
+ if (e.mouse)
+ recheckMouseWarpOnMouseInput();
+
+- bool passEvent = g_pKeybindManager->onAxisEvent(e);
++ PROTO::inputCapture->sendAxis((hyprlandInputCaptureManagerV1Axis)e.axis, e.delta);
++ if (e.source == 0)
++ PROTO::inputCapture->sendAxisValue120((hyprlandInputCaptureManagerV1Axis)e.axis, e.delta);
++ else if (e.delta == 0)
++ PROTO::inputCapture->sendAxisStop((hyprlandInputCaptureManagerV1Axis)e.axis);
++
++ bool passEvent = !PROTO::inputCapture->isCaptured() && g_pKeybindManager->onAxisEvent(e);
+
+ if (!passEvent)
+ return;
+@@ -867,6 +882,22 @@ void CInputManager::onMouseWheel(IPointer::SAxisEvent e) {
+ g_pSeatManager->sendPointerAxis(e.timeMs, e.axis, delta, deltaDiscrete, value120, e.source, WL_POINTER_AXIS_RELATIVE_DIRECTION_IDENTICAL);
+ }
+
++void CInputManager::onMouseFrame() {
++ PROTO::inputCapture->sendFrame();
++
++ if (PROTO::inputCapture->isCaptured())
++ return;
++
++ bool shouldSkip = false;
++ if (!g_pSeatManager->mouse.expired() && g_pInputManager->isLocked()) {
++ auto PMONITOR = g_pCompositor->m_pLastMonitor.get();
++ shouldSkip = PMONITOR && PMONITOR->shouldSkipScheduleFrameOnMouseEvent();
++ }
++ g_pSeatManager->isPointerFrameSkipped = shouldSkip;
++ if (!g_pSeatManager->isPointerFrameSkipped)
++ g_pSeatManager->sendPointerFrame();
++}
++
+ Vector2D CInputManager::getMouseCoordsInternal() {
+ return g_pPointerManager->position();
+ }
+@@ -1326,10 +1357,12 @@ void CInputManager::onKeyboardKey(std::any event, SP<IKeyboard> pKeyboard) {
+ const auto EMAP = std::unordered_map<std::string, std::any>{{"keyboard", pKeyboard}, {"event", event}};
+ EMIT_HOOK_EVENT_CANCELLABLE("keyPress", EMAP);
+
+- bool passEvent = DISALLOWACTION || g_pKeybindManager->onKeyEvent(event, pKeyboard);
++ bool passEvent = (DISALLOWACTION || g_pKeybindManager->onKeyEvent(event, pKeyboard)) && !PROTO::inputCapture->isCaptured();
+
+ auto e = std::any_cast<IKeyboard::SKeyEvent>(event);
+
++ PROTO::inputCapture->sendKey(e.keycode, (hyprlandInputCaptureManagerV1KeyState)e.state);
++
+ if (passEvent) {
+ const auto IME = m_sIMERelay.m_pIME.lock();
+
+@@ -1356,6 +1389,11 @@ void CInputManager::onKeyboardMod(SP<IKeyboard> pKeyboard) {
+ auto MODS = pKeyboard->modifiersState;
+ MODS.depressed = ALLMODS;
+
++ PROTO::inputCapture->sendModifiers(MODS.depressed,MODS.latched, MODS.locked, MODS.group);
++
++ if (PROTO::inputCapture->isCaptured())
++ return;
++
+ const auto IME = m_sIMERelay.m_pIME.lock();
+
+ if (IME && IME->hasGrab() && !DISALLOWACTION) {
+diff --git a/src/managers/input/InputManager.hpp b/src/managers/input/InputManager.hpp
+index 3afb1b88..390ce6a4 100644
+--- a/src/managers/input/InputManager.hpp
++++ b/src/managers/input/InputManager.hpp
+@@ -89,6 +89,7 @@ class CInputManager {
+ void onMouseWarp(IPointer::SMotionAbsoluteEvent);
+ void onMouseButton(IPointer::SButtonEvent);
+ void onMouseWheel(IPointer::SAxisEvent);
++ void onMouseFrame();
+ void onKeyboardKey(std::any, SP<IKeyboard>);
+ void onKeyboardMod(SP<IKeyboard>);
+
+diff --git a/src/protocols/core/Output.cpp b/src/protocols/core/Output.cpp
+index 77f0661e..4d46c362 100644
+--- a/src/protocols/core/Output.cpp
++++ b/src/protocols/core/Output.cpp
+@@ -74,10 +74,9 @@ void CWLOutputResource::updateState() {
+ if (resource->version() >= 2)
+ resource->sendScale(std::ceil(monitor->scale));
+
+- resource->sendMode((wl_output_mode)(WL_OUTPUT_MODE_CURRENT), monitor->vecPixelSize.x, monitor->vecPixelSize.y, monitor->refreshRate * 1000.0);
+-
+- resource->sendGeometry(0, 0, monitor->output->physicalSize.x, monitor->output->physicalSize.y, (wl_output_subpixel)monitor->output->subpixel, monitor->output->make.c_str(),
++ resource->sendGeometry(monitor->vecPosition.x, monitor->vecPosition.y, monitor->output->physicalSize.x, monitor->output->physicalSize.y, (wl_output_subpixel)monitor->output->subpixel, monitor->output->make.c_str(),
+ monitor->output->model.c_str(), monitor->transform);
++ resource->sendMode((wl_output_mode)(WL_OUTPUT_MODE_CURRENT), monitor->vecPixelSize.x, monitor->vecPixelSize.y, monitor->refreshRate * 1000.0);
+
+ if (resource->version() >= 2)
+ resource->sendDone();
+diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
+index 42445728..75e429e2 100644
+--- a/src/render/Renderer.cpp
++++ b/src/render/Renderer.cpp
+@@ -22,6 +22,7 @@
+ #include "../protocols/core/Compositor.hpp"
+ #include "../protocols/DRMSyncobj.hpp"
+ #include "../protocols/LinuxDMABUF.hpp"
++#include "../protocols/InputCapture.hpp"
+ #include "../helpers/sync/SyncTimeline.hpp"
+ #include "../hyprerror/HyprError.hpp"
+ #include "../debug/HyprDebugOverlay.hpp"
+@@ -1988,7 +1989,9 @@ void CHyprRenderer::ensureCursorRenderingMode() {
+ if (*PCURSORTIMEOUT > 0)
+ m_sCursorHiddenConditions.hiddenOnTimeout = *PCURSORTIMEOUT < g_pInputManager->m_tmrLastCursorMovement.getSeconds();
+
+- const bool HIDE = m_sCursorHiddenConditions.hiddenOnTimeout || m_sCursorHiddenConditions.hiddenOnTouch || m_sCursorHiddenConditions.hiddenOnKeyboard;
++
++ const bool HIDE = m_sCursorHiddenConditions.hiddenOnTimeout || m_sCursorHiddenConditions.hiddenOnTouch || m_sCursorHiddenConditions.hiddenOnKeyboard ||
++ PROTO::inputCapture->isCaptured();
+
+ if (HIDE == m_bCursorHidden)
+ return;
diff --git a/etc/portage/patches/sys-apps/portage/compressdebug-zstd.patch b/etc/portage/patches/sys-apps/portage/compressdebug-zstd.patch
new file mode 100644
index 00000000..31687296
--- /dev/null
+++ b/etc/portage/patches/sys-apps/portage/compressdebug-zstd.patch
@@ -0,0 +1,11 @@
+--- a/bin/estrip
++++ b/bin/estrip
+@@ -295,7 +295,7 @@ save_elf_debug() {
+ mv "${splitdebug}" "${dst}"
+ else
+ local objcopy_flags="--only-keep-debug"
+- ${FEATURES_compressdebug} && objcopy_flags+=" --compress-debug-sections"
++ ${FEATURES_compressdebug} && objcopy_flags+=" --compress-debug-sections=zstd"
+ ${OBJCOPY} ${objcopy_flags} "${src}" "${dst}" &&
+ ${OBJCOPY} --add-gnu-debuglink="${dst}" "${src}"
+ fi
diff --git a/etc/portage/postsync.d/50-eix-postsync b/etc/portage/postsync.d/50-eix-postsync
new file mode 120000
index 00000000..965aca0b
--- /dev/null
+++ b/etc/portage/postsync.d/50-eix-postsync
@@ -0,0 +1 @@
+../../../usr/bin/eix-postsync \ No newline at end of file
diff --git a/etc/portage/repos.conf/eselect-repo.conf b/etc/portage/repos.conf/eselect-repo.conf
new file mode 100644
index 00000000..ae566f62
--- /dev/null
+++ b/etc/portage/repos.conf/eselect-repo.conf
@@ -0,0 +1,59 @@
+# created by eselect-repo
+
+[guru]
+location = /var/db/repos/guru
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/guru.git
+
+
+[zugaina]
+location = /var/db/repos/zugaina
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/zugaina.git
+
+[9999]
+location = /var/db/repos/9999
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/9999.git
+
+[wayland-desktop]
+location = /var/db/repos/wayland-desktop
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/wayland-desktop.git
+
+[parona-overlay]
+location = /var/db/repos/parona-overlay
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/parona-overlay.git
+
+[kcning]
+location = /var/db/repos/kcning
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/kcning.git
+
+[gig]
+location = /var/db/repos/gig
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/gig.git
+
+[xarblu-overlay]
+location = /var/db/repos/xarblu-overlay
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/xarblu-overlay.git
+
+[mndz]
+location = /var/db/repos/mndz
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/mndz.git
+
+
+[gentoo]
+priority = 999
+location = /var/db/repos/gentoo
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/gentoo.git
+
+
+
+[ebuilds]
+location = /var/db/repos/ebuilds
diff --git a/etc/portage/repos.conf/eselect-repo.conf~ b/etc/portage/repos.conf/eselect-repo.conf~
new file mode 100644
index 00000000..9abe9a39
--- /dev/null
+++ b/etc/portage/repos.conf/eselect-repo.conf~
@@ -0,0 +1,62 @@
+# created by eselect-repo
+
+[guru]
+location = /var/db/repos/guru
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/guru.git
+
+
+[zugaina]
+location = /var/db/repos/zugaina
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/zugaina.git
+
+[9999]
+location = /var/db/repos/9999
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/9999.git
+
+[wayland-desktop]
+location = /var/db/repos/wayland-desktop
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/wayland-desktop.git
+
+[parona-overlay]
+location = /var/db/repos/parona-overlay
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/parona-overlay.git
+
+[kcning]
+location = /var/db/repos/kcning
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/kcning.git
+
+[gig]
+location = /var/db/repos/gig
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/gig.git
+
+[xarblu-overlay]
+location = /var/db/repos/xarblu-overlay
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/xarblu-overlay.git
+
+[mndz]
+location = /var/db/repos/mndz
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/mndz.git
+
+
+[gentoo]
+priority = 999
+location = /var/db/repos/gentoo
+sync-type = git
+sync-uri = https://github.com/gentoo-mirror/gentoo.git
+
+
+
+[local]
+location = /var/db/repos/local
+
+[ebuilds]
+location = /var/db/repos/ebuilds
diff --git a/etc/portage/savedconfig/sys-kernel/linux-firmware-20250109-r1 b/etc/portage/savedconfig/sys-kernel/linux-firmware-20250109-r1
new file mode 100644
index 00000000..7aa1a7ed
--- /dev/null
+++ b/etc/portage/savedconfig/sys-kernel/linux-firmware-20250109-r1
@@ -0,0 +1,4362 @@
+# Remove files that shall not be installed from this list.
+3com/typhoon.bin
+INT8866RCA2.bin
+TAS2XXX1EB3.bin
+TAS2XXX1EB30.bin
+TAS2XXX1EB31.bin
+TAS2XXX2234.bin
+TAS2XXX3870.bin
+TAS2XXX387D.bin
+TAS2XXX387E.bin
+TAS2XXX387F.bin
+TAS2XXX3880.bin
+TAS2XXX3881.bin
+TAS2XXX3882.bin
+TAS2XXX3884.bin
+TAS2XXX3886.bin
+TAS2XXX38A5.bin
+TAS2XXX38A7.bin
+TAS2XXX38A8.bin
+TAS2XXX38B8.bin
+TAS2XXX38B9.bin
+TAS2XXX38BA.bin
+TAS2XXX38BB.bin
+TAS2XXX38BE.bin
+TAS2XXX38BF.bin
+TAS2XXX38C3.bin
+TAS2XXX38CB.bin
+TAS2XXX38CD.bin
+TAS2XXX38D3.bin
+TAS2XXX38D4.bin
+TAS2XXX38D5.bin
+TAS2XXX38D6.bin
+TAS2XXX38DF.bin
+TAS2XXX38E0.bin
+TIAS2781RCA2.bin
+TIAS2781RCA4.bin
+a300_pfp.fw
+a300_pm4.fw
+acenic/tg1.bin
+acenic/tg2.bin
+adaptec/starfire_rx.bin
+adaptec/starfire_tx.bin
+advansys/3550.bin
+advansys/mcode.bin
+advansys/38C1600.bin
+advansys/38C0800.bin
+agere_ap_fw.bin
+agere_sta_fw.bin
+airoha/EthMD32.DSP.bin
+airoha/EthMD32.dm.bin
+amd/amd_sev_fam17h_model0xh.sbin
+amd/amd_sev_fam19h_model0xh.sbin
+amd/amd_sev_fam19h_modelaxh.sbin
+amd/amd_sev_fam19h_model1xh.sbin
+amd/amd_sev_fam17h_model3xh.sbin
+amd-ucode/microcode_amd_fam17h.bin
+amd-ucode/README
+amd-ucode/microcode_amd_fam19h.bin
+amd-ucode/microcode_amd_fam16h.bin
+amd-ucode/microcode_amd_fam15h.bin
+amd-ucode/microcode_amd.bin
+amdgpu/gc_11_5_2_rlc.bin
+amdgpu/topaz_smc.bin
+amdgpu/polaris12_vce.bin
+amdgpu/sienna_cichlid_sos.bin
+amdgpu/gc_12_0_0_mec.bin
+amdgpu/pitcairn_ce.bin
+amdgpu/dimgrey_cavefish_ce.bin
+amdgpu/carrizo_mec2.bin
+amdgpu/kabini_pfp.bin
+amdgpu/polaris12_mec_2.bin
+amdgpu/renoir_vcn.bin
+amdgpu/psp_13_0_4_ta.bin
+amdgpu/polaris12_smc.bin
+amdgpu/dcn_3_1_6_dmcub.bin
+amdgpu/arcturus_sos.bin
+amdgpu/gc_12_0_0_toc.bin
+amdgpu/gc_9_4_3_mec.bin
+amdgpu/cyan_skillfish2_sdma.bin
+amdgpu/psp_14_0_3_ta.bin
+amdgpu/vegam_ce.bin
+amdgpu/arcturus_ta.bin
+amdgpu/psp_14_0_2_ta.bin
+amdgpu/tonga_mc.bin
+amdgpu/psp_14_0_4_toc.bin
+amdgpu/gc_11_0_2_mec.bin
+amdgpu/gc_11_0_3_rlc.bin
+amdgpu/sdma_6_1_0.bin
+amdgpu/yellow_carp_toc.bin
+amdgpu/cyan_skillfish2_pfp.bin
+amdgpu/navi14_ce.bin
+amdgpu/gc_9_4_3_rlc.bin
+amdgpu/cyan_skillfish2_ce.bin
+amdgpu/kaveri_rlc.bin
+amdgpu/green_sardine_mec.bin
+amdgpu/si58_mc.bin
+amdgpu/vega10_uvd.bin
+amdgpu/hawaii_me.bin
+amdgpu/navi10_sdma.bin
+amdgpu/polaris11_vce.bin
+amdgpu/sienna_cichlid_mec.bin
+amdgpu/psp_13_0_8_asd.bin
+amdgpu/tonga_k_smc.bin
+amdgpu/polaris11_me.bin
+amdgpu/hawaii_vce.bin
+amdgpu/gc_11_0_0_rlc.bin
+amdgpu/carrizo_sdma.bin
+amdgpu/topaz_ce.bin
+amdgpu/vegam_mec2.bin
+amdgpu/polaris12_rlc.bin
+amdgpu/beige_goby_ta.bin
+amdgpu/polaris11_k_smc.bin
+amdgpu/tonga_sdma1.bin
+amdgpu/navi12_ce.bin
+amdgpu/vangogh_pfp.bin
+amdgpu/gc_9_4_4_rlc.bin
+amdgpu/beige_goby_rlc.bin
+amdgpu/dimgrey_cavefish_sos.bin
+amdgpu/dimgrey_cavefish_mec.bin
+amdgpu/picasso_ta.bin
+amdgpu/polaris12_ce_2.bin
+amdgpu/polaris11_mc.bin
+amdgpu/gc_11_5_1_mes_2.bin
+amdgpu/vega12_me.bin
+amdgpu/gc_12_0_0_mes1.bin
+amdgpu/green_sardine_dmcub.bin
+amdgpu/carrizo_uvd.bin
+amdgpu/green_sardine_pfp.bin
+amdgpu/renoir_rlc.bin
+amdgpu/topaz_sdma.bin
+amdgpu/vega20_pfp.bin
+amdgpu/sdma_4_4_5.bin
+amdgpu/raven2_ce.bin
+amdgpu/vega12_pfp.bin
+amdgpu/polaris10_pfp_2.bin
+amdgpu/vega12_sdma.bin
+amdgpu/sienna_cichlid_me.bin
+amdgpu/gc_12_0_1_toc.bin
+amdgpu/vangogh_me.bin
+amdgpu/navi14_smc.bin
+amdgpu/vegam_vce.bin
+amdgpu/fiji_pfp.bin
+amdgpu/vega12_mec.bin
+amdgpu/kabini_me.bin
+amdgpu/raven2_sdma.bin
+amdgpu/yellow_carp_vcn.bin
+amdgpu/tahiti_smc.bin
+amdgpu/kaveri_me.bin
+amdgpu/green_sardine_vcn.bin
+amdgpu/oland_uvd.bin
+amdgpu/gc_11_5_0_pfp.bin
+amdgpu/tonga_smc.bin
+amdgpu/navi10_pfp.bin
+amdgpu/navi14_sdma1.bin
+amdgpu/mullins_sdma1.bin
+amdgpu/arcturus_asd.bin
+amdgpu/navi10_gpu_info.bin
+amdgpu/renoir_mec.bin
+amdgpu/picasso_vcn.bin
+amdgpu/stoney_mec.bin
+amdgpu/dimgrey_cavefish_vcn.bin
+amdgpu/psp_14_0_3_sos.bin
+amdgpu/aldebaran_vcn.bin
+amdgpu/vangogh_ce.bin
+amdgpu/psp_13_0_7_sos.bin
+amdgpu/topaz_pfp.bin
+amdgpu/stoney_me.bin
+amdgpu/gc_11_5_2_me.bin
+amdgpu/vega20_asd.bin
+amdgpu/raven2_pfp.bin
+amdgpu/navi14_pfp_wks.bin
+amdgpu/kabini_mec.bin
+amdgpu/bonaire_me.bin
+amdgpu/dimgrey_cavefish_pfp.bin
+amdgpu/carrizo_rlc.bin
+amdgpu/vcn_4_0_0.bin
+amdgpu/sdma_6_1_1.bin
+amdgpu/beige_goby_me.bin
+amdgpu/fiji_mc.bin
+amdgpu/polaris10_sdma1.bin
+amdgpu/mullins_mec.bin
+amdgpu/polaris10_mec_2.bin
+amdgpu/topaz_mec.bin
+amdgpu/navi12_asd.bin
+amdgpu/beige_goby_mec.bin
+amdgpu/vangogh_sdma.bin
+amdgpu/vcn_4_0_4.bin
+amdgpu/psp_13_0_6_ta.bin
+amdgpu/yellow_carp_me.bin
+amdgpu/stoney_uvd.bin
+amdgpu/kabini_uvd.bin
+amdgpu/raven2_mec2.bin
+amdgpu/vega20_uvd.bin
+amdgpu/psp_14_0_0_ta.bin
+amdgpu/gc_11_5_1_me.bin
+amdgpu/psp_13_0_11_ta.bin
+amdgpu/gc_11_5_1_imu.bin
+amdgpu/dcn_3_5_1_dmcub.bin
+amdgpu/tonga_rlc.bin
+amdgpu/polaris11_mec.bin
+amdgpu/dimgrey_cavefish_rlc.bin
+amdgpu/polaris10_ce.bin
+amdgpu/smu_13_0_7.bin
+amdgpu/dimgrey_cavefish_sdma.bin
+amdgpu/vega20_mec.bin
+amdgpu/oland_k_smc.bin
+amdgpu/gc_11_0_4_imu.bin
+amdgpu/dimgrey_cavefish_ta.bin
+amdgpu/hawaii_pfp.bin
+amdgpu/fiji_mec2.bin
+amdgpu/polaris12_mc.bin
+amdgpu/polaris11_uvd.bin
+amdgpu/polaris12_uvd.bin
+amdgpu/renoir_sdma.bin
+amdgpu/green_sardine_ta.bin
+amdgpu/vcn_4_0_6.bin
+amdgpu/vega12_ce.bin
+amdgpu/tahiti_rlc.bin
+amdgpu/polaris11_pfp_2.bin
+amdgpu/navi10_mec.bin
+amdgpu/vega20_me.bin
+amdgpu/psp_13_0_11_toc.bin
+amdgpu/raven_gpu_info.bin
+amdgpu/gc_10_3_6_ce.bin
+amdgpu/navi12_gpu_info.bin
+amdgpu/navy_flounder_ta.bin
+amdgpu/tonga_pfp.bin
+amdgpu/gc_11_0_3_mec.bin
+amdgpu/navi12_sdma.bin
+amdgpu/vangogh_vcn.bin
+amdgpu/fiji_rlc.bin
+amdgpu/vcn_4_0_6_1.bin
+amdgpu/polaris12_sdma.bin
+amdgpu/sienna_cichlid_ta.bin
+amdgpu/sienna_cichlid_vcn.bin
+amdgpu/gc_12_0_0_mes.bin
+amdgpu/gc_9_4_4_mec.bin
+amdgpu/bonaire_k_smc.bin
+amdgpu/polaris12_pfp.bin
+amdgpu/vcn_4_0_3.bin
+amdgpu/polaris12_32_mc.bin
+amdgpu/cyan_skillfish2_me.bin
+amdgpu/fiji_mec.bin
+amdgpu/renoir_asd.bin
+amdgpu/renoir_gpu_info.bin
+amdgpu/vegam_rlc.bin
+amdgpu/gc_11_5_1_mes1.bin
+amdgpu/oland_rlc.bin
+amdgpu/yellow_carp_ta.bin
+amdgpu/fiji_vce.bin
+amdgpu/cyan_skillfish2_sdma1.bin
+amdgpu/psp_13_0_6_sos.bin
+amdgpu/gc_11_5_1_mec.bin
+amdgpu/banks_k_2_smc.bin
+amdgpu/kaveri_vce.bin
+amdgpu/aldebaran_mec2.bin
+amdgpu/hainan_k_smc.bin
+amdgpu/navi10_ta.bin
+amdgpu/polaris10_mc.bin
+amdgpu/vega10_me.bin
+amdgpu/gc_11_0_0_pfp.bin
+amdgpu/navi10_asd.bin
+amdgpu/navi10_smc.bin
+amdgpu/vega12_uvd.bin
+amdgpu/tonga_me.bin
+amdgpu/navi14_asd.bin
+amdgpu/raven2_gpu_info.bin
+amdgpu/sdma_6_1_2.bin
+amdgpu/gc_10_3_7_pfp.bin
+amdgpu/fiji_uvd.bin
+amdgpu/gc_11_0_4_mes1.bin
+amdgpu/yellow_carp_mec.bin
+amdgpu/navi14_ce_wks.bin
+amdgpu/polaris12_sdma1.bin
+amdgpu/psp_13_0_8_ta.bin
+amdgpu/vega10_sdma.bin
+amdgpu/pitcairn_me.bin
+amdgpu/psp_14_0_4_ta.bin
+amdgpu/beige_goby_dmcub.bin
+amdgpu/renoir_ta.bin
+amdgpu/hawaii_rlc.bin
+amdgpu/vega10_asd.bin
+amdgpu/gc_11_0_2_rlc.bin
+amdgpu/mullins_rlc.bin
+amdgpu/hainan_smc.bin
+amdgpu/aldebaran_mec.bin
+amdgpu/raven_pfp.bin
+amdgpu/kaveri_mec.bin
+amdgpu/pitcairn_smc.bin
+amdgpu/gc_11_0_3_imu.bin
+amdgpu/polaris11_ce_2.bin
+amdgpu/aldebaran_sdma.bin
+amdgpu/psp_13_0_7_ta.bin
+amdgpu/bonaire_rlc.bin
+amdgpu/gc_11_0_1_mes.bin
+amdgpu/navy_flounder_ce.bin
+amdgpu/polaris10_vce.bin
+amdgpu/sienna_cichlid_pfp.bin
+amdgpu/polaris12_k_mc.bin
+amdgpu/raven_asd.bin
+amdgpu/gc_10_3_6_mec.bin
+amdgpu/navi10_rlc.bin
+amdgpu/kaveri_sdma1.bin
+amdgpu/beige_goby_mec2.bin
+amdgpu/vcn_5_0_0.bin
+amdgpu/polaris12_me_2.bin
+amdgpu/gc_10_3_7_ce.bin
+amdgpu/navi12_sdma1.bin
+amdgpu/dcn_3_1_5_dmcub.bin
+amdgpu/mullins_me.bin
+amdgpu/gc_11_5_0_imu.bin
+amdgpu/tonga_uvd.bin
+amdgpu/gc_11_5_2_imu.bin
+amdgpu/bonaire_pfp.bin
+amdgpu/dimgrey_cavefish_smc.bin
+amdgpu/kabini_rlc.bin
+amdgpu/tahiti_mc.bin
+amdgpu/sienna_cichlid_sdma.bin
+amdgpu/arcturus_mec2.bin
+amdgpu/oland_me.bin
+amdgpu/dcn_3_5_dmcub.bin
+amdgpu/cyan_skillfish2_mec.bin
+amdgpu/vega12_asd.bin
+amdgpu/kaveri_ce.bin
+amdgpu/mullins_uvd.bin
+amdgpu/gc_11_0_4_me.bin
+amdgpu/verde_mc.bin
+amdgpu/navi14_pfp.bin
+amdgpu/navi14_me.bin
+amdgpu/hawaii_mec.bin
+amdgpu/sdma_6_0_1.bin
+amdgpu/gc_11_0_1_mes_2.bin
+amdgpu/vega12_smc.bin
+amdgpu/picasso_mec.bin
+amdgpu/gc_11_5_0_me.bin
+amdgpu/hawaii_mc.bin
+amdgpu/raven_ta.bin
+amdgpu/gc_11_0_4_rlc.bin
+amdgpu/raven_me.bin
+amdgpu/vangogh_rlc.bin
+amdgpu/gc_10_3_6_rlc.bin
+amdgpu/verde_rlc.bin
+amdgpu/sienna_cichlid_rlc.bin
+amdgpu/pitcairn_uvd.bin
+amdgpu/gc_9_4_4_sjt_mec.bin
+amdgpu/polaris12_me.bin
+amdgpu/psp_14_0_1_toc.bin
+amdgpu/arcturus_vcn.bin
+amdgpu/gc_11_5_2_mec.bin
+amdgpu/gc_12_0_0_uni_mes.bin
+amdgpu/polaris11_k_mc.bin
+amdgpu/vega10_rlc.bin
+amdgpu/dcn_3_2_0_dmcub.bin
+amdgpu/polaris12_pfp_2.bin
+amdgpu/sienna_cichlid_ce.bin
+amdgpu/vpe_6_1_1.bin
+amdgpu/navy_flounder_smc.bin
+amdgpu/gc_10_3_7_rlc.bin
+amdgpu/hawaii_smc.bin
+amdgpu/gc_11_5_0_mes1.bin
+amdgpu/psp_14_0_1_ta.bin
+amdgpu/polaris10_pfp.bin
+amdgpu/psp_13_0_5_toc.bin
+amdgpu/vega20_vce.bin
+amdgpu/sienna_cichlid_dmcub.bin
+amdgpu/beige_goby_sdma.bin
+amdgpu/carrizo_mec.bin
+amdgpu/polaris12_mec2_2.bin
+amdgpu/navi14_sdma.bin
+amdgpu/gc_11_0_3_mes1.bin
+amdgpu/gc_11_5_1_pfp.bin
+amdgpu/dcn_3_2_1_dmcub.bin
+amdgpu/dimgrey_cavefish_mec2.bin
+amdgpu/raven_sdma.bin
+amdgpu/gc_10_3_6_pfp.bin
+amdgpu/smu_13_0_10.bin
+amdgpu/polaris11_pfp.bin
+amdgpu/navi10_me.bin
+amdgpu/psp_13_0_10_sos.bin
+amdgpu/stoney_vce.bin
+amdgpu/vega10_acg_smc.bin
+amdgpu/carrizo_ce.bin
+amdgpu/navy_flounder_mec2.bin
+amdgpu/gc_11_5_1_rlc.bin
+amdgpu/vega20_sos.bin
+amdgpu/beige_goby_vcn.bin
+amdgpu/sdma_7_0_0.bin
+amdgpu/navi14_sos.bin
+amdgpu/vcn_4_0_2.bin
+amdgpu/vega12_sos.bin
+amdgpu/vega12_mec2.bin
+amdgpu/navi14_rlc.bin
+amdgpu/gc_10_3_7_mec2.bin
+amdgpu/psp_13_0_8_toc.bin
+amdgpu/bonaire_uvd.bin
+amdgpu/verde_k_smc.bin
+amdgpu/kabini_ce.bin
+amdgpu/vegam_sdma1.bin
+amdgpu/vangogh_toc.bin
+amdgpu/yellow_carp_sdma.bin
+amdgpu/picasso_rlc.bin
+amdgpu/stoney_sdma.bin
+amdgpu/vegam_sdma.bin
+amdgpu/yellow_carp_mec2.bin
+amdgpu/vega20_sdma.bin
+amdgpu/vega10_pfp.bin
+amdgpu/green_sardine_ce.bin
+amdgpu/picasso_sdma.bin
+amdgpu/verde_ce.bin
+amdgpu/topaz_k_smc.bin
+amdgpu/gc_11_5_0_mes_2.bin
+amdgpu/kabini_sdma1.bin
+amdgpu/gc_11_0_0_me.bin
+amdgpu/kaveri_sdma.bin
+amdgpu/navi12_mec2.bin
+amdgpu/vangogh_mec2.bin
+amdgpu/gc_11_0_1_rlc.bin
+amdgpu/dimgrey_cavefish_me.bin
+amdgpu/yellow_carp_asd.bin
+amdgpu/mullins_pfp.bin
+amdgpu/gc_12_0_1_pfp.bin
+amdgpu/picasso_ce.bin
+amdgpu/gc_11_0_1_pfp.bin
+amdgpu/gc_11_0_0_mes.bin
+amdgpu/pitcairn_rlc.bin
+amdgpu/renoir_dmcub.bin
+amdgpu/gc_11_5_2_mes_2.bin
+amdgpu/psp_13_0_14_ta.bin
+amdgpu/gc_11_0_3_me.bin
+amdgpu/vegam_mec.bin
+amdgpu/green_sardine_sdma.bin
+amdgpu/tahiti_me.bin
+amdgpu/gc_11_0_0_mes1.bin
+amdgpu/tahiti_k_smc.bin
+amdgpu/polaris11_smc.bin
+amdgpu/topaz_rlc.bin
+amdgpu/vpe_6_1_0.bin
+amdgpu/navi14_vcn.bin
+amdgpu/gc_12_0_1_mes1.bin
+amdgpu/gc_11_5_0_mec.bin
+amdgpu/smu_14_0_3.bin
+amdgpu/oland_mc.bin
+amdgpu/polaris12_mec2.bin
+amdgpu/polaris10_me_2.bin
+amdgpu/psp_13_0_4_toc.bin
+amdgpu/navy_flounder_dmcub.bin
+amdgpu/sienna_cichlid_smc.bin
+amdgpu/aldebaran_sos.bin
+amdgpu/polaris11_ce.bin
+amdgpu/bonaire_smc.bin
+amdgpu/hainan_pfp.bin
+amdgpu/polaris12_k_smc.bin
+amdgpu/gc_10_3_7_mec.bin
+amdgpu/cyan_skillfish2_mec2.bin
+amdgpu/vangogh_dmcub.bin
+amdgpu/sdma_6_0_3.bin
+amdgpu/picasso_pfp.bin
+amdgpu/vega10_vce.bin
+amdgpu/vcn_3_1_2.bin
+amdgpu/vega20_smc.bin
+amdgpu/raven_mec.bin
+amdgpu/renoir_ce.bin
+amdgpu/navi14_mec_wks.bin
+amdgpu/vega12_gpu_info.bin
+amdgpu/tonga_ce.bin
+amdgpu/polaris10_k2_smc.bin
+amdgpu/psp_14_0_2_sos.bin
+amdgpu/polaris10_mec2.bin
+amdgpu/vega20_mec2.bin
+amdgpu/vega20_ta.bin
+amdgpu/hawaii_k_smc.bin
+amdgpu/gc_11_0_0_mec.bin
+amdgpu/renoir_me.bin
+amdgpu/navy_flounder_pfp.bin
+amdgpu/aldebaran_sjt_mec2.bin
+amdgpu/kabini_vce.bin
+amdgpu/yellow_carp_ce.bin
+amdgpu/psp_13_0_10_ta.bin
+amdgpu/aldebaran_rlc.bin
+amdgpu/vangogh_mec.bin
+amdgpu/polaris10_uvd.bin
+amdgpu/picasso_mec2.bin
+amdgpu/beige_goby_pfp.bin
+amdgpu/dcn_3_1_4_dmcub.bin
+amdgpu/vegam_smc.bin
+amdgpu/gc_11_0_4_pfp.bin
+amdgpu/gc_10_3_6_me.bin
+amdgpu/picasso_me.bin
+amdgpu/navi10_mec2.bin
+amdgpu/gc_11_0_3_pfp.bin
+amdgpu/gc_11_0_1_imu.bin
+amdgpu/oland_ce.bin
+amdgpu/navy_flounder_rlc.bin
+amdgpu/gc_11_5_2_pfp.bin
+amdgpu/vega20_ce.bin
+amdgpu/fiji_ce.bin
+amdgpu/navi10_vcn.bin
+amdgpu/navi14_mec2_wks.bin
+amdgpu/pitcairn_mc.bin
+amdgpu/stoney_pfp.bin
+amdgpu/yellow_carp_dmcub.bin
+amdgpu/kaveri_uvd.bin
+amdgpu/carrizo_pfp.bin
+amdgpu/navi14_me_wks.bin
+amdgpu/vegam_pfp.bin
+amdgpu/renoir_mec2.bin
+amdgpu/fiji_sdma1.bin
+amdgpu/green_sardine_mec2.bin
+amdgpu/picasso_rlc_am4.bin
+amdgpu/smu_13_0_6.bin
+amdgpu/arcturus_rlc.bin
+amdgpu/arcturus_gpu_info.bin
+amdgpu/hawaii_sdma.bin
+amdgpu/polaris12_mec.bin
+amdgpu/vega12_rlc.bin
+amdgpu/carrizo_vce.bin
+amdgpu/tahiti_pfp.bin
+amdgpu/gc_11_0_2_pfp.bin
+amdgpu/psp_13_0_5_asd.bin
+amdgpu/yellow_carp_pfp.bin
+amdgpu/aldebaran_smc.bin
+amdgpu/stoney_ce.bin
+amdgpu/verde_smc.bin
+amdgpu/gc_11_5_0_rlc.bin
+amdgpu/aldebaran_sjt_mec.bin
+amdgpu/raven2_mec.bin
+amdgpu/gc_12_0_1_imu.bin
+amdgpu/navi12_vcn.bin
+amdgpu/sdma_5_2_7.bin
+amdgpu/polaris10_mec2_2.bin
+amdgpu/gc_11_0_2_mes_2.bin
+amdgpu/psp_13_0_5_ta.bin
+amdgpu/vcn_4_0_5.bin
+amdgpu/green_sardine_rlc.bin
+amdgpu/bonaire_vce.bin
+amdgpu/kabini_sdma.bin
+amdgpu/polaris10_k_mc.bin
+amdgpu/navy_flounder_vcn.bin
+amdgpu/vega10_mec.bin
+amdgpu/vega12_vce.bin
+amdgpu/sdma_7_0_1.bin
+amdgpu/sdma_6_0_2.bin
+amdgpu/polaris10_rlc.bin
+amdgpu/hainan_rlc.bin
+amdgpu/polaris10_ce_2.bin
+amdgpu/raven2_ta.bin
+amdgpu/gc_9_4_3_sjt_mec.bin
+amdgpu/sdma_5_2_6.bin
+amdgpu/gc_11_0_0_imu.bin
+amdgpu/vpe_6_1_3.bin
+amdgpu/navi12_mec.bin
+amdgpu/verde_pfp.bin
+amdgpu/umsch_mm_4_0_0.bin
+amdgpu/arcturus_smc.bin
+amdgpu/bonaire_sdma1.bin
+amdgpu/polaris11_k2_smc.bin
+amdgpu/vega10_ce.bin
+amdgpu/picasso_asd.bin
+amdgpu/polaris12_ce.bin
+amdgpu/polaris11_smc_sk.bin
+amdgpu/navi12_dmcu.bin
+amdgpu/arcturus_sdma.bin
+amdgpu/beige_goby_sos.bin
+amdgpu/raven_mec2.bin
+amdgpu/smu_13_0_0.bin
+amdgpu/raven2_vcn.bin
+amdgpu/bonaire_mec.bin
+amdgpu/gc_12_0_1_rlc.bin
+amdgpu/gc_12_0_0_imu.bin
+amdgpu/vega10_sos.bin
+amdgpu/mullins_ce.bin
+amdgpu/navi14_gpu_info.bin
+amdgpu/beige_goby_ce.bin
+amdgpu/hawaii_ce.bin
+amdgpu/gc_11_0_0_mes_2.bin
+amdgpu/topaz_mec2.bin
+amdgpu/gc_12_0_1_mes.bin
+amdgpu/polaris10_k_smc.bin
+amdgpu/tonga_vce.bin
+amdgpu/vega10_smc.bin
+amdgpu/topaz_sdma1.bin
+amdgpu/gc_12_0_0_rlc.bin
+amdgpu/hainan_ce.bin
+amdgpu/verde_me.bin
+amdgpu/navi12_me.bin
+amdgpu/raven_kicker_rlc.bin
+amdgpu/green_sardine_me.bin
+amdgpu/navy_flounder_sos.bin
+amdgpu/vangogh_asd.bin
+amdgpu/hainan_me.bin
+amdgpu/polaris11_sdma.bin
+amdgpu/oland_pfp.bin
+amdgpu/beige_goby_smc.bin
+amdgpu/polaris11_sdma1.bin
+amdgpu/polaris10_smc_sk.bin
+amdgpu/polaris10_smc.bin
+amdgpu/kaveri_mec2.bin
+amdgpu/polaris10_me.bin
+amdgpu/carrizo_sdma1.bin
+amdgpu/bonaire_ce.bin
+amdgpu/picasso_gpu_info.bin
+amdgpu/verde_uvd.bin
+amdgpu/tonga_sdma.bin
+amdgpu/polaris10_mec.bin
+amdgpu/bonaire_sdma.bin
+amdgpu/navi14_ta.bin
+amdgpu/vega20_rlc.bin
+amdgpu/polaris11_me_2.bin
+amdgpu/gc_11_0_2_mes1.bin
+amdgpu/fiji_sdma.bin
+amdgpu/gc_11_0_0_rlc_1.bin
+amdgpu/stoney_rlc.bin
+amdgpu/navi14_mec2.bin
+amdgpu/navi10_sos.bin
+amdgpu/vegam_uvd.bin
+amdgpu/gc_10_3_7_me.bin
+amdgpu/gc_11_0_4_mes_2.bin
+amdgpu/gc_11_0_4_mec.bin
+amdgpu/psp_13_0_0_ta.bin
+amdgpu/pitcairn_pfp.bin
+amdgpu/navi14_mec.bin
+amdgpu/topaz_me.bin
+amdgpu/hawaii_uvd.bin
+amdgpu/vega10_mec2.bin
+amdgpu/psp_13_0_0_sos.bin
+amdgpu/tonga_mec2.bin
+amdgpu/navi10_sdma1.bin
+amdgpu/vega12_sdma1.bin
+amdgpu/gc_12_0_1_me.bin
+amdgpu/hainan_mc.bin
+amdgpu/gc_12_0_0_me.bin
+amdgpu/arcturus_mec.bin
+amdgpu/vega20_sdma1.bin
+amdgpu/pitcairn_k_smc.bin
+amdgpu/psp_13_0_14_sos.bin
+amdgpu/kaveri_pfp.bin
+amdgpu/raven_dmcu.bin
+amdgpu/yellow_carp_rlc.bin
+amdgpu/tahiti_ce.bin
+amdgpu/gc_11_0_4_mes.bin
+amdgpu/vega10_sdma1.bin
+amdgpu/topaz_mc.bin
+amdgpu/gc_11_0_2_mes.bin
+amdgpu/fiji_smc.bin
+amdgpu/gc_12_0_1_mec.bin
+amdgpu/carrizo_me.bin
+amdgpu/fiji_me.bin
+amdgpu/smu_14_0_2.bin
+amdgpu/bonaire_mc.bin
+amdgpu/vega10_gpu_info.bin
+amdgpu/polaris11_rlc.bin
+amdgpu/raven_ce.bin
+amdgpu/navi10_ce.bin
+amdgpu/polaris10_sdma.bin
+amdgpu/gc_11_0_2_me.bin
+amdgpu/cyan_skillfish2_rlc.bin
+amdgpu/sienna_cichlid_mec2.bin
+amdgpu/gc_11_0_1_mec.bin
+amdgpu/mullins_vce.bin
+amdgpu/navi12_pfp.bin
+amdgpu/raven2_asd.bin
+amdgpu/green_sardine_asd.bin
+amdgpu/tahiti_uvd.bin
+amdgpu/aldebaran_ta.bin
+amdgpu/raven2_rlc.bin
+amdgpu/navy_flounder_sdma.bin
+amdgpu/dimgrey_cavefish_dmcub.bin
+amdgpu/gc_12_0_0_pfp.bin
+amdgpu/gc_11_0_3_mes_2.bin
+amdgpu/renoir_pfp.bin
+amdgpu/navy_flounder_me.bin
+amdgpu/polaris11_mec2.bin
+amdgpu/gc_12_0_1_uni_mes.bin
+amdgpu/smu_13_0_14.bin
+amdgpu/gc_11_0_1_me.bin
+amdgpu/navi12_sos.bin
+amdgpu/polaris11_mec2_2.bin
+amdgpu/navy_flounder_mec.bin
+amdgpu/sdma_6_0_0.bin
+amdgpu/oland_smc.bin
+amdgpu/raven_rlc.bin
+amdgpu/hawaii_sdma1.bin
+amdgpu/sdma_4_4_2.bin
+amdgpu/isp_4_1_1.bin
+amdgpu/gc_10_3_6_mec2.bin
+amdgpu/tonga_mec.bin
+amdgpu/mullins_sdma.bin
+amdgpu/gc_11_0_2_imu.bin
+amdgpu/gc_11_0_1_mes1.bin
+amdgpu/navi12_smc.bin
+amdgpu/gc_11_5_2_mes1.bin
+amdgpu/raven2_me.bin
+amdgpu/raven_vcn.bin
+amdgpu/polaris11_mec_2.bin
+amdgpu/vegam_me.bin
+amdgpu/navi12_ta.bin
+amdgpu/psp_14_0_0_toc.bin
+amdgpu/navi12_rlc.bin
+amdgpu/dcn_4_0_1_dmcub.bin
+amdnpu/17f0_11/npu.sbin
+amdnpu/17f0_11/npu.sbin.1.0.0.166
+amdnpu/17f0_10/npu.sbin
+amdnpu/17f0_10/npu.sbin.1.0.0.63
+amdnpu/1502_00/npu.sbin
+amdnpu/1502_00/npu.sbin.1.5.2.380
+amdtee/amd_pmf_v3.bin
+amdtee/773bd96f-b83f-4d52-b12dc529b13d8543.bin
+amlogic/aml_w155s2_bt_uart.bin
+amlogic/aml_w265s2_bt_uart.bin
+amlogic/aml_w265s1_bt_uart.bin
+amphion/vpu/vpu_fw_imx8_dec.bin
+amphion/vpu/vpu_fw_imx8_enc.bin
+ar3k/30101coex/ar3kbdaddr.pst
+ar3k/30101coex/RamPatch.txt
+ar3k/30101coex/PS_ASIC.pst
+ar3k/30101coex/PS_ASIC_aclHighPri.pst
+ar3k/30101coex/PS_ASIC_aclLowPri.pst
+ar3k/AthrBT_0x31010100.dfu
+ar3k/1020201coex/ramps_0x01020201_26_HighPriority.dfu
+ar3k/AthrBT_0x01020200.dfu
+ar3k/ramps_0x41020000_40.dfu
+ar3k/1020201/RamPatch.txt
+ar3k/1020201/PS_ASIC.pst
+ar3k/1020200/ar3kbdaddr.pst
+ar3k/1020200/RamPatch.txt
+ar3k/1020200/PS_ASIC.pst
+ar3k/AthrBT_0x41020000.dfu
+ar3k/30101/ar3kbdaddr.pst
+ar3k/30101/RamPatch.txt
+ar3k/30101/PS_ASIC.pst
+ar3k/30000/ar3kbdaddr.pst
+ar3k/30000/RamPatch.txt
+ar3k/30000/PS_ASIC.pst
+ar3k/ramps_0x01020201_26.dfu
+ar3k/ramps_0x01020200_26.dfu
+ar3k/AthrBT_0x11020100.dfu
+ar3k/AthrBT_0x11020000.dfu
+ar3k/ramps_0x01020201_40.dfu
+ar3k/AthrBT_0x01020201.dfu
+ar3k/ramps_0x01020001_26.dfu
+ar3k/ramps_0x31010000_40.dfu
+ar3k/ramps_0x11020100_40.dfu
+ar3k/AthrBT_0x01020001.dfu
+ar3k/ramps_0x01020200_40.dfu
+ar3k/ramps_0x11020000_40.dfu
+ar3k/ramps_0x31010100_40.dfu
+ar3k/AthrBT_0x31010000.dfu
+ar5523.bin
+ar7010.fw
+ar7010_1_1.fw
+ar9170-1.fw
+ar9170-2.fw
+ar9271.fw
+arm/mali/arch10.8/mali_csffw.bin
+as102_data1_st.hex
+as102_data2_st.hex
+ath10k/QCA4019/hw1.0/board-2.bin
+ath10k/QCA4019/hw1.0/notice_ath10k_firmware-5.txt
+ath10k/QCA4019/hw1.0/firmware-5.bin
+ath10k/QCA99X0/hw2.0/board-2.bin
+ath10k/QCA99X0/hw2.0/notice_ath10k_firmware-5.txt
+ath10k/QCA99X0/hw2.0/firmware-5.bin
+ath10k/WCN3990/hw1.0/board-2.bin
+ath10k/WCN3990/hw1.0/notice.txt_wlanmdsp
+ath10k/WCN3990/hw1.0/qrb4210/firmware-5.bin
+ath10k/WCN3990/hw1.0/qrb4210/wlanmdsp.mbn
+ath10k/WCN3990/hw1.0/firmware-5.bin
+ath10k/WCN3990/hw1.0/wlanmdsp.mbn
+ath10k/WCN3990/hw1.0/qcm2290/firmware-5.bin
+ath10k/WCN3990/hw1.0/qcm2290/wlanmdsp.mbn
+ath10k/QCA9984/hw1.0/board-2.bin
+ath10k/QCA9984/hw1.0/notice_ath10k_firmware-5.txt
+ath10k/QCA9984/hw1.0/firmware-5.bin
+ath10k/QCA6174/hw3.0/board.bin
+ath10k/QCA6174/hw3.0/board-2.bin
+ath10k/QCA6174/hw3.0/firmware-6.bin
+ath10k/QCA6174/hw3.0/notice_ath10k_firmware-6.txt
+ath10k/QCA6174/hw3.0/firmware-4.bin
+ath10k/QCA6174/hw3.0/notice_ath10k_firmware-4.txt
+ath10k/QCA6174/hw3.0/firmware-sdio-6.bin
+ath10k/QCA6174/hw3.0/notice_ath10k_firmware-sdio-6.txt
+ath10k/QCA6174/hw2.1/board.bin
+ath10k/QCA6174/hw2.1/board-2.bin
+ath10k/QCA6174/hw2.1/notice_ath10k_firmware-5.txt
+ath10k/QCA6174/hw2.1/firmware-5.bin
+ath10k/QCA9888/hw2.0/board-2.bin
+ath10k/QCA9888/hw2.0/notice_ath10k_firmware-5.txt
+ath10k/QCA9888/hw2.0/firmware-5.bin
+ath10k/QCA9377/hw1.0/board.bin
+ath10k/QCA9377/hw1.0/board-2.bin
+ath10k/QCA9377/hw1.0/notice_ath10k_firmware-sdio-5.txt
+ath10k/QCA9377/hw1.0/firmware-6.bin
+ath10k/QCA9377/hw1.0/notice_ath10k_firmware-6.txt
+ath10k/QCA9377/hw1.0/notice_ath10k_firmware-5.txt
+ath10k/QCA9377/hw1.0/firmware-sdio-5.bin
+ath10k/QCA9377/hw1.0/firmware-5.bin
+ath10k/QCA988X/hw2.0/board.bin
+ath10k/QCA988X/hw2.0/firmware-4.bin
+ath10k/QCA988X/hw2.0/notice_ath10k_firmware-5.txt
+ath10k/QCA988X/hw2.0/notice_ath10k_firmware-4.txt
+ath10k/QCA988X/hw2.0/firmware-5.bin
+ath10k/QCA9887/hw1.0/board.bin
+ath10k/QCA9887/hw1.0/notice_ath10k_firmware-5.txt
+ath10k/QCA9887/hw1.0/firmware-5.bin
+ath11k/QCA6390/hw2.0/amss.bin
+ath11k/QCA6390/hw2.0/board-2.bin
+ath11k/QCA6390/hw2.0/Notice.txt
+ath11k/QCA6390/hw2.0/m3.bin
+ath11k/QCA2066/hw2.1/amss.bin
+ath11k/QCA2066/hw2.1/board-2.bin
+ath11k/QCA2066/hw2.1/Notice.txt
+ath11k/QCA2066/hw2.1/m3.bin
+ath11k/WCN6750/hw1.0/board-2.bin
+ath11k/WCN6750/hw1.0/Notice.txt
+ath11k/WCN6750/hw1.0/wpss.mdt
+ath11k/WCN6750/hw1.0/sc7280/wpss.mbn
+ath11k/IPQ5018/hw1.0/q6_fw.b01
+ath11k/IPQ5018/hw1.0/q6_fw.b00
+ath11k/IPQ5018/hw1.0/q6_fw.b08
+ath11k/IPQ5018/hw1.0/m3_fw.b02
+ath11k/IPQ5018/hw1.0/q6_fw.flist
+ath11k/IPQ5018/hw1.0/board-2.bin
+ath11k/IPQ5018/hw1.0/q6_fw.b07
+ath11k/IPQ5018/hw1.0/q6_fw.b10
+ath11k/IPQ5018/hw1.0/q6_fw.b05
+ath11k/IPQ5018/hw1.0/q6_fw.b04
+ath11k/IPQ5018/hw1.0/q6_fw.b03
+ath11k/IPQ5018/hw1.0/q6_fw.b13
+ath11k/IPQ5018/hw1.0/m3_fw.mdt
+ath11k/IPQ5018/hw1.0/m3_fw.flist
+ath11k/IPQ5018/hw1.0/Notice.txt
+ath11k/IPQ5018/hw1.0/q6_fw.b14
+ath11k/IPQ5018/hw1.0/q6_fw.mdt
+ath11k/IPQ5018/hw1.0/q6_fw.b02
+ath11k/IPQ5018/hw1.0/q6_fw.b09
+ath11k/IPQ5018/hw1.0/m3_fw.b01
+ath11k/IPQ5018/hw1.0/q6_fw.b11
+ath11k/IPQ5018/hw1.0/m3_fw.b00
+ath11k/IPQ8074/hw2.0/q6_fw.b01
+ath11k/IPQ8074/hw2.0/q6_fw.b00
+ath11k/IPQ8074/hw2.0/q6_fw.b08
+ath11k/IPQ8074/hw2.0/m3_fw.b02
+ath11k/IPQ8074/hw2.0/q6_fw.flist
+ath11k/IPQ8074/hw2.0/board-2.bin
+ath11k/IPQ8074/hw2.0/q6_fw.b07
+ath11k/IPQ8074/hw2.0/q6_fw.b05
+ath11k/IPQ8074/hw2.0/q6_fw.b04
+ath11k/IPQ8074/hw2.0/q6_fw.b03
+ath11k/IPQ8074/hw2.0/m3_fw.mdt
+ath11k/IPQ8074/hw2.0/m3_fw.flist
+ath11k/IPQ8074/hw2.0/Notice.txt
+ath11k/IPQ8074/hw2.0/q6_fw.mdt
+ath11k/IPQ8074/hw2.0/q6_fw.b02
+ath11k/IPQ8074/hw2.0/m3_fw.b01
+ath11k/IPQ8074/hw2.0/m3_fw.b00
+ath11k/QCN9074/hw1.0/amss.bin
+ath11k/QCN9074/hw1.0/board-2.bin
+ath11k/QCN9074/hw1.0/Notice.txt
+ath11k/QCN9074/hw1.0/m3.bin
+ath11k/WCN6855/hw2.0/amss.bin
+ath11k/WCN6855/hw2.0/board-2.bin
+ath11k/WCN6855/hw2.0/Notice.txt
+ath11k/WCN6855/hw2.0/m3.bin
+ath11k/WCN6855/hw2.0/regdb.bin
+ath11k/WCN6855/hw2.1/amss.bin
+ath11k/WCN6855/hw2.1/board-2.bin
+ath11k/WCN6855/hw2.1/m3.bin
+ath11k/WCN6855/hw2.1/regdb.bin
+ath11k/IPQ6018/hw1.0/q6_fw.b01
+ath11k/IPQ6018/hw1.0/q6_fw.b00
+ath11k/IPQ6018/hw1.0/q6_fw.b08
+ath11k/IPQ6018/hw1.0/m3_fw.b02
+ath11k/IPQ6018/hw1.0/q6_fw.flist
+ath11k/IPQ6018/hw1.0/board-2.bin
+ath11k/IPQ6018/hw1.0/q6_fw.b07
+ath11k/IPQ6018/hw1.0/q6_fw.b05
+ath11k/IPQ6018/hw1.0/q6_fw.b04
+ath11k/IPQ6018/hw1.0/q6_fw.b03
+ath11k/IPQ6018/hw1.0/m3_fw.mdt
+ath11k/IPQ6018/hw1.0/m3_fw.flist
+ath11k/IPQ6018/hw1.0/Notice.txt
+ath11k/IPQ6018/hw1.0/q6_fw.mdt
+ath11k/IPQ6018/hw1.0/q6_fw.b02
+ath11k/IPQ6018/hw1.0/m3_fw.b01
+ath11k/IPQ6018/hw1.0/m3_fw.b00
+ath12k/QCN9274/hw2.0/board-2.bin
+ath12k/QCN9274/hw2.0/firmware-2.bin
+ath12k/QCN9274/hw2.0/Notice.txt
+ath12k/WCN7850/hw2.0/amss.bin
+ath12k/WCN7850/hw2.0/board-2.bin
+ath12k/WCN7850/hw2.0/Notice.txt
+ath12k/WCN7850/hw2.0/m3.bin
+ath3k-1.fw
+ath6k/AR6003.1/hw2.1.1/bdata.SD31.bin
+ath6k/AR6003.1/hw2.1.1/data.patch.bin
+ath6k/AR6003.1/hw2.1.1/endpointping.bin
+ath6k/AR6003.1/hw2.1.1/bdata.WB31.bin
+ath6k/AR6003.1/hw2.1.1/athwlan.bin
+ath6k/AR6003.1/hw2.1.1/otp.bin
+ath6k/AR6003.1/hw2.1.1/bdata.SD32.bin
+ath6k/AR6002/eeprom.data
+ath6k/AR6002/data.patch.hw2_0.bin
+ath6k/AR6002/athwlan.bin.z77
+ath6k/AR6002/eeprom.bin
+ath6k/AR6003/hw1.0/bdata.SD31.bin
+ath6k/AR6003/hw1.0/otp.bin.z77
+ath6k/AR6003/hw1.0/data.patch.bin
+ath6k/AR6003/hw1.0/athwlan.bin.z77
+ath6k/AR6003/hw1.0/bdata.WB31.bin
+ath6k/AR6003/hw1.0/bdata.SD32.bin
+ath6k/AR6003/hw2.0/bdata.SD31.bin
+ath6k/AR6003/hw2.0/otp.bin.z77
+ath6k/AR6003/hw2.0/data.patch.bin
+ath6k/AR6003/hw2.0/athwlan.bin.z77
+ath6k/AR6003/hw2.0/bdata.WB31.bin
+ath6k/AR6003/hw2.0/bdata.SD32.bin
+ath6k/AR6003/hw2.1.1/fw-2.bin
+ath6k/AR6003/hw2.1.1/bdata.SD31.bin
+ath6k/AR6003/hw2.1.1/data.patch.bin
+ath6k/AR6003/hw2.1.1/endpointping.bin
+ath6k/AR6003/hw2.1.1/bdata.WB31.bin
+ath6k/AR6003/hw2.1.1/athwlan.bin
+ath6k/AR6003/hw2.1.1/fw-3.bin
+ath6k/AR6003/hw2.1.1/otp.bin
+ath6k/AR6003/hw2.1.1/bdata.SD32.bin
+ath6k/AR6004/hw1.2/fw-2.bin
+ath6k/AR6004/hw1.2/bdata.bin
+ath6k/AR6004/hw1.3/bdata.bin
+ath6k/AR6004/hw1.3/fw-3.bin
+ath9k_htc/htc_9271-1.4.0.fw
+ath9k_htc/htc_7010-1.4.0.fw
+atmel/wilc1000_wifi_firmware.bin
+atmel/wilc1000_wifi_firmware-1.bin
+atmel/wilc1000_fw.bin
+atmel/wilc1000_p2p_fw.bin
+atmel/wilc1000_ap_fw.bin
+atusb/rzusb-0.3.bin
+atusb/atusb-0.2.dfu
+atusb/atusb-0.3.dfu
+av7110/bootcode.bin
+bnx2/bnx2-rv2p-06-6.0.15.fw
+bnx2/bnx2-rv2p-09ax-6.0.17.fw
+bnx2/bnx2-mips-09-6.2.1b.fw
+bnx2/bnx2-mips-06-6.2.3.fw
+bnx2/bnx2-rv2p-09-6.0.17.fw
+bnx2x/bnx2x-e2-7.13.15.0.fw
+bnx2x/bnx2x-e1h-7.13.1.0.fw
+bnx2x/bnx2x-e2-7.13.1.0.fw
+bnx2x/bnx2x-e1h-7.13.21.0.fw
+bnx2x/bnx2x-e1-7.13.21.0.fw
+bnx2x/bnx2x-e1-7.13.15.0.fw
+bnx2x/bnx2x-e2-7.13.11.0.fw
+bnx2x/bnx2x-e1-7.13.1.0.fw
+bnx2x/bnx2x-e1h-7.13.11.0.fw
+bnx2x/bnx2x-e2-7.13.21.0.fw
+bnx2x/bnx2x-e1h-7.13.15.0.fw
+bnx2x/bnx2x-e1-7.13.11.0.fw
+brcm/brcmfmac43570-pcie.clm_blob
+brcm/brcmfmac43602-pcie.bin
+brcm/bcm4329-fullmac-4.bin
+brcm/brcmfmac43430-sdio.beagle,beaglev-starlight-jh7100-r0.txt
+brcm/brcmfmac43242a.bin
+brcm/brcmfmac43012-sdio.clm_blob
+brcm/brcmfmac43430-sdio.AP6212.txt
+brcm/brcmfmac43455-sdio.raspberrypi,5-model-b.txt
+brcm/brcmfmac43340-sdio.pov-tab-p1006w-data.txt
+brcm/brcmfmac43455-sdio.pine64,pinebook-pro.txt
+brcm/brcmfmac43430-sdio.clm_blob
+brcm/brcmfmac43362-sdio.kobo,aura.txt
+brcm/brcmfmac4356-sdio.vamrs,rock960.txt
+brcm/brcmfmac43430-sdio.raspberrypi,model-zero-w.txt
+brcm/brcmfmac4356-sdio.bin
+brcm/brcmfmac4366b-pcie.bin
+brcm/brcmfmac4373-sdio.clm_blob
+brcm/brcmfmac4356-pcie.Intel Corporation-CHERRYVIEW D1 PLATFORM.txt
+brcm/brcmfmac43430-sdio.beagle,beaglev-starlight-jh7100-a1.txt
+brcm/brcmfmac43430-sdio.Hampoo-D2D3_Vi8A1.txt
+brcm/brcmfmac4354-sdio.bin
+brcm/brcmfmac43455-sdio.AW-CM256SM.txt
+brcm/brcmfmac54591-pcie.bin
+brcm/brcmfmac43362-sdio.ASUSTeK COMPUTER INC.-ME176C.txt
+brcm/brcmfmac43362-sdio.bin
+brcm/brcmfmac4350c2-pcie.bin
+brcm/brcmfmac43455-sdio.raspberrypi,3-model-b-plus.txt
+brcm/brcmfmac43340-sdio.predia-basic.txt
+brcm/brcmfmac43143.bin
+brcm/BCM-0a5c-6410.hcd
+brcm/brcmfmac43455-sdio.pine64,pinephone-pro.txt
+brcm/brcmfmac43455-sdio.Raspberry Pi Foundation-Raspberry Pi Compute Module 4.txt
+brcm/brcmfmac43430-sdio.sinovoip,bananapi-m64.txt
+brcm/brcmfmac43012-sdio.bin
+brcm/brcmfmac4354-sdio.nvidia,p2371-2180.txt
+brcm/brcmfmac4334-sdio.bin
+brcm/brcmfmac43241b4-sdio.bin
+brcm/brcmfmac43430-sdio.sinovoip,bpi-m2-zero.txt
+brcm/brcmfmac43569.bin
+brcm/brcmfmac43455-sdio.pine64,quartz64-b.txt
+brcm/brcmfmac43430-sdio.sinovoip,bpi-m3.txt
+brcm/brcmfmac43455-sdio.raspberrypi,5-compute-module.txt
+brcm/brcmfmac4371-pcie.bin
+brcm/brcmfmac4356-sdio.friendlyarm,nanopi-m4.txt
+brcm/brcmfmac43455-sdio.pine64,soquartz-cm4io.txt
+brcm/brcmfmac43455-sdio.pine64,pinenote-v1.2.txt
+brcm/brcmfmac43430a0-sdio.bin
+brcm/brcmfmac43340-sdio.ASUSTeK COMPUTER INC.-TF103CE.txt
+brcm/brcmfmac43241b5-sdio.bin
+brcm/brcmfmac4329-sdio.bin
+brcm/brcmfmac4330-sdio.Prowise-PT301.txt
+brcm/brcmfmac4354-sdio.clm_blob
+brcm/brcmfmac43455-sdio.MINIX-NEO Z83-4.txt
+brcm/brcmfmac43340-sdio.Insyde-VESPA2.txt
+brcm/brcmfmac43430-sdio.starfive,visionfive-v1.txt
+brcm/brcmfmac43241b0-sdio.bin
+brcm/brcmfmac43241b4-sdio.Intel Corp.-VALLEYVIEW C0 PLATFORM.txt
+brcm/brcmfmac43455-sdio.beagle,am5729-beagleboneai.txt
+brcm/brcmfmac4356-sdio.firefly,firefly-rk3399.txt
+brcm/brcmfmac43430a0-sdio.jumper-ezpad-mini3.txt
+brcm/brcmfmac43455-sdio.Raspberry Pi Foundation-Raspberry Pi 4 Model B.txt
+brcm/brcmfmac4356-sdio.khadas,vim2.txt
+brcm/brcmfmac4358-pcie.bin
+brcm/brcmfmac43362-sdio.WC121.txt
+brcm/bcm43xx-0.fw
+brcm/brcmfmac43430-sdio.sinovoip,bpi-m2-plus.txt
+brcm/brcmfmac43430-sdio.friendlyarm,nanopi-r1.txt
+brcm/brcmfmac4373.bin
+brcm/brcmfmac43455-sdio.clm_blob
+brcm/brcmfmac4356-sdio.clm_blob
+brcm/brcmfmac43455-sdio.raspberrypi,3-model-a-plus.txt
+brcm/brcmfmac43602-pcie.ap.bin
+brcm/brcmfmac4330-sdio.bin
+brcm/brcmfmac43430a0-sdio.ilife-S806.txt
+brcm/brcmfmac43430-sdio.sinovoip,bpi-m2-ultra.txt
+brcm/brcmfmac4366c-pcie.bin
+brcm/brcmfmac43430a0-sdio.ONDA-V80 PLUS.txt
+brcm/brcmfmac43430-sdio.raspberrypi,3-model-b.txt
+brcm/brcmfmac4356-pcie.bin
+brcm/brcmfmac43236b.bin
+brcm/brcmfmac43455-sdio.pine64,pinenote-v1.1.txt
+brcm/brcmfmac43455-sdio.acepc-t8.txt
+brcm/brcmfmac43430-sdio.raspberrypi,model-zero-2-w.txt
+brcm/brcmfmac4350-pcie.bin
+brcm/brcmfmac43340-sdio.meegopad-t08.txt
+brcm/brcmfmac43362-sdio.lemaker,bananapro.txt
+brcm/brcmfmac4356-sdio.AP6356S.txt
+brcm/brcmfmac43241b4-sdio.Advantech-MICA-071.txt
+brcm/brcmfmac43455-sdio.raspberrypi,500.txt
+brcm/brcmfmac43430-sdio.bin
+brcm/brcmfmac43430-sdio.ilife-S806.txt
+brcm/brcmfmac43430-sdio.MUR1DX.txt
+brcm/brcmfmac43455-sdio.pine64,quartz64-a.txt
+brcm/brcmfmac43455-sdio.raspberrypi,4-model-b.txt
+brcm/brcmfmac43455-sdio.pine64,rockpro64-v2.0.txt
+brcm/brcmfmac4339-sdio.bin
+brcm/bcm43xx_hdr-0.fw
+brcm/brcmfmac43570-pcie.bin
+brcm/brcmfmac43143-sdio.bin
+brcm/brcmfmac4356-pcie.Xiaomi Inc-Mipad2.txt
+brcm/brcmfmac4335-sdio.bin
+brcm/brcmfmac4356-pcie.gpd-win-pocket.txt
+brcm/brcmfmac4356-pcie.clm_blob
+brcm/brcmfmac43455-sdio.bin
+brcm/brcmfmac43362-sdio.cubietech,cubietruck.txt
+brcm/brcmfmac43340-sdio.bin
+brcm/BCM-0bb4-0306.hcd
+brcm/brcmfmac4373-sdio.bin
+brcm/brcmfmac43455-sdio.pine64,soquartz-blade.txt
+brcm/brcmfmac43362-sdio.kobo,tolino-shine2hd.txt
+brcm/brcmfmac43455-sdio.raspberrypi,4-compute-module.txt
+brcm/brcmfmac43455-sdio.pine64,soquartz-model-a.txt
+brcm/brcmfmac43455-sdio.pine64,rockpro64-v2.1.txt
+brcm/brcmfmac54591-pcie.clm_blob
+cadence/mhdp8546.bin
+carl9170-1.fw
+cavium/cnn55xx_ae.fw
+cavium/cnn55xx_se.fw
+cbfw-3.2.5.1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431da2-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316f3-spkid0-r0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d86-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b6-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38ab.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c4f-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a40-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a31-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2e-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a28-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2317-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3865.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa3866.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280ce3-spkid3-ampl.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e1a-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2b-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid1-r0.bincfg
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid0-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104314e3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid0-l0.bincfg
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa386e-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce4-spkid2-ampr.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid1-amp1.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e1b.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a30-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa231a-l0.bincfg
+cirrus/cs35l56-b0-dsp1-misc-10431df3-amp1.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8c53-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid1-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8b8f-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431483-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid0-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a63.wmfw
+cirrus/cs35l54-b0-dsp1-misc-103c8e19-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be9.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431533-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431683-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2d-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa233c-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10431683.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a2c-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid1-amp4.bin
+cirrus/cs35l56-b0-dsp1-misc-10280d12-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa3855-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2a-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cdf-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid0-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8a2e.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280ce4-spkid2.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c71.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c6a-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid1-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-10431503.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38a9-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-104316f3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c89c6-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid1-amp1.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce3-spkid3-ampr.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c15-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid1-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3847-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280d12-spkid0-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa386f.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa2319-r0.bincfg
+cirrus/cs35l56-b0-dsp1-misc-103c8c52-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be8-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a8f-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa231a-l0.bin
+cirrus/cs35l41/v6.56.0/halo_cspl_RAM_revB2_29.58.0.wmfw
+cirrus/cs35l41/bincfgs/cs35l41-dsp1-16_5dB.bincfg
+cirrus/cs35l41/bincfgs/cs35l41-dsp1-19_5dB.bincfg
+cirrus/cs35l41/bincfgs/cs35l41-dsp1-14_5dB.bincfg
+cirrus/cs35l41/v6.83.0/halo_cspl_RAM_revB2_29.85.0.wmfw
+cirrus/cs35l41/v6.80.0/halo_cspl_RAM_revB2_29.82.0.wmfw
+cirrus/cs35l41/v6.47.0/halo_cspl_RAM_revB2_29.49.0.wmfw
+cirrus/cs35l41/v6.39.0/halo_cspl_RAM_revB2_29.41.0.wmfw
+cirrus/cs35l41/v6.63.0/halo_cspl_RAM_revB2_29.65.0.wmfw
+cirrus/cs35l41/v6.68.0/halo_cspl_RAM_revB2_29.70.0.wmfw
+cirrus/cs35l41/v6.61.1/halo_cspl_RAM_revB2_29.63.1.wmfw
+cirrus/cs35l41/v6.78.0/halo_cspl_RAM_revB2_29.80.0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8972.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8974.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a83-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4f-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431533-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e02-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bdf-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid1-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b8f-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8981-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431b93.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431caf-spkid1-l0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d08-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2e-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316d3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c33.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce3-spkid2-ampl.bin
+cirrus/cs35l56-b0-dsp1-misc-10431f43-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-104314d3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38fa.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa3865-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b3a-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c51.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid1.wmfw
+cirrus/cs35l56/CS35L56_Rev3.11.28.wmfw
+cirrus/cs35l56/CS35L56_Rev3.11.25.wmfw
+cirrus/cs35l56/CS35L56_Rev3.11.11.1.wmfw
+cirrus/cs35l56/CS35L56_Rev3.11.27.wmfw
+cirrus/cs35l56/CS35L56_Rev3.11.16.wmfw
+cirrus/cs35l56/CS35L56_Rev3.11.11.wmfw
+cirrus/cs35l56/CS35L56_Rev3.11.20.wmfw
+cirrus/cs35l56/CS35L56_Rev3.11.26.wmfw
+cirrus/cs35l56/CS35L56_Rev3.11.18.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431ccf-spkid1-r0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e1b-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c6a.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c17-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c8-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431264.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431863-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f2-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a30.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280ce4-spkid3-ampl.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c8-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be2-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431863.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38b7-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a20-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid0-l0.bincfg
+cirrus/cs35l56-b0-dsp1-misc-10431f43-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid1-l0.bincfg
+cirrus/cs35l56-b0-dsp1-misc-103c8e2c-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8b63-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c71.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c26.wmfw
+cirrus/cs35l54-b0-dsp1-misc-103c8d85.wmfw
+cirrus/cs35l56-b0-dsp1-misc-17aa3832-spkid1-ampl.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be2-spkid1-l0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d86.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c17.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104316f3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a60-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a40-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid0-l0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d08-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3878.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104316a3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f1f.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8cdf-spkid0-r0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e1c-amp1.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e17-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431573-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3878-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431473-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8a2a-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a50-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c47.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c43.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431473-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2318.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38ab-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c66.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10280b28.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c16-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8d90-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be5-spkid1-l0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d91-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2316-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b8f-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa386e-spkid0-r0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e1c.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa2318-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b7.wmfw
+cirrus/cs35l54-b0-dsp1-misc-103c8e16.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431e13.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10280beb.wmfw
+cirrus/cs35l54-b0-dsp1-misc-103c8d85-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b92.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431a8f-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa3832-spkid0-ampl.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c50-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8a6e-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431493-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c8-spkid1-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a6e.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8cdf-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c33-spkid0-l0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e16-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c68-spkid0-l0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e15-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be0-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a40-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431d1f-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c47.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f1.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280d13-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431a83-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b74.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce3-spkid0-ampl.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a31-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa3905-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-104317f3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid1-r0.bincfg
+cirrus/cs35l54-b0-dsp1-misc-103c8d8d-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2d-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce4-spkid1-ampr.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c50-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cbe-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b6-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid0-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a6e-l0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d85-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431483-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2317-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bdd-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa386e-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431683-spkid1-r0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d8c-amp1.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid1-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-10431493-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b44.bin
+cirrus/cs35l41-dsp1-spk-prot-103c898e.bin
+cirrus/cs35l41-dsp1-spk-prot-103c898f.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f62.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c89c6-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431493-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104314e3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b46.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38b7-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid1-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8ad8.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be0-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c50-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316d3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c8.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c33-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a60-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid1-amp1.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431573.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431d1f-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8ce0-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316a3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b92.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2317-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f62-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3877-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3847-spkid1-r0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d8e.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b77.bin
+cirrus/cs35l41-dsp1-spk-prot-10431493-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280d13-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8973.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a28.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be6-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be6-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa233b-spkid1-ampl.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d01.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c89c6.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c68-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431cdf-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8d92.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104318d3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid0-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8a2c-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c89e7-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bdd-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid0-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c15-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa3905.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be7.wmfw
+cirrus/cs35l56-b0-dsp1-misc-17aa233b-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10433a30-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c17-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8d92-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-104316d3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8974.bin
+cirrus/cs35l41-dsp1-spk-prot-103c89e7.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431663-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-17aa386f-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2b-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cdf-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431483-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c89c3-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8971.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8992.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc1-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cde-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid1-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8c17-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280d13-spkid1-amp2.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8c52-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b74.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431f12-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa3905-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2318-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c89e7-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280d12-spkid1-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38f9-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b43.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431e12-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3855-spkid0-r0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d8c-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c33-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104318d3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316d3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a2e-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c898e.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280ce4-spkid3.wmfw
+cirrus/cs35l41-dsp1-spk-prot.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b5.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431473-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104312af-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c7-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c7-spkid0-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b6-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be3-spkid1-r0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d8e-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be9-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa233b-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104316f3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a40-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a50-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid1-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b4-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431533-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2319-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c49.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8cdd-spkid0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8d91.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431caf.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c16-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c03.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c6a-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b4-spkid1-l0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d85-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10280b28-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid1-r0.bincfg
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid1-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c51-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc4-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2c-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b3a-spkid0-r0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e17.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a30-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cf5.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431a8f.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cef-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c89c3-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c33-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cde-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid0-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3878-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid0-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b45.bin
+cirrus/cs35l41-dsp1-spk-prot-103c89c3-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b5-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bde-spkid1-l0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e15.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431e13-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4f-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2316-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c48.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431503-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b7-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be5-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104314d3-spkid1-r0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e15-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431caf-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8981-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431da2.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431b93-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431caf-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280beb-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8ce0-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be1.wmfw
+cirrus/cs35l54-b0-dsp1-misc-103c8d8f-amp1.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d8d-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316a3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316d3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4f.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280ce3-spkid2-ampr.bin
+cirrus/cs35l41-dsp1-spk-prot-10431463.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a30-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431ccf-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3847.wmfw
+cirrus/cs35l56-b0-dsp1-misc-103c8c53-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-104314e3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be7-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f2.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid1-amp1.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa380e-spkid0-ampr.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a83-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b4-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc2-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c6a-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid0.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431df3-amp4.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa3832-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa231a-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-17aa2316-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be9-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b6-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce4-spkid2-ampl.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bdd-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c50.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b72.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431f12-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid1-l0.bincfg
+cirrus/cs35l54-b0-dsp1-misc-103c8d8e-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-104318d3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8ce0-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c67-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a31-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2d-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431da2-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8d90-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10280b27.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa2319-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431c43-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431ee2.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bdf.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b63-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid1-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431463-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be0-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c67-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a29-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce3-spkid1-ampr.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid1-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431663.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c15-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid0-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e12-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cef-spkid1-l0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d91-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10431ed3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431ccf.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431da2-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c9f-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid1-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-17aa38ab-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8972.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431463-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b72.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8be8-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cef-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a29.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8ca7.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104314d3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be6.wmfw
+cirrus/cs35l54-b0-dsp1-misc-103c8d8d.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c43-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c49.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8ca4.bin
+cirrus/cs35l41-dsp1-spk-prot-10431473-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid0-l0.bincfg
+cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid1-amp2.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa3832-spkid1-ampr.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b3a-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be1-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431ee2-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8c52-amp4.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d01-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-17aa3847-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2317.wmfw
+cirrus/cs35l56-b0-dsp1-misc-103c8d90.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa2316-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa233c.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8be6-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431533.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid1-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431483.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10280cbd-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b43.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cf5-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8991.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a20-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431ed3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c68-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid0-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid0-l0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d86-amp4.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e18-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f2-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316a3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a30.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104312af.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bdf-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a20-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa231a.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b47.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431433.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be7-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f12-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c67-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c72.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc3.wmfw
+cirrus/cs35l54-b0-dsp1-misc-103c8d08-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a6e-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38fa-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431ee2-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8994.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d08.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid1-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8995.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f1-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-104312af-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c7-spkid0-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38a9-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431573-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce4-spkid3-ampr.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d85-amp3.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d08-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a30-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431863-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8c52.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid1-amp2.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e16-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa380e-spkid1-ampl.bin
+cirrus/cs35l41-dsp1-spk-prot-10431663-r0.bincfg
+cirrus/cs35l56-b0-dsp1-misc-17aa380e-spkid1.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid0-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8971.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be8-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f1-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431ccf-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cbf-spkid0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e18-amp2.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d86-amp2.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e18.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431473.wmfw
+cirrus/cs35l54-b0-dsp1-misc-103c8e17-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid0-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2b-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid1-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cbe.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10280cc3-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a6e-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3855.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa3866-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e13-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-10431d1f-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c896e-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cdd.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c68.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431b93-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid0-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8a31-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3877.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8cdf-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431573-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8981-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a83-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f62-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8995.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be2-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38ab-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c51-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b44.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10280b28-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431533-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa3832-spkid0-ampr.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38f9-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bdd-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid1-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c16-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280b27-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a30-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8c52-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e12-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cbd.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid1-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c43-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid0-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8be6-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8d91-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bde-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce4-spkid1-ampl.bin
+cirrus/cs35l41-dsp1-spk-prot-10431493.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be5-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid1-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-104314e3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc4-spkid1.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid0-amp4.bin
+cirrus/cs35l56-b0-dsp1-misc-10431df3-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c51-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3866-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid0-amp2.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce3-spkid2.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa3877-l0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d01-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8992.wmfw
+cirrus/cs35l54-b0-dsp1-misc-103c8e1c-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cde.wmfw
+cirrus/cs35l54-b0-dsp1-misc-103c8e19.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431683-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c72.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c17-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431caf-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a8f-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431483-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-17aa38ab-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8c53-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a31.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b42.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be8-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid0-r0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e14-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2b-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c898f.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be5-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8d92-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c9f.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104312af-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid1-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8c46.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38c7.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431463-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid0-amp3.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e1a-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10431503-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431264-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2c.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431663-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa380e-spkid1-ampr.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2319-r0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e14-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a30-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c67.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bdf-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid0-r0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d01-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e12.wmfw
+cirrus/cs35l56-b0-dsp1-misc-17aa233b-spkid0-ampr.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a29-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc2-spkid1.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa380e-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c9f-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b70.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d91.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38f9.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104316f3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa22f2-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431cdf.wmfw
+cirrus/cs35l54-b0-dsp1-misc-103c8e1b-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c896e.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid1-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2318-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431f1f-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2a.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431d1f-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e02-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cbe-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-10280b28-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cbf-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b77.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431863-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a20-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cdf-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be3-spkid0-l0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d8f-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cbf.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280ce4-spkid0-ampl.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b63.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a28-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c16.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431573-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cef-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c15-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f62-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f1f-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce4-spkid0-ampr.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38a9.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa3855-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104318d3-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce3-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8981.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa2316.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431f12-spkid0-r0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e1a.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431ed3-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8e2c.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8cdd-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431a40.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid0-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8994.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10280beb-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be9-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280d13-spkid0-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3865-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce3-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431e02-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a20.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8ad8.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431f62-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8ca4.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431f43-amp3.bin
+cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid1-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid0-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2d.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c46.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c50-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431ed3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431ed3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431863-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa233b-spkid1-ampr.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce4-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid0.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280d12-spkid1-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c8-spkid1-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b70.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c66-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f3-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104314d3-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b3a.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10433a50-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f3-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f3-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-104312af-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a50-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b63-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c67-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c26.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa386e.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b8f.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431ccf-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b5-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104314e3.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid0-amp2.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid0-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-104318d3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa2319.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c9f-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e13-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cbd-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431b93-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316a3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2a-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a60.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c48.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc3-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8ce0-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431503-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa233b-spkid0-ampl.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c66-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2b.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280ce4-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10280cc1-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431da2-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b7-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38a9-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be1-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid0-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-17aa3847-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c89c3-l1.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8d91-amp1.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid0-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a28-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c51-spkid0-l0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d8f.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8973.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce3-spkid3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bde.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a29-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be7-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8991.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10280b28-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2318-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8975-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b4-spkid1-r0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d01-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cf5-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c15.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10280b27-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc4.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid1-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431d1f.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431f12.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38b4.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b42.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8e2c-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-1f660105.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431f43.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38b6.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280d12-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431a83.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c6a-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b3a-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bde-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be2-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4f-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a50.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431a8f-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104314d3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8975.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38a9-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431683-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431df3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8ca7.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce3-spkid0-ampr.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a60-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa3832-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bde-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa380e-spkid0-ampl.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e02-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8975-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b45.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa22f3-r0.bincfg
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid0-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c68-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-1f660105.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be1-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b8f-r1.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e13-amp1.bin
+cirrus/cs35l56-b0-dsp1-misc-10280d13-spkid1-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b47.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid1-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10433a60-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid0-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b63-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431f43-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c66-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa231a-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431463-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cdf.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a29-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be8.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c16-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid0-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3855-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c66-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8c53-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cef.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280d13-spkid0-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e02.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c43-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431503-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431b93-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38fa-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c896e-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cdf-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a28-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c9f-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431264-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e12-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc1.wmfw
+cirrus/cs35l54-b0-dsp1-misc-103c8e19-amp1.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid1-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8ce0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be2.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be7-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c89c3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be5.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431663-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa386f-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c7-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cf5-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2c-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bdd.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be1-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f2-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8a2d-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be9-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431df3-amp2.bin
+cirrus/cs35l56-b0-dsp1-misc-17aa233c-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8981-l1.bin
+cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid0-amp1.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8d8c.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa22f1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa386e-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2a-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b5-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280d12-spkid0-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a30-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b46.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid0-l0.bin
+cirrus/cs35l54-b0-dsp1-misc-103c8e14.wmfw
+cirrus/cs35l54-b0-dsp1-misc-103c8d86-amp3.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8c53.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c70.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38b5-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cf5-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2317-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2e-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc2.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bdf-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c70.bin
+cirrus/cs35l56-b0-dsp1-misc-10280ce3-spkid1-ampl.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be0-spkid1-l0.bin
+cis/PCMLM28.cis
+cis/DP83903.cis
+cis/NE2K.cis
+cis/SW_7xx_SER.cis
+cis/SW_555_SER.cis
+cis/RS-COM-2P.cis
+cis/tamarack.cis
+cis/MT5634ZLX.cis
+cis/COMpad4.cis
+cis/PE-200.cis
+cis/SW_8xx_SER.cis
+cis/LA-PCM.cis
+cis/3CXEM556.cis
+cis/PE520.cis
+cis/3CCFEM556.cis
+cis/COMpad2.cis
+cmmb_vega_12mhz.inp
+cmmb_venice_12mhz.inp
+cnm/wave521c_k3_codec_fw.bin
+cpia2/stv0672_vp4.bin
+cs42l43.bin
+ct2fw-3.2.5.1.bin
+ctefx.bin
+ctfw-3.2.5.1.bin
+ctspeq.bin
+cxgb3/t3fw-7.10.0.bin
+cxgb3/t3fw-7.0.0.bin
+cxgb3/ael2005_opt_edc.bin
+cxgb3/ael2005_twx_edc.bin
+cxgb3/t3b_psram-1.1.0.bin
+cxgb3/t3fw-7.12.0.bin
+cxgb3/t3c_psram-1.1.0.bin
+cxgb3/t3fw-7.4.0.bin
+cxgb3/ael2020_twx_edc.bin
+cxgb3/t3fw-7.1.0.bin
+cxgb4/t4-config.txt
+cxgb4/t4fw.bin
+cxgb4/t5-config.txt
+cxgb4/t4fw-1.27.5.0.bin
+cxgb4/t4fw-1.14.4.0.bin
+cxgb4/t4fw-1.15.37.0.bin
+cxgb4/aq1202_fw.cld
+cxgb4/t5fw-1.14.4.0.bin
+cxgb4/t6fw.bin
+cxgb4/t6-config.txt
+cxgb4/configs/t5-config-hashfilter.txt
+cxgb4/configs/t5-config-default.txt
+cxgb4/configs/t6-config-hashfilter.txt
+cxgb4/configs/t6-config-default.txt
+cxgb4/configs/t4-config-default.txt
+cxgb4/t5fw.bin
+cxgb4/t5fw-1.15.37.0.bin
+cxgb4/t6fw-1.27.5.0.bin
+cxgb4/t5fw-1.27.5.0.bin
+cxgb4/bcm8483.bin
+cypress/cyfmac4356-pcie.bin
+cypress/cyfmac54591-pcie.bin
+cypress/cyfmac43570-pcie.clm_blob
+cypress/cyfmac43430-sdio.clm_blob
+cypress/cyfmac43012-sdio.clm_blob
+cypress/cyfmac4356-sdio.bin
+cypress/cyfmac4373-sdio.bin
+cypress/cyfmac4356-sdio.clm_blob
+cypress/cyfmac43340-sdio.bin
+cypress/cyfmac43455-sdio.bin
+cypress/cyfmac43362-sdio.bin
+cypress/cyfmac4339-sdio.bin
+cypress/cyfmac43430-sdio.bin
+cypress/cyfmac4373-sdio.clm_blob
+cypress/cyfmac4354-sdio.clm_blob
+cypress/cyfmac4354-sdio.bin
+cypress/cyfmac43570-pcie.bin
+cypress/cyfmac4356-pcie.clm_blob
+cypress/cyfmac54591-pcie.clm_blob
+cypress/cyfmac43455-sdio.clm_blob
+cypress/cyfmac43012-sdio.bin
+dabusb/bitstream.bin
+dabusb/firmware.fw
+dpaa2/mc/mc_10.28.1_ls2088a.itb
+dpaa2/mc/mc_10.14.3_lx2160a.itb
+dpaa2/mc/mc_10.16.2_ls1088a.itb
+dpaa2/mc/mc_10.18.0_ls1088a.itb
+dpaa2/mc/mc_10.16.2_lx2160a.itb
+dpaa2/mc/mc_10.10.0_lx2160a.itb
+dpaa2/mc/mc_10.18.0_ls2088a.itb
+dpaa2/mc/mc_10.28.1_lx2160a.itb
+dpaa2/mc/mc_10.10.0_ls1088a.itb
+dpaa2/mc/mc_10.18.0_lx2160a.itb
+dpaa2/mc/mc_10.28.1_ls1088a.itb
+dpaa2/mc/mc_10.10.0_ls2088a.itb
+dpaa2/mc/mc_10.16.2_ls2088a.itb
+dpaa2/mc/mc_10.14.3_ls1088a.itb
+dpaa2/mc/mc_10.14.3_ls2088a.itb
+dsp56k/bootstrap.bin
+dvb-fe-xc4000-1.4.1.fw
+dvb-fe-xc5000-1.6.114.fw
+dvb-fe-xc5000c-4.1.30.7.fw
+dvb-usb-dib0700-1.20.fw
+dvb-usb-it9135-01.fw
+dvb-usb-it9135-02.fw
+dvb-usb-terratec-h5-drxk.fw
+dvb_nova_12mhz.inp
+dvb_nova_12mhz_b0.inp
+e100/d101s_ucode.bin
+e100/d102e_ucode.bin
+e100/d101m_ucode.bin
+edgeport/down2.fw
+edgeport/boot2.fw
+edgeport/boot.fw
+edgeport/down.fw
+edgeport/down3.bin
+emi26/loader.fw
+emi26/firmware.fw
+emi26/bitstream.fw
+emi62/loader.fw
+emi62/spdif.fw
+emi62/midi.fw
+emi62/bitstream.fw
+ene-ub6250/ms_rdwr.bin
+ene-ub6250/sd_init1.bin
+ene-ub6250/sd_rdwr.bin
+ene-ub6250/ms_init.bin
+ene-ub6250/sd_init2.bin
+ene-ub6250/msp_rdwr.bin
+ess/maestro3_assp_kernel.fw
+ess/maestro3_assp_minisrc.fw
+f2255usb.bin
+go7007/px-tv402u.fw
+go7007/s2250-1.fw
+go7007/go7007fw.bin
+go7007/wis-startrek.fw
+go7007/go7007tv.bin
+go7007/s2250-2.fw
+go7007/lr192.fw
+go7007/px-m402u.fw
+hfi1_dc8051.fw
+hfi1_fabric.fw
+hfi1_pcie.fw
+hfi1_sbus.fw
+htc_7010.fw
+htc_9271.fw
+i915/skl_guc_32.0.3.bin
+i915/ehl_guc_70.1.1.bin
+i915/mtl_gsc_1.bin
+i915/skl_huc_2.0.0.bin
+i915/skl_guc_ver6_1.bin
+i915/tgl_guc_70.bin
+i915/cml_huc_4.0.0.bin
+i915/kbl_guc_69.0.3.bin
+i915/glk_huc_ver03_01_2893.bin
+i915/glk_guc_70.1.1.bin
+i915/icl_guc_32.0.3.bin
+i915/dg2_huc_gsc.bin
+i915/rkl_dmc_ver2_03.bin
+i915/adlp_dmc_ver2_14.bin
+i915/tgl_guc_69.0.3.bin
+i915/bxt_guc_62.0.0.bin
+i915/bmg_dmc.bin
+i915/bxt_guc_ver9_29.bin
+i915/tgl_huc_7.5.0.bin
+i915/glk_guc_49.0.1.bin
+i915/kbl_guc_32.0.3.bin
+i915/dg1_guc_70.1.1.bin
+i915/icl_guc_69.0.3.bin
+i915/kbl_huc_ver02_00_1810.bin
+i915/skl_huc_ver01_07_1398.bin
+i915/skl_guc_ver1.bin
+i915/skl_dmc_ver1_26.bin
+i915/adlp_dmc_ver2_16.bin
+i915/kbl_guc_ver9_39.bin
+i915/skl_guc_70.1.1.bin
+i915/skl_guc_49.0.1.bin
+i915/dg2_dmc_ver2_08.bin
+i915/skl_dmc_ver1_23.bin
+i915/cml_guc_69.0.3.bin
+i915/glk_huc_4.0.0.bin
+i915/dg1_guc_49.0.1.bin
+i915/tgl_dmc_ver2_06.bin
+i915/glk_guc_33.0.0.bin
+i915/adlp_guc_70.1.1.bin
+i915/kbl_guc_ver9_14.bin
+i915/mtl_huc_gsc.bin
+i915/dg1_guc_70.bin
+i915/tgl_huc_7.9.3.bin
+i915/dg1_huc_7.9.3.bin
+i915/skl_guc_69.0.3.bin
+i915/icl_guc_49.0.1.bin
+i915/cml_guc_33.0.0.bin
+i915/adlp_guc_69.0.3.bin
+i915/cnl_dmc_ver1_07.bin
+i915/mtl_guc_70.bin
+i915/kbl_guc_70.1.1.bin
+i915/adlp_guc_62.0.3.bin
+i915/tgl_huc_7.0.12.bin
+i915/bxt_guc_33.0.0.bin
+i915/icl_guc_70.1.1.bin
+i915/bxt_guc_49.0.1.bin
+i915/skl_dmc_ver1.bin
+i915/kbl_guc_49.0.1.bin
+i915/tgl_guc_35.2.0.bin
+i915/dg1_huc.bin
+i915/bxt_guc_ver8_7.bin
+i915/cml_guc_70.1.1.bin
+i915/bxt_huc_ver01_8_2893.bin
+i915/bxt_huc_ver01_07_1398.bin
+i915/ehl_guc_33.0.4.bin
+i915/adlp_dmc_ver2_09.bin
+i915/tgl_dmc_ver2_04.bin
+i915/cnl_dmc_ver1_06.bin
+i915/kbl_guc_33.0.0.bin
+i915/kbl_dmc_ver1_01.bin
+i915/bxt_dmc_ver1_07.bin
+i915/icl_dmc_ver1_09.bin
+i915/kbl_guc_62.0.0.bin
+i915/skl_guc_62.0.0.bin
+i915/dg2_guc_70.bin
+i915/adlp_dmc_ver2_12.bin
+i915/tgl_guc_70.1.1.bin
+i915/glk_guc_69.0.3.bin
+i915/ehl_huc_9.0.0.bin
+i915/skl_guc_33.0.0.bin
+i915/adlp_guc_70.bin
+i915/skl_dmc_ver1_27.bin
+i915/ehl_guc_69.0.3.bin
+i915/dg2_guc_70.1.2.bin
+i915/skl_guc_ver9_33.bin
+i915/glk_dmc_ver1_04.bin
+i915/mtl_dmc_ver2_10.bin
+i915/bxt_huc_2.0.0.bin
+i915/ehl_guc_62.0.0.bin
+i915/glk_guc_32.0.3.bin
+i915/rkl_dmc_ver2_02.bin
+i915/tgl_dmc_ver2_12.bin
+i915/bxt_guc_70.1.1.bin
+i915/dg2_dmc_ver2_07.bin
+i915/icl_guc_33.0.0.bin
+i915/kbl_dmc_ver1.bin
+i915/dg1_guc_62.0.0.bin
+i915/dg2_dmc_ver2_06.bin
+i915/bxt_dmc_ver1.bin
+i915/adlp_dmc_ver2_10.bin
+i915/icl_dmc_ver1_07.bin
+i915/kbl_dmc_ver1_04.bin
+i915/dg2_guc_70.4.1.bin
+i915/bxt_guc_32.0.3.bin
+i915/icl_huc_9.0.0.bin
+i915/dg1_huc_7.7.1.bin
+i915/xe2lpd_dmc.bin
+i915/bxt_guc_69.0.3.bin
+i915/ehl_guc_49.0.1.bin
+i915/xe3lpd_dmc.bin
+i915/adlp_dmc.bin
+i915/tgl_guc_49.0.1.bin
+i915/dg1_guc_69.0.3.bin
+i915/icl_huc_ver8_4_3238.bin
+i915/tgl_huc.bin
+i915/kbl_huc_4.0.0.bin
+i915/icl_guc_62.0.0.bin
+i915/tgl_guc_62.0.0.bin
+i915/glk_guc_62.0.0.bin
+i915/cml_guc_49.0.1.bin
+i915/skl_guc_ver6.bin
+i915/cml_guc_62.0.0.bin
+i915/skl_guc_ver4.bin
+i915/mtl_dmc.bin
+i915/dg1_dmc_ver2_02.bin
+i915/tgl_dmc_ver2_08.bin
+i915/adls_dmc_ver2_01.bin
+i915/tgl_huc_7.0.3.bin
+imx/sdma/sdma-imx7d.bin
+imx/sdma/sdma-imx6q.bin
+inside-secure/eip197_minifw/ifpp.bin
+inside-secure/eip197_minifw/ipue.bin
+intel/dsp_fw_cnl_v1858.bin
+intel/avs/hda-808628xx-3ep-tplg.bin
+intel/avs/cnl/dsp_basefw.bin
+intel/avs/nau8825-tplg.bin
+intel/avs/rt5640-tplg.bin
+intel/avs/dmic-tplg.bin
+intel/avs/hda-generic-1ep-tplg.bin
+intel/avs/rt298-tplg.bin
+intel/avs/max98357a-tplg.bin
+intel/avs/ssm4567-tplg.bin
+intel/avs/apl/dsp_basefw.bin
+intel/avs/hda-8086-generic-tplg.bin
+intel/avs/hda-generic-tplg.bin
+intel/avs/da7219-tplg.bin
+intel/avs/max98927-tplg.bin
+intel/avs/rt286-tplg.bin
+intel/avs/rt5514-tplg.bin
+intel/avs/rt5663-tplg.bin
+intel/avs/rt274-tplg.bin
+intel/avs/max98373-tplg.bin
+intel/avs/skl/dsp_mod_7CAD0808-AB10-CD23-EF45-12AB34CD56EF.bin
+intel/avs/skl/dsp_basefw.bin
+intel/ibt-1040-1020.sfi
+intel/dsp_fw_kbl_v3420.bin
+intel/ibt-1040-4150.sfi
+intel/ibt-1040-4150.ddc
+intel/dsp_fw_release_v3402.bin
+intel/ibt-0040-0041.ddc
+intel/ibt-0190-0041.ddc
+intel/ibt-0093-0041.ddc
+intel/ibt-19-0-3.ddc
+intel/ibt-12-16.sfi
+intel/ipu3-fw.bin
+intel/ibt-18-2.sfi
+intel/ibt-19-240-4.ddc
+intel/dsp_fw_kbl_v3266.bin
+intel/ibt-19-0-4.ddc
+intel/ibt-0180-1050.sfi
+intel/ibt-20-0-3.ddc
+intel/ibt-19-0-1.sfi
+intel/ibt-hw-37.7.10-fw-1.80.2.3.d.bseq
+intel/ibt-11-5.sfi
+intel/ibt-19-16-4.sfi
+intel/ibt-17-1.ddc
+intel/dsp_fw_glk_v3366.bin
+intel/fw_sst_22a8.bin
+intel/ibt-17-1.sfi
+intel/ibt-hw-37.8.10-fw-1.10.2.27.d.bseq
+intel/dsp_fw_release_v969.bin
+intel/ibt-18-2.ddc
+intel/ibt-1040-1050.sfi
+intel/dsp_fw_glk_v2768.bin
+intel/ibt-20-1-3.sfi
+intel/ibt-19-240-1.ddc
+intel/ibt-19-32-1.sfi
+intel/ibt-hw-37.7.10-fw-1.0.1.2d.d.bseq
+intel/ish/ish_lnlm.bin
+intel/irci_irci_ecr-master_20161208_0213_20170112_1500.bin
+intel/ibt-0190-0041.sfi
+intel/ibt-11-5.ddc
+intel/ibt-18-16-1.sfi
+intel/ibt-19-0-3.sfi
+intel/ibt-19-0-0.ddc
+intel/ibt-1040-0041.sfi
+intel/ibt-18-1.sfi
+intel/ibt-0040-1050.ddc
+intel/ibt-1040-2120.ddc
+intel/ibt-17-0-1.ddc
+intel/ibt-1040-1020.ddc
+intel/ibt-0180-0041.sfi
+intel/ibt-0190-0291-iml.sfi
+intel/ibt-19-32-4.ddc
+intel/ibt-17-0-1.sfi
+intel/ibt-0093-4150.sfi
+intel/dsp_fw_kbl_v3402.bin
+intel/dsp_fw_cnl_v1191.bin
+intel/IntcSST2.bin
+intel/ipu/ipu6se_fw.bin
+intel/ipu/ipu6ep_fw.bin
+intel/ipu/irci_irci_ecr-master_20161208_0213_20170112_1500.bin
+intel/ipu/shisp_2401a0_v21.bin
+intel/ipu/shisp_2400b0_v21.bin
+intel/ipu/ipu6epadln_fw.bin
+intel/ipu/ipu6_fw.bin
+intel/ipu/ipu6epmtl_fw.bin
+intel/ibt-0093-1050.sfi
+intel/ibt-0041-0041.ddc
+intel/ice/ddp-lag/ice_lag-1.3.1.0.pkg
+intel/ice/ddp-wireless_edge/ice_wireless_edge-1.3.20.0.pkg
+intel/ice/ddp-comms/ice_comms-1.3.52.0.pkg
+intel/ice/ddp/ice-1.3.41.0.pkg
+intel/ice/ddp/ice.pkg
+intel/ibt-20-0-3.sfi
+intel/ibt-0040-0041.sfi
+intel/ibt-0093-1050.ddc
+intel/ibt-0041-0041.sfi
+intel/fw_sst_0f28_ssp0.bin
+intel/ibt-17-2.ddc
+intel/ibt-0190-0291.sfi
+intel/dsp_fw_kbl_v2630.bin
+intel/ibt-18-0-1.ddc
+intel/vsc/ivsc_pkg_ovti02e1_0.bin
+intel/vsc/ivsc_pkg_ovti01as_0.bin
+intel/vsc/ivsc_pkg_ovti5678_0.bin
+intel/vsc/ivsc_skucfg_ovti5678_0_1.bin
+intel/vsc/ivsc_skucfg_ovti9734_0_1.bin
+intel/vsc/ivsc_pkg_ovti01a0_0.bin
+intel/vsc/ivsc_pkg_himx2170_0.bin
+intel/vsc/ivsc_pkg_int3537_0.bin
+intel/vsc/ivsc_skucfg_ovti01af_0_1.bin
+intel/vsc/ivsc_skucfg_ovti2740_0_1.bin
+intel/vsc/ivsc_skucfg_himx11b1_0_1.bin
+intel/vsc/ivsc_skucfg_ovti01as_0_1.bin
+intel/vsc/ivsc_fw.bin
+intel/vsc/ivsc_skucfg_hi556_0_1.bin
+intel/vsc/ivsc_skucfg_himx2170_0_1.bin
+intel/vsc/ivsc_pkg_himx2172_0.bin
+intel/vsc/ivsc_skucfg_int3537_0_1.bin
+intel/vsc/ivsc_pkg_ovti9734_0.bin
+intel/vsc/ivsc_pkg_ovti2740_0.bin
+intel/vsc/ivsc_pkg_hi556_0.bin
+intel/vsc/ivsc_pkg_ovti02c1_0.bin
+intel/vsc/ivsc_pkg_himx11b1_0.bin
+intel/vsc/ivsc_pkg_ovti9738_0.bin
+intel/vsc/ivsc_pkg_ovti01af_0.bin
+intel/vsc/ivsc_skucfg_ovti02e1_0_1.bin
+intel/vsc/ivsc_skucfg_ovti02c1_0_1.bin
+intel/vsc/ivsc_skucfg_himx2172_0_1.bin
+intel/vsc/ivsc_skucfg_ovti9738_0_1.bin
+intel/vsc/ivsc_skucfg_ovti01a0_0_1.bin
+intel/ibt-18-16-1.ddc
+intel/ibt-12-16.ddc
+intel/dsp_fw_glk.bin
+intel/ibt-0291-0291.sfi
+intel/ibt-0093-4150.ddc
+intel/ibt-19-32-0.sfi
+intel/ibt-19-16-4.ddc
+intel/ibt-19-0-4.sfi
+intel/dsp_fw_bxtn.bin
+intel/ibt-18-0-1.sfi
+intel/dsp_fw_glk_v2880.bin
+intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq
+intel/dsp_fw_kbl_v1037.bin
+intel/ibt-1040-2120.sfi
+intel/ibt-19-0-1.ddc
+intel/ibt-17-16-1.sfi
+intel/dsp_fw_kbl.bin
+intel/ibt-0093-0291.ddc
+intel/ibt-0093-0041.sfi
+intel/ibt-0190-0041-iml.sfi
+intel/fw_sst_0f28.bin
+intel/dsp_fw_kbl_v2042.bin
+intel/ibt-0040-1020.sfi
+intel/dsp_fw_release.bin
+intel/ibt-0180-4150.sfi
+intel/ibt-17-2.sfi
+intel/ibt-1040-1050.ddc
+intel/ibt-18-1.ddc
+intel/ibt-19-32-0.ddc
+intel/catpt/bdw/dsp_basefw.bin
+intel/ibt-19-240-1.sfi
+intel/ibt-19-32-1.ddc
+intel/dsp_fw_kbl_v701.bin
+intel/ibt-0040-2120.sfi
+intel/ibt-hw-37.7.bseq
+intel/ibt-20-1-4.sfi
+intel/ibt-19-0-0.sfi
+intel/ibt-0040-4150.ddc
+intel/dsp_fw_cnl.bin
+intel/ibt-hw-37.7.10-fw-1.80.1.2d.d.bseq
+intel/ibt-hw-37.8.bseq
+intel/ibt-hw-37.8.10-fw-22.50.19.14.f.bseq
+intel/fw_sst_0f28.bin-48kHz_i2s_master
+intel/ibt-20-1-4.ddc
+intel/ibt-0180-1050.ddc
+intel/ibt-0093-0291.sfi
+intel/ibt-0291-0291.ddc
+intel/ibt-20-1-3.ddc
+intel/ibt-hw-37.7.10-fw-1.0.2.3.d.bseq
+intel/dsp_fw_bxtn_v3366.bin
+intel/dsp_fw_bxtn_v2219.bin
+intel/ibt-19-32-4.sfi
+intel/ibt-0180-4150.ddc
+intel/ibt-19-240-4.sfi
+intel/ibt-0040-1050.sfi
+intel/ibt-0040-4150.sfi
+intel/dsp_fw_glk_v1814.bin
+intel/ibt-0180-0041.ddc
+intel/ibt-0190-0291.ddc
+intel/ibt-0040-2120.ddc
+intel/ibt-1040-0041.ddc
+intel/ibt-17-16-1.ddc
+intel/ibt-0040-1020.ddc
+isci/isci_firmware.bin
+isdbt_nova_12mhz.inp
+isdbt_nova_12mhz_b0.inp
+isdbt_rio.inp
+iwlwifi-100-5.ucode
+iwlwifi-1000-5.ucode
+iwlwifi-105-6.ucode
+iwlwifi-135-6.ucode
+iwlwifi-2000-6.ucode
+iwlwifi-2030-6.ucode
+iwlwifi-3160-17.ucode
+iwlwifi-3168-29.ucode
+iwlwifi-3945-2.ucode
+iwlwifi-4965-2.ucode
+iwlwifi-5000-5.ucode
+iwlwifi-5150-2.ucode
+iwlwifi-6000-4.ucode
+iwlwifi-6000g2a-6.ucode
+iwlwifi-6000g2b-6.ucode
+iwlwifi-6050-5.ucode
+iwlwifi-7260-17.ucode
+iwlwifi-7265-17.ucode
+iwlwifi-7265D-29.ucode
+iwlwifi-8000C-34.ucode
+iwlwifi-8000C-36.ucode
+iwlwifi-8265-34.ucode
+iwlwifi-8265-36.ucode
+iwlwifi-9000-pu-b0-jf-b0-34.ucode
+iwlwifi-9000-pu-b0-jf-b0-38.ucode
+iwlwifi-9000-pu-b0-jf-b0-46.ucode
+iwlwifi-9260-th-b0-jf-b0-34.ucode
+iwlwifi-9260-th-b0-jf-b0-38.ucode
+iwlwifi-9260-th-b0-jf-b0-46.ucode
+iwlwifi-Qu-b0-hr-b0-50.ucode
+iwlwifi-Qu-b0-hr-b0-59.ucode
+iwlwifi-Qu-b0-hr-b0-66.ucode
+iwlwifi-Qu-b0-hr-b0-72.ucode
+iwlwifi-Qu-b0-hr-b0-73.ucode
+iwlwifi-Qu-b0-hr-b0-74.ucode
+iwlwifi-Qu-b0-hr-b0-77.ucode
+iwlwifi-Qu-b0-jf-b0-50.ucode
+iwlwifi-Qu-b0-jf-b0-59.ucode
+iwlwifi-Qu-b0-jf-b0-66.ucode
+iwlwifi-Qu-b0-jf-b0-72.ucode
+iwlwifi-Qu-b0-jf-b0-73.ucode
+iwlwifi-Qu-b0-jf-b0-74.ucode
+iwlwifi-Qu-b0-jf-b0-77.ucode
+iwlwifi-Qu-c0-hr-b0-50.ucode
+iwlwifi-Qu-c0-hr-b0-59.ucode
+iwlwifi-Qu-c0-hr-b0-66.ucode
+iwlwifi-Qu-c0-hr-b0-72.ucode
+iwlwifi-Qu-c0-hr-b0-73.ucode
+iwlwifi-Qu-c0-hr-b0-74.ucode
+iwlwifi-Qu-c0-hr-b0-77.ucode
+iwlwifi-Qu-c0-jf-b0-50.ucode
+iwlwifi-Qu-c0-jf-b0-59.ucode
+iwlwifi-Qu-c0-jf-b0-66.ucode
+iwlwifi-Qu-c0-jf-b0-72.ucode
+iwlwifi-Qu-c0-jf-b0-73.ucode
+iwlwifi-Qu-c0-jf-b0-74.ucode
+iwlwifi-Qu-c0-jf-b0-77.ucode
+iwlwifi-QuZ-a0-hr-b0-50.ucode
+iwlwifi-QuZ-a0-hr-b0-59.ucode
+iwlwifi-QuZ-a0-hr-b0-66.ucode
+iwlwifi-QuZ-a0-hr-b0-72.ucode
+iwlwifi-QuZ-a0-hr-b0-73.ucode
+iwlwifi-QuZ-a0-hr-b0-74.ucode
+iwlwifi-QuZ-a0-hr-b0-77.ucode
+iwlwifi-QuZ-a0-jf-b0-50.ucode
+iwlwifi-QuZ-a0-jf-b0-59.ucode
+iwlwifi-QuZ-a0-jf-b0-66.ucode
+iwlwifi-QuZ-a0-jf-b0-72.ucode
+iwlwifi-QuZ-a0-jf-b0-73.ucode
+iwlwifi-QuZ-a0-jf-b0-74.ucode
+iwlwifi-QuZ-a0-jf-b0-77.ucode
+iwlwifi-bz-b0-fm-c0-92.ucode
+iwlwifi-bz-b0-fm-c0-94.ucode
+iwlwifi-bz-b0-fm-c0.pnvm
+iwlwifi-bz-b0-gf-a0-92.ucode
+iwlwifi-bz-b0-gf-a0-94.ucode
+iwlwifi-bz-b0-gf-a0.pnvm
+iwlwifi-cc-a0-50.ucode
+iwlwifi-cc-a0-59.ucode
+iwlwifi-cc-a0-66.ucode
+iwlwifi-cc-a0-72.ucode
+iwlwifi-cc-a0-73.ucode
+iwlwifi-cc-a0-74.ucode
+iwlwifi-cc-a0-77.ucode
+iwlwifi-gl-c0-fm-c0-83.ucode
+iwlwifi-gl-c0-fm-c0-86.ucode
+iwlwifi-gl-c0-fm-c0-90.ucode
+iwlwifi-gl-c0-fm-c0-92.ucode
+iwlwifi-gl-c0-fm-c0-94.ucode
+iwlwifi-gl-c0-fm-c0.pnvm
+iwlwifi-ma-b0-gf-a0-83.ucode
+iwlwifi-ma-b0-gf-a0-86.ucode
+iwlwifi-ma-b0-gf-a0-89.ucode
+iwlwifi-ma-b0-gf-a0.pnvm
+iwlwifi-ma-b0-gf4-a0-83.ucode
+iwlwifi-ma-b0-gf4-a0-86.ucode
+iwlwifi-ma-b0-gf4-a0-89.ucode
+iwlwifi-ma-b0-gf4-a0.pnvm
+iwlwifi-ma-b0-hr-b0-83.ucode
+iwlwifi-ma-b0-hr-b0-86.ucode
+iwlwifi-ma-b0-hr-b0-89.ucode
+iwlwifi-so-a0-gf-a0-72.ucode
+iwlwifi-so-a0-gf-a0-73.ucode
+iwlwifi-so-a0-gf-a0-74.ucode
+iwlwifi-so-a0-gf-a0-77.ucode
+iwlwifi-so-a0-gf-a0-78.ucode
+iwlwifi-so-a0-gf-a0-79.ucode
+iwlwifi-so-a0-gf-a0-81.ucode
+iwlwifi-so-a0-gf-a0-83.ucode
+iwlwifi-so-a0-gf-a0-84.ucode
+iwlwifi-so-a0-gf-a0-86.ucode
+iwlwifi-so-a0-gf-a0-89.ucode
+iwlwifi-so-a0-gf-a0.pnvm
+iwlwifi-so-a0-gf4-a0-72.ucode
+iwlwifi-so-a0-gf4-a0-73.ucode
+iwlwifi-so-a0-gf4-a0-74.ucode
+iwlwifi-so-a0-gf4-a0-77.ucode
+iwlwifi-so-a0-gf4-a0-78.ucode
+iwlwifi-so-a0-gf4-a0-79.ucode
+iwlwifi-so-a0-gf4-a0-81.ucode
+iwlwifi-so-a0-gf4-a0-83.ucode
+iwlwifi-so-a0-gf4-a0-84.ucode
+iwlwifi-so-a0-gf4-a0-86.ucode
+iwlwifi-so-a0-gf4-a0-89.ucode
+iwlwifi-so-a0-gf4-a0.pnvm
+iwlwifi-so-a0-hr-b0-72.ucode
+iwlwifi-so-a0-hr-b0-73.ucode
+iwlwifi-so-a0-hr-b0-74.ucode
+iwlwifi-so-a0-hr-b0-77.ucode
+iwlwifi-so-a0-hr-b0-79.ucode
+iwlwifi-so-a0-hr-b0-81.ucode
+iwlwifi-so-a0-hr-b0-83.ucode
+iwlwifi-so-a0-hr-b0-84.ucode
+iwlwifi-so-a0-hr-b0-86.ucode
+iwlwifi-so-a0-hr-b0-89.ucode
+iwlwifi-so-a0-jf-b0-72.ucode
+iwlwifi-so-a0-jf-b0-73.ucode
+iwlwifi-so-a0-jf-b0-74.ucode
+iwlwifi-so-a0-jf-b0-77.ucode
+iwlwifi-ty-a0-gf-a0-59.ucode
+iwlwifi-ty-a0-gf-a0-66.ucode
+iwlwifi-ty-a0-gf-a0-72.ucode
+iwlwifi-ty-a0-gf-a0-73.ucode
+iwlwifi-ty-a0-gf-a0-74.ucode
+iwlwifi-ty-a0-gf-a0-77.ucode
+iwlwifi-ty-a0-gf-a0-78.ucode
+iwlwifi-ty-a0-gf-a0-79.ucode
+iwlwifi-ty-a0-gf-a0-81.ucode
+iwlwifi-ty-a0-gf-a0-83.ucode
+iwlwifi-ty-a0-gf-a0-84.ucode
+iwlwifi-ty-a0-gf-a0-86.ucode
+iwlwifi-ty-a0-gf-a0-89.ucode
+iwlwifi-ty-a0-gf-a0.pnvm
+ixp4xx/NPE-A-HSS
+ixp4xx/NPE-A
+ixp4xx/NPE-B
+ixp4xx/NPE-C
+kaweth/trigger_code.bin
+kaweth/trigger_code_fix.bin
+kaweth/new_code.bin
+kaweth/new_code_fix.bin
+keyspan/usa28.fw
+keyspan/usa49w.fw
+keyspan/usa18x.fw
+keyspan/usa19qi.fw
+keyspan/usa28xb.fw
+keyspan/mpr.fw
+keyspan/usa19qw.fw
+keyspan/usa28xa.fw
+keyspan/usa19w.fw
+keyspan/usa19.fw
+keyspan/usa49wlc.fw
+keyspan/usa28x.fw
+keyspan_pda/xircom_pgs.fw
+keyspan_pda/keyspan_pda.fw
+korg/k1212.dsp
+lbtf_usb.bin
+lgs8g75.fw
+libertas/gspi8686_v9_helper.bin
+libertas/sd8682.bin
+libertas/usb8388_v9.bin
+libertas/sd8686_v9.bin
+libertas/cf8381_helper.bin
+libertas/sd8688_helper.bin
+libertas/gspi8682_helper.bin
+libertas/gspi8688_helper.bin
+libertas/usb8682.bin
+libertas/sd8682_helper.bin
+libertas/cf8385.bin
+libertas/lbtf_sdio.bin
+libertas/sd8688.bin
+libertas/gspi8686_v9.bin
+libertas/cf8385_helper.bin
+libertas/gspi8682.bin
+libertas/usb8388_olpc.bin
+libertas/cf8381.bin
+libertas/usb8388_v5.bin
+libertas/sd8686_v8.bin
+libertas/sd8385.bin
+libertas/sd8686_v9_helper.bin
+libertas/sd8686_v8_helper.bin
+libertas/gspi8688.bin
+libertas/sd8385_helper.bin
+liquidio/lio_210sv_nic.bin
+liquidio/lio_23xx_nic.bin
+liquidio/lio_210nv_nic.bin
+liquidio/lio_410nv_nic.bin
+lt9611uxc_fw.bin
+matrox/g400_warp.fw
+matrox/g200_warp.fw
+mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin
+mediatek/mt7662_rom_patch.bin
+mediatek/mt7988_wo_1.bin
+mediatek/mt7663pr2h_rebb.bin
+mediatek/mt8195/scp.img
+mediatek/mt7986_eeprom_mt7976.bin
+mediatek/BT_RAM_CODE_MT7922_1_1_hdr.bin
+mediatek/mt7986_eeprom_mt7976_dbdc.bin
+mediatek/mt7986_wm_mt7975.bin
+mediatek/mt7996/mt7992_dsp_23.bin
+mediatek/mt7996/mt7992_rom_patch.bin
+mediatek/mt7996/mt7992_eeprom_2i5i.bin
+mediatek/mt7996/mt7996_rom_patch.bin
+mediatek/mt7996/mt7996_eeprom_233_2i5i6i.bin
+mediatek/mt7996/mt7992_wa.bin
+mediatek/mt7996/mt7992_wm_23.bin
+mediatek/mt7996/mt7996_eeprom_2i5i6i.bin
+mediatek/mt7996/mt7996_eeprom.bin
+mediatek/mt7996/mt7992_eeprom_23_2i5i.bin
+mediatek/mt7996/mt7992_wm.bin
+mediatek/mt7996/mt7996_wm_233.bin
+mediatek/mt7996/mt7992_dsp.bin
+mediatek/mt7996/mt7992_wa_23.bin
+mediatek/mt7996/mt7996_wa_233.bin
+mediatek/mt7996/mt7996_eeprom_233.bin
+mediatek/mt7996/mt7996_wa.bin
+mediatek/mt7996/mt7996_dsp.bin
+mediatek/mt7996/mt7992_rom_patch_23.bin
+mediatek/mt7996/mt7996_wm.bin
+mediatek/mt7996/mt7992_eeprom.bin
+mediatek/mt7996/mt7992_eeprom_2i5e.bin
+mediatek/mt7996/mt7992_eeprom_23.bin
+mediatek/mt7996/mt7996_rom_patch_233.bin
+mediatek/mt7601u.bin
+mediatek/mt7662u.bin
+mediatek/mt7663pr2h.bin
+mediatek/WIFI_RAM_CODE_MT7922_1.bin
+mediatek/WIFI_RAM_CODE_MT7961_1.bin
+mediatek/mt7662u_rom_patch.bin
+mediatek/mt8186/scp.img
+mediatek/mt7988_wo_0.bin
+mediatek/mt7981_rom_patch.bin
+mediatek/mt7615_n9.bin
+mediatek/mt7915_wa.bin
+mediatek/mt7663_n9_rebb.bin
+mediatek/mt7915_eeprom_dbdc.bin
+mediatek/mt8192/scp.img
+mediatek/mt7663_n9_v3.bin
+mediatek/mt7622pr2h.bin
+mediatek/WIFI_MT7961_patch_mcu_1a_2_hdr.bin
+mediatek/mt7610e.bin
+mediatek/mt7916_eeprom.bin
+mediatek/mt8173/vpu_p.bin
+mediatek/mt8173/vpu_d.bin
+mediatek/mt7610u.bin
+mediatek/mt7916_wa.bin
+mediatek/mt7981_wm.bin
+mediatek/BT_RAM_CODE_MT7961_1a_2_hdr.bin
+mediatek/mt7622_n9.bin
+mediatek/mt7986_wm.bin
+mediatek/mt7622_rom_patch.bin
+mediatek/sof-tplg/sof-mt8195-mt6359-rt1019-rt5682.tplg
+mediatek/sof-tplg/sof-mt8186.tplg
+mediatek/sof-tplg/sof-mt8195-mt6359-max98390-rt5682.tplg
+mediatek/mt7915_eeprom.bin
+mediatek/mt7986_rom_patch_mt7975.bin
+mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin
+mediatek/mt7915_rom_patch.bin
+mediatek/mt7986_wo_1.bin
+mediatek/mt7650.bin
+mediatek/mt7615_rom_patch.bin
+mediatek/mt7986_eeprom_mt7976_dual.bin
+mediatek/sof/sof-mt8195.ldc
+mediatek/sof/sof-mt8195.ri
+mediatek/sof/sof-mt8186.ldc
+mediatek/sof/sof-mt8186.ri
+mediatek/mt7650e.bin
+mediatek/mt7986_wa.bin
+mediatek/mt7925/WIFI_RAM_CODE_MT7925_1_1.bin
+mediatek/mt7925/BT_RAM_CODE_MT7925_1_1_hdr.bin
+mediatek/mt7925/WIFI_MT7925_PATCH_MCU_1_1_hdr.bin
+mediatek/mt7986_wo_0.bin
+mediatek/mt8183/scp.img
+mediatek/mt7981_wa.bin
+mediatek/mt7615_cr4.bin
+mediatek/mt7668pr2h.bin
+mediatek/mt7986_eeprom_mt7975_dual.bin
+mediatek/mt7916_rom_patch.bin
+mediatek/mt7988/mt7988_wo_1.bin
+mediatek/mt7988/mt7988_wo_0.bin
+mediatek/mt7988/i2p5ge-phy-pmb.bin
+mediatek/WIFI_RAM_CODE_MT7961_1a.bin
+mediatek/mt7916_wm.bin
+mediatek/mt7981_wo.bin
+mediatek/WIFI_MT7922_patch_mcu_1_1_hdr.bin
+mediatek/mt7986_rom_patch.bin
+mediatek/mt7662.bin
+mediatek/mt7915_wm.bin
+mellanox/mlxsw_spectrum-13.2008.2304.mfa2
+mellanox/mlxsw_spectrum-13.2008.2438.mfa2
+mellanox/mlxsw_spectrum-13.2000.2714.mfa2
+mellanox/mlxsw_spectrum3-30.2010.1006.mfa2
+mellanox/mlxsw_spectrum3-30.2010.1502.mfa2
+mellanox/mlxsw_spectrum3-30.2008.1310.mfa2
+mellanox/mlxsw_spectrum-13.2010.1502.mfa2
+mellanox/lc_ini_bundle_2010_1006.bin
+mellanox/mlxsw_spectrum3-30.2008.2018.mfa2
+mellanox/mlxsw_spectrum-13.1420.122.mfa2
+mellanox/mlxsw_spectrum-13.1910.622.mfa2
+mellanox/mlxsw_spectrum-13.2010.3020.mfa2
+mellanox/mlxsw_spectrum2-29.2012.1012.mfa2
+mellanox/mlxsw_spectrum3-30.2008.2304.mfa2
+mellanox/mlxsw_spectrum-13.1702.6.mfa2
+mellanox/mlxsw_spectrum-13.2010.1232.mfa2
+mellanox/mlxsw_spectrum3-30.2010.3146.mfa2
+mellanox/mlxsw_spectrum2-29.2010.1232.mfa2
+mellanox/mlxsw_spectrum2-29.2010.1502.mfa2
+mellanox/mlxsw_spectrum-13.2008.2946.mfa2
+mellanox/mlxsw_spectrum2-29.2010.1406.mfa2
+mellanox/mlxsw_spectrum2-29.2010.1006.mfa2
+mellanox/mlxsw_spectrum-13.2007.1168.mfa2
+mellanox/mlxsw_spectrum2-29.2008.1312.mfa2
+mellanox/mlxsw_spectrum-13.2010.1006.mfa2
+mellanox/mlxsw_spectrum-13.2012.1012.mfa2
+mellanox/mlxsw_spectrum-13.2008.3326.mfa2
+mellanox/mlxsw_spectrum-13.2010.1406.mfa2
+mellanox/mlxsw_spectrum3-30.2007.1168.mfa2
+mellanox/mlxsw_spectrum3-30.2010.3020.mfa2
+mellanox/mlxsw_spectrum-13.2008.1036.mfa2
+mellanox/mlxsw_spectrum-13.1703.4.mfa2
+mellanox/mlxsw_spectrum2-29.2008.3326.mfa2
+mellanox/mlxsw_spectrum2-29.2008.2018.mfa2
+mellanox/mlxsw_spectrum4-34.2012.1012.mfa2
+mellanox/mlxsw_spectrum-13.2000.1122.mfa2
+mellanox/mlxsw_spectrum2-29.2010.3146.mfa2
+mellanox/mlxsw_spectrum-13.2008.1310.mfa2
+mellanox/mlxsw_spectrum-13.2008.2018.mfa2
+mellanox/mlxsw_spectrum2-29.2010.3020.mfa2
+mellanox/mlxsw_spectrum3-30.2008.2406.mfa2
+mellanox/mlxsw_spectrum3-30.2008.2438.mfa2
+mellanox/mlxsw_spectrum3-30.2008.1312.mfa2
+mellanox/mlxsw_spectrum-13.2008.1312.mfa2
+mellanox/mlxsw_spectrum-13.2000.2308.mfa2
+mellanox/mlxsw_spectrum2-29.2008.2946.mfa2
+mellanox/mlxsw_spectrum3-30.2008.1036.mfa2
+mellanox/mlxsw_spectrum2-29.2008.2304.mfa2
+mellanox/mlxsw_spectrum-13.2010.3146.mfa2
+mellanox/mlxsw_spectrum2-29.2008.1036.mfa2
+mellanox/mlxsw_spectrum-13.2008.2406.mfa2
+mellanox/mlxsw_spectrum2-29.2008.2406.mfa2
+mellanox/mlxsw_spectrum-13.1530.152.mfa2
+mellanox/mlxsw_spectrum-13.2000.1886.mfa2
+mellanox/mlxsw_spectrum3-30.2010.1406.mfa2
+mellanox/mlxsw_spectrum3-30.2010.1232.mfa2
+mellanox/mlxsw_spectrum2-29.2008.2438.mfa2
+mellanox/lc_ini_bundle_2010_3146.bin
+mellanox/mlxsw_spectrum2-29.2000.2308.mfa2
+mellanox/mlxsw_spectrum3-30.2008.2946.mfa2
+mellanox/lc_ini_bundle_2010_1502.bin
+mellanox/mlxsw_spectrum2-29.2008.1310.mfa2
+mellanox/mlxsw_spectrum3-30.2012.1012.mfa2
+mellanox/mlxsw_spectrum-13.1620.192.mfa2
+mellanox/lc_ini_bundle_2010_3020.bin
+mellanox/mlxsw_spectrum3-30.2008.3326.mfa2
+mellanox/mlxsw_spectrum2-29.2007.1168.mfa2
+mellanox/mlxsw_spectrum2-29.2000.2714.mfa2
+meson/vdec/gxl_hevc.bin
+meson/vdec/g12a_hevc_mmu.bin
+meson/vdec/gxl_vp9.bin
+meson/vdec/g12a_h264.bin
+meson/vdec/gxl_h263.bin
+meson/vdec/gxl_hevc_mmu.bin
+meson/vdec/gxbb_h264.bin
+meson/vdec/gxl_h264.bin
+meson/vdec/gxl_mpeg12.bin
+meson/vdec/gxl_mpeg4_5.bin
+meson/vdec/gxl_mjpeg.bin
+meson/vdec/sm1_hevc_mmu.bin
+meson/vdec/sm1_vp9_mmu.bin
+meson/vdec/gxm_h264.bin
+meson/vdec/g12a_vp9.bin
+microchip/mscc_vsc8574_revb_int8051_29e8.bin
+microchip/mscc_vsc8584_revb_int8051_fb48.bin
+moxa/moxa-1410.fw
+moxa/moxa-1151.fw
+moxa/moxa-1131.fw
+moxa/moxa-1251.fw
+moxa/moxa-1450.fw
+moxa/moxa-1618.fw
+moxa/moxa-1130.fw
+moxa/moxa-1250.fw
+moxa/moxa-1150.fw
+moxa/moxa-1110.fw
+moxa/moxa-1613.fw
+moxa/moxa-1451.fw
+moxa/moxa-1653.fw
+moxa/moxa-1658.fw
+mrvl/cpt03/ae.out
+mrvl/cpt03/se.out
+mrvl/cpt03/ie.out
+mrvl/prestera/mvsw_prestera_fw-v2.0.img
+mrvl/prestera/mvsw_prestera_fw-v4.1.img
+mrvl/prestera/mvsw_prestera_fw_arm64-v4.1.img
+mrvl/prestera/mvsw_prestera_fw-v3.0.img
+mrvl/prestera/mvsw_prestera_fw-v4.0.img
+mrvl/usb8797_uapsta.bin
+mrvl/cpt04/ae.out
+mrvl/cpt04/se.out
+mrvl/cpt04/ie.out
+mrvl/pcieuart8997_combo_v4.bin
+mrvl/cpt01/ae.out
+mrvl/cpt01/se.out
+mrvl/cpt01/ie.out
+mrvl/sd8787_uapsta.bin
+mrvl/sd8688_helper.bin
+mrvl/usbusb8997_combo_v4.bin
+mrvl/usb8801_uapsta.bin
+mrvl/pcie8997_wlan_v4.bin
+mrvl/sdsd8997_combo_v4.bin
+mrvl/sd8801_uapsta.bin
+mrvl/pcieusb8997_combo_v4.bin
+mrvl/sd8797_uapsta.bin
+mrvl/sdsd8977_combo_v2.bin
+mrvl/sd8688.bin
+mrvl/sd8897_uapsta.bin
+mrvl/usb8897_uapsta.bin
+mrvl/cpt02/ae.out
+mrvl/cpt02/se.out
+mrvl/cpt02/ie.out
+mrvl/pcie8897_uapsta.bin
+mrvl/usb8766_uapsta.bin
+mrvl/sd8887_uapsta.bin
+mt7601u.bin
+mt7650.bin
+mt7662.bin
+mt7662_rom_patch.bin
+mts_cdma.fw
+mts_edge.fw
+mts_gsm.fw
+mts_mt9234mu.fw
+mts_mt9234zba.fw
+mwl8k/helper_8687.fw
+mwl8k/fmimage_8687.fw
+mwl8k/fmimage_8366_ap-1.fw
+mwl8k/fmimage_8764_ap-1.fw
+mwl8k/fmimage_8366.fw
+mwl8k/helper_8366.fw
+mwl8k/fmimage_8366_ap-2.fw
+mwl8k/fmimage_8366_ap-3.fw
+mwlwifi/88W8864.bin
+mwlwifi/88W8897.bin
+myri10ge_eth_big_z8e.dat
+myri10ge_eth_z8e.dat
+myri10ge_ethp_big_z8e.dat
+myri10ge_ethp_z8e.dat
+myri10ge_rss_eth_big_z8e.dat
+myri10ge_rss_eth_z8e.dat
+myri10ge_rss_ethp_big_z8e.dat
+myri10ge_rss_ethp_z8e.dat
+myricom/lanai.bin
+netronome/nic_AMDA0081-0001_4x10.nffw
+netronome/nic_AMDA0097-0001_8x10.nffw
+netronome/nic_AMDA0058-0012_2x40.nffw
+netronome/nic_AMDA0081-0001_1x40.nffw
+netronome/nic_AMDA0058-0011_2x40.nffw
+netronome/nic-sriov/nic_AMDA0081-0001_4x10.nffw
+netronome/nic-sriov/nic_AMDA0097-0001_8x10.nffw
+netronome/nic-sriov/nic_AMDA0058-0012_2x40.nffw
+netronome/nic-sriov/nic_AMDA0081-0001_1x40.nffw
+netronome/nic-sriov/nic_AMDA0058-0011_2x40.nffw
+netronome/nic-sriov/nic_AMDA0097-0001_4x10_1x40.nffw
+netronome/nic-sriov/nic_AMDA0099-0001_1x10_1x25.nffw
+netronome/nic-sriov/nic_AMDA0096-0001_2x10.nffw
+netronome/nic-sriov/nic_AMDA0099-0001_2x10.nffw
+netronome/nic-sriov/nic_AMDA0078-0011_1x100.nffw
+netronome/nic-sriov/nic_AMDA0097-0001_2x40.nffw
+netronome/nic-sriov/nic_AMDA0099-0001_2x25.nffw
+netronome/nic_AMDA0097-0001_4x10_1x40.nffw
+netronome/bpf/nic_AMDA0081-0001_4x10.nffw
+netronome/bpf/nic_AMDA0097-0001_8x10.nffw
+netronome/bpf/nic_AMDA0058-0012_2x40.nffw
+netronome/bpf/nic_AMDA0081-0001_1x40.nffw
+netronome/bpf/nic_AMDA0058-0011_2x40.nffw
+netronome/bpf/nic_AMDA0097-0001_4x10_1x40.nffw
+netronome/bpf/nic_AMDA0099-0001_1x10_1x25.nffw
+netronome/bpf/nic_AMDA0096-0001_2x10.nffw
+netronome/bpf/nic_AMDA0099-0001_2x10.nffw
+netronome/bpf/nic_AMDA0078-0011_1x100.nffw
+netronome/bpf/nic_AMDA0097-0001_2x40.nffw
+netronome/bpf/nic_AMDA0099-0001_2x25.nffw
+netronome/nic_AMDA0099-0001_1x10_1x25.nffw
+netronome/nic_AMDA0096-0001_2x10.nffw
+netronome/nic_AMDA0099-0001_2x10.nffw
+netronome/nic/nic_AMDA0081-0001_4x10.nffw
+netronome/nic/nic_AMDA0097-0001_8x10.nffw
+netronome/nic/nic_AMDA0058-0012_2x40.nffw
+netronome/nic/nic_AMDA0081-0001_1x40.nffw
+netronome/nic/nic_AMDA0058-0011_2x40.nffw
+netronome/nic/nic_AMDA0097-0001_4x10_1x40.nffw
+netronome/nic/nic_AMDA0099-0001_1x10_1x25.nffw
+netronome/nic/nic_AMDA0096-0001_2x10.nffw
+netronome/nic/nic_AMDA0099-0001_2x10.nffw
+netronome/nic/nic_AMDA0078-0011_1x100.nffw
+netronome/nic/nic_AMDA0097-0001_2x40.nffw
+netronome/nic/nic_AMDA0099-0001_2x25.nffw
+netronome/nic_AMDA0078-0011_1x100.nffw
+netronome/flower/nic_AMDA0081-0001_4x10.nffw
+netronome/flower/nic_AMDA0081.nffw
+netronome/flower/nic_AMDA0097-0001_8x10.nffw
+netronome/flower/nic_AMDA0058-0012_2x40.nffw
+netronome/flower/nic_AMDA0058-0011_1x100.nffw
+netronome/flower/nic_AMDA0081-0001_1x40.nffw
+netronome/flower/nic_AMDA0058-0012_1x100.nffw
+netronome/flower/nic_AMDA0078-0012_1x100.nffw
+netronome/flower/nic_AMDA0078-0012_4x10_1x40.nffw
+netronome/flower/nic_AMDA0058-0012_8x10.nffw
+netronome/flower/nic_AMDA0097.nffw
+netronome/flower/nic_AMDA0078-0012_8x10.nffw
+netronome/flower/nic_AMDA0058-0012_4x10_1x40.nffw
+netronome/flower/nic_AMDA0058-0011_2x40.nffw
+netronome/flower/nic_AMDA0099.nffw
+netronome/flower/nic_AMDA0096.nffw
+netronome/flower/nic_AMDA0097-0001_4x10_1x40.nffw
+netronome/flower/nic_AMDA0099-0001_1x10_1x25.nffw
+netronome/flower/nic_AMDA0096-0001_2x10.nffw
+netronome/flower/nic_AMDA0058-0011_8x10.nffw
+netronome/flower/nic_AMDA0099-0001_2x10.nffw
+netronome/flower/nic_AMDA0058-0011_4x10_1x40.nffw
+netronome/flower/nic_AMDA0078-0011_1x100.nffw
+netronome/flower/nic_AMDA0078-0011_8x10.nffw
+netronome/flower/nic_AMDA0058.nffw
+netronome/flower/nic_AMDA0078-0011_4x10_1x40.nffw
+netronome/flower/nic_AMDA0078-0011_2x40.nffw
+netronome/flower/nic_AMDA0097-0001_2x40.nffw
+netronome/flower/nic_AMDA0078-0012_2x40.nffw
+netronome/flower/nic_AMDA0099-0001_2x25.nffw
+netronome/nic_AMDA0097-0001_2x40.nffw
+netronome/nic_AMDA0099-0001_2x25.nffw
+nvidia/ga106/gr/NET_img.bin
+nvidia/ga106/gr/gpccs_bl.bin
+nvidia/ga106/gr/fecs_sig.bin
+nvidia/ga106/gr/fecs_bl.bin
+nvidia/ga106/gr/gpccs_sig.bin
+nvidia/ga106/gsp
+nvidia/ga106/sec2/image.bin
+nvidia/ga106/sec2/sig.bin
+nvidia/ga106/sec2/desc.bin
+nvidia/ga106/sec2/hs_bl_sig.bin
+nvidia/ga106/nvdec/scrubber.bin
+nvidia/ga106/acr/ucode_ahesasc.bin
+nvidia/ga106/acr/ucode_asb.bin
+nvidia/ga106/acr/ucode_unload.bin
+nvidia/gp107/gr/gpccs_inst.bin
+nvidia/gp107/gr/sw_nonctx.bin
+nvidia/gp107/gr/fecs_inst.bin
+nvidia/gp107/gr/fecs_data.bin
+nvidia/gp107/gr/gpccs_bl.bin
+nvidia/gp107/gr/gpccs_data.bin
+nvidia/gp107/gr/sw_method_init.bin
+nvidia/gp107/gr/sw_ctx.bin
+nvidia/gp107/gr/fecs_sig.bin
+nvidia/gp107/gr/sw_bundle_init.bin
+nvidia/gp107/gr/fecs_bl.bin
+nvidia/gp107/gr/gpccs_sig.bin
+nvidia/gp107/sec2/image.bin
+nvidia/gp107/sec2/sig.bin
+nvidia/gp107/sec2/sig-1.bin
+nvidia/gp107/sec2/desc.bin
+nvidia/gp107/sec2/image-1.bin
+nvidia/gp107/sec2/desc-1.bin
+nvidia/gp107/nvdec/scrubber.bin
+nvidia/gp107/acr/unload_bl.bin
+nvidia/gp107/acr/bl.bin
+nvidia/gp107/acr/ucode_load.bin
+nvidia/gp107/acr/ucode_unload.bin
+nvidia/tegra186/xusb.bin
+nvidia/tegra186/vic04_ucode.bin
+nvidia/tegra186/vic.bin
+nvidia/ga100/gsp/bootloader-535.113.01.bin
+nvidia/ga100/gsp/booter_load-535.113.01.bin
+nvidia/ga100/gsp/gsp-535.113.01.bin
+nvidia/ga100/gsp/booter_unload-535.113.01.bin
+nvidia/gp108/gr/gpccs_inst.bin
+nvidia/gp108/gr/sw_nonctx.bin
+nvidia/gp108/gr/fecs_inst.bin
+nvidia/gp108/gr/fecs_data.bin
+nvidia/gp108/gr/gpccs_bl.bin
+nvidia/gp108/gr/gpccs_data.bin
+nvidia/gp108/gr/sw_method_init.bin
+nvidia/gp108/gr/sw_ctx.bin
+nvidia/gp108/gr/fecs_sig.bin
+nvidia/gp108/gr/sw_bundle_init.bin
+nvidia/gp108/gr/fecs_bl.bin
+nvidia/gp108/gr/gpccs_sig.bin
+nvidia/gp108/sec2/image.bin
+nvidia/gp108/sec2/sig.bin
+nvidia/gp108/sec2/desc.bin
+nvidia/gp108/nvdec/scrubber.bin
+nvidia/gp108/acr/unload_bl.bin
+nvidia/gp108/acr/bl.bin
+nvidia/gp108/acr/ucode_load.bin
+nvidia/gp108/acr/ucode_unload.bin
+nvidia/ad106/gsp
+nvidia/ad104/gsp
+nvidia/ga103/gr/NET_img.bin
+nvidia/ga103/gr/gpccs_bl.bin
+nvidia/ga103/gr/fecs_sig.bin
+nvidia/ga103/gr/fecs_bl.bin
+nvidia/ga103/gr/gpccs_sig.bin
+nvidia/ga103/gsp
+nvidia/ga103/sec2/image.bin
+nvidia/ga103/sec2/sig.bin
+nvidia/ga103/sec2/desc.bin
+nvidia/ga103/sec2/hs_bl_sig.bin
+nvidia/ga103/nvdec/scrubber.bin
+nvidia/ga103/acr/ucode_ahesasc.bin
+nvidia/ga103/acr/ucode_asb.bin
+nvidia/ga103/acr/ucode_unload.bin
+nvidia/gk20a/gpccs_inst.bin
+nvidia/gk20a/sw_nonctx.bin
+nvidia/gk20a/fecs_inst.bin
+nvidia/gk20a/fecs_data.bin
+nvidia/gk20a/gpccs_data.bin
+nvidia/gk20a/sw_method_init.bin
+nvidia/gk20a/sw_ctx.bin
+nvidia/gk20a/sw_bundle_init.bin
+nvidia/ga107/gr/NET_img.bin
+nvidia/ga107/gr/gpccs_bl.bin
+nvidia/ga107/gr/fecs_sig.bin
+nvidia/ga107/gr/fecs_bl.bin
+nvidia/ga107/gr/gpccs_sig.bin
+nvidia/ga107/gsp
+nvidia/ga107/sec2/image.bin
+nvidia/ga107/sec2/sig.bin
+nvidia/ga107/sec2/desc.bin
+nvidia/ga107/sec2/hs_bl_sig.bin
+nvidia/ga107/nvdec/scrubber.bin
+nvidia/ga107/acr/ucode_ahesasc.bin
+nvidia/ga107/acr/ucode_asb.bin
+nvidia/ga107/acr/ucode_unload.bin
+nvidia/tu116/gr/gpccs_inst.bin
+nvidia/tu116/gr/sw_nonctx.bin
+nvidia/tu116/gr/fecs_inst.bin
+nvidia/tu116/gr/fecs_data.bin
+nvidia/tu116/gr/gpccs_bl.bin
+nvidia/tu116/gr/gpccs_data.bin
+nvidia/tu116/gr/sw_veid_bundle_init.bin
+nvidia/tu116/gr/sw_method_init.bin
+nvidia/tu116/gr/sw_ctx.bin
+nvidia/tu116/gr/fecs_sig.bin
+nvidia/tu116/gr/sw_bundle_init.bin
+nvidia/tu116/gr/fecs_bl.bin
+nvidia/tu116/gr/gpccs_sig.bin
+nvidia/tu116/gsp/bootloader-535.113.01.bin
+nvidia/tu116/gsp/booter_load-535.113.01.bin
+nvidia/tu116/gsp/gsp-535.113.01.bin
+nvidia/tu116/gsp/booter_unload-535.113.01.bin
+nvidia/tu116/sec2/image.bin
+nvidia/tu116/sec2/sig.bin
+nvidia/tu116/sec2/desc.bin
+nvidia/tu116/nvdec/scrubber.bin
+nvidia/tu116/acr/unload_bl.bin
+nvidia/tu116/acr/ucode_ahesasc.bin
+nvidia/tu116/acr/bl.bin
+nvidia/tu116/acr/ucode_asb.bin
+nvidia/tu116/acr/ucode_unload.bin
+nvidia/tegra210/xusb.bin
+nvidia/tegra210/vic04_ucode.bin
+nvidia/tegra210/vic.bin
+nvidia/tu102/gr/gpccs_inst.bin
+nvidia/tu102/gr/sw_nonctx.bin
+nvidia/tu102/gr/fecs_inst.bin
+nvidia/tu102/gr/fecs_data.bin
+nvidia/tu102/gr/gpccs_bl.bin
+nvidia/tu102/gr/gpccs_data.bin
+nvidia/tu102/gr/sw_veid_bundle_init.bin
+nvidia/tu102/gr/sw_method_init.bin
+nvidia/tu102/gr/sw_ctx.bin
+nvidia/tu102/gr/fecs_sig.bin
+nvidia/tu102/gr/sw_bundle_init.bin
+nvidia/tu102/gr/fecs_bl.bin
+nvidia/tu102/gr/gpccs_sig.bin
+nvidia/tu102/gsp/bootloader-535.113.01.bin
+nvidia/tu102/gsp/booter_load-535.113.01.bin
+nvidia/tu102/gsp/gsp-535.113.01.bin
+nvidia/tu102/gsp/booter_unload-535.113.01.bin
+nvidia/tu102/sec2/image.bin
+nvidia/tu102/sec2/sig.bin
+nvidia/tu102/sec2/desc.bin
+nvidia/tu102/nvdec/scrubber.bin
+nvidia/tu102/acr/unload_bl.bin
+nvidia/tu102/acr/ucode_ahesasc.bin
+nvidia/tu102/acr/bl.bin
+nvidia/tu102/acr/ucode_asb.bin
+nvidia/tu102/acr/ucode_unload.bin
+nvidia/gp100/gr/gpccs_inst.bin
+nvidia/gp100/gr/sw_nonctx.bin
+nvidia/gp100/gr/fecs_inst.bin
+nvidia/gp100/gr/fecs_data.bin
+nvidia/gp100/gr/gpccs_bl.bin
+nvidia/gp100/gr/gpccs_data.bin
+nvidia/gp100/gr/sw_method_init.bin
+nvidia/gp100/gr/sw_ctx.bin
+nvidia/gp100/gr/fecs_sig.bin
+nvidia/gp100/gr/sw_bundle_init.bin
+nvidia/gp100/gr/fecs_bl.bin
+nvidia/gp100/gr/gpccs_sig.bin
+nvidia/gp100/acr/bl.bin
+nvidia/gp100/acr/ucode_load.bin
+nvidia/gp100/acr/ucode_unload.bin
+nvidia/gp102/gr/gpccs_inst.bin
+nvidia/gp102/gr/sw_nonctx.bin
+nvidia/gp102/gr/fecs_inst.bin
+nvidia/gp102/gr/fecs_data.bin
+nvidia/gp102/gr/gpccs_bl.bin
+nvidia/gp102/gr/gpccs_data.bin
+nvidia/gp102/gr/sw_method_init.bin
+nvidia/gp102/gr/sw_ctx.bin
+nvidia/gp102/gr/fecs_sig.bin
+nvidia/gp102/gr/sw_bundle_init.bin
+nvidia/gp102/gr/fecs_bl.bin
+nvidia/gp102/gr/gpccs_sig.bin
+nvidia/gp102/sec2/image.bin
+nvidia/gp102/sec2/sig.bin
+nvidia/gp102/sec2/sig-1.bin
+nvidia/gp102/sec2/desc.bin
+nvidia/gp102/sec2/image-1.bin
+nvidia/gp102/sec2/desc-1.bin
+nvidia/gp102/nvdec/scrubber.bin
+nvidia/gp102/acr/unload_bl.bin
+nvidia/gp102/acr/bl.bin
+nvidia/gp102/acr/ucode_load.bin
+nvidia/gp102/acr/ucode_unload.bin
+nvidia/ad102/gsp/bootloader-535.113.01.bin
+nvidia/ad102/gsp/booter_load-535.113.01.bin
+nvidia/ad102/gsp/gsp-535.113.01.bin
+nvidia/ad102/gsp/booter_unload-535.113.01.bin
+nvidia/ad103/gsp
+nvidia/ga102/gr/NET_img.bin
+nvidia/ga102/gr/gpccs_bl.bin
+nvidia/ga102/gr/fecs_sig.bin
+nvidia/ga102/gr/fecs_bl.bin
+nvidia/ga102/gr/gpccs_sig.bin
+nvidia/ga102/gsp/bootloader-535.113.01.bin
+nvidia/ga102/gsp/booter_load-535.113.01.bin
+nvidia/ga102/gsp/gsp-535.113.01.bin
+nvidia/ga102/gsp/booter_unload-535.113.01.bin
+nvidia/ga102/sec2/image.bin
+nvidia/ga102/sec2/sig.bin
+nvidia/ga102/sec2/desc.bin
+nvidia/ga102/sec2/hs_bl_sig.bin
+nvidia/ga102/nvdec/scrubber.bin
+nvidia/ga102/acr/ucode_ahesasc.bin
+nvidia/ga102/acr/ucode_asb.bin
+nvidia/ga102/acr/ucode_unload.bin
+nvidia/ga104/gr/NET_img.bin
+nvidia/ga104/gr/gpccs_bl.bin
+nvidia/ga104/gr/fecs_sig.bin
+nvidia/ga104/gr/fecs_bl.bin
+nvidia/ga104/gr/gpccs_sig.bin
+nvidia/ga104/gsp
+nvidia/ga104/sec2/image.bin
+nvidia/ga104/sec2/sig.bin
+nvidia/ga104/sec2/desc.bin
+nvidia/ga104/sec2/hs_bl_sig.bin
+nvidia/ga104/nvdec/scrubber.bin
+nvidia/ga104/acr/ucode_ahesasc.bin
+nvidia/ga104/acr/ucode_asb.bin
+nvidia/ga104/acr/ucode_unload.bin
+nvidia/gp10b/gr/gpccs_inst.bin
+nvidia/gp10b/gr/sw_nonctx.bin
+nvidia/gp10b/gr/fecs_inst.bin
+nvidia/gp10b/gr/fecs_data.bin
+nvidia/gp10b/gr/gpccs_bl.bin
+nvidia/gp10b/gr/gpccs_data.bin
+nvidia/gp10b/gr/sw_method_init.bin
+nvidia/gp10b/gr/sw_ctx.bin
+nvidia/gp10b/gr/fecs_sig.bin
+nvidia/gp10b/gr/sw_bundle_init.bin
+nvidia/gp10b/gr/fecs_bl.bin
+nvidia/gp10b/gr/gpccs_sig.bin
+nvidia/gp10b/pmu/image.bin
+nvidia/gp10b/pmu/sig.bin
+nvidia/gp10b/pmu/desc.bin
+nvidia/gp10b/acr/bl.bin
+nvidia/gp10b/acr/ucode_load.bin
+nvidia/tu117/gr/gpccs_inst.bin
+nvidia/tu117/gr/sw_nonctx.bin
+nvidia/tu117/gr/fecs_inst.bin
+nvidia/tu117/gr/fecs_data.bin
+nvidia/tu117/gr/gpccs_bl.bin
+nvidia/tu117/gr/gpccs_data.bin
+nvidia/tu117/gr/sw_veid_bundle_init.bin
+nvidia/tu117/gr/sw_method_init.bin
+nvidia/tu117/gr/sw_ctx.bin
+nvidia/tu117/gr/fecs_sig.bin
+nvidia/tu117/gr/sw_bundle_init.bin
+nvidia/tu117/gr/fecs_bl.bin
+nvidia/tu117/gr/gpccs_sig.bin
+nvidia/tu117/gsp
+nvidia/tu117/sec2/image.bin
+nvidia/tu117/sec2/sig.bin
+nvidia/tu117/sec2/desc.bin
+nvidia/tu117/nvdec/scrubber.bin
+nvidia/tu117/acr/unload_bl.bin
+nvidia/tu117/acr/ucode_ahesasc.bin
+nvidia/tu117/acr/bl.bin
+nvidia/tu117/acr/ucode_asb.bin
+nvidia/tu117/acr/ucode_unload.bin
+nvidia/gm20b/gr/gpccs_inst.bin
+nvidia/gm20b/gr/sw_nonctx.bin
+nvidia/gm20b/gr/fecs_inst.bin
+nvidia/gm20b/gr/fecs_data.bin
+nvidia/gm20b/gr/gpccs_data.bin
+nvidia/gm20b/gr/sw_method_init.bin
+nvidia/gm20b/gr/sw_ctx.bin
+nvidia/gm20b/gr/fecs_sig.bin
+nvidia/gm20b/gr/sw_bundle_init.bin
+nvidia/gm20b/gr/fecs_bl.bin
+nvidia/gm20b/pmu/image.bin
+nvidia/gm20b/pmu/sig.bin
+nvidia/gm20b/pmu/desc.bin
+nvidia/gm20b/acr/bl.bin
+nvidia/gm20b/acr/ucode_load.bin
+nvidia/gv100/gr/gpccs_inst.bin
+nvidia/gv100/gr/sw_nonctx.bin
+nvidia/gv100/gr/fecs_inst.bin
+nvidia/gv100/gr/fecs_data.bin
+nvidia/gv100/gr/gpccs_bl.bin
+nvidia/gv100/gr/gpccs_data.bin
+nvidia/gv100/gr/sw_method_init.bin
+nvidia/gv100/gr/sw_ctx.bin
+nvidia/gv100/gr/fecs_sig.bin
+nvidia/gv100/gr/sw_bundle_init.bin
+nvidia/gv100/gr/fecs_bl.bin
+nvidia/gv100/gr/gpccs_sig.bin
+nvidia/gv100/sec2/image.bin
+nvidia/gv100/sec2/sig.bin
+nvidia/gv100/sec2/desc.bin
+nvidia/gv100/nvdec/scrubber.bin
+nvidia/gv100/acr/unload_bl.bin
+nvidia/gv100/acr/bl.bin
+nvidia/gv100/acr/ucode_load.bin
+nvidia/gv100/acr/ucode_unload.bin
+nvidia/tu104/gr/gpccs_inst.bin
+nvidia/tu104/gr/sw_nonctx.bin
+nvidia/tu104/gr/fecs_inst.bin
+nvidia/tu104/gr/fecs_data.bin
+nvidia/tu104/gr/gpccs_bl.bin
+nvidia/tu104/gr/gpccs_data.bin
+nvidia/tu104/gr/sw_veid_bundle_init.bin
+nvidia/tu104/gr/sw_method_init.bin
+nvidia/tu104/gr/sw_ctx.bin
+nvidia/tu104/gr/fecs_sig.bin
+nvidia/tu104/gr/sw_bundle_init.bin
+nvidia/tu104/gr/fecs_bl.bin
+nvidia/tu104/gr/gpccs_sig.bin
+nvidia/tu104/gsp
+nvidia/tu104/sec2/image.bin
+nvidia/tu104/sec2/sig.bin
+nvidia/tu104/sec2/desc.bin
+nvidia/tu104/nvdec/scrubber.bin
+nvidia/tu104/acr/unload_bl.bin
+nvidia/tu104/acr/ucode_ahesasc.bin
+nvidia/tu104/acr/bl.bin
+nvidia/tu104/acr/ucode_asb.bin
+nvidia/tu104/acr/ucode_unload.bin
+nvidia/tegra124/xusb.bin
+nvidia/tegra124/vic03_ucode.bin
+nvidia/tegra124/vic.bin
+nvidia/tu106/gr/gpccs_inst.bin
+nvidia/tu106/gr/sw_nonctx.bin
+nvidia/tu106/gr/fecs_inst.bin
+nvidia/tu106/gr/fecs_data.bin
+nvidia/tu106/gr/gpccs_bl.bin
+nvidia/tu106/gr/gpccs_data.bin
+nvidia/tu106/gr/sw_veid_bundle_init.bin
+nvidia/tu106/gr/sw_method_init.bin
+nvidia/tu106/gr/sw_ctx.bin
+nvidia/tu106/gr/fecs_sig.bin
+nvidia/tu106/gr/sw_bundle_init.bin
+nvidia/tu106/gr/fecs_bl.bin
+nvidia/tu106/gr/gpccs_sig.bin
+nvidia/tu106/gsp
+nvidia/tu106/sec2/image.bin
+nvidia/tu106/sec2/sig.bin
+nvidia/tu106/sec2/desc.bin
+nvidia/tu106/nvdec/scrubber.bin
+nvidia/tu106/acr/unload_bl.bin
+nvidia/tu106/acr/ucode_ahesasc.bin
+nvidia/tu106/acr/bl.bin
+nvidia/tu106/acr/ucode_asb.bin
+nvidia/tu106/acr/ucode_unload.bin
+nvidia/gp106/gr/gpccs_inst.bin
+nvidia/gp106/gr/sw_nonctx.bin
+nvidia/gp106/gr/fecs_inst.bin
+nvidia/gp106/gr/fecs_data.bin
+nvidia/gp106/gr/gpccs_bl.bin
+nvidia/gp106/gr/gpccs_data.bin
+nvidia/gp106/gr/sw_method_init.bin
+nvidia/gp106/gr/sw_ctx.bin
+nvidia/gp106/gr/fecs_sig.bin
+nvidia/gp106/gr/sw_bundle_init.bin
+nvidia/gp106/gr/fecs_bl.bin
+nvidia/gp106/gr/gpccs_sig.bin
+nvidia/gp106/sec2/image.bin
+nvidia/gp106/sec2/sig.bin
+nvidia/gp106/sec2/sig-1.bin
+nvidia/gp106/sec2/desc.bin
+nvidia/gp106/sec2/image-1.bin
+nvidia/gp106/sec2/desc-1.bin
+nvidia/gp106/nvdec/scrubber.bin
+nvidia/gp106/acr/unload_bl.bin
+nvidia/gp106/acr/bl.bin
+nvidia/gp106/acr/ucode_load.bin
+nvidia/gp106/acr/ucode_unload.bin
+nvidia/ad107/gsp
+nvidia/gm200/gr/gpccs_inst.bin
+nvidia/gm200/gr/sw_nonctx.bin
+nvidia/gm200/gr/fecs_inst.bin
+nvidia/gm200/gr/fecs_data.bin
+nvidia/gm200/gr/gpccs_bl.bin
+nvidia/gm200/gr/gpccs_data.bin
+nvidia/gm200/gr/sw_method_init.bin
+nvidia/gm200/gr/sw_ctx.bin
+nvidia/gm200/gr/fecs_sig.bin
+nvidia/gm200/gr/sw_bundle_init.bin
+nvidia/gm200/gr/fecs_bl.bin
+nvidia/gm200/gr/gpccs_sig.bin
+nvidia/gm200/acr/bl.bin
+nvidia/gm200/acr/ucode_load.bin
+nvidia/gm200/acr/ucode_unload.bin
+nvidia/gp104/gr/gpccs_inst.bin
+nvidia/gp104/gr/sw_nonctx.bin
+nvidia/gp104/gr/fecs_inst.bin
+nvidia/gp104/gr/fecs_data.bin
+nvidia/gp104/gr/gpccs_bl.bin
+nvidia/gp104/gr/gpccs_data.bin
+nvidia/gp104/gr/sw_method_init.bin
+nvidia/gp104/gr/sw_ctx.bin
+nvidia/gp104/gr/fecs_sig.bin
+nvidia/gp104/gr/sw_bundle_init.bin
+nvidia/gp104/gr/fecs_bl.bin
+nvidia/gp104/gr/gpccs_sig.bin
+nvidia/gp104/sec2/image.bin
+nvidia/gp104/sec2/sig.bin
+nvidia/gp104/sec2/sig-1.bin
+nvidia/gp104/sec2/desc.bin
+nvidia/gp104/sec2/image-1.bin
+nvidia/gp104/sec2/desc-1.bin
+nvidia/gp104/nvdec/scrubber.bin
+nvidia/gp104/acr/unload_bl.bin
+nvidia/gp104/acr/bl.bin
+nvidia/gp104/acr/ucode_load.bin
+nvidia/gp104/acr/ucode_unload.bin
+nvidia/gm204/gr/gpccs_inst.bin
+nvidia/gm204/gr/sw_nonctx.bin
+nvidia/gm204/gr/fecs_inst.bin
+nvidia/gm204/gr/fecs_data.bin
+nvidia/gm204/gr/gpccs_bl.bin
+nvidia/gm204/gr/gpccs_data.bin
+nvidia/gm204/gr/sw_method_init.bin
+nvidia/gm204/gr/sw_ctx.bin
+nvidia/gm204/gr/fecs_sig.bin
+nvidia/gm204/gr/sw_bundle_init.bin
+nvidia/gm204/gr/fecs_bl.bin
+nvidia/gm204/gr/gpccs_sig.bin
+nvidia/gm204/acr/bl.bin
+nvidia/gm204/acr/ucode_load.bin
+nvidia/gm204/acr/ucode_unload.bin
+nvidia/tu10x/typec/ccg_secondary.cyacd
+nvidia/tu10x/typec/ccg_boot.cyacd
+nvidia/tu10x/typec/ccg_primary.cyacd
+nvidia/tegra194/xusb.bin
+nvidia/tegra194/vic.bin
+nvidia/gm206/gr/gpccs_inst.bin
+nvidia/gm206/gr/sw_nonctx.bin
+nvidia/gm206/gr/fecs_inst.bin
+nvidia/gm206/gr/fecs_data.bin
+nvidia/gm206/gr/gpccs_bl.bin
+nvidia/gm206/gr/gpccs_data.bin
+nvidia/gm206/gr/sw_method_init.bin
+nvidia/gm206/gr/sw_ctx.bin
+nvidia/gm206/gr/fecs_sig.bin
+nvidia/gm206/gr/sw_bundle_init.bin
+nvidia/gm206/gr/fecs_bl.bin
+nvidia/gm206/gr/gpccs_sig.bin
+nvidia/gm206/acr/bl.bin
+nvidia/gm206/acr/ucode_load.bin
+nvidia/gm206/acr/ucode_unload.bin
+nxp/helper_uart_3000000.bin
+nxp/uartiw416_bt_v0.bin
+nxp/uartuart9098_bt_v1.bin
+nxp/sr150_fw.bin
+nxp/uartuart8987_bt.bin
+nxp/uartuart8997_bt_v4.bin
+nxp/uartspi_n61x_v1.bin.se
+ositech/Xilinx7OD.bin
+phanfw.bin
+powervr/rogue_33.15.11.3_v1.fw
+qat_402xx.bin
+qat_402xx_mmp.bin
+qat_4xxx.bin
+qat_4xxx_mmp.bin
+qat_895xcc.bin
+qat_895xcc_mmp.bin
+qat_c3xxx.bin
+qat_c3xxx_mmp.bin
+qat_c62x.bin
+qat_c62x_mmp.bin
+qat_mmp.bin
+qca/htbtfw20.tlv
+qca/crbtfw21.tlv
+qca/hmtbtfw20.tlv
+qca/nvm_00130300.bin
+qca/nvm_usb_00130201.bin
+qca/apbtfw11.tlv
+qca/hpnv21.ba0
+qca/nvm_usb_00190200_0112.bin
+qca/hpnv21.b9f
+qca/rampatch_usb_00000302.bin
+qca/hpnv21.302
+qca/nvm_usb_00130200_0110.bin
+qca/rampatch_usb_00000200.bin
+qca/hpnv21g.ba3
+qca/nvm_usb_00130201_010a.bin
+qca/msnv11.b0a
+qca/hpnv21.bb8
+qca/apnv10.bin
+qca/hmtnv20.b10f
+qca/nvm_usb_00130200_0107.bin
+qca/nvm_00440302_eu.bin
+qca/nvm_usb_00130200_0109.bin
+qca/hpnv21.301
+qca/nvm_usb_00130200_0106.bin
+qca/hpnv21g.301
+qca/rampatch_usb_00000201.bin
+qca/hpnv21g.302
+qca/hpnv21.b10c
+qca/rampatch_00130300.bin
+qca/nvm_usb_00130201_gf_010b.bin
+qca/hpnv21.ba2
+qca/nvm_usb_00130201_gf.bin
+qca/hpnv21g.b111
+qca/htnv20.bin
+qca/nvm_usb_00130201_gf_0303.bin
+qca/rampatch_00130302.bin
+qca/hpnv21.ba1
+qca/rampatch_usb_00130201.bin
+qca/hpnv21g.b8c
+qca/nvm_usb_00000302_eu.bin
+qca/apnv11.bin
+qca/hpnv21g.b10c
+qca/nvm_usb_00130201_gf_010a.bin
+qca/rampatch_usb_00000300.bin
+qca/nvm_usb_00190200_010e.bin
+qca/nvm_usb_00000300.bin
+qca/hpnv21.ba4
+qca/crnv21.bin
+qca/crbtfw32.tlv
+qca/rampatch_usb_00130200.bin
+qca/rampatch_00230302.bin
+qca/msbtfw11.tlv
+qca/hpnv21.b8c
+qca/hpnv21.309
+qca/nvm_usb_00130200_0105.bin
+qca/hpnv21g.309
+qca/nvm_usb_00000200.bin
+qca/hpnv21g.b9f
+qca/nvm_usb_00000201.bin
+qca/hpnv21g.ba0
+qca/hpnv21.baa
+qca/hpnv21g.ba2
+qca/hpnv21g.baa
+qca/crnv32.bin
+qca/nvm_usb_00190200.bin
+qca/hmtnv20.bin
+qca/hpnv21.b111
+qca/nvm_00230302.bin
+qca/nvm_00440302.bin
+qca/hpnv21.ba3
+qca/hpbtfw21.tlv
+qca/hpnv21g.bb8
+qca/hpnv21g.ba1
+qca/apbtfw10.tlv
+qca/nvm_00440302_i2s_eu.bin
+qca/nvm_00130302.bin
+qca/rampatch_00440302.bin
+qca/nvm_usb_00130200_0104.bin
+qca/rampatch_usb_00190200.bin
+qca/nvm_usb_00130201_0303.bin
+qca/nvm_usb_00000302.bin
+qca/msnv11.b09
+qca/nvm_usb_00130201_010b.bin
+qca/msnv11.bin
+qca/hpnv21g.ba4
+qca/msbtfw11.mbn
+qca/hpnv21.bin
+qca/nvm_usb_00130200.bin
+qca/crnv32u.bin
+qca/hmtnv20.b112
+qca/hpnv21g.bin
+qcom/a420_pm4.fw
+qcom/vpu/vpu30_p4_s6.mbn
+qcom/vpu/vpu30_p4.mbn
+qcom/vpu/vpu20_p1.mbn
+qcom/vpu/vpu20_p4.mbn
+qcom/a663_gmu.bin
+qcom/sm8550/SM8550-HDK-tplg.bin
+qcom/sm8550/SM8550-QRD-tplg.bin
+qcom/a650_sqe.fw
+qcom/sdm845/adspua.jsn
+qcom/sdm845/Thundercomm/db845c/slpi.mbn
+qcom/sdm845/Thundercomm/db845c/slpir.jsn
+qcom/sdm845/Thundercomm/db845c/slpius.jsn
+qcom/sdm845/mba.mbn
+qcom/sdm845/modem.mbn
+qcom/sdm845/cdsp.mbn
+qcom/sdm845/modemuw.jsn
+qcom/sdm845/modem_nm.mbn
+qcom/sdm845/a630_zap.mbn
+qcom/sdm845/adsp.mbn
+qcom/sdm845/wlanmdsp.mbn
+qcom/sdm845/cdspr.jsn
+qcom/sdm845/adspr.jsn
+qcom/gen70500_sqe.fw
+qcom/sm8650/SM8650-MTP-tplg.bin
+qcom/sm8650/SM8650-QRD-tplg.bin
+qcom/aic100/fw9.bin
+qcom/aic100/fw5.bin
+qcom/aic100/sbl.bin
+qcom/aic100/fw1.bin
+qcom/aic100/fw10.bin
+qcom/aic100/fw2.bin
+qcom/a650_gmu.bin
+qcom/sm8250/adspua.jsn
+qcom/sm8250/Thundercomm/RB5/slpi.mbn
+qcom/sm8250/Thundercomm/RB5/slpir.jsn
+qcom/sm8250/Thundercomm/RB5/slpius.jsn
+qcom/sm8250/cdsp.mbn
+qcom/sm8250/a650_zap.mbn
+qcom/sm8250/adsp.mbn
+qcom/sm8250/cdspr.jsn
+qcom/sm8250/adspr.jsn
+qcom/yamato_pfp.fw
+qcom/a530_pm4.fw
+qcom/venus-5.4/venus.mbn
+qcom/venus-5.4/venus.mdt
+qcom/a530_pfp.fw
+qcom/apq8096/adspua.jsn
+qcom/apq8096/mba.mbn
+qcom/apq8096/modem.mbn
+qcom/apq8096/modemr.jsn
+qcom/apq8096/adsp.mbn
+qcom/apq8096/a530_zap.mbn
+qcom/apq8096/adspr.jsn
+qcom/a300_pm4.fw
+qcom/a702_sqe.fw
+qcom/a330_pfp.fw
+qcom/a660_sqe.fw
+qcom/venus-6.0/venus.mbn
+qcom/a630_sqe.fw
+qcom/qcs6490/adspua.jsn
+qcom/qcs6490/cdsp.mbn
+qcom/qcs6490/adsps.jsn
+qcom/qcs6490/battmgr.jsn
+qcom/qcs6490/a660_zap.mbn
+qcom/qcs6490/adsp.mbn
+qcom/qcs6490/cdspr.jsn
+qcom/qcs6490/adspr.jsn
+qcom/qcm6490/adspua.jsn
+qcom/qcm6490/cdsp.mbn
+qcom/qcm6490/adsps.jsn
+qcom/qcm6490/battmgr.jsn
+qcom/qcm6490/a660_zap.mbn
+qcom/qcm6490/adsp.mbn
+qcom/qcm6490/ipa_fws.mbn
+qcom/qcm6490/cdspr.jsn
+qcom/qcm6490/adspr.jsn
+qcom/a530v3_gpmu.fw2
+qcom/yamato_pm4.fw
+qcom/x1e80100/adspua.jsn
+qcom/x1e80100/adsps.jsn
+qcom/x1e80100/battmgr.jsn
+qcom/x1e80100/adsp_dtb.mbn
+qcom/x1e80100/adsp.mbn
+qcom/x1e80100/gen70500_zap.mbn
+qcom/x1e80100/adspr.jsn
+qcom/qcs615/a612_zap.mbn
+qcom/venus-4.2/venus.mbn
+qcom/venus-4.2/venus.mdt
+qcom/qdu100/xbl_s.melf
+qcom/leia_pfp_470.fw
+qcom/a330_pm4.fw
+qcom/apq8016/mba.mbn
+qcom/apq8016/modem.mbn
+qcom/apq8016/wcnss.mbn
+qcom/apq8016/WCNSS_qcom_wlan_nv_sbc.bin
+qcom/a530_zap.mdt
+qcom/sa8775p/a663_zap.mbn
+qcom/vpu-1.0/venus.mbn
+qcom/vpu-1.0/venus.mdt
+qcom/qrb4210/adspua.jsn
+qcom/qrb4210/modem.mbn
+qcom/qrb4210/cdsp.mbn
+qcom/qrb4210/modemuw.jsn
+qcom/qrb4210/modemr.jsn
+qcom/qrb4210/adsps.jsn
+qcom/qrb4210/a610_zap.mbn
+qcom/qrb4210/adsp.mbn
+qcom/qrb4210/wlanmdsp.mbn
+qcom/qrb4210/cdspr.jsn
+qcom/qrb4210/adspr.jsn
+qcom/venus-5.2/venus.mbn
+qcom/venus-5.2/venus.mdt
+qcom/vpu-2.0/venus.mbn
+qcom/a630_gmu.bin
+qcom/qcm2290/adspua.jsn
+qcom/qcm2290/modem.mbn
+qcom/qcm2290/modemuw.jsn
+qcom/qcm2290/modemr.jsn
+qcom/qcm2290/adsps.jsn
+qcom/qcm2290/a702_zap.mbn
+qcom/qcm2290/adsp.mbn
+qcom/qcm2290/wlanmdsp.mbn
+qcom/qcm2290/adspr.jsn
+qcom/sc8280xp/SC8280XP-LENOVO-X13S-tplg.bin
+qcom/sc8280xp/LENOVO/21BX/adspua.jsn
+qcom/sc8280xp/LENOVO/21BX/qcdxkmsuc8280.mbn
+qcom/sc8280xp/LENOVO/21BX/qcadsp8280.mbn
+qcom/sc8280xp/LENOVO/21BX/qcslpi8280.mbn
+qcom/sc8280xp/LENOVO/21BX/battmgr.jsn
+qcom/sc8280xp/LENOVO/21BX/qccdsp8280.mbn
+qcom/sc8280xp/LENOVO/21BX/cdspr.jsn
+qcom/sc8280xp/LENOVO/21BX/audioreach-tplg.bin
+qcom/sc8280xp/LENOVO/21BX/adspr.jsn
+qcom/a420_pfp.fw
+qcom/gen70500_gmu.bin
+qcom/venus-1.8/venus.mbn
+qcom/venus-1.8/venus.mdt
+qcom/a660_gmu.bin
+qcom/a300_pfp.fw
+qcom/leia_pm4_470.fw
+qed/qed_init_values_zipped-8.59.1.0.bin
+qed/qed_init_values_zipped-8.4.2.0.bin
+qed/qed_init_values_zipped-8.20.0.0.bin
+qed/qed_init_values-8.33.12.0.bin
+qed/qed_init_values_zipped-8.15.3.0.bin
+qed/qed_init_values_zipped-8.37.2.0.bin
+qed/qed_init_values-8.20.0.0.bin
+qed/qed_init_values_zipped-8.10.5.0.bin
+qed/qed_init_values_zipped-8.33.11.0.bin
+qed/qed_init_values-8.18.9.0.bin
+qed/qed_init_values_zipped-8.37.7.0.bin
+qed/qed_init_values-8.40.33.0.bin
+qed/qed_init_values-8.14.6.0.bin
+qed/qed_init_values_zipped-8.42.2.0.bin
+qed/qed_init_values-8.37.7.0.bin
+qed/qed_init_values-8.30.12.0.bin
+qed/qed_init_values_zipped-8.10.10.0.bin
+qed/qed_init_values_zipped-8.7.3.0.bin
+qed/qed_init_values_zipped-8.33.1.0.bin
+qed/qed_init_values-8.10.9.0.bin
+ql2100_fw.bin
+ql2200_fw.bin
+ql2300_fw.bin
+ql2322_fw.bin
+ql2400_fw.bin
+ql2500_fw.bin
+qlogic/isp1000.bin
+qlogic/sd7220.fw
+qlogic/1280.bin
+qlogic/12160.bin
+qlogic/1040.bin
+r128/r128_cce.bin
+r8a779x_usb3_v1.dlmem
+r8a779x_usb3_v2.dlmem
+r8a779x_usb3_v3.dlmem
+radeon/KABINI_rlc.bin
+radeon/pitcairn_ce.bin
+radeon/KABINI_pfp.bin
+radeon/MULLINS_mec.bin
+radeon/kabini_pfp.bin
+radeon/PITCAIRN_mc2.bin
+radeon/BARTS_me.bin
+radeon/OLAND_rlc.bin
+radeon/R520_cp.bin
+radeon/R200_cp.bin
+radeon/R420_cp.bin
+radeon/kaveri_rlc.bin
+radeon/si58_mc.bin
+radeon/RV620_pfp.bin
+radeon/hawaii_me.bin
+radeon/RV635_pfp.bin
+radeon/hawaii_vce.bin
+radeon/RV630_pfp.bin
+radeon/CEDAR_rlc.bin
+radeon/RV730_pfp.bin
+radeon/HAWAII_mec.bin
+radeon/HAINAN_rlc.bin
+radeon/BONAIRE_rlc.bin
+radeon/MULLINS_pfp.bin
+radeon/CEDAR_pfp.bin
+radeon/PITCAIRN_mc.bin
+radeon/SUMO_rlc.bin
+radeon/TAHITI_smc.bin
+radeon/PALM_pfp.bin
+radeon/BONAIRE_pfp.bin
+radeon/kabini_me.bin
+radeon/HAWAII_smc.bin
+radeon/tahiti_smc.bin
+radeon/CAICOS_me.bin
+radeon/kaveri_me.bin
+radeon/R600_uvd.bin
+radeon/mullins_sdma1.bin
+radeon/REDWOOD_rlc.bin
+radeon/CAYMAN_rlc.bin
+radeon/TURKS_me.bin
+radeon/HAINAN_ce.bin
+radeon/HAINAN_pfp.bin
+radeon/KAVERI_ce.bin
+radeon/kabini_mec.bin
+radeon/RV730_me.bin
+radeon/bonaire_me.bin
+radeon/JUNIPER_smc.bin
+radeon/RV630_me.bin
+radeon/mullins_mec.bin
+radeon/CYPRESS_smc.bin
+radeon/VERDE_me.bin
+radeon/TURKS_pfp.bin
+radeon/BONAIRE_me.bin
+radeon/MULLINS_ce.bin
+radeon/CAICOS_smc.bin
+radeon/kabini_uvd.bin
+radeon/VERDE_ce.bin
+radeon/REDWOOD_me.bin
+radeon/RS600_cp.bin
+radeon/oland_k_smc.bin
+radeon/hawaii_pfp.bin
+radeon/tahiti_rlc.bin
+radeon/KAVERI_pfp.bin
+radeon/RV770_me.bin
+radeon/PALM_me.bin
+radeon/CYPRESS_uvd.bin
+radeon/RV770_smc.bin
+radeon/CAICOS_pfp.bin
+radeon/bonaire_k_smc.bin
+radeon/TAHITI_me.bin
+radeon/KAVERI_rlc.bin
+radeon/oland_rlc.bin
+radeon/MULLINS_me.bin
+radeon/banks_k_2_smc.bin
+radeon/kaveri_vce.bin
+radeon/R300_cp.bin
+radeon/ARUBA_pfp.bin
+radeon/hainan_k_smc.bin
+radeon/REDWOOD_smc.bin
+radeon/KAVERI_me.bin
+radeon/R600_me.bin
+radeon/R600_rlc.bin
+radeon/KABINI_me.bin
+radeon/pitcairn_me.bin
+radeon/RV740_smc.bin
+radeon/RV710_me.bin
+radeon/KAVERI_sdma.bin
+radeon/hawaii_rlc.bin
+radeon/HAWAII_rlc.bin
+radeon/mullins_rlc.bin
+radeon/hainan_smc.bin
+radeon/kaveri_mec.bin
+radeon/pitcairn_smc.bin
+radeon/RS780_uvd.bin
+radeon/bonaire_rlc.bin
+radeon/ARUBA_me.bin
+radeon/HAWAII_mc2.bin
+radeon/VERDE_pfp.bin
+radeon/kaveri_sdma1.bin
+radeon/TAHITI_pfp.bin
+radeon/HAINAN_mc2.bin
+radeon/MULLINS_rlc.bin
+radeon/CAYMAN_mc.bin
+radeon/HAWAII_mc.bin
+radeon/VERDE_smc.bin
+radeon/TAHITI_mc2.bin
+radeon/mullins_me.bin
+radeon/BONAIRE_ce.bin
+radeon/bonaire_pfp.bin
+radeon/kabini_rlc.bin
+radeon/tahiti_mc.bin
+radeon/VERDE_mc.bin
+radeon/REDWOOD_pfp.bin
+radeon/oland_me.bin
+radeon/PITCAIRN_pfp.bin
+radeon/kaveri_ce.bin
+radeon/CEDAR_me.bin
+radeon/mullins_uvd.bin
+radeon/verde_mc.bin
+radeon/OLAND_me.bin
+radeon/hawaii_mec.bin
+radeon/JUNIPER_rlc.bin
+radeon/HAWAII_sdma.bin
+radeon/hawaii_mc.bin
+radeon/RS780_pfp.bin
+radeon/verde_rlc.bin
+radeon/PITCAIRN_smc.bin
+radeon/JUNIPER_pfp.bin
+radeon/hawaii_smc.bin
+radeon/SUMO_me.bin
+radeon/ARUBA_rlc.bin
+radeon/TAHITI_mc.bin
+radeon/TURKS_mc.bin
+radeon/BARTS_mc.bin
+radeon/KABINI_ce.bin
+radeon/bonaire_uvd.bin
+radeon/verde_k_smc.bin
+radeon/kabini_ce.bin
+radeon/verde_ce.bin
+radeon/kabini_sdma1.bin
+radeon/HAWAII_me.bin
+radeon/kaveri_sdma.bin
+radeon/PITCAIRN_rlc.bin
+radeon/mullins_pfp.bin
+radeon/R600_pfp.bin
+radeon/HAINAN_mc.bin
+radeon/pitcairn_rlc.bin
+radeon/TAHITI_uvd.bin
+radeon/tahiti_me.bin
+radeon/tahiti_k_smc.bin
+radeon/RV710_smc.bin
+radeon/RV770_uvd.bin
+radeon/oland_mc.bin
+radeon/R100_cp.bin
+radeon/bonaire_smc.bin
+radeon/hainan_pfp.bin
+radeon/HAINAN_smc.bin
+radeon/SUMO_uvd.bin
+radeon/BONAIRE_vce.bin
+radeon/TAHITI_ce.bin
+radeon/KABINI_mec.bin
+radeon/hawaii_k_smc.bin
+radeon/kabini_vce.bin
+radeon/KABINI_sdma.bin
+radeon/SUMO_pfp.bin
+radeon/BTC_rlc.bin
+radeon/RV635_me.bin
+radeon/BONAIRE_smc.bin
+radeon/oland_ce.bin
+radeon/VERDE_rlc.bin
+radeon/BONAIRE_uvd.bin
+radeon/TAHITI_rlc.bin
+radeon/pitcairn_mc.bin
+radeon/kaveri_uvd.bin
+radeon/hawaii_sdma.bin
+radeon/tahiti_pfp.bin
+radeon/BONAIRE_mec.bin
+radeon/verde_smc.bin
+radeon/bonaire_vce.bin
+radeon/kabini_sdma.bin
+radeon/hainan_rlc.bin
+radeon/SUMO2_pfp.bin
+radeon/verde_pfp.bin
+radeon/bonaire_sdma1.bin
+radeon/bonaire_mec.bin
+radeon/mullins_ce.bin
+radeon/hawaii_ce.bin
+radeon/MULLINS_sdma.bin
+radeon/PITCAIRN_ce.bin
+radeon/BONAIRE_mc.bin
+radeon/RV730_smc.bin
+radeon/hainan_ce.bin
+radeon/verde_me.bin
+radeon/CYPRESS_pfp.bin
+radeon/KAVERI_mec.bin
+radeon/CEDAR_smc.bin
+radeon/hainan_me.bin
+radeon/oland_pfp.bin
+radeon/kaveri_mec2.bin
+radeon/bonaire_ce.bin
+radeon/HAINAN_me.bin
+radeon/TAHITI_vce.bin
+radeon/HAWAII_pfp.bin
+radeon/bonaire_sdma.bin
+radeon/RV610_me.bin
+radeon/BARTS_pfp.bin
+radeon/TURKS_smc.bin
+radeon/CYPRESS_rlc.bin
+radeon/HAWAII_ce.bin
+radeon/OLAND_ce.bin
+radeon/pitcairn_pfp.bin
+radeon/CAYMAN_smc.bin
+radeon/SUMO2_me.bin
+radeon/CAICOS_mc.bin
+radeon/hawaii_uvd.bin
+radeon/hainan_mc.bin
+radeon/R700_rlc.bin
+radeon/RV710_uvd.bin
+radeon/pitcairn_k_smc.bin
+radeon/kaveri_pfp.bin
+radeon/BONAIRE_sdma.bin
+radeon/tahiti_ce.bin
+radeon/RV770_pfp.bin
+radeon/OLAND_smc.bin
+radeon/CAYMAN_pfp.bin
+radeon/RV670_me.bin
+radeon/bonaire_mc.bin
+radeon/mullins_vce.bin
+radeon/OLAND_pfp.bin
+radeon/JUNIPER_me.bin
+radeon/BARTS_smc.bin
+radeon/CYPRESS_me.bin
+radeon/VERDE_mc2.bin
+radeon/RS780_me.bin
+radeon/oland_smc.bin
+radeon/BONAIRE_mc2.bin
+radeon/RV670_pfp.bin
+radeon/hawaii_sdma1.bin
+radeon/RV710_pfp.bin
+radeon/mullins_sdma.bin
+radeon/CAYMAN_me.bin
+radeon/OLAND_mc.bin
+radeon/RV610_pfp.bin
+radeon/RV620_me.bin
+radeon/PITCAIRN_me.bin
+radeon/OLAND_mc2.bin
+radeon/RS690_cp.bin
+realtek/rt1320/rt1320-patch-code-vc.bin
+realtek/rt1320/rt1320-patch-code-vab.bin
+rockchip/dptx.bin
+rp2.fw
+rsi/rs9113_wlan_qspi.rps
+rsi/rs9116_wlan.rps
+rsi/rs9116_wlan_bt_classic.rps
+rsi/rs9113_ap_bt_dual_mode.rps
+rsi/rs9113_wlan_bt_dual_mode.rps
+rsi_91x.fw
+rt2561.bin
+rt2561s.bin
+rt2661.bin
+rt2860.bin
+rt2870.bin
+rt3070.bin
+rt3071.bin
+rt3090.bin
+rt3290.bin
+rt73.bin
+rtl_bt/rtl8723d_config.bin
+rtl_bt/rtl8852cu_fw.bin
+rtl_bt/rtl8761b_fw.bin
+rtl_bt/rtl8821cs_fw.bin
+rtl_bt/rtl8761a_fw.bin
+rtl_bt/rtl8761bu_fw.bin
+rtl_bt/rtl8723bs_config-OBDA0623.bin
+rtl_bt/rtl8192eu_fw.bin
+rtl_bt/rtl8852btu_config.bin
+rtl_bt/rtl8723bs_config-OBDA8723.bin
+rtl_bt/rtl8922au_fw.bin
+rtl_bt/rtl8852au_config.bin
+rtl_bt/rtl8822b_config.bin
+rtl_bt/rtl8852btu_fw.bin
+rtl_bt/rtl8821c_config.bin
+rtl_bt/rtl8852bu_fw.bin
+rtl_bt/rtl8822cu_config.bin
+rtl_bt/rtl8723bs_config.bin
+rtl_bt/rtl8723bs_fw.bin
+rtl_bt/rtl8852au_fw.bin
+rtl_bt/rtl8922au_config.bin
+rtl_bt/rtl8852bu_config.bin
+rtl_bt/rtl8761bu_config.bin
+rtl_bt/rtl8723cs_xx_fw.bin
+rtl_bt/rtl8723d_fw.bin
+rtl_bt/rtl8851bu_config.bin
+rtl_bt/rtl8723a_fw.bin
+rtl_bt/rtl8821a_fw.bin
+rtl_bt/rtl8821a_config.bin
+rtl_bt/rtl8852cu_fw_v2.bin
+rtl_bt/rtl8822cs_fw.bin
+rtl_bt/rtl8723b_fw.bin
+rtl_bt/rtl8852cu_config.bin
+rtl_bt/rtl8723cs_xx_config.bin
+rtl_bt/rtl8821cs_config.bin
+rtl_bt/rtl8851bu_fw.bin
+rtl_bt/rtl8812ae_fw.bin
+rtl_bt/rtl8821c_fw.bin
+rtl_bt/rtl8822cu_fw.bin
+rtl_bt/rtl8822b_fw.bin
+rtl_bt/rtl8192ee_fw.bin
+rtl_bt/rtl8761b_config.bin
+rtl_bt/rtl8822cs_config.bin
+rtl_nic/rtl8125d-1.fw
+rtl_nic/rtl8168h-2.fw
+rtl_nic/rtl8125d-2.fw
+rtl_nic/rtl8168e-1.fw
+rtl_nic/rtl8153c-1.fw
+rtl_nic/rtl8106e-2.fw
+rtl_nic/rtl8168d-2.fw
+rtl_nic/rtl8107e-1.fw
+rtl_nic/rtl8107e-2.fw
+rtl_nic/rtl8126a-2.fw
+rtl_nic/rtl8125b-1.fw
+rtl_nic/rtl8168f-2.fw
+rtl_nic/rtl8168e-2.fw
+rtl_nic/rtl8125b-2.fw
+rtl_nic/rtl8153a-3.fw
+rtl_nic/rtl8168f-1.fw
+rtl_nic/rtl8168e-3.fw
+rtl_nic/rtl8168g-2.fw
+rtl_nic/rtl8105e-1.fw
+rtl_nic/rtl8168fp-3.fw
+rtl_nic/rtl8411-2.fw
+rtl_nic/rtl8168g-3.fw
+rtl_nic/rtl8126a-3.fw
+rtl_nic/rtl8153a-2.fw
+rtl_nic/rtl8125bp-2.fw
+rtl_nic/rtl8153b-2.fw
+rtl_nic/rtl8125a-3.fw
+rtl_nic/rtl8168h-1.fw
+rtl_nic/rtl8168d-1.fw
+rtl_nic/rtl8153a-4.fw
+rtl_nic/rtl8168g-1.fw
+rtl_nic/rtl8402-1.fw
+rtl_nic/rtl8156b-2.fw
+rtl_nic/rtl8156a-2.fw
+rtl_nic/rtl8411-1.fw
+rtl_nic/rtl8106e-1.fw
+rtlwifi/rtl8723defw.bin
+rtlwifi/rtl8192cfwU.bin
+rtlwifi/rtl8723bu_nic.bin
+rtlwifi/rtl8723aufw_B.bin
+rtlwifi/rtl8192cufw_TMSC.bin
+rtlwifi/rtl8192cufw.bin
+rtlwifi/rtl8188efw.bin
+rtlwifi/rtl8192dufw.bin
+rtlwifi/rtl8192cufw_A.bin
+rtlwifi/rtl8192eu_ap_wowlan.bin
+rtlwifi/rtl8192eu_nic.bin
+rtlwifi/rtl8192cfwU_B.bin
+rtlwifi/rtl8723bu_wowlan.bin
+rtlwifi/rtl8812aefw.bin
+rtlwifi/rtl8712u.bin
+rtlwifi/rtl8710bufw_UMC.bin
+rtlwifi/rtl8723aufw_A.bin
+rtlwifi/rtl8821aefw_29.bin
+rtlwifi/rtl8821aefw.bin
+rtlwifi/rtl8723bs_ap_wowlan.bin
+rtlwifi/rtl8822befw.bin
+rtlwifi/rtl8723bs_nic.bin
+rtlwifi/rtl8723fw.bin
+rtlwifi/rtl8192sefw.bin
+rtlwifi/rtl8710bufw_SMIC.bin
+rtlwifi/rtl8192cfw.bin
+rtlwifi/rtl8723bs_wowlan.bin
+rtlwifi/rtl8812aefw_wowlan.bin
+rtlwifi/rtl8192eefw.bin
+rtlwifi/rtl8723fw_B.bin
+rtlwifi/rtl8192defw.bin
+rtlwifi/rtl8192eu_wowlan.bin
+rtlwifi/rtl8723befw.bin
+rtlwifi/rtl8723aufw_B_NoBT.bin
+rtlwifi/rtl8723bu_ap_wowlan.bin
+rtlwifi/rtl8192cufw_B.bin
+rtlwifi/rtl8188fufw.bin
+rtlwifi/rtl8723bs_bt.bin
+rtlwifi/rtl8192fufw.bin
+rtlwifi/rtl8821aefw_wowlan.bin
+rtlwifi/rtl8723befw_36.bin
+rtlwifi/rtl8188eufw.bin
+rtw88/rtw8812a_fw.bin
+rtw88/rtw8822c_fw.bin
+rtw88/README
+rtw88/rtw8703b_fw.bin
+rtw88/rtw8821a_fw.bin
+rtw88/rtw8723d_fw.bin
+rtw88/rtw8821c_fw.bin
+rtw88/rtw8822b_fw.bin
+rtw88/rtw8822c_wow_fw.bin
+rtw88/rtw8703b_wow_fw.bin
+rtw89/rtw8922a_fw-1.bin
+rtw89/rtw8852c_fw.bin
+rtw89/rtw8852c_fw-1.bin
+rtw89/rtw8851b_fw.bin
+rtw89/rtw8852b_fw-1.bin
+rtw89/rtw8852bt_fw.bin
+rtw89/rtw8922a_fw-2.bin
+rtw89/rtw8922a_fw.bin
+rtw89/rtw8852b_fw.bin
+rtw89/rtw8852a_fw.bin
+s2250.fw
+s2250_loader.fw
+s5p-mfc-v12.fw
+s5p-mfc-v6-v2.fw
+s5p-mfc-v6.fw
+s5p-mfc-v7.fw
+s5p-mfc-v8.fw
+s5p-mfc.fw
+sb16/mulaw_main.csp
+sb16/ima_adpcm_capture.csp
+sb16/alaw_main.csp
+sb16/ima_adpcm_init.csp
+sb16/ima_adpcm_playback.csp
+sdd_sagrad_1091_1098.bin
+slicoss/oasisdbgdownload.sys
+slicoss/oasisdownload.sys
+slicoss/gbdownload.sys
+slicoss/oasisrcvucode.sys
+slicoss/gbrcvucode.sys
+sms1xxx-hcw-55xxx-dvbt-02.fw
+sms1xxx-hcw-55xxx-isdbt-02.fw
+sms1xxx-nova-a-dvbt-01.fw
+sms1xxx-nova-b-dvbt-01.fw
+sms1xxx-stellar-dvbt-01.fw
+sun/cassini.bin
+sxg/saharadownloadB.sys
+sxg/saharadbgdownloadB.sys
+tdmb_nova_12mhz.inp
+tehuti/bdx.bin
+ti/tas2563/INT8866RCA2.bin
+ti/tas2563/TAS2XXX3870.bin
+ti/tas2781/TAS2XXX38A7.bin
+ti/tas2781/TAS2XXX387F.bin
+ti/tas2781/TIAS2781RCA4.bin
+ti/tas2781/TAS2XXX387D.bin
+ti/tas2781/TAS2XXX38BE.bin
+ti/tas2781/TAS2XXX38CD.bin
+ti/tas2781/TAS2XXX1EB31.bin
+ti/tas2781/TAS2XXX38CB.bin
+ti/tas2781/TAS2XXX3884.bin
+ti/tas2781/TAS2XXX1EB30.bin
+ti/tas2781/TAS2XXX38E0.bin
+ti/tas2781/TAS2XXX38BA.bin
+ti/tas2781/TAS2XXX387E.bin
+ti/tas2781/TAS2XXX38B9.bin
+ti/tas2781/TAS2XXX38D4.bin
+ti/tas2781/TAS2XXX38D6.bin
+ti/tas2781/TIAS2781RCA2.bin
+ti/tas2781/TAS2XXX38BF.bin
+ti/tas2781/TAS2XXX38C3.bin
+ti/tas2781/TAS2XXX38B8.bin
+ti/tas2781/TAS2XXX3880.bin
+ti/tas2781/TAS2XXX38DF.bin
+ti/tas2781/TAS2XXX38D5.bin
+ti/tas2781/TAS2XXX3882.bin
+ti/tas2781/TAS2XXX38BB.bin
+ti/tas2781/TAS2XXX38D3.bin
+ti/tas2781/TAS2XXX38A5.bin
+ti/tas2781/TAS2XXX2234.bin
+ti/tas2781/TAS2XXX3881.bin
+ti/tas2781/TAS2XXX3886.bin
+ti/tas2781/TAS2XXX38A8.bin
+ti/vpdma-1b8.bin
+ti-connectivity/wl18xx-fw-2.bin
+ti-connectivity/wl1271-fw-ap.bin
+ti-connectivity/cc33xx-conf.bin
+ti-connectivity/wl127x-fw-5-sr.bin
+ti-connectivity/wl18xx-fw.bin
+ti-connectivity/cc33xx_2nd_loader.bin
+ti-connectivity/wl1251-fw.bin
+ti-connectivity/wl1271-fw.bin
+ti-connectivity/wl1271-fw-2.bin
+ti-connectivity/wl127x-fw-5-mr.bin
+ti-connectivity/wl128x-fw-3.bin
+ti-connectivity/wl128x-fw-plt-3.bin
+ti-connectivity/wl127x-fw-3.bin
+ti-connectivity/wl127x-fw-4-sr.bin
+ti-connectivity/TIInit_7.2.31.bts
+ti-connectivity/wl128x-fw-4-mr.bin
+ti-connectivity/wl127x-fw-plt-3.bin
+ti-connectivity/wl128x-fw.bin
+ti-connectivity/wl128x-fw-5-mr.bin
+ti-connectivity/wl127x-fw-4-mr.bin
+ti-connectivity/TIInit_6.2.31.bts
+ti-connectivity/wl128x-fw-4-plt.bin
+ti-connectivity/wl1271-nvs.bin
+ti-connectivity/cc33xx_fw.bin
+ti-connectivity/wl128x-fw-ap.bin
+ti-connectivity/wl1251-nvs.bin
+ti-connectivity/wl18xx-fw-3.bin
+ti-connectivity/wl128x-fw-4-sr.bin
+ti-connectivity/wl127x-nvs.bin
+ti-connectivity/wl18xx-fw-4.bin
+ti-connectivity/wl12xx-nvs.bin
+ti-connectivity/wl128x-nvs.bin
+ti-connectivity/TIInit_6.6.15.bts
+ti-connectivity/wl128x-fw-5-sr.bin
+ti-connectivity/wl128x-fw-5-plt.bin
+ti-connectivity/wl127x-fw-4-plt.bin
+ti-connectivity/wl127x-fw-5-plt.bin
+ti-keystone/ks2_qmss_pdsp_acc48_k2_le_1_0_0_9.bin
+ti_3410.fw
+ti_5052.fw
+tigon/tg3_tso5.bin
+tigon/tg357766.bin
+tigon/tg3.bin
+tigon/tg3_tso.bin
+tlg2300_firmware.bin
+tsse_firmware.bin
+ttusb-budget/dspbootcode.bin
+ueagle-atm/DSP9p.bin
+ueagle-atm/eagleIV.fw
+ueagle-atm/CMV9i.bin
+ueagle-atm/CMVepFR.bin
+ueagle-atm/CMVepES.bin
+ueagle-atm/DSPep.bin
+ueagle-atm/adi930.fw
+ueagle-atm/eagleII.fw
+ueagle-atm/930-fpga.bin
+ueagle-atm/CMVepES03.bin
+ueagle-atm/CMVeiWO.bin
+ueagle-atm/CMVepFR10.bin
+ueagle-atm/CMV4p.bin.v2
+ueagle-atm/DSP9i.bin
+ueagle-atm/eagleI.fw
+ueagle-atm/CMVepFR04.bin
+ueagle-atm/DSP4p.bin
+ueagle-atm/CMVep.bin
+ueagle-atm/CMVepWO.bin
+ueagle-atm/CMVei.bin
+ueagle-atm/CMV9p.bin
+ueagle-atm/CMVepIT.bin
+ueagle-atm/DSPei.bin
+ueagle-atm/eagleIII.fw
+usbdux_firmware.bin
+usbduxfast_firmware.bin
+usbduxsigma_firmware.bin
+v4l-cx231xx-avcore-01.fw
+v4l-cx23418-apu.fw
+v4l-cx23418-cpu.fw
+v4l-cx23418-dig.fw
+v4l-cx23885-avcore-01.fw
+v4l-cx25840.fw
+vicam/firmware.fw
+vntwusb.fw
+vpu_d.bin
+vpu_p.bin
+vxge/X3fw-pxe.ncf
+vxge/X3fw.ncf
+wfx/brd8022a.pds
+wfx/wfm_wf200_C0.sec
+wfx/brd4001a.pds
+wfx/brd8023a.pds
+whiteheat.fw
+whiteheat_loader.fw
+wil6210.brd
+wil6210.fw
+wsm_22.bin
+xe/lnl_gsc_1.bin
+xe/bmg_huc.bin
+xe/lnl_huc.bin
+xe/lnl_guc_70.bin
+xe/bmg_guc_70.bin
+yam/1200.bin
+yam/9600.bin
+yamaha/ds1_ctrl.fw
+yamaha/yss225_registers.bin
+yamaha/ds1_dsp.fw
+yamaha/ds1e_ctrl.fw
diff --git a/etc/portage/smart-live-rebuild.conf b/etc/portage/smart-live-rebuild.conf
new file mode 100644
index 00000000..a6a3039b
--- /dev/null
+++ b/etc/portage/smart-live-rebuild.conf
@@ -0,0 +1,3 @@
+[smart-live-rebuild]
+jobs = 28
+# quickpkg = on