From e07092afa206f5534a9e03954880b547a9d3eb81 Mon Sep 17 00:00:00 2001 From: aslauw Date: Thu, 4 Jun 2026 23:01:15 +0200 Subject: [PATCH 01/11] Initial implementation of device battery indicators plugin Bar widget showing battery indicators for connected devices (mouse, keyboard, headphones, etc.), each rendered as a device icon inside a circular battery ring. - scripts/scan.py: normalized JSON data layer probing openrazer + Solaar; add a scan_*() and append to SOURCES to support a new device source - Main.qml: polls scan.py on a timer, exposes live devices, IPC refresh - BarWidget.qml: one pill per enabled device, theme-aware colors, tooltip, click-to-launch, right-click settings menu - Settings.qml: per-device enable/icon/colors/launch-command, applied live --- battery-wireless-devices/.gitignore | 2 + battery-wireless-devices/BarWidget.qml | 255 +++++++++++++++++++++ battery-wireless-devices/CLAUDE.md | 72 ++++++ battery-wireless-devices/Main.qml | 86 +++++++ battery-wireless-devices/Settings.qml | 280 +++++++++++++++++++++++ battery-wireless-devices/manifest.json | 25 ++ battery-wireless-devices/scripts/scan.py | 162 +++++++++++++ 7 files changed, 882 insertions(+) create mode 100644 battery-wireless-devices/.gitignore create mode 100644 battery-wireless-devices/BarWidget.qml create mode 100644 battery-wireless-devices/CLAUDE.md create mode 100644 battery-wireless-devices/Main.qml create mode 100644 battery-wireless-devices/Settings.qml create mode 100644 battery-wireless-devices/manifest.json create mode 100755 battery-wireless-devices/scripts/scan.py diff --git a/battery-wireless-devices/.gitignore b/battery-wireless-devices/.gitignore new file mode 100644 index 000000000..ac4e0a5ba --- /dev/null +++ b/battery-wireless-devices/.gitignore @@ -0,0 +1,2 @@ +# Runtime per-user plugin config, written by saveSettings() +settings.json diff --git a/battery-wireless-devices/BarWidget.qml b/battery-wireless-devices/BarWidget.qml new file mode 100644 index 000000000..9096edcc5 --- /dev/null +++ b/battery-wireless-devices/BarWidget.qml @@ -0,0 +1,255 @@ +import QtQuick +import QtQuick.Layouts +import Quickshell +import qs.Commons +import qs.Widgets +import qs.Services.UI + +// One pill per enabled device: a device icon inside a circular battery ring. +// Live battery data comes from Main.qml via pluginApi.mainInstance.devices; +// per-device appearance/behaviour comes from pluginApi.pluginSettings.devices. +Item { + id: root + + // Plugin API (injected by PluginService). + property var pluginApi: null + + // Required properties for bar widgets. + property ShellScreen screen + property string widgetId: "" + property string section: "" + property int sectionWidgetIndex: -1 + property int sectionWidgetsCount: 0 + + readonly property string screenName: screen ? screen.name : "" + readonly property string barPosition: Settings.getBarPositionForScreen(screenName) + readonly property bool isBarVertical: barPosition === "left" || barPosition === "right" + + // Live data from Main.qml. + readonly property var liveDevices: (pluginApi && pluginApi.mainInstance) ? (pluginApi.mainInstance.devices || []) : [] + + // Devices the user has enabled, merged with their live battery readings. + readonly property var shownDevices: { + var settings = pluginApi ? pluginApi.pluginSettings : null // dependency for re-eval + var out = [] + for (var i = 0; i < liveDevices.length; i++) { + var d = liveDevices[i] + var cfg = cfgFor(d.id) + if (cfg && cfg.enabled === true) + out.push(d) + } + return out + } + + readonly property bool showPercentage: pluginApi && pluginApi.pluginSettings + && pluginApi.pluginSettings.showPercentage === true + + implicitWidth: layout.implicitWidth + implicitHeight: layout.implicitHeight + visible: shownDevices.length > 0 + + // ---- Helpers ----------------------------------------------------------- + + function cfgFor(id) { + var all = (pluginApi && pluginApi.pluginSettings) ? pluginApi.pluginSettings.devices : null + return (all && all[id]) ? all[id] : null + } + + function defaultIconForType(type) { + switch (type) { + case "mouse": return "mouse" + case "keyboard": return "keyboard" + case "headset": return "headphones" + case "gamepad": return "device-gamepad" + default: return "battery" + } + } + + // Theme color-role keys ("none"/"primary"/"secondary"/"tertiary"/"error"), + // resolved with the same helper the core widgets use. + function ringColorFor(device, cfg) { + var key = cfg ? cfg.ringColor : "" + if (key && key !== "" && key !== "none") + return Color.resolveColorKey(key) + // Auto: colour by charge state / level. + if (device.charging) + return Color.mTertiary + var b = (typeof device.battery === "number") ? device.battery : 100 + if (b <= 15) return Color.mError + if (b <= 35) return Color.mSecondary + return Color.mPrimary + } + + function launch(cfg) { + if (cfg && cfg.launchCmd && cfg.launchCmd.trim() !== "") + Quickshell.execDetached(["sh", "-lc", cfg.launchCmd]) + } + + // ---- Right-click menu (shared) ----------------------------------------- + + NPopupContextMenu { + id: contextMenu + model: [ + { "label": "Settings", "action": "settings", "icon": "settings" }, + { "label": "Refresh now", "action": "refresh", "icon": "refresh" } + ] + onTriggered: action => { + contextMenu.close() + PanelService.closeContextMenu(root.screen) + if (action === "settings") + BarService.openPluginSettings(root.screen, pluginApi.manifest) + else if (action === "refresh" && pluginApi && pluginApi.mainInstance) + pluginApi.mainInstance.refresh() + } + } + + // ---- Layout ------------------------------------------------------------ + + GridLayout { + id: layout + anchors.centerIn: parent + columns: root.isBarVertical ? 1 : Math.max(1, shownDevices.length) + rowSpacing: Style.marginXS + columnSpacing: Style.marginXS + + Repeater { + model: root.shownDevices + + delegate: Rectangle { + id: pill + + required property var modelData + readonly property var cfg: root.cfgFor(modelData.id) + readonly property int battery: (typeof modelData.battery === "number") ? modelData.battery : -1 + readonly property color ringColor: root.ringColorFor(modelData, cfg) + readonly property color iconColor: Color.resolveColorKey((cfg && cfg.iconColor) ? cfg.iconColor : "none") + readonly property string iconName: (cfg && cfg.icon) ? cfg.icon : root.defaultIconForType(modelData.type) + + readonly property string tooltipLabel: modelData.name + + (pill.battery >= 0 ? " — " + pill.battery + "%" : "") + + (modelData.charging ? " ⚡" : "") + + implicitWidth: pillRow.implicitWidth + Style.marginM * 2 + implicitHeight: Style.barHeight + radius: Style.radiusM + color: pillMouse.containsMouse ? Color.mHover : Style.capsuleColor + + Behavior on color { + enabled: !Color.isTransitioning + ColorAnimation { + duration: Style.animationFast + easing.type: Easing.InOutQuad + } + } + + RowLayout { + id: pillRow + anchors.centerIn: parent + spacing: Style.marginXS + + // Circular battery ring with the device icon in the centre. + Item { + id: ring + readonly property real size: Math.round(Style.barHeight * 0.62) + implicitWidth: size + implicitHeight: size + Layout.alignment: Qt.AlignVCenter + + Canvas { + id: ringCanvas + anchors.fill: parent + renderStrategy: Canvas.Cooperative + renderTarget: Canvas.FramebufferObject + + readonly property real ratio: pill.battery >= 0 ? Math.max(0, Math.min(1, pill.battery / 100)) : 0 + // Repaint when any visual input changes. + onRatioChanged: requestPaint() + property color trackColor: Qt.alpha(Color.mOnSurface, 0.22) + property color valueColor: pill.ringColor + onValueColorChanged: requestPaint() + onTrackColorChanged: requestPaint() + + onPaint: { + var ctx = getContext("2d") + ctx.reset() + var lw = Math.max(2, Math.round(width * 0.11)) + var cx = width / 2 + var cy = height / 2 + var r = (width - lw) / 2 + var start = -Math.PI / 2 // 12 o'clock + + ctx.lineWidth = lw + ctx.lineCap = "round" + + // Track + ctx.strokeStyle = trackColor + ctx.beginPath() + ctx.arc(cx, cy, r, 0, 2 * Math.PI) + ctx.stroke() + + // Value arc + if (ratio > 0.001) { + ctx.strokeStyle = valueColor + ctx.beginPath() + ctx.arc(cx, cy, r, start, start + ratio * 2 * Math.PI) + ctx.stroke() + } + } + } + + NIcon { + anchors.centerIn: parent + icon: pill.iconName + color: pill.iconColor + pointSize: Style.fontSizeXS + } + } + + NText { + visible: root.showPercentage && pill.battery >= 0 + text: pill.battery + "%" + color: Color.mOnSurface + pointSize: root.barFontSize + Layout.alignment: Qt.AlignVCenter + } + } + + MouseArea { + id: pillMouse + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + acceptedButtons: Qt.LeftButton | Qt.RightButton + onClicked: mouse => { + TooltipService.hide() + if (mouse.button === Qt.RightButton) + PanelService.showContextMenu(contextMenu, pill, root.screen) + else + root.launch(pill.cfg) + } + onEntered: { + TooltipService.show(pill, pill.tooltipLabel, BarService.getTooltipDirection(root.screenName)) + tooltipRefreshTimer.start() + } + onExited: { + tooltipRefreshTimer.stop() + TooltipService.hide() + } + + // Keep the tooltip percentage current while hovering. + Timer { + id: tooltipRefreshTimer + interval: 1000 + repeat: true + onTriggered: { + if (pillMouse.containsMouse) + TooltipService.updateText(pill.tooltipLabel) + } + } + } + } + } + } + + readonly property real barFontSize: Style.fontSizeXS +} diff --git a/battery-wireless-devices/CLAUDE.md b/battery-wireless-devices/CLAUDE.md new file mode 100644 index 000000000..49b2b3ca9 --- /dev/null +++ b/battery-wireless-devices/CLAUDE.md @@ -0,0 +1,72 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## What this is + +A plugin for **Noctalia** (a Quickshell-based desktop shell, `noctalia-shell`). It is pure QML loaded at runtime by the running shell — there is **no build step, no compiler, and no test framework** in this repo. The plugin's purpose is a bar widget that shows battery indicators for connected devices (mouse, keyboard, headphones, and other Bluetooth devices). + +Requires `minNoctaliaVersion: 3.6.0`. + +## This implementation's architecture + +The plugin is split across three entry points plus one helper script: + +- **`scripts/scan.py`** — the data layer and the only place that knows how to talk to devices. It probes every supported source and prints a **normalized JSON array** on stdout: `[{ id, name, type, battery, charging, source }]`. `id` is `":"`. Each source is a `scan_()` function that swallows its own errors (missing tool → `[]`). Current sources: `scan_openrazer()` (via the `openrazer` Python client / running `openrazer-daemon`) and `scan_solaar()` (parses `solaar show`). **To add a new device source, add a `scan_*()` and append it to `SOURCES` — nothing in the QML changes.** +- **`Main.qml`** (`main` entry point) — runs `scan.py` on a `Timer` (interval = `pluginSettings.refreshInterval`, default 60s), parses the JSON, and exposes the live list as `property var devices`. Also exposes `refresh()` and an `IpcHandler` (`plugin:device_battery_indicators` → `refresh`). +- **`BarWidget.qml`** — reads live data from `pluginApi.mainInstance.devices` and per-device config from `pluginApi.pluginSettings.devices`. Renders one pill per device the user has **enabled**, each a device icon inside a circular battery ring (a `Canvas`). Ring colour is auto-by-level unless overridden; click runs the device's `launchCmd` via `Quickshell.execDetached`. +- **`Settings.qml`** (`settings` entry point) — lists detected + previously-configured devices and lets the user set per device: `enabled`, `icon`, `iconColor`, `ringColor`, `launchCmd`. Settings shape: `pluginSettings.devices` is a map keyed by device `id`; globals are `refreshInterval` and `showPercentage`. Edits are staged in a working copy and only committed in `saveSettings()`. + +Data flow: `scan.py` → `Main.qml.devices` → (`pluginApi.mainInstance`) → `BarWidget`. Config flow: `Settings.qml` → `pluginSettings.devices` → `BarWidget`. + +## Layout & how a plugin is structured + +- `manifest.json` — the contract. `id` must be unique; `entryPoints` maps roles to QML files. Each role is optional; this plugin currently only defines `barWidget`. Other available roles (see the `arch-updater` reference plugin): `main` (background singleton/logic, instantiated once), `panel`, `settings`, `controlCenterWidget`, `desktopWidget`, `launcherProvider`. +- `metadata.defaultSettings` in the manifest defines the plugin's persisted settings schema and defaults. User overrides are merged on top at load. +- Entry-point `.qml` files live at the repo root. Optional `i18n/.json` files provide translations (`en.json` is the fallback). + +## Installation / runtime model + +The plugin runs from `~/.config/noctalia/plugins//`. During development this is a **symlink** to this repo, so edits here are live. Enablement and source are tracked in `~/.config/noctalia/plugins.json` (`states..enabled`). + +The shell itself runs as `qs -c noctalia-shell`. The Noctalia source (read-only, useful as API reference) is installed at `/etc/xdg/quickshell/noctalia-shell/` — `Commons/`, `Widgets/`, and `Services/` there define everything importable below. + +## Imports available to plugin QML + +```qml +import qs.Commons // singletons: Style, Color, Settings, I18n, Logger, Icons, Time, ShellState +import qs.Widgets // N-prefixed components: NIcon, NText, NButton, NBattery, NBox, NComboBox, ... +import qs.Services.Networking // BluetoothService, etc. +import qs.Services.SystemInfo // BatteryService, etc. (path varies by service category) +``` + +Service singletons are organized into subfolders under `Services/` (Networking, Control, Noctalia, UI, ...). Grep the shell source to find the right import path for a given service. + +## Key conventions (follow these — don't reinvent) + +- **Never hardcode sizes/colors.** Use `Style.*` (`marginS/M`, `barHeight`, `capsuleColor`, `radiusM`, `fontSizeS/M/L`) and `Color.*` (`mPrimary`, `mOnSurface`, `mSurface`, ...) so the widget respects the user's theme and UI scale. `NIcon`/`NText` already apply UI scaling. +- **Icons** are Tabler icon names passed to `NIcon { icon: "..." }` (e.g. `"heart"`); the full set is in `Commons/IconsTabler.qml`. +- **Bar widgets** must declare the properties the loader injects: `screen` (ShellScreen), `widgetId`, `section`, `sectionWidgetIndex`, `sectionWidgetsCount`, plus `property var pluginApi`. + +## The `pluginApi` object + +`PluginService` injects a `pluginApi` into every entry point. It exposes: +- `pluginId`, `pluginDir`, `manifest` +- `pluginSettings` — merged defaults + user settings. Mutate it, then call `saveSettings()` to persist (the call also replaces the object so QML bindings re-fire). +- Panel control: `openPanel(screen, buttonItem)`, `closePanel(screen)`, `togglePanel(...)`, and launcher equivalents. +- i18n: `tr(key, interpolations)`, `trp(key, count, interpolations)`, `hasTranslation(key)`; depend on `translationVersion` to react to language changes. +- Instance references once loaded: `mainInstance`, `barWidget`, `panel`, etc. + +## Bluetooth device battery (this plugin's domain) + +`BluetoothService` (in `Services/Networking/`) is the source of device data: +- `connectedDevices` — list of currently connected devices. +- `getBatteryPercent(device)`, `getSignalPercent(device)`, `getDeviceIcon(device)`, `getSignalIcon(device)`. + +## Developing & verifying changes + +There are no unit tests. To see changes: enable Noctalia **debug mode** (`Settings.isDebug`, or launch with `NOCTALIA_DEBUG=1`) — `PluginService` then sets up file watchers and **hot-reloads** the plugin on save. Watch the shell's stdout / `Logger` output (run `qs -c noctalia-shell` from a terminal) for QML errors and plugin load failures, which `PluginService` records in `pluginErrors`. + +**Manifest changes require a full shell restart, not hot reload.** `PluginRegistry.getPluginManifest()` returns an in-memory cache (`installedPlugins`) populated by a disk scan at startup. Hot reload re-instantiates QML against that *cached* manifest, so adding/removing `entryPoints` (or changing `metadata.defaultSettings`) is invisible until the shell restarts. Symptom: a newly-added `main` entry point's `IpcHandler` returns "Target not found". Editing existing `.qml` files hot-reloads fine. + +Smoke test that `Main.qml` loaded: `qs -c noctalia-shell ipc call plugin:device_battery_indicators refresh` (returns a success string). Verify `scan.py` independently with `python3 scripts/scan.py`. The bar widget renders nothing until the user adds the widget to a bar section **and** enables at least one device in the plugin settings. diff --git a/battery-wireless-devices/Main.qml b/battery-wireless-devices/Main.qml new file mode 100644 index 000000000..1aef1f7c8 --- /dev/null +++ b/battery-wireless-devices/Main.qml @@ -0,0 +1,86 @@ +import QtQuick +import Quickshell +import Quickshell.Io +import qs.Commons + +// Background logic for the Device Battery Indicators plugin. +// +// Polls scripts/scan.py on a timer, parses its normalized JSON, and exposes the +// live device list. The bar widget and settings UI both read `devices` from +// this instance via pluginApi.mainInstance. +Item { + id: root + + // Injected by PluginService. + property var pluginApi: null + + // Live, normalized device list: [{ id, name, type, battery, charging, source }]. + // Replaced wholesale on each successful scan so QML bindings re-fire. + property var devices: [] + + // True while a scan is in flight (used by the settings UI's refresh button). + property bool scanning: false + + // Absolute path to the scan script. pluginDir is a plain filesystem path. + readonly property string scriptPath: (pluginApi ? pluginApi.pluginDir : "") + "/scripts/scan.py" + + readonly property int refreshInterval: { + var s = pluginApi && pluginApi.pluginSettings ? pluginApi.pluginSettings.refreshInterval : undefined + return (typeof s === "number" && s > 0) ? s : 60 + } + + function refresh() { + if (!pluginApi || scanner.running) + return + root.scanning = true + scanner.running = true + } + + Component.onCompleted: refresh() + + Process { + id: scanner + command: ["python3", root.scriptPath] + + property string _buffer: "" + + // scan.py prints the JSON array on a single line; accumulate in case + // the stream is delivered in multiple chunks. + stdout: SplitParser { + onRead: data => scanner._buffer += data + } + + onExited: (exitCode, exitStatus) => { + root.scanning = false + var text = _buffer.trim() + _buffer = "" + if (exitCode !== 0) { + Logger.w("DeviceBattery", "scan.py exited with code", exitCode) + return + } + try { + root.devices = JSON.parse(text) + } catch (e) { + Logger.e("DeviceBattery", "Failed to parse scan output:", e, "raw:", text) + } + } + } + + // Periodic polling. Re-binds automatically when refreshInterval changes. + Timer { + interval: root.refreshInterval * 1000 + running: true + repeat: true + onTriggered: root.refresh() + } + + // `qs -c noctalia-shell ipc call plugin:device_battery_indicators refresh` + IpcHandler { + target: "plugin:device_battery_indicators" + + function refresh(): string { + root.refresh() + return "Device battery scan triggered" + } + } +} diff --git a/battery-wireless-devices/Settings.qml b/battery-wireless-devices/Settings.qml new file mode 100644 index 000000000..1ce363af9 --- /dev/null +++ b/battery-wireless-devices/Settings.qml @@ -0,0 +1,280 @@ +import QtQuick +import QtQuick.Layouts +import qs.Commons +import qs.Widgets + +// Plugin-wide settings UI (the "settings" entry point). Rendered inside a +// scroll view by Noctalia's plugin settings popup. Every control applies its +// change live (debounced) via commit(); the popup's Apply button just calls +// saveSettings() -> commit() again, so it's effectively redundant. +ColumnLayout { + id: root + + property var pluginApi: null + property real preferredWidth: 540 + + spacing: Style.marginM + Layout.fillWidth: true + + // Working copy of the per-device config: { : { enabled, icon, iconColor, + // ringColor, launchCmd, name, type } }. Mutated in place by the controls so + // the Repeater never rebuilds and loses edits. + property var editDevices: ({}) + + // Devices shown in the list: union of currently-detected devices and any + // previously-configured ones (so unplugged devices keep their settings). + property var deviceList: [] + + readonly property var liveDevices: (pluginApi && pluginApi.mainInstance) ? (pluginApi.mainInstance.devices || []) : [] + + readonly property var iconOptions: [ + { key: "", name: "Auto (by type)" }, + { key: "mouse", name: "Mouse" }, + { key: "keyboard", name: "Keyboard" }, + { key: "headphones", name: "Headphones" }, + { key: "device-gamepad", name: "Gamepad" }, + { key: "bluetooth", name: "Bluetooth" }, + { key: "device-desktop", name: "Desktop" }, + { key: "battery", name: "Battery" } + ] + + // Guards against committing during initial population. + property bool initialized: false + + Component.onCompleted: { + populateList() + initialized = true + } + + function _defaultCfg() { + return { enabled: false, icon: "", iconColor: "none", ringColor: "none", launchCmd: "", name: "", type: "device" } + } + + // Build editDevices + deviceList from saved settings and live detection. + function populateList() { + var saved = (pluginApi && pluginApi.pluginSettings && pluginApi.pluginSettings.devices) ? pluginApi.pluginSettings.devices : {} + var merged = ({}) + + // Seed from saved config (preserves offline devices). + for (var id in saved) { + merged[id] = Object.assign(root._defaultCfg(), saved[id]) + } + // Overlay live detection (updates name/type for known, adds new). + var live = root.liveDevices + var byId = ({}) + for (var i = 0; i < live.length; i++) { + var d = live[i] + byId[d.id] = d + if (!merged[d.id]) + merged[d.id] = root._defaultCfg() + merged[d.id].name = d.name + merged[d.id].type = d.type + } + root.editDevices = merged + + // Ordered list for display: live devices first, then offline configured. + var list = [] + for (var j = 0; j < live.length; j++) { + var ld = live[j] + list.push({ id: ld.id, name: ld.name, type: ld.type, battery: ld.battery, charging: ld.charging, online: true }) + } + for (var sid in merged) { + if (!byId[sid]) + list.push({ id: sid, name: merged[sid].name || sid, type: merged[sid].type || "device", battery: -1, charging: false, online: false }) + } + root.deviceList = list + } + + function set(id, key, value) { + if (!root.editDevices[id]) + root.editDevices[id] = root._defaultCfg() + root.editDevices[id][key] = value + scheduleCommit() + } + + // Coalesce rapid edits (e.g. typing) into a single persist. + function scheduleCommit() { + if (initialized) + commitTimer.restart() + } + + Timer { + id: commitTimer + interval: 200 + onTriggered: root.commit() + } + + // Persist the working state to pluginSettings. Rebuilds devices with fresh + // object identities so the bar widget's bindings re-fire (in-place mutation + // alone wouldn't notify them). + function commit() { + if (!pluginApi) + return + var devices = ({}) + for (var id in root.editDevices) + devices[id] = Object.assign({}, root.editDevices[id]) + pluginApi.pluginSettings.refreshInterval = intervalSpin.value + pluginApi.pluginSettings.showPercentage = showPctToggle.checked + pluginApi.pluginSettings.devices = devices + pluginApi.saveSettings() + } + + // Called by the settings popup's Apply button. + function saveSettings() { + commit() + } + + // ---- Global options ---------------------------------------------------- + + NLabel { + label: "Device Battery Indicators" + description: "Select which devices appear in the bar and how each looks." + } + + NToggle { + id: showPctToggle + Layout.fillWidth: true + label: "Show percentage" + description: "Display the battery percentage next to each icon." + checked: (pluginApi && pluginApi.pluginSettings && pluginApi.pluginSettings.showPercentage === true) + onToggled: root.scheduleCommit() + } + + NSpinBox { + id: intervalSpin + Layout.fillWidth: true + label: "Refresh interval" + description: "How often to re-scan devices, in seconds." + from: 10 + to: 900 + stepSize: 10 + suffix: "s" + value: { + var v = (pluginApi && pluginApi.pluginSettings) ? pluginApi.pluginSettings.refreshInterval : 60 + return (typeof v === "number" && v > 0) ? v : 60 + } + onValueChanged: root.scheduleCommit() + } + + RowLayout { + Layout.fillWidth: true + NButton { + text: "Rescan devices" + icon: "refresh" + onClicked: { + if (pluginApi && pluginApi.mainInstance) + pluginApi.mainInstance.refresh() + rescanTimer.restart() + } + } + Item { Layout.fillWidth: true } + } + + // Re-read the device list shortly after a manual scan completes. + Timer { + id: rescanTimer + interval: 3000 + onTriggered: root.populateList() + } + + NDivider { Layout.fillWidth: true } + + NText { + visible: root.deviceList.length === 0 + text: "No devices detected. Make sure the device is on, then press \"Rescan devices\"." + color: Color.mOnSurfaceVariant + wrapMode: Text.WordWrap + Layout.fillWidth: true + } + + // ---- Per-device cards -------------------------------------------------- + + Repeater { + model: root.deviceList + + delegate: Rectangle { + id: card + required property var modelData + readonly property var cfg: root.editDevices[modelData.id] || root._defaultCfg() + // Notifiable mirror of cfg.enabled so the toggle updates live + // (editDevices is mutated in place and doesn't emit change signals). + property bool enabledLocal: cfg.enabled === true + + Layout.fillWidth: true + implicitHeight: cardCol.implicitHeight + Style.marginM * 2 + radius: Style.radiusM + color: Color.mSurfaceVariant + border.width: 1 + border.color: Color.mOutline + + ColumnLayout { + id: cardCol + anchors.fill: parent + anchors.margins: Style.marginM + spacing: Style.marginS + + RowLayout { + Layout.fillWidth: true + spacing: Style.marginS + + NText { + text: card.modelData.name + font.weight: Style.fontWeightBold + color: Color.mOnSurface + Layout.fillWidth: true + elide: Text.ElideRight + } + NText { + text: card.modelData.online + ? (card.modelData.battery >= 0 ? card.modelData.battery + "%" : "—") + + (card.modelData.charging ? " ⚡" : "") + : "offline" + color: card.modelData.online ? Color.mPrimary : Color.mOnSurfaceVariant + } + } + + NToggle { + Layout.fillWidth: true + label: "Show in bar" + checked: card.enabledLocal + onToggled: checked => { + card.enabledLocal = checked + root.set(card.modelData.id, "enabled", checked) + } + } + + NComboBox { + Layout.fillWidth: true + label: "Icon" + model: root.iconOptions + currentKey: card.cfg.icon || "" + onSelected: key => root.set(card.modelData.id, "icon", key) + } + + NColorChoice { + Layout.fillWidth: true + label: "Icon color" + description: "None uses the theme foreground." + currentKey: card.cfg.iconColor || "none" + onSelected: key => root.set(card.modelData.id, "iconColor", key) + } + + NColorChoice { + Layout.fillWidth: true + label: "Battery ring color" + description: "None colours by battery level." + currentKey: card.cfg.ringColor || "none" + onSelected: key => root.set(card.modelData.id, "ringColor", key) + } + + NTextInput { + Layout.fillWidth: true + label: "Command on click" + text: card.cfg.launchCmd || "" + placeholderText: "e.g. polychromatic-controller / solaar" + onTextChanged: root.set(card.modelData.id, "launchCmd", text) + } + } + } + } +} diff --git a/battery-wireless-devices/manifest.json b/battery-wireless-devices/manifest.json new file mode 100644 index 000000000..6b7102af9 --- /dev/null +++ b/battery-wireless-devices/manifest.json @@ -0,0 +1,25 @@ +{ + "id": "device_battery_indicators", + "name": "Device Battery Indicators", + "version": "1.0.0", + "minNoctaliaVersion": "3.6.0", + "author": "Aslauw", + "license": "MIT", + "repository": "https://github.com/aslauw/device_battery_indicator", + "description": "Battery indicators bar icons for devices (mouse, keyboard, headphones, etc)", + "entryPoints": { + "main": "Main.qml", + "barWidget": "BarWidget.qml", + "settings": "Settings.qml" + }, + "dependencies": { + "plugins": [] + }, + "metadata": { + "defaultSettings": { + "refreshInterval": 60, + "showPercentage": false, + "devices": {} + } + } +} diff --git a/battery-wireless-devices/scripts/scan.py b/battery-wireless-devices/scripts/scan.py new file mode 100755 index 000000000..f2eab187b --- /dev/null +++ b/battery-wireless-devices/scripts/scan.py @@ -0,0 +1,162 @@ +#!/usr/bin/env python3 +"""Scan all supported sources for device battery levels and print a normalized +JSON array on stdout. + +Output schema (one object per detected device that reports a battery level): + + { + "id": ":", # stable across runs + "name": "Human readable name", + "type": "mouse|keyboard|headset|...", # used to pick a default icon + "battery": 0-100 | null, + "charging": true|false, + "source": "openrazer|solaar" + } + +To add a new battery source, write a scan_() that returns a list of +dicts in this schema (swallowing all its own errors so a missing tool yields an +empty list), then add it to SOURCES at the bottom. Nothing else needs to change: +Main.qml polls this script, and the settings UI lists whatever it reports. +""" + +import json +import re +import subprocess +import sys + + +def _norm_type(raw: str) -> str: + """Map a vendor 'kind' string onto a small set of known device types.""" + raw = (raw or "").lower() + if "mouse" in raw: + return "mouse" + if "keyboard" in raw or "keypad" in raw: + return "keyboard" + if "headset" in raw or "headphone" in raw: + return "headset" + if "trackball" in raw: + return "mouse" + if "gamepad" in raw or "joystick" in raw: + return "gamepad" + return "device" + + +# --------------------------------------------------------------------------- # +# OpenRazer (mice, keyboards, ... via the running openrazer-daemon) +# --------------------------------------------------------------------------- # +def scan_openrazer(): + devices = [] + try: + from openrazer.client import DeviceManager + except Exception: + return devices + + try: + dm = DeviceManager() + except Exception: + return devices + + for dev in getattr(dm, "devices", []): + try: + if not dev.has("battery"): + continue + serial = dev.serial or dev.name + devices.append({ + "id": "openrazer:" + str(serial), + "name": dev.name, + "type": _norm_type(getattr(dev, "type", "")), + "battery": int(round(dev.battery_level)), + "charging": bool(dev.is_charging), + "source": "openrazer", + }) + except Exception: + # One bad device shouldn't drop the rest. + continue + return devices + + +# --------------------------------------------------------------------------- # +# Solaar (Logitech Unifying / Bolt / Lightspeed devices) +# --------------------------------------------------------------------------- # +# Match the aligned top-level fields (a space before the colon) so we don't pick +# up nested lines like "Kind: None" under the DEVICE NAME feature. +_SOLAAR_BATTERY_RE = re.compile(r"Battery:\s*(\d+)%") +_SOLAAR_KIND_RE = re.compile(r"^\s+Kind\s+:\s*(\S.*?)\s*$") +_SOLAAR_SERIAL_RE = re.compile(r"^\s+Serial number\s+:\s*(\S.*?)\s*$") + + +def _slug(name: str) -> str: + return re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") + + +def scan_solaar(): + devices = [] + try: + out = subprocess.run( + ["solaar", "show"], + capture_output=True, text=True, timeout=30, + ).stdout + except Exception: + return devices + + # `solaar show` prints one block per device/receiver. A new block starts at + # a line with no leading whitespace; lines inside a block are indented. + block = [] + blocks = [] + for line in out.splitlines(): + if line and not line[0].isspace(): + if block: + blocks.append(block) + block = [line] + elif block: + block.append(line) + if block: + blocks.append(block) + + for block in blocks: + text = "\n".join(block) + bm = _SOLAAR_BATTERY_RE.search(text) + if not bm: + continue # receivers and battery-less devices are skipped + name = block[0].strip() + if not name or name.lower().startswith("solaar version"): + continue + + kind = "" + serial = "" + for line in block[1:]: + km = _SOLAAR_KIND_RE.match(line) + if km: + kind = km.group(1) + sm = _SOLAAR_SERIAL_RE.match(line) + if sm and sm.group(1): + serial = sm.group(1) + + key = serial or _slug(name) + devices.append({ + "id": "solaar:" + key, + "name": name, + "type": _norm_type(kind or name), + "battery": int(bm.group(1)), + "charging": "CHARGING" in text and "DISCHARGING" not in text, + "source": "solaar", + }) + return devices + + +SOURCES = [scan_openrazer, scan_solaar] + + +def main(): + results = [] + for scan in SOURCES: + try: + results.extend(scan()) + except Exception: + continue + json.dump(results, sys.stdout) + sys.stdout.write("\n") + + +if __name__ == "__main__": + main() From 71a52c355ace6203b7bf825f48d597518054d84b Mon Sep 17 00:00:00 2001 From: aslauw Date: Fri, 5 Jun 2026 00:53:21 +0200 Subject: [PATCH 02/11] Fix duplicate device entries from unstable openrazer serials openrazer intermittently returns a placeholder serial (e.g. "UNKNOWN_153200B7_0000") instead of the real one, which got saved as separate, unstable device ids. - scan.py: skip devices with an empty or "UNKNOWN_*" serial rather than minting an unstable id; the device reappears once the serial is readable - Settings.qml: auto-heal stale offline entries that match a detected device by source + name (folding config into the real id), and add a per-card delete button to remove cruft manually --- battery-wireless-devices/Settings.qml | 54 ++++++++++++++++++++++++ battery-wireless-devices/scripts/scan.py | 8 +++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/battery-wireless-devices/Settings.qml b/battery-wireless-devices/Settings.qml index 1ce363af9..db4e299c1 100644 --- a/battery-wireless-devices/Settings.qml +++ b/battery-wireless-devices/Settings.qml @@ -50,6 +50,11 @@ ColumnLayout { return { enabled: false, icon: "", iconColor: "none", ringColor: "none", launchCmd: "", name: "", type: "device" } } + function _source(id) { + var i = id.indexOf(":") + return i >= 0 ? id.substring(0, i) : id + } + // Build editDevices + deviceList from saved settings and live detection. function populateList() { var saved = (pluginApi && pluginApi.pluginSettings && pluginApi.pluginSettings.devices) ? pluginApi.pluginSettings.devices : {} @@ -70,6 +75,29 @@ ColumnLayout { merged[d.id].name = d.name merged[d.id].type = d.type } + + // Heal stale duplicates: a saved offline entry that refers to the same + // physical device as a detected one (same source + name, different id — + // e.g. an old name-based id from when the serial was unreadable). Fold + // its config into the detected id, then drop the stale entry. + var changed = false + for (var k = 0; k < live.length; k++) { + var dd = live[k] + for (var mid in merged) { + if (mid === dd.id || byId[mid]) + continue + if (root._source(mid) !== dd.source || merged[mid].name !== dd.name) + continue + if (!saved.hasOwnProperty(dd.id)) { + merged[mid].name = dd.name + merged[mid].type = dd.type + merged[dd.id] = merged[mid] + } + delete merged[mid] + changed = true + } + } + root.editDevices = merged // Ordered list for display: live devices first, then offline configured. @@ -83,6 +111,24 @@ ColumnLayout { list.push({ id: sid, name: merged[sid].name || sid, type: merged[sid].type || "device", battery: -1, charging: false, online: false }) } root.deviceList = list + + // Persist the dedup so it doesn't reappear. + if (changed && pluginApi) + commit() + } + + // Remove a device entry entirely (e.g. stale offline cruft). A still-present + // device will be re-detected with default config on the next scan. + function removeDevice(id) { + if (root.editDevices[id]) + delete root.editDevices[id] + var nl = [] + for (var i = 0; i < root.deviceList.length; i++) { + if (root.deviceList[i].id !== id) + nl.push(root.deviceList[i]) + } + root.deviceList = nl + commit() } function set(id, key, value) { @@ -231,6 +277,14 @@ ColumnLayout { : "offline" color: card.modelData.online ? Color.mPrimary : Color.mOnSurfaceVariant } + + NIconButton { + icon: "trash" + baseSize: Style.baseWidgetSize * 0.8 + tooltipText: "Remove this device" + colorFg: Color.mError + onClicked: root.removeDevice(card.modelData.id) + } } NToggle { diff --git a/battery-wireless-devices/scripts/scan.py b/battery-wireless-devices/scripts/scan.py index f2eab187b..70e174eb6 100755 --- a/battery-wireless-devices/scripts/scan.py +++ b/battery-wireless-devices/scripts/scan.py @@ -60,7 +60,13 @@ def scan_openrazer(): try: if not dev.has("battery"): continue - serial = dev.serial or dev.name + # The daemon occasionally hands back a placeholder serial like + # "UNKNOWN_153200B7_0000" (vendor/product + counter) instead of the + # real one. Those aren't stable, so skip this scan rather than mint + # an unstable id — the device reappears once the serial is readable. + serial = dev.serial + if not serial or str(serial).startswith("UNKNOWN"): + continue devices.append({ "id": "openrazer:" + str(serial), "name": dev.name, From 541f03b34b43f9d02f0cb37bf1906d5672e351e2 Mon Sep 17 00:00:00 2001 From: aslauw Date: Fri, 5 Jun 2026 00:58:01 +0200 Subject: [PATCH 03/11] Center bar pills using capsule height Size each pill to the capsule height (smaller than the full bar height) so the bar centers it, matching the core widgets, instead of filling the whole bar height. Scale the ring and device icon to the capsule height. --- battery-wireless-devices/BarWidget.qml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/battery-wireless-devices/BarWidget.qml b/battery-wireless-devices/BarWidget.qml index 9096edcc5..c276cbec9 100644 --- a/battery-wireless-devices/BarWidget.qml +++ b/battery-wireless-devices/BarWidget.qml @@ -24,6 +24,9 @@ Item { readonly property string screenName: screen ? screen.name : "" readonly property string barPosition: Settings.getBarPositionForScreen(screenName) readonly property bool isBarVertical: barPosition === "left" || barPosition === "right" + // Pills are sized to the capsule height (smaller than the full bar height) + // so the bar centers them, matching the core widgets. + readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screenName) // Live data from Main.qml. readonly property var liveDevices: (pluginApi && pluginApi.mainInstance) ? (pluginApi.mainInstance.devices || []) : [] @@ -130,7 +133,7 @@ Item { + (modelData.charging ? " ⚡" : "") implicitWidth: pillRow.implicitWidth + Style.marginM * 2 - implicitHeight: Style.barHeight + implicitHeight: root.capsuleHeight radius: Style.radiusM color: pillMouse.containsMouse ? Color.mHover : Style.capsuleColor @@ -150,7 +153,7 @@ Item { // Circular battery ring with the device icon in the centre. Item { id: ring - readonly property real size: Math.round(Style.barHeight * 0.62) + readonly property real size: Math.round(root.capsuleHeight * 0.82) implicitWidth: size implicitHeight: size Layout.alignment: Qt.AlignVCenter @@ -201,7 +204,8 @@ Item { anchors.centerIn: parent icon: pill.iconName color: pill.iconColor - pointSize: Style.fontSizeXS + applyUiScale: false // ring.size already accounts for UI scale + pointSize: Math.round(ring.size * 0.5) } } From 25762b6a37d178a68a437faf0895c1d67d0a6c8e Mon Sep 17 00:00:00 2001 From: aslauw Date: Fri, 5 Jun 2026 01:11:16 +0200 Subject: [PATCH 04/11] Add drag-and-drop reordering of devices Devices in the settings list can be reordered by dragging a grip handle; the order (top = left-most / top-most) is persisted as deviceOrder and honoured by the bar widget. Reuses the core NReorderCheckboxes pattern (absolute-positioned, uniform-height cards, reorder on release). --- battery-wireless-devices/BarWidget.qml | 7 + battery-wireless-devices/CLAUDE.md | 2 +- battery-wireless-devices/Settings.qml | 212 +++++++++++++++++++++---- battery-wireless-devices/manifest.json | 3 +- 4 files changed, 195 insertions(+), 29 deletions(-) diff --git a/battery-wireless-devices/BarWidget.qml b/battery-wireless-devices/BarWidget.qml index c276cbec9..d4e8d73dd 100644 --- a/battery-wireless-devices/BarWidget.qml +++ b/battery-wireless-devices/BarWidget.qml @@ -41,6 +41,13 @@ Item { if (cfg && cfg.enabled === true) out.push(d) } + // Order to match the settings list (top = left-most / top-most). + var order = (settings && settings.deviceOrder) ? settings.deviceOrder : [] + out.sort(function (a, b) { + var ia = order.indexOf(a.id) + var ib = order.indexOf(b.id) + return (ia < 0 ? 9999 : ia) - (ib < 0 ? 9999 : ib) + }) return out } diff --git a/battery-wireless-devices/CLAUDE.md b/battery-wireless-devices/CLAUDE.md index 49b2b3ca9..64c5cf53a 100644 --- a/battery-wireless-devices/CLAUDE.md +++ b/battery-wireless-devices/CLAUDE.md @@ -15,7 +15,7 @@ The plugin is split across three entry points plus one helper script: - **`scripts/scan.py`** — the data layer and the only place that knows how to talk to devices. It probes every supported source and prints a **normalized JSON array** on stdout: `[{ id, name, type, battery, charging, source }]`. `id` is `":"`. Each source is a `scan_()` function that swallows its own errors (missing tool → `[]`). Current sources: `scan_openrazer()` (via the `openrazer` Python client / running `openrazer-daemon`) and `scan_solaar()` (parses `solaar show`). **To add a new device source, add a `scan_*()` and append it to `SOURCES` — nothing in the QML changes.** - **`Main.qml`** (`main` entry point) — runs `scan.py` on a `Timer` (interval = `pluginSettings.refreshInterval`, default 60s), parses the JSON, and exposes the live list as `property var devices`. Also exposes `refresh()` and an `IpcHandler` (`plugin:device_battery_indicators` → `refresh`). - **`BarWidget.qml`** — reads live data from `pluginApi.mainInstance.devices` and per-device config from `pluginApi.pluginSettings.devices`. Renders one pill per device the user has **enabled**, each a device icon inside a circular battery ring (a `Canvas`). Ring colour is auto-by-level unless overridden; click runs the device's `launchCmd` via `Quickshell.execDetached`. -- **`Settings.qml`** (`settings` entry point) — lists detected + previously-configured devices and lets the user set per device: `enabled`, `icon`, `iconColor`, `ringColor`, `launchCmd`. Settings shape: `pluginSettings.devices` is a map keyed by device `id`; globals are `refreshInterval` and `showPercentage`. Edits are staged in a working copy and only committed in `saveSettings()`. +- **`Settings.qml`** (`settings` entry point) — lists detected + previously-configured devices (drag the handle to reorder; top = left-most / top-most in the bar) and lets the user set per device: `enabled`, `icon`, `iconColor`, `ringColor`, `launchCmd`. Settings shape: `pluginSettings.devices` is a map keyed by device `id`, `pluginSettings.deviceOrder` is an ordered array of ids; globals are `refreshInterval` and `showPercentage`. Edits apply **live** (debounced `commit()` rebuilds `devices` with fresh object identities so the bar's bindings re-fire); the popup's Apply button is redundant. `populateList()` also auto-heals stale duplicate entries (same source + name, different id). Data flow: `scan.py` → `Main.qml.devices` → (`pluginApi.mainInstance`) → `BarWidget`. Config flow: `Settings.qml` → `pluginSettings.devices` → `BarWidget`. diff --git a/battery-wireless-devices/Settings.qml b/battery-wireless-devices/Settings.qml index db4e299c1..cc18063b4 100644 --- a/battery-wireless-devices/Settings.qml +++ b/battery-wireless-devices/Settings.qml @@ -21,10 +21,17 @@ ColumnLayout { // the Repeater never rebuilds and loses edits. property var editDevices: ({}) - // Devices shown in the list: union of currently-detected devices and any - // previously-configured ones (so unplugged devices keep their settings). + // Devices shown in the list, in bar order: union of currently-detected + // devices and any previously-configured ones (so unplugged devices keep + // their settings). Reorderable by drag; persisted as deviceOrder. property var deviceList: [] + // Geometry for the drag-reorderable, absolutely-positioned card list. + // All cards are the same height, captured from a realized delegate. + property real cardSpacing: Style.marginS + property real cardHeight: 0 + readonly property real cardStride: cardHeight + cardSpacing + readonly property var liveDevices: (pluginApi && pluginApi.mainInstance) ? (pluginApi.mainInstance.devices || []) : [] readonly property var iconOptions: [ @@ -100,16 +107,31 @@ ColumnLayout { root.editDevices = merged - // Ordered list for display: live devices first, then offline configured. + // Build the display list honouring the saved order, appending any + // newly-detected (online first) then offline devices not yet ordered. + var order = (pluginApi && pluginApi.pluginSettings && pluginApi.pluginSettings.deviceOrder) ? pluginApi.pluginSettings.deviceOrder : [] + var seen = ({}) var list = [] - for (var j = 0; j < live.length; j++) { - var ld = live[j] - list.push({ id: ld.id, name: ld.name, type: ld.type, battery: ld.battery, charging: ld.charging, online: true }) - } - for (var sid in merged) { - if (!byId[sid]) - list.push({ id: sid, name: merged[sid].name || sid, type: merged[sid].type || "device", battery: -1, charging: false, online: false }) + var addId = function (id) { + if (seen[id] || !merged[id]) + return + seen[id] = true + var on = byId[id] + list.push({ + "id": id, + "name": on ? on.name : (merged[id].name || id), + "type": on ? on.type : (merged[id].type || "device"), + "battery": on ? on.battery : -1, + "charging": on ? on.charging : false, + "online": !!on + }) } + for (var oi = 0; oi < order.length; oi++) + addId(order[oi]) + for (var j = 0; j < live.length; j++) + addId(live[j].id) + for (var sid in merged) + addId(sid) root.deviceList = list // Persist the dedup so it doesn't reappear. @@ -131,6 +153,21 @@ ColumnLayout { commit() } + // Reorder the device list (drag-and-drop). Top = left-most in the bar. + function moveDevice(fromIndex, toIndex) { + if (fromIndex === toIndex) + return + if (fromIndex < 0 || fromIndex >= root.deviceList.length) + return + if (toIndex < 0 || toIndex >= root.deviceList.length) + return + var nl = root.deviceList.slice() + var item = nl.splice(fromIndex, 1)[0] + nl.splice(toIndex, 0, item) + root.deviceList = nl + commit() + } + function set(id, key, value) { if (!root.editDevices[id]) root.editDevices[id] = root._defaultCfg() @@ -159,9 +196,13 @@ ColumnLayout { var devices = ({}) for (var id in root.editDevices) devices[id] = Object.assign({}, root.editDevices[id]) + var order = [] + for (var j = 0; j < root.deviceList.length; j++) + order.push(root.deviceList[j].id) pluginApi.pluginSettings.refreshInterval = intervalSpin.value pluginApi.pluginSettings.showPercentage = showPctToggle.checked pluginApi.pluginSettings.devices = devices + pluginApi.pluginSettings.deviceOrder = order pluginApi.saveSettings() } @@ -233,25 +274,76 @@ ColumnLayout { Layout.fillWidth: true } - // ---- Per-device cards -------------------------------------------------- - - Repeater { - model: root.deviceList + // ---- Per-device cards (drag the handle to reorder) --------------------- - delegate: Rectangle { - id: card - required property var modelData - readonly property var cfg: root.editDevices[modelData.id] || root._defaultCfg() - // Notifiable mirror of cfg.enabled so the toggle updates live - // (editDevices is mutated in place and doesn't emit change signals). - property bool enabledLocal: cfg.enabled === true + Item { + id: cardsContainer + Layout.fillWidth: true + implicitHeight: root.deviceList.length > 0 ? root.deviceList.length * root.cardStride - root.cardSpacing : 0 + + Repeater { + id: cardsRepeater + model: root.deviceList + + delegate: Rectangle { + id: card + required property int index + required property var modelData + readonly property var cfg: root.editDevices[modelData.id] || root._defaultCfg() + // Notifiable mirror of cfg.enabled so the toggle updates live + // (editDevices is mutated in place and doesn't emit change signals). + property bool enabledLocal: cfg.enabled === true + + // Drag state + property bool dragging: false + property int dragStartIndex: -1 + property int dragTargetIndex: -1 + + width: cardsContainer.width + height: cardCol.implicitHeight + Style.marginM * 2 + onHeightChanged: if (root.cardHeight !== height) root.cardHeight = height + + radius: Style.radiusM + color: Color.mSurfaceVariant + border.width: 1 + border.color: dragging ? Color.mPrimary : Color.mOutline + z: dragging ? 10 : 0 + + // Resting position, with neighbours shifting to make room while + // another card is dragged over them. + y: { + if (card.dragging) + return card.y + var draggedIndex = -1 + var targetIndex = -1 + for (var i = 0; i < cardsRepeater.count; i++) { + var it = cardsRepeater.itemAt(i) + if (it && it.dragging) { + draggedIndex = it.dragStartIndex + targetIndex = it.dragTargetIndex + break + } + } + var stride = card.height + root.cardSpacing + if (draggedIndex !== -1 && targetIndex !== -1 && draggedIndex !== targetIndex) { + if (draggedIndex < targetIndex) { + if (card.index > draggedIndex && card.index <= targetIndex) + return (card.index - 1) * stride + } else { + if (card.index >= targetIndex && card.index < draggedIndex) + return (card.index + 1) * stride + } + } + return card.index * stride + } - Layout.fillWidth: true - implicitHeight: cardCol.implicitHeight + Style.marginM * 2 - radius: Style.radiusM - color: Color.mSurfaceVariant - border.width: 1 - border.color: Color.mOutline + Behavior on y { + enabled: !card.dragging + NumberAnimation { + duration: Style.animationNormal + easing.type: Easing.OutQuad + } + } ColumnLayout { id: cardCol @@ -263,6 +355,71 @@ ColumnLayout { Layout.fillWidth: true spacing: Style.marginS + // Drag handle + Rectangle { + id: dragHandle + Layout.preferredWidth: Style.baseWidgetSize * 0.7 + Layout.preferredHeight: Style.baseWidgetSize * 0.7 + Layout.alignment: Qt.AlignVCenter + radius: Style.iRadiusXS + color: dragMouse.containsMouse ? Color.mSurface : "transparent" + + ColumnLayout { + anchors.centerIn: parent + spacing: 3 + Repeater { + model: 3 + Rectangle { + Layout.preferredWidth: Style.baseWidgetSize * 0.45 + Layout.preferredHeight: 2 + radius: 1 + color: Color.mOutline + } + } + } + + MouseArea { + id: dragMouse + anchors.fill: parent + hoverEnabled: true + preventStealing: true + cursorShape: Qt.SizeVerCursor + z: 1000 + onPressed: mouse => { + card.dragStartIndex = card.index + card.dragTargetIndex = card.index + card.dragging = true + } + onPositionChanged: mouse => { + if (!card.dragging) + return + var dy = mouse.y - dragHandle.height / 2 + var newY = Math.max(0, Math.min(card.y + dy, cardsContainer.height - card.height)) + card.y = newY + var stride = card.height + root.cardSpacing + var t = Math.floor((newY + card.height / 2) / stride) + card.dragTargetIndex = Math.max(0, Math.min(t, cardsRepeater.count - 1)) + } + onReleased: { + var from = card.dragStartIndex + var to = card.dragTargetIndex + card.dragging = false + card.dragStartIndex = -1 + card.dragTargetIndex = -1 + if (from !== -1 && to !== -1 && from !== to) + root.moveDevice(from, to) + else + root.deviceList = root.deviceList.slice() // rebuild to snap back + } + onCanceled: { + card.dragging = false + card.dragStartIndex = -1 + card.dragTargetIndex = -1 + root.deviceList = root.deviceList.slice() + } + } + } + NText { text: card.modelData.name font.weight: Style.fontWeightBold @@ -329,6 +486,7 @@ ColumnLayout { onTextChanged: root.set(card.modelData.id, "launchCmd", text) } } + } } } } diff --git a/battery-wireless-devices/manifest.json b/battery-wireless-devices/manifest.json index 6b7102af9..e04ee996a 100644 --- a/battery-wireless-devices/manifest.json +++ b/battery-wireless-devices/manifest.json @@ -19,7 +19,8 @@ "defaultSettings": { "refreshInterval": 60, "showPercentage": false, - "devices": {} + "devices": {}, + "deviceOrder": [] } } } From 8280b289d48505690f0c547a986603e91afe3932 Mon Sep 17 00:00:00 2001 From: aslauw Date: Fri, 5 Jun 2026 01:13:29 +0200 Subject: [PATCH 05/11] Fix "show percentage" toggle not applying NToggle emits toggled(checked) without updating its own checked, so the global show-percentage value never flipped and commit() kept persisting the old value. Drive it from a notifiable showPercentageEdit property, matching the per-device toggle fix. --- battery-wireless-devices/Settings.qml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/battery-wireless-devices/Settings.qml b/battery-wireless-devices/Settings.qml index cc18063b4..4954d1c05 100644 --- a/battery-wireless-devices/Settings.qml +++ b/battery-wireless-devices/Settings.qml @@ -45,6 +45,11 @@ ColumnLayout { { key: "battery", name: "Battery" } ] + // Notifiable mirror of the global "show percentage" setting. NToggle emits + // toggled(checked) but never updates its own `checked`, so we drive it from + // this property (same reason the per-device toggle uses enabledLocal). + property bool showPercentageEdit: (pluginApi && pluginApi.pluginSettings && pluginApi.pluginSettings.showPercentage === true) + // Guards against committing during initial population. property bool initialized: false @@ -200,7 +205,7 @@ ColumnLayout { for (var j = 0; j < root.deviceList.length; j++) order.push(root.deviceList[j].id) pluginApi.pluginSettings.refreshInterval = intervalSpin.value - pluginApi.pluginSettings.showPercentage = showPctToggle.checked + pluginApi.pluginSettings.showPercentage = root.showPercentageEdit pluginApi.pluginSettings.devices = devices pluginApi.pluginSettings.deviceOrder = order pluginApi.saveSettings() @@ -223,8 +228,11 @@ ColumnLayout { Layout.fillWidth: true label: "Show percentage" description: "Display the battery percentage next to each icon." - checked: (pluginApi && pluginApi.pluginSettings && pluginApi.pluginSettings.showPercentage === true) - onToggled: root.scheduleCommit() + checked: root.showPercentageEdit + onToggled: checked => { + root.showPercentageEdit = checked + root.scheduleCommit() + } } NSpinBox { From 6d1778f597cf5d4e2975915281b65145d466e4b8 Mon Sep 17 00:00:00 2001 From: aslauw Date: Fri, 5 Jun 2026 01:20:33 +0200 Subject: [PATCH 06/11] Add togglable charging indicator New "Show charging indicator" option adds a lightning (bolt) icon next to any device that is currently charging. Persisted as showCharging and driven by a notifiable mirror property so the toggle applies live. --- battery-wireless-devices/BarWidget.qml | 12 ++++++++++++ battery-wireless-devices/Settings.qml | 14 ++++++++++++++ battery-wireless-devices/manifest.json | 1 + 3 files changed, 27 insertions(+) diff --git a/battery-wireless-devices/BarWidget.qml b/battery-wireless-devices/BarWidget.qml index d4e8d73dd..6cb1fc931 100644 --- a/battery-wireless-devices/BarWidget.qml +++ b/battery-wireless-devices/BarWidget.qml @@ -54,6 +54,9 @@ Item { readonly property bool showPercentage: pluginApi && pluginApi.pluginSettings && pluginApi.pluginSettings.showPercentage === true + readonly property bool showCharging: pluginApi && pluginApi.pluginSettings + && pluginApi.pluginSettings.showCharging === true + implicitWidth: layout.implicitWidth implicitHeight: layout.implicitHeight visible: shownDevices.length > 0 @@ -216,6 +219,15 @@ Item { } } + NIcon { + visible: root.showCharging && modelData.charging + icon: "bolt" + color: Color.mTertiary + applyUiScale: false + pointSize: Math.round(root.capsuleHeight * 0.4) + Layout.alignment: Qt.AlignVCenter + } + NText { visible: root.showPercentage && pill.battery >= 0 text: pill.battery + "%" diff --git a/battery-wireless-devices/Settings.qml b/battery-wireless-devices/Settings.qml index 4954d1c05..20f129fb1 100644 --- a/battery-wireless-devices/Settings.qml +++ b/battery-wireless-devices/Settings.qml @@ -49,6 +49,7 @@ ColumnLayout { // toggled(checked) but never updates its own `checked`, so we drive it from // this property (same reason the per-device toggle uses enabledLocal). property bool showPercentageEdit: (pluginApi && pluginApi.pluginSettings && pluginApi.pluginSettings.showPercentage === true) + property bool showChargingEdit: (pluginApi && pluginApi.pluginSettings && pluginApi.pluginSettings.showCharging === true) // Guards against committing during initial population. property bool initialized: false @@ -206,6 +207,7 @@ ColumnLayout { order.push(root.deviceList[j].id) pluginApi.pluginSettings.refreshInterval = intervalSpin.value pluginApi.pluginSettings.showPercentage = root.showPercentageEdit + pluginApi.pluginSettings.showCharging = root.showChargingEdit pluginApi.pluginSettings.devices = devices pluginApi.pluginSettings.deviceOrder = order pluginApi.saveSettings() @@ -235,6 +237,18 @@ ColumnLayout { } } + NToggle { + id: showChargingToggle + Layout.fillWidth: true + label: "Show charging indicator" + description: "Add a lightning icon next to devices that are charging." + checked: root.showChargingEdit + onToggled: checked => { + root.showChargingEdit = checked + root.scheduleCommit() + } + } + NSpinBox { id: intervalSpin Layout.fillWidth: true diff --git a/battery-wireless-devices/manifest.json b/battery-wireless-devices/manifest.json index e04ee996a..4a9127fda 100644 --- a/battery-wireless-devices/manifest.json +++ b/battery-wireless-devices/manifest.json @@ -19,6 +19,7 @@ "defaultSettings": { "refreshInterval": 60, "showPercentage": false, + "showCharging": false, "devices": {}, "deviceOrder": [] } From 89074d98ad94e3aeb628df41f34c894c4eab35dc Mon Sep 17 00:00:00 2001 From: aslauw Date: Fri, 5 Jun 2026 01:43:37 +0200 Subject: [PATCH 07/11] Add README and LICENSE; docs and cleanup pass - README.md with overview, screenshots, requirements, usage, settings reference, and how to add a new device source - MIT LICENSE - docs/ screenshots (bar + settings) - manifest author lowercased to "aslauw" - CLAUDE.md: correct the stale "data comes from BluetoothService" notes (data comes only from scripts/scan.py) - Settings.qml: fix card subtree indentation, drop unused toggle ids - BarWidget.qml: move barFontSize up with the other properties - scan.py: docstring battery is always 0-100 (never null) --- battery-wireless-devices/BarWidget.qml | 4 +- battery-wireless-devices/CLAUDE.md | 17 +- battery-wireless-devices/LICENSE | 21 ++ battery-wireless-devices/README.md | 143 ++++++++++++ battery-wireless-devices/Settings.qml | 248 ++++++++++----------- battery-wireless-devices/docs/bar.png | Bin 0 -> 5822 bytes battery-wireless-devices/docs/settings.png | Bin 0 -> 141956 bytes battery-wireless-devices/manifest.json | 2 +- battery-wireless-devices/scripts/scan.py | 2 +- 9 files changed, 298 insertions(+), 139 deletions(-) create mode 100644 battery-wireless-devices/LICENSE create mode 100644 battery-wireless-devices/README.md create mode 100644 battery-wireless-devices/docs/bar.png create mode 100644 battery-wireless-devices/docs/settings.png diff --git a/battery-wireless-devices/BarWidget.qml b/battery-wireless-devices/BarWidget.qml index 6cb1fc931..22db24954 100644 --- a/battery-wireless-devices/BarWidget.qml +++ b/battery-wireless-devices/BarWidget.qml @@ -57,6 +57,8 @@ Item { readonly property bool showCharging: pluginApi && pluginApi.pluginSettings && pluginApi.pluginSettings.showCharging === true + readonly property real barFontSize: Style.fontSizeXS + implicitWidth: layout.implicitWidth implicitHeight: layout.implicitHeight visible: shownDevices.length > 0 @@ -273,6 +275,4 @@ Item { } } } - - readonly property real barFontSize: Style.fontSizeXS } diff --git a/battery-wireless-devices/CLAUDE.md b/battery-wireless-devices/CLAUDE.md index 64c5cf53a..f2a850acf 100644 --- a/battery-wireless-devices/CLAUDE.md +++ b/battery-wireless-devices/CLAUDE.md @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## What this is -A plugin for **Noctalia** (a Quickshell-based desktop shell, `noctalia-shell`). It is pure QML loaded at runtime by the running shell — there is **no build step, no compiler, and no test framework** in this repo. The plugin's purpose is a bar widget that shows battery indicators for connected devices (mouse, keyboard, headphones, and other Bluetooth devices). +A plugin for **Noctalia** (a Quickshell-based desktop shell, `noctalia-shell`). It is pure QML loaded at runtime by the running shell — there is **no build step, no compiler, and no test framework** in this repo. The plugin's purpose is a bar widget that shows battery indicators for connected peripherals (e.g. mouse, keyboard, headphones). Device data does **not** come from any Noctalia service — it is gathered by `scripts/scan.py` (see below). Requires `minNoctaliaVersion: 3.6.0`. @@ -34,13 +34,12 @@ The shell itself runs as `qs -c noctalia-shell`. The Noctalia source (read-only, ## Imports available to plugin QML ```qml -import qs.Commons // singletons: Style, Color, Settings, I18n, Logger, Icons, Time, ShellState -import qs.Widgets // N-prefixed components: NIcon, NText, NButton, NBattery, NBox, NComboBox, ... -import qs.Services.Networking // BluetoothService, etc. -import qs.Services.SystemInfo // BatteryService, etc. (path varies by service category) +import qs.Commons // singletons: Style, Color, Settings, I18n, Logger, Icons, Time, ShellState +import qs.Widgets // N-prefixed components: NIcon, NText, NButton, NComboBox, NColorChoice, NToggle, ... +import qs.Services.UI // TooltipService, PanelService, BarService (used by BarWidget.qml) ``` -Service singletons are organized into subfolders under `Services/` (Networking, Control, Noctalia, UI, ...). Grep the shell source to find the right import path for a given service. +Service singletons live in subfolders under `Services/` (UI, Networking, Control, Noctalia, SystemInfo, ...). This plugin only uses `qs.Services.UI`; it does **not** read battery data from any service (that comes from `scan.py`). Grep the shell source to find the right import path for any other service. ## Key conventions (follow these — don't reinvent) @@ -57,11 +56,9 @@ Service singletons are organized into subfolders under `Services/` (Networking, - i18n: `tr(key, interpolations)`, `trp(key, count, interpolations)`, `hasTranslation(key)`; depend on `translationVersion` to react to language changes. - Instance references once loaded: `mainInstance`, `barWidget`, `panel`, etc. -## Bluetooth device battery (this plugin's domain) +## Where device battery data comes from -`BluetoothService` (in `Services/Networking/`) is the source of device data: -- `connectedDevices` — list of currently connected devices. -- `getBatteryPercent(device)`, `getSignalPercent(device)`, `getDeviceIcon(device)`, `getSignalIcon(device)`. +**`scripts/scan.py` only** — not `BluetoothService`, `BatteryService`, or any other Noctalia service. The script probes each supported source (`scan_openrazer()` via the openrazer Python client, `scan_solaar()` by parsing `solaar show`) and prints the normalized JSON array consumed by `Main.qml`. The devices here (Razer dongle, Logitech receiver) aren't Bluetooth, so the shell's Bluetooth/UPower services don't see them — that's the whole reason the plugin shells out to vendor tools. ## Developing & verifying changes diff --git a/battery-wireless-devices/LICENSE b/battery-wireless-devices/LICENSE new file mode 100644 index 000000000..9c6c2cdb5 --- /dev/null +++ b/battery-wireless-devices/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 aslauw + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/battery-wireless-devices/README.md b/battery-wireless-devices/README.md new file mode 100644 index 000000000..6e7ec6b23 --- /dev/null +++ b/battery-wireless-devices/README.md @@ -0,0 +1,143 @@ +# Device Battery Indicators + +A [Noctalia](https://noctalia.dev) bar widget that shows battery levels for your +connected peripherals — mouse, keyboard, headset, etc. — each as a device icon +inside a circular battery ring. + +![Bar widget](docs/bar.png) + +Battery data is gathered by a small Python script (`scripts/scan.py`) that talks +to vendor tools, so it works for devices the shell's Bluetooth/UPower services +can't see (wireless dongles, USB receivers, ...). + +> **Supported devices:** currently **Razer** (via OpenRazer) and **Logitech** +> (via Solaar). Other sources are easy to add — see +> [Adding a new device source](#adding-a-new-device-source). + +## Features + +- One pill per device: a device icon inside a circular battery ring. +- Ring colour follows the battery level by default (green → amber → red), or pick + a fixed theme colour. The icon colour is configurable too. +- Optional battery percentage and a charging (⚡) indicator. +- Per-device click command (e.g. open Polychromatic or Solaar). +- Drag-and-drop ordering; tooltips; right-click for settings / manual refresh. +- Theme- and scale-aware (uses Noctalia's `Style`/`Color`), works on horizontal + and vertical bars. + +## Requirements + +- **Noctalia** ≥ 3.6.0 +- **python3** +- Per device source (install only what you need): + - **Razer** — [OpenRazer](https://openrazer.github.io/): the running + `openrazer-daemon` and the `openrazer` Python client. + - **Logitech** — [Solaar](https://pwr-solaar.github.io/Solaar/): the `solaar` + command must be on `PATH`. + +The plugin degrades gracefully: if a tool isn't installed, that source simply +reports no devices. + +## Installation + +Clone (or symlink) this repo into Noctalia's plugin directory, using the plugin +id as the folder name: + +```sh +git clone https://github.com/aslauw/device_battery_indicator \ + ~/.config/noctalia/plugins/device_battery_indicators +``` + +Then: + +1. Enable **Device Battery Indicators** in Noctalia's plugin settings. +2. Restart the shell (`qs -c noctalia-shell`) so the new plugin is registered. +3. Add the **Device Battery Indicators** widget to a bar section + (Noctalia Settings → Bar). +4. Open the plugin's settings (see below) and enable the devices you want. + +The bar shows nothing until at least one device is enabled. + +## Usage & settings + +Open the settings from the plugin list, or right-click any of the widget's icons +→ **Settings**. + +![Settings](docs/settings.png) + +**Global options** + +| Option | Description | +| --- | --- | +| Show percentage | Show the battery % next to each icon. | +| Show charging indicator | Add a ⚡ icon next to devices that are charging. | +| Refresh interval | How often to re-scan devices, in seconds. | +| Rescan devices | Trigger an immediate scan and refresh the list. | + +**Per device** (drag the handle on the left to reorder — top = left-most / +top-most in the bar): + +| Option | Description | +| --- | --- | +| Show in bar | Whether this device appears in the bar. | +| Icon | Device icon (or *Auto* to pick one from the device type). | +| Icon color | Theme colour for the icon (*None* = theme foreground). | +| Battery ring color | Theme colour for the ring (*None* = colour by level). | +| Command on click | Shell command run on left-click (e.g. `polychromatic-controller`, `solaar`). | +| 🗑 | Remove the entry (useful for devices you no longer own). | + +Changes apply live; the popup's **Apply** button is redundant. + +You can also trigger a refresh over IPC: + +```sh +qs -c noctalia-shell ipc call plugin:device_battery_indicators refresh +``` + +## Adding a new device source + +All device discovery lives in **`scripts/scan.py`**. It probes each source and +prints a normalized JSON array on stdout — nothing in the QML needs to change to +support a new source. + +Each device object is: + +```jsonc +{ + "id": ":", // stable across runs (used as the config key) + "name": "Human readable name", + "type": "mouse|keyboard|headset|gamepad|device", // picks the default icon + "battery": 0-100, + "charging": true, + "source": "openrazer|solaar|..." +} +``` + +To add a source: + +1. Write a `scan_()` that returns a list of these dicts. **Swallow all + your own errors** (a missing tool should yield `[]`, never an exception). +2. Append it to the `SOURCES` list at the bottom of the file. + +Verify it independently: + +```sh +python3 scripts/scan.py | python3 -m json.tool +``` + +Pick a **stable** `id`: prefer a real hardware serial; avoid values that change +between reboots (the script already skips OpenRazer's placeholder `UNKNOWN_*` +serials for this reason). Detected entries whose `id` drifts are auto-merged in +the settings UI by `source` + `name`, but a stable id is always better. + +## Contributing + +Issues and pull requests are welcome — especially new `scan_()` +functions for other vendors. There's no build step or test framework: it's pure +QML loaded at runtime by Noctalia, plus the standalone Python scanner. See +[`CLAUDE.md`](CLAUDE.md) for an overview of the architecture and the Noctalia +plugin conventions. + +## License + +[MIT](LICENSE) © aslauw diff --git a/battery-wireless-devices/Settings.qml b/battery-wireless-devices/Settings.qml index 20f129fb1..598359273 100644 --- a/battery-wireless-devices/Settings.qml +++ b/battery-wireless-devices/Settings.qml @@ -226,7 +226,6 @@ ColumnLayout { } NToggle { - id: showPctToggle Layout.fillWidth: true label: "Show percentage" description: "Display the battery percentage next to each icon." @@ -238,7 +237,6 @@ ColumnLayout { } NToggle { - id: showChargingToggle Layout.fillWidth: true label: "Show charging indicator" description: "Add a lightning icon next to devices that are charging." @@ -367,148 +365,148 @@ ColumnLayout { } } - ColumnLayout { - id: cardCol - anchors.fill: parent - anchors.margins: Style.marginM - spacing: Style.marginS - - RowLayout { - Layout.fillWidth: true + ColumnLayout { + id: cardCol + anchors.fill: parent + anchors.margins: Style.marginM spacing: Style.marginS - // Drag handle - Rectangle { - id: dragHandle - Layout.preferredWidth: Style.baseWidgetSize * 0.7 - Layout.preferredHeight: Style.baseWidgetSize * 0.7 - Layout.alignment: Qt.AlignVCenter - radius: Style.iRadiusXS - color: dragMouse.containsMouse ? Color.mSurface : "transparent" - - ColumnLayout { - anchors.centerIn: parent - spacing: 3 - Repeater { - model: 3 - Rectangle { - Layout.preferredWidth: Style.baseWidgetSize * 0.45 - Layout.preferredHeight: 2 - radius: 1 - color: Color.mOutline + RowLayout { + Layout.fillWidth: true + spacing: Style.marginS + + // Drag handle + Rectangle { + id: dragHandle + Layout.preferredWidth: Style.baseWidgetSize * 0.7 + Layout.preferredHeight: Style.baseWidgetSize * 0.7 + Layout.alignment: Qt.AlignVCenter + radius: Style.iRadiusXS + color: dragMouse.containsMouse ? Color.mSurface : "transparent" + + ColumnLayout { + anchors.centerIn: parent + spacing: 3 + Repeater { + model: 3 + Rectangle { + Layout.preferredWidth: Style.baseWidgetSize * 0.45 + Layout.preferredHeight: 2 + radius: 1 + color: Color.mOutline + } } } - } - MouseArea { - id: dragMouse - anchors.fill: parent - hoverEnabled: true - preventStealing: true - cursorShape: Qt.SizeVerCursor - z: 1000 - onPressed: mouse => { - card.dragStartIndex = card.index - card.dragTargetIndex = card.index - card.dragging = true - } - onPositionChanged: mouse => { - if (!card.dragging) - return - var dy = mouse.y - dragHandle.height / 2 - var newY = Math.max(0, Math.min(card.y + dy, cardsContainer.height - card.height)) - card.y = newY - var stride = card.height + root.cardSpacing - var t = Math.floor((newY + card.height / 2) / stride) - card.dragTargetIndex = Math.max(0, Math.min(t, cardsRepeater.count - 1)) - } - onReleased: { - var from = card.dragStartIndex - var to = card.dragTargetIndex - card.dragging = false - card.dragStartIndex = -1 - card.dragTargetIndex = -1 - if (from !== -1 && to !== -1 && from !== to) - root.moveDevice(from, to) - else - root.deviceList = root.deviceList.slice() // rebuild to snap back - } - onCanceled: { - card.dragging = false - card.dragStartIndex = -1 - card.dragTargetIndex = -1 - root.deviceList = root.deviceList.slice() + MouseArea { + id: dragMouse + anchors.fill: parent + hoverEnabled: true + preventStealing: true + cursorShape: Qt.SizeVerCursor + z: 1000 + onPressed: mouse => { + card.dragStartIndex = card.index + card.dragTargetIndex = card.index + card.dragging = true + } + onPositionChanged: mouse => { + if (!card.dragging) + return + var dy = mouse.y - dragHandle.height / 2 + var newY = Math.max(0, Math.min(card.y + dy, cardsContainer.height - card.height)) + card.y = newY + var stride = card.height + root.cardSpacing + var t = Math.floor((newY + card.height / 2) / stride) + card.dragTargetIndex = Math.max(0, Math.min(t, cardsRepeater.count - 1)) + } + onReleased: { + var from = card.dragStartIndex + var to = card.dragTargetIndex + card.dragging = false + card.dragStartIndex = -1 + card.dragTargetIndex = -1 + if (from !== -1 && to !== -1 && from !== to) + root.moveDevice(from, to) + else + root.deviceList = root.deviceList.slice() // rebuild to snap back + } + onCanceled: { + card.dragging = false + card.dragStartIndex = -1 + card.dragTargetIndex = -1 + root.deviceList = root.deviceList.slice() + } } } + + NText { + text: card.modelData.name + font.weight: Style.fontWeightBold + color: Color.mOnSurface + Layout.fillWidth: true + elide: Text.ElideRight + } + NText { + text: card.modelData.online + ? (card.modelData.battery >= 0 ? card.modelData.battery + "%" : "—") + + (card.modelData.charging ? " ⚡" : "") + : "offline" + color: card.modelData.online ? Color.mPrimary : Color.mOnSurfaceVariant + } + + NIconButton { + icon: "trash" + baseSize: Style.baseWidgetSize * 0.8 + tooltipText: "Remove this device" + colorFg: Color.mError + onClicked: root.removeDevice(card.modelData.id) + } } - NText { - text: card.modelData.name - font.weight: Style.fontWeightBold - color: Color.mOnSurface + NToggle { Layout.fillWidth: true - elide: Text.ElideRight - } - NText { - text: card.modelData.online - ? (card.modelData.battery >= 0 ? card.modelData.battery + "%" : "—") - + (card.modelData.charging ? " ⚡" : "") - : "offline" - color: card.modelData.online ? Color.mPrimary : Color.mOnSurfaceVariant + label: "Show in bar" + checked: card.enabledLocal + onToggled: checked => { + card.enabledLocal = checked + root.set(card.modelData.id, "enabled", checked) + } } - NIconButton { - icon: "trash" - baseSize: Style.baseWidgetSize * 0.8 - tooltipText: "Remove this device" - colorFg: Color.mError - onClicked: root.removeDevice(card.modelData.id) + NComboBox { + Layout.fillWidth: true + label: "Icon" + model: root.iconOptions + currentKey: card.cfg.icon || "" + onSelected: key => root.set(card.modelData.id, "icon", key) } - } - NToggle { - Layout.fillWidth: true - label: "Show in bar" - checked: card.enabledLocal - onToggled: checked => { - card.enabledLocal = checked - root.set(card.modelData.id, "enabled", checked) + NColorChoice { + Layout.fillWidth: true + label: "Icon color" + description: "None uses the theme foreground." + currentKey: card.cfg.iconColor || "none" + onSelected: key => root.set(card.modelData.id, "iconColor", key) } - } - - NComboBox { - Layout.fillWidth: true - label: "Icon" - model: root.iconOptions - currentKey: card.cfg.icon || "" - onSelected: key => root.set(card.modelData.id, "icon", key) - } - NColorChoice { - Layout.fillWidth: true - label: "Icon color" - description: "None uses the theme foreground." - currentKey: card.cfg.iconColor || "none" - onSelected: key => root.set(card.modelData.id, "iconColor", key) - } - - NColorChoice { - Layout.fillWidth: true - label: "Battery ring color" - description: "None colours by battery level." - currentKey: card.cfg.ringColor || "none" - onSelected: key => root.set(card.modelData.id, "ringColor", key) - } + NColorChoice { + Layout.fillWidth: true + label: "Battery ring color" + description: "None colours by battery level." + currentKey: card.cfg.ringColor || "none" + onSelected: key => root.set(card.modelData.id, "ringColor", key) + } - NTextInput { - Layout.fillWidth: true - label: "Command on click" - text: card.cfg.launchCmd || "" - placeholderText: "e.g. polychromatic-controller / solaar" - onTextChanged: root.set(card.modelData.id, "launchCmd", text) + NTextInput { + Layout.fillWidth: true + label: "Command on click" + text: card.cfg.launchCmd || "" + placeholderText: "e.g. polychromatic-controller / solaar" + onTextChanged: root.set(card.modelData.id, "launchCmd", text) + } } } - } } } } diff --git a/battery-wireless-devices/docs/bar.png b/battery-wireless-devices/docs/bar.png new file mode 100644 index 0000000000000000000000000000000000000000..de9b5cd30692848a6ad876bc34374648a842a7de GIT binary patch literal 5822 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 z znfxALZ8rCJZbuH>;=oRJZEb~JW3WBP>*^B7AOz`FO5?aJ5=trzC_SLT4Qs2d9p&PZ zz=b<+>`)P`#_F0Hl$o~v#h-33r?*4`DqG)TlQ6&e`_mRGw9PjHvB;iFiikX>TtE4k zr@ixt0|I5M?gv0(`~8pa92^=}Q8u8-%~D(`Q82R*8KIo9eLlf0@1n%=|06s__F>G9 z$audnTPGA3t4J#L0DzaTQ`7hQ>jQs-Lq|tq4l6KTnJh7gh>p$}hpW1H90!K?TzQ_) zq^!Y1VWqOOa7@)$WWr_+peLP|-T}pVld8Tz%hX2zZ1I43f>ulH>gvZDQp6jIlVf9u z;F~v+xu?CaO034q@NS|r##EV2*FqHR*(DF|qYVAed3bCvMs(D4Yi45{D!D5~bae() z2VbwfMw$6@Qk=bFF4WMlzPoEX*UX?>J@RK@ptl#cLUm8^c(i{50du}g3FNu#0tLTB zhVv(@-tO9&b$)poHkA0H(DEeF%?XVh9fyo}K49e%H1EHD?$m9<@c_1c=!jt;<;%B% zx};_&Md|?C`y(s2)4Y6f1NQL!3fnyhiEAMdUx}cG3v7}Lwt(JNNaT)+ zjAXOf)X7%mwrN1khDF$pfF&a_t}cKowQskqr)xc6H#0IbE4Od^d~pM(6}Qr+n=D)P z!M%I>+8W>ucci)W5n_e+cp{n+=~gdaTUz%ww)W|?d>!X}TK4@1jlg5NHC<@~dA%o9 z2`zbBhRtD{ZX07Y+Trp*QE4bEYn9qHg{)kzaasa~QfU(B8*t@(o9HG2_QBd!rtJQ3 z@9yh^gKAr&W>jw|{*)QHLHwxhIP|H(mzR$(;C}?EdrmBuWr?u+{5Mf$cTF4t<3F`yGkgr8WyUnE*$;Vn_ zFKSHXJi(#*XH^9@*>gn^5zAkLqc5+S?B?8riEJQBybK+ajps_V)UFd!K}V*llno$8Gm*2_p}j!fi9k%K9Wp ziAYLY*K#(_zWJ$>53@@`qQ%6FQ{eJRL>mCA07wQ(B8U|OVbVjE9qh~0uRj!NqdZwj z$|&&zgMxy#hX)y4r=Y-D^qCd;RxJ~rNzcH*&cb3|PD0?1acR<2{n7j^-)L(JbFq8N zzzSk!ZPkKeGAj=c55T!;qoU_G3gp@iaFtuDpLAn{>lu z;pLUdlQ(OtcoeC4kJF}W>U26B%C}Z}x+}su9^NBYh_0R5bMrxZqL87k{&rj29hHj< zkLsFotI>A`Bau%d$}K0Uykc4`uG(^rJVMBu-$)9Lxnr?v(%{$1$vfKH+pmttG$^8a zA0Hq0_4SPwd#(=`B&YlR3$Db<7@}nTYkfGr8nzZU}9UEKyldS?Zx5Nudnh%{&Bo|QFniGGmeH^pf`#~WV3%Q9d+;P`( zW{-#I2FykJ4F6^g|NMl3eKV)6I!~Y;!QxKvkr5@u%P+F@;TZ2%Y(Do-Q<`OFgb~e! zlK(xa5iES6yqE1ZPtM5lnl{Jzh;$QR?*&T^gn4kFO1bXcFX4Yjc#};Rns;avI|AwU zxwuD9@k@l6^BFrk3*7tgBt6}HW#zvRY&|Tvckhx)8PqS0OG=~EG;(@Bhm~_8^NWj& zx@GHs7i6T`NXw??VeahE6;)K+uMH5U%FW7h-%MGc&5f@^K&X6vEu!srypz5HCEkuR zFT751{n1OJjJ&)-C0CpPU(V02qerg~qO0P0E)Bb?D>CJifsjOzo9%Zp+_8~R(9j_J z#z5bR;@zsPLuNqGe>v&(1^hzTcmD zv^Lz`_v>$r!&=?XlCo_*72Khk{{Oi}Wi1WwYFFTF)kOzpn z{7mNh*C*?6QvtVqd;)^ZGXYQtpbBxn#iI_@IY6V=xcI5dI@>0g?g zpBy{S+3uJtGXE2#^&6XOj*LCWTE8+G?FbI?wVCejXr-im`gw3r63b+LZhDg_P*Pc) zA~*L=6h2(ElRW97sHeKl{G-kPZf8MY7h5nkL|?&;I!p`3uL5aMl1p2M)huOU6lXzZN5BhViM)y6ZX={mAkn) zIXL88mBu?13=DZ9XYn^st8e0NNk@U$0Ah{?W7gzr*H8rEh6W)apOh4Xr3z1hH!}l) zcL6Av+@nhZ-;(S!+uO;|o`Ddf+P3jJccSNc>mB5{Oo4}#_q^q+5E}R(wG+@GUz1uo z{&W>FKii_YV2bC^t#OYPPit#An(GF`!W#<7i?|4QnLzg$j7_$?6lAdm&M*qZE#`ixKV7g|j&N!v9{<6Y+WqsGq7H+uW z#|Ht_kEbv9whctUM@5QK*+k9c&35sc*W{;Z+go0vu0Qm1`RX=DiAhN}IGbQ?1x%0Z z)9wzQVBY&Vfy?<`xG@Pt&?tiYXSN{_+DQimA=_X@p!c)itovJfrUDV?P;2YW$G4SL zRG4(CN1|v+dF`_R6R{YeVFkOt^TqlU0r3jA8Q=XkOnUFp1asRQ^;?>|VgRgUt6a`F>cRy&ZDQ|#VC5m z%eNL8UohKrk;q|(zDrGw$dp%8SBG0>T()d931aY>^eQb6!=4SYvsqZ=fLe0)Oyjb; zy}!|D;-@WKF48gk9`0hUwwJo>nW~D!$6{s^Vt(fyMg(M$xc}szG4gANQV>NHGEp#7 z6k0{(GK7dyutcV#3b`NWHf-kmFPg&R(wm+nPF(!DiT-X?1Iz1t+BZxz#s*d+FAh-g zH?E%BgUfya({yj)5y;$;mu*ERvrPJ)tbG3}BfnY)1{{77Wg0N*M_&w$Vus~U!{StC zt73CTMczjZ;_3M=MM}+?p0>RAzcyJNpB&L|-Ch|tX7kK_#;Yw!-)WEdfnH4zFiL#` z0|`8t6(aPktg9Uu)u&6zw*qfLlIGw*a$)V-5kr3s+NPgFsAK_-6#$|BvgfM04D~K+ zG2(s9_00D63frv$lqB zMlMPbasRcxr+#)(0`?Y~^1a!V{8XR;RR?0f$?v5u4{B+-x^}G0*6HcE3+u$UbU=mZ za_%?9oy?o`DJ|X6>J}Dq za$i#iCo^LI|KowvPp*lLR_I4h_Dp;~nn7U=RQ;0|<59inrp;RT0{$pP>EVyXwqmUr znW!D7-{Z1RVMvrAc=kDp1wQbnD+A^1NZE{+$mE8br{*ns-Nc~Jtd0iZvb0UDlp&Iq zSAxPRKR?o$&m6s3W^bNWkn+3Zcx7NMZc6Pm8TTOmzbfT1>Q{J@PYmNIE;`he)gc#V zi5z`m!fvu~yp0_q`CE%VneuM%lj`d%nR@LuY-J@x>?ZHB)sEhOX#IJQNd_aBJJvY= zVi~SyxP>m9J9?!R2f$Tepp+KekbXf(82xl>%Hd+7^1eN>fGui4l7@;(T3%XOYK~U7 zl~)Qq($i-sx0?uSl5T`RS3pz-SU1+#?~^OuRbV;tL6mCeYWlk-kOQXY&-?4^A3nZ# zmNcBvzp_ZUxcfx5jtjV6UwuRbR5 ziAMm|1HR6JDv$1x_nddalA`emcepPe1E%$QsdktNg}7j%+Thiz0c$d>M)Asu>{3ql z)Q%r1^rS;(iA3RoyZ4{@OH!cL`+J9i0B(bx<<8#yXBm@Cg(VL5vVUZG1PEhgr)r$K z0gU6%_0I$Eqqp4!9iCbz?0)ASSfQ{vVvlW7N3>;ZY0#hP5cvb5400V$^?a#X702^R z?E^Y82g{CuiIBs~7{XBbqy58X?#s}@pwC6S_qcdRMiL;mIUhVeTm-o6KImnt2$#$m@9v24LKG}y1x2*Z&#ailHO0#+zqyJ^Y=f5&D z!4^z`0uMS2SrKfYWo@iHP}3iN@Ttw1c=+O1?vjVxBd=ugr9V=#vNZHGmZj4bUINqE zD)+h)kHQA$!Hn+K&W?lr&JRgCV^)`?f-1PuVC=>2lQq4ML|mx_#r@zdSf}Q3$-q-) ziMHO~c6**UhsF#|ut&dqwCPFB^+S!5^T5gbIXR6j&bZ`riSf}&P5D`d#VE{jqzn!W z3=x~rNPTuTcGVU0Q`(H`5`2LP>e7#dzPdV))eYpfLi;p{-&T2Q+zlbog&ssUAvqms1>i!&VF`+l-|rH-YwwVnn-vlY+GEG%9F5_uix!Izl$ za$6ZeP4m&@7{)xUy*;4jTRxK8yf#$_Tx(~7>--(R?e4d}&!3AkyMBh*IlWomqhWq? z{yVT8EB)K=Z(w*b>!GMVH00TzLHm@hMO4fH{ZD=U_HbgA*3jE_RRP9KoUll+Cj+xx zxItoZXjnpA6pk#>hqp6i4>l$TY(AmGBJk@s<#!2 zHd0^TvmK!MZ1?T%ap*Z&83$x7%|nN}yW=oWbE9rt&qLy$3jxME7mb7~mi)VEXnTLh z(bg7ZJun*pioRQZ{|=k`{0C5X;RWtrCRQ;V9WD17fdQ{961i`4fLT zE$P*hVzX;Bm2Z@A7rw4-_otVAY_c;cdn*6f6pz2y_x1$WVvs|H|iMzPmLYD(I0Nd_K-9@E_ zC%1IFbiTED}`&p79d!FXc8R`ymi4UjR;Y#L&S{G1vp_+(J`ANrVbjcW+eacb=$@it z#qx4HJ+Y`i4)+wP*Ay+Cp|vO^BqaLP&k|)bk)K?shJE=c=|5$3ZtlYU`Pqn(UHSsX z^8$7a3b_#YqB;0^AAe3yTc=v&Wm`+8cIZx->e_u%;_6X>^5>1utFRoV7P$NB@@+n~ z86k@+t3{f9;`y&~3kwUHd`QK~m=2iti%ONNo!27&eEC_LZbCxxXTLFMH?KIjMO&PN zYuTjFX)5r&$CV@EF)mPKrTV8MacvUgM=R@WI14Rc%?k-}iax$AL`p$;WIi5sIQV6- zdjN!M(26;-n-izZ$k5C$OM%1!NS75t5ReXoBn6-YPt$ z5z#fpm%4|CE9!$4C?TOUtP28EKsren5ut2jLPtg8M1p5%G$5_4T)B4hKvy@#G-%?I zYY4v4IjL6$CDl{48f}AoFti~bLFx^mWH91>>i-qZ;0(lE4y(z@^L(2LbI~YM!}tOuhZa+eq-Ss{TujjpW+8O`D1pQT5hqY zWKWc`yC+W04v)e{s}II4g_?sZ52_EYAm^?;R8)~!S#4hqmEEu6DiwWdNtI4{^GQXU zUg2{cFGDwgxw&gS<*VCiXef^yk+^+6 z{Wl0t;A~d8WsZvP8^+g!oYq;w>1=kVmk}%yHb&N0Th_nVc;8;7QOe&9@|IpDUR}|V zN>)jCxMFpk<_;c-HS?4hAgyK%q<@HthR`VSIenR@4ug%cy}cdOZ7^YNKWZspyn2hPLAFPYjSpM4Zuryb+XWvr#gV0~)4 z!fcqs<4=*K=`BNj=f-7^Dx$YqT1M9#-fBH{dis3BxKRQ9bA1C_u&)#?=H&a-^jiKoMU~kGLn*e zamMey#ZiV1Ri7d1(}%Y4x7XB0>$Vald)?vgkR0glE8VPfZkGY!FD%``y?$u9(mxoc0BXr(NTXxRJ9kx~z;rF>?goPsrmG-%6qluE{AZ2m zvaT^Kdwctdc4Y}UrJKm-y3brSHLo7fVG}dSWXoi$l>>GsDTRDvwDNhG<-*7fprXWv zF`{lp*8xZ*g59V@E|C+pJ-cYG<-s?VezyxdlM^(-rKQY5{=F;p^JY)3?Q*;9kFFC} zB4pg$=O-TA_Vx~MPIb?17yXALBKm64SCK9AEtgL&_Skm2gRlDfWFz}c$%G2X=uFS% zeMm^wre{n%JUvd!=WyM~j`{iVAK(K33gfbLBru#&E8}Os#+|yJi$M+pyM_ua-NFWV z$6dkl6B|lhQj(uvP(pFz3ByxPuh6@eTT=CJn_FA@dS)*1{LWUM)0yk#V~eh_IJ&7O z$Alan*%(gLh5l6oQh5B$w7!h;orQ;lge2^QeZ>woZsfk4CydL`tF|kQ2{B!m8(LCq zyn=YBi0QnBxVM;UhqHV;sy9NV0_=XU#WA(1)ey6ll~9C@d||E7^q_y=8H z6I%Bc?SBth&=dm&H{4{5dJQ2}SfYd@rLmRquiDu)EdSOyxZ>~?z7!sS`2-sqyFoKQ zxLDR)@)b%WyQDl4qeoGWto`5HKcvLl)l#0o-9~6-CLU| zni%ZZqN3P{Ke?i$WS#xdWd`8$6&JrjVY3Mh4~<~*=r;DKre0_gN=lf(Nrn7!U~0Pg zhWVzLseMLN5dc>de7<}Ks}R>hfweJnB{5ZT{hy+DgvSIc=dpm zALr}tma)2w#A46*!Up%FH=#<3${0Kr7K!_6?AILJ$o7ey(Uvf5p8d4D zxp@*!t3xQpX-KaN1yGwn7;@mQL-j`Fm z5ZC3BpvWK*8anD1X67h^srx+s%)oaWr=F{N-&y#;hyT{feKl#-vARw_CAS&d&hhHb z7%ox&%j2V^+`PB{P0PPETj-de4s)5EoH{IHDgRJ%@~fu*&%4`7zX+3_6-b6I%I(8i z_zI8b?DuBCWnRV)UhO5boa!Qhj8$Ew1bd?IT=x4KW}0egWjA+#Du&|=e|bXzfavb zE5XkTX4-Gx{(js3hQ>TjX^ij1OSW+9?MKGIcb3hOYqjAzQ7r^rwa zoRySRR2X*uZ24SQS0P(5Duj0#;W)Rdt^%ae(5_`pA0Fb$eL@gKx=efpgl3%Q4zPHG zZy?fTg3+dtdRg6CS8mo-5P8u?XJu*AbAgRvcW_Y6opXbxw}1dB2avp?qSvn(KS@WRnZWToX57Mkwg+Ir7H;>Vj>S-OKDL`|w=YGYmDWY;NHM02W{0)j5Uw2*EE zc0T%uHK&}Qm>3gXlN>57L*0a9wjnd#4*$1k`S``NzFVjDMyLA)v7Z{TO%!kjb`h=gu`A~4& zR-&VO8ZVH%zP>&^m73`mQczHEhRGHj8X~#(6F>C&6+Rf3BDR5n75Y=1I?2hzY==x) zUWO~0uazQv2tZ;)wP})r+WFx24lrfCBeZujw&2a=Ui8=$=17*tkxxhd1AE;$HvsnCY^Ca?JS?5*FK!q9{?5j-6KzA$Rt? zz4TU8R8%4kDGnCSa2d){=Y4WwP|&6#^P-kyQ-z1;X^oDSkhynZrqSH3F`}OCZhkGT z&|D?O=lBk`W#84EpIf}WVZH?>b=4A!_x8hgjf_U%#Oo=K6B!)TzH$fex31;An@6BT zQ${Ved;64gSRHOo^yjp+wdL8Ey`ZF?Hj5Ct`qMJC^WE-RrS;5)9V;tLhf1fXaY;F> zI4BKw2lI&mg+;WZKd|0hSHIV7&vcR;T-BX^_xaoU-_8>SFWDKs^QS^!U3(N775nwN zI9=|>JWX?ZOS#$ls9sO4u#gx;)jWIlte)S;3S~q0l6JgSFE=M}w`jLRwUS!7{8H0a ztcyySWs@)KL>uJi1*y;;>~GbWuPK>pB;Ip4oQx07bQwEcAniM)bP({eU+Uo^^Ez0= z1??M@RI6>&Op(S5AJ1E6(_uqxEPfP}B4%!BGf}#*K(RI8-LTLR1(SrYv9-0r$**6( zKDPSXtLn0$aB$*TYrWPyHAg^5FgQ3Q2Iq!<{=A?;0V$9QXHItX*jA&l%(I4PO4<8f z>iBX$Lsu#u)Vx?S?-n4%RViD1;N+AeoZcOMsGF3EO~Pi?Rqzb!>P#qUY>fZQ``=DS ztEQd`46+Zhv$8>xfpMgc_pv6W4uI}%K=G% zgp9IsP^&}CdB)*sQLhZecSTj%YEa^tN56Y<`{z#%QVaEoUvX7gQJo97uJGX~=jO$^ zhDM9t{sRbJS;Jud>~dRlRi&2~sERx+7XX=c80^SvEDG9ZL}6qwiCd_%wf))kX>_%N zMY&35ANg~N(2$?sR+d5Yn-;>LbvFo<%D}#d!bK+I3m>nVNsfnyj}$2Icnt==j*DUd4AT< zyduEjH3o}fv58FRYF5@Yn+*+?G}-0Zq*;*%v`nlGAHLQG$3}|aX=`Xq4N2==E-wDW zlnUntuO>_ctLd4hP<2sFTpZbB+89Inuhm2+lW5F%o-p`x!`t8;EN4)TEs|fP4jmm? zvH66yS316=NKl^`6nVuL|FuOsMh~ z$nWoio6_Z@1E;SGYRKeBzI$kCsdv74wuIS%9N+tf zTB~f#rY+y-Q;y+c2By~#o?7EXH8tkL@STh%FFzl)Ev7dNn67O^X-)f>rNu^mwaa+x=kZrp(`~ZlvaJ~?>2*;4pemz*%agn(p*9HUvzMAJy?q~&>!#m=@b3Fk5G+qbu8YrVx%3-?$cij-Gxl4ZZ9 z{wVIw<@ElvKFVM|iUEDb+)6tJc^siY;6QyP@w!WJ8_Ws>-A`vLuT1196mJKkrdUk0 zv@nrZ`JuHN)vo~JNrni$!-V-d4jrBHmIYUi#KQmX2Ru~irjRPXms%vDvR zC3=tBBRkb1nM@@qgIRplIcz!_8z~r*ns&~n4i~!;pW5$rGc$s@- zR#gt$*v*Hn+$eEPCFsk$4PR7}z;x0!^EsAwh(+Y1VdE6+D;!o42?533qfPG2dRjOMYZZc!nFMJN&Q^)&esKRMao+25bCC`Ub+ zY6uGh;93#d7_NMMo#w0d?5uX`wgx^)+4mk*YWp=$4YgQQIBDf4TKbAhDpEYv(`8DQ zrPM{LnXbFt_HO81y5~{%k!Y}TU}PjxX=QEcVb^ob&T*$l%%{Gex)|rwa%ot#9&nJBX@?TqaQcPyTIAM z6V6wV5)y}hai5ztjuX9FC#&ZSd!J3Bk{ZY$mR`1r~GY9l=sa?Jlu;xo7)aS%R- z-N7RBr*Ju$wsuxn4F5C>NvF)t&R^o`%rm=tH)zEi4)My3Q)bA=rEhZrI3$1Qvy!r` zP9|KWm9dF71AKf$g@uJts5e1%hbw-@Dzx$s3`1#E9i5!yvmEzs(7KV4-s7Yl=xDid zJs}}UhW4%9ifHqS&bGZ`wG2#Emlx;NfIVn6th0 zo0*l|>gsBtz^GS7)(8Lo6|XQOzlzeOiHL{*Z_0gkYMEj8>HIThtTTFOo+c7?KS#L` zQc}HeN!7~jWhnz38T5R;DzEY0Ru_vM=VY|%326tC*Fr2vvM_(eeRfC4D3=xd^75Q9 zuTra*YYxP4V%LKiVK*QxQJVW`_nj3Z0u*{!#fr9dEb>Z0g{OMBBVIV)hJVuo`B&@W z!W5}0Exj|e5PSDB2EuN=cDh^G$#rsS>A}Yfz118A-o!2dDA^0Z;b4NBhBLZ;>U6i~ zw`X6DdZDLSD!1eAB4q2q7V9k}gwT_{4pdrMTogRJ&SFn}6Ol1Q?Jh}YI-j7LH>d6d z1RShSTyxcU>zSvRB}Z}vKH5u^D1*L?zXh*HfB#+JJHKDs+uinZw9kZySqU(Z^o z*JHp408Xyh+?CKYi5H~LxO}+(O-z7_2`M=%R#j5RMNanD)GKvS0uwk88b1*3LH6}d zqQFYdT@qFcMtZVekO}zr@3+nc>D)+=KG?6Z$$lI=#zuf@s7Ni>HaD1~S^+6xZ=XJG zxTWV0r1re5wNFKcvZ!aVhE6=_$ARRTR7d#za{bm!M^&RCx0qe#Za2{{w>P(T#&Q@F z?h&_tqzAVnLdL>!Xu|iqCy)gP>D|VM&tX~WL1a4<(`yhB`jdz*=hMRuo;?Dm#DYJ) zf3)Ye=eV8E&(^CQAew$;vpyg^T!>R5v+rhdU}ma7Vr`?35e)Kr-81xz{zU&xHVdIaB(Y=24j@_qUW%@ZLh32CF1kER+rvh53{5(VLO zPXG0Np&dv(S~}6*hx&bJ?y$e^esvgD!^>f+kjDYN#miHe3-Q48uUC_8NOj&#t z>4;$u4G7=b3+;hTAw4&j+hIP-w}u!J1Nr4Y$UOgKXOnwEEm!YP zqZ$nropgF11l9cc^DbMeJ%VAu=czPhu$1>7$lIX^s?LfT9j&sPprvPcqgr4qq@XXT zuYdh}i-ghm+k>9K?$^t8U1?es`Ry3t(Ygb@d9NE#Y!1VS6n*pD!O z)nHy@G8w)MjxJHh6Z5Cnw`m^|J`5oL`X05x?te~^pVra*r}tm8Ai3>Qxv)V%|J-|49w>>2>J`<#gVUEs0<+t0S5<8 z&T4CtwUiGLr((V!Yqn|p)vO>#=QJV7r~~m8dPX8|{xHt2u8y+4P#D1Jrf6PHzRKT7 zb5B3LJguZ;eB zuE;t3Rr8%Ey68d?H;Zz|x!g=7PS5tx6@B(7gxdvOC7f)(MPpZa-L33=QbS+RFYec` zyG;qmjN8A^;-wo?5lN1`T5k6j`6A@`m_$*G_yB?ob4kuWS&5k-l)gqmM?r za43@5WOr-7KkzbkJus2=To~jbTcn9aSxAnK;nf@Cc%H=7XCZ>q)245T9KIJZ-I@4KU#sqWcth0TQ6*)!+_-A`|({NKSNZ$d3RwqIBcLX5tt8D5Q2&lp%1Sz zDEzmWKf{kjitcj7fa$c7PfA+Z;dJtMnVAJZy+1kLeZ|16RmchhdN3k1iABXRRhN zyWkn*L2iRJ4i1!r{@x{tu*L3jhP~hYy&UIpF6g;X(AMu9 ztRzWL=1!F5TMpzr`|kYeHDmXEI8knD8pAruLh!*;Zfv;DhwT7s1;5Lor&DBH=N&z2 zTN`)@*pHZ*R9I~GsZHr}k8a_UCnp`+EEk!yM+`CO<=D0F_>?A`F9sa*dp@^bHPNxl zR%-wFTIq!=l+T|Gx0y8Gf-}!$>cKsQU#;=$w~ZAC#yOkX54R`hjd5p8stYzBL7F}5 zU1BFdn^J@?y_1mvBJ1f!O=1k}sr@Z2=Cfh1dZoq1J2(GHFj($Ta-D;+5e)Dfw0t7$ zBS*C~;#E$}%em3nFa2i9MA-d)3iw5;QsG_iI=#sHFr7w84a9CR!qVH8TPv3?1ADq* z0T^Gezw5k)d+*y9tj3rb*Msm{-u-eYi9 z_#7=4_WyL5YyDpE03@L7cL;`^RtMCHMo$;&9}H8E)9UFhpaTNnvuDY(*=Vp_m$6#oKn|6C++<0~& z_H<`>9KHGze*5c)K44k#tQy(RBhF5H#F4m?66^8OiL2MHI&q#+0R`HAO-U6acAqOz z!1r%+vwm6dJL;1BlBI!MI=@h9S=qfEy6@wtD8#jAiNH7Dk8;`Bjf0o|mwt_94oq~ZLC6KfXVa>b*-rj@i~vMf%-0w5_(1*qWTQf;&}6)d)v@;lSL{Tx z<%2O#cI)+RgN@3=1$D%g>}yq36{+)aI+%@!8*U&a9b%U9w033;=-C{n^D3tQ&amV6 zGs=xlf6(0sEOS|#uN=G*+NzVUpvc;};QzN{>f#BDiBYR(ojaoYQ6bZ^;P;4oe6V@2 zad^0W%y@hhrj5=!Yq%4&-^nn34cEm8tHP~jhgy>3xi~M+icYeONBBO1+v(2bJ4E=~ zz6GH&lprOEc4re1;3md<%)%l_2~9F7B<=11D=XXbO?Ea`?-%v0&y;U7Oy%X9eNr$L4$Ae`bX@~vNf>SEf&14ON#(6We`A4`Y=K_$ct}T^bf+~D2 ze=n4yVvlg9tr|a&+??nUmsJ`#K4EAGm}&ciAEBbUx~Z;if4SwtRK4f8%O)ARzjFCeIPB5EQQgPeSXbRM zbI%Jt+uygiQZaGymWzvb_VI6C-j@52aJT{X&OdOz`|-o)4{93V$uVEKhOB}EAX$XN zZ1Z2ZrC$0Rv^hH3!XL-SL)3((_bg~1M3qYyBmR!FHTr=i9dki-KEEWFCLoQ z_PT~EO>rd|$4=L}uls8J5lJzsi)nY*Q_38F${=#f?MtAWo9;kDWiY5%$G;?rB{lWA zzy`Bd(0c`;nN7u|M`5^<$g4{|H-r_|n$Ga+foG<=$~LX7y&X0&7d8D036a~UHbd%# zYZ3cH&rR0X!{$#>e?POeC0Bs89g$Ak{J zQ>tVIs76Xmd?G6&eX^m+S{zgulo&LV$!zq#*m{5eyebCw-MfjJ+^Am_-hN(KY9$sP zK5Oht?~35Cd#eVzbiJqe8U*`W{*OQ4uQ*+EJH2*CDIr2#=aZqZUJ+v;_4d_8EYJLO zgEzGq9_cTqf;s2UJ=VVxvmFPJmpg7r8EPLxG&lLPXZR29pVu4eb%Z-@oi>2zp!AMb zq}9~wk=yBSXh+&e9!_e2&aZ*^Z75X|C{)fB^GT{d>qM zoOZA%v_K?*ZL~O)YIBZ03;$$&9P}LUbw69@AmX-$nBAYee9~*9mlB2JH&EkF$9o&5 z^-0NGtf<$+zkYoLxt`j%nwwHxi&j(mlJ^70b7KvSJ3_ZP`QE-EM15+T%gmQ2BsmS+ z(o!88wg0leNYZ^azE&x(snt%?1}5j(<$21SyRqyx>vdxeqH4LZp{EwFm$e1Xea9*f zScsjLkBg0}k9XGxxC0w>xt%wG{Q8#8neFMdUEGbnp!O*lIT;miZ&Be7mt8^sWB-14 zK5q}~a=xqF3ew6wsiyA)_0s|ZB;UVpfVO#S>t6^r{{5btnA^TeK6ZSZYn<=%b-8)~Xh$dqQe331lG#H>u#r!3M8J;0=m z9yy2I3j5XxYMD{{Py#S2@jSLv=>EPz1!QyWpGI$3S0e>Qc{!_t&04?(Mn&(RfZxNr zw+RFTwUv~HYsMUqI03=nE&#M$6}5%N_Tjdei@N>Eq#QF1!f|GBQpP?{G; zZ|+u@nW;i6A|}j*daX3ZB6!&j6AYNvVq$QZdhxmXK7psAf^ru@TR}pCJibZFfamA< zsX~{l6&}Y|udXnktuOVhL#8+gZ*I99v63_HPE}uvzI4jT!GXky9GLJoHmX+IT!Ykt zDN+Len2_Ys8GmspTXK!uafQ%kMNXFMLCI1$QFqgkM^#XPe{OoUIP%9qM~ z{Ory>BF6Jd(<_&z+)oa?u!#8_tY>0;vfG#URu~OYR#ruj4Ys^z1j9#2<#Kv@B6)@F z$mZsCtRK}xw-AuG^!^UF)D=Bhh52XT&spu~0s>&>?P#@xt`1xU81e1E_H412i~K8g zD9zPtw>>@Vf_%tc!(yqU?hPAYef1Zn+g!Tj?tD6zn(#XTh86HMrF2FNJkqr93NA?bq!(#2YhRtiY0{H^y9nlm8X(oqyL5VqLgxhU(8i#2fDhv>ppTg zZt|3}dTP}3|A6Ove8L5N18MOVGICL$$aXk@TpJ&PHnFIU8Y?ECbPq{Y?TC0T9E6mWp z%e?O%o@N-y=YZQCdgl)b(e$RyI?qTEXk0XjM%}iV(GAjC?ap4w%B@K;u~FEpKQJFK zC1JO?hb&qRC%u#|F&gJDC89>sbPhzGxZBXyzCjJ2QG~ z&T1JWvOavfg%SVz`?Ul$%8?>xOu+qyIG1i-V_>l4I=Ax+2En69a(5qQ>FLx41mxyAq&f4?xB%=xH8+foV7on^;!ZP^XBjMOS9eTsd?fzH)r#JlX zPuYLH;i2Cf^PUm9xj$!T$Jk@UiAzj+dJNcLKZ95yN)!fBUcq(;VSM-%MqnvPNnsU1 z>Mw3D+8>lxROTyWabAn{GdD2NAbE6`U2`|>S6tj50lzc%OQ6y)PzWyfc<8Co(jtWY z06NqRiqvBmmt4cchvr0HjaAsFqen6l5`L$>6@cki&+p7(2^>EG&f6k?O02E1<%92q zsz5si1jV4<=DZ64#$DG4SJYJMg#g{Ho z;ZWlKJv6So6Y>eO!o1SOYGC{B`o&T9}^@xFEu0d>42vSi!ho3-}~G4&dL`WQ~=~! zS<|Wd-5~TyQBISg)VHcwPhq0iG2qT|DBWlaqIn3h%gp0G~+q#`v1INrUL&ZxsB zwL+sgQEaTNiluUt0rLxUl74d*cJO4DPPCbBj5x!N4~nav&u1sOsx_C8AB{r#Q*_)8 zwk687_QsNu8WLukq3Yr;B*A>+)A>QRmIEju8c9jDeCV)@;U)7a$~J(SV1@f563q{@ z+1`f>I~hgf2tA>CIQexq7{?z@J|4ppihdU_ak{x?qc%RC*yxKknZj*?iJHZx*)85> zz$@eTqx0=nAm-T1hltB=xHoQc60|CU{_oUG);~LS3UCB{dlsV>gYeYHx-4IuVEG18 zZ#9`m?K^6h>vCg~3r!F93}jC!JI-0GW|tjeU|z!_Wqr-av09iO`(l=+8hw4cV);t~ zTl`lsI;|CRf)5n#9ly40oGT?G`EMsFCCX*W+zda(ZamaC&h<%Z61oEvl%4Iij<(qQ-~1Q?k!;IZs1?mu`?3|2g z(~135L2^Pai_5+1 zfx9Lf^&ja0yQf}47f22tg(JIllA5D9o%mQdtyg_O>s+c>jIgL(fyvC(M@B1<@6e%I z0Xy+z{X@cQN4QY+N#)Nv32eE<7Z0t7@$n4@`Gw>vg@c|>OG`^v^Y~4>l$W52oC`ZaE*CnDyTd76zMPsc~z6=$@OAAZ^eN*v+IVP&YR_+XVf%oVSI9 zm%D?hq@<;wZv%&Ye7e)*Il>at6C)5cU5FZJDPj7eMITmJ8`G7?Gl4#{|KfRnc45hU zS4Bk?J!lm}-f{+MSP;aJtIGZdg#vf9y33ZVp|G&N!Xhp=4dWYz?2L>j-u?T+-`I%m zk0!TnC^O0b3}r888R+Mz?nZG?W;h7?wY!+K{%zK#e~5#F)5Co(^(0`l24!^oV+oEJ zIcLVGpp2h48@AH4W+;9f=nsg|hAJv3i9smkc}z7L9SsT2(V@}FO;f|eBchQktXX=U zUz@+4R&g*z&P)xNH0{@7e4LtAzjw32W(U9M^)|&PW8=`X3aBxH$giLOa)l-ShTCAR zjSJW_V%g6-I@+ce%~w~~xWie>vx*qGXq~%fTc)O_$o(0kxQvbmT+WUbax>*kk1UmC z?@yGz^=kX^;}AbJozro0vQq@#^vp;(o9CmE*4s1wI&;USm@$tlSNH-T>@Tw>mWX^0d%_90ZG?v|Ie-fQ)OwwOc z^3cG5wTfuDU_5%nriieZk5=4eJE^MbR8GZFj0v~?mG?Wxz3t#XP2Nh`Aq~3s@$t7o z3gbFc_U_3`JvJb9{Ersk&P|UB+ZQ%?c&?Yzi?}#xvcGlKnxEO*89a=v@93B}9xF;t zOUo0o6;9@pp!%o!C~JCWCTHTGelfwvs!wXY0g2dpe=%IYZQt}z@zt`;<}v%YQFHBJ z1Cxi>8C~yiP^6U2L-xa`93ZtPu#0=k2&Z*J}Gm*16|K7;tw;o)IUb{pWLumynaL?E&2k6M+CwDk8Gg4#fr)4}`; zBL?hDufwTXU$UZgiBL8ACK?^B^N>lN-nYD4RP^(YHeY7;tUToXq`-xE9IEc?9nkA- zjzvd914kc0l~gb-tiX?2Cr2ouXpz zR3a4Jh}lL*bkrvjUjO8V20gLpob>cNH!p*!u%7-ywj8Xc=A9j5;&kUVvkVfFY5|9f zuf!5%L*ze=RAj^5r6#8yrv7VY3&F&KSu%;qNX7efnQtq9JUu;u*qdTG>R>b+j;UX{E827&}n&620MXUIF_kP^!MXdDy?zhD=`M-7dEU=YT5JZB@ zJG_7;J3`~uk+*twK5Hj);-^wG*Smh*C zcmC%G<=m>GH*Yi?%#@Mx)5&HbubjHsYr(G4Qnf!192@?cpV^K=4HBj|y<{N&5g zr*L2`E5nLmq>U3OJ-Cm*jXT7`Mi4=ec-a$vKz3)y=08!xDo zXgE1(s;};Kqc^LD9KOL7{A^@ZT9BA&WKVRy!FC$>Un#3AoxrQtA5;eXF5R>U=X2^2l#L8 zljUksFYYyw#8sVBwh1e+`FMJI_>i#Qbg-VEom&H#Dr)as!&zeNF0tF55%Siq^B8Qhuur_7(MMOqI zX;gHucmIZmjmbp&-?l)(KUQpG+`n9Y31FtZt2AC=lFB@rZS52%_UmYE*C+4 zylaTJLV?SKGqTv1sVAo^2YeC`y_{y!r4izha@PczrIw_GWOnXt?=Sb{(s{M_>-R!r zhOoo-yUea(_Q8X5eOI4sY+1CN<7xeg-=AqVs4#Je*{znKMK@SBSDMkc0eS9%%H0{S z<|FfpOK)vF%z1Vlp{J*}&Hv^4nUvFcm&Ge|W^Qe7`TC+2^6_<8Zx8eZAqeIpfiBn# zqJyKOgE{S27xQAKfM4%&UQUd_AbGi=;4pG)oQn&QP*y%!DF_A)!f;hWRf5rh2_m7` zQfrI8B$jAiuHs!*0SBcQ_r$^&?;tm~cjjInh4@6G9?<)daQ&Xob8~z2W&nz$J){19 z?`0$|r6Q#$t7vMtceWRbR~!ToXs9P$;nJx)7M8UUuT;tJ$^Hx-85))vqI&b}83U(# z>zw_OEw_+p>xWJ_*rym?v~CSoWxRZ&qPMoz+bsFf{OY2O#|ZQBC>d&7JlDYt#p z&!4CDzezu>eM*=2?1%$-86VplfFA2KU))0dT(c^Z@ZZPRMOkq`>g;7FRmSsAUq2>s+*0R(mN9p-N?f#|1_fL`>|mhamcOI&MgXA_XCMZ6%n?Rb8xPtjkaF zz=zM9tob~XxkU}oo3%9R#a4Z}b8KSYXlb}MWSa`@u)@id$vsAh0zND{TbG_Wu} zmO3Otedm_p6@=&ZpQXhf~H(SzX+?04xvcWYqyw1)T9IfrxTLrcV z0FzJl{F1u#iI^(&Hq;RRfEWyfiK!%%t`R|^c`;otiWM`I<(&MsI0<)nRM_ZwA{yHd z*4o+g_DF3y{Gey@FA565{&FcItHR+#Oj7a=uRn{g*TK!w{CqpbXW-?_$;o-{8x7JO z8GH;_0I(1XkLly!%w9Y!B()35Etj}+{iU!Sy^aBy0U|#(e9Nuw(JK>S;SuTggb{iM zW>W=Lp+Jc8iwTYNnkw`5&W}-JU@(jb=NxCW``G>^0$YWY_#?Havdy!-n5r;* z)d~~N*0y9>V?R!zNab?=sjsWcANU2Byurb;L4Q5?Fpx#_y$D8Z;Up=f8T`eqEnTvi zeTK-#)h}Btz7wKlL7|}sO(EQ)qoY8v8=){^;(;xFWt`k$>CqyLGSw=~mKs)Nfy5pj z@C?tph|s6FSoYS?_ZDrBgJnfkRm+`YpSLHtw5s{{QoBBgwj-_$n%Re_XVF_6Oq6wB zJiPW6yUx1mn_w&aDM${hT-g57b1Vw!ObHmaST7Fp%5zaMP|-2t*5^HI4G9a6TpDg8 zOz2V{PMlrRSYE+&T^yoclkzT_qT=BUJ2<<<&R)5Inue%T53kgVH@rL8+}-0=HNR*M0iLL{_R4BzPYvPZ?Z&+o z!(yexes~99p~kp4E{6q#sL_QUT|0)E3WCT~Mx>TLKvc>dpLsP=QPF(&`(7JlCh%Au z0nxdq#%o2V)AllEmPYIG7$734nV*kWgG7-M>st)TKwTFG0yzT!=e^+u>DDk+h&yJq zx3?oCAdr!j!=HaJ&8Wmy)LuVLjZs;=n^QV ze+Y9;h9~S+=wa|FrUNd*Q)x|tJs=jtq;nRr2e!cP_~;)R z1VVwJ`-CCW#b#i1kOMV#7v+6tbTmu5Pms~4PovBQ8^Nve>*F<+2m8d!$%v~MMl{Vv4z*wF#bSb*4>_DzTs(`_6p6Y3KWBp2{|tFsjXcCrCZGpO!x)e|2|+3&6;n(7b! zr6DFFc61ui)74e0wO>2#TN%hvtF&2&QA#G{HsFh`xr68Zr_|lF(B|nD)e$UtSFawE ztPNwhx+f;8%%j6PDmq%A2f zEX<=n*xtH|(3#TN;No7?8fKO@kC-$G`p^#uh@c(*rN_*Pc3`~jF*QdoH<@eQM+HU2 z*I`&7+O)j&T?`$a@*y%~Vs!1MXzylbPAuod|5UP~63zDsd}kU{D0+7``m?ro9rikp zC_rn_UGN%+^}2@LNe7p=$8}OU6nDmc9}t6j_3@3 zRzssBJB(_B>fUU2<$cTdN52U!Vtvmse2$4O@tCXCq$igLRgPSoBB)GMeK{RAoBzK< zf^_qJ(ZUBvubkYY2!at7wyNAbe;3-V{jsn#{jI{!7Y+=xNJOWaW8M;L^5J|} zMJ2i+=PY@`;}VOw#EKCUONtD7WwS8TJ!O6K^wrBV^X?PhEAT*%;obO>+pKnv(<#S2 z^Lu`JdVcuJ?>%jwo;IH({A_(!d?|oOB2b+ysK0i@?Bch>&ThXDWnAB$`tRWR_Wyws zBz}bibcmd1xb^fz^uOq_nh^TaB}yXrztq2zG8*t7ScxSKuZZAZ8NbYzF+Q@OcQHN^ z_)6o()miuEAoa1Fwn|HdW@cEX6*~u8d~oVLP4y?gfspgw7AJ+qw?wN@Ah{r(;6-B< z5p=WXkrENav&y{T<|ubJJ=2>^D9};qE(ZDS*+QDn?PWZ4p#Pt|hUG+5~yl}Iq-Q{(Y zOO!KWr1X$_99nD6nf+HyC8x$aJU!+!S7f_f^Q=-fe`X(^(zMS3oEhCtU49#|_@sy@ zb`9ARdGI|B67(o`JGNh1>EHRbnrs?pYN(;1X-JuVci_es$MO%Ey!B@ADzfu?K4Myy zyJc68*T-Y{fSs&L6I{iQllY&WC_+_F!&qlyHc2wm2;DU9)bz$2jfl|E$gz;$;p*Z!dQzq#iVH~mAVZS^3 z!dYV*NWr?-S+33wh9wi{0##;5-9@q^_Pg)=S*i4C*cktC;M_fu9eM0zI2d*E%rFC| zapKLx$(Wd|b=U>DSx*hT^62a{p=N|$mXGnZIJgGiNx>_Gnh(R-?2-097OS}f?`fj} zs?W6INK}3I`YlJDe9@0?%A};{%F;6e`d{^&DO_EgSX5v9A?G&udUsdc15`_uRC^bv zmV;`u)`ns^S{T@L{)it0Tn5}-wuaUP$93n#uq7aRqwA%U{*InHG`iHbJV@>rSJRpCJ-*@BCk9t?j#^Mga5hhx8vPN3@tpcmr{L zExN3}%CPnP1Q~Zo^4Poce6!?+S|40fqn8y$Of=3pqmVbyfrWJ}m=s(iq|jI-gpki$ zI&dqq@uI5xDVzB^+^iEstJCm;>#WSc0JG2x${#<0p|hC156aij)uM+v8kJ1ImburF zvh;}Zg8nqpq)$cMvqc8Lb&!9o14iisN#i~#=HIC1$=P<1ygQ(Yz;D089KYW zJI{%NM@&t5)ZRpzP*!->6*n2RG=F^)Q5j~S5!d-KU$MdSrmmu*0$HY)_2I>j^z$9` zfi4jsy28pR-SscuEAxXD2tDv8j0D-V{5P;$yJ5J zFB094a;+U0WI6ppIlW82|@8Hs=HCSq_pxjwzHP>)h3W zMd6B!9P7sd_y|UQ2FtJVaOWiptX% z9&ER|81?Bw!l7|?Ta^luPa|pIT5WPhD>CP@z(*(}H&3liA$v!s5{|5akEPGyUiBux z$G^A04hEmOxyIzZIehOWbnScq3}|_E)(zH@O@w$&i&G$KCMd3X2jGVo&J3 zy*g(|l21W)GIa9UDh2@|L{WkEW1O}ur!~BgP)d*)=-2d%7m(-y2$eS&ok9j9UD1ZAsY?vOtYK$6Vz+A zCuBblkiYDnIiJ&{V8qck)jX&rk%IEwo2Ow*E?3^qjY{66dLsL@tE#F!E6jE#oYsK9 zRPdMv%V7%fxZrlnyQ3eihZ)qp=)T!MZLep8m-gLBg8e1Z9?}nqiCuYe9biGVe8`p< zB^x;mzc=)^whQJe2i|Fm@d1A{kkTW2f7NuT!sWBng9K4|r^bNwekFi^v$-cZ3&P}E zm?3U*lEs~S5JuF?wBimeaa}d~$gfqx$&}c_BSP?(--0=`dfU4gW!Vz?^e1`~_@YfS zW|L=cZoJcGJ&M4jUJ&DYFJrd;9#q)J3i{lZKwO)L6x=ImIYpeAlUeFT_+n@CLsd>T zYyc<}blo&5(Eynh2|PBd>+2fI-5rMsz?joEeL5uM{@&xEA@aIr?LaOvoFsV=!qoyi z@#M4gE8R+pf3fGQY7F`MZhXi}5_T{BlOON|&`Y?=;7NfAHEC%}!{K*=GaVTzx9DBi z#`JS$?qiS?5eF1pb@1NyDIr?g&llYm(|IV`A+%SAp-+HyXr&ar zdWZf&Ugwr0auTU+QBmWvQR>m3{71-j*2VREKxpquNbjFixyoB})>j8UC9d((zPn`PihiLtxMkUm<~Jl%UwLHXOm#VcME%$P&Aqyp~S+sc`WZdgVV$z`4hDsQDT(kw0Q7AiR4^3y*&J zeoOl=3D9>jHJoEW-WnB!u&q%_A(vlaV36SrB4lv!EP>ylOn28}IEAR=@(W1zeE+SF z&utgakGv6mZzQp*$@I?wZ|@t4v;*bli~^r4>DJ_;2Cc5815!4gHfF)V{?_ZN2CR!t4AP3@7YJptElgqsvT8y-VYw0LK*rs@V zZGjqIlxjRDQ;LN=)DFJaH^h~1m`|}e=YuU#g`(GEH1$b0eMWhQL zPYRaW!{_Q;!+Xub$puPnrd()KU#aO_?KRv|2{|->=VyjpVf`V!pDABs%f&rg+=p9#7Gz+X7kS3Zk$by+QYSSz$`rk!i+=K9l; zq*!&z0Zl=nosu=4q^cIIa&O4T#RbpuWUcj!*O)TYNIu1m)50Diot2`=>AHNO-$81e zET2X!z5V!kuIn*;D1`nIw4Q=nE>RIqF6j1k;N$S-pWWTv*PlL-{llXc=rLfQl#ozk zbvv2Xgzn=$xIPF(f@MBOrIeC_KIF+1!nHxQ@lXgGyJ8Ab+nblaKZjJwY68&1Y2M|VUo6FXuYSvH$ z-NwSg03)+?*B=m^uwhkyeX{ZRl{h+-nDggHP(zBo%H;`3@VyrHhL_Z(KYLhwtTT9( zFh`e{pS79%yZNG#eb8!0s&!P1m^=IX3-GXQGq-CQb{U zbWD7ze-_8Q5fKo9&oX=TCoEmE0RMmh)W#?Vfzd5l9?pbbQ$}LwpM^6te{^m`OFLO% zC+2kF3{}R#vB5aIj5F5@kpGZyeEjgQ`(I&mMF8;CUxAC$D!qE;E0f{9KMxS_8lO39 zUTpt23=CO-QL%oa1la>FcMQlCdi#crp6*Z3SIBo5q}cu%`e^g)8SEm9j~@f$-nTE! z6VyJ!ZvSW?e*69JiZ8C#`Ww=fEr8`k5X}XMel0N$tW-+t%EkTHAJ1WYR%{3PyOQh4KEBwU-W3GB&8>t11+!}_r66$6td$Z`}{Cnfcd9B z6WZE%ZoIJjw=TQ16zwb|?`>M-ohkUpbM*+H^{jFxjcU?)(y|$Hk=dZdCpIMPF0Icq z6Y2RJ^N&wGf@BzTXW`b|Wb3fPHthuR3)e6HI8e51#kMm7SnW{b z$jCiNtIU#kM)Vt9r&3xw9wmp-&gm9350>EU#9Qk*QQNCCsyaAwcZ_Xo;2E?&P>|4R z@{Lkhqi77Rarz!M{CKl$bIPtDTJlSv!o~dc&)K@6!CmNXW5{vF@B>Q6dr;Pmh}Vi` zWUJA^A^3CryIek=9ndDIM9A4c{_7Y>OW?7yEGU*s;8j`Is&{<1SMQ~e$ggyc@Z_|j zPm&jdU%B0WDnY}*Rc4F^Pxr%xg;AVGZQC`W;I06tj5j5y%lerdbIR8H0|cHiUo0H zDTw(jG?VIkyKkQjbbP(f=q#7QlP6iE_r&|+0hFnb(B*wFN+8xi55^OoKc#uHhBiu5 zOwe9+|5F4<350NJc^{PRP+vJab0eRi`@Vk=Yqd2s|Jn~M>l}7Xz=S>!Kr*p18JgkL zNJ{o!bG|6j>P1-SpC7gas=r*^+2vXN^@VOIY}iN`qvt2qhbzWPXyY0kPdj2+w5$$bS9^ z`c*rLsJI{XplGGbYi9N)A6KR*S;Pam4c16M!)yE}K)@xHVa3Sp`N;rifsIPO#FIBJ z9isgD{TmfZSKe4lVL|b=8_nU|mE2c<`cq7|4x#zta6^Bb9e! za|FB%NR!cDqk^|!LYuGHm{_U)HKg$PWd$;T|CG=ROb5a4xiec=^XdgR84lFAc9fGW z+-q5~u1~S@UZy%e82~t-e!;}7m>2bEhSikYXvk)&Wz~5J^?u}@eXoFTIa_NtC)#jz z!IUHqrm!f!GajdmAbt9c!|t^IYc%7W&n%x&QGSW1^1A@z)+>b9Wk)5yB}gg$jiJTV z#gr{_M8_b>7|o0O5iTMS*A?aY%pJ)$_eKtnT6B<+ZgBXo!PA ze1#Oj=q3YhtI1)(qkE9>v@(qf za?XwF`$Og_;+xmyDQK03G=Djn_k$p9%s6V+fp*;kam!$V!o>U8YsU2xL1oHgHEG>)fdsY;lZR_5q)fW! zOw2F#4^CX1V7;B4IR#Pol>e`dRN0IR#mOuDQ|q2UMkeD{m3~k81%Z3)s+wn@;$Lu zCdY00_zDeTNcE-Z6xt*^Yc(P!B2f$?EOG13lmp5m48PZU z%F14*i$yW4pn(PkodS->FQDRaYjVI~Yze?CTYV}W*}JGQC+dAQexk=?v5gI3Wq>=? z2=qoZRjr|9h6MmE0!(Y*cTDZ0(Z68d)y*W+En{;<^)yP1Qg5ii4V6lWh6K`(9UVAx z1Aqe#1aJL&b+}c;9|nk;(6?l{$(Ju9w6VW^p@m*}@bc#je3Xhz&wN%o!EE`{cKv(P z=oOuGsQ~lVRC_qWYHKq(oeBMQWpy>&!`4gzOJISv-E8#;LV;Q^iE8?HtHKlB z5NaV-F0QRB|D%yD5IHlj;f&?a$?@`Fe<2P1+|x7v*ZjHeGujdYs4LkE$+3=09~IPT z0>atU3PS~n^RCQY1P%^8o=KKlKL$CP=n(M7QOg@SzjvNYl^p8zWQkulRk35mG5g(W zOW^1j>L&<-JNw+UM$vU{R$RY-P6!!*arO_;>RaU(}*!Rk0~U61?90SEX;aM=$5C zS>83$Jruvbxsp1xt|F6Bs&TVbstUm3@vkqV0_(*V9NPS9+b4v4Zmv&8wyg2ic0&_@ zlvvnlpFOap^`k~x0XKaDk5QKipF&Y$em@(;YE@YhM+3j9`;mb4Cvwiqyn7zsFn3`RBen$> z-wqdu2UMwE0CI}u?g9_e8Ts&Qaj+KqAAt^@fIlgpch3(v^Wtk3Zh0-(X zO2xM#pepsQaoKsFkj9!IAeB7Z`kY`tr&x*B2QX@2H@fGAzLy)1)8m|-?X3rB??b?Y z01pECZ4bOd>w(|*YWdYP`G8fM3ZsbqzQGKiU5804WWY^sjET>ya*-liC+d0J0WNv9 z^A4v~8xEMc+$?uuldv#<$XV@6+1pqUa5-MD2eFO2BU|BOw_V-+Xi$k1dUXHT!*tO% zQ)Pw@D>jzF2$lVODZ>;ZtbRKxXJa~+>%4c-?!IlknB__6&ra zUx0ps$gc#ez1cbk3iA>TIkb4-(0~HDc~U_H^pBF{?Pl{erKG-=fgr3mBKLo}10w`#+LYEHK&5U$jl&QHsId=L{?>|Bo^iH1`>-v*!VfB$~U zqz&?Y0J#Y&jG@87M<<8zU{V5mBpnIX3TS@;lUf#i_l&(ACvD(XHcPEAeiuUul$O|luuA9a4b4t^FEbbjw1a!UU`Dg;gWT)`%e zCq`4I^V_?O&Pz8CM^xr~mRc5gqyhe}-%x!Quh!70`27ZaRHg@ZYC?v8?Q1pneLdN?!Pb@m1U&e9j|%>^`$fr5K;_+iNsKr{37?o&GluD=HZVgFJFRl zmn>`nJeMEYWoFXTjS5;pkdg5vTI2QcaTi}pa)Z6$_`g)$8fO5ax;9*$Yy}|2Dr;)& zW@;ZpC)C3HAUTg|ee3hpZdXq5`0R0opR}IWw?-F3st94uHB7Txrpyc9m(w9`TxG2G_ z_opMi(q%`mC0PF$bPcpU=_x7HN%9qaAu_d*pcDde2<7QUXc2yPO|o zfYN)Qb~nqZE%Y&$Z4VhE$HpWN;JL-k73$rC zMi(#fDA0We_Cn*?ZH0Nph#)Fa_%XlG69_~T2P2$7c{Ibt`!JpNFrLKbH=#N6bx8MG z_u*l$83Iw0Fg~zw;U8QTO>(dyVEtV!O`6{w19B{-ijB=NY7bik!uaOq$lv5QG%)gl zs61>KSxzD=(}yK)@|512H6x?uYn)~yy-H&?81E`0VQ20;bn?))6-OYQJW#gt8Eq@j zwy>~p?M{(P3lXE3%Z|Xu(2%X5dcu2i+_|lAiQMZp;w;jU7W6#MhABP=ddr>GCMHBH z4%B+MXz1Vo)>DfS&XAUsu3%HJvuE~sE8AwKPs_ekVzk`qyg|dvAtfm$A|;)ZsZ(9) zz6pQgQ~%@pc%FF((0mPitaW9(9uHcAimm#oqGe{PoXokT69t`CH_NQhrE`9}*GCS4iQpnjYtP{poc$0>Ni9D-13dNw7t^1_VlP zw`%j|=1Lvg5*=@W15RRm+l-m&XqP;3y)97PrwvqsuN0)L@NE^$m^CWtNfHwi6r3Du z$7Gk)qZRYn6^3mW(yo|UZWc^!#@|qVGkFK>0XZJA;dt7OpAD^~GkL+0E{=|Fkx@?T zio!fm2+kyV*JlD5awg(nI9z57{Enl=E&n17M~A$!M=VdbXC!xCtso8_`OUuCaoVIi zT+WGt46>ac^jh=!u$#&N+bcnF*Y8qvrlzKye9FKL8G4n&oYAF>NA<12X-&SN{u&83ItbfXBLrV zmm)e-<09g8vOTpMb`4B#=%b~4rjCWMbfw;=vNA1UqboCHF?RQ`2@y1`b~u2hAvu7x z2Ng0HP)l%OgE`X5ic_ZM*&;aF3wt!T$8MOqhUhqjO9@;hxGf2IW^6lvAER$zgJ)pbr=6nFSDu7752 zvo))|y`!Upt9ooqo%7AT*!D*GW6e7B_)g-vw;GQ)4kP1HX=#W`G zhlhAYP;MkJ3n-HC!n?sy(5B}8QPE`P8#U+1B>!JfTrFYRfCep7p<*odmp7OU4Dr}A zzs4Q`ix%|0#tr^Hqmo`T<*b2KvCfh`5Y+m=fHpm}I(f-=^mwsv+Z_ZcvxY1%>ORqN zo2I|X@)CL7jrH!%+H)BO-}#g)@v-kIzik~FHcS;bW4oNg7sR-JSVEr0W&P_3>|{`Y_1EZn-_&`Ox&@yza)qsrQYI{%mX)n`dX~|ZX~yzatIX=jK-Jqd6fa$2kv>X6RH%ro@xSwXUi9dzcoA83 z>25}f0GZED^K+=tKC#WjfS;1R=goIBKMoP33w(1Y@N}>Se_MgaVfWudpi@&l(Z}$> z9RQBc!7U5WD|z{_8)7ORGfYxaQu@A*-hM<{KG^+2B>;ODpQ?7(8&F)h$@u-AI(#qR z85r697wsZ){%=l*%3SzYiKa7EY~PB(+0newQz_-FXH48IYQNVs27+|V8Urq;x{~?zH$bP+xO{iW| z6U%6U=KCaLrA%+`mHvjC3!5SOOLA`*AZ}Z83~^LXd^Q3RBVR?<`B@3DcJOo|`wN4s znI8$xtbtD-s*0}Uer_}2q@!g|*qfFT@M8Dw3CSt=JtZdJ|3dYJbdBvj1P`1=ukvfl z0w5RwvNR`IkFT#Uibo;**Q{iRGZ>lfMX z23HF$Bh3PLHdLYQOMI4_cCH5rLDKPuj)EzYOT{*w3QNTn6!KMCUe6Z3g*WJ@W!{AE zn%6e1zl%)&uclpCC;;Y@l5)M-gw@O>-P;Og6+t1tW&FiEKY!7m-32-!?T8FhF z>Ayh=$-*eU07p<`*0=3_OhE9j;Qg3?FsW|s4+sh+=lS-Lk~ON6gjr*LV*v%aciUp+ z4VJv3dwq>FUY^^mH)pTup?_NlLd>M@r%c=`ulelQ5)IduUni(-@WjbVhEt>Ye%;?c zL&IE@2>CU%u6k%dMnXaH$NK!6z|mUg%5w;OAE{^xCdBggZO%U!=(LR670v(@3#!hF z*sXb7k@Dj-n4>bmauwnR>62t193&0&YO(o=OL; z0uo3fltQ)Ytg^&dWO`zM{x17+D`Jq71 z{rw@DNU8nUP`=T&QKLDpQ<2z~oq;-`@b&}_n@JA`2YnXp7|$h%6=5)PojQnOfaX(d zrbN%(NCFIvBGP}q8EViMgJ`4{6L{u;Ts>bBB+u-?+m1uR!i*3T0H7upb^fWr3?_{$ z_LUTP3{N=*T4qFw-JOEO7gsmCj7p$+N2A}Ny1=4&x)#O+0mkX^`Ya_REF!Ym(O^Bn z8K>hdA|L>o{Cv}o8r?BqG|5Z?ooyenvEvvcCIstPcXnrZA3iKBWL5pvuU*MLunHXh zKG%K#%g&GShWvn9DU5#9$k1#>bsccvw3shvX4g%(9x30CJUh%Q0`?{DY}cX?KR>_c z?TjlJ7DXRv6g`N3A(K2RpM~-&O#-N9)N+5z>qGN5*En|`8nmhVeKR$~-woW{#HV;| zp!o}=)mT&%3Jo_MoggDQ1TqJ_z3W4Dfu4y9`6h2fIgfm3qimNFkm`QB38KfJ@1p=m zS&*B34-yp>%~LM~Nt)|90NSM%n53uu4F^!ne_S?;N~zC^FSqrNnkRaRp`JGQG{Tf4 z4r=TKz|e3;#)%yNmkZIkt<~P)Q?WDq^Dg4M!P~#5eoS^FAGvvAXr(PBE{_B#Mg?|p zFosMxXX-pip=Rxh%tE&r*}CY&L>wsM;X{=!utHhynP_U}?8I^4c+?*@+(Tr3d$-uz za7{ue+H~Ajj6Q$I?0q`qT zx;Sf65{*6_6Joy`-ltp{KX}AhMFG(nCG_z*9XZ}*9%H-FEybdCbrl1_Et6?KtO$y*B_XRNzqQ3M3FNlmw*ANIYoeC@-X6| ziXAD7-tpyXFQ7y{x{q#`jSn7dJ8VN*EGNeu*4-!b_)xluh!njIPXk9&o}MvjH0jR7eHy;nX)J+5_5h*1=&-iTpzRpF3iqk+0Hnw8#^iOVMPO7-k)^(bARgO@4Q2 zjPoZ2Q_-=r`$(G}GenK+4mlCg@#=*ypbDyezvZt$3IqqA$}FwO6oC zGi&Vuy5Y_g>MIwCOo-$f)44DYVmvcq83m3>`pkD+^uyt5K zx|Mo`%^Xm4*!J2V3_f?|Cwa9{=#e}JGtn-w^4=k zC>2iKHhlU!{#y_C0O2 z<|fQ_RL;Y;Bpx-Mhaf3wDQ5M&o#e7lAjzOa1r! zKpu0NzNBnn=M6-I3U_xio?~5BgLI|O+=^z13G4D~86wY!f1SM}VdOdhWb*XHfxp!o zeTGnzw1k=YHCeO&EE6oP{j3-rMPA@f^Gpc#mGW8-5%cu)gYu)Wq#vZ6$NjcxxuL@Y zN@|K4BDzIGX;~k@6Mi)oou>kr`taovFNJeU!ttKYnGv>P&93P5A2NQgi>}oZ0N~&7P7xF( zwzGOJ!$XzsLv6hYYVsgSw70LLr`D;0Mkp&^C1nR5&WeV1BZiMVH{My%o{~F;_ z?_rf`>8fQ8)t8e6-1UqnkEAn{B?FcHfA4!&s~N97n~k_Fx*sL2s+9|DOkT3a2ntrh z;W05Utbu(+#@(0vr6LOusH!aH-@Z!JF_rF|+QmDRAF>1?G7@IWDA@LEz&b zf*jHUiKtULOmoh3dHEs@;=2xaIQ-QMBI&>W=jSh+pSt|BJQ zQmmaql)E!-?TZgj*?7OIx3Si2KOb4&e$ zk%%m`ZPj6$$#&>kFG&#Q>Ebp!7O&@8UwiD1u+Gx=tcb z#C7*-Y8P9XDUyzdm>9evYhY4oI&*zxaa-7Hl6y-#xYcoe-%yDBEkXKgW2f=1NO+># z!TFUwpDlO1>?3+PxKmx}=3IkMgQ!=%UU`oJH|s5Yq92rNcoIc`S^`*DTE%V=s7cMJ zAG?^+!|+a`%Pf}n8=KzF650Z9nbwTrn^0a{9OSl;rt#o zB{7fd&1bOn6%9TI`XdU#B>A8BpKy72c<|xw>sP^H!HvIu?ux{)=!4$_`S!2r^Ly~# zbSz}(d&#Znl)5>98EBfIOQPUPT8Xg)T4SHh6lAb9DmHps`Kf)WKpR2N$r&lA25geN z1nu-zG*AKHiQJi5188=%U*LqbC-1_o4guaSYo?-J3QIl=4pU$wk&9pXDfWfqHX4V$K9QPnn4)q=y38G#-X^|fjjb^m zparF;at=5<9OgH*fKReLiNJ(tpV4OjgKhr};#g|)K_WSWTNk&sgzWkfyLdt6|FoqcHXBSy{?v zkOqJ-8exRU#0-sY$Hzr3Pf!{w^3)~8#hK5q5Uevb{rbi1w6u!}s!VxArzeMm_t8mN zb@CI>nwC#}rq4dyj(_S_%fF9y&2?_(_P*vDt`C#Tl%-qA{k1lt)g-~ zvDgY;2Hu5)r64UNj7n@a1IRu7FiJIgkXxflJYW(7oR7<_hDO^&&RHJ?zXN`I8zYD; zWR`x4=qNQl{%Lja)Xkbo()B=|WX0~Ve&ZNZ47Hg1A}AY>V%8w>mKDMw`$r8X(@XJX zR>07}`S3UgAecbNEl>G4WbJLD8R8tlCfbnf>2;c1ch}oPW2EN1wD$*J0Y(Q3+QnRD zgtC@e44g?-Q;VFG^mI`9p8vgJY}h+@TRpwkhM&Y~gDmH6&N`zc!>E9x9)o<6FpP2N%Q(>(}*L6G8pM2-a<(@$E z_WXdUB;s@9xq^Mp7+w9Q008*bz$T@;x7*|U`TRmlpdSWaI_L4$7%2qi+Ey&3*5{=? zf%tpCdm8y|1w0_@v$&8%7};xrzu-zRy?>t~+%H2OI{UIg>1=@*Lr<5RA)+KmI#riN9)WD(+S7#5F+5ntc4b%AP_qNVF)*TLq zUTI}m?d0TCpfnB*Asl&g#8DwjBzCa6NT;`v*Y*4YnqU%Zv<$%evXyfH=NS(I03&d# z6>{ByTkw_dj4!NgJf5e9?%-gLeRi%(%@ufE{qlrx59Z@I07q0jgwW3}L8=cJn%s!M zHs?NMwS_;yhLm%DbZOGEH8~`<8jTt2*XGG53JU;cA7cerR{CyA< z+^T%d!D2Ru11Y|ox!UGQ8zjieM3vJK|BewLkv73Od8DU90m&wF55#{q)UdYRj$zTx zHD5hA8+r6H(=v8~og6nglv~ss1Y;C6P#b8Qm3~*N~&5V4?XK`MK4s z{?7o$^50I7Oy*q!=P6@aWz%q59G2F`(#nz>Z@P)}2bhenp~fp;pJ+Mvb9V@2^MZ** z^kBXP1QDR8dY*KHeZ1+Zbm<}Td~*N%3Peabt@V|Ke*5h``A(9QxHABc3LP?w{G-8a zl-dzLS5abTqk5<8>0KQyXwH9G(9#Ui0J*#)uciYB^i`ZKUvqbF&D@KU4EXrc@#s68 z?uzh-x&GJRe!N;Z1C>Eaoe$O3G5oso1B1uO`ap#Oh*1JTFSav(P1vV(baTd@J_RvF zapwdOC$$-fP#)IKF~1QpzD{M0fPBSidB{TrlM2i6XXio6wb@Cc0KCq7_UayQ04vn^ zxN?TCVT!yC^$IQfSC^3p<#mnQ0V-1a*7G1T`$Wl*MLR4cSi8jfF+{;nhJU9r9}Rg7 zHbly_G$Geb(4ZF5D@BEYCh2PrdeD@;t9;QnH0x+!ufYO8J4ij->M@{F@qPGEZf9>wY~>IK`SdO(MN2$)!h92l`xI* z#e3Kw77Vt^4H$J}wn#E_l+B2zMi2juYp(UbRC6DF`+(&xAH23FF) zp9dFc-_Dj7d}t2?1wn!5lbC3&g4r57A2+u%;EdgHZN?M*GdUt6>3V!@tfC9XnW3zy zp}60l;$u5e3)DTVTBTp&HBw?+)`0qGW@h^4{HSP2GVH1hW+k;hG|xzI-_z3*B+{G? zicHLtZMl0lFF5XqW|VAH#|{|OCTg_UXlUPFJp<80uWnIhXZ6SoHXfe>rOa!a3$xz% z^gQ)IJgV*OMS!q8ii!km1jD2>B@GP~@aOzXod)asO3$jv$HJhUBdC+_f3#2R=sq(+ zUwV^ z{GH~j`w^)pi^lH!yrPy?u5ym0wKFhwL74S9JGjIUlXkBhuFEHZZUivTW^`txxL!te zGMbNmWP}XB4#=Z+59(H9zTH?0^%R|hhm%6<#}|X8gJ8!}>jSDz(c8oBvaM0j4uJ7^ zSNoz*fATe8r86)v-~|>a=M;#9QxXIlj_=l$mEX)YJ=#YK3dQ!c0==#VBZ}|8{ZUQe zqF-iwCwgsOaG=!Hp_;Bc#bX@~UOJ0-8)!RSTjkan8EbZ9+-)`|Q9om3WKCUzZ8rly z0-BRz!$r8Br9T>-F3-JeWJNVvVT11Jk0jHx1| z{+J;x!2y90;k)-FQ)JbmN!QW_h*d*F!-A0af!zA^XCFp?%nDIwcazMAWALw zkh9DZ1cYhdo*}y4#RCf9H!Qh2LHFhL68OrkkL)51i+Z$nV;_^m$K|^Y7EFV8XZ5-W z{qu|WZBFl5H0n%Gg9Zyoonid~`NqoxBHE9^+ki2#Y^uG3>!Yt<{_8=X6FktJp6Mcz zsmba_BNq@SNU!f2S&`*!?``p;lPbvcUNXDiymBxtEDU7WD{O_^s`~5G*x-Xcbgg_D zSl(FbT{)O_(f=OsrF+T!!tIen)S>CAZY|M&9dSadQAD>1c-zpp`sVssd5s@8jxTAUym!Bzzyp|gF8-zkFzmuk>xx74b1d#}Uxx#_m!v5v>G1HtQOV?Z zvcT@(-LKbolNdb)qTuTUJ|@){s-~v#->^_w%)bG-eV@VpnP-Fsor8V0Vjh^7I8Tn1 zvvb`2mRiCjwXC5{a1f}e|7M2J%-R1ClYeFhR$+vD(~%S%w-9C45`Wkd4r_|!Pg!^Y z>#cOy4U8>2{I0hy`lOeYhNmD)AKYa0Z-YNn-kftF8hJ~L?c4craLXCY!O{ly1GMhu zE8oXDKXTVrp^<#nNVSsyQ<(n;?*0D*i~oPWd?lv;l97f6f_lu3S_1LsT=ehI@v*kd z^^u$plCJ6%T`w{5DF-)@cA4*sa03j*Y{nZ`?B$b0>yEdI=3HF=&%6KMt^5MtC}`3E zB=aEQ_t+=DK&fV7t5I3O(3r@`Lom(;Vaal*IKT~#m!A>@G)Kxj$5X~kmC`6=ReuqU z<-fQ)Q-dyDTd2m~I8K3w3r-+#aRw@NLON*zcv2r~(S?D>a2FE*H9=|^S|FZ$3U73u z32b-<#L{u!18DHKX97yK- zs5+VTuiEnqx$HD=9CM^eR@Ha_3ew(8#U9+z(Z=h(?Z9uJh8v)orH?w0mhW3glN=o4 z%9aB_-sWgVURv5)haeC$@d3>63ziUH#eY9+0d&mAT?XuTGY)YXa8MB zF@#eKjb89FGv^lrLopGwmSXBruen@RvgqBtJ?fD{uQ|~=D{KJ(IbOh)Bt%mb>Ts=R zYt?1@_k6|ya!kdTq28Yi`poonlf(2NU`}~+tv(?J9ukSCPn$%lUG`>bNCR7PSQL!) z=i2J)0V7PneRH_;Lzdl4z3QCWxK7wBn&sdx!x3^X9tu_RJGlvel1eYg{->hy;+qMh zDcCg#zlsxE!u)e}vhq$fRHD`X8kIx^bA`7*!tw{-3!L5PqoSkhSJmi@FwGh8sT61k zWw-%_#=lxBMqNwo5U%Y&jOCd@$Pv5LvleX$!z$QS3i_>xTQn{MJCS7je>BRxS7#sM zs+l=y7v~V>C^Ve3pRsg7Ko#JSXEmhEnZGBwytwE~;9Bc0YA79L2YlhYu|mLn92y%l z9}S6v*geO;Zw_?#_lINYf)%{MZq}&$dy=3t{~gi4mXt3NOSi!WOpLD1`;r8`&u%bn zrv5yBOj=>Q*0<@UcX7VvDXL#I#&*64#B3bKo5N}#J}RE$8boJt#)WjXEFI7*#Dl%u zd2Lq24@JZT|Ml#H>x<){CmhYdnkS~mnpeoB5l~y_f!dW)z@_Iz?F(&$6eDm3q@d!X zp&Oqn3JNU3KWdG75H;{K<(iIxi)l%XJXFHiiJ#FlM=PT=jhHojik839VW~|tl$=Ae zr^`J=!niMrK@%Ubn>pj&s^+HSZLj!6f2mPI^oE)KvQ-UdLIB8_XKK7oFPO?{SBq;f zxGi>89&awRnX)sk4aCV-V1J8rI=u1vZmQ43Qz`~Wu8&f-J3wdf)}^Zln|vcio+?`j8bCqKXsMDQ*h%H7Q;PRT61cpnabA)c{=EyXILr z0EbGv?q`j`>({^uR|j~9%iN_sLCY&^x94N}(Eixm?eXqJ_tcaJsFp_3Vi8dYKxBco zr|Y)5qM4v#BjjdXjSEPPt58T`(XP;PqNmf-E4GhlJ&c#Mc!*xo50ZocJWhb+k7Qf{ zGZGt+7>*ezc6&1wa|L$d2$eTkLw-}@XPB7o7reO~Py9NqiRR~CG|sVQySMEKS*RDi zPfA+n*UMEL&Wj#>xbT|gvnTn;G*(pS@zLq&(WxEP_?7%*(vz{M9joW1uq={K1zujL zmKOfR^JBD)Meh_5Y888W4K7Qcy$WzXJ{+HDaCje1jyDfA8nREGxs@FpZ2tRuy6u;L zCUm+vB4e{1uD83ZAQT_tlGQ~|ZD$85zK9-miaibq0aOF7IN49HKn!@!U&41m5=YKB zDwuc6)j@93x#Th~jL-$Dpb3(EG+uV7BQ0&5<-#7E1CM~Q1C2xIog`90f8If^-d z_PE9EDUX>guE&= zB#BwpsjbjFo>`W`_etwya!{dl^+LG49PJhIOS5QFjOYV8Ah8+AZK_Z?#l9tM#&}CZ zz+L0uqpJ3jrwn75K}@)RXKQQ3)Zjk);vT&q=Vnec(=nGWnKX#ba)sx+^!6lK!>D3kzr~D4xT| z?5~cl>=+vHV9(boC9c)2!vBl5w~VSX?Ao<&L_$*O25A>5jiiczba!`mw;~{20wN{d z-HkLTA>G~G9pB|M#=D<)d}IIJj`d@yjK#WpUUMGjdA_4qN=xFpo__VI;X5-LJmoTY zHzb`THT?Di-;HKz&4mlpwrrQ0N(OJkS<3%$+e6j^-gY z9_h+LmGFgjaRQL!)!>QI5(D@j5|@UbJG)UQ)E!}sWC)?l3VSbLA^#N zg_PB1R}w>oQ@z>{QUWIuJnA_L$+y}4=|e7mVqEK zv7R`F_@tynkTKoa*Y^x6p`k%P2lV-ad3mCO~@2pAmdh zc~7rR)0U5~fKE-jv1P>YtNZo!cZSTN&frDg+x>&mR`v5e_NihanbckuddQC{iA$Fs z4A>`i5d11mLf!{OqD_yBrFl_42llNukwSNNJDtHGpcLZqIx~C!-k%H}oc_M#97If9 zTrMPh$@t{JI|>nJ<;V?j6d7u|^EMB3YUax&91-yLhWyNpz7SVgr^_d<@de9F>H@Qk zTd5x$86jyyO79yU7#sqfat=H5sR~3q8xn^D1sYf>X*n#u1$`%2;=03ibGs+#Z{VOPqwl1Wy_I3!?Tyal7bJ(+Dk};K3#G%t z<6yYC&G#p93~63B`N9-!Z_u7$m|IwYW;Hjtlt+%#GYebW&C^C(3{Lchl$epRIipUa zeq0IW(%qYZBrws@CnKMXi2>KbceFrY)oNwM?|gGsQrfCe@D1|oSoZSv`tjojs3O?d z*x`gJo@>=RC>N_l_ZgLoXenvk&ATq@O4N~`_m8x;4nGz>`mI)K6tm zb;`XG$eibYrXt7l;|Xl_lc#r#6j&W(RzY7B@_bDxg$f7ST}wj?qh zoD`*6)_rUNvJ4aXTxoxhZ8V?2?U5^g=8)P79sAkn%z;8UAR^s5i;|29F<;a(7#w z7A)V6{R!~+&Gr^VR`!G*tYZctYwvSObK1{?Sc#BW z6O;a>B0ZS=tnnzF%NuU4pg~6cZRZ?PUBG@{DLFZ%DvyV^Au<%jMZ}5+S2wA=VMOn0 zb_Oj!1GU!!+{S#VHca3X9&QxXm3fznWJb=jYHOQOp+oD%l4tg;5I78QG*2nvAh6TB zIVO<4e@}vg^rIN~a}4zL1x1qn8k*RYNOyT{QFUZ?&Ha%G4T;U~tIOm0PJsU3-{8*_ z9(We^$CyFIW~%C=BkKms==nk8?*wMjlJtOU;oDE74F+hdQbHO8wB3*}k<-;PMg54_ zkm&MgJY1@ct0`PVDt0Cqp5c+*b|kL<>#PuFirs%Vp715Tuf2Q(vGDMud;98)6WvUj zpyfCczU!MpTkyEa|&r_*9;Iy&mLOAlS<)3c1Q>lu?*iJilxXmA?;CT7iS>D z=QZmuZ01&n|6u_Laz;i4ChDpPo)p9G$QJ7I&XBJ(lz5s~v7_=TWqJPlozZGI?q73q z3V2+VfnUTxhXe_FJ^H_p#)q8jk$fr{a8aNwvIT_*6dzN3h#nUn{$39@XRok5QZUkG zO^zQoSmMG2lfFAH??mT+h=Miv72!Ymbj7V8FQ4B08C*Jlse*E!BJAHe_1M`E!RukZ z!J&@(3iq?##%l$)YK$B5Q=%kP$WGVgKQ14hn#%i--I8vhr9||jpgM2Pl5hnro(!kf zK2Yf|f>HBx@3cFBtk+T>g}{!s@(lHIAK`m_QmBtR+7; zBlzF_f`f;rtQf)zs%p&@%{Ms~83qY6CG0=ySbApS#rw%5%~E%`1=P*6~O1nh*_#vVdIYLsH1K{|3!4_`y$&ZO_bKF38fWw~7E z{tnTJErH?-ln*>4gX7Y&ac5&yE0m;4BF*4tHemeO2lk3k6*bgRRB2fv>nRCy?=Kml zI74?=+cI!G^vr@C^LFQUcMn|-g`C=c14T7MXae(e&`h%4RCp@oICGgY5Hy`7tL zyGJVre}$Wd8o4;KdO8RHI*6|yw*C6Gyh@q|7%+8BO?&s%)mOLTtVaBw!ImV9&W}27 zudJ6p(t>z&d}f^;GTQo|3i&uko;VI&^I=7v>Wl(6tqENXNzvI+3{U6h3-o=SS}Lij zPuDYgt6Vs!^8);fR2kH)6^^mza(#o+gGTei^6O{KD~F6 zE0gywh@}G~5nJe;=k}UYMle{i3 zFHF;A=c5gj%2rYptm2l;9Mzeh&Uw7no>jrz@wjj9NVI z{W$y>LDvgcH`gt7KJ!forzy!PAmpdKHF#^fGS%D089cwJb#=?tvaYX9%*^U61}uQ} zEUIMa(bumV-L#IVsK67~#r=9FVWOw22e{{fL^^}G0Vc+YB5(V?k?a;YAEp7ODGQds z;NZRj&LLi2zUi5nKrs=eifK@pk?EvLONX2D&LAEWYHR6mRY23E!in7;;SIVl&vgprz^!Gz64GfT<@?Y#h&pBwe0-SeO zHh~M-R6^Xhf*Ypiw>Q^;UxGAdr+~S!Eb23TV`DJu%vCMcco^$H`f69LF+Vj7K_DKM zn9GKq>6N$reFI$rbA2rEXYEVXYPi}~E;JDx{KkMI9UiV0#GXkxS)$8L1(Se9GitZY zbx+h}GCCgS!`PT;#{bOS)o)HRs<&|PP>ayx)Kpi4eCn;!g%dH_x}#6IOCkGHAz*lc+w~&c$QVbU5uk&*|P+mo5G&_i9Ro z8nMr>>LU9*!1Yjnap~gXLY7hEyW2V}MfBEaGa|$D(m|b(G8z=5)3|%juxXo4A1**@ z;OFE!kUI3`OW<5f90}fw7VrVwu{Pl3+la@*U0-iP%Ec)zDhijDqP>y&BQCjVUoR~^ z021DP9(>?p=@$D~wsvo#t*tWzo7y(CcJ3A+>1~2vgeVqKW7KVb% zSnP1ol%t<%Hw_;6s`!|)vS}X$5$X{Xf~kELw4&wI6tzLAdeSx7*wE-{v)Hu0ykBki zHzR4%mL4Z$oTbR#&f)pRGX@5R+@bGeth~dX8Ll!e5#{CfQhUjb2(Ar{jdZflJgj$# z5!|o40zOn4nA{>g&C1O&*HN-F`>I9jdTKW$HMFT_Kmnk1joFUbSjaOuHx+Q@N+`ab(9&iiuc)f3Uf!m^HyunFEpHKF zRCyIg4UbiuqS#Y{h2k;(Gl!i3p3R{zYovQ;hEm05uy__+18n(KjiIw0n~^Hn{-g5R z>NL-hp|QaCdA$~v7AL1C3O0*2MU%SO&6$bX+KgNKz@Y=}eI}fHYZlu_X=`^G9|?z@ z^_y;3vvPsEmx{Myf?OUVYv!mprckIj^N_7Yy_%K>eeTb)YHKB!M$sfa~i5^U2Of2HSm2nri0APZG83z ziot>h#MsJsfoMm3EM^@<$Px9lH*YJ}H<{$MLwtGpYm6Yvyh2%7N$~1H!DrE&85?u5 zd$fgy2hA5Be%)SRT;RpW1496C;JQkrTCU|9e&^(fqJ&o%O^@PGULQ^@Dq_VwEyHpLzc@pAIfB#x+r)tM8)#|#*H>xz}cmrkSW?M!K z6B7`4oh*xmpQA%d_|KOF>j&2to{*lgiSPZr&44638`r}_()_jiHN<)ud=0Xp z4sB;61ggWs_hUdB$TZa+o>8`Gs-Qg6b<2f7gQ@pRs9XCMPupbA6Uj{4H#C_bMAt7Sflv~@;zt;jq(c&bWSwg|f z*vP`b#QFm_M;0N`#l_jzfOpKf@S%*rKlaAsX>;?FK6>rLo5HmU2T=NeBuuc-3`Bbm z*q-OeU*74{<-*VA5#z`0&8_Xt8DSebS~7SBzKoSIy+FQtr*A7}irSjQrvuwWksQR0 zpJF8}*)TETD0mh=^OtT9FL>AO&gJc)no^(Hs1_9vQH|v#>PpDgjebxZtM{Gjj>(9o{wz znH89SHs$8z)W>gb_LhjNsLX_iKo>xxn3m|dJx_96IB;A!d~}kcqB{6##!V0*BLl93 z^ar0YzmtlS;Um`f8~0C_d8aSAL#+4rprrt3mX@-E4`5Xn%vO&EF%~m2OvkCE3=T#- zfck8KEOgpZK%1CIQ|J>Ah%R&~}0XNt`K?D`R4p@jLl~iSu z*D{;2J0BfULQzmdQAXL>fYam?czA7XEyT(ElHz91T)()a-y^@-pFo`k(Q1rX7w3Ps zoM0&v9jli|h=W*J3i%?`SkD4H_@*)Cwl_{2kp@0=YX>aOcO8-u6kE(G&paKbC8$f{ zbcy>F_NGw6MdczauXlW?^p}YSL=oE$4imLL`7`P#P~P~Zb&?4G(HJ)#?QSGhkEVtO zN5IK4H|w_3kBys6a^E+;7jt(AsGzK?E=@a})b&AtDf2e2j0A-Kc=I_GOz+SBUSKxS zxv^+9ZB=vErV6^Bfa_6%Orlr?bK$LW!5ENJ6%M(YONgEYDFRoT^)`Q0iMWuVRei@F zw=|euR%NP}de46naoj2ayQBL0KJLd8(w!X=7iU$<=oLGjJNQ~6tYD{BT?iV!<7r!X zbk+6cTiW~#4&>6~$;vjlvu3f1rB6|BmID93CwUo-puax9EB#my7QLB@*5i}i=aI>1 zFEXi;y82DZzdp@~jEn@43yJx!{QI7tA=mLUNA`f+I%WEE*W+P|9qf>sFFbAXc}h>B z#VN3ko_?0dSE9!OhVYblk&NdOtTT4q>K#FN0OG~FjSXlTC3vmGs44m=C*5Tf0XejN>c^p4P7;S8A zAFUsKqSZLqVOY=$JYA_az1!7Jv~rS{$cvl_@)uo&j54rDL)MzqLWGn<PwXYtH=<>|lXJ5t1{fgPJCQqb}r1$q6yfAYk^(qpF|#!q&LzqB|vmZbzUR(J)e zscC?EYs8F0Oe~1G`1MC(A|f~nR2;HcamJALG$)>5-IMA4|t~p%ytJCwjDG^rFNPP2#N0@kCZ`1pt&Wt*RJ(=z>6 z3vF9;l=~3du92RW0Xv8#5RjVY({h?5um~0jqv+dQTwKJH%{YXlq*z2V!*a6OBP1y) zKDWlck8o8rH87kICflZokvWI!l@A1gW8c2@s{cLozIv;yoUMTl>W?(<2F1!YWGFm5 z92U0|?z*tIxAg|Vns)bEl1)T{R4cw|hag9^bM+V)h|exAQ3MQ|Ch0r1V|?jh*c_|qr9x=uHNMvlL4GB;OD z&qm*eu61ecSZFX+@N}7u-1m5(Bq9QXPAvE3knA>f0q_d@`4DKhAXJ&LHNy@#~8BSFO#8wkWdj7 zm5l_;SNye&6h6nA+{VW8@=vql0fZld)x2ny``1zNf#48pz9nvMl8$=mn2Bj%QzmWM z-W|+o@|D7RUR-%C@RpAv&Ra~s;VQ1q;qk0DPx#IqcU+fcej>CS3wHusI9G@ zoEXbf-kGh9;U&Sq2--qTJ$e5S^&3a^GOnH(F-8{Yx3tu}(>NOeVFVRub;gAs!>KZw%h#IqGnPfs++ z_b4cze|@YqJLc_NK6W!y#Dd-@!PXt=)542I| z@8;;Z>A-VgW@b93?_1c}*R|f+JpJ8O$mPZ>eIhIs4xYY5co_A(79Yis?Y)d@yYG(KP_I+$0z^S@CH-K zV|exd|A*kb+F@a2VgwbRq2g#JS?_xuK3>A8zJKX^d^~U*;Di5N61$wX3tAigIL+Xm zPmROL#Tg%$fZ5CZcx7N@2eYC;o&xuY*6vB71~p^ufkGeTOev>yW2XIF!sM*@g|w?Q^9P!Nh)X@j>VA?i$D> zJ8LRU2Q;em-nNey-lOI#?SvTr#zpDkZgh>bSy~Mjrck?Di$z1M%)ef&cK9kxf%u;K zxwn^>l(h68se$jJe?X0s&;xkZ?Cflm^*W}qRY)vd;aCJbLOZdMVW3`>gW;kCs}&)h z_wGmcFJ^vzZLwQ@m~ao8d(gsSi+~_=giJ07{&RA6hVv^7-Q82Kq`j5`Djb7g9^j-j zmdLL5#vR{u6ZdyKyx)u1>xYYd$nL5)+67~?YjYB8VYNoH_be9#PGi0!y>Xj|CilvW zOmOq%B~9+^w9Gd*SG(TZ+8Q1nc9FR)Z6#G}F#7msZ#p>wBT)$jqKr1XbY0XR2W>x1 z&DtkWLeIVXBFlZ+O0}x4J^>prE{7Esa$9>%o3?jKCa~x>`got_3_x<)iryzoPRE-w_tQ>hZ_G_! zT(~ejJ_j)O=|=bL^pp$gQ{YLJfQ`i=M6oc}5GRpNBIp6?Lfe_6iptQ_PyR^kZ1OwU zoxWe9qL!k}N1xCk)i*X^v}kIox&m8rD?EmzE}~GBfhYi&z50hTka?-n#)bq?M$6If zU{l8VDr5`Ycv?RXriQ>5nxCIn>)TA*FRQJbR6066PkLkAKT*5L#mz0`bVLy?{?u># z#fz!=4zY;6`{UeT>?Sx+WOny-!L_Ar0uMoqpxfofLr~gwj=;#B{x`6r1FAJUke`34)mt9M*?=mNHFVT6-Q=A&hTleTW=ZM`5PFBegI z*^UQTDOT22!uw5tsr=W-Pz1l`+nq8CuLq5nxnr8vB>`LpGAK=%HCsL}&Z9#N z@hlxKS&&`~r~!vMqn7mkS-_qwO&Xh+T+9NiY&^UvF&386SFv=ul2T9n2-!{c?iL?` zQNuKNunG_>e3vdyh?bN7 z0{fPwkK;90WkuG=HVEO8*G(%cjhr3aUOq-g>qVo=6#VqFG*^`oFI>KBYHF&zKSm}O z5H0C)QveZJwrjXvEdmg)iMhU5E_>K_+IQ(cYh}S|f5X)^yflO}cG?vYn=`C#hH)c+yCn9Lwh`E&4n*cfUAT%U5)2&{t96iX56P z^SQ@9-3A1DsUOzQlN?0$ia1_kU7!VIBDS&0)3;uR2R4p9esW>@_pO}!rFs&2Qx!vr}W4-_JNh6j;H6_j~Ns66f8!rRMI=XBBYSGAs=RKdO?le9uO4o>xF#NNuT~L4@z8Z*(9zLTwks+9x;0??SEz{kRMuXT~WX z940(wwWZBn&y%ryxJKL=eIi1_#2*AveM)ZzMu#T<&JPT(w~Uq|)=Nz&EDozFcQ7+{ zuO5R{Lr@R?+1Xb5yUbDA>l-jV0Wbt{6#C61DBZ%*(K*LCv%6>vmC{GiyuEW88fBbZ zPAG`w$W)>yxK)%V<8k9Q!0GZ`BKX1y)uHUNwlY0h{C@ZA`boyb#a;J?W*p~DK3ZR1 z@nn;`@BPl>YG-iKp4C9lDL(TPC|HDzl~r6q!o%Rf3u5JF2Xp^9rlvMGW9<2Ir@ceX|qF61dmdImN@u3PB}{b;qFR2g%9VAvNN1@FL&7 zyq-@b4+#y0(;JHP6kNPcERX&>_DWHWmlwW40nDW}OJM8P% zyxv|Gm;I5u7=Tf*G~YRxt0%_yh*6N?r)pMPtcT!A(K;#>gCojiJqL0-U9Ps|wRe)f zCxSx>o<)mG`D87E7tDk2Rj3FFcsxD8tL|1x4?hlPb1hLriCr*ZM18Vpd{6F?X+&gD{ZH@w&IG&yfJPBKMYB_VT0PLTsqSsROFQ zxuQC&xj|NtrC-WG)Oa4XLRswlve*tM?u51eACff2nF@pvf7Mw)SN#6|(w?WRrpDdo zyudWg-Q*XxETeWghyY%(tJ|C`N)&P}0jaHUpao-hIcvu3)IHNr1kKIQmC(@|&|Ky= z)6(7-YS+2tKLW3XA#2aueRIVekZ1|?Uxqm}%R6z)N*%H>$td60ZOpAej^;V zL}7|2eksLFDkak^1tle9CD?}8*bvD-9ud86ePxCJr@Qg^J*wvH%Lg2A*~9&;EJU4U zg@;@aJViyG2E2QnHQGpimkge5Z*x$O7xkuNvRU{a`D@NuHNH!2pbiPKUmv)!Hb;G19kQ)P{JRbeOe+MeneGi2X z2%50CmeUDM4-Awbc)$Ms0%jZ2M}z3C^lSz8jP$_&VFAk3<{nqU)u8KpuFRIm@7zB& zU6}#*vo0&E@-&_7hAOV#i7?be)pnTRP}8`6eX+fvQ;U^Pv1olVblCqCZJu(n7ChBD4W(jjiroTX{pYLvpbwe$dBsI4! z%}^4t5FITo2Q>i%u+7{{0@19@(-wv=K}mdE*6lfA??>jnA1?!1TOY%dxNjFNY%IE& z=jOEd8sEURb1OhTo-&Xgn2I6R^I3pIi`)Bb? zEG)b?u+eONfa?G@R7Et083tIqOg3$zcex)fFV3?}X|^*e_}g5SawI#j9zXJ@Z*``; zV}en!HSh$1k$-m>A;94aQ{6Z2_YVyMx;}t;JVw%MH4Qa30yItHq;pGMl3~0g-s_ty zspO^oT|V>AwcOCz8ECOe(Ta(QHqo9vb^T6&+U5tW!E+9b13-Q*cp@cn+hi#O zI&-x1cweAFQW$7iquUAqv=H!ClH~?YOH)&{qmsLmfWMMCy70LlR}Ctho1RwI)y0JV z8N}2WZ3AxAz;FW;a$+PH39(7Dv$Lp>CYQB?t0VX`TV+oLeeKKu-jC=9JMCSlkZ`s_ zt<{2+u`#dXM%eafF1)ac3SJ0Rz*Xc6a$;f}91dn}Y4jgh*x2lAOgS%NC32@58=eLR z?ace?x#gvVvd4*XlbASSDB8Q&KYKQ+OGC{#);Db~f~#s;TDCOpQTPR6$id}=K%QoJ z!3BVR3ouD|uls$gs=Tn?yk;)Jhb8|98YEDzq?f;d92^`?rP2=e_v5}tfqtNbhs;RePD6X*fBl8@W3A@_8f)Q8*qkF<%7fU}$8k!}*RMIx-2_kRB17 zUqUO(fSuVSllIU50D~GkJBgyApe1|W@zRq67VAZazDbdT3V1lvk*vTQ#C@2Lpd$J< zTC+0Rw$x&<;x2JPRpEcwLDBE>X1~6OhM(9mSeX+m04$|ir`fwX@!pFhi_P3y`+i_; zEie$VXbqHa8nqW)Wy5mS8YyYMri%}{6Q!D)dbYXdC*aZEmsJt9WG<0ike>gR;yEPj z?0oJ??sIh3pBo-VpvBBW$AVwjv_7tCxcMhIGP1I!LZ$Fihq;hOF6 z*@DQE@}`WtNbFn-3rh~`%8H6x*K@EQsdT7FVAQZOwtj^bQlU28^T?BaEi^qhGBYw$ zFwOs-f=rPXNoJxbBQgYJJYX9d0xxp7buuzCkh(TKjhSKq45ATnDguhbbJGMF^zM%_ z&RF^wwyZ33NAlnY*9>42TwH=JhRVn1mkhluOI4VK28R1veC9g@%1^xfPY<)I?SBL* z9+$DEt)~yQ%J>>I&0$OQ7dF=UD?7mj^{j?VOG9nG5^~ZAo?)5pYj<^~vU>o6Av9b$eq4n{}&>WD02NFnaBO4r`hv1;X6>;C;hkzLL5pa zFMU)ak8;?SkeAWnj_lcY>(xb5OvJ+?AtvW`iR=7Qc(@3v2)eS) z;_L%TJpUL za6%-LdzT{zwN3QdpTUzn;ltm|NajEJN$T-`5XO_!KxKOelHG5}9bJ9wwG__(3uM${ zWF{`kKz)3%Yiw%yIKy!1&t+_6Osg$>gCxSl2>277`Bsr)72j&lTAv4Y7mZ4XI}rHLh?=&HJ+nj6M#%DxkoHmp}#*`|lbWVa|0RDcryY5&H7> z;r@F_K)`if9>_+wRD4Z-(|ct0n!9o&W5vjV4WN*#dIlVTXS)+CN_h8@0mdBDZv?b5 zxkF)gjP^}a$J3@S^ueM_MN}$Bj=DroRjb*fI=}upOK0D zDFn*SE!&0#Z`bRQPxZ+hYTq%d$frKC1xEj^3ro~DK!dX0Zo0h2-QdY5AS5=Ie{B#E zsr{OZZ8XE+H6muhgW79?_XS(+zMUQ^t#&U$70+ec4a(IFLk&UeClDT~BXB#BgkVe0 zcF3Td%VxUbGKk!UcJb!76O(36_Ry~ujXM4Qb9my@rIv%juvivcu2m8lgl=gBaC=VB zoB}v9Ys2Zk?%MIt@boz69MhW=m$l)So_u_Gq1E=M8?}qmh;P0#LrWMaMRcn4aKdfm zX|WH@0s;{0)f&zJCM8pkgZt;HmMrC$!xU352L+e^OEj`gjhyw2jh$^RcYyx88uc#b z;-j9(C<3HC_i1rYBH#(s5LEju^Yh{~0wmGZmSQUvz$XLK)=+M!n^Az@kugvDZvqSK<;~3sCNdmKv#qt1LS}iuPJZ&Q&$zNE{%f9(YT`BL zYk{NP($m{)>yg2wElY!FWN3ycY0VI0fGVL+gO~_Tn3Cwb#|uS(UXyu36p2z3dCJ-4 z^`f-Ilu|=mN^2v5-4;x+?0u5sBl|vQ5lU5@+8WINqO<`4AC#3>*~8oN3QAhodnrRc z7$l0!j8Ev;yN;=UN0L)l8kwG_XQlhv zzoH=U8Q1*z|8SB7ltyWy*;QF0^kcdo=yBq462kHnwBje}aJGs^==PXk1H|&{F3RY- z)MOdWHb);;z;b3;$>|e#jMFQ@Ahp?`!feCruR2SP`|t@4FfU*R{INS3vT~4<8{1PyM?ZfriY-dfEn_JenwyYI zi@m2tPfve!-uCI`;~uU9Z=wVq>IWYFg}?L4tq+d2x#fqr!2y&us*_Qv$KONb=s};P z#KxllU^KY++dnCHx>k>En6b|kKlasWs3o&!pr}&PEZM!qaPeo@YAN5{8IUA@VvFSS`H!liRHA~Q47S8r*t_;bf{hRFxw zq_7(TJtL=Y!R0kkaPT0Po<_0vUMNPKYV*T5DONOrkS((hzmLoFk6Bmlj`lnp-ePy! zPM2p|4Q`1Y%VFi@7(tH9E7{9fORwT2;9A9As?H7cHY8*ZJsb2?FKQ%IN2z}|JYP&i zI~E}t5Eqy7d&Jb3B_Xb(zkfoWCf1pXk6Rt{A3h*8fljI{v&bN*s+JMdU*8@xdKpq( z7}iVQ;&J5XY2R`4aLN?(>61^v*OxD&#mRk6qW}8CU*n*xXOgC|65N=+0eyDY7)6^j z9(N1I`du89uHe|*Dryx(zm|ms8#38!rFH7uwd|~I=3F^?z)b>rQb|G?fRqB#Wui3a zE)pIyTS_CNBMP>WGV3lH?<~5N1Kz1Ff<&m)ANJ=i8lMkf64^U;2PuZvuEuW~n||Z; zgLjyl3&8CuBSpS*rq1j5BxYR_*snMp-(CN5O;fAWv#={88go5CVb-n#`C-Rycc7Ko znlwQ$%>k~I=cg9BPp$4Oo-+2qF7TcpthzN+%;Ne@2wwIP_j?z@l!8P zE>^0lAMNiV2O}^bJ12)9q{OQ`D+LOLCk~D*x^+fIR%c`Eve+N9HdB4cAm-%O=h%E; zNY+&6Lkf{hJrYOur112a{>lgt6&0->=kz7vW5z*wrPLp^$|`^g=314vRj%{KvY za@aB*o~?ZW#44^2a}3X(8PjCHe@N=??gc@KLM%7`y zKG&GcQRIKrVm3`Sz~Mad=A`PWxAu=u6WY}qvE9TM&xg* zjZaO-MnX^BfcoTT$?yR^AJu4mOGC)?A_-KS>v_d`DDl#5W_AD*T>Jir0j zUQK*_xF*+7L<&5R)LbK6S$-ar>oqb}#owD@p;+od-vwB%rG-VqbTp5;~ z6m(m2S>ssWWT{%}E_3Ab7>mg%TfUN*E706jSXf}I)p~%xM1Dm&W_Iv7?=Ldd@}*&vrQ2)iAoyDv99Zp zqvon5V0WWmWF>secE*j%2bM2%GWeToeOU@RVsyH@(>pJfQBF>VQs2aWb1QBruqdNz zmVy-;sM6Bt@Oj=yz13-1fYl@9(+%D`oZoEs@5KB{JyS^hqOI&jvptsYc4*jjjh6W;Ckw7yrOM z0K+ca9>MDhwele#)PrdlFE1qAhMkd-IWHhEIy$n=K?E5Yo4DA$f%N*vUO`duF(3jN z(%TPAn3}Qr`*R6||!!$8Oz*PAeLYQRtw73TxDE3(wo9t?88ciKCyGV3;YU9ZqU zteot@VIlnXdvzE1p~7J-&s0mfIBS7~FgS%h=v}&5DI;DeHg@T}c#ArRgfH`3*+?x~ zZVm&`W&{sZAWxuD#Adf-Xh?rKFkDufE5?Z9z)PxT1fIU*lT=&#xZ330K% z`(JatF0ZIyGXi{~6BtC}pz!gMPKnOfd}+IMx7Zv5(*zI;o({*t}0S>C;pGUvqyL*MG@BBa39fL7AT;?@!rTTPae4Y5q6}a${j( z!Te4l?(OEo^}T8Cb~+hI45wpr6H3$s*&R$y1~e0xb%>fMX6NRIKQg&(P4Eob3spA7CdF{J{Pk#%#wX>xm>(8HbQw>!K|Ku6|F*P+F`Wm8j ze@A4Mg8;GRqk)#%t*+@)EI4Rv=e9X-)@Konr-@5P>GDZIi60?r8E?^)YgbdaR^%&LN(++OP9iPt$@UlgzL+S{Mv z{lR>O>g|16C^7y%NBlI*jh~D-_gzV^#85IJp}L9|Fz&FS)eZs%J^aY={cp1s0AgID1;7{tNTh%J+O>)mPnI8s;LVl=YM9x{#Y30Vx>oe5i5ZXp|M~rU zi4ZUh(y(KN#wNzlCX$xEokCyP`Chw~HMksf0FH#a7>H!v$v5kQdO z{W6A9F*UBQZ{dZ#ty7x)1t4l|X)8-h_FC55QS|a3C?N8OW0Yu*>iAbr$jJ$qBQ?Bf z^zcMb>mPi}w>jB8sb1)qyy!G{6K0PCmrBm1o zd4CPY2|Bc=3fD-(Js!@^E)VWEe?aT0{5=3b?$(a63nz+P99$IWaljq+V{q^sGc(s) z!Z3;KHy&F@fzrgT`wuz(qc#>66I5H*4x5`lQ23d-X?Wd1k*Sy?B@c_kfvtzD>hPW1 zE=Rh0ovhdD+RyL+h0ECF1kIv{nRHP`Q4>Y$QZ@G?Jp&Ub7gu>@?d<*dBqXP(%(REy zQga?&F~Wv~berKB(DLBp4^nnweWz+`YjQ;CaXj4JYip{|FzmH~G+?}T@#xx%#r9Bw zt1)H((QhI?KBv38H?LO_;PWT$phRi8aREKB)02yWk^&eDOKn+|Qo*;<)_WC8$I75w zq?!z5Xdqk~0Dd4}7T_g3-X}(e-kBQ3KBp7?CLC(Szb<(CSzc;kJ^xt-wN38b`Rjn z3XRWBhNkR*vA3A-U=iuPs^bc=%ZGZ?PuvP?fWJpgu zx3;>bnxhsupgpIXR)tHlScM@D2B`b~_22LrxpPc)ihU-9V>=V^6PBtaE}+AU^3=Rm z@olk6!M9hnF_9#1!mOMAZk;vEXjl;dfl&7iB3t6z)Rf&)f^IqB*b?KSf#0H$!Zy%% za4N^`@9%StkBd;2=Qbwwtm?BPW-Cm~=|*;}j!8J%VC-HlVib^J=upOq+tO-p+VO}` zzG9*|-#QfIIK^ZO*xTK#wLKj2&y*3*u9)SHot@PPrdANun2Gie0wke0J!9_x-E(As zf73;ft~$6kKY6QdouUL|dd1j|jjWxbjk}J^PgYx%^-Y-C$;CJbxDv2Uut@BN+j)#K(TaA`f3yRIb7xw)nrMO%On53Blw5w(H0QO#Km#Aph^Rpsfg zgW@t({1x(x=nLz9L{VUc0Lg20b!}~FQx%%$Cun$X?oWTeO5qqRE@Z$&x86ye9tSX< zV@l&3+#Fv;C`m9>6|}TeH4D!p(LqHZ8WgWa%)?J+Yi02SdQkjq@xTcePDX|7*8cBo zDlEQzST@v&jB4wPU39x0kQKbkYjEKAPX^WlokC$rwW|6)zm@=psGAn|{wX4y>{P?P zwWA|D?daARIUU)#9RyKkX67Qwo+hrvCd7tH{gVY_`WGcUER=O>9gFBuvCba#s~$4+vNnVMD-5fME^L<=|oPSfXcpBr*J^v5Ji zKfhVNJw)F=Tbu0zQ39_a5{FDZRUFaOU@ z@1ieCNKaqJ=W|6wM7&^`tFRxHWNFn>(0H=|{~j$|iWUJ%)OyH6`V7FnNG$DQ@Bnx` zz7+r=vXGp*y7T6NHc9{%4o;rRYSi`(oqF?zyBN}KL&M{S7e3gjP5>yZHd}u8$0_9v zuM#~xCi{wo0Do8pZ;6#F%AP$GVt^; z?0E#`P%TX;PJQLzt5vMCnk#`!9%utHcQi9r9dU0EYA z1BmEZZn=N(^c8CD3QgtUWVbf6;&<6Ia~{yW-h2PqAA~U2n28Uu(ARlz%HQ(6jO_zp zRuY#n@L;mGvF7!CXa^R}Wtw1|$t2KtNGMMFa!{L=Xg|q#LADIwh5o?gm9bLAs<>x~03Mlo09e z?(W))@9+6PvuF0~*^X}C`=r`gENI#wav(JRez+-IJ;vEfV|w%Gi?& zo|Yr_C%v9sQrm}CJ42#o_Q%`N_P{Sm!%&olBfCI#}r1a z9Bpsi#$;X&mH$6l06<|6fxJm?zoxqS*RNlA46h+%L3EpU=DYaIL|>GGs?NYbUxnwK zCAuBmDPa7=nHk863YKI!@3DP=T?ki;Ec zOtO#I-@Uz9mU{ve&_c<7^vDYerhfYH$!kwrh)N(sDC7Hm)Xc%t@s0IUy+76|)|f}C z+KY!KmX3xF2RBZ~I{tR>b)tG=VxbQdI~g=dD<1s)YQLU2cGP&tn*ua6Q>U&!}mP52j4Ytxc&C{<*Oy&9hfin ze{v2ZqxJDc1-8pWvv_KY1)~>p%ux6|vRf$@eCeB#z<&ox77N01UPAP8pMs6u}c9c81eC#CFt_=!nbV zigJ;tOxK&&T=o|p%RTZ2EolkdcMuPnx~8V4nN%49_MqFZHOtITjei}X-@<>yVfQMz zJ4zm9;ERdk@W1`h%1QoM#*0x(se|=N%d%14UR?q-q(kSYZtFlU@-NfCk2IRWF@3DSV6pc6I+&GC z@VcKu8b3*|ZF92r5Lp^4u-#v=hEkjOv`%M2TvC$f@s5tW%i)4e1v)x3;KuoiSdQosiXx!+5HG%d{VqAijEC!TJo!`y1zr z;Yr5$=4^2lTJ-P3k*UqY>N{II^L0akr-xDrPg7q}i-UcfW|>8yYmQ2`X!f?^v5#*p zE?qvJD6@BWy~WRmyxYfad`Wk}iaG72GidfdkRekrA)cBF8d`8bNB5$f^z@`WH?3$B z1H{7MPS#?GLpK-D#=sz7N@B{TwwZAw0jm)~qIVU%SO~s|?2J5epiUS!G~#JPLyDTU z^xGUKOnzEjoDF^b>Uw7*U#(;(o71+_P-^>4ivots)X^^WA|3IU4Lh!Y_>n+s-pS1v zukk;RITN3a3sz#Gy)P;lSf-xja5}7rPrdVP^I)UO%xLrI4*$)3jS{W-CtzOt&bdmV zFSD-~0Y3QNq4ucakwhnJa3&isf)tbb$}xj zC%eJ7OM`*mY}f9x;au<~pVPtGL&3X6MxMS(dAfEP{gSl>;ki`>?UL7 z65&q`M1wVIY#t!szPmb@e@)=fVti(H6$2ezCYCX@(`oA!=C#EOY_pWdH^}Mer0MWH z8J(;uHu{1|jS9_68oV){vPxztRvkphJ&leUvM5X9v&BF(N{nOreugF`O_tx`er&Y3I#^OuG&lKAS&XE8U~_yJ5M6F-K2*G{J#CO%H~RhMv*)p_t&C=!EB(ln9oL;l zeDPyhk*Fo%KH5qAp#I}crgwBm)qYV=#=3)jetD+Fk=3++$I@u*!g-(JrJq|! ze7xIse%-;wbH`62@X)G0Yn7CL=66R&Ms9Ok`|xAsHhJi8V`f8McL$DnMpqVyX5=Po z0V|xRlbNJrNN9F*K@wkQoc8o8cJ(GAE$>)Ax1~$-Q!H=FR zuyMxIb3It@EptrbvR?sVR`uA}I=7<&u8-bOB&{l<{c%EPFz<6v&@ZNH_3#$< zJRQ%yOFMf>Aca0*ByOFT1m2wFr#esW*`z#xT-^A;qxzg{Wu+OXMQN2qW6uL9Id|vQ z|3{kLIrty&$ocetfTU{oE5r^gjC}t?D_N5M4}etmKS1s8(f@Ih{+~Y{VGuc?I%DHZ zOyWl-{((YL`|BgH%ssyR+w2vPW)f>Nk`Tl^$$!Q*A+R@d3k@eTf&n*#IH>te8a0)O zJd5%#SFS7b-OIxpVN+I|s0!3rxbm{;o%*bVSZvw*or&`$KcWSwL)zx`GnKMc_}g7f z*(S%MM`6M3#J!oOsHXHJMD!*tyYILS0llFwY1sHL-E1Y zsa<$}i1|ZBm z`fWFVe(fBVOKQWl`K+|VH6QWBWg6}Aq5J}0JKM_bd|SBDcjxLlGT7(%+M`a7?xM+0 z3$@*=p-^}zA`jjR5BMHl-E>62!huahUO%(=7o`(X4P!k8^JkTFLs2dW8OScJHA+Ou z!}VV^OcPCrGSrHDO_!_W<_(#^ufN+Au9Dkg70-a9L{~M~Ek(u>C(RN#;Q8NUfyAbD zKE1C)mZRpdnT$Va#-hANOc~L#7|qTrQTqqo=ThgF_1Jmy&aoS@7{gug3*Us2d{%37 zqyvbF!M`^ubli+(8-4!Pb&H9KDGrKO(*mV6ViD>&|GxWFXXocNT{c#i7iluF)uBao zLC&@d6lJF8a)UpVw(VC*IPGq-5l)+nX%@mJ3A{nO%^7f-YLI~Qv`?6 zBGb}kVyZnf?-x&IHzc3FAZ z_?)S4&X&pef_Ec|`UsCsPEfs)l617R;)Qp5&{!bqdGJuZ!e)ME^+Sdd%uFp`WQ5Qv z`4r{*2npJ~d6Oy`$zu!FD__47=#Y|j?c$(8uidmS1Cl2MY5WO61NpBfV~5rU!UVpV zN?GOQ90h7vVBSc@#mo#zZxJ8rd+_lk=iwO}UsR#ua<^k$k=7)Zb zdUt$$eTBuuicFgHt)-=@U-}Yna<|n zrVfQy!FO6RGF=GD0c6bZgnK@PhG#yT*qki7U3ta>7!ekurLc?FxE`iF)1V3OjN|tl zg}JYP#S-Cgn+XC%v7_IW4U2hl8~~|h;|r5r5u~FY9M})=GNlTDLjG zlx*(6ozyy7VLMpua|_u$ObXe(l9WBCcSyew^0p{Q*5$pT)~axG78n27xG}YR zY`}N61>Pk62D7y%EA6}Zf6HVn6kmPY*t5XQ^? zq9L%jhZssH)fzXPLAq$Os8Qx|ZdrGc6+&Cgl?y|{uj(3pGbMX_f8bB#(Cdki3nJ$9 zpDi!8qSqW{`y-=S{LQ4&pfxC|>+5#!&b(~;eS|NLFIngEB1T;u`3Xota0%&(XT60? ztWLOZ#B+9PmK2VzBd_YT_1jf)wde;O1MnG6H>widPsV^N;*dL1mv^C_`O3I>BzLq7 z46dcJd&4N4VZ8xIYV*`3p4s8+SzXNo_p z*{X7|{ht^mMIOoRE>nd+!WIiq$$d>fNEJ@i8OvGZ+Legh#U&8$%}Ys>(OJyD4%;mc z>X1>d5fC(wPmi7NS8DeX5k-}{Zjw0goF6>m<{*}}Q?lzM?043pcfCaS+Fu=1&DQ8F z%HC=TBmP)1e41Faym<>v(8j3~-i)=w^XwFierPMQ;ZHH0fiZEgI zR;w4Cot=T59SR~M58hs81H~pLx7gUtd-inOzPCt7$i%To$jRj^q~45fe|zi9V_6|K zP3Mvq9ri~^{zwB!H=zS^e&+GI=wK83^;X)5Hddo?pN7MzX$coGcBb%`@Q=OAZ{ql_ zAj6>S3nk!*k{J7Gt(Y`XGmv{(BX(%9CZmCJ< zH(#&=c6u+kIFN>!+?w=jVf<2&Lg~BMkvLBAY&oA+75KZH`7Zv{(SP8&@E+!9)W*9b z2axR&_&y92?P3cQr})Jvt>ZMkrrLyItTORi1>Ohq^>%|QiKY8)uh1eH@zq8xW_Y*T{ z)vk4msd2A@#&vRQP^pB){#JJ*6)ZwldrM52!pwW#k3nCXspPQH_otl@z)uFP!NDY~ zQ2p9*st#=w%jidkN=D6}cSXYlzV|+Vgl)V+`Q70^v0QE1@IMhZMM9x=>$tvhvQcGk zIyk+1teg$&7iWj^C%v!5#VoODtwAKuBPAc$h(!NQVAXg%Qem4c7K|6r?8fKWks&Xa z_~tFx%8N#RdHT{$i9+!1nwq4XA9gA}(60tg%?U$D~LN+y2g^xT19a-8T@xo8o@}Y(_ z{Bv9GzyOk-k6^yAIS|?TK#@aWEPUM1fSnk-YVl$@$=$F-?QnD0cJANzll|2|0#^TX z?KNyaBjzrKcEci+dN|<&QjYSAGJC%}Bx^mXyQSt`o(w5ziM6hq6VS6Qvm9Sh|CJ^a zcQN#HJDoJ@kql?GMJFN3X6g`(sJ3_<=>;r2$A$`|?&JirV`4u7bqMUW$xCC&wxC?iuB5uH z^%+W^RCRx?*~9jz_0hUb$f<)L@l{(MZnOl(;i}-+6OrH8sf@UZPE=V7?D9^ZLy0bA zV12xBAvcVoRYaN5MUNw>J@O`!5qa11(m~W@8TI8$7Iag450CAa96?EZ&NjbNBo@1p z@Nb|sC#7wbYhlz+-xC5S`#X3UKvk4$k7BhL$oc)7_q~9CJnrb@g_wz5gV1w2Y`>Sl ztz!HY8Cvt3&9AY+dh8MZ*hiu7;}+>AmExReg3u_Y`SmHt2Qs%AD^6D)H>vf zQ<#qY5HVqwAdQqy~W=8qStUqM%a6PQK>R_$XVcli>C9L7R zr+cC8^KYfw?@2VVz3VAjz?lEvSi z;lIR8`iNpwrH#RasbwS%3nPpIJYi`aoesPuFj$TFLm^KMR5}|TbMIG zmU&U9;Km1P1L5X?B@x%dC`Mns9b4OHelK!NAEdULy24(0LjfZ--%_ogCZaJWDQ>ls z2fkyeXVPCB zK8o0I;KX$BGm@1nP~yvE@9s!rBp(jXOZp6(u@OoA)-M{-{xZTC_obF*l3CkZA--R~ zL?g!~SC%{y!v`(=|6hNw6T#OOhRZZziY5_4ArS`bWns<)wt)TRS!vCJ$n`egSq>et z-_Orw6iB+;je#A86C<79AGJ!%mK~Xk7u`O)#epU`gVr!#TTsRZHAOPZdl>c0RwFqo z=I<+i#|czZh5m_`HF`My9?q+gF%~s2KgrTLIXbRUFW*W8084k9WXQwu<{m^amCvT) zg~=ux5{OQ(?jEWFSO`r}GHq*Lk3ckAK00(EbxA~CN!y|HSL^l8`Tyz}_k=>lr)R^X z6JADFxLI_wE|d`F3Q#CyDbeGv(GLx7R3N`b@tzny8WSsdwmYuP^QM$Aqr%A+%#|@wd#R zo}S^|TP(YOXsIk}STu+4H!@-*kTlk_*C#d3mm622=5JmdS%~V)t)rVdq%jJi(c$3< z`+adDDUyNObVYy6nBtCvzU%0c`L(0hYthGAD{sl@Up-4Rq9Gq&QK%dp9i5zN(nYQ1 z&?U5t9&4~=-)^+l%2SF+kfp$(b&C-C{IzRwluji!%{bPf+gP3&4lTva3YF^WTx(zH z77f#hLKTB4uI6=0NNTTfKoBQg=&+f7z``vwExzEFVQ7CE3jF(su1<)-mPtTSmP&-v z>|lqUbpB8F()@xp?#-*~ej#YgDs**e{$HzQZS1Dk0)YqysPEQGyN<`Pn^${j^*xUF z_dg!7F1j|*CP%B0t7IwNOzp{FUt%56%JxZH@*jW#G@4-I6Y&oWcl{}5w!Tv5iYEW* zVvoFdI*(HrU7!#_Q_oL9_r-?mmW}PcMndnjK)dkctLF-BRzDuwZ`imnw$tr>JpDNlqnq8Pjz#)>`sf41 zUR@C*GZjri3n;f?-oSQwJM*Jk>bug($+5}Kt~@mI-~+8@DsfNwCkMOawzHy>s&Q*> zgzeqJ`j^#@_hNOx(h;1#K7tH4qa_C`H`npTD~7w10W^|C2a3&;dCH zd@K%`D&yE6&)Q6%wKlymf3HD-*B;4-?hM8>&i85hY8#VU-5sw?)`b6ShaF=6+arUr23qiG(P9v*R3VCc zaab)l_p1q*^0&5|t#gX)uAX0ocmWC}^rLIOnYO!jgn_-&)Ds%|1TD)}UuB+F^*;sg z73P@U<&^lp%>Hi)d>N*$=^7ef$}gwh+a(Xp&^ix;@A&N*FHU}N=VqaLZbet3^NX=A zeYQnDSHmKWbMFtrIM&0TbMdmlv~7JUV5xcDW}S^ik_0Zm_RZif)hs29+&nV&u2Xxo zhxm#iaYp}EB4{22cQHIk9XGsk^m*idujU4}M6WTrHk@-4EgwzfxM?pgZiJH(`BeKy z)O*3Lk3Y?bv7)0pWOs_C(j>dZreVrvdN1e@lS%wn3Z7sl@Qtj==$RCzi4G@bX5g-B zO6H~t&b~+3VKEy2mn6WmI&{BSoKVKY<5lXbOf8Fl%aU{-)0Uaj+-mH+w)ORdGo`gf z8TaPwIHY}5gX{8@GQ(U)4NLGc`ZpSA-oHm7{<~|K+`HVjTs#n_f?(dt#wEn@pFINU zGsKn=<<-fjbTGW}c5QCk2?ARrBrDpxeWOs6Ft$N{6 zq^d?!7O0)PKPV_D)M{21S39?(w{FwuMJiu-)H4oqa>^w-m7t~_)@oLBP%~Ox{1Abj zq01BW84eO098~1^_;}z~LkZ=@t=cr0yxd0r@V4E9!)j?Nj^;kR4m0=fyBxafK)vs_ z?{HCV%IiG6Ctz(Y`j39F;XJSJLjC_}0ZuhbWdC+_Xt7xGA$IQhRgD`%Rj!9bJXK2c zFP8RjMIP|ul12Ap-+FYqx+xlW8;QbR8!dD(+lJ*nLNGnL?QN<^e&I`nBul`P zL6M7C*7C<-$HQKO9|mKj&+*zV>+&@ZPhAkFbV2W6Drq~?A0~sT?a>f>(k5ISr;3V* zbe@R_U;(~Q!!MEauEb|HQNEijM^+tb(e3@|mUTJl>d3!J`)u{3PBgFSWKrid ztun*g5T{`gMTLf8ni+WU2jr0CHnBHL*xAuLGSDM5j{f;3?ImV9FFcLIREn}`-7S$eWufd zLsE{VhQ{k_e-B*`SNaNiOWqBN20h#r{fmk)$4FD-*2-c+Gu=Vqulwm?T_(-rPtixH z7k;y?06)oBKbO*d6(X7(bG94-tm^Yxhezu_EVZfz3Z#qAQ0OPJ zPvr7qzZO-u6;ZrGTG5f3;U7h6n8XH%6>+xuGhAd%)=1PLh&wVdp1e!L=T&81nmRhPh! zIR+BJ=URLAl5NvOWfm@;sh3jMuJ4iZ*%4e(NNGJ^H!$W%M$$MRS6I^6p&&B7q*xDE zHa9)DZ~Nqxi90!!$UT)CDKcX4*ZzH(SXaj{c=yzClhYlRi2Ew3Him`^f(QBCv#Lyu zjHJOtmxiQRn8HEUSsN{^3u#l&5H49Wp-98Ur(?^3m z;M2#;fF;b`PM3n$lK9*)5TW*Tg4B9QER8>L>qfP&)bPfTzxK$(J66RQ!6l#QZT zK}}OCuFKGaKKhU0-*^)i0+G{IC=GylI5MV3;tzZ?HT%cgUCgzCPXMs|Tu|S;% zRDQKc7+&mdLy=52o?}@Z+Tg?|4R;X^>zO&DB0k58sL4ZYDPR87Ze+x2EJw3;YMJAke4efo_Zj*9Q~xHU;c6EfRsq)bE01vn5mnu8aL?DZu3hGqe-h=ka3N z-GMJTIhYR*(`3qLQrZVM5w*R2_5uBOQSrR44$wqrlJ6$)o#r6H$ItFvwJo%T(it$7 z`%LYH#w!skX4VJD5vriK%YILOYLW9Q)zet%w9PurjsqV+iK^slpSPw;VSe~$T+Bn_ zIOT_1>J+SLeEezUnMwG{QUkB<2HeK)l#~;9Ifij zfY1IDRhIn0t*3AMX+8`8=v_7Omo$wKR?H*s&K4+ zV^IPr1*a=E()TIg{%7Iq*u)5eEzu_@-DFM2#P`0FfRGqRJ6GfK{WTOaPEO~MzD%T^ zu>+2lLA&~ENC+4Sb~9g4dJb#1OqPn~#wzk9q5-)2ZzBJsSSClb1L#GA;yCn1 z7jj2$dE&c}i}&c2;SWnxXmMpX%RP0E*QsB$A{18P_Lz0}njf5`ogr{s4Q1RW}@=*HWby!o2q)|q`6$ddFsA+NL?8vpN^89tv3W>hl9}KwhVW`UU za?BYrmy3l!qFH_Lp2DFAbLyCEb`3TM$zQHSx^$_+2=mA5A z!_!Qyz=l%r?za7kp^*_hX(CX5#%0z0M^>T%pu*MJS;ds6a2!a;{$A$9H~i1Su>RPQ zaz%vgP|yba$b^eeA}!HvT5{pxp~-HkLX8U_9?a+8l$0@zU|9~A%hRej=^P9&?avv` zdfTq90`5>6`2}Ye`3GiwPB9sx$W&s_Nl<21*wPXqQ!}=EtrZW5wR6pjyg2A zMM7;0q`?Wy_NH)=aYYIW(wzeqCh64aA|*#l%&#G!D%3pQ?b>89W_-6G?HE&HI)Da1 zy<>;VhHJ#w>3WU6Y;iL6_*kS|xJd1p=|Mxp%jy2CT=23?+^i`(iPmXxJL;~kuw9{~ z0DQ6K_Tglt`{Nr5OxOIdn3wk9;hVGKV8nt4*)Yk&U5=Q)c44u<|5tW@hWcz%w}FXK zFEXX2F(Q|(Lb!M0W4nk_-Dj(&1@+;4zRMX|Q4GY5(ad-^>ba6f7WmHwC2*r-V06T@ zolkrFA&eHkj_6-kt&JA7YSX<6MU$VAe5esFLK%t(B#GYUTkgwind@pPlMA|aTQYGs zFjx%@Y0-bONu3@}H!o&7d~qyKloRxb+iq>>{kX>&hb{CnHeM=Z?qxF=7L0<$kvc4^ zh`?Pm?umwJx6JqRDT$unwpI=LrBHzviFHX0s@RZlkV*o7PbqW+zw|P2)If@WPmU}lmU?{npbN~jASY^4Re)B zT)d3bH7`(-^<}B|g0VE8+ef{xy(UH)Wfsk|){;b7(0?d3pA_xg14=PGh}RKRzND_j z>*yFL^-;N+GKNr>k>$0mlv$nYsRdGm8Lt7sQ))L%Co8L;!a#u|O}%s4jF)liOvyt} zFA{{01inl$(&rPK@ESeA#YDVXXY~p2@bI8mhU6TtvqNjc=4flE+rZ5|N$ecvs@cqY z-n8tQ03KMq$m01aubQw>+qw{wDm7UHVp#HT#of=XN~Q_jeJT)&AbqJr6*) zcw8V>iyPw~PxjrEv(nYowWH!K8M9Jw5Ub0PCMK-w#E6mtrbtyzP@#$+O|)lwMqme( zTn=8gXfj`1RH?xreODrVa(6kr3*7b_YPpiiu`UzlOLkoA4ppzHv2NeqrlX?ZAVA<6 z#QK*epy=veUMOcN6{yh(eYb+`8mwVEewQoq3=bEX6fiN}CS-Yae1a;VF;Y=I#siXw zbd~iuc1x7{{=Gfsyk>Wu*ooh#9@lA>Q#h)#&G3#b zF6r`xJi~>8GY>rx&(6-y5N|#)53_#Xl3y@M;i%$MIY`d#S3yf^IB=rIrQ&`sOXuvi z6|v66Y_N4f0gKGy;-c%t!%xln$T#D*S4YW`mVH&pgZN;n`*tT~Zr~3l<~IC=M&zZ_ z&Kn=tM+kgt?8xz7x14#RIV&Eyp&-V*zJx#TsLbv7^HA=**;%UHJv)CECE27eU-$l8 zCtf~#-iotX>YH)woRz;L$->G$Q^Wf;wjezO>l7kE)H$1?aoGxgY?8;E#92a5Brl#P zv-RYsb!nD=YkEoVJ6vtwK3?VMsaCo-P7hfpPkqqW^4P=+S#ONzab;??`l;L_kb7by z%t<^<_(TmjIK&;L{8z;TZGHWAyytwEW`=br*Zk!?xZo`HxM4~V)T(ppJHRs{z1#$McN@ZP9DdP6ZT6S?Y1tX_ zmD}-j-1q``+c2Jokv+I6;^D!E{H9QF)UF!8m|x@Mr`PGuHVTH+JyR!NTgc5#`(pQK zB-zn2p>=9Xl|DF-EWhgw8>(0SO7lw;QW$#Nn|CHxB=>z*VbBelFz2&i(O~!aJ)_tk z{CZOt6>C(Hgpw}oH=|pVr3il?NQ!t`T)ulPQP+m8mc(RE=o)@* zFbfOT;i1k>Cwt(8i5dfw^*~40yTL4UB<|v@$O*GIU54_;%*j5HEBM(uY~#dr;;Cfz zK#t*`UhTS>*Eqd(xQidq%xMZpqu3fG@&OGY=CeUVe*E~M!D0#3(WI_?`5IARr=!-V1oP*~Cu0Q7f*8tkYYGLq zfp*rWr?=^_K}2Z1+5f7tdwqF}N-UX{DWNZHydIGnDKV)`+pY2JTt>YUh zQR=7dtiVC{(Ma?;Veg<(*(m8-J`67q`uO;Mgn=Da^PUua5#DydsQpFpg6AgSqYx?; z8T6akKQjBjRqQS%u32}OIHC1(VbPl`kw0;Tv z^a(J(tAm#RR`w9cxHl)N+FPpcVBEpmIYtvaIz7EZ!t&|7t~1XRe0^s&H+5=U_Ul|% zNOp9RdshmJY*%V_v8xEkeD$7dl%+jev5?>uwQQ=eUHnL{CsZSRNbpG(KRMv_m}$x#Ww?F*jhg1ktSp4;C}gbr&M#K?mWyEX0z1PLNT_V3+{caX?c&iL z+3&B=MABNS)g?aiUbLxj*c?`*7>>+VJ=_?D^bkav=`yEwG_IstC$o2uS0$2>^ZaKB zg4L)?uwcc3ol3m0>l98UgNl?&BOEq+#-Yc=AQl24Z&-5xn6QHy9G?@)o6>T1+UX9t z68HHN87+8ZdZFeR6r6v{GyMUr%JX=B26A%!S<+RMDX?pnA!N@}lh^6E*r~F_XP1>U zjgM&ZcmXB6eTF)K6~B#5llU-HU{C9-2O|Mhqse#yZ+91-L)Tr_Vw|hO{#{&WRLpS` zZ+{KEz%{Nl1VcYmvKh21#e4VG;12zb882`@4O$;9qH@_=>fU)ki;%IhmY9S;wKwe_ zDRnMtoHmY$KMSTC@;>7~*xh-c$RAg`6_>yH=FLZC>|0njH7-XhXP%@^MvQYi_GjyC zCS%T$j@5zE95O2X&rWAUKZ=5pdehPj)U#ot*u@L2g!fI>Oi7oge_mvkF;lm&+Bf2r zvf`12&*KH$;0U_q^XrV*ax)|GDw0#p*M{5cTQI~ZiCA$Ycv?)%)II^<*-?}OBUJl82C4ZOJYo4=D}IbI)%83M zrCy}&Xp!z!w(H);I6MZG_A8*Ts6IREHIgm5=G4=h|GLWIdEHM-(~YxZKLu>6GK=-a zd}w4Y59X2bINd;0&d+QiivsI#iLle7?b+v}r3-U&@Es7Ar@>ZX*Fqa#)GBiLPFI_Bq&~E)zu9zeGit$ zrRc-cb)+s0W?QCT`V~H5Ky-(L`9b>5lBpLqk#T80z6m8R*b`Oa9v}-08o>R%uakNQ zaai0)kcne2GGLNT;@tJ9yMQqLM!v>vs;!O=DnA8fx~^rkH5IP7g`rc@s4Bo9PT+$n+{yXsL2s z^V=6rMyYqHQ@oUw#YU74Tx)MI_>nbUJChxw;VPG=iSA{2{XP>&OVb?msx-(q6``~9 zQOY}wyA-N4)ubichNIfQN9pP5H(*&>d!0z}CvbJ}ItGTtP`Nc+n~PrMm(ZY0fr3Y- zQ`B+F@10vODji7ra^&^+xmsF8kn))QoI}UDb2;ZNY<5-LhaWc z1t1PBAC|m7!-r9WB5nN{Z@)X{4w}LxRz5-~J~HgkyQarTkfjTyR?Z@C@93JSU0vlp zwI*&%^rQcRg6PsUx6sfk)3ixM-m7do*wlD;?fA0Ou*jApK9<$=CuxzbP1MC!BYf%Q zu*OxQw{qrI_e}u$`k|_B!;-PTwLbO?MpI2K^3ooo(@s!3c0K-3jU7gYE`*ZQRW`bg z(O2+=%#t%yIOpaK#)nw&(+oQKU#7nXOHxKj?%LXPG~<=f%*Y%NlmA|YkkFWgFpv_f z2O6un25hlfc}CEN@_ZE{nC&`$bPGHhlz&Tvb+{jNn3h)m&6NLdAc5wuY3UqiQR+=+ zUE@#kmeA8zvF(mdpW>juiz%Z2S@>!HyOP-Iv%#dD;2&2){2dKqY%xKL#6P+b;;DQz z4>sh6%-Q^Z82giRQV53ekW9}1$Te*5ZH;*l7pFz+uYJ{cBhoF>82(Lh_vVc-iW^~M zR#ly{iiVGJ4F}Vlz5jn>5h?5>8IpSgIks0qelm;yuOW#R;w!a1C7DE6<7^m(AH`?? z8n;M20{{x&0zlzg zkjU;NK8G%#+l(nD5aT>9i{gI=Y>OKDD(@ABavrWcZ=Q{kuLb%vN$4%|J z?KSx{*=*;|2iWTWJ5U6%N$nAv*DMmO;gY!hR#L>L-Pwx!WkPgxQo{9mXt|#rWo9*t zURSvp7?{7Sx)QTjyt{Jtft=xO9`axF?`{Zfv!xL4QMz)W1t*wJ zL)UZEn#Ik{E=p+L87h-mIyrF!%|gESH-Y^%jJJf8Vf>i}$<1wzvJ9)GN{8v0zxG5V zhGPxKJVF!{A5p)!-P0oQPs>#qdBf*9^TtC~Hu}Qdl;Ww{^C$!EL$&94Z2|a9(OTx4 z;gYF6Y`Ni2o;*PsNqF7tX!eyB!l{tE_(Z3}d&|hb8l$fG_;~;RWK@W`N-vJ7eD(M* zirvnA`P<@Z7F~I{iY<+bhBcrXGpEb~H~I3BO)5DLeW`^)qyO73=dj2^^TEb1+#l71 z+bB4qH7QU;aZ-f8?3PDN95K%RonEg}MnSO;C*-R*tk-7)Zj$m^^@M0X2>Tg;BvcyM zOvr0GH!|sQRqJ`cy}fEc(9&Ff)x985IS^xg`CMSvj@J%m5^ z3hYl0q7|7QWC;40u*5=<=JUrNIXCzJd&Y$ds2OtWuTam6y&0XOboWh;dwS@tQk4M zYl%xppmLNbg$jTE>bQx0;JM@m5}JsHRM*^#mMg49_CE5j*M=^YIXq>>khzL z`V;;Xr5@(kG)l~dYt6aAYw2*KMrR=JSu#HalRBhH5CsSMf9Y^Ju!De$$7Sy;uke(x zLb5N2oAZ=1ar`KfcsfT)%}*gl98R8Xb*H!|b+9&UyEsw9lq}ZV+_W)LQ>DgnHH@hW zv+I$`o{H{`qOEP5#~;i??Ti-7q&5-R?8% zBqVeeWv)5={h^2uXov1oN$2P=gr2Kqi*}Z;SSNMGHhaW#c(_4xXY4c7MyniG+02@5 z?98+LyCM#h)aDw>}b826N-=^7#tVzy`6UF@8|RRRIaF4k+rOHZw;)Et>QSRY+W zWc%}nz}KWW7IHYfLt#--ws!-?n!zMb!!w(tiqz=ZJqxDKM*K8}O=;$%XMMRv} zmJk6m9~c`JY-(;^SeWNb_zSr`3L+5(Kvl$Q?Z}#eVflQ*-Q#$F5E|a8#C%wQ5Xyjw z@>I%$?QQ3iwc(@B_oL6ZoJ0PRi?Hwv(<{S#zijjfm%Xw~)Q{-oY2A z^(fb1M#EyFGSX&F+`}R-niV83$I)aG3IjU6wEss7kQSlJ;VS5W4OP;hLv=>%>&VT* zA{2qNS0VW;mUMw-!?ouQpI?!gjb}xQQ=C|Je1#iwVRNtsVs_^=^;-RT2;7jV!~IpN zFQk5YU$xR0V>%MJ9MBN|G(3-*-}(h(o>q18$&MowWfGF6O^ds7i9G$gH6%6_Jd9-E zS8)^VL*EM{I8c29ecYQOx&lCDyXFP%T~6vS-?Eu^v9F5!?&yHu{{Z>;5iL5@10Lv# z<6{{6H0#TdPZ%kIOB$$0(8!2v4R>@gVa@IytHkY(1QPAvzkdz&Ea1)Mo0Yy7+Jm=Y zi`VfXlgRur({4JqI47hhu!BRivQub_2rML1&=A&CyT80CqF7XWX0uivY%x)bj_~pE zN!6aS!D!Qqz|)vl?<=RAm(j41NLoJ>FWGFPI0nRORRsfPmL7*o=1-P4IAA`dpkT|; zAw}r5I6S9kM34;SB145_3gmZJm*>e|X0&pR$L`ZAy#lo%{j_)UG z9IqosFiZ_6|MTZh^xXx}E+788I6pmH%T4;K##7a8EPN#_EyI_Qcd>6CtlqkX1#{EM z#I~gbFpi>xa)IdnGo@vly4!Z@kzaRF$!vD?iF0=W74g;EwBKBC?lWVH{u+=rd~cnh z#j3ou+?GQtz1JBgf)H^qA4qaKx1V2W4!}qGrmat2wRm>CJE5wO-s_S?(D)Od_VUG7 z*LvyQVldx+9 z7YO801WK}?h?!}|76)S+FE++NBR+la9*p&a)P1O6M@xw_gkm{+=WSW?4|0@x)1r~} zgC>{HX6ETKNu|*Ff#EI*im#VQ9_ z6`?wYi7c!3@CrkWBHcXMHO=>)A@7jv&<+u|DJMI$k-IRcAZ~8yc{bWj;n?w&wQdX zRqXI^r0m^b?Q3p_bWozOd!keU-YOwFX)%50nwRZjq9cxWmGzSfWm=@%e)V9o%uV0J z!^6yMt#Gr>h`)#a1hRi*>X*+g+4S(nY3b9wUOE0_wASswxQn&%?8Ql?+y5PL^P9gO z@yBx$-u^Obu%8B7_ADJGo<}tNo(_2{r)Eg)&rI+zR@N+5iIr>RPtEn=;1|!+!bmx5 z!c@CgB^JUfb{AM7$6`sr5yUaIZzwRJg06sUl`&gG%nPG{H_r-<{y0wRlv@?Fx^AMQ z9gXH36z?t$TyFby8{1KFK!fX*E*YX#edb0y3(syd`C}v{fp-5pKKI>j3H$$_!fSP=bpT{)mC^;4mf>|S9y{mfHL?u-6$4F_yC7ErP~-x z9^6j$VnRa5(zb@bcA84@y2l<*(t}Ru#*Se(?pqcD`t-!iEgPcT$#t!e1XmDv)NkVq za=xh`#+I~9c|K5HX|GW?`VfJSF%e=tASrqOf6vt(KA=Uv5;{tS63f0a7T=|RL|Z*F zE%mM=K;)x+27Q_TL;d zDMs_vb9;{P(Iq4L2W- z=CJKKz_@S7C0DX`lGNQb+F;s)|BJP^0E(;o+C2{uh#)}{90I}J-GT;pcYV9)?)l|*gnR$zPlS(x$r_VWiueF}%_rw)jmk#Fr z4A`Go@39!RHe9!B3q<(nd4)_ zm7__Wn<}S$@R)~W<_}F*AAMKf<7TywenNhJ>gnl_Nb%rptQVEwPCZ|fNcMsCR~LN2 zkenSLYCZJdo^|)ZULi%<-!tQqE>CpXlTO8<8IZs?8-DP3lJ4Jw<<1upY9fzfGQU(i zrahq3HB)VV@OVm8SMqF*-VR1(by_=5s%f%8E}tJDvsh3Z^R?vc7e1<>jkC%gocB zWY`;=Y#mcNx!0?b3^2rV_L$*3%Ph)E1k-7nm?ra)Ep(zzH01P_pW`;J8vRd3@zol@ zL%*Tpp#~c;^ETvommlBPbzMu4`hU#y-GO=ksX3S5{^#v@9{$|CmjMfS{?}_H3s|-b ze0tpwDw(djp~eOm&H7eYBk{!Z5dMJ$Sh>>Q7LRVZOf}IyzJE5ak7$7{s~>C=P@l!- zsnDPyH?$bB5QIn78g{)A$@-SdK^NF+%2$r+)gYN^AJ@Za?YftB|8no5SQ1dtqbzzB zI6^x()kkH5(zd9%$nJ;%Q_;+(XXQXoP!I?7AL!Kcy$XXs^uGjAL`1AmX5tWx z&J7OMTKVgWfrItUzP!9Ddmu-B<>k69*${x=m*v%e5>20)oId-Ynd3$FWJu5!J)~!C zR6{d;C`jvVrrMZ>rt^gWSI8{v=0BgC`&*Z3aNEpPc(d`fVxBo%PffK4`$?B+ z*(m@0SMtr?$hjJT0n~J_a`-<9Oo~@jAP2U@wUv5d+`ohgEh-CF{4B*T0<*u%Uk|3$ zy6VJI;&hIj2igK!e}X%j-(^sho-4aQy5P3N3S-6U4(=$icMjV<11z45FqrcerT-6} z)G^C~F!2}5PtDql0J}2%pfuqww0}uTLSoY;_&F}K%dFF%Wv%9g#={8XqN4CD|at0w?Zm?HiB^NZ1Hlu1cPJxp7EzP*V-}W88qEF zwpy|j>YO}-i`V*Iow|FURo+H`w<`QeCN+=o7BD3_e)VAq8yZp)m`43d)5y)iq28*j z$nn}Zxtv$LE;YGeV~fyG*GGJZTN$h@>ln?8umz8fhAJQg5y^f@S}!qQz2fH` z>+4XbiU*mRJImd}$mt)oD$Gx;kpms~_l=*y>y2*9L7@A|$w_AX|;+A)$_^$}~-e0Q9#@#ArYG5+n`1o!S61)<)Vqi6V7tnOK zpOeEqr;`-(V+6)T_T=ykSo@J1QmalYO)kpTaD@P#j0Lq0nAg6>(uWe1>=ss0b^a~` zvwjx1+|?=R`Et2psJuqg=~U|l*tQjq`=9i2uj-dhZs$LJnl$Howi0jX=I;79U}$Iv zhYc_;m7!O-8QI3jGJ_~F}SL+()u|XY}aB#UfDo2G4C1%L)*-a*XxL|`G zoo*a$^$Qn!9`&I)6t5kf-v{1awWdi_R8&CCMl3=gC$Xdi07V>$gngE~uK3*_1i;dl zl9?L;K#a#UB>Va%CMR$7+pDNmn5FJ2MI#1sLI1!$9Z&G+vi&>TRta#M|Y z-zwuC{Ole?lvJgHLBhAZvr}WeLJzT6oXUY4^0K435J&0flwt=9)lwnOo7@g&#!GP2 zqV7(;MMRoGw0+GGVO{*~2-IIp_W_KBdFtV100~pHb^u zboAlE?rbH)^ck0fb%Pii{Q7S&TAk38>yqT*K&sgMbp1vkF@Li6!ef)dkPs(lJ}j5W_SEf+d1Hf^O<(>6LRS_Ildp?oyB4EoSmwubKgm1-`n`q`T%IuY>$3N zOuKKtYjURc8tFQ*8E?4!lUFrX_&C6B&khLkv} zpN4?}I;4ORX$x)--2gcA(f7*F{v^sbKX)hDcXeZGYAWS)C%$LpKB*Q93yeN3L6V25 znHe#!S3y>mB>DFrg6`-LXo^8bmm^j@kxk`Rs>;fPv)=B)=lgA3p+LG1W(oO4xk8SI z;)@kq4^dEGqyK||6c{auYZVv32VPx!?Q5d8{Xig){%vHh0n@EJmpua`BO?Qym&Fnl zYFo0OSCMDR(|G0-K>+8#A{KH|1F5}0T>+|CLU!|Gho-ylKca^Ul&%lAm{s7mQ@?m1 zBNlv+0bf*9)b~un-e9h3-v6x1uPaK=T4xHt5cu^fc6UxRi>YpX2ggXgYpQ>#CHD3f zaODFCA0)!?-LitQ|MTCT{;0@EkOpPTrR#LJz!b44c|@rv4I3FAhK(#~hhRSPl>5gc zL}{rI>fiIV#L@@u4~8kW2@# zk*H!ds(6kHJw#q^p>qDH@AbpmDMkCDiwY1DtJDSkTVDQbJTbxg{&yt4e1Qoo99@(Q z@~O6opVu_>Jz0qdn)&&glC$Ftc0qrfuJ^k>J^~OppQW~fw&o1{PiHQgIL9wHB~q1; z0(jP@&11VQA3&BBGcI?W6{EBYnGewP#J^FahKiS6+eWEPWvrWiBMUax)}92CKZgdT z{L#~$;Wcm#cK_|3yxE}URObYFTEOdVqa6|W^p1XNV7HQ;?xa|lnQ{K}o36vPul3Bry+&@E-{ETp9;I#T z{;;Ei1IhG*HVmQHLh!1wB7T3exo9-$9bw-vaM!Wk+Pvqf1VDG7q^vXmSkaZWHE>|1 zfCsa!xLF8{Mp*DDRB}f{!FEkYGX1+~=K3$ehHvlL;CXrZzP`RphBY&*b8Ca|C1LL} zfHOQkCI%8w8(}%h`}0SJl+=NrpMUW>BBahcX%_hxpE=N`ep>QKN)6vxSzT2~764FK zaNa!#NJ=6MYyrVE>t6KA`oxh-LIy&@*XOEN6+DrK*GEGg;5g{k9B`(J96*!j!WY34`y;_4mS=P7{4_Yn zSeYykSy0en?zB)B>ED^K!UG7QU|8XlnV!DXwa}I>CGk+?un(u9kvn7>Sd$gm@Wb1s zF|u69_a#iFi%aW>km45`22Q zzmyhl;PTmsgAQ@7yeW*$wx) zdiwqC`nCw?=RRC_VM3PCGV>lbcDFb0i@D+@_BC$&z1#Sa0}uRV4Gl_t@F9>#5G6E+ z20h?k;PyUEkOQ|s4uZZbeqoT}9p|HWhhA$>lERW8*HGd9!UUu`SahNUd=v}8SzB?R zu=LWKDKT!-VV=C6^KN$`1SlX!)g{ndV{JY>boReFF;bR(I%vN91+(0|_rnJlwR|;c zTG}QO0n1yGK@qG5KZsbv)pT`jinIWd zAy|PMFJhH!PY%4GTHz(gF$0@9ta&`Y8x1sW?+W8tGVxOvYsMTbOj+qWhW z5c1pnBb-<>(DAxjQIUp8{HIof@EEcN21{S_ud%{&#tSmNZVr!%qTKEai8yjtH`3c1 z0*N#x^NpP}uT<)c*PvF2P>D#A^Z6J%oJao72J`{A;T$q2ZAosA?h7P_poen|u%pLr zQMGS~t9>rMHlCT6irymmeAF*5z(=9q3)vbJ0F}}8IL)#XdeqkXHbY*a?}+b(th4h` zesQtiNP|di%ittjG?k;LkaXx%B&a+$kO55SWf-ykk4e41>ATMlGfbR$BbolHl(vrq zKF?X702R)zRUG%QE#BXvBFVtP*1@AECcjNff9UI*$q%hwIlF745PO4K$}Tz>IZ$D5 zb)&_!l*HBW8}(CIhttt9%ldKj)seam+WkkUMe963{@(R-*!$9B`e{&9Eq@oRMS!)HpPE_H0v+>FDfsG6TwMkD`86@zslsTjaMH`ayt7DPh(jnf<36E?FqypR z3_pJHpCU?;?z<(YHG0(AJa>sS10dSV1hocau}eSz%AZ+gYgZ${WcXUCYsFPv-8web z-QBh1Xl@DQR;L@CpJfMEDhLsZ0b?M3{>Em7<^`w3l|C>nXLtqHK*I3gIhhuy+?eIv{Xr!A z-c6N0Xvso=h8&?2A*M)b8>QmamA08VzU41`&y)koil z-FO*ChFo^THDK7+_;)>J-?mH3K+Fwl0OI#Fz7R4K_?NCBZJ}g`j2&V zR5Ui;P8=-dT3I1Z$g2JCa#gduygb%VY7f7DRkcu9TUo)*H=&Xz;P(nwqRDZv9uzh72PmydvZ85a%jg@9jgbwYwP0DG5n3C+!cAK3f%OU!y-nm!yD{BGFInqa}V zBf;V@F6@IM+O@(Id0b$glHd%9DQv{EF@_ zMx|OnO#$x4i7!DU%G5{?txs}u%Umq@ZC;;DmAQg%9xs@zUlBYadG$BN|43sKSUc()1T_nN9z(0W$&-yKcR-J}d#O4bT-mg!+5E6KVA4{Xnz=y=IzJgpcPz^q2kp?6p3Ak9DOhp{6>=^#8OF zCQGbfS_}p?wv+!_0yPWuzI!l&B?Qw>i(w4x9}4pGd;W9}S`UhyzF010q2zL#o2i+b zn~US9EG>n8m6itaJh$Y9a#y=`d$qpoBF0}j4IS3-n>rm}&7p4txte6$Vc)i4(i z%}9TCN_@63!u-hSYh^)NNe%_|8~%zAT7lrc1ZbXY*Z!eC0iKbvmxlf0s0b_^bF!d*pEw*T2)L%4@G|mK4mGXC<4yt zOCj~*aqK=hs$u>lE|B>?@@r(naacf55J5sT`7VKXiFUDr&}MvWWCRj1S>!YU40IUM z&%9bMVBv#G?wb2qv8g>hJlf?WYz!NSwuu3D3;H+ky{)^u8!EX8#E2vo3OAluo|qu@ zyB?f5^csq&*cw~%U{1-Dc+t)W>Tec@T|M-W;ljfDh6X^Br+V=OY^aQ+y&FZEE0$p0 z%m4P3?*6^zb|^+qQnunKhWx=#)6d2Wd~GJHI%H;xQUYo;)UELAM<62;TY^@nKs z;5EQWUf*1uZY9OSW0Moj^<^f$Dc@Y79h{=BQv{Lx8y9Xa_E-A%FMNAMcSEyKHgs#A zd1~I`n+=M8Gg83Y%wX@@5bxTk{SyTm8XaAC|}EyD&qJsrM8IDFJRHai3b0Ohfc zN@WfF{9If(A|&6JPhy3B)|#NP2SG}IKguL#Bqt|RpxTfwZ*D(;`uh6BH`v-(dRyj5 zpg({9^gfsE`2%o_+d&TsW{Z9xboqWDW}SqTD6lqM_y{6acX#J%S8`P?lr}`ab+&KA z%ME-M9xv88xjXXwz%}#$fj(deU9c6WCp51>lfiC>j6wQ}%_o7!v>=W&6di)7VYfCVe<}i+@w4*Qh6* z9-~A#zx--0%NP8*Yu--ocpY4!6-6$XG&p}iu@MVuQP4NG>fNd`9On);dOIUUtZoO9aI9Q zpBO? zj34`5{f7@9UVCY&=uFKTfX1Ku(t*ctb_XvX-{}Wo5W?U%oFy1HZ1F#|0Eg8x=;P5{ zrsz>psVbtu7=#=QtzU022wq{b`QQb~EbP~q0uy*=A1!7Zc^i3a;k&0`;)nOj%2-CN z{k*G$RU<<@I3n~bo`dn9A8%XOQBJGK%~qRlosl2ABMz0~G>V}+Xi*RJ>A=|ueY-Cf zKTQ5_6pKd^%wWkS#Q+u!yZKtzb)Y&mPL++X7r294+^ds;(`#XY)nS(?RfNUnx16G) zBE&;VI`1b8oIJw9q|j;~0-No_&!qgV#BqZ+8v55q{kx~nKmnoK+a4+wjJgr4AB2w2 z=XZUMuIX4!gdDc9x7m3Tbi$q*VH}o(?~~e#z87-ccKv?PR_}}0R;M~ zFZJc*W#0s|A)joWZFG|E&7BN>y6DHs_Y-tsVH6~WG?)w>7tiJmy(oN9h_nB0Rj0k$kWJp56BFA920e7x=;D&tnfNMpUXRaeSKBfv5Hj4+xTL=+=9GiCmydrWd^JI4;w?>!_=Xe zq-#q{TZEguww2wMc{w>epq>0zpOipe^8TXZp~)#LlSx$qjnjwFveN|^LOafgXAh4O zfUPC~2>5s%y7UxiqMx4n2sNdZvC-4#@7_XQV00I{U$S50Y_3~stm9RyQ&?GEZd0!J z`h}^fxth9qg#pmPRJ-|jYxV$akH}sh# z>&Z@#M36+{U)3K70TZfTa+tRZb8*8!ZV8QSp}K3_q64!Ymq4`W?x3oSzo8;T@a%7&KYY_BB_CSaSbV0>>q)g_o~K5RInMn{5nSjgcla?e%$hH6ttQ(4 z`&i*?cDw~HZ8C{pL$v4&`Ixp$iL+wJ&nPy;;hU6NU}pZ^wG6!hEF_YdM}?c zGv0ik%-&#=;jtIv75}C0#5o~CA0v%@A_ooe{nuGWY)Zj`Cyf-SQL&<+-Wxu(@hbUmjGGFE9MkK!G z)VNboSS!)+%l(gMpVCYm19K|CfmvJKOmsS;f68L zm67o@Q^uur&*!g3>3IgPNJCd;_;^44j!Hk~uOglL9qCYYR=1ZW7g_Nk1u$Rj%Eb#+ zkVNbxG7Yk~>@lVXwp=(@UP3>WD-eKllv_|RbiyN%J*@5mS5a0k7(O{}`OMc)S)Y~@ z7PHOwz4mJOwjyLG?nwD1w=k`vBhR5otY7R=sIHsSQ z_$gzk-h!Y=Tg&bLK2j>VY8HHn%x%^O2M0TMGK*B$tWVNjv+HIm=`=XUio*Sw!9Z<= zZD!=uQDHR(u*#0a&uZ|bG zys-9u_SQjPp|>dss3h7WB8YF%v1w&8p8<-CA-!smzI<(3FNN)7)W2ad5@!|o_HwAI;GF^$Rw(F*s7!UYJqGHCdTH|k!d*SZ+N2nhj@vz| z%$b^G(*eR|mE2qybIWQ>OvbVzT6O4`ZR7(!ZHm;{8~;maE^WwiEK^9w6wCAGH`;@@iWYXM!y8GJ z^*!dg7atN0Fei#hq3uhfwUE8Nf}#R1OYcXXWfTCZy+2^QwTnUyL?MA8=+t^OGZKUn z&gE+4toZWW*hLuz(!T`$8nJ*s>){_dOgW?}u_WT%-@;Xk3>uvnOTB5wv9OB`b`Acl zv=3_*r*Psi5bGMVtQQ*yd-ERrTA`Ipx0)}U7S5g>)D~FQw_v&b;bsB;LGrmut@#GL zEtD0;^xF_M>2!}j$5zfMetaAZYHG~UGfg4yuiHbP8+!Q7oFBLZ%PY4$95;tEtb$G?zzI=yP=e_! z=0WeZg|o90r}atmx3~RG$E_n)!^jxKGOa8o+w%JX|Kj5ql8LxGhI{C_spHQPcIyzo7myR@D3IV<7VC+A5QmXLm*dUh04l zHGh&N!>=lTzd>1ci@s+h96xLG5_zU&0kr&ivj5-Vp5cxTO6&9ePrzNm%zP(=6dU`J zxuM>&H6xUWiJO@_-g0|!^KvL!0ti{xadFfPG_sUvAfrBAhrE%zgl^cH;El`vPb9F= zr(!NJGkIBUpC6dAg?j8kET-$lG&np)!G zGAeAaZXffOPrQo#VFV;Vmo4GR3su+FFzQ!w@Y7#qQii1@avr(q)GB0qTaSfXykfw6 zDJbK>qNbttf}eHb_Pz3G2MhYvyx3uO-zP{msmPPfvQ>frpp>&Y`2M3~*9$ znZ2x6!<+qlpFe-bVT}gupI=MJ#`h+0_Vjd0rCNd|SPy;?CC%_Qb+hL*zY z^_o&u=yWxU&FJG4zrbUnW7IV16WQ$Y06Ft8f&#V8K&Nb?b6m4fWyRD2B?Of~(EPY& z*a9>$>MfF!S-n>?!*J>7^Hv1}$AgW<^uAIkS&c|AGuODUF&*H}^!3?o9$T&b{b9xm z-?N`ibUfQFjKO&p6mFaWh!miO+E`)i>!zV`+4l=G9pqL>>fN#%PweO1KLd_`>1$!b zbt4e_PG9364?sNFQT=BySk)~_@v<2P4aIc+SlT&Bsho|$2m;PHnq>wgGw}npuLP#!r4Oz9T<}!ci^9{kQ zFiP0nV2;7xZQ=U&<>lAIulrqJfFR}NE1c!El@7T`zzk=i1JRw`8`I1*4CFrNU6??E z^T*swLE-OJo!eBIwkES-=1{J4O0uS|zP`Hp%E}HgJMU?4?y&d?0l#0tz}&6L^jsj+ za&)fFt}91%tf7WhRvS@ZFb4t?pHJJ2Si=V2Wh!^LrVU+-X4d1Q{OB;R@+6N}$SwZ_`deq-Dnz_OU96~g4oSd%QnFeZxYDzTmJxCv>(N$bPT(DJct|pUV5ly*JW>F(u z6OHN|1F&q{_1GQFFc&JQ>P36A@5r={s+zqF(#XbnUOH#*`*pBc6}8UgpUQk&|(@+ZN1RcqP3NUU20k9V$~=~__kj3g2~nBIew z44HL)nU>}!+1SZ5f_eN@apO4_l$W1ppnp`WM1vF7fo(#CxW0)RrdB`-7%;#S^y*DD z#1M2@Wgv+PG1l_5nyhHI8OJKdd~VU3tPX@MZB_FRMG!gmH~fS%Gqc;oM1c8D)5YA& z{I2@Ad5MXhp58Wri`}AMMp3@Fpa2T^d3z&GF_c{={I{q3ae&|3n=iwTKx2^3ZY$(< zCsv{3OTV(pE$l<)sumJij78|Yq4gzjlBg2>-+1lDuNLLp^n>sU-IgpZfsVe;Dk zt$`3UQKscMoSniyIr_`rvc0ij2t2Zo?txSVxbRjDBTR5VI?3Zv4Ot$)StS*FEs zyS=1{^m;||ut?E8NtlBv>TE-*Zdhd)dhND}qpLfOW;2exH#IqFwmLIO+l^79^UY=F zH^{7ont%T`@0}EX}^b5&K%OC}Ck2RX@{Tnz@_;yzY@+34g)D?fQ__dxN zp#Byk$w?i{=|>3qvo5GeN}5-xfDA;1Yzt>zD%gg-%AeT`oFZbwf6HBE6=qXYTs@}N znJNr<)aG$)3sgaBb2AL%F3#)vTQRz{+zy#D%Lf;r-&AR<`znkwz6YpJ0&|k9mB#65 zyQ{FG9VqubMX9B@D;YyN7Q2?^Wz3v?#av-(GrF{$duGH<@hiQ?S5F>4pbG3a9ifj= ziLF%|Qloa*m6i#qWoH&dCW!F5!w_cjHd`rKP+nEl0tXTL=6}ba?WaI;zbs;p=KuP& zf|?-51l%pLtySgeD!EHkk)+&?0;OMDOqFPHZrXNz>6w@mYW?014#k5N&v$iX zBayqK`6K&Mb+Fh>nM;1mdZQ+6*vWUqjyo0%EqL0XNrF$X^3 z<`$Aj{@_0zg;Zq#mvM0$+BzwmCl2X(S(UUC{BL0+bjib0yQcuDhPURsa+@tLBgT^^ z_>5EPM91h$$UyIUC@jnnuqi_U4Gn5;8BBfM6ks_#pfrD}oDIIPx!JfnV~~%oE|Xbf zguA?^m~gxwGW2S0-nqOUF5b%0Or-w<`pHtflHus6tlV__R)6o&MO0n9;~tpS*o+rT ziGRjGe|m7RYqV^j?0B#PAop|i61}g@9!Kb8D(A<1HKz*eFk&@}rh;eeD1Xub{3Q@I zG_?8l)J`QsUVg}}le{4rs2XjfD-nfxihmNwSIgvHf9O;=iVlekVTa36y`Lt;4X09tiHi~q|6-^S{vCY2zU%%#ZYNU6 zkw~%5m40E!@O=mYA)jDf{-7l*>YG_o4KbixJADoThdE07+Ff^1)U=O&v*QoBOB)=; zE$u2tB5r@}L8}UiXZUR_i#Vi(u0 zz0GvIVurBC1h8%Qs^<4DU8;)xd$0v;Y^+`Q^gT?)HO#4?&p{y%MWh`aEt0r7Icage zcI6n8Hr^qXe(qVS6tc5qOZY(K?&3u5hl$BwOby3ia>tI%8wsvy1}DJ)G7P*D@xGk>-s(DV0=E< zK7G)Qk4(!R*wav-;m7=lL4}Mljh(=k6gxRprprywOyB9~^UiX;CB>gA?nTt|JR0V+ zqqB4+8lb7}n{6mBi*aOrKeBEKs*$u$qFA9EMgz@xe`L}JbB3*vn&(5p)8;^yeY!2b02^zya7H_w6%iiMARS|0Z^gT^oi9_lR;5RIkX}1JI%U_A$s7jZz8qCevRu*pGz7xi9k5acWpl9epX+}mT z06We{P!rL)XHTRZsqd+@vN2{)+{*TLz3oBI;QQa=;*xRk@vL}q7|i{9O&67}DAv~2 zK3nN~mWo}!=j zykg!daI~_L9*W4wq>qz|!hheh;Nem2f3UH(lhnO(h~0E2$%v*af+qdWctGuysZn&+y?TQcSpN5Q#{onH{?nW2_zOue-*}1lNas3?X`uhh! zfNZ!6nCTdf_xJ1F*NXD%ba5RD>kAmT`PXW2lQE*gjmmA04iE1Ke$Cz8p0mMK?7L<@ z)l0szLgb*ooy0)w{3Jk{GJ0r8WijN_^@AW$coIxkPwf!|c2FA|8#rw0bg{Q?$LC-p z8)^>vvgB6ezwM^Wv_KB~DDW_3mX)QkQSv_SbW9(NNs0Gg9m(Y?&!*6CVuE!`Q>a`P zjsSdTcgE1yuTGBd-zejN8Wj$J95;>+pb@&!6=7_gXOwX9yrLpLzvUcp2F%e>s|sr@ zNqg&PqT7>!9h72keAM8&DhHUfDcHFur1UR1Ih8xh%F29!`El?yl$Aw$7=rC-Zc*NE zmgrx(w71(AX`foh-Yjwu$h(%J+ zJDN?bndCj&ouM>N(8zB{^1IrMrPqn5lqQ!}luuWo9m>jjD7*vKUQs^-KLdp#5fI7T z&n*Qtg9;#RN~adBq2%X&U2#)kQQiXx&{63xvgUrO(y3c0Ac_hLbMp%snds7{Cpfq` zzHExOTluCcX@U2zrx(6-4mcN?^742_(&NS1nOU48+%Y(~AW#Q6@OxaMj`Q6!av9|ETb>%*tuv znV6oQm{3#G5Za6sXzm$?NoIq4zO?ieipYKBEw{E#1C?Ur%8b8w@zYLq8FdLW2?cxm zr0gEynrgk>gLEmdtDYnEzh3AhC3SVb#Udd&{qr>zdI9#J^)(mD?jYZ5xzxz&R;f>oOfHC-Db{5+Y~1#jquNTJt&^vM1tBi@|MA$f z!QW8~rSBjE$&g9tE`qn+@p}E>Js1xUx4mBP~9->H{^hPhvgZ;tu_NC>9hWgdN z$qyktbPK?PhDsdnZu!2iXW}MP!@7AQiw)~uLDn`lXLG_f+-8T%0HnF^A)wr_K2vj~ ziH#k)0;I&D;o$|?qrPW1b3k_r_N5AHhQ(lk63JBAxn0Ii!$&CiFP(spD+WyelN0X3 z`HuX21LNtkd)$zc+Ap8UyHA&={GOX5z}u+7U!NO8j{-P1PE?<8lZ&%eo*N*~PX z=s*h#2SYU1lN0G~XXyyW!rE0lqbGj#Ts2 zy<0g1!Q!gfib+i(1)evq!4Z9p53kheP7X8gjt)JV#;Lc(L?aKTo{!?K~BLh+$qJ#h{pkmQ#$G09F$xd#oRs@ zqnhH5Xc*7moYt6b^w@druB^P|GtGHNp;PBpn3PWsjf{*UiS%ZKLM3ZkDruAFj!WI9 zD!yWEz(^BHiG*~Uo-Wmw%w8o;_c#Dd53w~fpr8Iq;J>CX`yT*;`%vvFO7`^&pSztZ zFmr5=0y)a~d>;E3&Ib^S({h*HUV{|*_uiE0@a(K&&#l7aWAx+@G-zwQh;ojHOn}4X zx9V^_!%d20IuMaOME3CZwlFnkGWhkSe+eldr?GMA?(>sFar_rV0)E>Q2@`k@pm_Zs zT7Y1*|0uVFgyw``?@gHX>hXY|y&>FtR=(7jZNfH^F-olU9n`#V^e7S?^;KBkN*?en zijoy!cT>o75Fq+i=$8BX*gyks)A;{4;a0=0Ix}dt`JZrx%N>4j-y_8Vo+_c+W7Q*( zYOxTEa;-{f>F#K%?jcIqECo0gCg#HOGEM9s1K*tr1gQ_uJoYE^`-8-7=v()S_o)vr zfQ-S}%|Yj4e7pb&Y8ZS19j*3~$&3T(QFcZ~IEkS3&6KNZmYk5|rm2EG(|2Gu+g;cN zZX-A>{tebBH3fxSXhfz8EjWKe$BU4fGo)cakZ+iRfK4xWd)hCE5_LK|Ip^D06Nsn% zojU|y`q|y}QA9=t(0-S~s90_BmO3MZowh+br+%3w>%F=fsHB#thBwCzb{5mU-IpZO zTzv1^F!15{jdP8lJ_R;5g=`0(D?6-EHGTaCvnw~$k_bXB9)A9YDo^K`=hNSbH`I-*1jk7b`5#xrPjskDql&6*gQ-})~{(F*xkAdKJ zFRH4lqKv>t{r#)D8mXlP+(GP}E7EL;nBr|Zvj;a&U$GmBl!T-d=ezg(G-Pj3(A3v3 zP}ch4&kPeMpJcH$ji#!RGnaS<>)0kG+Fn{(+E|fDAJ(ZF+;DlhveF^Z0k->sa>lH7 zfq|koK9`=Jm%~<`7-p zEdxy@Q>NH#kpYbQ?xgT;JP-vI4eJxWz3l{AAC+7V0x-z&+l--wUgJF3+7x%+t?+pW zIuS=({AarnM7+@+zRc{y0(#_JT*%PZuVFCNXn87C(bm{_TxQHCkCfYj;rX}_(bdj* zXNr&YZE1DJ#CWIs;qnCNP<5F)d05gwKlog0!>W!}YhA%o+HUhIY}7cZtgOtT@#You zH7x8sl|nm9Z(rX_2ncL#ZEc}{b$e%2R8$WF22C&bZ_fB|U%c1Voj+y>ig`c38ig?eyOzC$SK8dBBb9E6S3OcnEevSA(6TTQ0Tt zaybCqClc~;aXAJ~xWp!DBfQhYyW4mKY`9}u>Kk>3^K+1l&L7{l;9^4$#EUCEaZew8 z0%8xXp=9P4A9l`7*?4&bz(l00Z#uutT#cZQzIh(}Fy}bV&rLNHs#N%f8#c|@;A0LG z0mi^1bUoAh_$bAf%YJi2+j$Md4uEUjJ$3Ls1b|Q6*Q@<7v2TPqu%@@xPJUuUT3Qr5U=Ss>{@sOd%kAor>gU7PNX(%VdU5-fxHC*xQe?H)&~{)lWg=i z$bsJ-sP0~dbv)H%av%F0*S9)3`MoP+pLH-WSi;3-Ep_lsF2~e~GcFL@Nd~?hypV^l z#we$!10`BrESt&lJH7}%)<#0wbSZ^URKj5d&SuU+DMw=8g={ASkb6t_2caeNmNc!< zay;|A9e9BpdwCL(gdy+wE~Ic8Rp;g+YjWb-yA0)Y$p<2f6*jt+_74MqjY(s#rc`-* zVHZS{&w1DsuIT1+Cd&F#$wfxMS^RuV#d#niVZWJ8AptdCu^y!-{)WPfC80c~+uzit z4sT5UHGjlq*0*lR%Pafpv9Pr@JTL)4K=#xgJyce9T9=ns1pFzlCZ2+3nKJXkhnG-* zLGfO}0C^Yo*UlyRlviu(>l1A^JbZj0Le%T(ubq|DxXwFMwvf(rC0eq!5Z8PcI2ysL zR9lSIhDIOG^fN`iB75-j263N{)X@cq{%GsW6 zKmz4|=?7QLR`jz`pFFEDD=kzgHFNxQ6%-eX>xN*XYL4&s>B5x2J(v4!=|As1T0xwp z)jG5}T432YXdND?kVANVltr8}4YRYPz|-+RE2_*nF_m={FJc?S$>}j6Gmafh3ZB zwPmfLqeBN}sZ`C_oz0$kQ({@o#B@`z@$yn$OjT^Pr3bse(os@kIfGjy!?_&>nm?ja zrB@d1R?YjpLDwqQZ@RsH&fJ&8&R^p2I!La&ujl6E-@;h#h4ZR?s>>&#J zI|aXgOy*QD>GIU+Ivy0%l2ueKn~!7<%T{*3^m;a?iB-(Q5^GA&RK0Dw?#OjXF*r%904HqXr*ggl@ zHtXLO>#s>pSHE8^miLPyqvhr1!hs=Fn1~ou)vOU+&i%rMYAS~q*>AdK0k5d0p-9pyK3Yt`R4ix_@$@eQ$#VMa9rnXF4Eq6oLueu057NncwU*KqRkp z$nx2~z{8s`e>(dc8PXFFtetN`ulDjbn~}?`suNZGZ$+bybvDp63JOw?dw3(y$TUs; zPrAmGu3oDYlTd%@6DL7*j+*)L5m?l3-2O-~CqeK6jlbu=8(KVtdLLPo@~axBxO*GnyX;Kr86~=bIRZ1U;;&c&pTu! zfAY+iAnIG{u^#TDWKo+?@J3AIe9f%m`VoVqysvXm9g5G zFg)xf%4UxtbgF!ZTfMG?4G2gNY$U_GjLdXv#`6*ExqGDvy}N!W+k=Lc_?iZYcXEuR zm(O#lL=Ok8n;V)bq7W%PX`j^XES9IhQ$SmFJgh<(Jx6&IM`X8FdqCmOM0y zs6W11dH9;@`_kW}gG{gQSNk3tG<&p}2Wt%ur0cjxvTQKv4xG4BL69PBh9=EWr|~!{ z5lGWYV=I%9^U)OY@E$Qr*x7VEin-L;+e3sHgl4{h-8k%iE>RduBOoH0=;s^9N?FGn zw2Di*y}5KcJOW|9_R+XD!t-LSIV1S&<3uov7LVylxt0X`p0#*?^Ltwup&{Dvh>=!-X#h@?>-& zFD+Cx6m41WdCL#KQ@rf4w1E6RgvS^~k(k4Fh9iv#(_}38{?J21?2XPxoY(1WsV(Lu!gAxQF6hRNB zd0%oko_4GCF^!nL%p4LI)e0qn$YJxFBz~Qmdkq=n%3+g}dTWt`)FuT(ryXElNmnVJ zN)WxO8DO8Amnxo`{s}Aoe@<3K&OX?qifq3kUpqOs(i(0Ynp>EyMi0rNV;-uk5VOAH_#tY`T$iA}B8z80EUH)TTg^qys`~Ke zldZMr4^qV#CM@3v;dGpwOx%@*%v3VfuC867Y^hoqllvNcC{!FGnCfT|J?W1 z8JFm4sG*A^CYCdvNdpT=$VmucTDmDUT~rB|v@+eAdE7%Lspp{IjcOoR_!PoI=rFL{wCn z(@X^os+4>4l#7wHTt!leZr)SKn&0bs&62lr7^qpv&{^3V3lK|Yt3E|vTA695n<&(K zuUPszNKPR|$-Ne{oC$Q7MzXiKwL@MHn`NUvoo*|&!?fI$l?m+bD#i0_T|0iT_Tjqy zkFsT6J@V47rG|;W;sN?>VJVyO^k^u;(|Rw2KcTV`n(TQ);Y{H3vRPW1$4=|!#bQ># z*D!cSB-#_lv%}&q)1xT3g01Uk)tw>pvWEk=;loc+GoooDv;tScK7V_lCq*)r7GWru z*h{>!V}X0$7AG4!5HpYgGmh>zoEY`5s4v^|Nv&Odj>ki*qBcn}>P2ayzE6veQIeO6c_g0ySbZY*G-^iZRCowb7()t!FSi{8XSx2~e5<&*^+T{2V^?=6Nua?K2&swe2;A ziNbQ`ZlKdrpl72S)ia@>7b;}U3gl9o^#?zP3VB>i%kHGT2>p|I*agG?=%~)(Izb!) z-Z{6^lI8~(Xfjw>C!C+Pj&6<6C?s7U2%|WJF0a!A?_=U}`SS9<+Bz>bG${pDarb|R z{JtOcio6xp^45` zCzjd{=)t=P_+E0@H=_fXeRG|UI3}(Psi6L*zAb8bH?G06K`vukWz=snmh=uE+E^U1 z;(SvMbo{G6>1qGnIP^NV$*=cqS*8v~o$sBQvu9pmqT5`qee!K$J#EY0PfC)@I8wLo z-g-t$sxts+`WM)Gr?@ADjD^6ul*PBn#e9CY^?Pd%5lbYw(B;XqdWFg_bC;KCkEK?6 z3LEh8UcAi8x`rJrjH#(X7U#-$Vmph4<~-z0K8m?t2O4&eCz6@=#eGN{`RoZ0;XKHJ zVsL(01lvB6g=l{(n7o48Qj_Xo9})z*h5$jI1$7_@iAeg(nqO-*KxHdpXpAd5+{G5 zU5N(1C;Sx<8-L|?jLEzqc+?ir6Bt^P{bM-$HG;{d}(g>r1u2zP%5ohiZMGv zCNJE6ZP~b5exARo5;{ScN-$TCh>M7e`Z@W7j;Mevrpr>y?TJ;fqwSZW#E`u7^Yq;O zP=i(biVo^W&vUT67VyGN&SGfi=yR(gwZ95b^<2^smMu>Q8~4<>Z5?5c{Nbss;@~MW z+Cl)J#Xx^|uS`!Yhw%}N(nF*I^K_dNdfUTD!_Gz1-Z!$cVw@bwSz^+k#A!PJKJejT zF}HzfZ#=Iv5GY#DQJmBep=lM4c#-M8FdTDP|{K3Td z!X-Xr)A5pfpXzwvhr70AQ>j`)OzJ{HTpd9%k-q<@s>gZ&ejaHX<1UY z)~RP;AV#j0q2WBl*b=sV-qm{&viNhcz0v@Ni8-y+59Pqb-iTK)0G?xH4RE zuU+P;;p_AM{tRkrmj2jx(D~Wb@2#Zoxb+fvJ&?08@dB^JaJztCr`JqbHV~FoO9P@l z;JrEUqf$r41V}9BSR|?=JlU5<7cdJG`C!1QVzd6V)U4a>ktYaKggAwD^+?xoj?^p&%k^(fUiN69V-D z4BZS6k=(J{+Z|holDgLAzCY!^3-<^a4&dRof+FL;ICuzI} zJg#vBS~%Va**NZ|U%YK}c8Ky%Gz; zL$)84{gHW`UmQ+{zSi?R`94s#F`b!Fi~2Mh63otVOy;YeHdg}@_SM<`i<8o|dbcwn z*k$i>#{2Vr_b=sNjn3&n2{JNaSU+lBfAZ+cV!3+=5S4n&8-RP{W|1BTSP)qlFJL93X| z{FW)0jGN1TmIuty>Qb$IA%}IV(F|%S1#ZjPs_NJ| zos`>rZ{)15Gr+D)M%#eMjj2z(kJwY9g40DGttsB4U_z1a1!w+qsS2zklCJw90-=K|w*3n!4VI+zyDK0zer)9xE9gE31_~*`bd2I9g=}$ z!BYJtF&GRJCE^7X5Vyoe8fTAObVx!8dB3>NIlER^af!aN(Fw;Ps7>f5cMg3BX4OTWeGO8Vw+wUmUh5CyAEJP_1x{@bINm36z-L&_Rm@tm&bQ^_*+0F`MsP!= zIZfCQ#}3Chlme;~uM7JM-EMAhdAVqu=dUk7s}g%_CbKFFkWIIIm@xob-T7crP1CNC zK7L5Q4$tX}{A!i=U+;eb|4v3#GsL>|St0tUc@MyWaS}Y;^X#QasR#@W4h{`YQ#J?Y zSIdVk0?ZThO?v87&jKZZr!+hJh`!YoemEb!pGt-jz6gLy(gTH0<+orU0Oa8@jjwW= zI#fo}Eo7L&dg_(&%r9ZDYu7~EaG3CY^{5!oWNP{%&Ne)Pra!pY1Of1%h1svbK39pZ z`NxxdZSuvWU%}B^_)fA0IytM__ zi=E}?;i2XwhG0A~*QBk$H>5-d=lIKZQIXi#DPupNLo> zJkU#dNy!HbaRVkZ5rR*os34=d<3GKIEl_odiR64=y^FK}ZobpTtv;#C!UbD0b8J2& zl$6gPwzBeUztNfF%vO|<0AzDTU%u=#ptf!sA9w?3chJ!h;Pbmdcii+BgdjiV(%Iq! ztTZOU8r+oxwxcIP;-5cL`iV{5M)zT9cIk7Z|0%EJlM3$DSI?bM!MK+uaL>9+uX%er z4HLJX$ARWzuu89Rp%Jc)=2%n04cMT!+Cf5F$kd;!o5b6nayBoU8V^P#5Lj-pojClZ=x-$S@Gd2cj zv$SSu@^hFM`~Z-j&iqezS`F+(^hNY+fK+TnX>jn6k^8|)c=!AFu=BH*2XyyD%FT^RCUj);uxdZhi-wYs{3QJWk0jGKtbhHZIj z#8lm*vfYTSZ9c%dLlc+y+c4c1n znH=vo-ny;iX8?b6+N`X_qbfN+`@U|qQ{fsGbx*3ig4@N!vv_QOJTdZ~X)RL7cU8s$ z?PCYp4WRMR+uz+k&~xA0=lVK5{S8SpbF^GI1)oagv{;&Ya9iYZ>T5`mVJQedy5)MJ z{dSX+Q#ndZAcIfo=&5@mN6i5OJf^Eax8adV>5x&K z{o!x{Ie!=Byw%ihv(G(y5<6~#-~+;`$w^R1vA!~7m;x|7TZs;{a=t`$Qm1`)&;3N8 z*>PPbKoY7>6&=)Oa1_*J#z8n&|6U2JbcoE0eIKmh2nt5M)G;%#RI%V;nQ>f#rxl7S z&)vUl`C8Q+S<1P&IX0#X1rc&Ax^-DUyWXN_N3KPyU&D` zB($>BCRxZ8C^(~uNV-<*6m<6Yz7`gN&@nNEf|Q&q4s`4RQzv_cHcBp|G}yt@#?xFm zLN4Pq)@v$3fExU}>}7@ZYLt)A!Ws``M1ehM-a_}qj+0}3q!O{B#cs@3E}MOtlPTSM zciwGJG@`C3z0OaGKCjPhb-vC7#kqhB42*Od8cv&-AZqJshX5JXN2k7u!t2MbI5=UL zxASLJnfD>A^sfyT7eSJ6CRarqo{jzLgrH@2%-MuBhT!>JS65(zv#y5j&D~!D<;w@r z(XtPLI%q{kE3p`s6Jc!qG|+t5o4Gn$Nou=~zw!+HP@FO1iEXB|+*`tW^_`Cr6!ZT7 zyyOv#F=F1S6>>v<_82{nj%Gr7$pG~kuwSyRt*-$Yo}Teq%b3|&0ekE%LdbY+8P;|IG?mCjX3f#K{ih=I|QG8$8$@_>(e86v^J5< zjoe(qgh2OKX)@D+waDP0rwRMF>>cHJZq)MwW<5VY#f?*DF|h7V?{c~hzhQGC=W#S! zVQCyK2gc$2T?tBcNx(3p?4kiPSNbxcB z!-8w8VF!8?;b+~~G52rouiCd|vzzuyC(`=YT_I;cs}?lR^9pj3xS=+{m<}vm$lV)$ zP9`ULiPqx*K~r1XnmqbwXyn#lQWXvr5{u947QE6S<&pT&QF!YDn(wt3@^}V zND#x@@w%;6lV)^Pio4UL#2y@<8TUZ$I>|AUb`J7;5+MysX2Rd&dYXhx-z0-a| zg!$x!k!24(6U)^`vfybD2@7?SmSoj=H@jCNF$w>FE_N+4)-K!uC81 z#LQ`0c0los_PzV}q#sjqSzm^5%ALo$HIZfrnp4HhZ6-t1ocWwqO3{`gT-RW+I+ z3yKCn0^P;MW%PsLzu%(3bi$f7NGc;AbqK6y7r`=kfla8t4Hg4u_59dOW%GI68pz+h z8D66#Gl2XNcCdE@2+L${gh(?Kv9Z?~(lLwa13)Yv8rGA))Wvmv*5m4oMYHB)d(0B@*Up{< zk3`N{$bNM*dn9wg<+yKyM&WuBu88K{W*~@~bvRW#zqAYnh2sjNEp0GaFd+2Nm$ME7 z_aJ^R=XFZZAt6#LxWYH*W89zNw$;4J?ngih8qsBRxs9-0ZxBGas}ewZ6W&q1;Ys(b z1cNtw-os*BSIx0+A^@r4seMewQ*<~r58EII6BXd^_Ri*YuWoQn2a=x!QxnpNTv`En zcc;DS`i;B)sr=Hi#co=rWql)rF6v%s;so5kwes}<)>W-MCI>9_u9{AJlBR<|qzdwr z=v}BC58092+U8K&gkdV$Vr{u4$er#%287S<9>X0s3V!4P_&l`5)@-6V#*NP5QtT^E0>gJxGL%fc+{vKn!h*A%TmZ zWy4h%AQnwd8kw2`EjmEGW7g9<9RO+po?4Z_tC@`rXybM2v)0uKp#AOX85tUS3PF-j zdhIT(0DxMc*UiNS%>pP}zTkWF7{aXEfbX<)58{qm2?sZogJjRI3qCwNvhCL1)&`a{ zEXcU6hSy!}`7f_tAqQ}cIzq{@Aybv56V?DuBKy<*dNq(nd;&-~^Beucg9L;HUKs8W zLSz7$Vo*ANJWr#7k&&_2jLq|WsN;d(gAWOJTMTJ#3E-HrzX)|C32igrnriABi*}EQ zi2l%k_sGwpJig7qX=_=x(bP?f??Q~R8u~?4s2v?*kc|$Zi^62a1lpKNbm$OxSGr2> zi^o#3vJYKl3Vy;_upULbzq8sLykKeE-Pn1bIr7k_3L532pHqEtM&Zd8A0n3#*`%-Z zmILzDsTzvQ%FFBL9+AATYp6no;}687MVy@pr+_PL8-8(c>H8RF+&4X=)AB%Y8f3wOy>L+`e6joWY=|9_J`;8b>n83SnK=1*{XF$dzjbp?Er)uCd)_J;RwbqylRpm{ zuL?|+l=MVzDYYx}bn2zDRXO)*Y)yvH{p?wKwk(O#Kmw1EvJ?B^Y^5FhLFEgQ?9$4L!sf3 zG13swG8SoAw6CtHsDLPatt`6#$Na(3qZaT0RiEU~!H`nA0l*4?DJO0u zp!g->i(RS3SwdpJBrdXd1%Py`f&;bXJsNqLsyUtLBegLZPOm>G_{t}HP+S-1H(dK% zgQ7VT3rnU-cCLE$Z(s;cgIT-&H>BvY~6c^xXm%XI#!+$&SJdJc1i`~S&02$oygaM5?XhI93ScaukjQ2Xu%Sk^04ELzgMHjy zHdD=Z_S03K;&WL57`Zxjn|E52C`|eM9eu*f0P>j%GyudB_F8JLdS{qNX2U@YoO+S_ zGq%MVdF2ZQXx`sj(MzXhXV)fx#S(IJsHJ7j!+Os`7Q#d1bZg=+MoNRa!4(GXyfa-x zcDHq|#~Xd6o{QaMmKD}h%?8Euc}!$uMmH@pyp^cg3Xdh9PaUD8F|m>M+p4)A8O5*! zm9>=L(r-8Wjh2-WWqu$Z6prdM>3M!MTyli1Ow^ec9UTpH8{#+(*B3>7Cy~3$%gbpf zvf$w0Tv7`1XCsT>pJ+wNNjl2Q&ncSm`3mvTv_C%c(vTbIeCdrB*!m%9$<6VkWIzZZ z={KQ64*l^Eh%na?LIw96wB3n z{{4HOc7^-VkTebs@`EP{kZs6tJvLED7IHuTDvjx1a&+{JR#CUcJ-cak8^uaU{_Kee z$Axyh3}X_g4(@8QW8#vmZZ2vt5hU?>1i5FuWMX>W`&}J&AnKREUkzHdP7LZnK|y~8 z;yF#%^E_`Zi}xng?llRcZY^0~VEI%z?GXOG8NHh5C;#>hjlhR(JMJmysX~*7x1+F9 zP*^@gFa?XeY%B#8z8W2F;6 znR)-!_rZ_ha%scFj)Z;VKOPV*k~?#Nq4D0Ex8>W1v+$ zcujZ;7Vz7TW{!NInmW|gRhnBV1|U5d7Ha-$MHQwj(#$bE8?q9qLAx`+#3qgAZVa~c z2X`#rM3MwbXsETV9naR)y%CF0Wwdcke?A>qkLB~#*{S@?yPlx;tzuvNd+*L_1QhCW zqU54g*0%TC^;vTs_|TkfSx2iE^1k^<6e`L>PuDu?hbPu4XOL2q_4{Z0Z~odEd7*r(~iX_RHfw*PiWOq_Ae88>DD?H1`UK)xsb!wk;O`nL)_ zLw7eBuL2+x?(r%zlo0vJIW5~gSbKg%q6rgw{T=U;1wPSKd=ZC&|b1^Rz zalzhAG5Ux_1V~t8`+`HqXrBgx!eEz4xpmbT81YX@0JjRxy6`{AY0R@onST{(QBslx0O0Tq`4WWZFg0 z&>ERKn1yj)eNhtYmE!_S;|)C?R>SR455~jZwl>$Zu*4*aB#>JHM;VC#rRfA$9g_ zS91f|ID8L~wGIk&kw_e^#9tk2HuFav{kpY+f&!??>pQKs<hZsovPUKE@QMDP#yue!iybS1kl|qPLuvrpmRDEv}RK3 zx_z=0zr9^iuMO@A`FlD7fD$`9n5%8PJ$etw|9fsH`{ew0XIZG}0PKBw3=!`c#y7p^ z-h!~bsmwSO!8&in1zbbzb(bqG)#n-#Z-!`-Zd36OpQbH9fx9bOFvZMFzcObB0S#b&u5i#&p+wdOB) z5WZ)>*H11ymse6-+g>*Kux*j4{%Omak(*^=Y|41;)90)6^QAKhz(c_9i>LT46ydH z?zo$EiZp=RgseRP_Bx-4Vj7)y-6ylL`BtZMi;BKp=4oORG4hmod0A*(`crzLo3Q(d zJsl@p2X)#SGjUMk zyqleFV%1eVs5(zU@F7?^dT}UwbIqGDjRZ$d%Z>U@0#t=z?GQPRN!w?dLBy6cXQLx)@yRi(s+vm z3Z1$@GrX2_p+Mu1cM7y88-ao8v5M+wG0=!56HFc1>U56QnyaV;)yK`HC3_yD?aNC< zw0{`cE7Bd>qPOtRMXU)@X^6+xy?W?=Vs^{+klzE|gV!^>eWwlw%hZHH5`Bznv{=pU z?d@h9+o!k!L-Ls;=BhbbY1s>Koo+OUDt&a5e%9DF#vZVX$yZ0n|EX!el)jtfuhbc} zg>Kr+KYNvy96IQ_3waInCt7jAj3gu+7*<^S`*nm0Q`5_;kFWkuWo+Dp1t(ciDPY-0 zEO#E(QAd-@XR+T~R3FJ;7AX)zbyK>}4^hT~vz_mN|#^-rQv(&8kYmvLY zf#5>lrm5#5-UG-Ryo)iN83;XBl#XQ0Xoya1?`EhXKG5KVPuPFDTY#y_CK(UVu!?6y#8*AbI`Jtw<7F~LL#Pnqm5l0pQ06v)nKlfT=w0EEJcpRGevItwq-2wb^+=i8Lyq24++hLJd*n_J0*uwK&v zfBOnjWL#Qb<3{S}R{We)S2DN`5~C=WB0y^W*%&hBx>85YNiia1I6x+l_rH4X?0s1%sZ7Rmxjd#-xv-tKI@ zfVEYu2p+(N2$C9ut<^1laMKYcE&U0~t!QftAEL|2QR!SA$AvE2gF>syd@Ek4mV?*W z50zIN{Kr5t;*?k>UnN&K`D!E`|LtACmNpxWNRXgT~ zL^Y_(imFz=F}%svFycb+x-*)9)7mUv`sZp=s`;8wbMsgP$@b#0+VkgR6u8N2;II=7 zFqUK#g*mCilh-YJgTKcyATq7^gor*TXRf#q62O7k0CzV9r^)DDb$@?zP7V!G_ryf& zbWnGReTG;+)XA_U7T44b+!ZBpc|!QX_8-+whMsQiU3ZjgAs_hKS8({lLGUb>SK-~o zS1oIco1G3$YMsW$ZPZLcRi}SPx=+Cs#g+Yd>3y&+XFB*nD$UQ}vOwmF49(wQ7#{a7{UOXG#R{id&?=WvF8N4Sr8s>lzJ=y(^rNFudBWhPvXl`sRgy%pGUIu0nzudjpp1Xw z<|~>xR8irs>Y;92$mb-Pa<@u!VC6mq&)T*-D-6ud|A#MHm6dFu-1f){6K4CF5+}K1 z>2NDV`bIKyg80qr6bU-|eio(fRdSfUHor4b^1gyj!LxA7mXf_mxUig7xg0(I`?lps zAF*h$sp+NvfMTO>TbeH)Q@mhv`K`+M6gvmR(PHYy0UL|08yD!84!XJtRS9M1-$$#y zuf|RylPf-%H74C$o$it@?`_Q7mJ0F)9Uqn2WEfLt8qs8E2nPWsvVu;33xW_V$RzzX z1rZ~ELSk9>j{-lM9|mf6RZ^UV{5C~306(Sg!l>PHcHmAYq^0}TY{s>!|9UB6MJj}{ z#mRYpl30irtVI(8dI3UEJsl>i;!;({raOEp$vHYk-3c<1qkMb&6P8YJcKiBqc zMO9OW9xlh^IFiMAH-d@t*JtxN^b89(JqH-|w{`;=<}~oPRPU;_aTglIG1_!%3~v6u zE$k=97ux>vVJC2Pf6h-Xb3Q1va!@*Ld@;xs*n%6|J^k6Q5i@gW>+u z)uqb(P+{Nsud|ryb%)@nreK_uL>MUr@3{S4UnNB$q{|>QQDAE}!ca_PDF9f1<`D0izE=6}A2(P;2**?DV+VDPwXu;OE4fuc5>Z-kAt zC~QWrd*@|rVp-3?*6p;?OwGVw>rz$g=7NW=ik(CMUJgWE`U^kXdW6xuaZMYoSYJ@A z%OCW}E5u!P*AdpbUY!g0bp2eluaWF%h<#XT?&;{C+`mdL6EDi+(r5 z_}<|p+xFdaEZm>dyE?gFXfwC1wK^Pc`>O#P0(L+t-@~Q8qIZExtxLz+yX&1R&Z@2S z-@FfY^^nr9P9_J(mrTVig_jn_d2K3c+$+m> zl`l<3{FvxpPBOE|((8wdIQ#w0fnQ_jC%CheH#0^b@98qGwf!~ zWkj>JZkDRs>9Mh;{-qhizAmeBaJFak}a^EaB|=h#*# z6#hPaXd|s4k$0j0A)IejcD790T)Wch$<{MA$MeDUOVy~DU`Yc)_*5x$AUCFPJ|N81 zZr$-{FwiTUh$!YU2}h?shhDuqXu#s&kg}QVzJMs@jsoYnOcgp%fDv;1r!Q-lof*>+ zW&ZI3S5F=Mqu_OU0ZB?euY*<=oMGHnKY=t;HN%km#$S$p38URT9GSpubw`ku0Mbvv zN1qKXR#R4)u5#EcN_pR)fdO&z{icxSbbN+Q&Sf<=bAaeu_oHkSeq#`&mkSS&05i<# z^tj%AnFA7%$mY7fgAEaRleN8murb3vSgJkY(P---VLOltF4OC_I0O3iz%Q5(AALxt za+0(dGMEpm1dumyL7Z>jnNNohb=_*^GxM|e{N`R=TfZk7`{9qF^zA!@ydhNwnuxOr zA;e0fQcr`417q^e#{Hpztc0j4qVILeKbxgFTlM_(p#xJw&}sD3QC3k|-d&bADLg4V z0T1IZCWayp2KvMPSD+RG9xi~~hjc1@ur5B{<^GK6%|JWAn0T^$^dR_&n+La-@KLcQ zYEchTbXM8dqo-Nscyz+FaFaD=_JS)UyRi3x_nxrLxy!sy;etC6L`u;;sm(-qlzU7> zPNlo)29t#2&%E4Rjj?6n;ylPKUdN-_up#)iH241gZSn=Cc|a0ZECndc6fV3v>raG& z)an`ioA8QR5T@vtNk!WWX~YgDONBBl`s*M}=@)7(p}Oz4^GAhI zlhd`(LP8)1Jy*+C9r7|@{#AVzhnBt)9z^1Ec)@~y$I8XUSy6E@@pB3s2uQZF>l(=? z2ETk^q$%}pYy|dx5CSgxB2vDWqwVcd%<$-6Q5NOXb#?BL7q`6u&JC7z4gnzM%eH7V z)fJcxKE`G|F`Am6*-}=fqWU}^};Sx*F@I2Pjh)^*U7t_s8Z-dg!Kcs^2TxGy+fuDkX2 zRq+T53&V#t*VpenNW!3xy+PgX#PMVIbD-M`qTZ!}8KhD*uU_L`#}og`12T5kVU&sd-c+OQ!Qk!i^jcVto@@Odr0d&~V{teBK4N@A3ChD?co0F48gZPLIZ8|#bX@w$zJ$2!HeV6dsqX(cJLI`JxM^clPZou`R5*X8%6+bG79&c_e25$v}8eN~8?%QM*C>4cWN zF61Y$(^k($TMRA~`h0fGcSOndT({A!z5t>6ILf1>J4hk^@94_Sn zJ+}AsMT8PM1nt|m(EHUe7Z<0)NV$xQiwEeUkI6W)=4^=y?{;yrk@4{(l9OZUaHrEV zQhXu%zyH46|A9+Ida%CAwSTd3wj-=t$ptn_rz_`3ra0NR#YBY=k{owqUL zMsH{lAJ(lG3Sm1t1I_Ic-$Mgg5q;>QSl!*>Rtx5?&Es_}p;~j(lE>oB%{5o&RW({y zx!S#_W{|~0*M4SZr%=FOpl7(DWnj?G9gAcF@a`GZSwjsDC_v|V;b(|dJD)+@2rF?2Q5ZRBH^-v=PXGP&BDYXl0F_snT&S1%Auu#NpGmyjvc>ks-=Ejs z6E)c_FVfc>mKUY$B#Q zVrXe<-E2n(?U7f65mihNIk8aAZBFxT$_;YwX2yu)hjzU#vFktu?|%ZWSP8n-f3D9# znt|+5F&lKDr8-uSGP(H$qQc}v7zxlEke9P9BTP`$ealm02!;E{gV^9r^RFKF z(XzKNO;Dn)=UHiM-y_4RED#hfgg_o+h|4Ve{Apsbu0j`OK9b34=I%M%iopaHGj`(8 zFoiHtb>VfjyF&X(Sq|OXy|Kp6>U*UUiDHGfH}UT3HQ$zffP`;TxV{kX3=1h&j@mZB z5I_RRD5sX$I{Dfj{2C8f&Ux}(iT0N>dsBRUNfI3hfz#V)%O>}b`DN0qamXSzT;h`- z;HXE@cOd3CWvYDP#x+InyNFtSG*|-Q6!73}TIEh7hxJ$dJs8mg@&O4vrt7AKOvQC? z&>&W^y=RR#>xVW&>by(SK!s*fPfNM{a`xn|i>fU-&hRZOFyXAA)A zR;Z2iQ%^HL$^yZ)B?~yaKgzjjVK=0_PHYR?V~@h0E{t*7Z?9$JUJ@PfEDs>Fo9k1w^`0y7L=3ytyTuB827FTXo= zUwTI_nd4z85!kX{J`IvP!j_f~xQkq+7zx!MfgFSaZ<5<+JaR%;KoDs)tNN8cQ_av= z#oX9#%Zv6Kbw?}3LVaPna`pnoUHF-VkDo%v@V0Gk1_pu@V2cHc#ZHoID@g<=y9>~h z^bM2x;!SWDZyIgi)@qObfOn=3U*}nstL!Z=Ap_3zT%$lLvk^`qT#x$wJFl*-pQIdP z;%*tGzw!4wC1zta8WhRaculAp==VA!Z~f^&Q-4!L%ZA;5C0~e#+1$@M$R literal 0 HcmV?d00001 diff --git a/battery-wireless-devices/manifest.json b/battery-wireless-devices/manifest.json index 4a9127fda..cc065b4c8 100644 --- a/battery-wireless-devices/manifest.json +++ b/battery-wireless-devices/manifest.json @@ -3,7 +3,7 @@ "name": "Device Battery Indicators", "version": "1.0.0", "minNoctaliaVersion": "3.6.0", - "author": "Aslauw", + "author": "aslauw", "license": "MIT", "repository": "https://github.com/aslauw/device_battery_indicator", "description": "Battery indicators bar icons for devices (mouse, keyboard, headphones, etc)", diff --git a/battery-wireless-devices/scripts/scan.py b/battery-wireless-devices/scripts/scan.py index 70e174eb6..897d8cf7a 100755 --- a/battery-wireless-devices/scripts/scan.py +++ b/battery-wireless-devices/scripts/scan.py @@ -8,7 +8,7 @@ "id": ":", # stable across runs "name": "Human readable name", "type": "mouse|keyboard|headset|...", # used to pick a default icon - "battery": 0-100 | null, + "battery": 0-100, "charging": true|false, "source": "openrazer|solaar" } From ae712b94f7d4f9f543b1b76b4e9989f296982e2c Mon Sep 17 00:00:00 2001 From: aslauw Date: Fri, 5 Jun 2026 09:33:59 +0200 Subject: [PATCH 08/11] Identify openrazer devices by vid:pid instead of serial MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The openrazer daemon often reports an unstable placeholder serial (e.g. UNKNOWN_153200B7_0000), especially when run as the systemd user service, which caused the device to be skipped entirely. Key the device id on USB vendor:product id instead — stable regardless of how the daemon is launched. Existing serial-keyed config auto-migrates via the settings dedup (matched by source + name). --- battery-wireless-devices/README.md | 9 +++++---- battery-wireless-devices/scripts/scan.py | 21 +++++++++++++-------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/battery-wireless-devices/README.md b/battery-wireless-devices/README.md index 6e7ec6b23..6ca157ec0 100644 --- a/battery-wireless-devices/README.md +++ b/battery-wireless-devices/README.md @@ -125,10 +125,11 @@ Verify it independently: python3 scripts/scan.py | python3 -m json.tool ``` -Pick a **stable** `id`: prefer a real hardware serial; avoid values that change -between reboots (the script already skips OpenRazer's placeholder `UNKNOWN_*` -serials for this reason). Detected entries whose `id` drifts are auto-merged in -the settings UI by `source` + `name`, but a stable id is always better. +Pick a **stable** `id` — one that survives reboots and reconnects. Avoid values +that drift: the OpenRazer source keys on USB `vid:pid` rather than the daemon's +serial, which is often an unstable placeholder (e.g. `UNKNOWN_153200B7_0000`). +Detected entries whose `id` drifts are auto-merged in the settings UI by +`source` + `name`, but a stable id is always better. ## Contributing diff --git a/battery-wireless-devices/scripts/scan.py b/battery-wireless-devices/scripts/scan.py index 897d8cf7a..d806affc7 100755 --- a/battery-wireless-devices/scripts/scan.py +++ b/battery-wireless-devices/scripts/scan.py @@ -60,15 +60,20 @@ def scan_openrazer(): try: if not dev.has("battery"): continue - # The daemon occasionally hands back a placeholder serial like - # "UNKNOWN_153200B7_0000" (vendor/product + counter) instead of the - # real one. Those aren't stable, so skip this scan rather than mint - # an unstable id — the device reappears once the serial is readable. - serial = dev.serial - if not serial or str(serial).startswith("UNKNOWN"): - continue + # Identify by USB vendor:product id. The daemon's serial is + # unreliable — it frequently reports a placeholder like + # "UNKNOWN_153200B7_0000" (notably when started via the systemd + # user service), which would otherwise mint an unstable id. vid:pid + # is stable regardless and only collides between two identical + # devices. + vid = getattr(dev, "_vid", None) + pid = getattr(dev, "_pid", None) + if vid is not None and pid is not None: + key = "%04x:%04x" % (int(vid), int(pid)) + else: + key = str(dev.serial) devices.append({ - "id": "openrazer:" + str(serial), + "id": "openrazer:" + key, "name": dev.name, "type": _norm_type(getattr(dev, "type", "")), "battery": int(round(dev.battery_level)), From 58ee5bfd1582aed70b55bd48a594b875c03cf75f Mon Sep 17 00:00:00 2001 From: aslauw Date: Fri, 5 Jun 2026 10:53:52 +0200 Subject: [PATCH 09/11] feat(battery-wireless-devices): conform to noctalia-plugins conventions - add i18n/en.json; route all user-facing strings through pluginApi.tr() - manifest: point repository at noctalia-plugins, add tags [Bar, Indicator, System], bump minNoctaliaVersion to 4.6.6 - rename IPC target to plugin:battery-wireless-devices - rename plugin to "Battery for Wireless Devices"; rewrite install docs - keep CLAUDE.md accurate (version, IPC target, i18n note) --- battery-wireless-devices/BarWidget.qml | 4 +- battery-wireless-devices/CLAUDE.md | 8 ++-- battery-wireless-devices/Main.qml | 6 +-- battery-wireless-devices/README.md | 28 ++++++++----- battery-wireless-devices/Settings.qml | 56 +++++++++++++------------- battery-wireless-devices/i18n/en.json | 52 ++++++++++++++++++++++++ battery-wireless-devices/manifest.json | 9 +++-- 7 files changed, 112 insertions(+), 51 deletions(-) create mode 100644 battery-wireless-devices/i18n/en.json diff --git a/battery-wireless-devices/BarWidget.qml b/battery-wireless-devices/BarWidget.qml index 22db24954..0743ffb38 100644 --- a/battery-wireless-devices/BarWidget.qml +++ b/battery-wireless-devices/BarWidget.qml @@ -105,8 +105,8 @@ Item { NPopupContextMenu { id: contextMenu model: [ - { "label": "Settings", "action": "settings", "icon": "settings" }, - { "label": "Refresh now", "action": "refresh", "icon": "refresh" } + { "label": pluginApi?.tr("menu.settings"), "action": "settings", "icon": "settings" }, + { "label": pluginApi?.tr("menu.refresh"), "action": "refresh", "icon": "refresh" } ] onTriggered: action => { contextMenu.close() diff --git a/battery-wireless-devices/CLAUDE.md b/battery-wireless-devices/CLAUDE.md index f2a850acf..86767384f 100644 --- a/battery-wireless-devices/CLAUDE.md +++ b/battery-wireless-devices/CLAUDE.md @@ -6,14 +6,14 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co A plugin for **Noctalia** (a Quickshell-based desktop shell, `noctalia-shell`). It is pure QML loaded at runtime by the running shell — there is **no build step, no compiler, and no test framework** in this repo. The plugin's purpose is a bar widget that shows battery indicators for connected peripherals (e.g. mouse, keyboard, headphones). Device data does **not** come from any Noctalia service — it is gathered by `scripts/scan.py` (see below). -Requires `minNoctaliaVersion: 3.6.0`. +Requires `minNoctaliaVersion: 4.6.6`. ## This implementation's architecture The plugin is split across three entry points plus one helper script: - **`scripts/scan.py`** — the data layer and the only place that knows how to talk to devices. It probes every supported source and prints a **normalized JSON array** on stdout: `[{ id, name, type, battery, charging, source }]`. `id` is `":"`. Each source is a `scan_()` function that swallows its own errors (missing tool → `[]`). Current sources: `scan_openrazer()` (via the `openrazer` Python client / running `openrazer-daemon`) and `scan_solaar()` (parses `solaar show`). **To add a new device source, add a `scan_*()` and append it to `SOURCES` — nothing in the QML changes.** -- **`Main.qml`** (`main` entry point) — runs `scan.py` on a `Timer` (interval = `pluginSettings.refreshInterval`, default 60s), parses the JSON, and exposes the live list as `property var devices`. Also exposes `refresh()` and an `IpcHandler` (`plugin:device_battery_indicators` → `refresh`). +- **`Main.qml`** (`main` entry point) — runs `scan.py` on a `Timer` (interval = `pluginSettings.refreshInterval`, default 60s), parses the JSON, and exposes the live list as `property var devices`. Also exposes `refresh()` and an `IpcHandler` (`plugin:battery-wireless-devices` → `refresh`). - **`BarWidget.qml`** — reads live data from `pluginApi.mainInstance.devices` and per-device config from `pluginApi.pluginSettings.devices`. Renders one pill per device the user has **enabled**, each a device icon inside a circular battery ring (a `Canvas`). Ring colour is auto-by-level unless overridden; click runs the device's `launchCmd` via `Quickshell.execDetached`. - **`Settings.qml`** (`settings` entry point) — lists detected + previously-configured devices (drag the handle to reorder; top = left-most / top-most in the bar) and lets the user set per device: `enabled`, `icon`, `iconColor`, `ringColor`, `launchCmd`. Settings shape: `pluginSettings.devices` is a map keyed by device `id`, `pluginSettings.deviceOrder` is an ordered array of ids; globals are `refreshInterval` and `showPercentage`. Edits apply **live** (debounced `commit()` rebuilds `devices` with fresh object identities so the bar's bindings re-fire); the popup's Apply button is redundant. `populateList()` also auto-heals stale duplicate entries (same source + name, different id). @@ -23,7 +23,7 @@ Data flow: `scan.py` → `Main.qml.devices` → (`pluginApi.mainInstance`) → ` - `manifest.json` — the contract. `id` must be unique; `entryPoints` maps roles to QML files. Each role is optional; this plugin currently only defines `barWidget`. Other available roles (see the `arch-updater` reference plugin): `main` (background singleton/logic, instantiated once), `panel`, `settings`, `controlCenterWidget`, `desktopWidget`, `launcherProvider`. - `metadata.defaultSettings` in the manifest defines the plugin's persisted settings schema and defaults. User overrides are merged on top at load. -- Entry-point `.qml` files live at the repo root. Optional `i18n/.json` files provide translations (`en.json` is the fallback). +- Entry-point `.qml` files live at the repo root. `i18n/.json` files provide translations (`en.json` is the fallback); this plugin ships `i18n/en.json` and routes every user-facing string through `pluginApi.tr("dot.path.key")` — no inline literals or post-`tr()` fallbacks (a Noctalia plugin convention; see the repo-root `AGENTS.md`). ## Installation / runtime model @@ -66,4 +66,4 @@ There are no unit tests. To see changes: enable Noctalia **debug mode** (`Settin **Manifest changes require a full shell restart, not hot reload.** `PluginRegistry.getPluginManifest()` returns an in-memory cache (`installedPlugins`) populated by a disk scan at startup. Hot reload re-instantiates QML against that *cached* manifest, so adding/removing `entryPoints` (or changing `metadata.defaultSettings`) is invisible until the shell restarts. Symptom: a newly-added `main` entry point's `IpcHandler` returns "Target not found". Editing existing `.qml` files hot-reloads fine. -Smoke test that `Main.qml` loaded: `qs -c noctalia-shell ipc call plugin:device_battery_indicators refresh` (returns a success string). Verify `scan.py` independently with `python3 scripts/scan.py`. The bar widget renders nothing until the user adds the widget to a bar section **and** enables at least one device in the plugin settings. +Smoke test that `Main.qml` loaded: `qs -c noctalia-shell ipc call plugin:battery-wireless-devices refresh` (returns a success string). Verify `scan.py` independently with `python3 scripts/scan.py`. The bar widget renders nothing until the user adds the widget to a bar section **and** enables at least one device in the plugin settings. diff --git a/battery-wireless-devices/Main.qml b/battery-wireless-devices/Main.qml index 1aef1f7c8..7e86fff4d 100644 --- a/battery-wireless-devices/Main.qml +++ b/battery-wireless-devices/Main.qml @@ -3,7 +3,7 @@ import Quickshell import Quickshell.Io import qs.Commons -// Background logic for the Device Battery Indicators plugin. +// Background logic for the Battery for Wireless Devices plugin. // // Polls scripts/scan.py on a timer, parses its normalized JSON, and exposes the // live device list. The bar widget and settings UI both read `devices` from @@ -74,9 +74,9 @@ Item { onTriggered: root.refresh() } - // `qs -c noctalia-shell ipc call plugin:device_battery_indicators refresh` + // `qs -c noctalia-shell ipc call plugin:battery-wireless-devices refresh` IpcHandler { - target: "plugin:device_battery_indicators" + target: "plugin:battery-wireless-devices" function refresh(): string { root.refresh() diff --git a/battery-wireless-devices/README.md b/battery-wireless-devices/README.md index 6ca157ec0..9bad0bf83 100644 --- a/battery-wireless-devices/README.md +++ b/battery-wireless-devices/README.md @@ -1,4 +1,4 @@ -# Device Battery Indicators +# Battery for Wireless Devices A [Noctalia](https://noctalia.dev) bar widget that shows battery levels for your connected peripherals — mouse, keyboard, headset, etc. — each as a device icon @@ -27,7 +27,7 @@ can't see (wireless dongles, USB receivers, ...). ## Requirements -- **Noctalia** ≥ 3.6.0 +- **Noctalia** ≥ 4.6.6 - **python3** - Per device source (install only what you need): - **Razer** — [OpenRazer](https://openrazer.github.io/): the running @@ -40,19 +40,27 @@ reports no devices. ## Installation -Clone (or symlink) this repo into Noctalia's plugin directory, using the plugin -id as the folder name: +**From the Noctalia plugin browser (recommended)** + +Open Noctalia's settings → Plugins, find **Battery for Wireless Devices**, and +install it. + +**Manual / development** + +Clone this repository and symlink the plugin folder into Noctalia's plugin +directory (so edits stay live): ```sh -git clone https://github.com/aslauw/device_battery_indicator \ - ~/.config/noctalia/plugins/device_battery_indicators +git clone https://github.com/noctalia-dev/noctalia-plugins +ln -s "$PWD/noctalia-plugins/battery-wireless-devices" \ + ~/.config/noctalia/plugins/battery-wireless-devices ``` -Then: +Then, however you installed it: -1. Enable **Device Battery Indicators** in Noctalia's plugin settings. +1. Enable **Battery for Wireless Devices** in Noctalia's plugin settings. 2. Restart the shell (`qs -c noctalia-shell`) so the new plugin is registered. -3. Add the **Device Battery Indicators** widget to a bar section +3. Add the **Battery for Wireless Devices** widget to a bar section (Noctalia Settings → Bar). 4. Open the plugin's settings (see below) and enable the devices you want. @@ -91,7 +99,7 @@ Changes apply live; the popup's **Apply** button is redundant. You can also trigger a refresh over IPC: ```sh -qs -c noctalia-shell ipc call plugin:device_battery_indicators refresh +qs -c noctalia-shell ipc call plugin:battery-wireless-devices refresh ``` ## Adding a new device source diff --git a/battery-wireless-devices/Settings.qml b/battery-wireless-devices/Settings.qml index 598359273..f9c6d9451 100644 --- a/battery-wireless-devices/Settings.qml +++ b/battery-wireless-devices/Settings.qml @@ -35,14 +35,14 @@ ColumnLayout { readonly property var liveDevices: (pluginApi && pluginApi.mainInstance) ? (pluginApi.mainInstance.devices || []) : [] readonly property var iconOptions: [ - { key: "", name: "Auto (by type)" }, - { key: "mouse", name: "Mouse" }, - { key: "keyboard", name: "Keyboard" }, - { key: "headphones", name: "Headphones" }, - { key: "device-gamepad", name: "Gamepad" }, - { key: "bluetooth", name: "Bluetooth" }, - { key: "device-desktop", name: "Desktop" }, - { key: "battery", name: "Battery" } + { key: "", name: pluginApi?.tr("settings.icon.auto") }, + { key: "mouse", name: pluginApi?.tr("settings.icon.mouse") }, + { key: "keyboard", name: pluginApi?.tr("settings.icon.keyboard") }, + { key: "headphones", name: pluginApi?.tr("settings.icon.headphones") }, + { key: "device-gamepad", name: pluginApi?.tr("settings.icon.gamepad") }, + { key: "bluetooth", name: pluginApi?.tr("settings.icon.bluetooth") }, + { key: "device-desktop", name: pluginApi?.tr("settings.icon.desktop") }, + { key: "battery", name: pluginApi?.tr("settings.icon.battery") } ] // Notifiable mirror of the global "show percentage" setting. NToggle emits @@ -221,14 +221,14 @@ ColumnLayout { // ---- Global options ---------------------------------------------------- NLabel { - label: "Device Battery Indicators" - description: "Select which devices appear in the bar and how each looks." + label: pluginApi?.tr("settings.header.label") + description: pluginApi?.tr("settings.header.desc") } NToggle { Layout.fillWidth: true - label: "Show percentage" - description: "Display the battery percentage next to each icon." + label: pluginApi?.tr("settings.showPercentage.label") + description: pluginApi?.tr("settings.showPercentage.desc") checked: root.showPercentageEdit onToggled: checked => { root.showPercentageEdit = checked @@ -238,8 +238,8 @@ ColumnLayout { NToggle { Layout.fillWidth: true - label: "Show charging indicator" - description: "Add a lightning icon next to devices that are charging." + label: pluginApi?.tr("settings.showCharging.label") + description: pluginApi?.tr("settings.showCharging.desc") checked: root.showChargingEdit onToggled: checked => { root.showChargingEdit = checked @@ -250,8 +250,8 @@ ColumnLayout { NSpinBox { id: intervalSpin Layout.fillWidth: true - label: "Refresh interval" - description: "How often to re-scan devices, in seconds." + label: pluginApi?.tr("settings.refreshInterval.label") + description: pluginApi?.tr("settings.refreshInterval.desc") from: 10 to: 900 stepSize: 10 @@ -266,7 +266,7 @@ ColumnLayout { RowLayout { Layout.fillWidth: true NButton { - text: "Rescan devices" + text: pluginApi?.tr("settings.rescan") icon: "refresh" onClicked: { if (pluginApi && pluginApi.mainInstance) @@ -288,7 +288,7 @@ ColumnLayout { NText { visible: root.deviceList.length === 0 - text: "No devices detected. Make sure the device is on, then press \"Rescan devices\"." + text: pluginApi?.tr("settings.noDevices") color: Color.mOnSurfaceVariant wrapMode: Text.WordWrap Layout.fillWidth: true @@ -451,14 +451,14 @@ ColumnLayout { text: card.modelData.online ? (card.modelData.battery >= 0 ? card.modelData.battery + "%" : "—") + (card.modelData.charging ? " ⚡" : "") - : "offline" + : pluginApi?.tr("settings.offline") color: card.modelData.online ? Color.mPrimary : Color.mOnSurfaceVariant } NIconButton { icon: "trash" baseSize: Style.baseWidgetSize * 0.8 - tooltipText: "Remove this device" + tooltipText: pluginApi?.tr("settings.removeDevice") colorFg: Color.mError onClicked: root.removeDevice(card.modelData.id) } @@ -466,7 +466,7 @@ ColumnLayout { NToggle { Layout.fillWidth: true - label: "Show in bar" + label: pluginApi?.tr("settings.showInBar") checked: card.enabledLocal onToggled: checked => { card.enabledLocal = checked @@ -476,7 +476,7 @@ ColumnLayout { NComboBox { Layout.fillWidth: true - label: "Icon" + label: pluginApi?.tr("settings.icon.label") model: root.iconOptions currentKey: card.cfg.icon || "" onSelected: key => root.set(card.modelData.id, "icon", key) @@ -484,25 +484,25 @@ ColumnLayout { NColorChoice { Layout.fillWidth: true - label: "Icon color" - description: "None uses the theme foreground." + label: pluginApi?.tr("settings.iconColor.label") + description: pluginApi?.tr("settings.iconColor.desc") currentKey: card.cfg.iconColor || "none" onSelected: key => root.set(card.modelData.id, "iconColor", key) } NColorChoice { Layout.fillWidth: true - label: "Battery ring color" - description: "None colours by battery level." + label: pluginApi?.tr("settings.ringColor.label") + description: pluginApi?.tr("settings.ringColor.desc") currentKey: card.cfg.ringColor || "none" onSelected: key => root.set(card.modelData.id, "ringColor", key) } NTextInput { Layout.fillWidth: true - label: "Command on click" + label: pluginApi?.tr("settings.launchCmd.label") text: card.cfg.launchCmd || "" - placeholderText: "e.g. polychromatic-controller / solaar" + placeholderText: pluginApi?.tr("settings.launchCmd.placeholder") onTextChanged: root.set(card.modelData.id, "launchCmd", text) } } diff --git a/battery-wireless-devices/i18n/en.json b/battery-wireless-devices/i18n/en.json new file mode 100644 index 000000000..9ff1791a4 --- /dev/null +++ b/battery-wireless-devices/i18n/en.json @@ -0,0 +1,52 @@ +{ + "menu": { + "settings": "Settings", + "refresh": "Refresh now" + }, + "settings": { + "header": { + "label": "Battery for Wireless Devices", + "desc": "Select which devices appear in the bar and how each looks." + }, + "showPercentage": { + "label": "Show percentage", + "desc": "Display the battery percentage next to each icon." + }, + "showCharging": { + "label": "Show charging indicator", + "desc": "Add a lightning icon next to devices that are charging." + }, + "refreshInterval": { + "label": "Refresh interval", + "desc": "How often to re-scan devices, in seconds." + }, + "rescan": "Rescan devices", + "noDevices": "No devices detected. Make sure the device is on, then press \"Rescan devices\".", + "offline": "offline", + "removeDevice": "Remove this device", + "showInBar": "Show in bar", + "icon": { + "label": "Icon", + "auto": "Auto (by type)", + "mouse": "Mouse", + "keyboard": "Keyboard", + "headphones": "Headphones", + "gamepad": "Gamepad", + "bluetooth": "Bluetooth", + "desktop": "Desktop", + "battery": "Battery" + }, + "iconColor": { + "label": "Icon color", + "desc": "None uses the theme foreground." + }, + "ringColor": { + "label": "Battery ring color", + "desc": "None colours by battery level." + }, + "launchCmd": { + "label": "Command on click", + "placeholder": "e.g. polychromatic-controller / solaar" + } + } +} diff --git a/battery-wireless-devices/manifest.json b/battery-wireless-devices/manifest.json index cc065b4c8..792cb68ca 100644 --- a/battery-wireless-devices/manifest.json +++ b/battery-wireless-devices/manifest.json @@ -1,12 +1,13 @@ { - "id": "device_battery_indicators", - "name": "Device Battery Indicators", + "id": "battery-wireless-devices", + "name": "Battery for Wireless Devices", "version": "1.0.0", - "minNoctaliaVersion": "3.6.0", + "minNoctaliaVersion": "4.6.6", "author": "aslauw", "license": "MIT", - "repository": "https://github.com/aslauw/device_battery_indicator", + "repository": "https://github.com/noctalia-dev/noctalia-plugins", "description": "Battery indicators bar icons for devices (mouse, keyboard, headphones, etc)", + "tags": ["Bar", "Indicator", "System"], "entryPoints": { "main": "Main.qml", "barWidget": "BarWidget.qml", From 8b1c373c351da407dc8f806ed631fc68837793ea Mon Sep 17 00:00:00 2001 From: aslauw Date: Fri, 5 Jun 2026 11:17:14 +0200 Subject: [PATCH 10/11] feat(battery-wireless-devices): add preview image --- battery-wireless-devices/preview.png | Bin 0 -> 88451 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 battery-wireless-devices/preview.png diff --git a/battery-wireless-devices/preview.png b/battery-wireless-devices/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..cc54c39bcf12d08972b98d62f286e11b24f88c7a GIT binary patch literal 88451 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 Date: Fri, 5 Jun 2026 11:28:26 +0200 Subject: [PATCH 11/11] docs(battery-wireless-devices): refine description and point contributing at noctalia-plugins --- battery-wireless-devices/README.md | 14 +++++++++----- battery-wireless-devices/manifest.json | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/battery-wireless-devices/README.md b/battery-wireless-devices/README.md index 9bad0bf83..79cc7c6f0 100644 --- a/battery-wireless-devices/README.md +++ b/battery-wireless-devices/README.md @@ -141,11 +141,15 @@ Detected entries whose `id` drifts are auto-merged in the settings UI by ## Contributing -Issues and pull requests are welcome — especially new `scan_()` -functions for other vendors. There's no build step or test framework: it's pure -QML loaded at runtime by Noctalia, plus the standalone Python scanner. See -[`CLAUDE.md`](CLAUDE.md) for an overview of the architecture and the Noctalia -plugin conventions. +This plugin lives in the +[noctalia-plugins](https://github.com/noctalia-dev/noctalia-plugins) registry — +please open issues and pull requests there. New `scan_()` functions for +other vendors are especially welcome. + +There's no build step or test framework: it's pure QML loaded at runtime by +Noctalia, plus the standalone Python scanner. See [`CLAUDE.md`](CLAUDE.md) for an +overview of the architecture, and the repository-root +[`AGENTS.md`](../AGENTS.md) for plugin conventions and the PR process. ## License diff --git a/battery-wireless-devices/manifest.json b/battery-wireless-devices/manifest.json index 792cb68ca..0d44317d9 100644 --- a/battery-wireless-devices/manifest.json +++ b/battery-wireless-devices/manifest.json @@ -6,7 +6,7 @@ "author": "aslauw", "license": "MIT", "repository": "https://github.com/noctalia-dev/noctalia-plugins", - "description": "Battery indicators bar icons for devices (mouse, keyboard, headphones, etc)", + "description": "Bar widget showing battery levels for wireless peripherals (mouse, keyboard, headset, etc.) via OpenRazer and Solaar.", "tags": ["Bar", "Indicator", "System"], "entryPoints": { "main": "Main.qml",