diff --git a/builds/esp_idf/ESP_IDF_COMPONENT_SOURCES.cmake b/builds/esp_idf/ESP_IDF_COMPONENT_SOURCES.cmake index 4eac1b6e..f2c8ce9c 100644 --- a/builds/esp_idf/ESP_IDF_COMPONENT_SOURCES.cmake +++ b/builds/esp_idf/ESP_IDF_COMPONENT_SOURCES.cmake @@ -170,7 +170,7 @@ set(TRAILMATE_ESP_IDF_UI_SHARED_SOURCES "${TRAILMATE_ROOT}/modules/ui_shared/src/ui/assets/route_topbar.c" "${TRAILMATE_ROOT}/modules/ui_shared/src/ui/assets/Satellite.c" "${TRAILMATE_ROOT}/modules/ui_shared/src/ui/assets/Setting.c" - "${TRAILMATE_ROOT}/modules/ui_shared/src/ui/assets/Spectrum.c" + "${TRAILMATE_ROOT}/modules/ui_shared/src/ui/assets/radar.c" "${TRAILMATE_ROOT}/modules/ui_shared/src/ui/assets/sstv.c" "${TRAILMATE_ROOT}/modules/ui_shared/src/ui/assets/sos.c" "${TRAILMATE_ROOT}/modules/ui_shared/src/ui/assets/team.c" diff --git a/cmake/TrailMateLinuxSources.cmake b/cmake/TrailMateLinuxSources.cmake index d15b2875..970ba288 100644 --- a/cmake/TrailMateLinuxSources.cmake +++ b/cmake/TrailMateLinuxSources.cmake @@ -322,7 +322,7 @@ set(TRAIL_MATE_LINUX_UI_SHELL_SOURCES "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/assets/route_topbar.c" "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/assets/Satellite.c" "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/assets/Setting.c" - "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/assets/Spectrum.c" + "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/assets/radar.c" "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/assets/sstv.c" "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/assets/sos.c" "${TRAIL_MATE_UI_SHARED_SRC_ROOT}/ui/assets/shutdown.c" diff --git a/docs/EnergySweep/function.md b/docs/EnergySweep/function.md index 76a67793..c077707e 100644 --- a/docs/EnergySweep/function.md +++ b/docs/EnergySweep/function.md @@ -1,375 +1,92 @@ -它实现了什么功能? +# Packet Probe -## 1️⃣ 实时频段能量扫描(Energy Sweep) +## Purpose -左侧柱状图表示: +Packet Probe replaces the former RSSI-oriented Energy Sweep page. Its question is +not whether a frequency range contains energy. It asks whether an active Trail +Mate air protocol can be observed on a concrete set of LoRa air parameters. -* X 轴:频率区间(例如 433.050 → 434.790 MHz) -* Y 轴:RSSI 强度 -* 每根柱:一个步进频点的瞬时/平均功率 +The internal application id and source directory stay `energy_sweep` for +navigation and migration compatibility. The user-facing name is `Packet Probe`. -它的意义是: +## Evidence Contract -* 快速查看该频段是否拥挤 -* 判断是否存在强干扰 -* 观察噪声底(Noise Floor) -* 找出峰值位置 +An observed profile is created only when all of the following are true: -这不是 SDR 级 FFT,而是 **工程级信道占用判断工具**。 +1. The radio reports RX_DONE and provides a packet that has passed the radio + CRC path. +2. The receiver was configured with the candidate frequency, bandwidth, + spreading factor, coding rate, preamble, sync word, and CRC length. +3. The packet has passed a structural parser for the active protocol: + Meshtastic wire framing or MeshCore packet framing. ---- +The page displays the profile and its evidence-packet count. It deliberately +does not expose business-packet labels such as position, node info, or telemetry. +No simulator path may produce evidence packets. A candidate with no evidence is +not a negative finding; it means only that the current dwell did not observe one. -## 2️⃣ 精确频点分析(Cursor 模式) +The first version's evidence level is radio CRC plus structural protocol +validation. It is a strong discovery signal but is not authenticated proof of a +channel key. A future evidence-level upgrade can use the active adapter's full +decrypt/MAC validation while preserving the same UI result model. -右侧 CURSOR 区域实现: +## Candidate Plan And Timing -* 当前指向频点(433.550 MHz) -* 该频点 RSSI -* 当前噪声水平 +Candidates are generated from the active protocol's regional frequency span and +currently active LoRa parameters. The center frequencies are quantized to 25 +kHz, limited to 96 candidates, and adjusted to keep the configured bandwidth in +the regional range. -这让它从“观察”变成“测量”。 +Each candidate receives a 700 ms dwell. A typical 70-candidate pass is about 49 +seconds before radio retuning overhead. One valid packet is an immediate positive +result. Multiple passes increase coverage for intermittent traffic, but the UI +must never label a silent candidate as absent or unused. -你不只是看到一堆柱子,而是可以: +## Radio Ownership And Apply Flow -* 精确读取某个频点的功率 -* 判断是否可用 -* 判断是否存在连续干扰 +The probe obtains the exclusive LoRa runtime only while scanning. On each +RX_DONE it copies the packet into caller-owned scratch storage, clears IRQ flags, +and restarts reception. Leaving, stopping, or applying releases the runtime and +returns the radio to mesh ownership. ---- +Applying a selected result is an explicit two-step action: -## 3️⃣ 自动最优信道选择(Best Channel Detection) +1. The user selects an observed profile and opens the confirmation dialog. +2. On confirmation, the page stops probing, releases the temporary radio + session, updates configuration in a `beginConfigEdit()` transaction, commits + `AppConfigChangeSet::mesh()`, then calls `applyMeshConfig()`. -BEST 区域实现: +Meshtastic is switched to manual modem parameters with the observed center +frequency as its override and zero frequency offset. MeshCore switches to its +custom region values with the observed frequency, bandwidth, SF, and CR. -* 计算“最干净”的频点 -* 显示推荐频率 -* 显示 SNR +## Hardware Capability Model -这一步非常关键,它实现了: +| Radio | Current implementation | Result | +| --- | --- | --- | +| SX1262 | One frequency/BW/SF/CR receive configuration at a time | One single-SF lane scans candidates serially. | +| LR1121 | The IC supports Multi-SF in its datasheet, but local RadioLib 7.4 integration exposes only normal single-profile receive and no packet-to-SF attribution API | The first release intentionally uses the same one-lane model. | -> 从频谱数据 → 可行动建议 +The probe scheduler is profile-based so a future LR1121 POC can add a second +same-frequency/BW SF lane. Enabling that needs all of the following real-device +proof: RadioLib configuration support, RX_DONE packet retrieval for both SFs, +and reliable attribution of each received packet to its SF. Until then the UI +and evidence count make no multi-SF claim. -它不只是显示世界,而是**给出决策结果**。 +## Pager UI Specification ---- +The 480x222 Pager page follows the Map page language: -## 4️⃣ 扫描进度管理 +- A 30 px amber top bar titled `PACKET PROBE`. +- An unframed, full-width work area containing the observed-profile list only. + The selected row is highlighted in place; there is no repeated detail panel, + which keeps the page viable on T-Deck-class narrow displays. +- Observed rows show `frequency`, `BW/SF/CR`, and `x evidence-count` only. +- A 24 px Map-style bottom bar: `UP/DN Select`, `ENTER Set`, `S Start/Stop`, + and `ESC Back`. +- Selecting `Set` opens a dimmed warm-white modal. `Cancel` is the default + focus; `ESC` cancels and `ENTER` applies after the user has moved focus to + Apply. -72% 进度条说明: - -* 扫描是区间遍历 -* 用户知道系统状态 -* 避免“卡住”误解 - -这提升了工程可用性。 - ---- - -## 5️⃣ 扫描控制(STOP / AUTO) - -* STOP:终止扫描 -* AUTO:自动选择最佳信道 - -这意味着: - -这个页面已经从“只读显示器” -变成了 -“频段管理工具”。 - ---- - -# 二、这个界面在系统层面的意义 - -在 Trail-Mate 架构里,这个页面完成的是: - -### 🛰 频谱态势感知(RF Situational Awareness) - -它回答: - -* 现在这个频段干净吗? -* 是否有强占用? -* 我的 LoRa 该选哪个频点? -* 是否存在持续干扰源? - -它是一个“战术前侦查页面”。 - ---- - -# 三、它属于什么级别的功能? - -不是: - -* ❌ 频谱仪 -* ❌ SDR 分析工具 - -而是: - -* ✅ 信道规划工具 -* ✅ 干扰检测工具 -* ✅ 频段健康监测器 -* ✅ 自动选频前置模块 - ---- - -# 四、从用户视角来看 - -这个界面完成的是: - -> “在野外部署前,快速检查当前 Sub-GHz 频段是否适合通信。” - -这对于: - -* LoRa mesh -* FSK 语音 -* APRS -* 临时战术部署 - -都非常实用。 - ---- - -# 五、它的核心能力总结 - -这个 UI 实现了: - -| 能力 | 是否实现 | -| ------------- | ---- | -| 频段扫描 | ✅ | -| 功率可视化 | ✅ | -| 精确频点读取 | ✅ | -| 最佳信道推荐 | ✅ | -| 扫描控制 | ✅ | -| LoRa CAD 状态展示 | ✅ | - -下面按“你这个界面对应的能力”把**算法 + 功能实现方案**讲清楚,目标是:用 SX1262 在 MCU 上做一个**可用的能量扫描/信道选择器**(不是 FFT 频谱仪)。 - ---- - -## 1) 总体架构 - -**输入**:频段范围(f_start, f_end)、步进(step)、每点采样时长(dwell)、采样次数(N) -**输出**:每个频点的能量值(RSSI/ED)、噪声底(noise floor)、最佳频点(best channel)、峰值/干扰标记、扫描进度 - -数据流: - -1. 扫频采样 → 得到 `rssi[f_i]` -2. 估计噪声底 → 得到 `noise_floor` -3. 计算评分/选优 → 得到 `best_freq` -4. UI 渲染:柱状图、cursor、RSSI/NOISE/BEST、进度 - ---- - -## 2) 扫频采样算法(核心) - -### 2.1 频点序列 - -把频率离散化: - -* `bins = floor((f_end - f_start)/step) + 1` -* `f_i = f_start + i * step` - -**步进怎么选(工程上)** - -* 想“看干扰哪里高”:`step = 25 kHz` 或 `50 kHz` 足够 -* 想“粗扫很快”:`step = 100 kHz` -* 如果你 LoRa 频道带宽是 125 kHz,你用 25 kHz 扫描能更精细地看占用“峰”的位置(但更慢) - -### 2.2 每个频点怎么测“能量” - -SX1262 拿不到 IQ,所以只能用“能量指标”。最常见是 **Instant RSSI** 或类似 ED 指标(取决于你用的库/驱动暴露的命令)。 - -每个频点做: - -1. `SetRfFrequency(f_i)` -2. 进入 RX(可以是 LoRa RX 或 FSK RX,关键是能读到 RSSI) -3. 等待 **settle**(本振/AGC 稳定):`t_settle ≈ 1~3 ms` -4. 采样 N 次瞬时 RSSI:每次间隔 `t_gap ≈ 1~2 ms` -5. 得到该频点值 `P_i` - -**P_i 不要直接用平均值(会被突发信号骗)** -推荐三种稳健聚合方式: - -* **median(中位数)**:抗突发、抗偶发尖峰(推荐默认) -* **trimmed mean(去头去尾均值)**:丢掉最高/最低各 10~20% -* **EMA(指数滑动均值)**:适合连续扫描实时更新 - -> 我建议默认:`P_i = median(rssi_samples)` - -### 2.3 扫描速度估算(让 UI 不卡) - -总时间大约: - -`T ≈ bins * (t_settle + N*(t_gap + t_read))` - -例如: - -* 频段宽 1.74 MHz(433.050–434.790) -* step=25 kHz → bins≈70 -* t_settle=2ms, N=6, t_gap=1ms - → 单 bin ~ 2 + 6*(1+读寄存器开销) ≈ 10ms - → 总计 ~ 700ms(很好用) - ---- - -## 3) 噪声底(NOISE)如何估计 - -你界面右侧有 `NOISE -104 dBm`,这不是芯片“真噪声”,而是你对扫描数据的统计估计。 - -### 3.1 推荐方法:分位数/中位数 + 偏置 - -因为频段里可能有很多峰,直接平均会被抬高。 - -* `noise_floor = percentile(P, 20%)` 或 `median(P)` -* 然后再做一个轻微平滑:`noise = 0.7*noise + 0.3*noise_floor`(跨帧稳定) - -### 3.2 为什么用 20% 分位数 - -* 频段里如果有少数强信号,它们只占少量 bins -* 20% 分位数更接近“底噪水平” -* 你要的是“哪里比底噪高”,不是绝对精密测量 - ---- - -## 4) 峰值/干扰标记(柱子变红) - -UI 中红柱代表“干扰/占用较强”。规则建议: - -* `threshold = noise + margin` -* margin 典型:`6 dB ~ 12 dB`(看你希望多敏感) -* 若 `P_i > threshold` → 标红(Warn) -* 若 `P_i > threshold + 10 dB` → 可以加一个“尖峰标记”(小三角) - -为了避免抖动,给红柱加**滞回**: - -* 进入红色:`P_i > noise + 10 dB` -* 退出红色:`P_i < noise + 7 dB` - ---- - -## 5) CURSOR(指针)怎么实现 - -Cursor 有两种交互模式: - -### 5.1 自动跟随(扫描中) - -* cursor_index = 当前正在采样的 bin -* UI 每采完一个 bin,就移动光标竖线 - -### 5.2 手动浏览(扫描结束/暂停) - -* 按键左右移动 cursor_index -* 右侧显示 `freq[cursor]`、`P_cursor`、`noise` - -光标竖线 + 底部小三角只是渲染层,数据来自数组即可。 - ---- - -## 6) BEST(最佳信道)如何选 - -你要的是“最干净、最适合通信”的频点。简单选最小 RSSI 不够,因为: - -* 单点最低可能是偶然低谷 -* LoRa/FSK 发射占带宽,不是一个点 - -### 6.1 “带宽窗口”评分(推荐) - -设通信带宽 `BW`(例如 125k),换算成需要覆盖的 bin 数: - -* `k = ceil(BW / step)` -* 对每个中心 bin i,计算窗口内的“最坏情况”: - - * `score_i = max(P[i - k/2 ... i + k/2])` -* 选择 score 最小的 i 作为 best - -这会避免选到“旁边有大峰”的位置。 - -### 6.2 加上保护间隔(guard) - -LoRa 频偏/温漂/邻道干扰都存在,可以再加 guard,例如 ±1~2 个 bin 也纳入窗口。 - ---- - -## 7) SNR +12 怎么来? - -在你这个“能量扫描”场景里,SNR 是**估算值**: - -* `snr_est = noise - P_best` (注意 dBm 越小越弱,所以符号要小心) - 更直观写法: -* `snr_est = (P_best - noise)`,如果 P_best 比 noise 高就是负数;但你 UI 里显示 +12,代表你希望“越干净越大”。 - -所以建议定义为: - -* `cleanliness = noise - P_best`(越大越干净) -* 显示:`SNR +cleanliness` - -例如:noise=-104, best=-116 → cleanliness=12 → `SNR +12`(符合 UI) - ---- - -## 8) CAD(LoRa preamble 检测)怎么融合 - -CAD 不是全频谱扫描,它是“在某个频点上检测是否存在 LoRa 前导码”。 - -你 UI 顶部的 `CAD` 可以这样实现: - -* 当用户开启 CAD: - - * 每次扫描到某个 bin,如果你关心该点是否有 LoRa,执行一次 CAD - * 得到 `cad_detected`(布尔) - * 如果 detected:给该 bin 做一个“蓝色小点/标记”,或者让状态灯闪一下 - -但要注意:**CAD 会增加耗时**,所以策略上可以: - -* 只对“疑似忙碌”的 bins(P_i > noise+X)做 CAD -* 或者扫描完成后,对 best 候选点做 CAD 复核 - ---- - -## 9) 进度条与 STOP/AUTO 行为 - -### 9.1 进度条 - -* `progress = scanned_bins / bins` -* UI 每完成一个 bin 更新一次(不要每次采样更新,UI 会抖) - -### 9.2 STOP - -* 设置一个 `scan_abort` 标志 -* 每个 bin 结束检查一次,立即退出 -* UI 状态切换到“冻结显示 + 可移动 cursor” - -### 9.3 AUTO - -* 触发 best 计算 -* 并把无线模块的工作频点切换到 best -* (可选)保存到配置:让下一次上电沿用 - ---- - -## 10) 如果你要更“专业”的两点增强 - -### A) 动态中心频率校准(你之前提过) - -如果你担心频偏/温漂导致“峰”位置漂: - -* 在每个 bin 的 dwell 中,取前 2ms 的样本作为快速估计 -* 用它对后续样本做轻微校正(本质是稳定统计,不是真频偏补偿) - 更实际的做法:**只做 UI 平滑**,别做“频率校准”的强承诺。 - -### B) 多帧叠加(历史底噪) - -维护 `P_i_hist` 的 EMA: - -* `P_i = 0.6*P_i + 0.4*P_i_prev` - 这样界面更稳,像“仪表”而不是“闪动的噪声”。 - ---- - -## 11) 你最终会得到什么? - -* 一个频段扫描器(几十~几百 ms 出结果) -* 可视化占用峰(红柱) -* 可读的底噪估计(NOISE) -* 可行动的推荐频点(BEST + 清洁度) -* 可选的 LoRa CAD 复核 -* 并能一键 AUTO 切换工作信道 +The page has no RSSI graph, CAD badge, noise estimate, quietest-channel score, +or AUTO action. Those measurements cannot establish protocol-channel presence. diff --git a/docs/EnergySweep/uiux.md b/docs/EnergySweep/uiux.md index 2a268794..22ac9313 100644 --- a/docs/EnergySweep/uiux.md +++ b/docs/EnergySweep/uiux.md @@ -1,156 +1,95 @@ -## 1) 关键可读性规则(针对 ~227PPI) +# Packet Probe Pager UI -### 字号策略 +## Visual Language -* **标题/关键频点**:18–20 px(不要再小) -* **常规信息**:14–16 px -* **弱信息/单位/标签**:12–13 px(底线,不再小) -* 数字(频率/RSSI)尽量用 **等宽字体** 或数字等宽特性(否则跳动) +Packet Probe follows the current Map page language rather than the former +Energy Sweep dashboard language. -### 线宽与柱宽(高 PPI 必须加粗) +| Token | Value | Use | +| --- | --- | --- | +| Work surface | `#FFF3DF` | Full screen beneath the top bar | +| Keycap surface | `#F8E6C3` | Bottom-bar controls and result rows | +| Divider | `#B3915D` | Result-row and keycap borders | +| Primary text | `#593D1C` | Labels and frequency values | +| Secondary text | `#846A42` | Parameter details and progress | +| Amber | `#EBA341` | Selected result and Apply action | +| Blue | `#315F91` | Listening state and selected frequency | +| Green | `#397046` | Evidence count and applied confirmation | -* 面板边框:**2 px**(不要 1px) -* 网格线:1 px(但降低不透明度) -* 光标竖线:**2 px** -* 柱状条:**4 px 宽**(间隔 2 px),否则会变成“毛刺” +No page-level floating cards are used. Result rows are interactive repeated +items; the rest of the screen remains a continuous work surface. -### 点击/触控命中(如果是触控) +## 480x222 Layout -* 最小按钮高度:**28 px** -* 按钮内边距:左右 10 px -* 两个按钮并排比两行更合适(不挤信息) +``` +0,0 +------------------------------------------------+ + | < PACKET PROBE battery | +30 +------------------------------------------------+ + | OBSERVED PARAMETERS | + | LISTENING 12/70 PASS 1 | + | [433.550 MHz BW250 SF11 CR4/5 x12] | + | [433.775 MHz BW250 SF11 CR4/5 x03] | + | 12/70 PROFILES 2 OBSERVED | +198 +------------------------------------------------+ + | UP/DN SELECT | ENTER SET | S STOP | ESC BACK | +222 +------------------------------------------------+ +``` ---- +- Top bar: 30 px, supplied by the shared top-bar component. +- Work area: `y=30..198`, 10 px outer margin, one full-width list surface. + There is no selected-profile detail column, so the same layout remains + readable on T-Deck-class narrow displays. +- Bottom bar: 24 px, using the Map control-bar keycap treatment. +- Pager result rows: 24 px high, 3 px gap, up to four visible rows. `UP/DN` + automatically moves the four-row window when the selection crosses a page + boundary, so every observed profile remains visible and selectable. -## 2) 画布与全局 Token(不变) +## Content Rules -* Screen:**480(w) × 222(h)** -* BG:`WarmBG #F6E6C6` -* Panel:`PanelBG #FAF0D8` -* Line:`#E7C98F`(边框/分隔线) -* Text:`#6B4A1E` -* TextDim:`#8A6A3A` -* Amber:`#EBA341` -* AmberDark:`#C98118` -* Warn/Ok/Info:`#B94A2C / #3E7D3E / #2D6FB6` +The full-width result list shows only real observations: ---- +- The main line is the center frequency. +- The secondary line is bandwidth, SF, and CR. +- The right-aligned `xN` value is the number of evidence packets. -## 3) 新的布局(更适合 2.33":信息更少、更大、更“扫一眼就懂”) +The selected row is the only selection-state presentation. It is amber and +keeps the same frequency, air parameters, and right-aligned evidence count as +every other row. The page does not repeat selected details, RSSI metadata, or +business-packet labels elsewhere. After an apply, the status line changes to +`APPLIED TO MESH`. -### A) Topbar(更薄,但字更大) +Empty state text is factual: `NO OBSERVED PROFILES` before scanning and `NO +VALIDATED PACKETS` while a pass is in progress. It does not claim the candidate +space is empty. -* **Topbar 高度:28 px**(比 30 稍省空间) -* 区域:x=0,y=0,w=480,h=28 -* 背景:PanelBG -* 底分隔线:2px,Line +## Keyboard And Touch Interaction -**Topbar 内容** +| Input | Action | +| --- | --- | +| `UP` / `DOWN` | Select an observed profile | +| `ENTER` | Open the apply confirmation for the selected profile | +| `S` | Start or stop the probe | +| `ESC` / Back | Close the dialog or leave the page | +| Tap/click a result row | Select that profile | +| Tap/click bottom `SET` or `START/STOP` | Same action as the matching key | -* 左:`SUB-GHz SCAN`,字号 **18**,Text -* 右:两个状态标签(文字 13,TextDim / Info) +The bottom bar reflects the active state by displaying `S START` before a +probe starts and `S STOP` while it owns the radio. - * `RSSI`(默认 TextDim;工作中用 AmberDark) - * `CAD`(开启时 Info) +## Confirmation Overlay -> 高 PPI 下,Topbar 文字 18 才“像标题”。 +Applying a result is intentionally not a one-key operation. ---- - -### B) 主区(28 以下的 194 px 高度) - -主区 y=28,h=194,左右分栏: - -* **左侧频谱面板:w=332** -* **右侧信息面板:w=480-12-10-12-332 = 114**(更窄,但我们减少字段 + 放大关键数) - -外边距:12,栏间距:10。 - ---- - -## 4) 左侧:频谱面板(重点:图更清晰) - -* Panel:x=12,y=40,w=332,h=170 -* 边框:2px Line -* 内边距:10 - -### 左面板内部 - -#### 1) Plot 区 - -* x=22,y=50,w=312,h=118 -* 网格线:每 26px 一条横线(1px,Line,OPA 50) -* 柱:4px 宽,2px 间距 - - * 正常柱:Amber - * 超阈值柱:Warn -* 光标竖线:2px,Info -* 光标底部小三角:Info(更容易定位) - -#### 2) 底部频率刻度条(更“可读”) - -* x=22,y=172,w=312,h=28 -* 左:起始频率(14px,Text) -* 中:`STEP 25k`(12px,TextDim) -* 右:终止频率(14px,Text) - -> 刻度条高度提升到 28,是为了让 12–14px 字在 2.33" 上不拥挤。 - ---- - -## 5) 右侧:信息面板(只保留“对操作有用”的字段) - -* Panel:x=354,y=40,w=114,h=170 -* 边框:2px Line -* 内边距:8 - -### 右面板内容(从上到下,强层级) - -1. **CURSOR 频点(最大)** - -* `433.550`:字号 **20**,Text -* `MHz`:字号 12,TextDim(贴右上或紧跟) - -2. **RSSI(第二层级)** - -* `-92 dBm`:字号 **18**,Text(超阈值改 Warn) - -3. **BEST(建议频点)** - -* `434.125`:字号 **16**,Ok -* 下方小字:`SNR +12`(12,TextDim) - -4. **进度条 + 百分比(底部)** - -* 进度条:h=12,边框 2px Line -* 填充:AmberDark -* 右侧 `72%`:12,TextDim - -5. **按钮(并排,单行)** - -* y = 面板底部 - 28 - 8 -* 两个按钮各 w= (114-8-6)/2 ≈ 50 -* h=28(触控/可读都够) -* `STOP/SCAN`:底 Amber(扫描中 STOP 用 Warn) -* `AUTO`:边框 Info(开启时),默认 Line - -> 右侧很窄,所以**把单位、标签都做小字**,把数字做大字,扫一眼就懂。 - ---- - -## 6) 你上一张效果图里“不符合高 PPI 的点”我已经修了 - -* 1px 边框会显“发虚” → 全部改 2px -* 柱太细会像噪点 → 柱宽 4px + 间距 2px -* 信息太多会挤小字 → 右侧只保留 Cursor/RSSI/Best/Progress -* 按钮做大但不占两行 → 并排一行 - ---- - -## 7) LVGL 实现提示(不写代码,只说关键参数) - -* Panel border width:2 -* 字体:Title 18 / Big number 20 / Mid 16–18 / Small 12–13 -* 网格线:Line + opa 50 -* 柱:用 canvas 或 chart,自绘柱子更可控(4px 宽) +``` + +----------------------------+ + | APPLY OBSERVED PROFILE? | + | 433.550 MHz | + | BW 250k SF11 CR4/5 | + | [ESC CANCEL] [ENTER APPLY] | + +----------------------------+ +``` +The full-screen scrim is warm dark brown at 50 percent opacity. The modal is +warm white with a 2 px amber border and 8 px radius, matching the existing +tracker confirmation treatment. `Cancel` owns initial focus. Arrow left/right +moves between the two actions; Enter applies only after Apply is focused. diff --git a/modules/core_sys/include/platform/ui/lora_runtime.h b/modules/core_sys/include/platform/ui/lora_runtime.h index 7a755d6a..62ff74a3 100644 --- a/modules/core_sys/include/platform/ui/lora_runtime.h +++ b/modules/core_sys/include/platform/ui/lora_runtime.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include "platform/ui/capability_status.h" @@ -18,10 +19,20 @@ struct ReceiveConfig uint8_t crc_len = 2; }; +/// Metadata for one CRC-accepted LoRa packet copied into caller-owned storage. +/// `poll_received_packet()` never fabricates packets on simulator targets. +struct ReceivedPacket +{ + std::size_t size = 0; + float rssi_dbm = 0.0f; + float snr_db = 0.0f; +}; + bool is_supported(); bool acquire(); bool is_online(); bool configure_receive(float freq_mhz, const ReceiveConfig& config); +bool poll_received_packet(uint8_t* buffer, std::size_t capacity, ReceivedPacket* out_packet); float read_instant_rssi(); void release(); diff --git a/modules/ui_lvgl_ux_packs/src/packs/t_display_p4_touch_ux_pack.cpp b/modules/ui_lvgl_ux_packs/src/packs/t_display_p4_touch_ux_pack.cpp index fc12dd46..bc85dae2 100644 --- a/modules/ui_lvgl_ux_packs/src/packs/t_display_p4_touch_ux_pack.cpp +++ b/modules/ui_lvgl_ux_packs/src/packs/t_display_p4_touch_ux_pack.cpp @@ -16,7 +16,7 @@ void build_page_manifest(ScreenRegistry& out) (void)out.add({ScreenId::Gps, "GPS", true}); (void)out.add({ScreenId::Team, "Team", true}); (void)out.add({ScreenId::Tracker, "Tracker", true}); - (void)out.add({ScreenId::EnergySweep, "Energy Sweep", true}); + (void)out.add({ScreenId::EnergySweep, "Packet Probe", true}); (void)out.add({ScreenId::WalkieTalkie, "Walkie", true}); (void)out.add({ScreenId::Sstv, "SSTV", true}); (void)out.add({ScreenId::Extensions, "Extensions", true}); diff --git a/modules/ui_lvgl_ux_packs/src/packs/uconsole_desktop_ux_pack.cpp b/modules/ui_lvgl_ux_packs/src/packs/uconsole_desktop_ux_pack.cpp index cd096102..492e85f9 100644 --- a/modules/ui_lvgl_ux_packs/src/packs/uconsole_desktop_ux_pack.cpp +++ b/modules/ui_lvgl_ux_packs/src/packs/uconsole_desktop_ux_pack.cpp @@ -51,7 +51,7 @@ void UConsoleDesktopUxPack::buildScreens(ScreenRegistry& out) const (void)out.add({ScreenId::Gps, "GPS", true}); (void)out.add({ScreenId::Team, "Team", true}); (void)out.add({ScreenId::Tracker, "Tracker", true}); - (void)out.add({ScreenId::EnergySweep, "Energy Sweep", true}); + (void)out.add({ScreenId::EnergySweep, "Packet Probe", true}); (void)out.add({ScreenId::WalkieTalkie, "Walkie", true}); (void)out.add({ScreenId::Sstv, "SSTV", true}); (void)out.add({ScreenId::Extensions, "Extensions", true}); diff --git a/modules/ui_shared/include/ui/screens/energy_sweep/energy_sweep_page_shell.h b/modules/ui_shared/include/ui/screens/energy_sweep/energy_sweep_page_shell.h index 7d6167d3..b54b73af 100644 --- a/modules/ui_shared/include/ui/screens/energy_sweep/energy_sweep_page_shell.h +++ b/modules/ui_shared/include/ui/screens/energy_sweep/energy_sweep_page_shell.h @@ -1,6 +1,6 @@ /** * @file energy_sweep_page_shell.h - * @brief Shared Energy Sweep page shell entrypoints + * @brief Shared Packet Probe page shell entrypoints */ #pragma once diff --git a/modules/ui_shared/src/ui/app_catalog_builder.cpp b/modules/ui_shared/src/ui/app_catalog_builder.cpp index 2bb14518..7bfda0cd 100644 --- a/modules/ui_shared/src/ui/app_catalog_builder.cpp +++ b/modules/ui_shared/src/ui/app_catalog_builder.cpp @@ -65,7 +65,7 @@ extern "C" extern const lv_image_dsc_t gps_icon; extern const lv_image_dsc_t Satellite; extern const lv_image_dsc_t contact; - extern const lv_image_dsc_t Spectrum; + extern const lv_image_dsc_t radar; #if !defined(GAT562_NO_TEAM) || !GAT562_NO_TEAM extern const lv_image_dsc_t team_icon; #endif @@ -113,7 +113,7 @@ ui::CallbackAppScreen s_contacts_app("contacts", "Contacts", &contact, contacts::ui::shell::enter, contacts::ui::shell::exit, &s_menu_host); -ui::CallbackAppScreen s_energy_sweep_app("energy_sweep", "Energy Sweep", &Spectrum, +ui::CallbackAppScreen s_energy_sweep_app("energy_sweep", "Packet Probe", &radar, energy_sweep::ui::shell::enter, energy_sweep::ui::shell::exit, &s_menu_host); diff --git a/modules/ui_shared/src/ui/assets/Spectrum.c b/modules/ui_shared/src/ui/assets/Spectrum.c deleted file mode 100644 index 983147e4..00000000 --- a/modules/ui_shared/src/ui/assets/Spectrum.c +++ /dev/null @@ -1,165 +0,0 @@ -#ifdef __has_include - #if __has_include("lvgl.h") - #ifndef LV_LVGL_H_INCLUDE_SIMPLE - #define LV_LVGL_H_INCLUDE_SIMPLE - #endif - #endif -#endif - -#if defined(LV_LVGL_H_INCLUDE_SIMPLE) - #include "lvgl.h" -#else - #include "lvgl/lvgl.h" -#endif - - -#ifndef LV_ATTRIBUTE_MEM_ALIGN -#define LV_ATTRIBUTE_MEM_ALIGN -#endif - -#ifndef LV_ATTRIBUTE_IMAGE_SPECTRUM -#define LV_ATTRIBUTE_IMAGE_SPECTRUM -#endif - -const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_SPECTRUM uint8_t Spectrum_map[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xe5, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xa3, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xfd, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc3, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0xa4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xe0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xe4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfd, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xe3, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xa3, 0xfc, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xe4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xa4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xa3, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x84, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xa4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xa3, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xa3, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xa3, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0xc4, 0xfc, 0x84, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0x22, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcd, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0d, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7d, 0xff, 0xff, 0xff, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7d, 0xf1, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x86, 0xff, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xa6, 0xf1, 0xd4, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xd3, 0xff, 0x9e, 0xc8, 0xff, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0xf4, 0x36, 0x00, 0x00, 0x93, 0xff, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xfe, 0x61, 0x00, 0x00, 0x00, 0x02, 0xd7, 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfe, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xf3, 0xf8, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xe8, 0xff, 0xe4, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xe7, 0xfd, 0xdc, 0xdc, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xe8, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf9, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x7c, 0xff, 0x93, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0xe2, 0xcf, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x95, 0xf4, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x9c, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xff, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xff, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xef, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf3, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xff, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xf5, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0xff, 0x17, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xec, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe5, 0x93, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xf4, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0xff, 0x1e, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xff, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x98, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe6, 0xca, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xff, 0x34, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xe2, 0xe4, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0xe4, 0x15, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xe0, 0xed, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xd6, 0x60, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xf3, 0xeb, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0xe7, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0xff, 0xc1, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xfd, 0xc3, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x2c, 0xc9, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xee, 0x90, 0xf5, 0xd3, 0x7c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x1d, 0x95, 0xff, 0xd8, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x09, 0x5c, 0xb1, 0xf1, 0xed, 0xbf, 0x8e, 0x73, 0x5e, 0x46, 0x40, 0x86, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf6, 0x45, 0xa7, 0xff, 0xe4, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x5b, 0x8e, 0xbb, 0xd7, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfb, 0xff, 0xbe, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf7, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7d, 0xff, 0xff, 0xff, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7d, 0xf1, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x86, 0xff, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x49, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x3b, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -const lv_image_dsc_t Spectrum = { - .header.magic = LV_IMAGE_HEADER_MAGIC, - .header.cf = LV_COLOR_FORMAT_RGB565A8, - .header.flags = 0, - .header.w = 64, - .header.h = 64, - .header.stride = 128, - .data_size = sizeof(Spectrum_map), - .data = Spectrum_map, -}; diff --git a/modules/ui_shared/src/ui/assets/radar.c b/modules/ui_shared/src/ui/assets/radar.c new file mode 100644 index 00000000..2c210466 --- /dev/null +++ b/modules/ui_shared/src/ui/assets/radar.c @@ -0,0 +1,12324 @@ +#ifdef __has_include +#if __has_include("lvgl.h") +#ifndef LV_LVGL_H_INCLUDE_SIMPLE +#define LV_LVGL_H_INCLUDE_SIMPLE +#endif +#endif +#endif + +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMAGE_RADAR +#define LV_ATTRIBUTE_IMAGE_RADAR +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_RADAR uint8_t radar_map[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x44, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x44, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x44, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x44, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x44, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x44, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x44, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x44, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x44, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x44, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x44, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x44, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x44, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x24, + 0xfb, + 0x44, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xbf, + 0x9f, + 0x60, + 0x40, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0x9f, + 0xdf, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x9f, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xbf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0x20, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x7f, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xbf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0x9f, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0x9f, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xbf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x60, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xbf, + 0xff, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xff, + 0xdf, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x7f, + 0x40, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0x9f, + 0x7f, + 0xdf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0xdf, + 0xff, + 0xff, + 0xff, + 0x20, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0xdf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0xdf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xff, + 0xff, + 0xff, + 0x9f, + 0x60, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x7f, + 0x20, + 0x9f, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xbf, + 0xff, + 0xff, + 0xff, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xdf, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xdf, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xff, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x9f, + 0xff, + 0xff, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0x9f, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0x9f, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xdf, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xbf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xff, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0xff, + 0xff, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x9f, + 0xff, + 0xff, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x9f, + 0xff, + 0xff, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x9f, + 0xff, + 0xff, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xff, + 0xdf, + 0x7f, + 0x7f, + 0xff, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x9f, + 0xff, + 0xff, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xff, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xff, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0xff, + 0xff, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x9f, + 0xff, + 0xff, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x00, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xff, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0xff, + 0xff, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0xff, + 0xff, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x9f, + 0xff, + 0xff, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xff, + 0x9f, + 0x40, + 0x60, + 0xdf, + 0xff, + 0xff, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x9f, + 0xff, + 0xff, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x9f, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xff, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0xff, + 0xff, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xdf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xdf, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xdf, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xff, + 0xff, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xdf, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0x60, + 0x7f, + 0x7f, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xdf, + 0xff, + 0xff, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x9f, + 0xff, + 0xff, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xdf, + 0xff, + 0xff, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xff, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xdf, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0xff, + 0xff, + 0xdf, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x9f, + 0xff, + 0xff, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xff, + 0x7f, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xdf, + 0xff, + 0xff, + 0x7f, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xff, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x9f, + 0xff, + 0xff, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xdf, + 0xff, + 0xff, + 0xbf, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xdf, + 0xff, + 0xdf, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xdf, + 0xff, + 0xff, + 0xff, + 0x60, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xbf, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x9f, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xdf, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x60, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0x9f, + 0xff, + 0xff, + 0xff, + 0xff, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xff, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xdf, + 0xff, + 0xff, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xdf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0xbf, + 0x9f, + 0x7f, + 0x7f, + 0x9f, + 0xdf, + 0xdf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0xdf, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xdf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0xdf, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xbf, + 0xbf, + 0xdf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x9f, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xff, + 0xff, + 0xff, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xdf, + 0xff, + 0xff, + 0x7f, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xdf, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xdf, + 0xff, + 0xff, + 0xbf, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xdf, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xdf, + 0xff, + 0xff, + 0xdf, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xdf, + 0xff, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xbf, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xbf, + 0xff, + 0xff, + 0xff, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xff, + 0xff, + 0xff, + 0xff, + 0x9f, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xbf, + 0xff, + 0xff, + 0xff, + 0xff, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xdf, + 0xff, + 0xff, + 0xff, + 0xff, + 0x9f, + 0x40, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0xbf, + 0xff, + 0xff, + 0xff, + 0xff, + 0x9f, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7f, + 0xdf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x40, + 0x20, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0x60, + 0xbf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0x7f, + 0xdf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xdf, + 0xbf, + 0xbf, + 0x9f, + 0xbf, + 0xdf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xbf, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0xbf, + 0xdf, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0x9f, + 0x60, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x7f, + 0xbf, + 0xbf, + 0xdf, + 0xdf, + 0xff, + 0xff, + 0xff, + 0xdf, + 0xbf, + 0x9f, + 0x9f, + 0x60, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, +}; + +const lv_image_dsc_t radar = { + .header.magic = LV_IMAGE_HEADER_MAGIC, + .header.cf = LV_COLOR_FORMAT_RGB565A8, + .header.flags = 0, + .header.w = 64, + .header.h = 64, + .header.stride = 128, + .data_size = sizeof(radar_map), + .data = radar_map, +}; \ No newline at end of file diff --git a/modules/ui_shared/src/ui/screens/energy_sweep/energy_sweep_page_runtime.cpp b/modules/ui_shared/src/ui/screens/energy_sweep/energy_sweep_page_runtime.cpp index 2be2d283..835dee86 100644 --- a/modules/ui_shared/src/ui/screens/energy_sweep/energy_sweep_page_runtime.cpp +++ b/modules/ui_shared/src/ui/screens/energy_sweep/energy_sweep_page_runtime.cpp @@ -5,8 +5,10 @@ #include "app/app_config.h" #include "app/app_facade_access.h" #include "chat/infra/meshcore/mc_region_presets.h" +#include "chat/infra/meshcore/meshcore_protocol_helpers.h" +#include "chat/infra/meshtastic/mt_packet_wire.h" +#include "chat/infra/meshtastic/mt_radio_config.h" #include "chat/infra/meshtastic/mt_region.h" -#include "platform/ui/device_runtime.h" #include "platform/ui/lora_runtime.h" #include "platform/ui/screen_runtime.h" #include "sys/clock.h" @@ -15,14 +17,14 @@ #include "ui/page/page_profile.h" #include "ui/ui_common.h" #include "ui/widgets/top_bar.h" + #include #include #include #include #include #include -#include -#include +#include #if !defined(LV_FONT_MONTSERRAT_12) || !LV_FONT_MONTSERRAT_12 #define lv_font_montserrat_12 lv_font_montserrat_14 @@ -36,17 +38,145 @@ #if defined(ESP_PLATFORM) #include "esp_attr.h" -#define UI_ENERGY_SWEEP_STATE_RAM_ATTR EXT_RAM_ATTR +#define UI_PACKET_PROBE_STATE_RAM_ATTR EXT_RAM_ATTR #else -#define UI_ENERGY_SWEEP_STATE_RAM_ATTR +#define UI_PACKET_PROBE_STATE_RAM_ATTR #endif using Host = energy_sweep::ui::shell::Host; namespace { + +constexpr lv_coord_t kPagerWidth = 480; +constexpr lv_coord_t kPagerHeight = 222; +constexpr lv_coord_t kPagerTopBarHeight = 30; +constexpr lv_coord_t kPagerBottomBarHeight = 24; +constexpr lv_coord_t kPagerOuterMargin = 10; +constexpr int kMaxCandidates = 96; +constexpr int kMaxObservations = 8; +constexpr std::size_t kPacketScratchSize = 255; +constexpr uint32_t kRefreshIntervalMs = 35; +constexpr uint32_t kCandidateDwellMs = 700; +constexpr float kDefaultFreqStartMhz = 433.050f; +constexpr float kDefaultFreqEndMhz = 434.790f; +constexpr float kStepQuantMhz = 0.025f; +constexpr int kTargetCandidateCount = 70; + +constexpr uint32_t kColorAmber = 0xEBA341; +constexpr uint32_t kColorAmberDark = 0xC98118; +constexpr uint32_t kColorWarmBg = 0xFFF3DF; +constexpr uint32_t kColorPanelBg = 0xF8E6C3; +constexpr uint32_t kColorLine = 0xB3915D; +constexpr uint32_t kColorText = 0x593D1C; +constexpr uint32_t kColorTextDim = 0x846A42; +constexpr uint32_t kColorOk = 0x397046; +constexpr uint32_t kColorWarning = 0xA6422A; +constexpr uint32_t kColorInfo = 0x315F91; +constexpr uint32_t kColorFocus = 0xD59A36; + const Host* s_host = nullptr; +struct AirProfile +{ + float frequency_mhz = 0.0f; + float bw_khz = 125.0f; + uint8_t sf = 11; + uint8_t cr = 5; + int8_t tx_power = 14; + uint16_t preamble_len = 16; + uint8_t sync_word = 0x12; + uint8_t crc_len = 2; +}; + +struct ProbeBandPlan +{ + float freq_start_mhz = kDefaultFreqStartMhz; + float freq_end_mhz = kDefaultFreqEndMhz; + float step_mhz = kStepQuantMhz; + int candidate_count = 2; +}; + +struct RadioContext +{ + bool supported_protocol = false; + bool acquired = false; + chat::MeshProtocol protocol = chat::MeshProtocol::Meshtastic; + AirProfile base_profile{}; +}; + +struct ProbeObservation +{ + AirProfile profile{}; + uint32_t evidence_count = 0; + uint32_t first_seen_ms = 0; + uint32_t last_seen_ms = 0; + float last_rssi_dbm = 0.0f; + float last_snr_db = 0.0f; +}; + +struct ProbeState +{ + bool scanning = false; + bool radio_error = false; + bool applied = false; + bool confirmation_open = false; + bool confirm_apply_selected = false; + int candidate_index = 0; + int checked_in_pass = 0; + uint32_t completed_passes = 0; + uint32_t candidate_started_ms = 0; + int selected_observation = 0; + int visible_page_start = 0; + int observation_count = 0; + std::array observations{}; + std::array receive_scratch{}; + std::array protocol_scratch{}; +}; + +struct PacketProbeLayout +{ + lv_coord_t screen_w = kPagerWidth; + lv_coord_t screen_h = kPagerHeight; + lv_coord_t topbar_h = kPagerTopBarHeight; + lv_coord_t bottom_bar_h = kPagerBottomBarHeight; + lv_coord_t work_top = kPagerTopBarHeight; + lv_coord_t work_bottom = kPagerHeight - kPagerBottomBarHeight; + lv_coord_t content_x = kPagerOuterMargin; + lv_coord_t content_w = kPagerWidth - (kPagerOuterMargin * 2); + bool pager = true; +}; + +struct PacketProbeUi +{ + lv_obj_t* root = nullptr; + ::ui::widgets::TopBar top_bar = {}; + lv_obj_t* content_area = nullptr; + lv_obj_t* state_label = nullptr; + lv_obj_t* observed_label = nullptr; + lv_obj_t* empty_label = nullptr; + std::array result_rows{}; + std::array result_primary{}; + std::array result_secondary{}; + std::array result_count{}; + lv_obj_t* progress_label = nullptr; + lv_obj_t* bottom_bar = nullptr; + lv_obj_t* stop_button = nullptr; + lv_obj_t* stop_label = nullptr; + lv_obj_t* set_button = nullptr; + lv_obj_t* set_label = nullptr; + lv_obj_t* confirmation = nullptr; + lv_obj_t* confirm_cancel = nullptr; + lv_obj_t* confirm_apply = nullptr; +}; + +UI_PACKET_PROBE_STATE_RAM_ATTR PacketProbeUi s_ui; +UI_PACKET_PROBE_STATE_RAM_ATTR ProbeState s_state; +UI_PACKET_PROBE_STATE_RAM_ATTR RadioContext s_radio; +UI_PACKET_PROBE_STATE_RAM_ATTR ProbeBandPlan s_band; +UI_PACKET_PROBE_STATE_RAM_ATTR PacketProbeLayout s_layout; +lv_timer_t* s_refresh_timer = nullptr; + void request_exit() { if (s_host) @@ -57,390 +187,103 @@ void request_exit() ui_request_exit_to_menu(); } -constexpr int kScreenW = 480; -constexpr int kScreenH = 222; -constexpr int kTopBarH = 28; - -constexpr int kLeftPanelX = 12; -constexpr int kLeftPanelY = 40; -constexpr int kLeftPanelW = 332; -constexpr int kLeftPanelH = 170; - -constexpr int kPlotX = 10; -constexpr int kPlotY = 34; -constexpr int kPlotW = 312; -constexpr int kPlotH = 90; - -constexpr int kScaleBarX = 10; -constexpr int kScaleBarY = 130; -constexpr int kScaleBarW = 312; -constexpr int kScaleBarH = 28; - -constexpr int kRightPanelX = 354; -constexpr int kRightPanelY = 40; -constexpr int kRightPanelW = 114; -constexpr int kRightPanelH = 170; - -constexpr float kDefaultFreqStartMhz = 433.050f; -constexpr float kDefaultFreqEndMhz = 434.790f; -constexpr float kStepQuantMhz = 0.025f; -constexpr int kTargetBinCount = 70; -constexpr int kMaxBins = 96; -constexpr int kScanIntervalMs = 35; -constexpr int kSampleSettleMs = 2; -constexpr int kSampleCount = 5; -constexpr int kSampleGapMs = 1; - -constexpr float kNoiseEmaPrev = 0.7f; -constexpr float kNoiseEmaNew = 0.3f; -constexpr float kSweepEmaNew = 0.6f; -constexpr float kSweepEmaPrev = 0.4f; -constexpr float kHotEnterMarginDb = 10.0f; -constexpr float kHotExitMarginDb = 7.0f; -constexpr float kViewFloorHardMinDbm = -140.0f; -constexpr float kViewFloorHardMaxDbm = -100.0f; -constexpr float kViewCeilHardMinDbm = -90.0f; -constexpr float kViewCeilHardMaxDbm = -25.0f; -constexpr float kViewFloorMarginDb = 10.0f; -constexpr float kViewPeakMarginDb = 8.0f; -constexpr float kViewNoiseHeadroomDb = 18.0f; -constexpr float kViewMinSpanDb = 32.0f; -constexpr float kViewEmaPrev = 0.75f; -constexpr float kViewEmaNew = 0.25f; - -constexpr int kBestGuardBins = 2; - -constexpr uint32_t kColorAmber = 0xEBA341; -constexpr uint32_t kColorAmberDark = 0xC98118; -constexpr uint32_t kColorWarmBg = 0xF6E6C6; -constexpr uint32_t kColorPanelBg = 0xFAF0D8; -constexpr uint32_t kColorLine = 0xE7C98F; -constexpr uint32_t kColorText = 0x6B4A1E; -constexpr uint32_t kColorTextDim = 0x8A6A3A; -constexpr uint32_t kColorWarn = 0xB94A2C; -constexpr uint32_t kColorOk = 0x3E7D3E; -constexpr uint32_t kColorInfo = 0x2D6FB6; - -struct EnergySweepUi +int active_candidate_count() { - lv_obj_t* root = nullptr; - - ::ui::widgets::TopBar top_bar = {}; - lv_obj_t* mode_chip = nullptr; - lv_obj_t* mode_chip_label = nullptr; - lv_obj_t* cad_chip = nullptr; - lv_obj_t* cad_chip_label = nullptr; - - lv_obj_t* left_panel = nullptr; - lv_obj_t* plot_area = nullptr; - std::array bars{}; - lv_obj_t* cursor_line = nullptr; - lv_obj_t* cursor_tip = nullptr; - lv_obj_t* scale_left = nullptr; - lv_obj_t* scale_mid = nullptr; - lv_obj_t* scale_right = nullptr; - - lv_obj_t* right_panel = nullptr; - lv_obj_t* cursor_freq = nullptr; - lv_obj_t* cursor_unit = nullptr; - lv_obj_t* rssi_label = nullptr; - lv_obj_t* noise_label = nullptr; - lv_obj_t* best_freq = nullptr; - lv_obj_t* best_snr = nullptr; - lv_obj_t* progress_bar = nullptr; - lv_obj_t* progress_pct = nullptr; - lv_obj_t* btn_scan = nullptr; - lv_obj_t* btn_scan_label = nullptr; - lv_obj_t* btn_auto = nullptr; - lv_obj_t* btn_auto_label = nullptr; -}; - -struct EnergySweepLayout -{ - bool large_touch = false; - lv_coord_t screen_w = kScreenW; - lv_coord_t screen_h = kScreenH; - lv_coord_t topbar_h = kTopBarH; - - lv_coord_t mode_chip_x = 10; - lv_coord_t mode_chip_y = 8; - lv_coord_t mode_chip_w = 118; - lv_coord_t mode_chip_h = 18; - lv_coord_t cad_chip_x = 136; - lv_coord_t cad_chip_y = 8; - lv_coord_t cad_chip_w = 82; - lv_coord_t cad_chip_h = 18; - - lv_coord_t left_panel_x = kLeftPanelX; - lv_coord_t left_panel_y = kLeftPanelY; - lv_coord_t left_panel_w = kLeftPanelW; - lv_coord_t left_panel_h = kLeftPanelH; - lv_coord_t plot_x = kPlotX; - lv_coord_t plot_y = kPlotY; - lv_coord_t plot_w = kPlotW; - lv_coord_t plot_h = kPlotH; - lv_coord_t scale_x = kScaleBarX; - lv_coord_t scale_y = kScaleBarY; - lv_coord_t scale_w = kScaleBarW; - lv_coord_t scale_h = kScaleBarH; - - lv_coord_t right_panel_x = kRightPanelX; - lv_coord_t right_panel_y = kRightPanelY; - lv_coord_t right_panel_w = kRightPanelW; - lv_coord_t right_panel_h = kRightPanelH; -}; - -struct RadioContext -{ - bool use_hw = false; - float bw_khz = 125.0f; - uint8_t sf = 11; - uint8_t cr = 5; - int8_t tx_power = 14; - uint8_t preamble_len = 8; - uint8_t sync_word = 0x12; - uint8_t crc_len = 2; -}; - -struct SweepState -{ - bool scanning = false; - bool auto_applied = false; - int cursor_index = 0; - int scan_index = 0; - int scanned_bins = 0; - int completed_cycles = 0; - float progress = 0.0f; - int best_index = 0; - float noise_dbm = -104.0f; - bool noise_valid = false; - float view_floor_dbm = -130.0f; - float view_ceil_dbm = -60.0f; - bool view_valid = false; - std::array rssi{}; - std::array smooth{}; - std::array hot{}; - uint32_t rand_state = 0xA5C34D29u; - float sim_phase = 0.0f; -}; - -struct SweepBandPlan -{ - float freq_start_mhz = kDefaultFreqStartMhz; - float freq_end_mhz = kDefaultFreqEndMhz; - float step_mhz = kStepQuantMhz; - float bw_khz = 125.0f; - int bin_count = static_cast(((kDefaultFreqEndMhz - kDefaultFreqStartMhz) / kStepQuantMhz) + 0.5f) + 1; -}; - -UI_ENERGY_SWEEP_STATE_RAM_ATTR EnergySweepUi s_ui; -UI_ENERGY_SWEEP_STATE_RAM_ATTR SweepState s_state; -UI_ENERGY_SWEEP_STATE_RAM_ATTR RadioContext s_radio; -UI_ENERGY_SWEEP_STATE_RAM_ATTR SweepBandPlan s_band; -UI_ENERGY_SWEEP_STATE_RAM_ATTR EnergySweepLayout s_layout; -lv_timer_t* s_refresh_timer = nullptr; - -EnergySweepLayout make_classic_layout() -{ - return {}; + return std::clamp(s_band.candidate_count, 2, kMaxCandidates); } -EnergySweepLayout make_large_touch_layout(lv_coord_t parent_w, lv_coord_t parent_h) +int clamp_observation_index(int index) { - EnergySweepLayout layout{}; - layout.large_touch = true; - layout.screen_w = parent_w > 0 ? parent_w : 1168; - layout.screen_h = parent_h > 0 ? parent_h : 540; - layout.topbar_h = std::max(48, ::ui::page_profile::current().top_bar_height); - - const bool landscape = layout.screen_w >= layout.screen_h; - const lv_coord_t margin = 14; - const lv_coord_t gap = 14; - const lv_coord_t content_top = layout.topbar_h + 14; - const lv_coord_t content_h = std::max(360, layout.screen_h - content_top - margin); - - layout.mode_chip_w = 148; - layout.mode_chip_h = 28; - layout.mode_chip_x = 14; - layout.mode_chip_y = 14; - layout.cad_chip_w = 88; - layout.cad_chip_h = 28; - layout.cad_chip_x = layout.mode_chip_x + layout.mode_chip_w + 10; - layout.cad_chip_y = layout.mode_chip_y; - - layout.left_panel_x = margin; - layout.left_panel_y = content_top; - if (landscape) + if (s_state.observation_count <= 0) { - layout.right_panel_w = std::min(340, std::max(290, layout.screen_w / 4)); - layout.right_panel_x = layout.screen_w - margin - layout.right_panel_w; - layout.right_panel_y = content_top; - layout.right_panel_h = content_h; - layout.left_panel_w = layout.right_panel_x - layout.left_panel_x - gap; - layout.left_panel_h = content_h; + return 0; } - else - { - layout.left_panel_w = layout.screen_w - (margin * 2); - layout.left_panel_h = std::max(420, (content_h * 58) / 100); - layout.right_panel_x = margin; - layout.right_panel_y = layout.left_panel_y + layout.left_panel_h + gap; - layout.right_panel_w = layout.left_panel_w; - layout.right_panel_h = std::max(340, layout.screen_h - layout.right_panel_y - margin); - } - - layout.plot_x = 14; - layout.plot_y = layout.mode_chip_y + layout.mode_chip_h + 14; - layout.plot_w = layout.left_panel_w - 28; - layout.scale_x = layout.plot_x; - layout.scale_w = layout.plot_w; - layout.scale_h = 50; - layout.scale_y = layout.left_panel_h - layout.scale_h - 14; - layout.plot_h = std::max(180, layout.scale_y - layout.plot_y - 12); - return layout; + return std::clamp(index, 0, s_state.observation_count - 1); } -EnergySweepLayout resolve_layout(lv_obj_t* parent) +int visible_result_capacity() +{ + return s_layout.pager ? 4 : kMaxObservations; +} + +float candidate_frequency_mhz(int index) +{ + const int clamped = std::clamp(index, 0, active_candidate_count() - 1); + return s_band.freq_start_mhz + static_cast(clamped) * s_band.step_mhz; +} + +PacketProbeLayout resolve_layout(lv_obj_t* parent) { if (parent) { lv_obj_update_layout(parent); } + + PacketProbeLayout layout{}; const lv_coord_t parent_w = parent ? lv_obj_get_width(parent) : 0; const lv_coord_t parent_h = parent ? lv_obj_get_height(parent) : 0; - const lv_coord_t long_side = std::max(parent_w, parent_h); - const lv_coord_t short_side = std::min(parent_w, parent_h); - if (::ui::page_profile::current().large_touch_hitbox && long_side >= 900 && short_side >= 500) - { - return make_large_touch_layout(parent_w, parent_h); - } - return make_classic_layout(); + const bool pager = parent_w <= 0 || parent_h <= 0 || + (parent_w <= 600 && parent_h <= 320); + layout.pager = pager; + layout.screen_w = pager ? kPagerWidth : parent_w; + layout.screen_h = pager ? kPagerHeight : parent_h; + layout.topbar_h = pager ? kPagerTopBarHeight + : std::max(42, ::ui::page_profile::current().top_bar_height); + layout.bottom_bar_h = pager ? kPagerBottomBarHeight : 34; + layout.work_top = layout.topbar_h; + layout.work_bottom = layout.screen_h - layout.bottom_bar_h; + + const lv_coord_t margin = pager ? kPagerOuterMargin : 18; + layout.content_x = margin; + layout.content_w = layout.screen_w - (margin * 2); + return layout; } -platform::ui::lora::ReceiveConfig make_receive_config() +platform::ui::lora::ReceiveConfig receive_config_for(const AirProfile& profile) { platform::ui::lora::ReceiveConfig config{}; - config.bw_khz = s_radio.bw_khz; - config.sf = s_radio.sf; - config.cr = s_radio.cr; - config.tx_power = s_radio.tx_power; - config.preamble_len = s_radio.preamble_len; - config.sync_word = s_radio.sync_word; - config.crc_len = s_radio.crc_len; + config.bw_khz = profile.bw_khz; + config.sf = profile.sf; + config.cr = profile.cr; + config.tx_power = profile.tx_power; + config.preamble_len = profile.preamble_len; + config.sync_word = profile.sync_word; + config.crc_len = profile.crc_len; return config; } -int active_bin_count() -{ - if (s_band.bin_count < 2) - { - return 2; - } - if (s_band.bin_count > kMaxBins) - { - return kMaxBins; - } - return s_band.bin_count; -} - -int clamp_index(int idx) -{ - if (idx < 0) - { - return 0; - } - const int bins = active_bin_count(); - if (idx >= bins) - { - return bins - 1; - } - return idx; -} - -float clamp_float(float value, float low, float high) -{ - if (value < low) - { - return low; - } - if (value > high) - { - return high; - } - return value; -} - -float bin_to_freq_mhz(int idx) -{ - return s_band.freq_start_mhz + static_cast(idx) * s_band.step_mhz; -} - -float preset_to_bw_khz(uint8_t modem_preset, bool wide_lora) -{ - const auto preset = static_cast(modem_preset); - switch (preset) - { - case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_TURBO: - return wide_lora ? 1625.0f : 500.0f; - case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_FAST: - case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_SLOW: - case meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_FAST: - case meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_SLOW: - return wide_lora ? 812.5f : 250.0f; - case meshtastic_Config_LoRaConfig_ModemPreset_LONG_MODERATE: - case meshtastic_Config_LoRaConfig_ModemPreset_LONG_SLOW: - return wide_lora ? 406.25f : 125.0f; - case meshtastic_Config_LoRaConfig_ModemPreset_LONG_TURBO: - return wide_lora ? 1625.0f : 500.0f; - case meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST: - default: - return wide_lora ? 812.5f : 250.0f; - } -} - -const chat::meshtastic::RegionInfo* find_region_for_frequency(float freq_mhz) +const chat::meshtastic::RegionInfo* find_region_for_frequency(float frequency_mhz) { size_t count = 0; - const chat::meshtastic::RegionInfo* regions = chat::meshtastic::getRegionTable(&count); - if (!regions || count == 0) + const auto* regions = chat::meshtastic::getRegionTable(&count); + const chat::meshtastic::RegionInfo* nearest = nullptr; + float nearest_distance = std::numeric_limits::max(); + for (size_t index = 0; regions && index < count; ++index) { - return nullptr; - } - - const chat::meshtastic::RegionInfo* best = nullptr; - float best_dist = 1e9f; - - for (size_t i = 0; i < count; ++i) - { - const chat::meshtastic::RegionInfo& region = regions[i]; + const auto& region = regions[index]; if (region.code == meshtastic_Config_LoRaConfig_RegionCode_UNSET) { continue; } - - float dist = 0.0f; - if (freq_mhz < region.freq_start_mhz) + const float distance = frequency_mhz < region.freq_start_mhz + ? region.freq_start_mhz - frequency_mhz + : (frequency_mhz > region.freq_end_mhz + ? frequency_mhz - region.freq_end_mhz + : 0.0f); + if (!nearest || distance < nearest_distance) { - dist = region.freq_start_mhz - freq_mhz; - } - else if (freq_mhz > region.freq_end_mhz) - { - dist = freq_mhz - region.freq_end_mhz; - } - - if (!best || dist < best_dist) - { - best = ®ion; - best_dist = dist; + nearest = ®ion; + nearest_distance = distance; } } - - return best ? best : chat::meshtastic::findRegion(meshtastic_Config_LoRaConfig_RegionCode_CN); + return nearest ? nearest + : chat::meshtastic::findRegion(meshtastic_Config_LoRaConfig_RegionCode_CN); } -void apply_band_plan(float start_mhz, float end_mhz, float bw_khz) +void setup_band_plan(float start_mhz, float end_mhz, float bandwidth_khz) { - if (!std::isfinite(start_mhz) || !std::isfinite(end_mhz)) + if (!std::isfinite(start_mhz) || !std::isfinite(end_mhz) || start_mhz <= 0.0f || + end_mhz <= 0.0f) { start_mhz = kDefaultFreqStartMhz; end_mhz = kDefaultFreqEndMhz; @@ -450,345 +293,244 @@ void apply_band_plan(float start_mhz, float end_mhz, float bw_khz) std::swap(start_mhz, end_mhz); } - const float safe_bw_khz = (std::isfinite(bw_khz) && bw_khz > 1.0f) ? bw_khz : 125.0f; - const float half_bw_mhz = safe_bw_khz / 2000.0f; - if ((end_mhz - start_mhz) > (2.0f * half_bw_mhz)) + const float safe_bw_khz = (std::isfinite(bandwidth_khz) && bandwidth_khz > 1.0f) + ? bandwidth_khz + : 125.0f; + const float half_bandwidth_mhz = safe_bw_khz / 2000.0f; + if ((end_mhz - start_mhz) > (2.0f * half_bandwidth_mhz)) { - start_mhz += half_bw_mhz; - end_mhz -= half_bw_mhz; + start_mhz += half_bandwidth_mhz; + end_mhz -= half_bandwidth_mhz; } const float span_mhz = std::max(kStepQuantMhz, end_mhz - start_mhz); - float step_mhz = span_mhz / static_cast(kTargetBinCount - 1); - if (!std::isfinite(step_mhz) || step_mhz < kStepQuantMhz) - { - step_mhz = kStepQuantMhz; - } - step_mhz = std::ceil(step_mhz / kStepQuantMhz) * kStepQuantMhz; - - int bins = static_cast(std::floor(span_mhz / step_mhz)) + 1; - if (bins < 2) - { - bins = 2; - } - while (bins > kMaxBins) + float step_mhz = span_mhz / static_cast(kTargetCandidateCount - 1); + step_mhz = std::max(kStepQuantMhz, std::ceil(step_mhz / kStepQuantMhz) * kStepQuantMhz); + int candidates = static_cast(std::floor(span_mhz / step_mhz)) + 1; + while (candidates > kMaxCandidates) { step_mhz += kStepQuantMhz; - bins = static_cast(std::floor(span_mhz / step_mhz)) + 1; + candidates = static_cast(std::floor(span_mhz / step_mhz)) + 1; } s_band.freq_start_mhz = start_mhz; + s_band.freq_end_mhz = start_mhz + step_mhz * static_cast(std::max(1, candidates - 1)); s_band.step_mhz = step_mhz; - s_band.bin_count = bins; - s_band.freq_end_mhz = start_mhz + step_mhz * static_cast(bins - 1); - s_band.bw_khz = safe_bw_khz; + s_band.candidate_count = std::max(2, candidates); } -void setup_sweep_band_plan() +void setup_radio_context() { - const app::AppConfig& cfg = app::configFacade().readConfig(); + s_radio = {}; + s_band = {}; - float start_mhz = kDefaultFreqStartMhz; - float end_mhz = kDefaultFreqEndMhz; - float bw_khz = 125.0f; - - if (cfg.mesh_protocol == chat::MeshProtocol::Meshtastic) + const app::AppConfig& config = app::configFacade().readConfig(); + s_radio.protocol = config.mesh_protocol; + if (config.mesh_protocol == chat::MeshProtocol::Meshtastic) { - const chat::MeshConfig& mesh = cfg.meshtastic_config; - auto region_code = static_cast(mesh.region); - if (region_code == meshtastic_Config_LoRaConfig_RegionCode_UNSET) - { - region_code = meshtastic_Config_LoRaConfig_RegionCode_CN; - } - const chat::meshtastic::RegionInfo* region = chat::meshtastic::findRegion(region_code); + const chat::meshtastic::RadioConfig radio = + chat::meshtastic::deriveRadioConfig(config.meshtastic_config); + s_radio.supported_protocol = true; + s_radio.base_profile.bw_khz = radio.bw_khz; + s_radio.base_profile.sf = radio.sf; + s_radio.base_profile.cr = radio.cr_denom; + s_radio.base_profile.tx_power = radio.tx_power_dbm; + s_radio.base_profile.preamble_len = radio.preamble_len; + s_radio.base_profile.sync_word = radio.sync_word; + s_radio.base_profile.crc_len = radio.crc_len; + + const auto* region = chat::meshtastic::findRegion(radio.region_code); if (region) { - start_mhz = region->freq_start_mhz; - end_mhz = region->freq_end_mhz; - bw_khz = mesh.use_preset ? preset_to_bw_khz(mesh.modem_preset, region->wide_lora) - : mesh.bandwidth_khz; - } - } - else - { - const chat::MeshConfig& mesh = cfg.meshcore_config; - float hint_freq_mhz = mesh.meshcore_freq_mhz; - if (mesh.meshcore_region_preset > 0) - { - const chat::meshcore::RegionPreset* preset = - chat::meshcore::findRegionPresetById(mesh.meshcore_region_preset); - if (preset) - { - hint_freq_mhz = preset->freq_mhz; - } - } - - const chat::meshtastic::RegionInfo* region = find_region_for_frequency(hint_freq_mhz); - if (region) - { - start_mhz = region->freq_start_mhz; - end_mhz = region->freq_end_mhz; - } - bw_khz = mesh.meshcore_bw_khz; - } - - apply_band_plan(start_mhz, end_mhz, bw_khz); -} - -uint32_t next_random() -{ - uint32_t x = s_state.rand_state; - x ^= x << 13; - x ^= x >> 17; - x ^= x << 5; - s_state.rand_state = x; - return x; -} - -float random_unit() -{ - return static_cast(next_random() & 0xFFFFu) / 65535.0f; -} - -float simulated_rssi_for_bin(int idx) -{ - const float t = s_state.sim_phase; - float value = -111.0f + 3.2f * std::sin((idx + t) * 0.21f) + 2.4f * std::cos((idx + t) * 0.067f); - value += (random_unit() - 0.5f) * 3.5f; - - if (idx >= 32 && idx <= 38) - { - value = -92.0f + (random_unit() - 0.5f) * 3.0f; - } - - const int bins = active_bin_count(); - const int moving_peak = (bins > 0) ? (static_cast(t) % bins) : 0; - const int dist = std::abs(idx - moving_peak); - if (dist <= 2) - { - value = std::max(value, -89.0f - static_cast(dist) * 1.2f + (random_unit() - 0.5f) * 1.4f); - } - - return std::max(-124.0f, std::min(-82.0f, value)); -} - -float sample_hw_rssi(int idx) -{ - if (!s_radio.use_hw) - { - return NAN; - } - - const float freq_mhz = bin_to_freq_mhz(idx); - if (!platform::ui::lora::configure_receive(freq_mhz, make_receive_config())) - { - return NAN; - } - platform::ui::device::delay_ms(kSampleSettleMs); - - std::array values{}; - int valid = 0; - for (int i = 0; i < kSampleCount; ++i) - { - const float rssi = platform::ui::lora::read_instant_rssi(); - if (std::isfinite(rssi) && rssi < 0.0f && rssi > -180.0f) - { - values[valid++] = rssi; - } - platform::ui::device::delay_ms(kSampleGapMs); - } - - if (valid <= 0) - { - return NAN; - } - - for (int i = 1; i < valid; ++i) - { - const float current = values[i]; - int j = i - 1; - while (j >= 0 && values[j] > current) - { - values[j + 1] = values[j]; - --j; - } - values[j + 1] = current; - } - return values[valid / 2]; -} - -float sample_bin_rssi(int idx) -{ - const float hw = sample_hw_rssi(idx); - if (std::isfinite(hw)) - { - return hw; - } - return simulated_rssi_for_bin(idx); -} - -float display_value_for_bin(int idx) -{ - const int bins = active_bin_count(); - if (idx < 0 || idx >= bins) - { - return -120.0f; - } - const float smooth = s_state.smooth[idx]; - if (smooth < -190.0f) - { - return s_state.rssi[idx]; - } - return smooth; -} - -int available_bins_for_metrics() -{ - const int bins = active_bin_count(); - if (s_state.completed_cycles > 0) - { - return bins; - } - if (s_state.scanned_bins > 0) - { - return std::min(s_state.scanned_bins, bins); - } - return 1; -} - -void recompute_noise_and_hot(int available) -{ - const int bins = active_bin_count(); - available = std::max(1, std::min(available, bins)); - - std::vector values; - values.reserve(static_cast(available)); - for (int i = 0; i < available; ++i) - { - values.push_back(display_value_for_bin(i)); - } - - const size_t p20 = (values.size() - 1) / 5; - std::nth_element(values.begin(), values.begin() + static_cast(p20), values.end()); - const float floor_est = values[p20]; - if (!s_state.noise_valid) - { - s_state.noise_dbm = floor_est; - s_state.noise_valid = true; - } - else - { - s_state.noise_dbm = (kNoiseEmaPrev * s_state.noise_dbm) + (kNoiseEmaNew * floor_est); - } - - const float hot_enter = s_state.noise_dbm + kHotEnterMarginDb; - const float hot_exit = s_state.noise_dbm + kHotExitMarginDb; - for (int i = 0; i < kMaxBins; ++i) - { - if (i >= available) - { - s_state.hot[i] = 0; - continue; - } - - const float v = display_value_for_bin(i); - if (s_state.hot[i]) - { - s_state.hot[i] = (v > hot_exit) ? 1 : 0; + setup_band_plan(region->freq_start_mhz, region->freq_end_mhz, radio.bw_khz); } else { - s_state.hot[i] = (v > hot_enter) ? 1 : 0; + setup_band_plan(kDefaultFreqStartMhz, kDefaultFreqEndMhz, radio.bw_khz); + } + return; + } + + if (config.mesh_protocol == chat::MeshProtocol::MeshCore) + { + const chat::MeshConfig& mesh = config.meshcore_config; + s_radio.supported_protocol = true; + s_radio.base_profile.bw_khz = mesh.meshcore_bw_khz; + s_radio.base_profile.sf = std::clamp(mesh.meshcore_sf, 5, 12); + s_radio.base_profile.cr = std::clamp(mesh.meshcore_cr, 5, 8); + s_radio.base_profile.tx_power = mesh.tx_power; + s_radio.base_profile.preamble_len = 16; + s_radio.base_profile.sync_word = 0x12; + s_radio.base_profile.crc_len = 2; + + float hint_frequency = mesh.meshcore_freq_mhz; + if (mesh.meshcore_region_preset > 0) + { + if (const auto* preset = + chat::meshcore::findRegionPresetById(mesh.meshcore_region_preset)) + { + hint_frequency = preset->freq_mhz; + } + } + if (const auto* region = find_region_for_frequency(hint_frequency)) + { + setup_band_plan(region->freq_start_mhz, region->freq_end_mhz, + s_radio.base_profile.bw_khz); + } + else + { + setup_band_plan(kDefaultFreqStartMhz, kDefaultFreqEndMhz, + s_radio.base_profile.bw_khz); } } } -void recompute_view_range(int available) +AirProfile current_candidate() { - const int bins = active_bin_count(); - available = std::max(1, std::min(available, bins)); - - float observed_min = 0.0f; - float observed_max = 0.0f; - bool have_observation = false; - for (int i = 0; i < available; ++i) - { - const float value = display_value_for_bin(i); - if (!std::isfinite(value)) - { - continue; - } - if (!have_observation) - { - observed_min = value; - observed_max = value; - have_observation = true; - continue; - } - observed_min = std::min(observed_min, value); - observed_max = std::max(observed_max, value); - } - - if (!have_observation) - { - return; - } - - float target_floor = std::min(observed_min - 4.0f, s_state.noise_dbm - kViewFloorMarginDb); - target_floor = clamp_float(target_floor, kViewFloorHardMinDbm, kViewFloorHardMaxDbm); - - float target_ceil = std::max(observed_max + kViewPeakMarginDb, s_state.noise_dbm + kViewNoiseHeadroomDb); - target_ceil = clamp_float(target_ceil, kViewCeilHardMinDbm, kViewCeilHardMaxDbm); - - if ((target_ceil - target_floor) < kViewMinSpanDb) - { - target_ceil = std::min(kViewCeilHardMaxDbm, target_floor + kViewMinSpanDb); - } - if ((target_ceil - target_floor) < kViewMinSpanDb) - { - target_floor = std::max(kViewFloorHardMinDbm, target_ceil - kViewMinSpanDb); - } - - if (!s_state.view_valid) - { - s_state.view_floor_dbm = target_floor; - s_state.view_ceil_dbm = target_ceil; - s_state.view_valid = true; - return; - } - - s_state.view_floor_dbm = (kViewEmaPrev * s_state.view_floor_dbm) + (kViewEmaNew * target_floor); - s_state.view_ceil_dbm = (kViewEmaPrev * s_state.view_ceil_dbm) + (kViewEmaNew * target_ceil); + AirProfile profile = s_radio.base_profile; + profile.frequency_mhz = candidate_frequency_mhz(s_state.candidate_index); + return profile; } -void recompute_best(int available) +bool acquire_radio_runtime() { - const int bins = active_bin_count(); - available = std::max(1, std::min(available, bins)); - - const float step_khz = std::max(1.0f, s_band.step_mhz * 1000.0f); - const int window_bins = std::max(1, static_cast(std::ceil(s_band.bw_khz / step_khz))); - const int half_span = ((window_bins - 1) / 2) + kBestGuardBins; - - int best_idx = 0; - float best_score = 1e9f; - for (int i = 0; i < available; ++i) + if (!platform::ui::lora::acquire() || !platform::ui::lora::is_online()) { - const int lo = std::max(0, i - half_span); - const int hi = std::min(available - 1, i + half_span); - float window_worst = -200.0f; - for (int j = lo; j <= hi; ++j) - { - window_worst = std::max(window_worst, display_value_for_bin(j)); - } - if (window_worst < best_score) - { - best_score = window_worst; - best_idx = i; - } + return false; + } + s_radio.acquired = true; + return true; +} + +void release_radio_runtime() +{ + if (!s_radio.acquired) + { + return; + } + platform::ui::lora::release(); + s_radio.acquired = false; +} + +bool configure_current_candidate() +{ + const AirProfile profile = current_candidate(); + if (!platform::ui::lora::configure_receive(profile.frequency_mhz, + receive_config_for(profile))) + { + return false; + } + s_state.candidate_started_ms = sys::millis_now(); + return true; +} + +bool validate_protocol_packet(const uint8_t* data, std::size_t size) +{ + if (!data || size == 0) + { + return false; } - s_state.best_index = clamp_index(best_idx); + if (s_radio.protocol == chat::MeshProtocol::Meshtastic) + { + chat::meshtastic::PacketHeaderWire header{}; + std::size_t payload_size = s_state.protocol_scratch.size(); + return chat::meshtastic::parseWirePacket(data, + size, + &header, + s_state.protocol_scratch.data(), + &payload_size) && + header.id != 0 && header.from != 0 && payload_size > 0; + } + + if (s_radio.protocol == chat::MeshProtocol::MeshCore) + { + chat::meshcore::ParsedPacket packet{}; + return chat::meshcore::parsePacket(data, size, &packet) && packet.payload != nullptr && + packet.payload_len > 0; + } + + return false; +} + +bool same_profile(const AirProfile& lhs, const AirProfile& rhs) +{ + return std::fabs(lhs.frequency_mhz - rhs.frequency_mhz) < 0.0005f && + std::fabs(lhs.bw_khz - rhs.bw_khz) < 0.01f && lhs.sf == rhs.sf && + lhs.cr == rhs.cr && lhs.preamble_len == rhs.preamble_len && + lhs.sync_word == rhs.sync_word && lhs.crc_len == rhs.crc_len; +} + +void restore_page_focus(); + +void record_observation(const AirProfile& profile, + const platform::ui::lora::ReceivedPacket& packet) +{ + int observation_index = -1; + bool is_new_observation = false; + for (int index = 0; index < s_state.observation_count; ++index) + { + if (same_profile(s_state.observations[index].profile, profile)) + { + observation_index = index; + break; + } + } + if (observation_index < 0) + { + if (s_state.observation_count >= kMaxObservations) + { + return; + } + observation_index = s_state.observation_count++; + is_new_observation = true; + s_state.observations[observation_index] = {}; + s_state.observations[observation_index].profile = profile; + s_state.observations[observation_index].first_seen_ms = sys::millis_now(); + } + + ProbeObservation& observation = s_state.observations[observation_index]; + observation.evidence_count++; + observation.last_seen_ms = sys::millis_now(); + observation.last_rssi_dbm = packet.rssi_dbm; + observation.last_snr_db = packet.snr_db; + if (s_state.observation_count == 1) + { + s_state.selected_observation = 0; + } + if (is_new_observation && s_ui.root) + { + restore_page_focus(); + } +} + +void stop_probe() +{ + s_state.scanning = false; + release_radio_runtime(); +} + +void start_probe() +{ + s_state.applied = false; + s_state.radio_error = false; + if (!s_radio.supported_protocol || !platform::ui::lora::is_supported() || + !acquire_radio_runtime()) + { + s_state.radio_error = true; + return; + } + + s_state.candidate_index = 0; + s_state.checked_in_pass = 0; + s_state.candidate_started_ms = 0; + if (!configure_current_candidate()) + { + s_state.radio_error = true; + release_radio_runtime(); + return; + } + s_state.scanning = true; } void process_scan_step() @@ -798,557 +540,201 @@ void process_scan_step() return; } - const int bins = active_bin_count(); - const int idx = clamp_index(s_state.scan_index); - const float sample = sample_bin_rssi(idx); - - s_state.rssi[idx] = sample; - const float prev = s_state.smooth[idx]; - if (prev < -190.0f) + for (int packet_index = 0; packet_index < 2; ++packet_index) { - s_state.smooth[idx] = sample; - } - else - { - s_state.smooth[idx] = (kSweepEmaNew * sample) + (kSweepEmaPrev * prev); + platform::ui::lora::ReceivedPacket packet{}; + if (!platform::ui::lora::poll_received_packet(s_state.receive_scratch.data(), + s_state.receive_scratch.size(), + &packet)) + { + break; + } + if (validate_protocol_packet(s_state.receive_scratch.data(), packet.size)) + { + record_observation(current_candidate(), packet); + } } - s_state.cursor_index = idx; - s_state.scan_index++; - s_state.scanned_bins = std::max(s_state.scanned_bins, s_state.scan_index); - s_state.progress = static_cast(s_state.scan_index) / static_cast(bins); - - if (s_state.scan_index >= bins) - { - s_state.progress = 1.0f; - s_state.scan_index = 0; - s_state.scanned_bins = bins; - s_state.completed_cycles++; - } - - const int available = available_bins_for_metrics(); - recompute_noise_and_hot(available); - recompute_view_range(available); - recompute_best(available); - s_state.sim_phase += 0.17f; -} - -void set_scan_button_style() -{ - if (!s_ui.btn_scan || !s_ui.btn_scan_label) + const uint32_t now = sys::millis_now(); + if ((now - s_state.candidate_started_ms) < kCandidateDwellMs) { return; } - const uint32_t bg = s_state.scanning ? kColorWarn : kColorAmber; - const uint32_t border = s_state.scanning ? 0x8A2E1C : kColorAmberDark; - lv_obj_set_style_bg_color(s_ui.btn_scan, lv_color_hex(bg), 0); - lv_obj_set_style_border_color(s_ui.btn_scan, lv_color_hex(border), 0); - lv_obj_set_style_text_color(s_ui.btn_scan_label, lv_color_white(), 0); - ::ui::i18n::set_label_text(s_ui.btn_scan_label, s_state.scanning ? "STOP" : "SCAN"); - lv_obj_center(s_ui.btn_scan_label); + s_state.checked_in_pass++; + s_state.candidate_index++; + if (s_state.candidate_index >= active_candidate_count()) + { + s_state.candidate_index = 0; + s_state.checked_in_pass = 0; + s_state.completed_passes++; + } + if (!configure_current_candidate()) + { + s_state.radio_error = true; + stop_probe(); + } } -void set_auto_button_style() +void format_profile_params(const AirProfile& profile, char* buffer, std::size_t buffer_size) { - if (!s_ui.btn_auto || !s_ui.btn_auto_label) + const float rounded_bandwidth = std::round(profile.bw_khz); + if (std::fabs(profile.bw_khz - rounded_bandwidth) < 0.01f) + { + snprintf(buffer, + buffer_size, + "BW %.0fk SF%u CR4/%u", + static_cast(rounded_bandwidth), + static_cast(profile.sf), + static_cast(profile.cr)); + return; + } + snprintf(buffer, + buffer_size, + "BW %.1fk SF%u CR4/%u", + static_cast(profile.bw_khz), + static_cast(profile.sf), + static_cast(profile.cr)); +} + +void refresh_rows() +{ + const int visible_rows = visible_result_capacity(); + for (int visual_index = 0; visual_index < kMaxObservations; ++visual_index) + { + lv_obj_t* row = s_ui.result_rows[visual_index]; + if (!row) + { + continue; + } + const int observation_index = s_state.visible_page_start + visual_index; + if (visual_index >= visible_rows || observation_index >= s_state.observation_count) + { + lv_obj_add_flag(row, LV_OBJ_FLAG_HIDDEN); + continue; + } + + lv_obj_clear_flag(row, LV_OBJ_FLAG_HIDDEN); + const ProbeObservation& observation = s_state.observations[observation_index]; + char primary[32]; + char secondary[40]; + char count[16]; + snprintf(primary, sizeof(primary), "%.3f MHz", observation.profile.frequency_mhz); + format_profile_params(observation.profile, secondary, sizeof(secondary)); + snprintf(count, sizeof(count), "x%lu", static_cast(observation.evidence_count)); + lv_label_set_text(s_ui.result_primary[visual_index], primary); + lv_label_set_text(s_ui.result_secondary[visual_index], secondary); + lv_label_set_text(s_ui.result_count[visual_index], count); + + const bool selected = observation_index == clamp_observation_index(s_state.selected_observation); + lv_obj_set_style_bg_color(row, + lv_color_hex(selected ? kColorAmber : kColorPanelBg), + 0); + lv_obj_set_style_border_color(row, + lv_color_hex(selected ? kColorAmberDark : kColorLine), + 0); + lv_obj_set_style_text_color(s_ui.result_primary[visual_index], + lv_color_hex(selected ? kColorText : kColorText), + 0); + lv_obj_set_style_text_color(s_ui.result_secondary[visual_index], + lv_color_hex(selected ? kColorText : kColorTextDim), + 0); + lv_obj_set_style_text_color(s_ui.result_count[visual_index], + lv_color_hex(selected ? kColorText : kColorOk), + 0); + } + + if (s_ui.empty_label) + { + if (s_state.observation_count == 0) + { + lv_obj_clear_flag(s_ui.empty_label, LV_OBJ_FLAG_HIDDEN); + ::ui::i18n::set_label_text(s_ui.empty_label, + s_state.scanning ? "NO VALIDATED PACKETS" : "NO OBSERVED PROFILES"); + } + else + { + lv_obj_add_flag(s_ui.empty_label, LV_OBJ_FLAG_HIDDEN); + } + } +} + +void refresh_status() +{ + if (!s_ui.state_label) { return; } - if (s_state.auto_applied) + char text[48]; + uint32_t color = kColorTextDim; + if (!s_radio.supported_protocol) { - lv_obj_set_style_bg_color(s_ui.btn_auto, lv_color_hex(kColorInfo), 0); - lv_obj_set_style_bg_opa(s_ui.btn_auto, LV_OPA_COVER, 0); - lv_obj_set_style_border_color(s_ui.btn_auto, lv_color_hex(0x1F4E84), 0); - lv_obj_set_style_text_color(s_ui.btn_auto_label, lv_color_white(), 0); + snprintf(text, sizeof(text), "UNSUPPORTED PROTOCOL"); + color = kColorWarning; } - else + else if (s_state.radio_error) { - lv_obj_set_style_bg_color(s_ui.btn_auto, lv_color_hex(kColorPanelBg), 0); - lv_obj_set_style_bg_opa(s_ui.btn_auto, LV_OPA_COVER, 0); - lv_obj_set_style_border_color(s_ui.btn_auto, lv_color_hex(kColorInfo), 0); - lv_obj_set_style_text_color(s_ui.btn_auto_label, lv_color_hex(kColorInfo), 0); + snprintf(text, sizeof(text), "RADIO UNAVAILABLE"); + color = kColorWarning; } -} - -void refresh_page_status() -{ - if (!s_ui.mode_chip || !s_ui.mode_chip_label || !s_ui.cad_chip || !s_ui.cad_chip_label) + else if (s_state.applied) { - return; - } - - lv_obj_set_style_bg_color(s_ui.mode_chip, - lv_color_hex(s_state.scanning ? kColorAmber : 0xD4BE8E), - 0); - lv_obj_set_style_border_color(s_ui.mode_chip, lv_color_hex(kColorAmberDark), 0); - lv_obj_set_style_text_color(s_ui.mode_chip_label, lv_color_hex(kColorText), 0); - ::ui::i18n::set_label_text(s_ui.mode_chip_label, "MODE: RSSI"); - - if (s_radio.use_hw) - { - const bool blink = s_state.scanning && ((sys::millis_now() / 450u) % 2u == 0u); - lv_obj_set_style_bg_color(s_ui.cad_chip, lv_color_hex(blink ? kColorInfo : 0x245B95), 0); - lv_obj_set_style_border_color(s_ui.cad_chip, lv_color_hex(0x1C4B7F), 0); - lv_obj_set_style_text_color(s_ui.cad_chip_label, lv_color_white(), 0); - ::ui::i18n::set_label_text(s_ui.cad_chip_label, "CAD"); + snprintf(text, sizeof(text), "APPLIED TO MESH"); + color = kColorOk; } else if (s_state.scanning) { - lv_obj_set_style_bg_color(s_ui.cad_chip, lv_color_hex(0xD3C8AE), 0); - lv_obj_set_style_border_color(s_ui.cad_chip, lv_color_hex(kColorLine), 0); - lv_obj_set_style_text_color(s_ui.cad_chip_label, lv_color_hex(kColorTextDim), 0); - ::ui::i18n::set_label_text(s_ui.cad_chip_label, "SIM"); + snprintf(text, + sizeof(text), + "LISTENING %d/%d PASS %lu", + s_state.checked_in_pass + 1, + active_candidate_count(), + static_cast(s_state.completed_passes + 1)); + color = kColorInfo; } else { - lv_obj_set_style_bg_color(s_ui.cad_chip, lv_color_hex(0xD6E3D2), 0); - lv_obj_set_style_border_color(s_ui.cad_chip, lv_color_hex(0x7E9A76), 0); - lv_obj_set_style_text_color(s_ui.cad_chip_label, lv_color_hex(kColorOk), 0); - ::ui::i18n::set_label_text(s_ui.cad_chip_label, "MESH"); + snprintf(text, sizeof(text), "READY 1 SF LANE"); + } + lv_label_set_text(s_ui.state_label, text); + lv_obj_set_style_text_color(s_ui.state_label, lv_color_hex(color), 0); + + if (s_ui.progress_label) + { + snprintf(text, + sizeof(text), + "%d/%d PROFILES %d OBSERVED", + s_state.scanning ? s_state.checked_in_pass + 1 : 0, + active_candidate_count(), + s_state.observation_count); + lv_label_set_text(s_ui.progress_label, text); + } + + if (s_ui.stop_label) + { + ::ui::i18n::set_label_text(s_ui.stop_label, s_state.scanning ? "S STOP" : "S START"); } } -void refresh_plot() +void refresh_selected_profile() { - if (!s_ui.plot_area) + const bool has_selection = s_state.observation_count > 0; + if (s_ui.set_button && s_ui.set_label) { - return; + const uint32_t color = has_selection ? kColorAmber : kColorLine; + lv_obj_set_style_bg_color(s_ui.set_button, lv_color_hex(has_selection ? kColorPanelBg : kColorWarmBg), 0); + lv_obj_set_style_border_color(s_ui.set_button, lv_color_hex(color), 0); + lv_obj_set_style_text_color(s_ui.set_label, lv_color_hex(has_selection ? kColorText : kColorTextDim), 0); } - - const int bins = active_bin_count(); - for (int i = 0; i < kMaxBins; ++i) - { - lv_obj_t* bar = s_ui.bars[i]; - if (!bar) - { - continue; - } - - if (i >= bins) - { - lv_obj_add_flag(bar, LV_OBJ_FLAG_HIDDEN); - continue; - } - lv_obj_clear_flag(bar, LV_OBJ_FLAG_HIDDEN); - - const float v = display_value_for_bin(i); - const float view_floor = s_state.view_valid ? s_state.view_floor_dbm : -130.0f; - const float view_ceil = s_state.view_valid ? s_state.view_ceil_dbm : -60.0f; - const float view_span = std::max(1.0f, view_ceil - view_floor); - float t = (v - view_floor) / view_span; - if (t < 0.0f) - { - t = 0.0f; - } - else if (t > 1.0f) - { - t = 1.0f; - } - - const int x0 = (i * s_layout.plot_w) / bins; - const int x1 = ((i + 1) * s_layout.plot_w) / bins; - int w = x1 - x0 - 1; - if (w < 2) - { - w = 2; - } - if (x0 + w > s_layout.plot_w) - { - w = s_layout.plot_w - x0; - } - if (w <= 0) - { - w = 1; - } - - int h = static_cast(std::round(t * static_cast(s_layout.plot_h))); - if (h < 2) - { - h = 2; - } - if (h > s_layout.plot_h) - { - h = s_layout.plot_h; - } - - lv_obj_set_pos(bar, x0, s_layout.plot_h - h); - lv_obj_set_size(bar, w, h); - lv_obj_set_style_bg_color(bar, - lv_color_hex(s_state.hot[i] ? kColorWarn : kColorAmber), - 0); - } - - const int idx = clamp_index(s_state.cursor_index); - const int c0 = (idx * s_layout.plot_w) / bins; - const int c1 = ((idx + 1) * s_layout.plot_w) / bins; - const int cx = (c0 + c1) / 2; - - if (s_ui.cursor_line) - { - lv_obj_set_pos(s_ui.cursor_line, cx - 1, 0); - lv_obj_set_size(s_ui.cursor_line, 2, s_layout.plot_h); - lv_obj_move_foreground(s_ui.cursor_line); - } - if (s_ui.cursor_tip) - { - lv_obj_set_pos(s_ui.cursor_tip, cx - 6, s_layout.plot_h - 14); - lv_obj_move_foreground(s_ui.cursor_tip); - } -} - -void refresh_right_panel_text() -{ - const int cursor = clamp_index(s_state.cursor_index); - const int best = clamp_index(s_state.best_index); - const float cursor_freq = bin_to_freq_mhz(cursor); - const float cursor_rssi = display_value_for_bin(cursor); - const float best_freq = bin_to_freq_mhz(best); - const float best_rssi = display_value_for_bin(best); - const int cleanliness = static_cast(std::lround(std::max(0.0f, s_state.noise_dbm - best_rssi))); - - if (s_ui.cursor_freq) - { - char buf[24]; - snprintf(buf, sizeof(buf), "%.3f", cursor_freq); - lv_label_set_text(s_ui.cursor_freq, buf); - } - - if (s_ui.rssi_label) - { - char buf[32]; - const std::string text = ::ui::i18n::format("RSSI %.0f dBm", cursor_rssi); - snprintf(buf, sizeof(buf), "%s", text.c_str()); - lv_label_set_text(s_ui.rssi_label, buf); - lv_obj_set_style_text_color( - s_ui.rssi_label, - lv_color_hex(s_state.hot[cursor] ? kColorWarn : kColorText), - 0); - } - - if (s_ui.noise_label) - { - char buf[32]; - const std::string text = ::ui::i18n::format("NOISE %.0f dBm", s_state.noise_dbm); - snprintf(buf, sizeof(buf), "%s", text.c_str()); - lv_label_set_text(s_ui.noise_label, buf); - } - - if (s_ui.best_freq) - { - char buf[24]; - snprintf(buf, sizeof(buf), "%.3f", best_freq); - lv_label_set_text(s_ui.best_freq, buf); - } - - if (s_ui.best_snr) - { - char buf[24]; - const std::string text = ::ui::i18n::format("SNR +%d", cleanliness); - snprintf(buf, sizeof(buf), "%s", text.c_str()); - lv_label_set_text(s_ui.best_snr, buf); - } - - if (s_ui.progress_bar) - { - int pct = static_cast(std::lround(s_state.progress * 100.0f)); - if (pct < 0) - { - pct = 0; - } - if (pct > 100) - { - pct = 100; - } - lv_bar_set_value(s_ui.progress_bar, pct, LV_ANIM_OFF); - - if (s_ui.progress_pct) - { - char buf[12]; - snprintf(buf, sizeof(buf), "%d%%", pct); - lv_label_set_text(s_ui.progress_pct, buf); - } - } -} - -void refresh_scale_labels() -{ - if (!s_ui.scale_left || !s_ui.scale_mid || !s_ui.scale_right) - { - return; - } - - const int bins = active_bin_count(); - const float end_freq = bin_to_freq_mhz(bins - 1); - - char left[20]; - char right[20]; - char mid[40]; - - snprintf(left, sizeof(left), "%.3f", s_band.freq_start_mhz); - snprintf(right, sizeof(right), "%.3f", end_freq); - - const float step_khz = s_band.step_mhz * 1000.0f; - const float step_round = std::round(step_khz); - const float bw_round = std::round(s_band.bw_khz); - const bool step_int = std::fabs(step_khz - step_round) < 0.05f; - const bool bw_int = std::fabs(s_band.bw_khz - bw_round) < 0.05f; - - if (step_int && bw_int) - { - const std::string text = - ::ui::i18n::format("STEP %.0fk | BW %.0fk", - static_cast(step_khz), - static_cast(s_band.bw_khz)); - snprintf(mid, sizeof(mid), "%s", text.c_str()); - } - else - { - const std::string text = - ::ui::i18n::format("STEP %.1fk | BW %.1fk", - static_cast(step_khz), - static_cast(s_band.bw_khz)); - snprintf(mid, sizeof(mid), "%s", text.c_str()); - } - - lv_label_set_text(s_ui.scale_left, left); - lv_label_set_text(s_ui.scale_mid, mid); - lv_label_set_text(s_ui.scale_right, right); } void refresh_all_ui() { - refresh_page_status(); ui_update_top_bar_battery(s_ui.top_bar); - refresh_scale_labels(); - refresh_plot(); - refresh_right_panel_text(); - set_scan_button_style(); - set_auto_button_style(); -} - -void on_back_requested(lv_event_t*) -{ - request_exit(); -} - -void top_bar_back_requested(void*) -{ - on_back_requested(nullptr); -} - -void apply_auto_choice() -{ - s_state.auto_applied = true; - s_state.cursor_index = clamp_index(s_state.best_index); - - if (s_radio.use_hw) - { - const float best_freq = bin_to_freq_mhz(s_state.best_index); - platform::ui::lora::configure_receive(best_freq, make_receive_config()); - } -} - -void reset_scan_progress() -{ - s_state.scan_index = 0; - s_state.scanned_bins = 0; - s_state.completed_cycles = 0; - s_state.progress = 0.0f; -} - -bool acquire_radio_runtime(float freq_mhz) -{ - if (s_radio.use_hw) - { - return platform::ui::lora::configure_receive(freq_mhz, make_receive_config()); - } - - if (!platform::ui::lora::acquire() || !platform::ui::lora::is_online()) - { - s_radio.use_hw = false; - return false; - } - - s_radio.use_hw = true; - if (platform::ui::lora::configure_receive(freq_mhz, make_receive_config())) - { - return true; - } - - platform::ui::lora::release(); - s_radio.use_hw = false; - return false; -} - -void release_radio_runtime() -{ - if (!s_radio.use_hw) - { - return; - } - - platform::ui::lora::release(); - s_radio.use_hw = false; -} - -void on_scan_btn_clicked(lv_event_t*) -{ - s_state.auto_applied = false; - if (s_state.scanning) - { - s_state.scanning = false; - release_radio_runtime(); - } - else - { - reset_scan_progress(); - (void)acquire_radio_runtime(s_band.freq_start_mhz); - s_state.scanning = true; - } - refresh_all_ui(); -} - -void on_auto_btn_clicked(lv_event_t*) -{ - apply_auto_choice(); - refresh_all_ui(); -} - -void move_cursor_manual(int delta) -{ - if (s_state.scanning) - { - return; - } - s_state.cursor_index = clamp_index(s_state.cursor_index + delta); - refresh_all_ui(); -} - -void handle_key_common(uint32_t key) -{ - if (key == LV_KEY_BACKSPACE || key == LV_KEY_ESC) - { - on_back_requested(nullptr); - return; - } - if (key == LV_KEY_LEFT) - { - move_cursor_manual(-1); - return; - } - if (key == LV_KEY_RIGHT) - { - move_cursor_manual(1); - return; - } -} - -void root_key_event_cb(lv_event_t* e) -{ - handle_key_common(lv_event_get_key(e)); -} - -void back_btn_key_event_cb(lv_event_t* e) -{ - uint32_t key = lv_event_get_key(e); - if (key == LV_KEY_ENTER) - { - on_back_requested(nullptr); - return; - } - handle_key_common(key); -} - -void scan_btn_key_event_cb(lv_event_t* e) -{ - uint32_t key = lv_event_get_key(e); - if (key == LV_KEY_ENTER) - { - on_scan_btn_clicked(nullptr); - return; - } - handle_key_common(key); -} - -void auto_btn_key_event_cb(lv_event_t* e) -{ - uint32_t key = lv_event_get_key(e); - if (key == LV_KEY_ENTER) - { - on_auto_btn_clicked(nullptr); - return; - } - handle_key_common(key); -} - -void setup_radio_context() -{ - s_radio = {}; - setup_sweep_band_plan(); - - const app::AppConfig& cfg = app::configFacade().readConfig(); - s_radio.bw_khz = s_band.bw_khz; - - if (cfg.mesh_protocol == chat::MeshProtocol::MeshCore) - { - const chat::MeshConfig& mesh = cfg.meshcore_config; - s_radio.sf = (mesh.meshcore_sf >= 5 && mesh.meshcore_sf <= 12) ? mesh.meshcore_sf : 9; - s_radio.cr = (mesh.meshcore_cr >= 5 && mesh.meshcore_cr <= 8) ? mesh.meshcore_cr : 5; - s_radio.tx_power = mesh.tx_power; - } - else - { - const chat::MeshConfig& mesh = cfg.meshtastic_config; - s_radio.sf = (mesh.spread_factor >= 5 && mesh.spread_factor <= 12) ? mesh.spread_factor : 11; - s_radio.cr = (mesh.coding_rate >= 5 && mesh.coding_rate <= 8) ? mesh.coding_rate : 5; - s_radio.tx_power = mesh.tx_power; - } -} - -void teardown_radio_context() -{ - release_radio_runtime(); - s_radio = {}; -} - -void init_sweep_state() -{ - s_state = {}; - const int bins = active_bin_count(); - s_state.scanning = false; - s_state.noise_dbm = -104.0f; - s_state.noise_valid = true; - s_state.view_floor_dbm = -130.0f; - s_state.view_ceil_dbm = -60.0f; - s_state.view_valid = true; - s_state.rand_state ^= static_cast(sys::millis_now()); - s_state.sim_phase = random_unit() * 37.0f; - s_state.cursor_index = bins / 2; - - for (int i = 0; i < kMaxBins; ++i) - { - if (i < bins) - { - const float v = simulated_rssi_for_bin(i); - s_state.rssi[i] = v; - s_state.smooth[i] = v; - } - else - { - s_state.rssi[i] = -200.0f; - s_state.smooth[i] = -200.0f; - } - s_state.hot[i] = 0; - } - s_state.scanned_bins = bins; - s_state.completed_cycles = 1; - s_state.scan_index = 0; - s_state.progress = 0.0f; - recompute_noise_and_hot(bins); - recompute_view_range(bins); - recompute_best(bins); + refresh_status(); + refresh_rows(); + refresh_selected_profile(); } void refresh_timer_cb(lv_timer_t*) @@ -1357,17 +743,408 @@ void refresh_timer_cb(lv_timer_t*) { return; } - process_scan_step(); refresh_all_ui(); } +void restore_page_focus() +{ + if (!::app_g) + { + return; + } + + lv_group_remove_all_objs(::app_g); + if (s_ui.top_bar.back_btn) + { + lv_group_add_obj(::app_g, s_ui.top_bar.back_btn); + } + const int visible_count = std::min( + visible_result_capacity(), + std::max(0, s_state.observation_count - s_state.visible_page_start)); + for (int index = 0; index < visible_count; ++index) + { + if (s_ui.result_rows[index]) + { + lv_group_add_obj(::app_g, s_ui.result_rows[index]); + } + } + if (s_ui.stop_button) + { + lv_group_add_obj(::app_g, s_ui.stop_button); + } + if (s_ui.set_button) + { + lv_group_add_obj(::app_g, s_ui.set_button); + } + if (s_ui.top_bar.back_btn) + { + lv_group_focus_obj(s_ui.top_bar.back_btn); + } + set_default_group(::app_g); + lv_group_set_editing(::app_g, false); +} + +void close_confirmation(); +void control_key_event_cb(lv_event_t* event); + +void on_confirm_cancel_clicked(lv_event_t*) +{ + close_confirmation(); +} + +bool apply_selected_profile() +{ + if (s_state.observation_count <= 0) + { + return false; + } + + const AirProfile profile = + s_state.observations[clamp_observation_index(s_state.selected_observation)].profile; + stop_probe(); + + app::IAppFacade& app_ctx = app::appFacade(); + auto edit = app_ctx.beginConfigEdit(); + if (!edit || edit.config().mesh_protocol != s_radio.protocol) + { + s_state.radio_error = true; + return false; + } + + if (s_radio.protocol == chat::MeshProtocol::Meshtastic) + { + chat::MeshConfig& mesh = edit.config().meshtastic_config; + mesh.use_preset = false; + mesh.bandwidth_khz = profile.bw_khz; + mesh.spread_factor = profile.sf; + mesh.coding_rate = profile.cr; + mesh.override_frequency_mhz = profile.frequency_mhz; + mesh.frequency_offset_mhz = 0.0f; + } + else if (s_radio.protocol == chat::MeshProtocol::MeshCore) + { + chat::MeshConfig& mesh = edit.config().meshcore_config; + mesh.meshcore_region_preset = 0; + mesh.meshcore_freq_mhz = profile.frequency_mhz; + mesh.meshcore_bw_khz = profile.bw_khz; + mesh.meshcore_sf = profile.sf; + mesh.meshcore_cr = profile.cr; + } + else + { + return false; + } + + edit.commit(app::AppConfigChangeSet::mesh()); + app_ctx.applyMeshConfig(); + s_state.applied = true; + s_state.radio_error = false; + return true; +} + +void on_confirm_apply_clicked(lv_event_t*) +{ + close_confirmation(); + (void)apply_selected_profile(); + refresh_all_ui(); +} + +void open_confirmation() +{ + if (s_state.confirmation_open || s_state.observation_count <= 0 || !s_ui.root) + { + return; + } + + s_state.confirmation_open = true; + s_state.confirm_apply_selected = false; + s_ui.confirmation = lv_obj_create(s_ui.root); + lv_obj_set_size(s_ui.confirmation, s_layout.screen_w, s_layout.screen_h); + lv_obj_set_pos(s_ui.confirmation, 0, 0); + lv_obj_set_style_bg_color(s_ui.confirmation, lv_color_hex(0x3A2A1A), 0); + lv_obj_set_style_bg_opa(s_ui.confirmation, LV_OPA_50, 0); + lv_obj_set_style_border_width(s_ui.confirmation, 0, 0); + lv_obj_set_style_radius(s_ui.confirmation, 0, 0); + lv_obj_set_style_pad_all(s_ui.confirmation, 0, 0); + lv_obj_clear_flag(s_ui.confirmation, LV_OBJ_FLAG_SCROLLABLE); + + const lv_coord_t panel_w = s_layout.pager ? 236 : 340; + const lv_coord_t panel_h = s_layout.pager ? 126 : 168; + lv_obj_t* panel = lv_obj_create(s_ui.confirmation); + lv_obj_set_size(panel, panel_w, panel_h); + lv_obj_center(panel); + lv_obj_set_style_bg_color(panel, lv_color_hex(kColorWarmBg), 0); + lv_obj_set_style_bg_opa(panel, LV_OPA_COVER, 0); + lv_obj_set_style_border_width(panel, 2, 0); + lv_obj_set_style_border_color(panel, lv_color_hex(kColorAmberDark), 0); + lv_obj_set_style_radius(panel, 8, 0); + lv_obj_set_style_pad_all(panel, s_layout.pager ? 8 : 14, 0); + lv_obj_clear_flag(panel, LV_OBJ_FLAG_SCROLLABLE); + + lv_obj_t* title = lv_label_create(panel); + ::ui::i18n::set_label_text(title, "APPLY OBSERVED PROFILE?"); + lv_obj_set_style_text_font(title, &lv_font_montserrat_14, 0); + lv_obj_set_style_text_color(title, lv_color_hex(kColorText), 0); + lv_obj_set_pos(title, 8, 8); + + const ProbeObservation& observation = + s_state.observations[clamp_observation_index(s_state.selected_observation)]; + char frequency[32]; + char params[40]; + snprintf(frequency, sizeof(frequency), "%.3f MHz", observation.profile.frequency_mhz); + format_profile_params(observation.profile, params, sizeof(params)); + + lv_obj_t* detail = lv_label_create(panel); + lv_label_set_text(detail, frequency); + lv_obj_set_style_text_font(detail, &lv_font_montserrat_16, 0); + lv_obj_set_style_text_color(detail, lv_color_hex(kColorInfo), 0); + lv_obj_set_pos(detail, 8, 30); + + lv_obj_t* detail_params = lv_label_create(panel); + lv_label_set_text(detail_params, params); + lv_obj_set_style_text_font(detail_params, &lv_font_montserrat_12, 0); + lv_obj_set_style_text_color(detail_params, lv_color_hex(kColorTextDim), 0); + lv_obj_set_pos(detail_params, 8, 50); + + const lv_coord_t button_y = panel_h - (s_layout.pager ? 32 : 46); + const lv_coord_t button_h = s_layout.pager ? 24 : 34; + const lv_coord_t button_w = (panel_w - 24) / 2; + s_ui.confirm_cancel = lv_btn_create(panel); + lv_obj_set_pos(s_ui.confirm_cancel, 8, button_y); + lv_obj_set_size(s_ui.confirm_cancel, button_w, button_h); + lv_obj_set_style_bg_color(s_ui.confirm_cancel, lv_color_hex(kColorPanelBg), 0); + lv_obj_set_style_bg_opa(s_ui.confirm_cancel, LV_OPA_COVER, 0); + lv_obj_set_style_border_width(s_ui.confirm_cancel, 1, 0); + lv_obj_set_style_border_color(s_ui.confirm_cancel, lv_color_hex(kColorLine), 0); + lv_obj_set_style_radius(s_ui.confirm_cancel, 4, 0); + + lv_obj_t* cancel_label = lv_label_create(s_ui.confirm_cancel); + ::ui::i18n::set_label_text(cancel_label, "ESC CANCEL"); + lv_obj_set_style_text_font(cancel_label, &lv_font_montserrat_12, 0); + lv_obj_set_style_text_color(cancel_label, lv_color_hex(kColorText), 0); + lv_obj_center(cancel_label); + lv_obj_add_event_cb(s_ui.confirm_cancel, + on_confirm_cancel_clicked, + LV_EVENT_CLICKED, + nullptr); + lv_obj_add_event_cb(s_ui.confirm_cancel, control_key_event_cb, LV_EVENT_KEY, nullptr); + + s_ui.confirm_apply = lv_btn_create(panel); + lv_obj_set_pos(s_ui.confirm_apply, panel_w - button_w - 8, button_y); + lv_obj_set_size(s_ui.confirm_apply, button_w, button_h); + lv_obj_set_style_bg_color(s_ui.confirm_apply, lv_color_hex(kColorAmber), 0); + lv_obj_set_style_bg_opa(s_ui.confirm_apply, LV_OPA_COVER, 0); + lv_obj_set_style_border_width(s_ui.confirm_apply, 1, 0); + lv_obj_set_style_border_color(s_ui.confirm_apply, lv_color_hex(kColorAmberDark), 0); + lv_obj_set_style_radius(s_ui.confirm_apply, 4, 0); + + lv_obj_t* apply_label = lv_label_create(s_ui.confirm_apply); + ::ui::i18n::set_label_text(apply_label, "ENTER APPLY"); + lv_obj_set_style_text_font(apply_label, &lv_font_montserrat_12, 0); + lv_obj_set_style_text_color(apply_label, lv_color_hex(kColorText), 0); + lv_obj_center(apply_label); + lv_obj_add_event_cb(s_ui.confirm_apply, + on_confirm_apply_clicked, + LV_EVENT_CLICKED, + nullptr); + lv_obj_add_event_cb(s_ui.confirm_apply, control_key_event_cb, LV_EVENT_KEY, nullptr); + + if (::app_g) + { + lv_group_remove_all_objs(::app_g); + lv_group_add_obj(::app_g, s_ui.confirm_cancel); + lv_group_add_obj(::app_g, s_ui.confirm_apply); + lv_group_focus_obj(s_ui.confirm_cancel); + set_default_group(::app_g); + lv_group_set_editing(::app_g, false); + } +} + +void close_confirmation() +{ + if (s_ui.confirmation) + { + lv_obj_del(s_ui.confirmation); + } + s_ui.confirmation = nullptr; + s_ui.confirm_cancel = nullptr; + s_ui.confirm_apply = nullptr; + s_state.confirmation_open = false; + s_state.confirm_apply_selected = false; + restore_page_focus(); +} + +void handle_confirmation_key(uint32_t key) +{ + if (key == LV_KEY_ESC || key == LV_KEY_BACKSPACE) + { + close_confirmation(); + return; + } + if (key == LV_KEY_LEFT || key == LV_KEY_RIGHT) + { + s_state.confirm_apply_selected = !s_state.confirm_apply_selected; + if (::app_g) + { + lv_group_focus_obj(s_state.confirm_apply_selected ? s_ui.confirm_apply + : s_ui.confirm_cancel); + } + return; + } + if (key == LV_KEY_ENTER) + { + const bool should_apply = s_state.confirm_apply_selected; + close_confirmation(); + if (should_apply) + { + (void)apply_selected_profile(); + refresh_all_ui(); + } + } +} + +void select_observation(int index) +{ + if (s_state.observation_count <= 0) + { + return; + } + s_state.selected_observation = clamp_observation_index(index); + const int visible_rows = visible_result_capacity(); + s_state.visible_page_start = + (s_state.selected_observation / visible_rows) * visible_rows; + refresh_all_ui(); +} + +void on_result_row_clicked(lv_event_t* event) +{ + const auto visual_index = + static_cast(reinterpret_cast(lv_event_get_user_data(event))); + select_observation(s_state.visible_page_start + visual_index); +} + +void on_stop_clicked(lv_event_t*) +{ + if (s_state.scanning) + { + stop_probe(); + } + else + { + start_probe(); + } + refresh_all_ui(); +} + +void on_set_clicked(lv_event_t*) +{ + open_confirmation(); +} + +void on_back_requested(lv_event_t*) +{ + if (s_state.confirmation_open) + { + close_confirmation(); + return; + } + request_exit(); +} + +void top_bar_back_requested(void*) +{ + on_back_requested(nullptr); +} + +void handle_key_common(uint32_t key) +{ + if (s_state.confirmation_open) + { + handle_confirmation_key(key); + return; + } + + if (key == LV_KEY_ESC || key == LV_KEY_BACKSPACE) + { + on_back_requested(nullptr); + return; + } + if (key == LV_KEY_UP) + { + select_observation(s_state.selected_observation - 1); + return; + } + if (key == LV_KEY_DOWN) + { + select_observation(s_state.selected_observation + 1); + return; + } + if (key == LV_KEY_ENTER) + { + open_confirmation(); + return; + } + if (key == 's' || key == 'S') + { + on_stop_clicked(nullptr); + } +} + +void root_key_event_cb(lv_event_t* event) +{ + handle_key_common(lv_event_get_key(event)); +} + +void control_key_event_cb(lv_event_t* event) +{ + const uint32_t key = lv_event_get_key(event); + if (key == LV_KEY_ENTER) + { + lv_obj_t* target = static_cast(lv_event_get_target(event)); + if (target == s_ui.top_bar.back_btn) + { + on_back_requested(nullptr); + } + else if (target == s_ui.stop_button) + { + on_stop_clicked(nullptr); + } + else if (target == s_ui.set_button) + { + on_set_clicked(nullptr); + } + else if (target == s_ui.confirm_cancel) + { + on_confirm_cancel_clicked(nullptr); + } + else if (target == s_ui.confirm_apply) + { + on_confirm_apply_clicked(nullptr); + } + else + { + for (int index = 0; index < s_state.observation_count; ++index) + { + if (target == s_ui.result_rows[index]) + { + select_observation(s_state.visible_page_start + index); + open_confirmation(); + return; + } + } + } + return; + } + handle_key_common(key); +} + void build_topbar(lv_obj_t* root) { ::ui::widgets::TopBarConfig config{}; config.height = s_layout.topbar_h; ::ui::widgets::top_bar_init(s_ui.top_bar, root, config); - ::ui::widgets::top_bar_set_title(s_ui.top_bar, ::ui::i18n::tr("SUB-GHz SCAN")); + ::ui::widgets::top_bar_set_title(s_ui.top_bar, ::ui::i18n::tr("PACKET PROBE")); ::ui::widgets::top_bar_set_back_callback(s_ui.top_bar, top_bar_back_requested, nullptr); if (s_ui.top_bar.container) { @@ -1375,283 +1152,181 @@ void build_topbar(lv_obj_t* root) } if (s_ui.top_bar.back_btn) { - lv_obj_add_event_cb(s_ui.top_bar.back_btn, back_btn_key_event_cb, LV_EVENT_KEY, nullptr); + lv_obj_add_event_cb(s_ui.top_bar.back_btn, control_key_event_cb, LV_EVENT_KEY, nullptr); } ui_update_top_bar_battery(s_ui.top_bar); } -void build_left_panel(lv_obj_t* root) +lv_obj_t* create_text(lv_obj_t* parent, + const char* text, + const lv_font_t* font, + uint32_t color, + lv_coord_t x, + lv_coord_t y) { - s_ui.left_panel = lv_obj_create(root); - lv_obj_set_pos(s_ui.left_panel, s_layout.left_panel_x, s_layout.left_panel_y); - lv_obj_set_size(s_ui.left_panel, s_layout.left_panel_w, s_layout.left_panel_h); - lv_obj_set_style_bg_color(s_ui.left_panel, lv_color_hex(kColorPanelBg), 0); - lv_obj_set_style_bg_opa(s_ui.left_panel, LV_OPA_COVER, 0); - lv_obj_set_style_border_width(s_ui.left_panel, 2, 0); - lv_obj_set_style_border_color(s_ui.left_panel, lv_color_hex(kColorLine), 0); - lv_obj_set_style_radius(s_ui.left_panel, 0, 0); - lv_obj_set_style_pad_all(s_ui.left_panel, 0, 0); - lv_obj_clear_flag(s_ui.left_panel, LV_OBJ_FLAG_SCROLLABLE); - - s_ui.mode_chip = lv_obj_create(s_ui.left_panel); - lv_obj_set_pos(s_ui.mode_chip, s_layout.mode_chip_x, s_layout.mode_chip_y); - lv_obj_set_size(s_ui.mode_chip, s_layout.mode_chip_w, s_layout.mode_chip_h); - lv_obj_set_style_bg_color(s_ui.mode_chip, lv_color_hex(kColorAmber), 0); - lv_obj_set_style_bg_opa(s_ui.mode_chip, LV_OPA_COVER, 0); - lv_obj_set_style_border_width(s_ui.mode_chip, 1, 0); - lv_obj_set_style_border_color(s_ui.mode_chip, lv_color_hex(kColorAmberDark), 0); - lv_obj_set_style_radius(s_ui.mode_chip, 4, 0); - lv_obj_set_style_pad_all(s_ui.mode_chip, 0, 0); - lv_obj_clear_flag(s_ui.mode_chip, LV_OBJ_FLAG_SCROLLABLE); - - s_ui.mode_chip_label = lv_label_create(s_ui.mode_chip); - ::ui::i18n::set_label_text(s_ui.mode_chip_label, "MODE: RSSI"); - lv_obj_set_style_text_font(s_ui.mode_chip_label, &lv_font_montserrat_14, 0); - lv_obj_set_style_text_color(s_ui.mode_chip_label, lv_color_hex(kColorText), 0); - lv_obj_center(s_ui.mode_chip_label); - - s_ui.cad_chip = lv_obj_create(s_ui.left_panel); - lv_obj_set_pos(s_ui.cad_chip, s_layout.cad_chip_x, s_layout.cad_chip_y); - lv_obj_set_size(s_ui.cad_chip, s_layout.cad_chip_w, s_layout.cad_chip_h); - lv_obj_set_style_bg_color(s_ui.cad_chip, lv_color_hex(kColorInfo), 0); - lv_obj_set_style_bg_opa(s_ui.cad_chip, LV_OPA_COVER, 0); - lv_obj_set_style_border_width(s_ui.cad_chip, 1, 0); - lv_obj_set_style_border_color(s_ui.cad_chip, lv_color_hex(0x1C4B7F), 0); - lv_obj_set_style_radius(s_ui.cad_chip, 4, 0); - lv_obj_set_style_pad_all(s_ui.cad_chip, 0, 0); - lv_obj_clear_flag(s_ui.cad_chip, LV_OBJ_FLAG_SCROLLABLE); - - s_ui.cad_chip_label = lv_label_create(s_ui.cad_chip); - ::ui::i18n::set_label_text(s_ui.cad_chip_label, "CAD"); - lv_obj_set_style_text_font(s_ui.cad_chip_label, &lv_font_montserrat_14, 0); - lv_obj_set_style_text_color(s_ui.cad_chip_label, lv_color_white(), 0); - lv_obj_center(s_ui.cad_chip_label); - - s_ui.plot_area = lv_obj_create(s_ui.left_panel); - lv_obj_set_pos(s_ui.plot_area, s_layout.plot_x, s_layout.plot_y); - lv_obj_set_size(s_ui.plot_area, s_layout.plot_w, s_layout.plot_h); - lv_obj_set_style_bg_color(s_ui.plot_area, lv_color_hex(0xF2E4C8), 0); - lv_obj_set_style_bg_opa(s_ui.plot_area, LV_OPA_COVER, 0); - lv_obj_set_style_border_width(s_ui.plot_area, 1, 0); - lv_obj_set_style_border_color(s_ui.plot_area, lv_color_hex(kColorLine), 0); - lv_obj_set_style_radius(s_ui.plot_area, 0, 0); - lv_obj_set_style_pad_all(s_ui.plot_area, 0, 0); - lv_obj_clear_flag(s_ui.plot_area, LV_OBJ_FLAG_SCROLLABLE); - - for (int i = 1; i <= 4; ++i) - { - lv_obj_t* grid = lv_obj_create(s_ui.plot_area); - lv_obj_set_pos(grid, 0, (i * s_layout.plot_h) / 5); - lv_obj_set_size(grid, s_layout.plot_w, 1); - lv_obj_set_style_bg_color(grid, lv_color_hex(kColorLine), 0); - lv_obj_set_style_bg_opa(grid, LV_OPA_50, 0); - lv_obj_set_style_border_width(grid, 0, 0); - lv_obj_set_style_radius(grid, 0, 0); - lv_obj_clear_flag(grid, LV_OBJ_FLAG_SCROLLABLE); - } - - for (int i = 0; i < kMaxBins; ++i) - { - lv_obj_t* bar = lv_obj_create(s_ui.plot_area); - lv_obj_set_style_bg_color(bar, lv_color_hex(kColorAmber), 0); - lv_obj_set_style_bg_opa(bar, LV_OPA_COVER, 0); - lv_obj_set_style_border_width(bar, 0, 0); - lv_obj_set_style_radius(bar, 0, 0); - lv_obj_set_style_pad_all(bar, 0, 0); - lv_obj_clear_flag(bar, LV_OBJ_FLAG_SCROLLABLE); - s_ui.bars[i] = bar; - } - - s_ui.cursor_line = lv_obj_create(s_ui.plot_area); - lv_obj_set_size(s_ui.cursor_line, 2, s_layout.plot_h); - lv_obj_set_style_bg_color(s_ui.cursor_line, lv_color_hex(kColorInfo), 0); - lv_obj_set_style_bg_opa(s_ui.cursor_line, LV_OPA_COVER, 0); - lv_obj_set_style_border_width(s_ui.cursor_line, 0, 0); - lv_obj_set_style_radius(s_ui.cursor_line, 0, 0); - lv_obj_clear_flag(s_ui.cursor_line, LV_OBJ_FLAG_SCROLLABLE); - - s_ui.cursor_tip = lv_label_create(s_ui.plot_area); - lv_label_set_text(s_ui.cursor_tip, LV_SYMBOL_DOWN); - lv_obj_set_style_text_font(s_ui.cursor_tip, &lv_font_montserrat_14, 0); - lv_obj_set_style_text_color(s_ui.cursor_tip, lv_color_hex(kColorInfo), 0); - - lv_obj_t* scale_bar = lv_obj_create(s_ui.left_panel); - lv_obj_set_pos(scale_bar, s_layout.scale_x, s_layout.scale_y); - lv_obj_set_size(scale_bar, s_layout.scale_w, s_layout.scale_h); - lv_obj_set_style_bg_opa(scale_bar, LV_OPA_TRANSP, 0); - lv_obj_set_style_border_width(scale_bar, 1, 0); - lv_obj_set_style_border_color(scale_bar, lv_color_hex(kColorLine), 0); - lv_obj_set_style_border_side(scale_bar, LV_BORDER_SIDE_TOP, 0); - lv_obj_set_style_pad_all(scale_bar, 0, 0); - lv_obj_set_style_radius(scale_bar, 0, 0); - lv_obj_clear_flag(scale_bar, LV_OBJ_FLAG_SCROLLABLE); - - s_ui.scale_left = lv_label_create(scale_bar); - lv_label_set_text(s_ui.scale_left, "----"); - lv_obj_set_style_text_font(s_ui.scale_left, &lv_font_montserrat_14, 0); - lv_obj_set_style_text_color(s_ui.scale_left, lv_color_hex(kColorText), 0); - lv_obj_set_pos(s_ui.scale_left, 2, 6); - - s_ui.scale_mid = lv_label_create(scale_bar); - ::ui::i18n::set_label_text(s_ui.scale_mid, "STEP -- | BW --"); - lv_obj_set_style_text_font(s_ui.scale_mid, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s_ui.scale_mid, lv_color_hex(kColorTextDim), 0); - lv_obj_align(s_ui.scale_mid, LV_ALIGN_CENTER, 0, 5); - - s_ui.scale_right = lv_label_create(scale_bar); - lv_label_set_text(s_ui.scale_right, "----"); - lv_obj_set_style_text_font(s_ui.scale_right, &lv_font_montserrat_14, 0); - lv_obj_set_style_text_color(s_ui.scale_right, lv_color_hex(kColorText), 0); - lv_obj_set_style_text_align(s_ui.scale_right, LV_TEXT_ALIGN_RIGHT, 0); - lv_obj_set_width(s_ui.scale_right, 84); - lv_obj_set_pos(s_ui.scale_right, s_layout.scale_w - 86, 6); + lv_obj_t* label = lv_label_create(parent); + ::ui::i18n::set_label_text(label, text); + lv_obj_set_style_text_font(label, font, 0); + lv_obj_set_style_text_color(label, lv_color_hex(color), 0); + lv_obj_set_pos(label, x, y); + return label; } -void build_right_panel(lv_obj_t* root) +void build_work_area(lv_obj_t* root) { - const bool large = s_layout.large_touch; - const lv_coord_t pad = large ? 18 : 8; - const lv_coord_t sep_y = large ? std::min(150, s_layout.right_panel_h / 3) : 76; - const lv_coord_t cursor_title_y = large ? 14 : 2; - const lv_coord_t cursor_freq_y = large ? 40 : 14; - const lv_coord_t unit_x = large ? std::min(150, s_layout.right_panel_w - 54) : 84; - const lv_coord_t unit_y = large ? 48 : 22; - const lv_coord_t rssi_y = large ? 82 : 43; - const lv_coord_t noise_y = large ? 112 : 60; - const lv_coord_t best_title_y = large ? sep_y + 16 : 80; - const lv_coord_t best_freq_y = large ? best_title_y + 30 : 97; - const lv_coord_t best_snr_y = large ? best_freq_y + 32 : 114; - const lv_coord_t progress_y = large ? best_snr_y + 42 : 120; - const lv_coord_t progress_w = large ? std::max(80, s_layout.right_panel_w - (pad * 2) - 54) : 66; - const lv_coord_t progress_pct_x = large ? pad + progress_w + 8 : 78; - const lv_coord_t btn_h = large ? 50 : 28; - const lv_coord_t btn_gap = large ? 14 : 6; - const lv_coord_t btn_y = large ? s_layout.right_panel_h - btn_h - 18 : 134; - const lv_coord_t btn_w = large ? (s_layout.right_panel_w - (pad * 2) - btn_gap) / 2 : 46; + const lv_coord_t work_height = s_layout.work_bottom - s_layout.work_top; + s_ui.content_area = lv_obj_create(root); + lv_obj_set_pos(s_ui.content_area, s_layout.content_x, s_layout.work_top); + lv_obj_set_size(s_ui.content_area, s_layout.content_w, work_height); + lv_obj_set_style_bg_opa(s_ui.content_area, LV_OPA_TRANSP, 0); + lv_obj_set_style_border_width(s_ui.content_area, 0, 0); + lv_obj_set_style_radius(s_ui.content_area, 0, 0); + lv_obj_set_style_pad_all(s_ui.content_area, 0, 0); + lv_obj_clear_flag(s_ui.content_area, LV_OBJ_FLAG_SCROLLABLE); - s_ui.right_panel = lv_obj_create(root); - lv_obj_set_pos(s_ui.right_panel, s_layout.right_panel_x, s_layout.right_panel_y); - lv_obj_set_size(s_ui.right_panel, s_layout.right_panel_w, s_layout.right_panel_h); - lv_obj_set_style_bg_color(s_ui.right_panel, lv_color_hex(kColorPanelBg), 0); - lv_obj_set_style_bg_opa(s_ui.right_panel, LV_OPA_COVER, 0); - lv_obj_set_style_border_width(s_ui.right_panel, 2, 0); - lv_obj_set_style_border_color(s_ui.right_panel, lv_color_hex(kColorLine), 0); - lv_obj_set_style_radius(s_ui.right_panel, 0, 0); - lv_obj_set_style_pad_all(s_ui.right_panel, 0, 0); - lv_obj_clear_flag(s_ui.right_panel, LV_OBJ_FLAG_SCROLLABLE); + s_ui.observed_label = create_text(s_ui.content_area, + "OBSERVED PARAMETERS", + &lv_font_montserrat_14, + kColorText, + 0, + s_layout.pager ? 7 : 12); + s_ui.state_label = create_text(s_ui.content_area, + "READY 1 SF LANE", + &lv_font_montserrat_12, + kColorTextDim, + 0, + s_layout.pager ? 25 : 34); - lv_obj_t* sep1 = lv_obj_create(s_ui.right_panel); - lv_obj_set_pos(sep1, 0, sep_y); - lv_obj_set_size(sep1, s_layout.right_panel_w, 1); - lv_obj_set_style_bg_color(sep1, lv_color_hex(kColorLine), 0); - lv_obj_set_style_bg_opa(sep1, LV_OPA_80, 0); - lv_obj_set_style_border_width(sep1, 0, 0); - lv_obj_set_style_radius(sep1, 0, 0); - lv_obj_clear_flag(sep1, LV_OBJ_FLAG_SCROLLABLE); + const lv_coord_t row_y = s_layout.pager ? 43 : 62; + const lv_coord_t row_h = s_layout.pager ? 24 : 40; + const lv_coord_t row_gap = s_layout.pager ? 3 : 8; + for (int index = 0; index < kMaxObservations; ++index) + { + lv_obj_t* row = lv_btn_create(s_ui.content_area); + lv_obj_set_pos(row, 0, row_y + static_cast(index) * (row_h + row_gap)); + lv_obj_set_size(row, s_layout.content_w, row_h); + lv_obj_set_style_bg_color(row, lv_color_hex(kColorPanelBg), 0); + lv_obj_set_style_bg_opa(row, LV_OPA_COVER, 0); + lv_obj_set_style_border_width(row, 1, 0); + lv_obj_set_style_border_color(row, lv_color_hex(kColorLine), 0); + lv_obj_set_style_radius(row, 4, 0); + lv_obj_set_style_outline_width(row, 0, LV_STATE_FOCUSED); + lv_obj_add_event_cb(row, + on_result_row_clicked, + LV_EVENT_CLICKED, + reinterpret_cast(static_cast(index))); + lv_obj_add_event_cb(row, control_key_event_cb, LV_EVENT_KEY, nullptr); + s_ui.result_rows[index] = row; - lv_obj_t* title_cursor = lv_label_create(s_ui.right_panel); - ::ui::i18n::set_label_text(title_cursor, "CURSOR"); - lv_obj_set_style_text_font(title_cursor, &lv_font_montserrat_14, 0); - lv_obj_set_style_text_color(title_cursor, lv_color_hex(kColorText), 0); - lv_obj_set_pos(title_cursor, pad, cursor_title_y); + s_ui.result_primary[index] = create_text(row, + "---.--- MHz", + &lv_font_montserrat_14, + kColorText, + 6, + s_layout.pager ? 1 : 5); + s_ui.result_secondary[index] = create_text(row, + "BW --- SF-- CR--", + &lv_font_montserrat_12, + kColorTextDim, + s_layout.pager ? 118 : 160, + s_layout.pager ? 4 : 11); + s_ui.result_count[index] = create_text(row, + "x0", + &lv_font_montserrat_12, + kColorOk, + s_layout.content_w - (s_layout.pager ? 31 : 45), + s_layout.pager ? 4 : 11); + lv_obj_add_flag(row, LV_OBJ_FLAG_HIDDEN); + } - s_ui.cursor_freq = lv_label_create(s_ui.right_panel); - lv_label_set_text(s_ui.cursor_freq, "433.550"); - lv_obj_set_style_text_font(s_ui.cursor_freq, &lv_font_montserrat_20, 0); - lv_obj_set_style_text_color(s_ui.cursor_freq, lv_color_hex(kColorText), 0); - lv_obj_set_pos(s_ui.cursor_freq, pad, cursor_freq_y); + s_ui.empty_label = create_text(s_ui.content_area, + "NO OBSERVED PROFILES", + &lv_font_montserrat_12, + kColorTextDim, + 0, + row_y + 7); + s_ui.progress_label = create_text(s_ui.content_area, + "0/70 PROFILES 0 OBSERVED", + &lv_font_montserrat_12, + kColorTextDim, + 0, + work_height - (s_layout.pager ? 18 : 26)); +} - s_ui.cursor_unit = lv_label_create(s_ui.right_panel); - lv_label_set_text(s_ui.cursor_unit, "MHz"); - lv_obj_set_style_text_font(s_ui.cursor_unit, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s_ui.cursor_unit, lv_color_hex(kColorTextDim), 0); - lv_obj_set_pos(s_ui.cursor_unit, unit_x, unit_y); +lv_obj_t* create_bottom_control(lv_obj_t* parent, + lv_coord_t x, + lv_coord_t width, + const char* text, + lv_event_cb_t callback, + lv_obj_t** out_label) +{ + lv_obj_t* button = lv_btn_create(parent); + lv_obj_set_pos(button, x, 2); + lv_obj_set_size(button, width, s_layout.bottom_bar_h - 4); + lv_obj_set_style_bg_color(button, lv_color_hex(kColorPanelBg), 0); + lv_obj_set_style_bg_opa(button, LV_OPA_COVER, 0); + lv_obj_set_style_border_width(button, 1, 0); + lv_obj_set_style_border_color(button, lv_color_hex(kColorLine), 0); + lv_obj_set_style_radius(button, 4, 0); + lv_obj_set_style_outline_width(button, 0, LV_STATE_FOCUSED); + if (callback) + { + lv_obj_add_event_cb(button, callback, LV_EVENT_CLICKED, nullptr); + } + lv_obj_add_event_cb(button, control_key_event_cb, LV_EVENT_KEY, nullptr); - s_ui.rssi_label = lv_label_create(s_ui.right_panel); - ::ui::i18n::set_label_text(s_ui.rssi_label, "RSSI -92 dBm"); - lv_obj_set_style_text_font(s_ui.rssi_label, &lv_font_montserrat_14, 0); - lv_obj_set_style_text_color(s_ui.rssi_label, lv_color_hex(kColorText), 0); - lv_obj_set_pos(s_ui.rssi_label, pad, rssi_y); + lv_obj_t* label = lv_label_create(button); + ::ui::i18n::set_label_text(label, text); + lv_obj_set_style_text_font(label, &lv_font_montserrat_12, 0); + lv_obj_set_style_text_color(label, lv_color_hex(kColorText), 0); + lv_obj_center(label); + if (out_label) + { + *out_label = label; + } + return button; +} - s_ui.noise_label = lv_label_create(s_ui.right_panel); - ::ui::i18n::set_label_text(s_ui.noise_label, "NOISE -104 dBm"); - lv_obj_set_style_text_font(s_ui.noise_label, &lv_font_montserrat_14, 0); - lv_obj_set_style_text_color(s_ui.noise_label, lv_color_hex(kColorTextDim), 0); - lv_obj_set_pos(s_ui.noise_label, pad, noise_y); +void build_bottom_bar(lv_obj_t* root) +{ + s_ui.bottom_bar = lv_obj_create(root); + lv_obj_set_pos(s_ui.bottom_bar, 0, s_layout.work_bottom); + lv_obj_set_size(s_ui.bottom_bar, s_layout.screen_w, s_layout.bottom_bar_h); + lv_obj_set_style_bg_color(s_ui.bottom_bar, lv_color_hex(kColorWarmBg), 0); + lv_obj_set_style_bg_opa(s_ui.bottom_bar, LV_OPA_90, 0); + lv_obj_set_style_border_width(s_ui.bottom_bar, 1, 0); + lv_obj_set_style_border_color(s_ui.bottom_bar, lv_color_hex(kColorLine), 0); + lv_obj_set_style_radius(s_ui.bottom_bar, 0, 0); + lv_obj_set_style_pad_all(s_ui.bottom_bar, 0, 0); + lv_obj_clear_flag(s_ui.bottom_bar, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_t* title_best = lv_label_create(s_ui.right_panel); - ::ui::i18n::set_label_text(title_best, "BEST"); - lv_obj_set_style_text_font(title_best, &lv_font_montserrat_14, 0); - lv_obj_set_style_text_color(title_best, lv_color_hex(kColorText), 0); - lv_obj_set_pos(title_best, pad, best_title_y); - - s_ui.best_freq = lv_label_create(s_ui.right_panel); - lv_label_set_text(s_ui.best_freq, "434.125"); - lv_obj_set_style_text_font(s_ui.best_freq, &lv_font_montserrat_16, 0); - lv_obj_set_style_text_color(s_ui.best_freq, lv_color_hex(kColorOk), 0); - lv_obj_set_pos(s_ui.best_freq, pad, best_freq_y); - - s_ui.best_snr = lv_label_create(s_ui.right_panel); - ::ui::i18n::set_label_text(s_ui.best_snr, "SNR +12"); - lv_obj_set_style_text_font(s_ui.best_snr, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s_ui.best_snr, lv_color_hex(kColorTextDim), 0); - lv_obj_set_pos(s_ui.best_snr, pad, best_snr_y); - - s_ui.progress_bar = lv_bar_create(s_ui.right_panel); - lv_obj_set_pos(s_ui.progress_bar, pad, progress_y); - lv_obj_set_size(s_ui.progress_bar, progress_w, large ? 16 : 12); - lv_bar_set_range(s_ui.progress_bar, 0, 100); - lv_bar_set_value(s_ui.progress_bar, 0, LV_ANIM_OFF); - lv_obj_set_style_bg_color(s_ui.progress_bar, lv_color_hex(kColorPanelBg), LV_PART_MAIN); - lv_obj_set_style_bg_opa(s_ui.progress_bar, LV_OPA_COVER, LV_PART_MAIN); - lv_obj_set_style_border_width(s_ui.progress_bar, 2, LV_PART_MAIN); - lv_obj_set_style_border_color(s_ui.progress_bar, lv_color_hex(kColorLine), LV_PART_MAIN); - lv_obj_set_style_radius(s_ui.progress_bar, 0, LV_PART_MAIN); - lv_obj_set_style_bg_color(s_ui.progress_bar, lv_color_hex(kColorAmberDark), LV_PART_INDICATOR); - lv_obj_set_style_bg_opa(s_ui.progress_bar, LV_OPA_COVER, LV_PART_INDICATOR); - lv_obj_set_style_radius(s_ui.progress_bar, 0, LV_PART_INDICATOR); - - s_ui.progress_pct = lv_label_create(s_ui.right_panel); - lv_label_set_text(s_ui.progress_pct, "0%"); - lv_obj_set_style_text_font(s_ui.progress_pct, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s_ui.progress_pct, lv_color_hex(kColorTextDim), 0); - lv_obj_set_pos(s_ui.progress_pct, progress_pct_x, progress_y - 2); - - s_ui.btn_scan = lv_btn_create(s_ui.right_panel); - lv_obj_set_pos(s_ui.btn_scan, pad, btn_y); - lv_obj_set_size(s_ui.btn_scan, btn_w, btn_h); - lv_obj_set_style_bg_color(s_ui.btn_scan, lv_color_hex(kColorWarn), 0); - lv_obj_set_style_bg_opa(s_ui.btn_scan, LV_OPA_COVER, 0); - lv_obj_set_style_border_width(s_ui.btn_scan, 1, 0); - lv_obj_set_style_border_color(s_ui.btn_scan, lv_color_hex(0x8A2E1C), 0); - lv_obj_set_style_radius(s_ui.btn_scan, 5, 0); - lv_obj_set_style_outline_width(s_ui.btn_scan, 0, LV_STATE_FOCUSED); - lv_obj_add_event_cb(s_ui.btn_scan, on_scan_btn_clicked, LV_EVENT_CLICKED, nullptr); - lv_obj_add_event_cb(s_ui.btn_scan, scan_btn_key_event_cb, LV_EVENT_KEY, nullptr); - - s_ui.btn_scan_label = lv_label_create(s_ui.btn_scan); - ::ui::i18n::set_label_text(s_ui.btn_scan_label, "STOP"); - lv_obj_set_style_text_font(s_ui.btn_scan_label, &lv_font_montserrat_16, 0); - lv_obj_set_style_text_color(s_ui.btn_scan_label, lv_color_white(), 0); - lv_obj_center(s_ui.btn_scan_label); - - s_ui.btn_auto = lv_btn_create(s_ui.right_panel); - lv_obj_set_pos(s_ui.btn_auto, pad + btn_w + btn_gap, btn_y); - lv_obj_set_size(s_ui.btn_auto, btn_w, btn_h); - lv_obj_set_style_bg_color(s_ui.btn_auto, lv_color_hex(kColorPanelBg), 0); - lv_obj_set_style_bg_opa(s_ui.btn_auto, LV_OPA_COVER, 0); - lv_obj_set_style_border_width(s_ui.btn_auto, 1, 0); - lv_obj_set_style_border_color(s_ui.btn_auto, lv_color_hex(kColorInfo), 0); - lv_obj_set_style_radius(s_ui.btn_auto, 5, 0); - lv_obj_set_style_outline_width(s_ui.btn_auto, 0, LV_STATE_FOCUSED); - lv_obj_add_event_cb(s_ui.btn_auto, on_auto_btn_clicked, LV_EVENT_CLICKED, nullptr); - lv_obj_add_event_cb(s_ui.btn_auto, auto_btn_key_event_cb, LV_EVENT_KEY, nullptr); - - s_ui.btn_auto_label = lv_label_create(s_ui.btn_auto); - ::ui::i18n::set_label_text(s_ui.btn_auto_label, "AUTO"); - lv_obj_set_style_text_font(s_ui.btn_auto_label, &lv_font_montserrat_16, 0); - lv_obj_set_style_text_color(s_ui.btn_auto_label, lv_color_hex(kColorInfo), 0); - lv_obj_center(s_ui.btn_auto_label); + const lv_coord_t gap = s_layout.pager ? 4 : 8; + const lv_coord_t available = s_layout.screen_w - (gap * 5); + const lv_coord_t first_width = (available * 30) / 100; + const lv_coord_t action_width = (available - first_width) / 3; + lv_coord_t x = gap; + (void)create_bottom_control(s_ui.bottom_bar, x, first_width, "UP/DN SELECT", nullptr, nullptr); + x += first_width + gap; + s_ui.set_button = create_bottom_control(s_ui.bottom_bar, + x, + action_width, + "ENTER SET", + on_set_clicked, + &s_ui.set_label); + x += action_width + gap; + s_ui.stop_button = create_bottom_control(s_ui.bottom_bar, + x, + action_width, + "S START", + on_stop_clicked, + &s_ui.stop_label); + x += action_width + gap; + (void)create_bottom_control(s_ui.bottom_bar, + x, + action_width, + "ESC BACK", + on_back_requested, + nullptr); } void reset_ui_state() @@ -1686,49 +1361,30 @@ lv_obj_t* ui_energy_sweep_create(lv_obj_t* parent) lv_obj_add_event_cb(s_ui.root, root_key_event_cb, LV_EVENT_KEY, nullptr); build_topbar(s_ui.root); - build_left_panel(s_ui.root); - build_right_panel(s_ui.root); + build_work_area(s_ui.root); + build_bottom_bar(s_ui.root); refresh_all_ui(); - return s_ui.root; } void ui_energy_sweep_enter(lv_obj_t* parent) { - lv_group_t* prev_group = lv_group_get_default(); + lv_group_t* previous_group = lv_group_get_default(); set_default_group(nullptr); + s_state = {}; setup_radio_context(); - init_sweep_state(); ui_energy_sweep_create(parent); - - lv_obj_t* back_btn = s_ui.top_bar.back_btn; - if (::app_g && back_btn) + restore_page_focus(); + if (!::app_g) { - lv_group_remove_all_objs(::app_g); - lv_group_add_obj(::app_g, back_btn); - if (s_ui.btn_scan) - { - lv_group_add_obj(::app_g, s_ui.btn_scan); - } - if (s_ui.btn_auto) - { - lv_group_add_obj(::app_g, s_ui.btn_auto); - } - lv_group_focus_obj(back_btn); - set_default_group(::app_g); - lv_group_set_editing(::app_g, false); - } - else - { - set_default_group(prev_group); + set_default_group(previous_group); } platform::ui::screen::disable_sleep(); - if (!s_refresh_timer) { - s_refresh_timer = lv_timer_create(refresh_timer_cb, kScanIntervalMs, nullptr); + s_refresh_timer = lv_timer_create(refresh_timer_cb, kRefreshIntervalMs, nullptr); } refresh_all_ui(); } @@ -1741,8 +1397,8 @@ void ui_energy_sweep_exit(lv_obj_t* parent) lv_timer_del(s_refresh_timer); s_refresh_timer = nullptr; } - - teardown_radio_context(); + close_confirmation(); + stop_probe(); platform::ui::screen::enable_sleep(); if (s_ui.root) @@ -1750,7 +1406,9 @@ void ui_energy_sweep_exit(lv_obj_t* parent) lv_obj_del(s_ui.root); reset_ui_state(); } - + s_state = {}; + s_radio = {}; + s_band = {}; s_host = nullptr; } diff --git a/modules/ui_shared/src/ui/screens/energy_sweep/energy_sweep_page_shell.cpp b/modules/ui_shared/src/ui/screens/energy_sweep/energy_sweep_page_shell.cpp index 7d35a4ed..8ad5923b 100644 --- a/modules/ui_shared/src/ui/screens/energy_sweep/energy_sweep_page_shell.cpp +++ b/modules/ui_shared/src/ui/screens/energy_sweep/energy_sweep_page_shell.cpp @@ -6,7 +6,7 @@ namespace { -auto s_placeholder_state = ::ui::page_shell_fallback::make_unavailable_state("Energy Sweep", "Energy Sweep is unavailable on this target."); +auto s_placeholder_state = ::ui::page_shell_fallback::make_unavailable_state("Packet Probe", "Packet Probe is unavailable on this target."); } // namespace diff --git a/platform/esp/arduino_common/src/platform_ui_lora_runtime.cpp b/platform/esp/arduino_common/src/platform_ui_lora_runtime.cpp index b2f3f5db..54df1cf9 100644 --- a/platform/esp/arduino_common/src/platform_ui_lora_runtime.cpp +++ b/platform/esp/arduino_common/src/platform_ui_lora_runtime.cpp @@ -2,6 +2,10 @@ #include +#if defined(ARDUINO) +#include +#endif + #include "app/app_facade_access.h" #include "board/LoraBoard.h" #include "platform/esp/arduino_common/exclusive_lora_runtime.h" @@ -17,6 +21,17 @@ using Session = ::platform::esp::arduino_common::exclusive_lora_runtime::Session Session s_session{}; LoraBoard* s_lora = nullptr; +constexpr uint32_t radio_rx_done_mask() +{ +#if defined(ARDUINO_LILYGO_LORA_LR1121) && defined(RADIOLIB_LR11X0_IRQ_RX_DONE) + return RADIOLIB_LR11X0_IRQ_RX_DONE; +#elif defined(RADIOLIB_SX126X_IRQ_RX_DONE) + return RADIOLIB_SX126X_IRQ_RX_DONE; +#else + return 0x0002u; +#endif +} + } // namespace bool is_supported() @@ -64,6 +79,47 @@ float read_instant_rssi() return s_lora ? s_lora->getRadioInstantRSSI() : std::numeric_limits::quiet_NaN(); } +bool poll_received_packet(uint8_t* buffer, std::size_t capacity, ReceivedPacket* out_packet) +{ + if (!s_lora || !buffer || capacity == 0 || !out_packet) + { + return false; + } + + const uint32_t irq = s_lora->getRadioIrqFlags(); + if ((irq & radio_rx_done_mask()) == 0u) + { + if (irq != 0u) + { + s_lora->clearRadioIrqFlags(irq); + (void)s_lora->startRadioReceive(); + } + return false; + } + + const int packet_size = s_lora->getRadioPacketLength(true); + const bool packet_fits = packet_size > 0 && + static_cast(packet_size) <= capacity; + const int read_state = packet_fits + ? s_lora->readRadioData(buffer, static_cast(packet_size)) + : -1; + const float rssi_dbm = packet_fits ? s_lora->getRadioRSSI() : 0.0f; + const float snr_db = packet_fits ? s_lora->getRadioSNR() : 0.0f; + + s_lora->clearRadioIrqFlags(irq); + (void)s_lora->startRadioReceive(); + + if (!packet_fits || read_state != 0) + { + return false; + } + + out_packet->size = static_cast(packet_size); + out_packet->rssi_dbm = rssi_dbm; + out_packet->snr_db = snr_db; + return true; +} + void release() { if (!s_session.lora) diff --git a/platform/esp/idf_common/src/platform_ui_lora_runtime.cpp b/platform/esp/idf_common/src/platform_ui_lora_runtime.cpp index 7af241dd..22bc0abb 100644 --- a/platform/esp/idf_common/src/platform_ui_lora_runtime.cpp +++ b/platform/esp/idf_common/src/platform_ui_lora_runtime.cpp @@ -65,6 +65,47 @@ float read_instant_rssi() return std::isfinite(rssi) ? rssi : std::numeric_limits::quiet_NaN(); } +bool poll_received_packet(uint8_t* buffer, std::size_t capacity, ReceivedPacket* out_packet) +{ + constexpr uint32_t kIrqRxDone = 0x0002u; + if (!buffer || capacity == 0 || !out_packet || !radio().isOnline()) + { + return false; + } + + const uint32_t irq = radio().getIrqFlags(); + if ((irq & kIrqRxDone) == 0u) + { + if (irq != 0u) + { + radio().clearIrqFlags(irq); + (void)radio().startReceive(); + } + return false; + } + + const int packet_size = radio().getPacketLength(true); + const bool packet_fits = packet_size > 0 && + static_cast(packet_size) <= capacity; + const int read_state = packet_fits + ? radio().readPacket(buffer, static_cast(packet_size)) + : -1; + const float rssi_dbm = packet_fits ? radio().readRssi() : 0.0f; + + radio().clearIrqFlags(irq); + (void)radio().startReceive(); + + if (!packet_fits || read_state != 0) + { + return false; + } + + out_packet->size = static_cast(packet_size); + out_packet->rssi_dbm = rssi_dbm; + out_packet->snr_db = std::numeric_limits::quiet_NaN(); + return true; +} + void release() { radio().release(); diff --git a/platform/linux/common/src/platform/ui/lora_runtime.cpp b/platform/linux/common/src/platform/ui/lora_runtime.cpp index d8a215c4..90aa8a4f 100644 --- a/platform/linux/common/src/platform/ui/lora_runtime.cpp +++ b/platform/linux/common/src/platform/ui/lora_runtime.cpp @@ -49,6 +49,7 @@ bool s_real_driver = false; bool s_restore_config_valid = false; ::platform::linux_runtime::Sx126xLoRaConfig s_restore_config{}; std::string s_capability_message{}; +::platform::linux_runtime::Sx126xPacket s_packet_scratch{}; bool env_flag_or_default(const char* name, bool fallback) { @@ -234,6 +235,28 @@ float read_instant_rssi() return current_rssi_locked(); } +bool poll_received_packet(uint8_t* buffer, std::size_t capacity, ReceivedPacket* out_packet) +{ + std::lock_guard lock(s_mutex); + if (!s_acquired || !s_configured || !s_real_driver || !buffer || capacity == 0 || + !out_packet) + { + return false; + } + + if (!::platform::linux_runtime::Sx126xRadio::instance().pollReceive(&s_packet_scratch) || + s_packet_scratch.size == 0 || s_packet_scratch.size > capacity) + { + return false; + } + + std::memcpy(buffer, s_packet_scratch.data.data(), s_packet_scratch.size); + out_packet->size = s_packet_scratch.size; + out_packet->rssi_dbm = s_packet_scratch.rssi_dbm; + out_packet->snr_db = s_packet_scratch.snr_db; + return true; +} + void release() { std::lock_guard lock(s_mutex);