From ef37eef33dd4029097de6be80a9be0e783247c9c Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Sun, 16 Jun 2024 18:22:47 +0200 Subject: [PATCH 01/36] Let's go to v3.0 --- Makefile | 4 ++-- ui/status.c | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index d72c3e12..040095e3 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ # 1 = enable # ---- STOCK QUANSHENG FERATURES ---- -ENABLE_FMRADIO ?= 1 +ENABLE_FMRADIO ?= 0 ENABLE_UART ?= 1 ENABLE_AIRCOPY ?= 0 ENABLE_NOAA ?= 0 @@ -213,7 +213,7 @@ ifeq ($(ENABLE_FEAT_F4HWN),1) VERSION_STRING_1 ?= v0.22 AUTHOR_STRING_2 ?= F4HWN - VERSION_STRING_2 ?= v2.8.1 + VERSION_STRING_2 ?= v3.0 AUTHOR_STRING ?= $(AUTHOR_STRING_1)+$(AUTHOR_STRING_2) VERSION_STRING ?= $(VERSION_STRING_2) diff --git a/ui/status.c b/ui/status.c index 89c9d881..91cd2acf 100644 --- a/ui/status.c +++ b/ui/status.c @@ -212,12 +212,10 @@ void UI_DisplayStatus() { memcpy(line + x + 1, gFontLight, sizeof(gFontLight)); } - /* else if (gChargingWithTypeC) { memcpy(line + x + 1, BITMAP_USB_C, sizeof(BITMAP_USB_C)); } - */ // Battery unsigned int x2 = LCD_WIDTH - sizeof(BITMAP_BatteryLevel1) - 0; From 0235d263264c021f7dc1441a411181e446ac21ac Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Mon, 17 Jun 2024 01:11:39 +0200 Subject: [PATCH 02/36] Remove AM Fix menu --- app/menu.c | 31 +++++++++++++++++++------------ misc.c | 2 +- settings.c | 12 ++++++++---- ui/menu.c | 12 ++++++++---- 4 files changed, 36 insertions(+), 21 deletions(-) diff --git a/app/menu.c b/app/menu.c index ebd6107f..dc700fdc 100644 --- a/app/menu.c +++ b/app/menu.c @@ -225,8 +225,10 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) *pMax = ARRAY_SIZE(gSubMenu_RX_TX) - 1; break; - #ifdef ENABLE_AM_FIX - case MENU_AM_FIX: + #ifndef ENABLE_FEAT_F4HWN + #ifdef ENABLE_AM_FIX + case MENU_AM_FIX: + #endif #endif #ifdef ENABLE_AUDIO_BAR case MENU_MIC_BAR: @@ -748,12 +750,14 @@ void MENU_AcceptSetting(void) gRequestSaveChannel = 1; return; - #ifdef ENABLE_AM_FIX - case MENU_AM_FIX: - gSetting_AM_fix = gSubMenuSelection; - gVfoConfigureMode = VFO_CONFIGURE_RELOAD; - gFlagResetVfos = true; - break; + #ifndef ENABLE_FEAT_F4HWN + #ifdef ENABLE_AM_FIX + case MENU_AM_FIX: + gSetting_AM_fix = gSubMenuSelection; + gVfoConfigureMode = VFO_CONFIGURE_RELOAD; + gFlagResetVfos = true; + break; + #endif #endif #ifdef ENABLE_NOAA @@ -1177,11 +1181,14 @@ void MENU_ShowCurrentSetting(void) gSubMenuSelection = gTxVfo->Modulation; break; -#ifdef ENABLE_AM_FIX - case MENU_AM_FIX: - gSubMenuSelection = gSetting_AM_fix; - break; +#ifndef ENABLE_FEAT_F4HWN + #ifdef ENABLE_AM_FIX + case MENU_AM_FIX: + gSubMenuSelection = gSetting_AM_fix; + break; + #endif #endif + #ifdef ENABLE_NOAA case MENU_NOAA_S: gSubMenuSelection = gEeprom.NOAA_AUTO_SCAN; diff --git a/misc.c b/misc.c index 0c2daf86..70c151ad 100644 --- a/misc.c +++ b/misc.c @@ -101,7 +101,7 @@ bool gSetting_ScrambleEnable; enum BacklightOnRxTx_t gSetting_backlight_on_tx_rx; #ifdef ENABLE_AM_FIX - bool gSetting_AM_fix; + bool gSetting_AM_fix = true; #endif #ifdef ENABLE_FEAT_F4HWN diff --git a/settings.c b/settings.c index d54bcbe0..5c34e75d 100644 --- a/settings.c +++ b/settings.c @@ -257,8 +257,10 @@ void SETTINGS_InitEEPROM(void) #ifdef ENABLE_AUDIO_BAR gSetting_mic_bar = !!(Data[7] & (1u << 4)); #endif - #ifdef ENABLE_AM_FIX - gSetting_AM_fix = !!(Data[7] & (1u << 5)); + #ifndef ENABLE_FEAT_F4HWN + #ifdef ENABLE_AM_FIX + gSetting_AM_fix = !!(Data[7] & (1u << 5)); + #endif #endif gSetting_backlight_on_tx_rx = (Data[7] >> 6) & 3u; @@ -646,8 +648,10 @@ void SETTINGS_SaveSettings(void) #ifdef ENABLE_AUDIO_BAR if (!gSetting_mic_bar) State[7] &= ~(1u << 4); #endif - #ifdef ENABLE_AM_FIX - if (!gSetting_AM_fix) State[7] &= ~(1u << 5); + #ifndef ENABLE_FEAT_F4HWN + #ifdef ENABLE_AM_FIX + if (!gSetting_AM_fix) State[7] &= ~(1u << 5); + #endif #endif State[7] = (State[7] & ~(3u << 6)) | ((gSetting_backlight_on_tx_rx & 3u) << 6); diff --git a/ui/menu.c b/ui/menu.c index 67939924..8a4bd0fd 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -116,8 +116,10 @@ const t_menu_item MenuList[] = {"D List", MENU_D_LIST }, #endif {"D Live", MENU_D_LIVE_DEC }, // live DTMF decoder -#ifdef ENABLE_AM_FIX - {"AM Fix", MENU_AM_FIX }, +#ifndef ENABLE_FEAT_F4HWN + #ifdef ENABLE_AM_FIX + {"AM Fix", MENU_AM_FIX }, + #endif #endif #ifdef ENABLE_VOX {"VOX", MENU_VOX }, @@ -684,8 +686,10 @@ void UI_DisplayMenu(void) strcpy(String, gSubMenu_RX_TX[gSubMenuSelection]); break; - #ifdef ENABLE_AM_FIX - case MENU_AM_FIX: + #ifndef ENABLE_FEAT_F4HWN + #ifdef ENABLE_AM_FIX + case MENU_AM_FIX: + #endif #endif case MENU_BCL: case MENU_BEEP: From 2deff09d47c1ef624c91c2c2a5c0496e20e69122 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Mon, 24 Jun 2024 00:24:47 +0200 Subject: [PATCH 03/36] Add third list --- Makefile | 2 +- app/action.c | 2 +- app/chFrScanner.c | 22 +++++++++++++++++----- app/main.c | 24 +++++++++++++++++++++++- app/menu.c | 27 +++++++++++++++++++++++++-- bitmaps.c | 15 +++++++++++++-- bitmaps.h | 1 + misc.h | 3 ++- radio.c | 41 +++++++++++++++++++++++++++++++++++++++-- radio.h | 1 + settings.c | 6 ++++-- ui/main.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- ui/menu.c | 7 +++++-- ui/menu.h | 2 ++ ui/status.c | 3 +++ 15 files changed, 179 insertions(+), 21 deletions(-) diff --git a/Makefile b/Makefile index 040095e3..7a3a8afe 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ # 1 = enable # ---- STOCK QUANSHENG FERATURES ---- -ENABLE_FMRADIO ?= 0 +ENABLE_FMRADIO ?= 1 ENABLE_UART ?= 1 ENABLE_AIRCOPY ?= 0 ENABLE_NOAA ?= 0 diff --git a/app/action.c b/app/action.c index 59ceaf4f..928e3f4b 100644 --- a/app/action.c +++ b/app/action.c @@ -219,7 +219,7 @@ void ACTION_Scan(bool bRestart) } // channel mode. Keep scanning but toggle between scan lists - gEeprom.SCAN_LIST_DEFAULT = (gEeprom.SCAN_LIST_DEFAULT + 1) % 3; + gEeprom.SCAN_LIST_DEFAULT = (gEeprom.SCAN_LIST_DEFAULT + 1) % 4; // jump to the next channel CHFRSCANNER_Start(false, gScanStateDir); diff --git a/app/chFrScanner.c b/app/chFrScanner.c index 6aba97ca..0d404c76 100644 --- a/app/chFrScanner.c +++ b/app/chFrScanner.c @@ -17,6 +17,7 @@ uint32_t gScanRangeStop; typedef enum { SCAN_NEXT_CHAN_SCANLIST1 = 0, SCAN_NEXT_CHAN_SCANLIST2, + SCAN_NEXT_CHAN_SCANLIST3, SCAN_NEXT_CHAN_DUAL_WATCH, SCAN_NEXT_CHAN_MR, SCAN_NEXT_NUM @@ -194,9 +195,10 @@ static void NextFreqChannel(void) static void NextMemChannel(void) { static unsigned int prev_mr_chan = 0; - const bool enabled = (gEeprom.SCAN_LIST_DEFAULT < 2) ? gEeprom.SCAN_LIST_ENABLED[gEeprom.SCAN_LIST_DEFAULT] : true; - const int chan1 = (gEeprom.SCAN_LIST_DEFAULT < 2) ? gEeprom.SCANLIST_PRIORITY_CH1[gEeprom.SCAN_LIST_DEFAULT] : -1; - const int chan2 = (gEeprom.SCAN_LIST_DEFAULT < 2) ? gEeprom.SCANLIST_PRIORITY_CH2[gEeprom.SCAN_LIST_DEFAULT] : -1; + const bool enabled = (gEeprom.SCAN_LIST_DEFAULT < 3) ? gEeprom.SCAN_LIST_ENABLED[gEeprom.SCAN_LIST_DEFAULT] : true; + const int chan1 = -1; + const int chan2 = -1; + const int chan3 = -1; const unsigned int prev_chan = gNextMrChannel; unsigned int chan = 0; @@ -228,7 +230,17 @@ static void NextMemChannel(void) } } [[fallthrough]]; - + case SCAN_NEXT_CHAN_SCANLIST3: + if (chan3 >= 0) + { + if (RADIO_CheckValidChannel(chan3, false, 0)) + { + currentScanList = SCAN_NEXT_CHAN_SCANLIST3; + gNextMrChannel = chan3; + break; + } + } + [[fallthrough]]; // this bit doesn't yet work if the other VFO is a frequency case SCAN_NEXT_CHAN_DUAL_WATCH: // dual watch is enabled - include the other VFO in the scan @@ -255,7 +267,7 @@ static void NextMemChannel(void) if (!enabled || chan == 0xff) { - chan = RADIO_FindNextChannel(gNextMrChannel + gScanStateDir, gScanStateDir, (gEeprom.SCAN_LIST_DEFAULT < 2) ? true : false, gEeprom.SCAN_LIST_DEFAULT); + chan = RADIO_FindNextChannel(gNextMrChannel + gScanStateDir, gScanStateDir, (gEeprom.SCAN_LIST_DEFAULT < 3) ? true : false, gEeprom.SCAN_LIST_DEFAULT); if (chan == 0xFF) { // no valid channel found chan = MR_CHANNEL_FIRST; diff --git a/app/main.c b/app/main.c index 5e08a1f0..2e9bb38c 100644 --- a/app/main.c +++ b/app/main.c @@ -59,11 +59,32 @@ static void toggle_chan_scanlist(void) return; } + /* if (gTxVfo->SCANLIST1_PARTICIPATION ^ gTxVfo->SCANLIST2_PARTICIPATION){ gTxVfo->SCANLIST2_PARTICIPATION = gTxVfo->SCANLIST1_PARTICIPATION; } else { gTxVfo->SCANLIST1_PARTICIPATION = !gTxVfo->SCANLIST1_PARTICIPATION; } + */ + + if(gTxVfo->SCANLIST1_PARTICIPATION == 1) + { + gTxVfo->SCANLIST1_PARTICIPATION = 0; + gTxVfo->SCANLIST2_PARTICIPATION = 1; + gTxVfo->SCANLIST3_PARTICIPATION = 0; + } + else if(gTxVfo->SCANLIST2_PARTICIPATION == 1) + { + gTxVfo->SCANLIST1_PARTICIPATION = 0; + gTxVfo->SCANLIST2_PARTICIPATION = 0; + gTxVfo->SCANLIST3_PARTICIPATION = 1; + } + else if(gTxVfo->SCANLIST3_PARTICIPATION == 1) + { + gTxVfo->SCANLIST1_PARTICIPATION = 1; + gTxVfo->SCANLIST2_PARTICIPATION = 0; + gTxVfo->SCANLIST3_PARTICIPATION = 0; + } SETTINGS_UpdateChannel(gTxVfo->CHANNEL_SAVE, gTxVfo, true, true, true); @@ -547,12 +568,13 @@ static void MAIN_Key_MENU(bool bKeyPressed, bool bKeyHeld) if (bKeyPressed) { // long press MENU key #ifdef ENABLE_FEAT_F4HWN - if(gScanStateDir != SCAN_OFF && gEeprom.SCAN_LIST_DEFAULT < 2) + if(gScanStateDir != SCAN_OFF && gEeprom.SCAN_LIST_DEFAULT < 3) { if(FUNCTION_IsRx()) { gTxVfo->SCANLIST1_PARTICIPATION = 0; gTxVfo->SCANLIST2_PARTICIPATION = 0; + gTxVfo->SCANLIST3_PARTICIPATION = 0; SETTINGS_UpdateChannel(gTxVfo->CHANNEL_SAVE, gTxVfo, true, true, false); diff --git a/app/menu.c b/app/menu.c index dc700fdc..8bb6823c 100644 --- a/app/menu.c +++ b/app/menu.c @@ -238,6 +238,7 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) case MENU_AUTOLK: case MENU_S_ADD1: case MENU_S_ADD2: + case MENU_S_ADD3: case MENU_STE: case MENU_D_ST: #ifdef ENABLE_DTMF_CALLING @@ -293,6 +294,7 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) case MENU_SLIST1: case MENU_SLIST2: + case MENU_SLIST3: *pMin = -1; *pMax = MR_CHANNEL_LAST; break; @@ -309,7 +311,7 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) case MENU_S_LIST: //*pMin = 0; - *pMax = 2; + *pMax = 3; break; #ifdef ENABLE_DTMF_CALLING @@ -638,6 +640,13 @@ void MENU_AcceptSetting(void) gFlagResetVfos = true; return; + case MENU_S_ADD3: + gTxVfo->SCANLIST3_PARTICIPATION = gSubMenuSelection; + SETTINGS_UpdateChannel(gTxVfo->CHANNEL_SAVE, gTxVfo, true, false, true); + gVfoConfigureMode = VFO_CONFIGURE; + gFlagResetVfos = true; + return; + case MENU_STE: gEeprom.TAIL_TONE_ELIMINATION = gSubMenuSelection; break; @@ -1087,6 +1096,10 @@ void MENU_ShowCurrentSetting(void) gSubMenuSelection = gTxVfo->SCANLIST2_PARTICIPATION; break; + case MENU_S_ADD3: + gSubMenuSelection = gTxVfo->SCANLIST3_PARTICIPATION; + break; + case MENU_STE: gSubMenuSelection = gEeprom.TAIL_TONE_ELIMINATION; break; @@ -1125,6 +1138,10 @@ void MENU_ShowCurrentSetting(void) gSubMenuSelection = RADIO_FindNextChannel(0, 1, true, 1); break; + case MENU_SLIST3: + gSubMenuSelection = RADIO_FindNextChannel(0, 1, true, 2); + break; + #ifdef ENABLE_ALARM case MENU_AL_MOD: gSubMenuSelection = gEeprom.ALARM_MODE; @@ -1804,10 +1821,16 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) bCheckScanList = false; break; + case MENU_SLIST3: + bCheckScanList = true; + VFO = 2; + break; case MENU_SLIST2: + bCheckScanList = true; VFO = 1; - [[fallthrough]]; + break; case MENU_SLIST1: + VFO = 0; bCheckScanList = true; break; diff --git a/bitmaps.c b/bitmaps.c index a84009a6..bbabe3f5 100644 --- a/bitmaps.c +++ b/bitmaps.c @@ -173,7 +173,7 @@ const uint8_t BITMAP_VFO_NotDefault[8] = }; const uint8_t BITMAP_ScanList1[7] = -{ // 'I' symbol +{ // '1' symbol 0b01111111, 0b01111111, 0b01111011, @@ -184,7 +184,7 @@ const uint8_t BITMAP_ScanList1[7] = }; const uint8_t BITMAP_ScanList2[7] = -{ // 'II' symbol +{ // '2' symbol 0b01111111, 0b01111111, 0b01001101, @@ -194,6 +194,17 @@ const uint8_t BITMAP_ScanList2[7] = 0b01111111, }; +const uint8_t BITMAP_ScanList3[7] = +{ // '3' symbol + 0b01111111, + 0b01111111, + 0b01011101, + 0b01010101, + 0b01101011, + 0b01111111, + 0b01111111, +}; + const uint8_t BITMAP_compand[6] = { 0b00000000, diff --git a/bitmaps.h b/bitmaps.h index c8f41810..1e8b569f 100644 --- a/bitmaps.h +++ b/bitmaps.h @@ -33,6 +33,7 @@ extern const uint8_t BITMAP_VFO_Default[8]; extern const uint8_t BITMAP_VFO_NotDefault[8]; extern const uint8_t BITMAP_ScanList1[7]; extern const uint8_t BITMAP_ScanList2[7]; +extern const uint8_t BITMAP_ScanList3[7]; extern const uint8_t BITMAP_compand[6]; #ifndef ENABLE_CUSTOM_MENU_LAYOUT diff --git a/misc.h b/misc.h index 5d128cb9..135c9ead 100644 --- a/misc.h +++ b/misc.h @@ -195,8 +195,9 @@ extern uint16_t gEEPROM_1F8C; typedef union { struct { uint8_t - band : 4, + band : 3, compander : 2, + scanlist3 : 1, scanlist2 : 1, scanlist1 : 1; }; diff --git a/radio.c b/radio.c index a4c45f87..abf01529 100644 --- a/radio.c +++ b/radio.c @@ -36,6 +36,7 @@ #include "radio.h" #include "settings.h" #include "ui/menu.h" +#include "debugging.h" VFO_Info_t *gTxVfo; VFO_Info_t *gRxVfo; @@ -58,6 +59,11 @@ const char gModulationStr[MODULATION_UKNOWN][4] = { bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanList) { + + //char str[64] = ""; + //sprintf(str, "RADIO_CheckValidChannel channel %d / checkScanList %d / scanList %d\n", channel, checkScanList, scanList); + //LogUart(str); + // return true if the channel appears valid if (!IS_MR_CHANNEL(channel)) return false; @@ -67,11 +73,30 @@ bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanL if (att.band > BAND7_470MHz) return false; - if (!checkScanList || scanList > 1) + if (!checkScanList || scanList > 2) return true; - if (scanList ? !att.scanlist2 : !att.scanlist1) + //sprintf(str, "scanList %d / att.scanlist1 %d / att.scanlist2 %d / att.scanlist3 %d\n", scanList, att.scanlist1, att.scanlist2, att.scanlist3); + //LogUart(str); + + + if(scanList == 0 && att.scanlist1 != 1) + { return false; + } + else if(scanList == 1 && att.scanlist2 != 1) + { + return false; + } + else if(scanList == 2 && att.scanlist3 != 1) + { + return false; + } + + //sprintf(str, ">>> %d\n", scanList); + //LogUart(str); + + return true; const uint8_t PriorityCh1 = gEeprom.SCANLIST_PRIORITY_CH1[scanList]; const uint8_t PriorityCh2 = gEeprom.SCANLIST_PRIORITY_CH2[scanList]; @@ -81,6 +106,10 @@ bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanL uint8_t RADIO_FindNextChannel(uint8_t Channel, int8_t Direction, bool bCheckScanList, uint8_t VFO) { + //char str[64] = ""; + //sprintf(str, "RADIO_FindNextChannel Channel %d / VFO %d\n", Channel, VFO); + //LogUart(str); + for (unsigned int i = 0; IS_MR_CHANNEL(i); i++, Channel += Direction) { if (Channel == 0xFF) { Channel = MR_CHANNEL_LAST; @@ -91,6 +120,8 @@ uint8_t RADIO_FindNextChannel(uint8_t Channel, int8_t Direction, bool bCheckScan if (RADIO_CheckValidChannel(Channel, bCheckScanList, VFO)) { return Channel; } + //sprintf(str, "VFO %d...\n", VFO); + //LogUart(str); } return 0xFF; @@ -103,6 +134,7 @@ void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t pInfo->Band = FREQUENCY_GetBand(Frequency); pInfo->SCANLIST1_PARTICIPATION = false; pInfo->SCANLIST2_PARTICIPATION = false; + pInfo->SCANLIST3_PARTICIPATION = false; pInfo->STEP_SETTING = STEP_12_5kHz; pInfo->StepFrequency = gStepFrequencyTable[pInfo->STEP_SETTING]; pInfo->CHANNEL_SAVE = ChannelSave; @@ -186,19 +218,24 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure bool bParticipation1; bool bParticipation2; + bool bParticipation3; + if (IS_MR_CHANNEL(channel)) { bParticipation1 = att.scanlist1; bParticipation2 = att.scanlist2; + bParticipation3 = att.scanlist3; } else { band = channel - FREQ_CHANNEL_FIRST; bParticipation1 = true; bParticipation2 = true; + bParticipation3 = true; } pVfo->Band = band; pVfo->SCANLIST1_PARTICIPATION = bParticipation1; pVfo->SCANLIST2_PARTICIPATION = bParticipation2; + pVfo->SCANLIST3_PARTICIPATION = bParticipation3; pVfo->CHANNEL_SAVE = channel; uint16_t base; diff --git a/radio.h b/radio.h index 1e1d94e7..12e6594e 100644 --- a/radio.h +++ b/radio.h @@ -116,6 +116,7 @@ typedef struct VFO_Info_t uint8_t SCANLIST1_PARTICIPATION; uint8_t SCANLIST2_PARTICIPATION; + uint8_t SCANLIST3_PARTICIPATION; uint8_t Band; #ifdef ENABLE_DTMF_CALLING diff --git a/settings.c b/settings.c index 5c34e75d..9bb6ec4f 100644 --- a/settings.c +++ b/settings.c @@ -276,7 +276,7 @@ void SETTINGS_InitEEPROM(void) ChannelAttributes_t *att = &gMR_ChannelAttributes[i]; if(att->__val == 0xff){ att->__val = 0; - att->band = 0xf; + att->band = 0x7; } } @@ -770,10 +770,11 @@ void SETTINGS_UpdateChannel(uint8_t channel, const VFO_Info_t *pVFO, bool keep, { uint8_t state[8]; ChannelAttributes_t att = { - .band = 0xf, + .band = 0x7, .compander = 0, .scanlist1 = 0, .scanlist2 = 0, + .scanlist3 = 0, }; // default attributes uint16_t offset = 0x0D60 + (channel & ~7u); @@ -783,6 +784,7 @@ void SETTINGS_UpdateChannel(uint8_t channel, const VFO_Info_t *pVFO, bool keep, att.band = pVFO->Band; att.scanlist1 = pVFO->SCANLIST1_PARTICIPATION; att.scanlist2 = pVFO->SCANLIST2_PARTICIPATION; + att.scanlist3 = pVFO->SCANLIST3_PARTICIPATION; att.compander = pVFO->Compander; if (check && state[channel & 7u] == att.__val) return; // no change in the attributes diff --git a/ui/main.c b/ui/main.c index 1d4dd02d..81388c17 100644 --- a/ui/main.c +++ b/ui/main.c @@ -892,12 +892,44 @@ void UI_DisplayMain(void) if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) { // it's a channel + uint8_t countList = 0; + uint8_t shiftList = 0; + // show the scan list assigment symbols const ChannelAttributes_t att = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]]; + if (att.scanlist1) - memcpy(p_line0 + 113, BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); + countList++; if (att.scanlist2) - memcpy(p_line0 + 120, BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); + countList++; + if (att.scanlist3) + countList++; + + shiftList = countList; + + if (att.scanlist1) + { + memcpy(p_line0 + 128 - (shiftList * 7), BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); + shiftList--; + } + if (att.scanlist2) + { + memcpy(p_line0 + 128 - (shiftList * 7), BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); + shiftList--; + } + if (att.scanlist3) + { + memcpy(p_line0 + 128 - (shiftList * 7), BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); + } + + /* + if (att.scanlist1) + memcpy(p_line0 + 107, BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); + if (att.scanlist2) + memcpy(p_line0 + 114, BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); + if (att.scanlist3) + memcpy(p_line0 + 121, BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); + */ // compander symbol #ifndef ENABLE_BIG_FREQ @@ -941,6 +973,14 @@ void UI_DisplayMain(void) { // no channel name, show the channel number instead sprintf(String, "CH-%03u", gEeprom.ScreenChannel[vfo_num] + 1); } + else + { + // Too many list, so remove last character name + if(String[9] != 0 && countList == 3) + { + String[9] = 0; + } + } if (gEeprom.CHANNEL_DISPLAY_MODE == MDF_NAME) { UI_PrintString(String, 32, 0, line, 8); diff --git a/ui/menu.c b/ui/menu.c index 8a4bd0fd..9d9386c4 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -57,6 +57,7 @@ const t_menu_item MenuList[] = {"Mode", MENU_AM }, // was "AM" {"ScAdd1", MENU_S_ADD1 }, {"ScAdd2", MENU_S_ADD2 }, + {"ScAdd3", MENU_S_ADD3 }, {"ChSave", MENU_MEM_CH }, // was "MEM-CH" {"ChDele", MENU_DEL_CH }, // was "DEL-CH" {"ChName", MENU_MEM_NAME }, @@ -64,6 +65,7 @@ const t_menu_item MenuList[] = {"SList", MENU_S_LIST }, {"SList1", MENU_SLIST1 }, {"SList2", MENU_SLIST2 }, + {"SList3", MENU_SLIST3 }, {"ScnRev", MENU_SC_REV }, #ifdef ENABLE_NOAA {"NOAA-S", MENU_NOAA_S }, @@ -695,6 +697,7 @@ void UI_DisplayMenu(void) case MENU_BEEP: case MENU_S_ADD1: case MENU_S_ADD2: + case MENU_S_ADD3: case MENU_STE: case MENU_D_ST: #ifdef ENABLE_DTMF_CALLING @@ -805,7 +808,7 @@ void UI_DisplayMenu(void) break; case MENU_S_LIST: - if (gSubMenuSelection < 2) + if (gSubMenuSelection < 3) sprintf(String, "LIST%u", 1 + gSubMenuSelection); else strcpy(String, "ALL"); @@ -1021,7 +1024,7 @@ void UI_DisplayMenu(void) } } - if (UI_MENU_GetCurrentMenuId() == MENU_SLIST1 || UI_MENU_GetCurrentMenuId() == MENU_SLIST2) + if (UI_MENU_GetCurrentMenuId() == MENU_SLIST1 || UI_MENU_GetCurrentMenuId() == MENU_SLIST2 || UI_MENU_GetCurrentMenuId() == MENU_SLIST3) { i = (UI_MENU_GetCurrentMenuId() == MENU_SLIST1) ? 0 : 1; char *pPrintStr = String; diff --git a/ui/menu.h b/ui/menu.h index 902c9e44..5559dcbf 100644 --- a/ui/menu.h +++ b/ui/menu.h @@ -66,6 +66,7 @@ enum MENU_AUTOLK, MENU_S_ADD1, MENU_S_ADD2, + MENU_S_ADD3, MENU_STE, MENU_RP_STE, MENU_MIC, @@ -77,6 +78,7 @@ enum MENU_S_LIST, MENU_SLIST1, MENU_SLIST2, + MENU_SLIST3, #ifdef ENABLE_ALARM MENU_AL_MOD, #endif diff --git a/ui/status.c b/ui/status.c index 91cd2acf..aac7ca6c 100644 --- a/ui/status.c +++ b/ui/status.c @@ -102,6 +102,9 @@ void UI_DisplayStatus() memcpy(line + x + 2, BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); break; case 2: + memcpy(line + x + 2, BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); + break; + case 3: memcpy(line + x, gFontScanAll, sizeof(gFontScanAll)); break; } From d356541788c590208640dc7e08320b67f24061fc Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Mon, 24 Jun 2024 00:26:19 +0200 Subject: [PATCH 04/36] Reduce UART Version length --- version.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.c b/version.c index 4cff3abe..30cf86ab 100644 --- a/version.c +++ b/version.c @@ -13,4 +13,4 @@ const char Version[] = AUTHOR_STRING VER; #endif -const char UART_Version[] = "UV-K5 Firmware, Open Edition, " AUTHOR_STRING VER "\r\n"; +const char UART_Version[] = "UV-K5 Firmware, " AUTHOR_STRING VER "\r\n"; From ee59118fce6ff832347a61fddcc2bfe382191330 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Mon, 24 Jun 2024 05:41:21 +0200 Subject: [PATCH 05/36] Add Not In List and All In List --- Makefile | 2 +- app/action.c | 2 +- app/chFrScanner.c | 4 ++-- app/main.c | 2 +- app/menu.c | 2 +- bitmaps.c | 56 ++++++++++++++++++++++++++++++++++++----------- bitmaps.h | 4 +++- radio.c | 10 ++++++++- settings.c | 4 ++-- ui/menu.c | 6 ++++- ui/status.c | 8 ++++++- 11 files changed, 75 insertions(+), 25 deletions(-) diff --git a/Makefile b/Makefile index 7a3a8afe..040095e3 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ # 1 = enable # ---- STOCK QUANSHENG FERATURES ---- -ENABLE_FMRADIO ?= 1 +ENABLE_FMRADIO ?= 0 ENABLE_UART ?= 1 ENABLE_AIRCOPY ?= 0 ENABLE_NOAA ?= 0 diff --git a/app/action.c b/app/action.c index 928e3f4b..5edad842 100644 --- a/app/action.c +++ b/app/action.c @@ -219,7 +219,7 @@ void ACTION_Scan(bool bRestart) } // channel mode. Keep scanning but toggle between scan lists - gEeprom.SCAN_LIST_DEFAULT = (gEeprom.SCAN_LIST_DEFAULT + 1) % 4; + gEeprom.SCAN_LIST_DEFAULT = (gEeprom.SCAN_LIST_DEFAULT + 1) % 6; // jump to the next channel CHFRSCANNER_Start(false, gScanStateDir); diff --git a/app/chFrScanner.c b/app/chFrScanner.c index 0d404c76..c18168a3 100644 --- a/app/chFrScanner.c +++ b/app/chFrScanner.c @@ -195,7 +195,7 @@ static void NextFreqChannel(void) static void NextMemChannel(void) { static unsigned int prev_mr_chan = 0; - const bool enabled = (gEeprom.SCAN_LIST_DEFAULT < 3) ? gEeprom.SCAN_LIST_ENABLED[gEeprom.SCAN_LIST_DEFAULT] : true; + const bool enabled = (gEeprom.SCAN_LIST_DEFAULT < 5) ? gEeprom.SCAN_LIST_ENABLED[gEeprom.SCAN_LIST_DEFAULT] : true; const int chan1 = -1; const int chan2 = -1; const int chan3 = -1; @@ -267,7 +267,7 @@ static void NextMemChannel(void) if (!enabled || chan == 0xff) { - chan = RADIO_FindNextChannel(gNextMrChannel + gScanStateDir, gScanStateDir, (gEeprom.SCAN_LIST_DEFAULT < 3) ? true : false, gEeprom.SCAN_LIST_DEFAULT); + chan = RADIO_FindNextChannel(gNextMrChannel + gScanStateDir, gScanStateDir, (gEeprom.SCAN_LIST_DEFAULT < 5) ? true : false, gEeprom.SCAN_LIST_DEFAULT); if (chan == 0xFF) { // no valid channel found chan = MR_CHANNEL_FIRST; diff --git a/app/main.c b/app/main.c index 2e9bb38c..630300f6 100644 --- a/app/main.c +++ b/app/main.c @@ -568,7 +568,7 @@ static void MAIN_Key_MENU(bool bKeyPressed, bool bKeyHeld) if (bKeyPressed) { // long press MENU key #ifdef ENABLE_FEAT_F4HWN - if(gScanStateDir != SCAN_OFF && gEeprom.SCAN_LIST_DEFAULT < 3) + if(gScanStateDir != SCAN_OFF && gEeprom.SCAN_LIST_DEFAULT < 5) { if(FUNCTION_IsRx()) { diff --git a/app/menu.c b/app/menu.c index 8bb6823c..f3d44f5e 100644 --- a/app/menu.c +++ b/app/menu.c @@ -311,7 +311,7 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) case MENU_S_LIST: //*pMin = 0; - *pMax = 3; + *pMax = 5; break; #ifdef ENABLE_DTMF_CALLING diff --git a/bitmaps.c b/bitmaps.c index bbabe3f5..4d8f034b 100644 --- a/bitmaps.c +++ b/bitmaps.c @@ -38,19 +38,6 @@ const uint8_t gFontKeyLock[1][9] = {0x7c, 0x46, 0x45, 0x45, 0x45, 0x45, 0x45, 0x46, 0x7c} }; -const uint8_t gFontScanAll[9] = -{ - 0b00111110, - 0b01000001, - 0b01000001, - 0b00100010, - 0b00011100, - 0b00100010, - 0b01000001, - 0b01000001, - 0b00111110 -}; - const uint8_t gFontLight[9] = { 0b00001100, @@ -205,6 +192,49 @@ const uint8_t BITMAP_ScanList3[7] = 0b01111111, }; +const uint8_t BITMAP_ScanList4[7] = +{ // '0' symbol + 0b01111111, + 0b01111111, + 0b01000011, + 0b01011101, + 0b01100001, + 0b01111111, + 0b01111111, +}; + +const uint8_t BITMAP_ScanList5[11] = +{ + // 'All List' symbol + 0b11111111, + 0b11000011, + 0b10111101, + 0b10111101, + 0b11011011, + 0b11100111, + 0b11011011, + 0b10111101, + 0b10111101, + 0b11000011, + 0b11111111 +}; + +const uint8_t BITMAP_ScanList6[11] = +{ + // 'All' symbol + 0b00000000, + 0b00111100, + 0b01000010, + 0b01000010, + 0b00100100, + 0b00011000, + 0b00100100, + 0b01000010, + 0b01000010, + 0b00111100, + 0b00000000 +}; + const uint8_t BITMAP_compand[6] = { 0b00000000, diff --git a/bitmaps.h b/bitmaps.h index 1e8b569f..b62ec543 100644 --- a/bitmaps.h +++ b/bitmaps.h @@ -11,7 +11,6 @@ extern const uint8_t gFontF[1][8]; extern const uint8_t gFontS[1][6]; extern const uint8_t gFontKeyLock[1][9]; -extern const uint8_t gFontScanAll[9]; extern const uint8_t gFontLight[9]; extern const uint8_t gFontXB[2][6]; @@ -34,6 +33,9 @@ extern const uint8_t BITMAP_VFO_NotDefault[8]; extern const uint8_t BITMAP_ScanList1[7]; extern const uint8_t BITMAP_ScanList2[7]; extern const uint8_t BITMAP_ScanList3[7]; +extern const uint8_t BITMAP_ScanList4[7]; +extern const uint8_t BITMAP_ScanList5[11]; +extern const uint8_t BITMAP_ScanList6[11]; extern const uint8_t BITMAP_compand[6]; #ifndef ENABLE_CUSTOM_MENU_LAYOUT diff --git a/radio.c b/radio.c index abf01529..fa3515e8 100644 --- a/radio.c +++ b/radio.c @@ -73,7 +73,7 @@ bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanL if (att.band > BAND7_470MHz) return false; - if (!checkScanList || scanList > 2) + if (!checkScanList || scanList > 4) return true; //sprintf(str, "scanList %d / att.scanlist1 %d / att.scanlist2 %d / att.scanlist3 %d\n", scanList, att.scanlist1, att.scanlist2, att.scanlist3); @@ -92,6 +92,14 @@ bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanL { return false; } + else if(scanList == 3 && (att.scanlist1 == 1 || att.scanlist2 == 1 || att.scanlist3 == 1)) + { + return false; + } + else if(scanList == 4 && (att.scanlist1 == 0 && att.scanlist2 == 0 && att.scanlist3 == 0)) + { + return false; + } //sprintf(str, ">>> %d\n", scanList); //LogUart(str); diff --git a/settings.c b/settings.c index 9bb6ec4f..1359ad20 100644 --- a/settings.c +++ b/settings.c @@ -225,11 +225,11 @@ void SETTINGS_InitEEPROM(void) // 0F18..0F1F EEPROM_ReadBuffer(0x0F18, Data, 8); - gEeprom.SCAN_LIST_DEFAULT = (Data[0] < 3) ? Data[0] : 0; // we now have 'all' channel scan option + gEeprom.SCAN_LIST_DEFAULT = (Data[0] < 5) ? Data[0] : 0; // we now have 'all' channel scan option for (unsigned int i = 0; i < 2; i++) { const unsigned int j = 1 + (i * 3); - gEeprom.SCAN_LIST_ENABLED[i] = (Data[j + 0] < 2) ? Data[j] : false; + gEeprom.SCAN_LIST_ENABLED[i] = (Data[j + 0] < 5) ? Data[j] : false; gEeprom.SCANLIST_PRIORITY_CH1[i] = Data[j + 1]; gEeprom.SCANLIST_PRIORITY_CH2[i] = Data[j + 2]; } diff --git a/ui/menu.c b/ui/menu.c index 9d9386c4..1bbb450b 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -810,7 +810,11 @@ void UI_DisplayMenu(void) case MENU_S_LIST: if (gSubMenuSelection < 3) sprintf(String, "LIST%u", 1 + gSubMenuSelection); - else + else if (gSubMenuSelection == 3) + strcpy(String, "NOT\nIN LISTS"); + else if (gSubMenuSelection == 4) + strcpy(String, "ALL\nIN LISTS"); + else if (gSubMenuSelection == 5) strcpy(String, "ALL"); break; diff --git a/ui/status.c b/ui/status.c index aac7ca6c..90ca90e8 100644 --- a/ui/status.c +++ b/ui/status.c @@ -105,7 +105,13 @@ void UI_DisplayStatus() memcpy(line + x + 2, BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); break; case 3: - memcpy(line + x, gFontScanAll, sizeof(gFontScanAll)); + memcpy(line + x + 2, BITMAP_ScanList4, sizeof(BITMAP_ScanList4)); + break; + case 4: + memcpy(line + x, BITMAP_ScanList5, sizeof(BITMAP_ScanList5)); + break; + case 5: + memcpy(line + x, BITMAP_ScanList6, sizeof(BITMAP_ScanList6)); break; } } From 9f425bf085d41553a13f15caa9247c049caa148f Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Mon, 24 Jun 2024 19:32:50 +0200 Subject: [PATCH 06/36] Fix bitmap --- bitmaps.c | 8 ++------ bitmaps.h | 4 ++-- ui/main.c | 5 +++++ ui/status.c | 4 ++-- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/bitmaps.c b/bitmaps.c index 4d8f034b..2aedc331 100644 --- a/bitmaps.c +++ b/bitmaps.c @@ -203,34 +203,30 @@ const uint8_t BITMAP_ScanList4[7] = 0b01111111, }; -const uint8_t BITMAP_ScanList5[11] = +const uint8_t BITMAP_ScanList5[9] = { // 'All List' symbol 0b11111111, 0b11000011, 0b10111101, - 0b10111101, 0b11011011, 0b11100111, 0b11011011, 0b10111101, - 0b10111101, 0b11000011, 0b11111111 }; -const uint8_t BITMAP_ScanList6[11] = +const uint8_t BITMAP_ScanList6[9] = { // 'All' symbol 0b00000000, 0b00111100, 0b01000010, - 0b01000010, 0b00100100, 0b00011000, 0b00100100, 0b01000010, - 0b01000010, 0b00111100, 0b00000000 }; diff --git a/bitmaps.h b/bitmaps.h index b62ec543..b7df2819 100644 --- a/bitmaps.h +++ b/bitmaps.h @@ -34,8 +34,8 @@ extern const uint8_t BITMAP_ScanList1[7]; extern const uint8_t BITMAP_ScanList2[7]; extern const uint8_t BITMAP_ScanList3[7]; extern const uint8_t BITMAP_ScanList4[7]; -extern const uint8_t BITMAP_ScanList5[11]; -extern const uint8_t BITMAP_ScanList6[11]; +extern const uint8_t BITMAP_ScanList5[9]; +extern const uint8_t BITMAP_ScanList6[9]; extern const uint8_t BITMAP_compand[6]; #ifndef ENABLE_CUSTOM_MENU_LAYOUT diff --git a/ui/main.c b/ui/main.c index 81388c17..bda93f91 100644 --- a/ui/main.c +++ b/ui/main.c @@ -922,6 +922,11 @@ void UI_DisplayMain(void) memcpy(p_line0 + 128 - (shiftList * 7), BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); } + if(countList == 0) + { + memcpy(p_line0 + 128 - (1 * 7), BITMAP_ScanList4, sizeof(BITMAP_ScanList4)); + } + /* if (att.scanlist1) memcpy(p_line0 + 107, BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); diff --git a/ui/status.c b/ui/status.c index 90ca90e8..35be7186 100644 --- a/ui/status.c +++ b/ui/status.c @@ -108,10 +108,10 @@ void UI_DisplayStatus() memcpy(line + x + 2, BITMAP_ScanList4, sizeof(BITMAP_ScanList4)); break; case 4: - memcpy(line + x, BITMAP_ScanList5, sizeof(BITMAP_ScanList5)); + memcpy(line + x + 1, BITMAP_ScanList5, sizeof(BITMAP_ScanList5)); break; case 5: - memcpy(line + x, BITMAP_ScanList6, sizeof(BITMAP_ScanList6)); + memcpy(line + x + 1, BITMAP_ScanList6, sizeof(BITMAP_ScanList6)); break; } } From acd7a6141bf909046b0c876781608803f33e9dc1 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Tue, 25 Jun 2024 00:24:46 +0200 Subject: [PATCH 07/36] Fix bitmap --- bitmaps.c | 40 +++++++++++++++++++++------------------- bitmaps.h | 2 +- ui/status.c | 2 +- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/bitmaps.c b/bitmaps.c index 2aedc331..92b6eeeb 100644 --- a/bitmaps.c +++ b/bitmaps.c @@ -203,32 +203,34 @@ const uint8_t BITMAP_ScanList4[7] = 0b01111111, }; -const uint8_t BITMAP_ScanList5[9] = +const uint8_t BITMAP_ScanList5[11] = { // 'All List' symbol - 0b11111111, - 0b11000011, - 0b10111101, - 0b11011011, - 0b11100111, - 0b11011011, - 0b10111101, - 0b11000011, - 0b11111111 + 0b01111111, + 0b01100011, + 0b01011101, + 0b01011101, + 0b01101011, + 0b01110111, + 0b01101011, + 0b01011101, + 0b01011101, + 0b01100011, + 0b01111111 }; const uint8_t BITMAP_ScanList6[9] = { // 'All' symbol - 0b00000000, - 0b00111100, - 0b01000010, - 0b00100100, - 0b00011000, - 0b00100100, - 0b01000010, - 0b00111100, - 0b00000000 + 0b00011100, + 0b00100010, + 0b00100010, + 0b00010100, + 0b00001000, + 0b00010100, + 0b00100010, + 0b00100010, + 0b00011100 }; const uint8_t BITMAP_compand[6] = diff --git a/bitmaps.h b/bitmaps.h index b7df2819..32361611 100644 --- a/bitmaps.h +++ b/bitmaps.h @@ -34,7 +34,7 @@ extern const uint8_t BITMAP_ScanList1[7]; extern const uint8_t BITMAP_ScanList2[7]; extern const uint8_t BITMAP_ScanList3[7]; extern const uint8_t BITMAP_ScanList4[7]; -extern const uint8_t BITMAP_ScanList5[9]; +extern const uint8_t BITMAP_ScanList5[11]; extern const uint8_t BITMAP_ScanList6[9]; extern const uint8_t BITMAP_compand[6]; diff --git a/ui/status.c b/ui/status.c index 35be7186..ed686133 100644 --- a/ui/status.c +++ b/ui/status.c @@ -108,7 +108,7 @@ void UI_DisplayStatus() memcpy(line + x + 2, BITMAP_ScanList4, sizeof(BITMAP_ScanList4)); break; case 4: - memcpy(line + x + 1, BITMAP_ScanList5, sizeof(BITMAP_ScanList5)); + memcpy(line + x + 0, BITMAP_ScanList5, sizeof(BITMAP_ScanList5)); break; case 5: memcpy(line + x + 1, BITMAP_ScanList6, sizeof(BITMAP_ScanList6)); From b4b27cb2093038cd007e301df182ec90f62d933a Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Tue, 25 Jun 2024 00:46:39 +0200 Subject: [PATCH 08/36] Add exclude feature on LIST3 and ALL IN LIST --- app/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/main.c b/app/main.c index 630300f6..b7fa4b58 100644 --- a/app/main.c +++ b/app/main.c @@ -568,7 +568,8 @@ static void MAIN_Key_MENU(bool bKeyPressed, bool bKeyHeld) if (bKeyPressed) { // long press MENU key #ifdef ENABLE_FEAT_F4HWN - if(gScanStateDir != SCAN_OFF && gEeprom.SCAN_LIST_DEFAULT < 5) + // Exclude work with list 1, 2, 3 or all list + if(gScanStateDir != SCAN_OFF && (gEeprom.SCAN_LIST_DEFAULT < 3 || gEeprom.SCAN_LIST_DEFAULT == 4)) { if(FUNCTION_IsRx()) { From 81f551738ca1a1dfa4f069f94baba9e99bb66c47 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Tue, 25 Jun 2024 01:02:49 +0200 Subject: [PATCH 09/36] Change SList label --- ui/menu.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/menu.c b/ui/menu.c index 1bbb450b..bfa43c44 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -809,11 +809,11 @@ void UI_DisplayMenu(void) case MENU_S_LIST: if (gSubMenuSelection < 3) - sprintf(String, "LIST%u", 1 + gSubMenuSelection); + sprintf(String, "LIST [%u]", 1 + gSubMenuSelection); else if (gSubMenuSelection == 3) - strcpy(String, "NOT\nIN LISTS"); + strcpy(String, "LIST [0]\nNO LIST"); else if (gSubMenuSelection == 4) - strcpy(String, "ALL\nIN LISTS"); + strcpy(String, "LISTS\n[1, 2, 3]"); else if (gSubMenuSelection == 5) strcpy(String, "ALL"); break; From 7f01359fb2546115df29ae5c9478a1ee569c27fc Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Tue, 25 Jun 2024 04:28:43 +0200 Subject: [PATCH 10/36] Fix issue #142 --- ui/menu.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/menu.c b/ui/menu.c index bfa43c44..b5e426f6 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -750,7 +750,10 @@ void UI_DisplayMenu(void) { const uint32_t frequency = SETTINGS_FetchChannelFrequency(gSubMenuSelection); - if (!gIsInSubMenu || edit_index < 0) + //if (!gIsInSubMenu || edit_index < 0) + if (!gIsInSubMenu) + edit_index = -1; + if (edit_index < 0) { // show the channel name SETTINGS_FetchChannelName(String, gSubMenuSelection); char *pPrintStr = String[0] ? String : "--"; From b5d8a07188954d407ba2ef986cc56dce32caea29 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Wed, 26 Jun 2024 03:15:22 +0200 Subject: [PATCH 11/36] Fix issue #138 --- app/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/main.c b/app/main.c index b7fa4b58..78c04d7e 100644 --- a/app/main.c +++ b/app/main.c @@ -701,7 +701,7 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld) gRequestDisplayScreen = DISPLAY_SCANNER; } - gPttWasReleased = true; + //gPttWasReleased = true; Fixed issue #138 gUpdateStatus = true; } From 30e2dc81a5e64dfc173fa14b4da13987d0396acb Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Wed, 26 Jun 2024 04:10:28 +0200 Subject: [PATCH 12/36] Improve toggle scanlist --- app/main.c | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/app/main.c b/app/main.c index 78c04d7e..e0ffbb50 100644 --- a/app/main.c +++ b/app/main.c @@ -67,24 +67,13 @@ static void toggle_chan_scanlist(void) } */ - if(gTxVfo->SCANLIST1_PARTICIPATION == 1) - { - gTxVfo->SCANLIST1_PARTICIPATION = 0; - gTxVfo->SCANLIST2_PARTICIPATION = 1; - gTxVfo->SCANLIST3_PARTICIPATION = 0; - } - else if(gTxVfo->SCANLIST2_PARTICIPATION == 1) - { - gTxVfo->SCANLIST1_PARTICIPATION = 0; - gTxVfo->SCANLIST2_PARTICIPATION = 0; - gTxVfo->SCANLIST3_PARTICIPATION = 1; - } - else if(gTxVfo->SCANLIST3_PARTICIPATION == 1) - { - gTxVfo->SCANLIST1_PARTICIPATION = 1; - gTxVfo->SCANLIST2_PARTICIPATION = 0; - gTxVfo->SCANLIST3_PARTICIPATION = 0; - } + uint8_t scanTmp = (gTxVfo->SCANLIST1_PARTICIPATION << 2) | (gTxVfo->SCANLIST2_PARTICIPATION << 1) | gTxVfo->SCANLIST3_PARTICIPATION; + + scanTmp = (scanTmp++ < 7) ? scanTmp: 0; + + gTxVfo->SCANLIST1_PARTICIPATION = (scanTmp >> 0) & 0x01; + gTxVfo->SCANLIST2_PARTICIPATION = (scanTmp >> 1) & 0x01; + gTxVfo->SCANLIST3_PARTICIPATION = (scanTmp >> 2) & 0x01; SETTINGS_UpdateChannel(gTxVfo->CHANNEL_SAVE, gTxVfo, true, true, true); From 1a97a076e17c79059c7a69a95d86441213bf77b1 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Thu, 27 Jun 2024 01:10:01 +0200 Subject: [PATCH 13/36] Improve scanlist toggle --- app/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/main.c b/app/main.c index e0ffbb50..3cd1258d 100644 --- a/app/main.c +++ b/app/main.c @@ -67,7 +67,7 @@ static void toggle_chan_scanlist(void) } */ - uint8_t scanTmp = (gTxVfo->SCANLIST1_PARTICIPATION << 2) | (gTxVfo->SCANLIST2_PARTICIPATION << 1) | gTxVfo->SCANLIST3_PARTICIPATION; + uint8_t scanTmp = gTxVfo->SCANLIST1_PARTICIPATION | (gTxVfo->SCANLIST2_PARTICIPATION << 1) | (gTxVfo->SCANLIST3_PARTICIPATION << 2); scanTmp = (scanTmp++ < 7) ? scanTmp: 0; From ae6fb50e10eddb9e3d7eabe2e335b48835355d95 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Fri, 28 Jun 2024 05:13:24 +0200 Subject: [PATCH 14/36] Scanlist refactoring --- app/main.c | 2 +- bitmaps.c | 98 ++++++++++++++++++++++------------------------------- bitmaps.h | 11 +++--- radio.c | 8 ++--- ui/main.c | 16 +++------ ui/menu.c | 6 ++-- ui/status.c | 22 +++++++----- 7 files changed, 70 insertions(+), 93 deletions(-) diff --git a/app/main.c b/app/main.c index 3cd1258d..25273e94 100644 --- a/app/main.c +++ b/app/main.c @@ -558,7 +558,7 @@ static void MAIN_Key_MENU(bool bKeyPressed, bool bKeyHeld) #ifdef ENABLE_FEAT_F4HWN // Exclude work with list 1, 2, 3 or all list - if(gScanStateDir != SCAN_OFF && (gEeprom.SCAN_LIST_DEFAULT < 3 || gEeprom.SCAN_LIST_DEFAULT == 4)) + if(gScanStateDir != SCAN_OFF && (gEeprom.SCAN_LIST_DEFAULT > 0 || gEeprom.SCAN_LIST_DEFAULT < 5)) { if(FUNCTION_IsRx()) { diff --git a/bitmaps.c b/bitmaps.c index 92b6eeeb..3baabd7e 100644 --- a/bitmaps.c +++ b/bitmaps.c @@ -159,78 +159,60 @@ const uint8_t BITMAP_VFO_NotDefault[8] = 0b00001000 }; -const uint8_t BITMAP_ScanList1[7] = -{ // '1' symbol - 0b01111111, - 0b01111111, - 0b01111011, - 0b01000001, - 0b01111111, - 0b01111111, - 0b01111111, -}; - -const uint8_t BITMAP_ScanList2[7] = -{ // '2' symbol - 0b01111111, - 0b01111111, - 0b01001101, - 0b01010101, - 0b01011011, - 0b01111111, - 0b01111111, -}; - -const uint8_t BITMAP_ScanList3[7] = -{ // '3' symbol - 0b01111111, - 0b01111111, - 0b01011101, - 0b01010101, - 0b01101011, - 0b01111111, - 0b01111111, -}; - -const uint8_t BITMAP_ScanList4[7] = +const uint8_t BITMAP_ScanList0[5] = { // '0' symbol - 0b01111111, 0b01111111, 0b01000011, 0b01011101, 0b01100001, 0b01111111, +}; + +const uint8_t BITMAP_ScanList1[5] = +{ // '1' symbol + 0b01111111, + 0b01111011, + 0b01000001, + 0b01111111, 0b01111111, }; -const uint8_t BITMAP_ScanList5[11] = -{ - // 'All List' symbol +const uint8_t BITMAP_ScanList2[5] = +{ // '2' symbol + 0b01111111, + 0b01001101, + 0b01010101, + 0b01011011, 0b01111111, - 0b01100011, - 0b01011101, - 0b01011101, - 0b01101011, - 0b01110111, - 0b01101011, - 0b01011101, - 0b01011101, - 0b01100011, - 0b01111111 }; -const uint8_t BITMAP_ScanList6[9] = +const uint8_t BITMAP_ScanList3[5] = +{ // '3' symbol + 0b01111111, + 0b01011101, + 0b01010101, + 0b01101011, + 0b01111111, +}; + +const uint8_t BITMAP_ScanListAll[15] = { // 'All' symbol - 0b00011100, - 0b00100010, - 0b00100010, - 0b00010100, - 0b00001000, - 0b00010100, - 0b00100010, - 0b00100010, - 0b00011100 + 0b01111111, + 0b01000011, + 0b01110101, + 0b01000011, + 0b01111111, + 0b01111111, + 0b01000001, + 0b01011111, + 0b01011111, + 0b01111111, + 0b01111111, + 0b01000001, + 0b01011111, + 0b01011111, + 0b01111111, }; const uint8_t BITMAP_compand[6] = diff --git a/bitmaps.h b/bitmaps.h index 32361611..d2a03fa0 100644 --- a/bitmaps.h +++ b/bitmaps.h @@ -30,12 +30,11 @@ extern const uint8_t BITMAP_Ready[7]; extern const uint8_t BITMAP_Antenna[5]; extern const uint8_t BITMAP_VFO_Default[8]; extern const uint8_t BITMAP_VFO_NotDefault[8]; -extern const uint8_t BITMAP_ScanList1[7]; -extern const uint8_t BITMAP_ScanList2[7]; -extern const uint8_t BITMAP_ScanList3[7]; -extern const uint8_t BITMAP_ScanList4[7]; -extern const uint8_t BITMAP_ScanList5[11]; -extern const uint8_t BITMAP_ScanList6[9]; +extern const uint8_t BITMAP_ScanList0[5]; +extern const uint8_t BITMAP_ScanList1[5]; +extern const uint8_t BITMAP_ScanList2[5]; +extern const uint8_t BITMAP_ScanList3[5]; +extern const uint8_t BITMAP_ScanListAll[15]; extern const uint8_t BITMAP_compand[6]; #ifndef ENABLE_CUSTOM_MENU_LAYOUT diff --git a/radio.c b/radio.c index fa3515e8..a7bf0807 100644 --- a/radio.c +++ b/radio.c @@ -80,19 +80,19 @@ bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanL //LogUart(str); - if(scanList == 0 && att.scanlist1 != 1) + if(scanList == 0 && (att.scanlist1 == 1 || att.scanlist2 == 1 || att.scanlist3 == 1)) { return false; } - else if(scanList == 1 && att.scanlist2 != 1) + else if(scanList == 1 && att.scanlist1 != 1) { return false; } - else if(scanList == 2 && att.scanlist3 != 1) + else if(scanList == 2 && att.scanlist2 != 1) { return false; } - else if(scanList == 3 && (att.scanlist1 == 1 || att.scanlist2 == 1 || att.scanlist3 == 1)) + else if(scanList == 3 && att.scanlist3 != 1) { return false; } diff --git a/ui/main.c b/ui/main.c index bda93f91..74272c66 100644 --- a/ui/main.c +++ b/ui/main.c @@ -909,22 +909,22 @@ void UI_DisplayMain(void) if (att.scanlist1) { - memcpy(p_line0 + 128 - (shiftList * 7), BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); + memcpy(p_line0 + 128 - (shiftList * 5), BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); shiftList--; } if (att.scanlist2) { - memcpy(p_line0 + 128 - (shiftList * 7), BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); + memcpy(p_line0 + 128 - (shiftList * 5), BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); shiftList--; } if (att.scanlist3) { - memcpy(p_line0 + 128 - (shiftList * 7), BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); + memcpy(p_line0 + 128 - (shiftList * 5), BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); } if(countList == 0) { - memcpy(p_line0 + 128 - (1 * 7), BITMAP_ScanList4, sizeof(BITMAP_ScanList4)); + memcpy(p_line0 + 128 - (1 * 5), BITMAP_ScanList0, sizeof(BITMAP_ScanList0)); } /* @@ -978,14 +978,6 @@ void UI_DisplayMain(void) { // no channel name, show the channel number instead sprintf(String, "CH-%03u", gEeprom.ScreenChannel[vfo_num] + 1); } - else - { - // Too many list, so remove last character name - if(String[9] != 0 && countList == 3) - { - String[9] = 0; - } - } if (gEeprom.CHANNEL_DISPLAY_MODE == MDF_NAME) { UI_PrintString(String, 32, 0, line, 8); diff --git a/ui/menu.c b/ui/menu.c index b5e426f6..f84a1435 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -811,10 +811,10 @@ void UI_DisplayMenu(void) break; case MENU_S_LIST: - if (gSubMenuSelection < 3) - sprintf(String, "LIST [%u]", 1 + gSubMenuSelection); - else if (gSubMenuSelection == 3) + if (gSubMenuSelection == 0) strcpy(String, "LIST [0]\nNO LIST"); + else if (gSubMenuSelection < 4) + sprintf(String, "LIST [%u]", gSubMenuSelection); else if (gSubMenuSelection == 4) strcpy(String, "LISTS\n[1, 2, 3]"); else if (gSubMenuSelection == 5) diff --git a/ui/status.c b/ui/status.c index ed686133..c928363f 100644 --- a/ui/status.c +++ b/ui/status.c @@ -50,7 +50,9 @@ static void convertTime(uint8_t *line, uint8_t type) m = t / 60; s = t - (m * 60); - gStatusLine[14] = 0x00; // Quick fix on display (on scanning I, II, etc.) + gStatusLine[0] = 0x00; // Quick fix on display (on scanning I, II, etc.) + gStatusLine[7] = 0x00; // Quick fix on display (on scanning I, II, etc.) + gStatusLine[14] = 0x00; // Quick fix on display (on scanning I, II, etc.) sprintf(str, "%02d:%02d", m, s); UI_PrintStringSmallBufferNormal(str, line + 0); @@ -95,23 +97,25 @@ void UI_DisplayStatus() if (gScanStateDir != SCAN_OFF || SCANNER_IsScanning()) { if (IS_MR_CHANNEL(gNextMrChannel) && !SCANNER_IsScanning()) { // channel mode switch(gEeprom.SCAN_LIST_DEFAULT) { - case 0: - memcpy(line + x + 2, BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); + case 0: + memcpy(line + 0, BITMAP_ScanList0, sizeof(BITMAP_ScanList0)); break; - case 1: - memcpy(line + x + 2, BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); + case 1: + memcpy(line + 0, BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); break; case 2: - memcpy(line + x + 2, BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); + memcpy(line + 0, BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); break; case 3: - memcpy(line + x + 2, BITMAP_ScanList4, sizeof(BITMAP_ScanList4)); + memcpy(line + 0, BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); break; case 4: - memcpy(line + x + 0, BITMAP_ScanList5, sizeof(BITMAP_ScanList5)); + memcpy(line + 0, BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); + memcpy(line + 5, BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); + memcpy(line + 10, BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); break; case 5: - memcpy(line + x + 1, BITMAP_ScanList6, sizeof(BITMAP_ScanList6)); + memcpy(line + 0, BITMAP_ScanListAll, sizeof(BITMAP_ScanListAll)); break; } } From 79ca1f7028124cabf70254ddb613747939c9017c Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Fri, 28 Jun 2024 05:20:40 +0200 Subject: [PATCH 15/36] Release 4 bytes...(PR #150) --- app/spectrum.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/spectrum.c b/app/spectrum.c index 5053a3f3..c5383ccb 100644 --- a/app/spectrum.c +++ b/app/spectrum.c @@ -66,7 +66,7 @@ static uint16_t blacklistFreqs[15]; static uint8_t blacklistFreqsIdx; #endif -const char *bwOptions[] = {" 25k", "12.5k", "6.25k"}; +const char *bwOptions[] = {"25", "12.5", "6.25"}; const uint8_t modulationTypeTuneSteps[] = {100, 50, 10}; const uint8_t modTypeReg47Values[] = {1, 7, 5}; @@ -778,7 +778,7 @@ static void DrawF(uint32_t f) { sprintf(String, "%3s", gModulationStr[settings.modulationType]); GUI_DisplaySmallest(String, 116, 1, false, true); - sprintf(String, "%s", bwOptions[settings.listenBw]); + sprintf(String, "%4sk", bwOptions[settings.listenBw]); GUI_DisplaySmallest(String, 108, 7, false, true); #ifndef ENABLE_FMRADIO From 0110f89cdb04f4525be27518ad3ce611711df7ac Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Fri, 28 Jun 2024 13:58:59 +0200 Subject: [PATCH 16/36] Scanlist refactoring --- bitmaps.c | 22 +++++++++++++++++----- bitmaps.h | 10 +++++----- ui/main.c | 8 ++++---- ui/status.c | 4 ++-- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/bitmaps.c b/bitmaps.c index 3baabd7e..f75be171 100644 --- a/bitmaps.c +++ b/bitmaps.c @@ -159,60 +159,72 @@ const uint8_t BITMAP_VFO_NotDefault[8] = 0b00001000 }; -const uint8_t BITMAP_ScanList0[5] = +const uint8_t BITMAP_ScanList0[7] = { // '0' symbol + 0b01111111, 0b01111111, 0b01000011, 0b01011101, 0b01100001, 0b01111111, + 0b01111111 }; -const uint8_t BITMAP_ScanList1[5] = +const uint8_t BITMAP_ScanList1[7] = { // '1' symbol + 0b01111111, 0b01111111, 0b01111011, 0b01000001, 0b01111111, 0b01111111, + 0b01111111 }; -const uint8_t BITMAP_ScanList2[5] = +const uint8_t BITMAP_ScanList2[7] = { // '2' symbol + 0b01111111, 0b01111111, 0b01001101, 0b01010101, 0b01011011, 0b01111111, + 0b01111111 }; -const uint8_t BITMAP_ScanList3[5] = +const uint8_t BITMAP_ScanList3[7] = { // '3' symbol + 0b01111111, 0b01111111, 0b01011101, 0b01010101, 0b01101011, 0b01111111, + 0b01111111 }; -const uint8_t BITMAP_ScanListAll[15] = +const uint8_t BITMAP_ScanListAll[19] = { // 'All' symbol 0b01111111, + 0b01111111, 0b01000011, 0b01110101, 0b01000011, 0b01111111, 0b01111111, + 0b01111111, 0b01000001, 0b01011111, 0b01011111, 0b01111111, 0b01111111, + 0b01111111, 0b01000001, 0b01011111, 0b01011111, 0b01111111, + 0b01111111 }; const uint8_t BITMAP_compand[6] = diff --git a/bitmaps.h b/bitmaps.h index d2a03fa0..69a4989e 100644 --- a/bitmaps.h +++ b/bitmaps.h @@ -30,11 +30,11 @@ extern const uint8_t BITMAP_Ready[7]; extern const uint8_t BITMAP_Antenna[5]; extern const uint8_t BITMAP_VFO_Default[8]; extern const uint8_t BITMAP_VFO_NotDefault[8]; -extern const uint8_t BITMAP_ScanList0[5]; -extern const uint8_t BITMAP_ScanList1[5]; -extern const uint8_t BITMAP_ScanList2[5]; -extern const uint8_t BITMAP_ScanList3[5]; -extern const uint8_t BITMAP_ScanListAll[15]; +extern const uint8_t BITMAP_ScanList0[7]; +extern const uint8_t BITMAP_ScanList1[7]; +extern const uint8_t BITMAP_ScanList2[7]; +extern const uint8_t BITMAP_ScanList3[7]; +extern const uint8_t BITMAP_ScanListAll[19]; extern const uint8_t BITMAP_compand[6]; #ifndef ENABLE_CUSTOM_MENU_LAYOUT diff --git a/ui/main.c b/ui/main.c index 74272c66..74827739 100644 --- a/ui/main.c +++ b/ui/main.c @@ -909,22 +909,22 @@ void UI_DisplayMain(void) if (att.scanlist1) { - memcpy(p_line0 + 128 - (shiftList * 5), BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); + memcpy(p_line0 + 127 - (shiftList * 6), BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); shiftList--; } if (att.scanlist2) { - memcpy(p_line0 + 128 - (shiftList * 5), BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); + memcpy(p_line0 + 127 - (shiftList * 6), BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); shiftList--; } if (att.scanlist3) { - memcpy(p_line0 + 128 - (shiftList * 5), BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); + memcpy(p_line0 + 127 - (shiftList * 6), BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); } if(countList == 0) { - memcpy(p_line0 + 128 - (1 * 5), BITMAP_ScanList0, sizeof(BITMAP_ScanList0)); + memcpy(p_line0 + 127 - (1 * 6), BITMAP_ScanList0, sizeof(BITMAP_ScanList0)); } /* diff --git a/ui/status.c b/ui/status.c index c928363f..030bd4c4 100644 --- a/ui/status.c +++ b/ui/status.c @@ -111,8 +111,8 @@ void UI_DisplayStatus() break; case 4: memcpy(line + 0, BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); - memcpy(line + 5, BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); - memcpy(line + 10, BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); + memcpy(line + 6, BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); + memcpy(line + 12, BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); break; case 5: memcpy(line + 0, BITMAP_ScanListAll, sizeof(BITMAP_ScanListAll)); From 3a61d18ac7f951175e0fab39633ed256afaa9e0a Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Fri, 28 Jun 2024 22:06:19 +0200 Subject: [PATCH 17/36] Scanlist refactoring --- app/main.c | 2 +- radio.c | 31 +++++++++++++------------------ 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/app/main.c b/app/main.c index 25273e94..9023ebfe 100644 --- a/app/main.c +++ b/app/main.c @@ -558,7 +558,7 @@ static void MAIN_Key_MENU(bool bKeyPressed, bool bKeyHeld) #ifdef ENABLE_FEAT_F4HWN // Exclude work with list 1, 2, 3 or all list - if(gScanStateDir != SCAN_OFF && (gEeprom.SCAN_LIST_DEFAULT > 0 || gEeprom.SCAN_LIST_DEFAULT < 5)) + if(gScanStateDir != SCAN_OFF && (gEeprom.SCAN_LIST_DEFAULT > 0 && gEeprom.SCAN_LIST_DEFAULT < 5)) { if(FUNCTION_IsRx()) { diff --git a/radio.c b/radio.c index a7bf0807..f706a968 100644 --- a/radio.c +++ b/radio.c @@ -36,7 +36,6 @@ #include "radio.h" #include "settings.h" #include "ui/menu.h" -#include "debugging.h" VFO_Info_t *gTxVfo; VFO_Info_t *gRxVfo; @@ -59,11 +58,6 @@ const char gModulationStr[MODULATION_UKNOWN][4] = { bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanList) { - - //char str[64] = ""; - //sprintf(str, "RADIO_CheckValidChannel channel %d / checkScanList %d / scanList %d\n", channel, checkScanList, scanList); - //LogUart(str); - // return true if the channel appears valid if (!IS_MR_CHANNEL(channel)) return false; @@ -76,10 +70,7 @@ bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanL if (!checkScanList || scanList > 4) return true; - //sprintf(str, "scanList %d / att.scanlist1 %d / att.scanlist2 %d / att.scanlist3 %d\n", scanList, att.scanlist1, att.scanlist2, att.scanlist3); - //LogUart(str); - - + /* if(scanList == 0 && (att.scanlist1 == 1 || att.scanlist2 == 1 || att.scanlist3 == 1)) { return false; @@ -100,24 +91,30 @@ bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanL { return false; } + */ - //sprintf(str, ">>> %d\n", scanList); - //LogUart(str); + if ((scanList == 0 && (att.scanlist1 == 1 || att.scanlist2 == 1 || att.scanlist3 == 1)) || + (scanList == 1 && att.scanlist1 != 1) || + (scanList == 2 && att.scanlist2 != 1) || + (scanList == 3 && att.scanlist3 != 1) || + (scanList == 4 && (att.scanlist1 == 0 && att.scanlist2 == 0 && att.scanlist3 == 0))) { + return false; + } return true; + /* + // I don't understand what this code is for... + const uint8_t PriorityCh1 = gEeprom.SCANLIST_PRIORITY_CH1[scanList]; const uint8_t PriorityCh2 = gEeprom.SCANLIST_PRIORITY_CH2[scanList]; return PriorityCh1 != channel && PriorityCh2 != channel; + */ } uint8_t RADIO_FindNextChannel(uint8_t Channel, int8_t Direction, bool bCheckScanList, uint8_t VFO) { - //char str[64] = ""; - //sprintf(str, "RADIO_FindNextChannel Channel %d / VFO %d\n", Channel, VFO); - //LogUart(str); - for (unsigned int i = 0; IS_MR_CHANNEL(i); i++, Channel += Direction) { if (Channel == 0xFF) { Channel = MR_CHANNEL_LAST; @@ -128,8 +125,6 @@ uint8_t RADIO_FindNextChannel(uint8_t Channel, int8_t Direction, bool bCheckScan if (RADIO_CheckValidChannel(Channel, bCheckScanList, VFO)) { return Channel; } - //sprintf(str, "VFO %d...\n", VFO); - //LogUart(str); } return 0xFF; From 3c2984cfd5f0a2891c78f77f601805490ad8813e Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Fri, 28 Jun 2024 22:22:50 +0200 Subject: [PATCH 18/36] Redundant code maybe free some bytes... --- bitmaps.c | 24 ++++++++++++++++++++++++ bitmaps.h | 1 + ui/status.c | 4 +--- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/bitmaps.c b/bitmaps.c index f75be171..f127623f 100644 --- a/bitmaps.c +++ b/bitmaps.c @@ -203,6 +203,30 @@ const uint8_t BITMAP_ScanList3[7] = 0b01111111 }; +const uint8_t BITMAP_ScanList123[19] = +{ + // 'All' symbol + 0b01111111, + 0b01111111, + 0b01111011, + 0b01000001, + 0b01111111, + 0b01111111, + 0b01111111, + 0b01111111, + 0b01001101, + 0b01010101, + 0b01011011, + 0b01111111, + 0b01111111, + 0b01111111, + 0b01011101, + 0b01010101, + 0b01101011, + 0b01111111, + 0b01111111 +}; + const uint8_t BITMAP_ScanListAll[19] = { // 'All' symbol diff --git a/bitmaps.h b/bitmaps.h index 69a4989e..836c02fe 100644 --- a/bitmaps.h +++ b/bitmaps.h @@ -34,6 +34,7 @@ extern const uint8_t BITMAP_ScanList0[7]; extern const uint8_t BITMAP_ScanList1[7]; extern const uint8_t BITMAP_ScanList2[7]; extern const uint8_t BITMAP_ScanList3[7]; +extern const uint8_t BITMAP_ScanList123[19]; extern const uint8_t BITMAP_ScanListAll[19]; extern const uint8_t BITMAP_compand[6]; diff --git a/ui/status.c b/ui/status.c index 030bd4c4..fa55a15c 100644 --- a/ui/status.c +++ b/ui/status.c @@ -110,9 +110,7 @@ void UI_DisplayStatus() memcpy(line + 0, BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); break; case 4: - memcpy(line + 0, BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); - memcpy(line + 6, BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); - memcpy(line + 12, BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); + memcpy(line + 0, BITMAP_ScanList123, sizeof(BITMAP_ScanList123)); break; case 5: memcpy(line + 0, BITMAP_ScanListAll, sizeof(BITMAP_ScanListAll)); From 2119f1a931c2ec342082949de8211a551a72ac15 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Sat, 29 Jun 2024 03:50:49 +0200 Subject: [PATCH 19/36] Try to improve channel input --- app/app.c | 14 ++++++++++++++ app/main.c | 48 +++++++++++++++++++++++++++++------------------- app/main.h | 1 + 3 files changed, 44 insertions(+), 19 deletions(-) diff --git a/app/app.c b/app/app.c index 8de5ab08..6785e1f7 100644 --- a/app/app.c +++ b/app/app.c @@ -1474,6 +1474,20 @@ void APP_TimeSlice500ms(void) gBeepToPlay = BEEP_NONE; } } + else + { + if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) { // user is entering channel number + switch (gInputBoxIndex) + { + case 1: + channelMove(gInputBox[0] - 1, false); + break; + case 2: + channelMove(((gInputBox[0] * 10) + gInputBox[1]) - 1, false); + break; + } + } + } } if (gDTMF_RX_live_timeout > 0) diff --git a/app/main.c b/app/main.c index 9023ebfe..862011c5 100644 --- a/app/main.c +++ b/app/main.c @@ -316,6 +316,32 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) } } +void channelMove(uint16_t Channel, bool End) +{ + const uint8_t Vfo = gEeprom.TX_VFO; + + if(End) + { + gInputBoxIndex = 0; + } + + if (!RADIO_CheckValidChannel(Channel, false, 0)) { + gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; + return; + } + + #ifdef ENABLE_VOICE + gAnotherVoiceID = (VOICE_ID_t)Key; + #endif + + gEeprom.MrChannel[Vfo] = (uint8_t)Channel; + gEeprom.ScreenChannel[Vfo] = (uint8_t)Channel; + gRequestSaveVFO = true; + gVfoConfigureMode = VFO_CONFIGURE_RELOAD; + + return; +} + static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { if (bKeyHeld) { // key held down @@ -349,6 +375,8 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) { // user is entering channel number + gKeyInputCountdown = (key_input_timeout_500ms / 8); // short time... + if (gInputBoxIndex != 3) { #ifdef ENABLE_VOICE gAnotherVoiceID = (VOICE_ID_t)Key; @@ -357,25 +385,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) return; } - gInputBoxIndex = 0; - - const uint16_t Channel = ((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1; - - if (!RADIO_CheckValidChannel(Channel, false, 0)) { - gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; - return; - } - - #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; - #endif - - gEeprom.MrChannel[Vfo] = (uint8_t)Channel; - gEeprom.ScreenChannel[Vfo] = (uint8_t)Channel; - gRequestSaveVFO = true; - gVfoConfigureMode = VFO_CONFIGURE_RELOAD; - - return; + channelMove(((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1, true); } // #ifdef ENABLE_NOAA diff --git a/app/main.h b/app/main.h index f679aac1..ddcc9ff2 100644 --- a/app/main.h +++ b/app/main.h @@ -20,6 +20,7 @@ #include "driver/keyboard.h" void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); +void channelMove(uint16_t Channel, bool End); #endif From 32daef5571995e59dd11ffe6adc4d5074515516b Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Sat, 29 Jun 2024 04:39:43 +0200 Subject: [PATCH 20/36] Add CA HAM and GMRS/FRS/MURS --- frequencies.c | 23 +++++++++++++++++++++++ settings.h | 4 ++++ ui/menu.c | 4 ++++ 3 files changed, 31 insertions(+) diff --git a/frequencies.c b/frequencies.c index ff8a494f..1798cf3a 100644 --- a/frequencies.c +++ b/frequencies.c @@ -227,6 +227,29 @@ int32_t TX_freq_check(const uint32_t Frequency) if (Frequency >= 44600625 && Frequency <= 44619375) return 0; break; + + case F_LOCK_GMRS_FRS_MURS: + // https://forums.radioreference.com/threads/the-great-unofficial-radioreference-frs-gmrs-murs-fact-sheet.275370/ + if (Frequency >= 46256250 && Frequency <= 46271250) // FRS/GMRS + return 0; + if (Frequency >= 46756250 && Frequency <= 46771250) // FRS ONLY + return 0; + if (Frequency >= 46255000 && Frequency <= 46272500) // GMRS ONLY + return 0; + if (Frequency == 15182000 || + Frequency == 15188000 || + Frequency == 15194000 || + Frequency == 15457000 || + Frequency == 15460000) // MURS + return 0; + break; + + case F_LOCK_CA: + if (Frequency >= 14400000 && Frequency < 14800000) + return 0; + if (Frequency >= 43000000 && Frequency < 45000000) + return 0; + break; #endif case F_LOCK_ALL: diff --git a/settings.h b/settings.h index 3792af40..86e248ec 100644 --- a/settings.h +++ b/settings.h @@ -41,12 +41,16 @@ typedef enum POWER_OnDisplayMode_t POWER_OnDisplayMode_t; enum TxLockModes_t { F_LOCK_DEF, //all default frequencies + configurable F_LOCK_FCC, +#ifdef ENABLE_FEAT_F4HWN_PMR + F_LOCK_CA, +#endif F_LOCK_CE, F_LOCK_GB, F_LOCK_430, F_LOCK_438, #ifdef ENABLE_FEAT_F4HWN_PMR F_LOCK_PMR, + F_LOCK_GMRS_FRS_MURS, #endif F_LOCK_ALL, // disable TX on all frequencies F_LOCK_NONE, // enable TX on all frequencies diff --git a/ui/menu.c b/ui/menu.c index f84a1435..5d607ddd 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -290,12 +290,16 @@ const char * const gSubMenu_F_LOCK[] = { "DEFAULT+\n137-174\n400-470", "FCC HAM\n144-148\n420-450", +#ifdef ENABLE_FEAT_F4HWN_PMR + "CA HAM\n144-148\n430-450", +#endif "CE HAM\n144-146\n430-440", "GB HAM\n144-148\n430-440", "137-174\n400-430", "137-174\n400-438", #ifdef ENABLE_FEAT_F4HWN_PMR "PMR 446", + "GMRS\nFRS\nMURS", #endif "DISABLE\nALL", "UNLOCK\nALL", From 0dc01d590b31a07adffa829147757de069ef4df5 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Sat, 29 Jun 2024 20:27:47 +0200 Subject: [PATCH 21/36] Improve channel input --- app/main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/main.c b/app/main.c index 862011c5..c90e4f34 100644 --- a/app/main.c +++ b/app/main.c @@ -336,9 +336,12 @@ void channelMove(uint16_t Channel, bool End) gEeprom.MrChannel[Vfo] = (uint8_t)Channel; gEeprom.ScreenChannel[Vfo] = (uint8_t)Channel; - gRequestSaveVFO = true; + //gRequestSaveVFO = true; gVfoConfigureMode = VFO_CONFIGURE_RELOAD; + RADIO_ConfigureChannel(gEeprom.TX_VFO, gVfoConfigureMode); + SETTINGS_SaveVfoIndices(); + return; } @@ -375,7 +378,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) { // user is entering channel number - gKeyInputCountdown = (key_input_timeout_500ms / 8); // short time... + gKeyInputCountdown = (key_input_timeout_500ms / 6); // short time... if (gInputBoxIndex != 3) { #ifdef ENABLE_VOICE From 45987500f26e58f302ebb00ce5773ccef9b9c2a1 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Sat, 29 Jun 2024 22:33:53 +0200 Subject: [PATCH 22/36] Improve channel input (eeprom writes) --- app/app.c | 6 ++++++ app/main.c | 7 +++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/app.c b/app/app.c index 6785e1f7..002f45ed 100644 --- a/app/app.c +++ b/app/app.c @@ -1466,6 +1466,12 @@ void APP_TimeSlice500ms(void) { if (--gKeyInputCountdown == 0) { + + if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE) && (gInputBoxIndex == 1 || gInputBoxIndex == 2)) + { + SETTINGS_SaveVfoIndices(); + } + cancelUserInputModes(); if (gBeepToPlay != BEEP_NONE) diff --git a/app/main.c b/app/main.c index c90e4f34..c5680398 100644 --- a/app/main.c +++ b/app/main.c @@ -340,7 +340,10 @@ void channelMove(uint16_t Channel, bool End) gVfoConfigureMode = VFO_CONFIGURE_RELOAD; RADIO_ConfigureChannel(gEeprom.TX_VFO, gVfoConfigureMode); - SETTINGS_SaveVfoIndices(); + if(End) + { + SETTINGS_SaveVfoIndices(); + } return; } @@ -378,7 +381,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) { // user is entering channel number - gKeyInputCountdown = (key_input_timeout_500ms / 6); // short time... + gKeyInputCountdown = (key_input_timeout_500ms / 5); // short time... if (gInputBoxIndex != 3) { #ifdef ENABLE_VOICE From 360134a8d4d2b488522ef5ca01329a658aa520ff Mon Sep 17 00:00:00 2001 From: prokrypt Date: Sat, 29 Jun 2024 13:56:16 -0700 Subject: [PATCH 23/36] spectrum: don't check blacklistFreqs if unset Fixes part of https://github.com/armel/uv-k5-firmware-custom/issues/151 --- app/spectrum.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/spectrum.c b/app/spectrum.c index c5383ccb..fd46e8e9 100644 --- a/app/spectrum.c +++ b/app/spectrum.c @@ -671,9 +671,10 @@ static void Blacklist() { #ifdef ENABLE_SCAN_RANGES static bool IsBlacklisted(uint16_t idx) { - for(uint8_t i = 0; i < ARRAY_SIZE(blacklistFreqs); i++) - if(blacklistFreqs[i] == idx) - return true; + if(blacklistedFreqs[0]) // cheaper than checking blacklistFreqsIdx + for(uint8_t i = 0; i < ARRAY_SIZE(blacklistFreqs); i++) + if(blacklistFreqs[i] == idx) + return true; return false; } #endif From 2e01ba774da4f3b69960df0b0c86ee434612db30 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Sun, 30 Jun 2024 00:23:17 +0200 Subject: [PATCH 24/36] Revert "spectrum: don't check blacklistFreqs if unset" --- app/spectrum.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/spectrum.c b/app/spectrum.c index fd46e8e9..c5383ccb 100644 --- a/app/spectrum.c +++ b/app/spectrum.c @@ -671,10 +671,9 @@ static void Blacklist() { #ifdef ENABLE_SCAN_RANGES static bool IsBlacklisted(uint16_t idx) { - if(blacklistedFreqs[0]) // cheaper than checking blacklistFreqsIdx - for(uint8_t i = 0; i < ARRAY_SIZE(blacklistFreqs); i++) - if(blacklistFreqs[i] == idx) - return true; + for(uint8_t i = 0; i < ARRAY_SIZE(blacklistFreqs); i++) + if(blacklistFreqs[i] == idx) + return true; return false; } #endif From e055a5f020cf119fbb0cf5a87b1779705b1f702e Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Mon, 1 Jul 2024 02:45:09 +0200 Subject: [PATCH 25/36] Work on this fucking priority feature --- app/chFrScanner.c | 29 +++++++++++++++++++------- app/menu.c | 16 +++++++-------- radio.c | 8 +++----- settings.c | 52 +++++++++++++++++++++++++++++++++++++++-------- settings.h | 6 +++--- ui/menu.c | 8 +++++++- 6 files changed, 86 insertions(+), 33 deletions(-) diff --git a/app/chFrScanner.c b/app/chFrScanner.c index c18168a3..a2904a37 100644 --- a/app/chFrScanner.c +++ b/app/chFrScanner.c @@ -4,6 +4,7 @@ #include "functions.h" #include "misc.h" #include "settings.h" +//#include "debugging.h" int8_t gScanStateDir; bool gScanKeepResult; @@ -17,7 +18,6 @@ uint32_t gScanRangeStop; typedef enum { SCAN_NEXT_CHAN_SCANLIST1 = 0, SCAN_NEXT_CHAN_SCANLIST2, - SCAN_NEXT_CHAN_SCANLIST3, SCAN_NEXT_CHAN_DUAL_WATCH, SCAN_NEXT_CHAN_MR, SCAN_NEXT_NUM @@ -195,13 +195,14 @@ static void NextFreqChannel(void) static void NextMemChannel(void) { static unsigned int prev_mr_chan = 0; - const bool enabled = (gEeprom.SCAN_LIST_DEFAULT < 5) ? gEeprom.SCAN_LIST_ENABLED[gEeprom.SCAN_LIST_DEFAULT] : true; - const int chan1 = -1; - const int chan2 = -1; - const int chan3 = -1; + const bool enabled = (gEeprom.SCAN_LIST_DEFAULT > 0 && gEeprom.SCAN_LIST_DEFAULT < 4) ? gEeprom.SCAN_LIST_ENABLED[gEeprom.SCAN_LIST_DEFAULT - 1] : true; + const int chan1 = (gEeprom.SCAN_LIST_DEFAULT > 0 && gEeprom.SCAN_LIST_DEFAULT < 4) ? gEeprom.SCANLIST_PRIORITY_CH1[gEeprom.SCAN_LIST_DEFAULT - 1] : -1; + const int chan2 = (gEeprom.SCAN_LIST_DEFAULT > 0 && gEeprom.SCAN_LIST_DEFAULT < 4) ? gEeprom.SCANLIST_PRIORITY_CH2[gEeprom.SCAN_LIST_DEFAULT - 1] : -1; const unsigned int prev_chan = gNextMrChannel; unsigned int chan = 0; + //char str[64] = ""; + if (enabled) { switch (currentScanList) @@ -209,27 +210,37 @@ static void NextMemChannel(void) case SCAN_NEXT_CHAN_SCANLIST1: prev_mr_chan = gNextMrChannel; + //sprintf(str, "-> Chan1 %d\n", chan1 + 1); + //LogUart(str); + if (chan1 >= 0) { - if (RADIO_CheckValidChannel(chan1, false, 0)) + if (RADIO_CheckValidChannel(chan1, false, gEeprom.SCAN_LIST_DEFAULT)) { currentScanList = SCAN_NEXT_CHAN_SCANLIST1; gNextMrChannel = chan1; break; } } + [[fallthrough]]; case SCAN_NEXT_CHAN_SCANLIST2: + + //sprintf(str, "-> Chan2 %d\n", chan2 + 1); + //LogUart(str); + if (chan2 >= 0) { - if (RADIO_CheckValidChannel(chan2, false, 0)) + if (RADIO_CheckValidChannel(chan2, false, gEeprom.SCAN_LIST_DEFAULT)) { currentScanList = SCAN_NEXT_CHAN_SCANLIST2; gNextMrChannel = chan2; break; } } + [[fallthrough]]; + /* case SCAN_NEXT_CHAN_SCANLIST3: if (chan3 >= 0) { @@ -241,6 +252,7 @@ static void NextMemChannel(void) } } [[fallthrough]]; + */ // this bit doesn't yet work if the other VFO is a frequency case SCAN_NEXT_CHAN_DUAL_WATCH: // dual watch is enabled - include the other VFO in the scan @@ -274,6 +286,9 @@ static void NextMemChannel(void) } gNextMrChannel = chan; + + //sprintf(str, "----> Chan %d\n", chan + 1); + //LogUart(str); } if (gNextMrChannel != prev_chan) diff --git a/app/menu.c b/app/menu.c index f3d44f5e..8916f7d2 100644 --- a/app/menu.c +++ b/app/menu.c @@ -1131,17 +1131,17 @@ void MENU_ShowCurrentSetting(void) break; case MENU_SLIST1: - gSubMenuSelection = RADIO_FindNextChannel(0, 1, true, 0); - break; - - case MENU_SLIST2: gSubMenuSelection = RADIO_FindNextChannel(0, 1, true, 1); break; - case MENU_SLIST3: + case MENU_SLIST2: gSubMenuSelection = RADIO_FindNextChannel(0, 1, true, 2); break; + case MENU_SLIST3: + gSubMenuSelection = RADIO_FindNextChannel(0, 1, true, 3); + break; + #ifdef ENABLE_ALARM case MENU_AL_MOD: gSubMenuSelection = gEeprom.ALARM_MODE; @@ -1823,14 +1823,14 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) case MENU_SLIST3: bCheckScanList = true; - VFO = 2; + VFO = 3; break; case MENU_SLIST2: bCheckScanList = true; - VFO = 1; + VFO = 2; break; case MENU_SLIST1: - VFO = 0; + VFO = 1; bCheckScanList = true; break; diff --git a/radio.c b/radio.c index f706a968..2b8315aa 100644 --- a/radio.c +++ b/radio.c @@ -101,16 +101,14 @@ bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanL return false; } - return true; + //return true; - /* // I don't understand what this code is for... - const uint8_t PriorityCh1 = gEeprom.SCANLIST_PRIORITY_CH1[scanList]; - const uint8_t PriorityCh2 = gEeprom.SCANLIST_PRIORITY_CH2[scanList]; + const uint8_t PriorityCh1 = gEeprom.SCANLIST_PRIORITY_CH1[scanList - 1]; + const uint8_t PriorityCh2 = gEeprom.SCANLIST_PRIORITY_CH2[scanList - 1]; return PriorityCh1 != channel && PriorityCh2 != channel; - */ } uint8_t RADIO_FindNextChannel(uint8_t Channel, int8_t Direction, bool bCheckScanList, uint8_t VFO) diff --git a/settings.c b/settings.c index 1359ad20..689ca9e0 100644 --- a/settings.c +++ b/settings.c @@ -226,13 +226,35 @@ void SETTINGS_InitEEPROM(void) // 0F18..0F1F EEPROM_ReadBuffer(0x0F18, Data, 8); gEeprom.SCAN_LIST_DEFAULT = (Data[0] < 5) ? Data[0] : 0; // we now have 'all' channel scan option - for (unsigned int i = 0; i < 2; i++) + + // Fake data + gEeprom.SCAN_LIST_ENABLED[0] = 0; + gEeprom.SCAN_LIST_ENABLED[1] = 0; + gEeprom.SCAN_LIST_ENABLED[2] = 0; + + gEeprom.SCANLIST_PRIORITY_CH1[0] = 0; + gEeprom.SCANLIST_PRIORITY_CH2[0] = 2; + + gEeprom.SCANLIST_PRIORITY_CH1[1] = 14; + gEeprom.SCANLIST_PRIORITY_CH2[1] = 15; + + gEeprom.SCANLIST_PRIORITY_CH1[2] = 40; + gEeprom.SCANLIST_PRIORITY_CH2[2] = 41; + + // Fix me probably after Chirp update... + /* + for (unsigned int i = 0; i < 3; i++) { - const unsigned int j = 1 + (i * 3); - gEeprom.SCAN_LIST_ENABLED[i] = (Data[j + 0] < 5) ? Data[j] : false; + gEeprom.SCAN_LIST_ENABLED[i] = (Data[1] >> i) & 1; + } + + for (unsigned int i = 0; i < 3; i++) + { + const unsigned int j = 1 + (i * 2); gEeprom.SCANLIST_PRIORITY_CH1[i] = Data[j + 1]; gEeprom.SCANLIST_PRIORITY_CH2[i] = Data[j + 2]; } + */ // 0F40..0F47 EEPROM_ReadBuffer(0x0F40, Data, 8); @@ -506,6 +528,8 @@ void SETTINGS_SaveVfoIndices(void) void SETTINGS_SaveSettings(void) { uint8_t State[8]; + uint8_t tmp = 0; + #ifdef ENABLE_PWRON_PASSWORD uint32_t Password[2]; #endif @@ -617,13 +641,23 @@ void SETTINGS_SaveSettings(void) EEPROM_WriteBuffer(0x0ED8, State); State[0] = gEeprom.SCAN_LIST_DEFAULT; - State[1] = gEeprom.SCAN_LIST_ENABLED[0]; + + tmp = 0; + + if (gEeprom.SCAN_LIST_ENABLED[0] == 1) + tmp = tmp | (1 << 0); + if (gEeprom.SCAN_LIST_ENABLED[1] == 1) + tmp = tmp | (1 << 1); + if (gEeprom.SCAN_LIST_ENABLED[2] == 1) + tmp = tmp | (1 << 2); + + State[1] = tmp; State[2] = gEeprom.SCANLIST_PRIORITY_CH1[0]; State[3] = gEeprom.SCANLIST_PRIORITY_CH2[0]; - State[4] = gEeprom.SCAN_LIST_ENABLED[1]; - State[5] = gEeprom.SCANLIST_PRIORITY_CH1[1]; - State[6] = gEeprom.SCANLIST_PRIORITY_CH2[1]; - State[7] = 0xFF; + State[4] = gEeprom.SCANLIST_PRIORITY_CH1[1]; + State[5] = gEeprom.SCANLIST_PRIORITY_CH2[1]; + State[6] = gEeprom.SCANLIST_PRIORITY_CH1[2]; + State[7] = gEeprom.SCANLIST_PRIORITY_CH2[2]; EEPROM_WriteBuffer(0x0F18, State); memset(State, 0xFF, sizeof(State)); @@ -660,7 +694,7 @@ void SETTINGS_SaveSettings(void) #ifdef ENABLE_FEAT_F4HWN memset(State, 0xFF, sizeof(State)); - int tmp = 0; + tmp = 0; if(gSetting_set_inv == 1) tmp = tmp | (1 << 0); diff --git a/settings.h b/settings.h index 86e248ec..acb7fb96 100644 --- a/settings.h +++ b/settings.h @@ -192,9 +192,9 @@ typedef struct { uint8_t BACKLIGHT_TIME; uint8_t SCAN_RESUME_MODE; uint8_t SCAN_LIST_DEFAULT; - bool SCAN_LIST_ENABLED[2]; - uint8_t SCANLIST_PRIORITY_CH1[2]; - uint8_t SCANLIST_PRIORITY_CH2[2]; + bool SCAN_LIST_ENABLED[3]; + uint8_t SCANLIST_PRIORITY_CH1[3]; + uint8_t SCANLIST_PRIORITY_CH2[3]; uint8_t field29_0x26; uint8_t field30_0x27; diff --git a/ui/menu.c b/ui/menu.c index 5d607ddd..532d223f 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -1037,7 +1037,13 @@ void UI_DisplayMenu(void) if (UI_MENU_GetCurrentMenuId() == MENU_SLIST1 || UI_MENU_GetCurrentMenuId() == MENU_SLIST2 || UI_MENU_GetCurrentMenuId() == MENU_SLIST3) { - i = (UI_MENU_GetCurrentMenuId() == MENU_SLIST1) ? 0 : 1; + if(UI_MENU_GetCurrentMenuId() == MENU_SLIST1) + i = 0; + else if(UI_MENU_GetCurrentMenuId() == MENU_SLIST2) + i = 1; + else if(UI_MENU_GetCurrentMenuId() == MENU_SLIST3) + i = 2; + char *pPrintStr = String; if (gSubMenuSelection < 0) { From 7a3c3cffc459a732542ef37b81064fa95609d929 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Mon, 1 Jul 2024 03:21:32 +0200 Subject: [PATCH 26/36] Work on this fucking priority feature --- settings.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settings.c b/settings.c index 689ca9e0..24b4e90c 100644 --- a/settings.c +++ b/settings.c @@ -228,6 +228,7 @@ void SETTINGS_InitEEPROM(void) gEeprom.SCAN_LIST_DEFAULT = (Data[0] < 5) ? Data[0] : 0; // we now have 'all' channel scan option // Fake data + /* gEeprom.SCAN_LIST_ENABLED[0] = 0; gEeprom.SCAN_LIST_ENABLED[1] = 0; gEeprom.SCAN_LIST_ENABLED[2] = 0; @@ -240,9 +241,9 @@ void SETTINGS_InitEEPROM(void) gEeprom.SCANLIST_PRIORITY_CH1[2] = 40; gEeprom.SCANLIST_PRIORITY_CH2[2] = 41; + */ // Fix me probably after Chirp update... - /* for (unsigned int i = 0; i < 3; i++) { gEeprom.SCAN_LIST_ENABLED[i] = (Data[1] >> i) & 1; @@ -254,7 +255,6 @@ void SETTINGS_InitEEPROM(void) gEeprom.SCANLIST_PRIORITY_CH1[i] = Data[j + 1]; gEeprom.SCANLIST_PRIORITY_CH2[i] = Data[j + 2]; } - */ // 0F40..0F47 EEPROM_ReadBuffer(0x0F40, Data, 8); From 8f803de3fdb6fb834acb48b321a0b7fef471ff99 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Tue, 2 Jul 2024 01:06:18 +0200 Subject: [PATCH 27/36] Add ENABLE_SPECTRUM in Chirp BUILT_OPTIONS --- settings.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/settings.c b/settings.c index 24b4e90c..81736988 100644 --- a/settings.c +++ b/settings.c @@ -897,6 +897,9 @@ buf[1] = 0 #ifdef ENABLE_AM_FIX | (1 << 4) #endif +#ifdef ENABLE_SPECTRUM + | (1 << 5) +#endif ; EEPROM_WriteBuffer(0x1FF0, buf); } \ No newline at end of file From aea31e85f6c2718e5fb4b3cf41462f31889b19eb Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Tue, 2 Jul 2024 02:01:50 +0200 Subject: [PATCH 28/36] Fix pull request #152 --- app/spectrum.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/spectrum.c b/app/spectrum.c index c5383ccb..3edecc01 100644 --- a/app/spectrum.c +++ b/app/spectrum.c @@ -671,9 +671,10 @@ static void Blacklist() { #ifdef ENABLE_SCAN_RANGES static bool IsBlacklisted(uint16_t idx) { - for(uint8_t i = 0; i < ARRAY_SIZE(blacklistFreqs); i++) - if(blacklistFreqs[i] == idx) - return true; + if(blacklistFreqs[0]) // cheaper than checking blacklistFreqsIdx + for(uint8_t i = 0; i < ARRAY_SIZE(blacklistFreqs); i++) + if(blacklistFreqs[i] == idx) + return true; return false; } #endif From 1b76b16e4436f9e037aedff38c3521e49e453308 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Tue, 2 Jul 2024 05:12:38 +0200 Subject: [PATCH 29/36] Fix order to match with Chirp --- misc.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misc.h b/misc.h index 135c9ead..eab114ac 100644 --- a/misc.h +++ b/misc.h @@ -197,9 +197,9 @@ typedef union { uint8_t band : 3, compander : 2, - scanlist3 : 1, + scanlist1 : 1, scanlist2 : 1, - scanlist1 : 1; + scanlist3 : 1; }; uint8_t __val; } ChannelAttributes_t; From cb8833011052dd818f4782e93302dab88bbcfe5d Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Tue, 2 Jul 2024 13:12:24 +0200 Subject: [PATCH 30/36] Fix backlight level 1 and 2 issue #131 --- driver/backlight.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/driver/backlight.c b/driver/backlight.c index 31488c58..b6544ed0 100644 --- a/driver/backlight.c +++ b/driver/backlight.c @@ -146,8 +146,11 @@ static uint8_t currentBrightness; void BACKLIGHT_SetBrightness(uint8_t brigtness) { + const uint8_t value[] = {0, 3, 6, 9, 15, 24, 38, 62, 100, 159, 255}; + currentBrightness = brigtness; - PWM_PLUS0_CH0_COMP = (1 << brigtness) - 1; + PWM_PLUS0_CH0_COMP = value[brigtness] * 4; + //PWM_PLUS0_CH0_COMP = (1 << brigtness) - 1; //PWM_PLUS0_SWLOAD = 1; } From 6d77b4a58dcb1fd3732a9b9e789cbe40b5f0a6b6 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Wed, 3 Jul 2024 00:12:08 +0200 Subject: [PATCH 31/36] Update SysInf --- ui/menu.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/ui/menu.c b/ui/menu.c index 532d223f..f2340aaa 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -885,12 +885,10 @@ void UI_DisplayMenu(void) case MENU_VOL: #ifdef ENABLE_FEAT_F4HWN - sprintf(String, "%u.%02uV %u%%\n%s\n%s", - gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100, - BATTERY_VoltsToPercent(gBatteryVoltageAverage), + sprintf(String, "%s\n%s", AUTHOR_STRING_2, VERSION_STRING_2 - ); + ); #else sprintf(String, "%u.%02uV\n%u%%", gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100, @@ -1014,6 +1012,27 @@ void UI_DisplayMenu(void) else y = 2 - ((lines + 0) / 2); + // only for SysInf + if(UI_MENU_GetCurrentMenuId() == MENU_VOL) + { + sprintf(edit, "%u.%02uV %u%%", + gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100, + BATTERY_VoltsToPercent(gBatteryVoltageAverage) + ); + + UI_PrintStringSmallNormal(edit, 54, 127, 1); + + #ifdef ENABLE_SPECTRUM + #ifndef ENABLE_FMRADIO + UI_PrintStringSmallNormal("Bandscope", 54, 127, 6); + #endif + #else + UI_PrintStringSmallNormal("Broadcast", 54, 127, 6); + #endif + + y = 2; + } + // draw the text lines for (i = 0; i < len && lines > 0; lines--) { From 6bf7136ecab60966b984e0fb49cca03e887943c1 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Thu, 4 Jul 2024 04:06:15 +0200 Subject: [PATCH 32/36] Remove comments --- app/main.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/main.c b/app/main.c index c5680398..2a151a60 100644 --- a/app/main.c +++ b/app/main.c @@ -564,8 +564,6 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld) static void MAIN_Key_MENU(bool bKeyPressed, bool bKeyHeld) { - //static uint8_t block = 0; - if (bKeyPressed && !bKeyHeld) // menu key pressed gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; @@ -587,9 +585,6 @@ static void MAIN_Key_MENU(bool bKeyPressed, bool bKeyHeld) gVfoConfigureMode = VFO_CONFIGURE; gFlagResetVfos = true; - //block++; - //gDebug = block; - lastFoundFrqOrChan = lastFoundFrqOrChanOld; CHFRSCANNER_ContinueScanning(); From 44527811b6ba3ccf798407114e7d9afcd1148943 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Thu, 4 Jul 2024 04:51:17 +0200 Subject: [PATCH 33/36] Add quick scanlist changes --- app/app.c | 3 ++- app/main.c | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/app/app.c b/app/app.c index 002f45ed..2ebad563 100644 --- a/app/app.c +++ b/app/app.c @@ -1869,7 +1869,8 @@ static void ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) } if (Key <= KEY_9 || Key == KEY_F) { - if (gScanStateDir != SCAN_OFF || gCssBackgroundScan) { // FREQ/CTCSS/DCS scanning + //if (gScanStateDir != SCAN_OFF || gCssBackgroundScan) { // FREQ/CTCSS/DCS scanning + if (gCssBackgroundScan) { // FREQ/CTCSS/DCS scanning if (bKeyPressed && !bKeyHeld) AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL); return; diff --git a/app/main.c b/app/main.c index 2a151a60..821e15d8 100644 --- a/app/main.c +++ b/app/main.c @@ -374,6 +374,33 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) } if (!gWasFKeyPressed) { // F-key wasn't pressed + + if (gScanStateDir != SCAN_OFF){ + switch(Key) { + case KEY_0: + gEeprom.SCAN_LIST_DEFAULT = 0; + break; + case KEY_1: + gEeprom.SCAN_LIST_DEFAULT = 1; + break; + case KEY_2: + gEeprom.SCAN_LIST_DEFAULT = 2; + break; + case KEY_3: + gEeprom.SCAN_LIST_DEFAULT = 3; + break; + case KEY_4: + gEeprom.SCAN_LIST_DEFAULT = 4; + break; + case KEY_5: + gEeprom.SCAN_LIST_DEFAULT = 5; + break; + default: + break; + } + return; + } + const uint8_t Vfo = gEeprom.TX_VFO; gKeyInputCountdown = key_input_timeout_500ms; INPUTBOX_Append(Key); From 822781900b0742a2cf6268455422d890c314a3e3 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Thu, 4 Jul 2024 05:17:20 +0200 Subject: [PATCH 34/36] Move vertical line 2px on the left --- ui/menu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/menu.c b/ui/menu.c index f2340aaa..9337da0c 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -457,10 +457,10 @@ void UI_DisplayMenu(void) UI_DisplayClear(); #ifdef ENABLE_FEAT_F4HWN - UI_DrawLineBuffer(gFrameBuffer, 50, 0, 50, 55, 1); // Be ware, status zone = 8 lines, the rest = 56 ->total 64 + UI_DrawLineBuffer(gFrameBuffer, 48, 0, 48, 55, 1); // Be ware, status zone = 8 lines, the rest = 56 ->total 64 //UI_DrawLineDottedBuffer(gFrameBuffer, 0, 46, 50, 46, 1); - for (uint8_t i = 0; i < 50; i += 2) + for (uint8_t i = 0; i < 48; i += 2) { gFrameBuffer[5][i] = 0x40; } From ba3b4d5f0921fa6467727837c9a80b8f6fde3f59 Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Thu, 4 Jul 2024 15:24:33 +0200 Subject: [PATCH 35/36] Fix channel name edit --- ui/menu.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ui/menu.c b/ui/menu.c index 9337da0c..0d1f1793 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -765,9 +765,11 @@ void UI_DisplayMenu(void) } else { // show the channel name being edited - UI_PrintString(edit, menu_item_x1, 0, 2, 8); + //UI_PrintString(edit, menu_item_x1, 0, 2, 8); + UI_PrintString(edit, menu_item_x1, menu_item_x2, 2, 8); if (edit_index < 10) - UI_PrintString("^", menu_item_x1 + (8 * edit_index), 0, 4, 8); // show the cursor + //UI_PrintString("^", menu_item_x1 + (8 * edit_index), 0, 4, 8); // show the cursor + UI_PrintString("^", menu_item_x1 - 1 + (8 * edit_index),0, 4, 8); // show the cursor } if (!gAskForConfirmation) From 3e7959a1a826e92e9d2e3e2244dd8b59017a85bf Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Thu, 4 Jul 2024 16:09:21 +0200 Subject: [PATCH 36/36] Update README --- README.md | 28 +++++++++++++++++++----- archive/f4hwn.bandscope.packed.v3.0.bin | Bin 0 -> 58526 bytes archive/f4hwn.broadcast.packed.v3.0.bin | Bin 0 -> 56830 bytes 3 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 archive/f4hwn.bandscope.packed.v3.0.bin create mode 100644 archive/f4hwn.broadcast.packed.v3.0.bin diff --git a/README.md b/README.md index 51543283..1f73b52c 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ Special thanks to Jean-Cyrille F6IWW, Fabrice 14RC123, David F4BPP, Olivier 14RC * improve default power settings level (Low ~125mW, Mid ~2W and High ~5W), * improve s-meter (IARU recommandations), +* improve bandscope (Spectrum Analyser) and add channel name, * improve UI: * menu index is always visible, even if a menu is selected, * s-meter new design (Classic or Tiny), @@ -56,8 +57,9 @@ Special thanks to Jean-Cyrille F6IWW, Fabrice 14RC123, David F4BPP, Olivier 14RC * move BatTxt menu from 34/63 to 30/63 (just after BatSave menu 29/63), * rename BackLt to BLTime, * rename BltTRX to BLTxRx, + * improve memory channel input, * and more... -* new menu entries: +* new menu entries and changes: * add SetLow menu to set low power (<20mW, 125mW, 250mW, 500mW and 1W), * add SetPtt menu to set PTT mode (Classic or OnePush), * add SetTot menu to set TOT alert (Off, Sound, Visual, All), @@ -71,11 +73,27 @@ Special thanks to Jean-Cyrille F6IWW, Fabrice 14RC123, David F4BPP, Olivier 14RC * improve PonMsg menu, * improve BackLt menu, * improve TxTOut menu, -* improve status bar, + * add PMR 446 F Lock band, + * add HAM CA F Lock band (for Canadian zone), + * add GMRS/FRS/MURS F Lock (for North America zone), + * remove blink and SOS functionality, + * remove AM Fix menu (AM Fix is ENABLED by default). +* improve status bar: * add SetPtt mode in status bar, * change font and bitmaps, * move USB icon to left of battery information, * add RX and TX timers, +* improve lists and scan lists options: + * add new list 3 + * add new list 0 (channel without list...) + * add new scan lists options + * scan list 0 (all channels without list) + * scan list 1 + * scan list 2 + * scan list 3 + * scan lists [1, 2, 3] + * scan all (all channels with ou without list) + * add scan list shortcuts * new actions: * RX MODE, * MAIN ONLY, @@ -87,7 +105,8 @@ Special thanks to Jean-Cyrille F6IWW, Fabrice 14RC123, David F4BPP, Olivier 14RC * add the F + F1 or F + F2 key combination to dynamically change the Step, * add F + 8 to quickly switch backlight between BLMin and BLMax on demand (this bypass BackLt strategy), * add F + 9 to return to BackLt strategy, - * add long press on MENU, in * SCAN mode, to temporarily exclude a memory channel if (not working with * SCAN ALL). + * add long press on MENU, in * SCAN mode, to temporarily exclude a memory channel if (not working with * SCAN ALL), + * add short press on [0, 1, 2, 3, 4 or 5], in * SCAN mode, to dynamically change scan list. * many fix: * squelch, * s-meter, @@ -95,12 +114,11 @@ Special thanks to Jean-Cyrille F6IWW, Fabrice 14RC123, David F4BPP, Olivier 14RC * scan list 2 ignored, * scan range limit, * clean display on startup, + * no more PWM noise, * and more... * disabled ENABLE_DTMF_CALLING, * disabled SCRAMBLER, * unlock TX on all bands needs only to be repeat 3 times, -* add PMR 446 F Lock band, -* remove blink and SOS functionality, * code refactoring and many memory optimization, * and more... diff --git a/archive/f4hwn.bandscope.packed.v3.0.bin b/archive/f4hwn.bandscope.packed.v3.0.bin new file mode 100644 index 0000000000000000000000000000000000000000..d8843a507a6b4a9372039f38968c70b6a31ebdb7 GIT binary patch literal 58526 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 KMu2~bg#QD?N=!@u literal 0 HcmV?d00001 diff --git a/archive/f4hwn.broadcast.packed.v3.0.bin b/archive/f4hwn.broadcast.packed.v3.0.bin new file mode 100644 index 0000000000000000000000000000000000000000..f8fd192832aca3c1cb8bd8de986cf4550f62666f GIT binary patch literal 56830 zcmZ6y^Lhe%0FH^b1~-92>^;Pwb@RiD z+@nR`c5``#y7&4c9&gyrGG*DMySQ9u4g->9NKpOl`|ZEHnsYc~Z*`+g`oGP>mU&%V zI))@#N@1Tx!y`{m$wEAZK%5mGL~E!KxD^<^DqZ~x2=VbS2v{idhC2B~!-cpEim z$;c>`7uO+dZLKWi6aATb(ivu(>cu-D^AF}^gkPOSY(8Q=F% zk(s9zqUpmdz%xq#s$+&j+kv&fqF#qiWDl`MPVxfG6CGpC`czussUH!buaZV=u;tDWh5m<%$X*>? zkxS@Ve07%XIjgo+5Y+Zdd2hnb&gLgLn^IfL)aPXaRav#5 zCN9{!S8h8^9o};C{ZK>F!rL;ri{~6Kw>czN z5{S>4A1PsMgrLy%kzT3Bvbc2QUzY6Sn5(8%qABrVT zsj2Pu_qN1sVv_)GVvH7^ZG3}pmoW+4M*2S9+XY(@mXhn=KDxRuN^}$q4HTfh5XB`UD1{dB)Tx zLXi8sAVNy)6|yg8&}WYX;oT`hw| zA61$LwFmJ2Y6E>dj*df}B`A2pmM~Llg=~>X9MhE2+GK5$TepUo46)|49n5qq)iy8d zdI#$_%daz?E0}{JEtG!|1|*uo_3g?EX2qBp2ESUO31=yq-njcVggbSqzcz?sS~r@o zBc*%IcQJQ^q&HcNq9tXF?1U>7`Z#R=B}$!!go-ZN<}dyEYqLgQ)$JKHeY^Bf7Yv3z zt!y);wEmyF8t#d2B)@CzC2}3|tT%Cg38yR8T9Nio>xgjsv<~@WCI~-p|E)mEcT!G| z_wa8^QilR>r=XpHv>1fSSt%}as?C7n*hfuaB3g7n%X^HW9SoW?xEh1eOOQmA9r*_( z85N=v{d>B9n3#T-BJ66fm~RWU6$yr-LiD9tyQEDHY@X9aj@kS)Ha=EJ^7v!NF=>`2 zdoP-)TC{`>+xJ4;EO4XO?!zL{!d_w6o%3;t5U^~xsV-XW*5(vR5660n!rsKPCKDN# z^t0c|4IFC2IOj@_ud}+`psUORo%r%ZBZ#vmW*jem+tw6V0g*&6g zji=VqKa16hR&H1Xd412iEib7WdPj9<5F|}qQEuXWUA&h>KmGjX&KouFT|=%v3?uTg z2xs?UIPNZAuzWi|Oz8T2=@LtQPG+Z>oY;8zxP0Y1EwgG!-C6tNO+s`{VR=YJ_ED{qin7w-CVl2lC%)wA-y;mBJa0T2E+brad4Y)Y*A^NXxT{ z*@Tk3VSJK${fo|a=b<7I9oOvLIfA2*XFD(MnGdFTHV+}=Mq8=WX}_ntz7+mG=*379 zNpyHd?QAvg_{$+Tk(WAg{5ISd`w7l4i1=_@!msPmAbZ}Zw~{q3=8|;}o6k(CFc$^I zACx8zyLbu+$^!!iEq26+wVjpQKeP5-oz!pA_vo_KlnzR(|M{h-Bj+JxH_dn7xqgo4 z3DQqmyQ0r!k|#pQUJZCEl0XRdL3T znl+ZkMISV|q7-lH`=(H}^hZj!_uc$H!gP=$fpx3HVyQvL6tFIvN@2+pfKvp=de2qPi$ifob)!lE;3_!Pn_AQ{-K3>%0x0K zMMLh*TAL=!J^{pZW-Lm3#=E&JexdfDW_$MdMd;3}>uo_JQKPXDTyE=OZcG#SrdemE zbl14O&NX!uf!2p(Rlc5lp1YP%8C;p??A-dJJn$_trmu0aJ7A2q8|qXSPu1Opr5OsI zZ_Hj55`+O@!O1rAm2{Gz09s$wd6S!Cr7|2;*j&E%7|OT2k8gH6g5aLq~D z$%KZSIlk$=kr*9u+lH-ZkNwasTL;V6@-9&4RpE0nPGbX@T(=P}W_&jPeGebem8EG& z>;+l&s`fZE>wQ|o?_XR#$u3mqAppixsC{28_l!J^waZ_R;{4O!|k};sL zKl_cEm=24Qe`b4^5B{Vs3dxUiJqUKU6?=`-__LN3Ab%+v+76O5=b-8n&a#3l59038 z^v{(3Eyb+_6p?3tBG|ri=`|%ESHFi0U)x3YVjyWVQmCJM;VxMzt9P03aeq7chKp#q z>GQmMp`_Ru^nTDbY%q7x`GqU}gvuxw=|21E|A!N2cB#gjKforp_KjbRd}TP%{P)Zc zUm-t5J$C2JcP75_cSf~+$B9fy&DoLtKnrAB4LCf;PBU#il zE9#&ea+cZAQ?6|N?t5AWQGL|8ltjPGFIw|^$|9XIN=r^Piths9(|xZiM3U^IbHhGG zX|^oH>Aw`H!@K=Wx%qp86kJ^+r+6>Pa%@Q=C|*JCDuxhd3eJGdd0f9N@t~{#`Y#1- zW6hSeysA_A7-g$_xugRnO0 zZ|77Vv@ySoRFhYEOjOe5o;XZ~eF0i=$}P!Mg9re;@-C?yjE$7! z-ORN$!cjmWnhuU`#l)V&>#^Ch&QL#ol#DcuZ36d)ZtQ$1z89;QkyV$^i}@ZUv}V=d zR#U-6uc${Ip_?4_3%s&7EWJ(DbnYSf|3)Me-U4D=KLY&)vIJV>y{36n! zzJ)i^qqAG22y_WZ5I$DYe=sjK zqMiLZgKqm~=Bhw?*<-z#KdF^yg6>)@ymMa-hEcP2^Fcus%;T!q!~#9Ts^~|gIZaa@ zt2fptR{QHf|0jIg5pJDEbD=5E7?T8 z>Fuc!P>Z!Dx5z&jY%(nM%CUXlWNH9Oam zCkFfcv(_$8{l8k960}Js%gt#^&S=^7%gFQS)>8Kl=ZW4?wbid$Tx@X2t6az*LBT<& zO+?oZ%?mjozNnx?g)n5@t%?hGHwp(HA)?hhq+e5jeH~dko^r=*Ov)=Q2l`{;VCUB5 zZ?``CH9F55YK$tH{!U{~?#qeUQr~KHRmng2R+yzTQK(Rx^|L~oYmZMh!CRoAQQUV5 z@oPEObW$YWZmuaZuV8BU4zP%=-?@4=5p1#xJz%;QKWB>Hkh0khaDT}iNb{KdC7*l4Wj%DSS0*M(uHHYflNJkw~cq@^}3G zpZt>qNusxZ)WXRzSIVPsdg3q0JcyD9bI?V^M)|VS-uUA)bl=mj1xR%)Rnsa~AbYl2 zYe{H0i_D69M{?;*1xNR-qE)5Yq?DDP^?Q{RxjDn6WSd-y+=2V|56brqBi=lRk*=%H z*Yzf#8CP){Yazw!B;h$cuAy^7?w{X2ZpPc+gWf6&ApD}0?mwt(pWR1dVN?qS1)zQn zI&X1M$b5 z;b2!>_W=VF*6u3k^@Pg?`t@V{F!d|uBX5Vip=4@>DzSgRC5nYed)k{c7fc8;-hCC1 zwqV+TP#xIqW=X+%$B!&N!n9%MPg>Rt4uJSZla5&7#_~11B1d8a-4teCGFTbL za{^AcjUl<5!2HE$ol+x7t-~Mkxic)nEzr$6Tx3d!D&|@r=;EA zL!m@kakZ0F3$&`qSORNBCSZ0@ey&gQd*xP98VQ~%eI0bPZsnI_1R3ssC8Je$HXymb z?RUQe@h@XSM1l9e(CHxxt;x`TagZK|VgsDN0&`$6_F!t_*Zcr;9L6ICi*FzByl*4H z=W|@X&(lk5za>eQXH^Tcb1GRZh3P2;8(tj&@v~`tt{J?gNDgnW zcKTY9K2}D3Za6TzJ7NF>`CkL)|0<8dZ-t@6M;_ULXn7}~8Irll9A+ktSXS8s;v>^4 zFCb}m@R_hc10)tAAZK_3+bK{hC7Mfi*x$_0Cb60SE|^FBg+mC4)w79)(pvsmRcHpJ z2wQ%auhZ7Zn#-(tdjFKOMr;voi6ObXC_!<(qvoe@`hOZDom2J%6*;f+u>B5ZU4xO9 zx4leg+pJFuJnRTT;Na26*jnE5MKV8D!hu2q9rWvuBdT!LGrY*{Q|N}P;_n(cnN0n# zW6NcsnQ|_SD)lc}Qsl6?BAkKpj}yjw1(-W!;ve8GZo>Esxp$!DP%JmDPo+A$H!*!20VOKKIICCd$}4cJvn|9k$d-S$x6{OQ2g(QkVB^$pn} zkkH(|)!XXVg>`R3EtS__`n3VnPazjMwSfR@x1b+vQm~qA$y40-mYKOo5P1KoXLt!a zWbF5R8P`1~RLTl_HZ&6P`O++TcDj4uHrC9edwYsPI zbCSx3u8A8ZyvJXM`(Qu)3?_ranWMO&c@QEmlD#NnXKo($6H5Z-zx@LnCU%)k#F_z5 zq>wqLsHsbKM%D_TfHmVA|7Z=pFhpL&ZECVK^@~~AjRfvL(j#9_Rp14l&FNG9k*h`S z$?R7^nI?X!KQnnAcJ5m$;;h~5&`GjIIujQ{{)TEl*I$&;oT<;w@V0mRi^r)I5Y=$Y z*{mvQC%=8#!#d7wrmC&Ph+4rgaop+oee;$ofuXfEZ znFsVg$HQdGsTiw3|I=UH=i5$Oi!YmzRfX*I?||-*5<^su?UhaNsZ;444VhPUwnv@4 z2!B~D#GNkc?2i$Q(ai`|87KL5$h*giq~)OCGZv1XNZvJf@D%MdiIb`ja!>J?jf`Y@ z=ObEk&UIWdQiQh?L^B_4}06<}L95)oe#_STLb< zhvY7&&&UbFk&B$W9*2vA0_Fc&&Qodw{g?a39*%Vfgt9F_Ds8En#&$Qfxah9opzn&} zIElBgz%QG{f?ArAhBqU%_9_0&r_t6Ftj49_A~lm+4))*%GK_fJRAlK-rMk?~qRqGp z%V&5@8w5f9{*}U_v-Vd8X5tUi(U?I0^_7K+*?zc*BX_NQ!a8ulzgwMw@ag<5w!F?u zoR066og2Hl0Q`v$3GVfRTA{LKqNWjy(Vuu+*LH}Nx`NkJ;)!XpnO znL#>AWc)-LK7PYNR<;RI7&N*-t$FE|n+nw5O~GEB?CgMxFYQPfFSzdps95%%eM!rv zFwa+)8ZHY8?4(Y&$KEyfgjiSZdI9gx9K{&xVkw8V4Eo3s?98&Ijr#nuvTu4WUcOGA zuGryEiA}ViM`kUFq5jXe4(o+nCp6|k@DHz~ zY{zbhJO4+$kyMLK4I%DQqnb&VIQCr87JKGk`%kv26<_I$Mk(p6B$D%}s!P%d`Z4Bp zaTm0(>McWb(uptWgaH0m>1SUXpw&T zTJDxYA!_a^$b{j6$B=pVW7PmD8ABzM=3RN*?79Z8;gnRYG)uz z&n7Y`8t|^c>`qo$Dq;OjNFOaIO$Nqp3;SML~yU*q; zAO2}M?IS@Dg5@uL#d*=_M$Grr_C}G;%$1D$`6JbZP@E^WyX=@@3H3#?nLm zPfSh9 zFT6O|f^ul>6KS0oxd%h9gv$m^VglTlck?>Z&rACYbW43`%h^2w4IaurujtVhU{Z3G zdBW3Zg(*oQP_&fP+0vJ8!kmV0TBEv+4l}PrW;I71e&{p?WD`>Iu=bBB-Kjg;F+a>W zr*&w{cYTd=py}eIE9ZN|vS_zYNl*yF4^Jq(Q{kIPl6-deR zI7MI5wQD(H{HY>rr$v6Iaw}`bk}-!E^sZm{9Vo#xpi^bebh6izf{R%kPq(c&4k)ib#)a~J6+QsJ3on} zFKP*S2K4=Wk!*|weexr~|H5BqI!i4jsy4knvRdSpn(VTcW`>90Wt<|oW2$Te^%&jV zzI<|OCLI?1I8nIU%t|%t;u!Ffh(U!BpM#Zg=;FSgT zV3Fqv*>Z>c1j|{r=s7CQgehcXHzkIe9h-VSi^Xq?5W!~DKhZj9qlH<12jiH86nMR; z?a?W>4#*;Jdx6DyHdrzzPQI|68t4Jwe@RWYsnhnimaJ`DY71GbO7P29+Fu4kvc?VO ziZ0nwtL;G3TDJO17?4aZrmAt(vZWt0MFOwU)}adm!24IZIZCjfZMwj|f$>sNIKyEk zoimMTmZ1c&shIj0VMsha8<)(dD4f)}5g~1l_v9oY*w6imI@)Lx&j9?VK=+rbS$g^R zHhM)rvPPRvYl`f0*!!Z*FNq-DhPRoB@$zJ1O>|6a>6LIkAH8w5A75u6x7<)UtN0?> z8HkY#R&9fR6WEN)qsE=eLG@IBI&`|`WM10Y5TIXfp6FsB;Z}>9T8#&F!4n4K2M)lG zW|mL&cR`<)ob5#f$`k*v;U?-|uzT^fKHnR9_MiD1XDJJqe}%2->3B2X2OU4z>Ov(U z%bytKyOK%j|AYTL+l)m`+>hafbvo$mM;XpMU}{L4X6cXT`jfSt^jf&qtf~KMi`a(u zF4sf9#a9#+O|?D-=t;J8Xy>^0@oz^yP_3E~Jk9@vMx*IVQU*}(ld`C89UVV)Di$@w z`7_;qI>f8AUqq;Y{`VjLVbg4WiqhiPmCqe>-g4P^l4_6+a)V@Qk}MB7Q)zaFoA`~^ zI`t#|+L|PHE-Ko~nbVga!p-imY!3@4-0g-w7?e(Kmz!fPIK0; z_I0+JrIN2+uiA)!IrW3jqJs54r(@%XN&m6SqFP-F9+0<168zSGNpj`w~()S)p7HR`egl& ziX9Y+rFyw9Vnc!jrdJ<$#W1}uP8_Ux>(`l5}$YM7xo)Y`* zt%>Zz*jsmXftqnuL(awSkR-NiT&@F~uc>iK{r#my^^OoFM_f1mNr}~*e^-Hvw(FCT zTMs>bf1!P%ew*sq-;rGJqosc9@t(+GEUMZ~vSwgQ6a-Ly*1r>WKQ1fnDC#xX^Vm!v z53LBCYR@PK@Xu~G0tC7@!U_TSFPrTT{Hb%&nvULq4ZXoTR@=v6&b>I^`pNn(!O?3c z+;yw{slx7sT*Kr|iQ8@Gi9D0WQ|5-X1Zk-?r@|u{O5;Ya68kGbA7cRijT_(}|4)BD zOkH;;W(HTmDIO?RFY>pO9QTU)6TJ0vF|2_F1tO5P&N&n+q%qCJxhh>iX_k=?pTP`L?86D9xUA=fjE^gfV3zMqtkZ9Rc6{HMtn4%{YZ7t+F`$%#kyZT2biOdHm9#1~VOeYlX9upq1&ZopkMl zNtWCZe_$k0yhRF=*248N;>_s67mxl31#tKVF$|#dF2p9B;P>w?~WMYU!c=Ji|*Jm%cRfFv{-Gl58+QbRExCgS%{Fr2)#yw$C5c1|zhpk2_@0^cX2o z;KP|Izs*^fVBa-~a+F&9W%W!ji^C+iysGA3q6oD%t<#X3_0P8wWUuKA-?^v`QL{>_ zBc%L<5KU*FrKd{1dg333TkrhHhU2ql5jA8&l_QgB z*TS8vvnYo*C!n{tM*Iv_IbCxE@B3SMb~#GR*`gmD?!i>cdz7U`6%KG|!rNq$FA?)j zY{3u2OJtZVNM;`gYfdvp+CbruQ@pQxj}el^`7g$P$iB+13UdB}kZMCR1N5ifEF$w{ z7}M|v@BMb+c(;a;ldUFoDSo!#2~tiZn}vsX z1qwMevWd$~xbcQ^Bqhy_(W}E+CB|;)#iH)tm-_-R7QC$jUhwPkVnc0VS{YdICZPXB z0Q!$<3a#)dfPaDj{yp&@F7J-`HMb1(z1d%2wDK&|cwRvV>&@7FIChlo+J8FLsR8`+ zOCbN-EwG6Ic(#__km-veAf@LODcWv%M5Cs19dj0o9K>u2LP|EW4V!|s@JRjkE2D)K z8d>O_LJn&8i%6f6PdpJq;=3W&zQam<+Acm*pEL?`aAj+8i>VLyOy%J_b@F;rIx&fl!#HqGr#$2LlhD6ZCvv^STD~Hzq*;zytKRC;yF#T-@FI-{s$@h^x^t&23xu9_w%G zoe(8`18vbx(QOhWMw5tE7wXri1nFBi_uBJN)!2m@l!6bM#|3D zY#=@C+0-J#GjHl6K>sPB*X~l>Qd53?#TJY~#y!!D^$^cQF~hQ?HSSdUQZhG%a`I-8 zTXCR+p*?Mq#5CiN(woY5&GmXoxlF;zMJW`kqo3aE_GxHRgg2r=&(X+F&k#I9@BP`5 z?$6w4&$s@iAJ!k7KKy0Cnpoj7Z;S$K{2Y4~UCe-}JpH9*RN3g_8fS5%I@p*<2Ui^8 znRv0jnnGfFKCR}n{&hGb)s11a#%go3FSebw8(TL03mcXl3vc0H@|Le5Ok}x4iy5iC z!*O`nU98dimPBYg#c2fOcnrM{i|VHHcA$=7v4-KJ5a;-HLIMOh0I(sb@N}xC8OATB~ZmQDIX-Z`jOOi*yw%;(x0`vOSR0{}c)Q^JOoR z!w^t=9cHzLEddFm!u;Vjl!Zm}l`*_fSc|fMTEpV|bhR~wy0z%`+2vc5Wt@uX^HjN- zCGmTjy`K(HV;=tVW~E>^KPUT$UMzlH-t@9sGfRnb!cWfu{2OP`&r#D!&CyNg9kCOB zUGx|aqNxG+uMCwI0DtT@z9R-E$(O3%dc|3Pd)AGhczs7lkefX{l=G3=N)NnydLnrB4Ir{urINrNf+# z{gDcior}qE{}77_XI+!Sa8S`L3G~13A~dM)kcnnBPtLjQ(?h!2MA`ILeu*SJXYTU~2mDWP0Dp1- z{0aXsn;3Y&+=sG?WS+gP!z=*kkF`v}kW#Db$o^nGk zHvf%RUwSY1Oc56pC9iJ+o71o{cC1x<` zkzZ{8E6U>m>VLwI`W@V*SO{HqewaTs=x)TQz@#t8G>#WqYk~jEH}}rG+5gKK=aJBc zX^xV4MN!Qu>EInw8$@EX&T4CCAXffI`-+U6wf%|Z7$3B3=SM)B0K~qWef|o#|2czH z7(Yd#h%H2~W-$#W|Ak!)qOoJSbBUM954U7du1HCGNxn@V_o{LYZ3@0>%{BI0W{~l! zOd2lftnyETWS+9PPAGjkQ@L&DOk*A+z&^n28P)swn=(1q_^JPNrG!$kD-Jd@$iB1l zd7=KZLig{rlr!(0yq#nXO3M659NM!i2lPH+ZC=?Tz<)@MS&TBjC{BK~)V<>U;qg4O zPTD1Nn`gFxIE5yJ&+YWJ@dXTZR;rfqdAOGDoZ`wYVPKg%LcQ)rWv)hkRUip`yZNl= z$Aeey%4a|ue44+^xZeQydkgg6XMq3n$$xc8zu}f7Z?{|I1S{P8Yw@whqSu8oNV6z; zO;U%wI)a_$W%*hwOIIk}>B_%U1{G=rUZnaKo(uqg{I1-cok&GzJGvB&h}TWSAaXEe z8yuf4u)#0?fm^=AH|uu4kuZD5q<)@=ZWzNz@uz#n){pzbRC$X|WHR+!X?J^WSnudC zp8Ov+tLFJ&X)GBJLI^^)ZxN`!%s~DB^}qV-=vGP=^8VFhVGpIb4{E}HC$0kCTp$*ags8u+bld2Tq`oYxa)IO@$(bE6{d_# z7_In782Ou}z&_Hsl>qvtm5yxJW~&GAU%daX{{v&WfOY3n8Kl}_V{g+s28H83A1w)` zGXxs6JCW7@)?5_rH%0^b)SY)$ytO1MYwVkQD{WoJKCh4JRBxT=2D4-M7^DApT;d z2c;&!KjG{e8#Kw$@|l><06Q#9qi?GR%O7@ zEtP-l^D=Gw*qmZvaZUDJ2M?j5Co)MDLkGFV6d0a^`kbk#y=w&H!<-!ixS#4T{P@5B z{}TBBhpB%dlJ50`_G++~BZ41EYeo%maT0?(Vb5qI@EIQeKmHS!|M*Y-0{#<9z<-i# zqMpY}6;YK^q?Kovr+OqQ=@m3QJ*jY0|$L3jT%-|V=L#DM<4SW8JG zfl=Mw4`u*uy=|ZT{^b9Cntxuq*$oQ-_wOI!WkT<-ck^07##I_nvR_o(qbM%-_-vC) z+on6i9R2JKiZ(J9rP<3^Jb1#zM8{ww)7tc}G?HIod19%I6a43T!{-Mew#?#U`6 z7L%kPWl7eW@nB3(q;Q&}ME!gx&VIKzXM#PF8h4a0O0%Z?IsYEat-7oAWAUcTbO@aFR#*BdwkLR_B0`w2$=^2gP+lbs9;~iM*nAO*&QWm?v z_j=(iMH6iPo4n_$7j&JvC&#wZY*7BX)DnfWRCW`a$yKkoz2yBWS`wVs{w~cG6}7bR z6jD;OS%{;@IBKpbSrp2Be&lCr>WIXFPE8sT=rT9VJ`c%Uxf;w&TX*_`$zV7Z-Q&O( z({?aw6wlt586SzWZfnG!Q6hv^2(w1n5(pyuMDZTigr=nq7&Y?tI7VP3o^m>PRofo zbUnnjN&ao1?3nm9&q1PYuge7D|I46W`KVp(I?Ab= z5xx3Sd%YoX=XtA*6_I!Xso}dQ%TIHmdTh>&JOAd^?CZvMOIbD8p`i1`#CJo#D4;ar z-kF?A$&_f0LJvr2rzIlyvBHefpyg`#knjU6UlGF7`)9&nL#!4ie zy72a9jBuSbsZi!woI<&`b)Ht7Ii-gxmdGqEVvjeRmt#@|)edL9)A{|{IB$@dzP2(g zZ*kz2{mx{+>1!({8gJg*K2wK|79(oy)%-ZSB!_Cc+-2nN{d&0cHIS4PWK#4rS# zl17Cs~TF0Raf6}s)!`<{7JN6|7YgF=%Ek9JC1uM)j{XtOo$m4BhGRgT$hAX$4 z56AV}F&epFQd#O4E6LM|o^82MAreS{{f{Pqe+w`74bqJBW~0Y!phda!O%gcXF=n6e zuW$**S{VkzVsX|^Uv-zee{-tqR~b)4S>ehGIUvStz0#E|W=Zc7Ovk^Ru3=sP{&^nvU`{>SDSwx7t^wsB%tIpOc3;bvQ$h;Qlzy9z4%iWNT3$->L$^)%8bRT7z3HI_9 zlV!tRqPH!pNVd@}XOAn$tY#5IlTeheZP|@Iaz~4@^&J+^RM(Y6Hg9BT62SlbpZ`4$ z6X~Kg+eDmM0iNhWw8Bwbr0EoCVR8TbyPEW{Xg9*Oj$~cs`aa%@_H*0cugFOeZrDrU zKLP^Eex3+L45+G}`Lk9WiPHc|)IV;+Sun~9r-H|$J^%eqkvz=3vXFPG%?0EH4CoIN zl+JARw~93ZVtEq}pOtM~=&>>;gVHVCPQt-lGq@6OdQ!;4KyS)Pt2yJH=rotyJlri& zUsu%fg~i@wR-hg(KYR@QQw{ZVCc<_g#uRBC8S11}!{5xb`ht;ml;Bym`-7-)3t|!C z=v;jlAM<`fdpqZ|uD6VLBLSu{0fY4eqa6qCS9fOXiQP6GR;qtuABEDIv(wC2^V&hEj^^=YsLJ;D-vUb z`U5A~H0unhC5Oa6?ZbH~XW{dGcfS;c!OzZIu|%8jGX?CvM0w!;brs}uY12T_7QE6C z4s|HVYS|u`kU#sp!xM@F?F=%2|A61^Az)kt*NwWvEX8uTfl*DV z&M*v$^qB0Tt)0pVwwBwu_?M`+{fpVE+l@({&NPDSL(&<-4IA{eYX|{7I(=Dv$ zp)L+we~|V_eDO|-eJt;5tO@h~_K$J^|04q6pPuHQOg&?vNlg56-Z`c*JtU5>-jM*I z8<{BPG6su8VuNFfeLcU$`UtaO?bS0&q1R;5_Al-whO!K3i!u{JV;x?WZXOXU zMs9EXEo6I&|9#e-i?rB&XXu|NkiR34|I_}*7Jz?G`$v4%g?%bchMZ(CD1O3au4^8O z!JqQ{mq(;ld#(sNw=jA~^=5uyLn-+w@RlHdVui+h7+11AwQv&+|J#2*@t$VD$|pb~sZp=L~YH8#ZAaoY>Cm@Q3h{;jY zyI@yr3fh4FS}MF!Uv;u*9K3r^ODqb^Ur+lNoxuFX`80otWvUu{0`?DuiG$B+1`NBb zjE1#IMCbo>V2|zo;A;AkRX~->x;(?&UMrtNp4Z$lZ?Kti-)sM?C+vb5&7je1*n-2} z^s$1TuHnGro=~ktX@moWZXN(bwVJ zX^}mBk6w$Sk;*5gq=^ubEzv1BX z{Uq-h3u{$t zmS(kI6`>c{NRqM#hbg96yc$8Zd36V>cZ7iduK9;=vKa!+P}>^00?kDY^w$FN3ewvO zcWk7sl_D|0n$ec3 z*8~d2AhW$*%5YYU`T9__mRRq@M)<5Am9xM%L!pb>k&4xD6+U*waR5?bbxupQuuxAX zp^d&oPPqD1_zDxoeHzn_R&^TLpZX52?w*>(eg$7=!mloh=+OY16EuGV=1&}!Yl!e& zHc@pdEK}LXld2=~wFDCAgei3uNqegzir)Xj=Wn-_)zU7959W!zny<+H2+!Mt>dpO< zwLgY^ljQ{6+Z!uTP^~w>Uf!99B$cI-h=xyEO&K#)GJSvNOvMOJdkp-64PI!KKVpQ5 z^moz1K@mEKjfmVTSEtL3aUCMpb>AQHL&?6t{P(o~`Q$(N0L;G-=mE{C5EN7J&Iqdz z=)a!y&o=WX|D9+4Wbj{|8IfzYSKOW(+#zU8EZ|f&WPGiWi3wAGPym;i++?l%p@IQ?zd*Du{aRk4`Y^`>49=w54NZHWkSlp(N(8SKW{$w$Gx8+w(T)a`e<|!I{_7-v$>&M`MgadG*#G{|{zKPCyN~To!mX;~BIqR{ycl&z$C#GsD5mN70jhP_X56&0n(GBwV zJTPIve_jvF|G)mX|GSlHhx8ego>e4W;Z73$&-08tu9DJgRa9VA(P3luoL4Ny2ssT$ zmFZ_&=F$G6<{Kw(qKjbZ3%cc@2rzgmQrxVtf73)IONE8DZx-G$A@-t1NFYK>AHgFK ziS#-t9;0PUXIXWzFxNZ-rxYpZLuK3Spc3+l;KMcz0mPDBeLTx%FH@Oyr!2EEXn6R8 z$ARG0k&7qYQ~tE0VS*_r&%a4)Bp>&@pIl|;^P*OGPn16}nfB7RAU zZ`eeigBwBLK?ZMC8~0Jl!hSQOaTy5A@|Mz<}=pw1sMN6U_ zsUF6j#;%Ymcsn66pOWB0Rvvm4kW`n|J7@{s(Gp;9>Xu3+HrS;409ROO?2|7@{V?zO z@Arl^1%_z#8}(k~8YSexku=eOqO8xX$V+6h94z=*DS-duiGP0bU*rMzFAC7VpY&(< zcEV|)!iCRaxumr;9a9O~jD21MCfRAv)*TnW|1k=U2Ih~+7RAl8TMO%?- z#ChIglYKR>h%O01rU)zD!WY<3Su#)FC7J|7M))saI(Gfi$E2O5hxqfFKE0$Hm+UOeIO*VRF7A{t+Zd{do+VL)A__1Q5&cMYP)o{07=^Pzu z6+9?GxUs`nF}C}Sc`!;&U%B}})1fwOD-68AH(SCl&XlFLj+p34l|x^`$#@P^B;bTu zZ5?B6D`cOwV?ET<6ZBS+`yejsH>~)26WogRNbotBJxDtc39Lc(MmlNRIOIv2<$((7 zMrbQIZmc%@zx2DmH(PnXLdDqPzCiMK4oKmmI| zzB8hmcj5}Zz;1AM(-l#Rmpy{X5O9=JZXF(4S!MT}cty&x5_AqyNYrsYY}n)Wkk1xx z!ZP-KJR7?J|0C73u|cLh9s5>A$tLT}`gQbDqeHy%LyaK#bE=nQi;ZmCInunfW0xOI zu?MT|*>5Eh{>lmAYbJ|cV`BN`gOK|hZ!>`q(2?2$`Oc%R?k|nYC6i%c(|KIp; zB5?lR{2x3Rma2W~ps(t%XPI5amn9dG$-MynQ4C~Gy*!95zPrBN^zM5_D90GUMB^Kx z;Zu5WKqbz`00~6#iGf=Y7eUUw;2tNEsv~ek9~>=4O--!JfUAc1M@~s=5g`8`rCzn5 z?c&UPA$4_gi!4RAotcj&&uA{&xS(hblJ5F57~QJc>qpKz?-_OMXoE|dq0Q4Cc^jxVYcMH zNVcjDc#!j#eU;-v^l=Ex(A14(jCqrM16>LE>@~pbpHSI|8c4ey&O)f z$YW|hoY(>U*ZB&f)8!fMatp+oVa?TJ!XFOdhGelg=4acz@iL9_7)MPqcJ;AW|fe1G%S2$d%lrOA2m2UNt+PkZ-jD}@;eZ>Bc;I%gyAqg4+Szp z9~m^!1)0g7&$R}a+NOjo`wk*IbgZnpeERkWp(saG_}djaTRi*uDyM8eJiJ0sM!Nm&oj7 zRboQ2zQSL!*BCAhvt?{{o8`2&>C9k+o@1v|SZ2~{DG~5q zzPb1DU*lu|^&hSU@+=XBe@ zXs+!!Cp+xg5I)~-WIOZ9Olqs=;-6D%7S33o6ov)ez8I&B9d!Po1<~^UhKkS@?gP%h ze6xdf!|YlzGLMABJfUalY=TKe74)0`fp|mbiM6s)Q$5kj2!=C)z~C?>g)*N zX%}rTUys2s&7P;>3GLhsxr0p&?I_IAO}r_HZTqSXhVlux|5T75OT#}GggM8O?i^4E zwYXO;mV=%^{@LZ}H=p9@=x_?s2mVI<7lkCrDuu6*)?7!94T`Z!BqXD}od6}g@wsG; z_xKkt9NSpEp5_Ivp^E7?fpD`o1VSy)*3-%gK>ryUx1;6$tLqL#APKR8)<7LRPd4(r z7b8x!yzgvYyG|VtzZM^kF017zL0UTOonp^gB>7lC!S?=so#NSBb4Q(#LZ%^%Tr<;! zQ`%&4dU@!>YGlHjbN+W{gYUIGT{|*pJ+vu{I%NGNgKbLNBQs?0R z?071ci15erlXi{7tdkdCRQ}|z+h;G5O}RzZAB21Pwi&z~lIUKV#T3Sddgeq_5kGx=*J(BeEWZk#;n6ImtT z0ab#Syj2#d>FiXpzYt1U4AftG0}!K~xtGX)*{a0xsMzyw{JV`GfgKC1^gd}zNwGCR z|J^1@Hia+PbR}PV=+`R5+C9B+Po2CTcCJI-9Uf;qHw`Qe&xoV8uR*{!U)8~s@!P5! z4b3`sP?v1pztuwqQMfFtPcpuQl7ErlmM%*}&}}j$fxu!uAGY5EKG zCUF()!MqAP8S~c$dk8T-oVMe_uNZ2oat%&xfz)xco#lh=p1?NwmRQwOsZHjkJm3)b z!zl|e*t@$pKH?Hl4;O0ZA6{OPHqjV4rsR%gM1rX`6+@jCcg=16ejt|>@=k&AILBX>(vRW;%GQ)KpK_8o6OUh4-o}gu|ay(7maa2Rq9$Xp6(u4No_{5NVV+=hl z_90UV*6`($vamECo(54_X6=`3xUIfwvi&(J#;KRuVS>#+fO_O|iBVI*4f7 zupoeo@(2dKr3K;2x}j&(H?Whc$)M#3;Zyr+fLc`P1!0e)Ia2k9)hTyu zXth}=u`!G+oh8;g0Xyb?@6J);YsMyp-|)w5up3WFf$vxU^}soak%U+YEyP6`!wIzE)=2Bkgf)I&vR#&7W` z>EgrDBKNK}R3>WWLSpYr-DP;I+AnwBuqI%hL~;Pn_L7|qo=YgQwX+OWWUsFQ?~=9z|u+l@qJsgz8b#wtnm-ad6xggbW4 zhx|}IZ{P4#DDuPqum9B>|Mac@k6CTK-{b(!zX0+tHL^U!zrg#CnM%s51e||fp#P%= z)Sohg{KIv1MIP?7sHK=HSC~c(h8-fEvjy!82X_~0z0E;7SIapXNll?}E&*n6cWr&) zzYwpIT0b~_g(tG`A185%Y6ClX>4ZtvUl*C?-8=`fotX)83zfO5ah0dhEY!HeZxt%; z9?QGE{Ge+ju@#qiTzJ*WHE@b<;hE%4Fy)+xYcwNYi1lC~2}?)(bYR#6RDcEMm%MJN z+`XDbu1&qfz6JJ}sY2Hk(;rc2&>quKev~gH{lv=Md0RgY)aZ=1{K#-~5@T(g`2%`P z(Z&N)`h=AvLIi=NeKy?<;Lk+H)3107mk*GPj*V?Uqop=nXkbc>F=Tx)(gs+eOI-Yx-yI$OMGxS=4vwE}LkZ(~31b8(Ae9ja-aLE2`7^tyE7Y#q&5AB} zR$gY-DAWm(|0rRm_wEHjt#G4RtCsx1D?!q!XA?4J0-?JoU~bA@l& z-7O0*FtH);IBXrIWllmkAHS=jXI#-=3#44$xZb|}yuC^xC65YECHxVT08}-3<`v%P#A*UTilePr2@n8 zzl7U5A>pyp1^oZs{g6YfJ+sph==Z;zC#{do&m=U>RuS#ej31D9L8Z}8GjO8;?%yeJ z|LnK*=|2JfZ~yQ9D-*|?|CDbB2LpXDEZ{#Up>BpH`n88P*;H&L3GXn>7pcc!VENsa z^dm#Ch+6r@@nEw95hrucUye=e9!sTuadPq0U#J+>rE|iX4WD{#`n&NBcI8A-KJP!q zplfC|*_(>mHX@d5T+c82vOSx0B%Xo4%B)+ysI;h!yK}^rDmw8ZdRqiUtp-e>JlsJv zLeR!yoOBv#>&49;lJK&^1T>~%Cw~fZOc(Amg32d#k1A|M%eu$r8v4Y;h*W+jS{A#u zm^js~(fI$32oauAHiNbdGR!rX7=IV?MPDgW`=u#ON5g|OyyEvVI+e2#YywJ~wUriM zdAL+Iz`K#1`p6?fb#fI*{z`jcY<=-}c-*dcOj=npg;i6m%5lRHtw+9fyk?a;L2K!o zBE__^*R8y&6u7mWsPW@AA#981A%%n(jpYy`|LZ+TM0U!N<4^`3i6~BYcHf>mKBPAf z*4SOmZEV3o!*&9LohMG0qU#b8VY&NdU@_u?&CY``@PphAf{%k=razJzo?LEH9Wnos zx|Gg(Ne32MlF$w*t>&j$RK`=r-uV-x>8j+Hz*OW&rgCl4iz@q__G4D*9tin~wv{zT z_bpbwWdQnCx_~0(;3C7(&EyYX{z>{=9h^H@WN;Vhh$BxpFV%wnIikRtmnGRt=}F zqYJiYmM;m6;VX}n)Qk{^ZQhTkM_rLs$eSc0(J9uP}8y?3p|Im34^$QOcxnP3`U1mzYfmC~+#{jGP*II6$$^^W$&?S4OfDK&g zK7%9>W=pSx@+Bl)rlpH&BFlUS*ni2sS_Zp8^M9{QH|j#IO*b(}$S&4HyxU5$p?aRw zB*V>gL~fqqRl8osf9jO>DAyY%-}Fb(0RHnnS5>ec2K&Ylc>h9y{wo-Ge-{D$S$F!N zy1I_`QXRADr8SpLzyQ>C8%45Ug5m=%Qtl4<#|Hra_?SrZSfTdoE?Y=ugyEaqpt1>h z*=svVgx~wW!cUU!!nE}DE>43QMpFM47x@J3G}JGI2vYX4!zkCa&BH1(j4&>80sO(k zF}4f)u4eNr!E_tQg}FLqkY%)z1o4|8%m2^K+J|fNoS>8YZ4Av z&}CS;dfD#7{Ua)Me_hph#?Ye-JVTUyPDj$^jO(aXY*3{181|w5koC{9{y3ojN(jF> zYfC&0T>$uxvLwP!WhoQP=3Jou z!g37zL_p@10$xb&zD#ovhj8WIkP(DnG<3fXqfl6qcbuc4@+}P@;^=9H#URkVY;+&q3_9;UN_yv?0mf0UY-;En3eV_UD z!-#nMh;PUGdp1O4!p0j-dLdNkk_hokSU|dBQ5{<`K6Kahmu6jutwYPs|jwL!EagLs@sp5>exMrgHjEL2E@YY61ub;g)27Q_F|zsFtv%YS^U zzvXLI97#1qk*}At%P*b>r`J(@7g7dVzuN3Sc*|R2X>-ZKmFBYl1o*ei$Re;zU)CuK ze8iL3{~7sPN`l4xDnBGO8VS1mZs(Mw!qTT^2}=O}6B zM>>lOvh_JP?j)?fnOuiyE;d_obNBIy4Pn;_Et({PdIR<$!> zFiRj$X#+TA(rd;SJe&h}PGOYT-Mu@4PSO5MMN+mQNi(|X6|?>To!y7)&Oww$=dtVJ zcV{$Nt-B0n$k;lgHgBXTEkJUrmkmKN&hNZdQ!ln3rh6hnugWKIft%~VIYA%%=6^h_@!5pZG^D?^o2cjae9eFOKjo<6 zn=*rA&AGd3oN6;g!?i?bSDFoqQPgVm0TzhhSWC)NQx&!VfPVy+<}#vKBUw3Lz%CdI zrF5%Z7t6m-bcl7?aBM&q?ohtH-5WWNoDiC#CTSu9=x+t5aJ~1k$g28rbjC2(Q^m&F$Ku662qr6XjpC=* z;lPf%vt^3MEt5c*%kbywNBP(P@ZY15DTBLv0zWolMi6C_a)FO6x3_g8e~@;eXs1e< zoZ{XdW49n_Z#rTcNTy|wf1gwmSLaV;j5p!caFD3~K{mWqs=LPl@SkK*GL76@vWn~L z27a?O8++1K>RFm)hdFt%c^O)fOK+*WtAGT2Qsl{?kUR@70=TCN%+iY8Qifcg}X zJd1LIoF)P8awD$iZF@SQmF|Njp9a2P_&@!J*W1ki3Noqve%?>9h5hiwVW=lB#Ho;ii<&J>GKhr3}Yu0{84V8Y!Tsr1hA61v9~L5H;< zY11~rE73BW5P1KK0shIiMJSW1ZA}{M|LGqnfc@_U_}7qWPFQAK$97+#-@?H|)BRc}GLixBe&Q@WoBwwE~nIed5cDvtP@P@v0mp$GEG1tctSNh~DNx zXOw!n$Ey^s9)5Pqj7EWVk{uFqD}n{YN;CYNj=zYu0Q?uFP699Db=|d&ya*rdcj)NO zNtl&UW*WB7vpNpm-)eusI>H;$cIBj4=y3axuWM_r*xkeCQ@9nn8krk#wpbkIpD5<# z?zjeRDXmVQb!IBfEddQSLM@=b^hq!}qtTONfv#!nl|h{eHwsXb0!#E)x%4`I?BoA% z$uUI1ZjeNX*g2{>cPXDHi%aM;nPe}?+8Zd&TX7EiIe-rH$37w1?K|}CG!XFq)fo7m z{4G)Ae`HL?XR(llZnZ4jzPw%s^w*^ux>ODjSK$6{0P)`ji2t`h{QutgU;dTg@1&~4 zxA+V2e`Emu&zt@Z3g|x$>9KC=E@A0(^V{$K8`VfEbS8N$09}quX=@)v99S zuq=E1qDPwVLg?>G)I8XzPDPTHppvn{DtolvO1`j4J5B*-@{9q$aq%~~|M@AFC7XGX zen}To>_(eb7_|P+~m%_ z_%>2V^Xkht){i6EP^BsN6EY(^O@RJS5y<~wDj~ufX@N_I&YC6|O(8)1f73rn82aqD z0r{txJ~CR2Z4R6Sp}ADjF1qdIAAYYekRGfcDmp}F@TIsPxPR^$7tJ0EH<(Zn%472r z8f=u$Nd_YWeID4vdb{OVM}mqwo+|yERXglM=p2?y6;MV|br)zumRMjZOr|9Bk+vdM z=8VL1+ZGo`G{Y;D05G31ipCZJT{Y@Ev%xfg5n0+(LuYO(irlcLq+v5d zb)VA`L9hfK+QY(Hn%p+?BXK?ZHsO7}3{Zdh0RGoltH&Y#ZlIhVc=#n$>U zanh^#6icNzf6cDYYhi6D0~3oXa>AzBzmF|_P3pty!e+9lrR@t>7*OFpW5W~lfs_cj zjxwk{;c8&HmJTLJg=x7a9LnUqs~GWd-B zQoVJ95p-WRGL*vTJ!r|0WS}ub=%jPidx)FQ>`A1k#+bzrVDx?zv0wvue*pepAn^Xk zteE~_Qwxk(W-S=W3}qO_AavX}Y!>|7roH8~NEVkBPPEcjGP@!}XxB`~0{nmVy}f^H zOjR&zlgMhYMTLg1>uWdV+gy%|QSRE3$_qvh_oY8YU|1q+bE7YJ)fEY)*&O!xnNCxi zaujtIvuEsKPtj*|3fY2JlSKUS(YZlHSS*j+>dAN#~R2#xrq$k|BIEk7$4cD z>m>C=O1eW9U~+7KN$x znWOhNBExg5PUc@fB~;*`qW`P)SJ3+nt0TP^1FHl(P}Eayk&=joaOmS8ZL|gv^~64v zNm?&>L-qVz9Q4faX=6SPJyt+h zRnPVVe=oBy@clf%_iuZQY=-J^Rwf!L0rA)LPt^(jD?^Sdu9cR}nBkbSYAl^Zsl-L8 z`fvIGTEf3m*rpE?N%cyLfd4bYDML?wVG<(sj*gVAUk*K35}mP--Yw?Er*UL?$aTVz zEH`~Oh9rWB4o0LW!w^&=tCF{0;x#ILkcEijB`L6djA>nw5+-i{tmhDyoJ?=owGkPz z(PPdfMv+$S@yF6N;-R0Kp6oqg>iI*0i3Xd+dyUjEs{Tr{-|=vxoZ~T6b=>83<&RMf zWZ&DwrJUkY?a)@<^6yz7{=ozF_Y#o*IsoVYjsGfPX1$MO3GOBZ`j18L^XM?t4b(mY z`mZfgT4XUNfa)WoU|BGSTulftn|4REqmc^_+O|Y9*fcK9GDKww| zjOuqb4mjnfSNyocR)G%DFB0jPQ&O&TgrI9NSbfyWs*XOY^MRM}R*hd#SF0>_xRZw7 zEFZqY0r?j@LIM_zJR#FKy#-ypr zeEZk{Pn0j@95cd;E_L>rVB<;5vH{bbhM}(L&b)te#oiCXF?kE}(=Eh}{$+FdG(E#K zrF))t1BpAMg^cU&s{;HVwvTnBSI^H{f#f1E^k0fO5~@)8rh<(leKslyI##84>fn~l zrt~?96^M<`;p(bZv{(*z9CD7*pyz7<{&{bpF<*SU$Gs&Gf1e5IO96&z7hi()z_C&6 zHD?3f^x`>WdILrDcj6tP$d|6y8ZsqcVfPG!y=Jh*m`}zphg|Ll zda5T810Bq$Fx5{|QuWHFC~9zT_n+LJ$$fH{?*I4 zLzb6qtb(u1u6TIMw6K?jMGdUh!a<3;e@e`tJGk;*7aG+J>m?`eFO)(VC|Pob6R(Zp zyn*=xE?NKeU#WZJUjy;~4S($e^8YvfQ3X(cI|K2*0f_&@HuDDAXk?q1C%A~+!>V&f zh3QiD-Jn=7U(d)tORYr6ih{L|JBIYbE}s@3fPcR;@<}U{#Tg#_7JNboFQrT5YfxC{ zC1iRj^|t<(;ZWfJAJI-k1~|AMB>MsH?;M~zPg ziFgg4muzi&7ynY0j}FsllAB%DTe4B+Eo1* z8AGqPjH@Jqyn=NwCML2luOGcJDd0bDJ&+8l&ncO9CH(F1L36*jDjwXl{qL0_l)_<{ z&jbSak6OMbv<`BR+)dwUsIDWrdS-n)e~9#7d^ou8-wg=68UNI4Zv(sBxbRbC>jC&9 zQ!=eb;{{ah5}YQ}%W?YITm1X|ys2JcrJo2{m9fq(A90)=5h}HL_bA+(@ssHLxpK;| zr!If{;mewKQ&FUZtq?)q{4LqHNsR!a{c6)2>8F$PZ#(y zUH5&2;V)6GYOnz3!6&EU(SBK(W)5J$*?9kjnl7Uo@Si+7=8gr6qA?~u6A2?$S{^|b zgg^VSp*P=Xln#N=HuDEFIEl|>x37Q!99=oKmQxz#`f5rR3Ht#5fPsqTy+wRg+o1OK z{!4h1?s(KyJwq+-E_ASkOh*8b0NpHmMg_cCG@%S#he!Q`>A4G6VU|CykQ2@+#-=%- zKdN1fZ#}}w>8O`Nq>534s@Kq7J&!%NZ|VGiiRSX{#2kdam%j8q^H(7x;)+K+7SNyM zVUmT}yJe=3hM`h?eAy+^2mIF|ai!!h<>5;I9^BY3igD*BnY|MPqGj~$RE1&@W zd3U`>3Rs-x&?~t#Ye#;e!goU?K|KkCC_17!N4lCWS4nzD(ipm}O2{UOvGh$m*Crm$ zZ6}QOi3sf=Pe3UkElTbo>Y3*2_?I0aApg`YRJ1tVzPP4z$N8+cNK7RK=zqs=0?Yg# z+%s^V>o(&@eR2XFWF~{aly^z`utPl~Mgg*t=bt@<=>NyRf1AHUO$-%mPN@ms4$S}H z4McmKBicTy-;p?KJ(tKg`-0JVNg!B)inrT!pNwx%FPqT)>(p!1dp8H=PmG>oX94KL z1?p!yigiSXtDY<)>)nURkOHmK$=4q#x?4D7Gd_VGRp)R1uX#hgNu%n9I&y-_>0oNb zSSg-Ghk-HNuhjBJ4=yHBcu!Augw3!gE@XiJ^RD0T6TpAjP3|TGd}fCj(9R8NF>wwe zC$G-Nxj7%?p=hW`SaA?j7`?Y3mV&aI0O1rp!#EVEb=RZ|twutzBC(o=v*lE>+c?WO ze9C~+!vl@iCIkL6eMQH$Hl2<23M+V18ff?O*Ri7$e!r#E^c9P<5#W7&zc+%VkeIST zJI4^q)4YmMaiIQ{E~o+UFDB!yx$i9cJO#4J-9O_Dc5Z?9m&lb|GHaLPZXpLpl!`_l z)j+U2SSJ37HPX>(bEW7Og6Sn+AJpPvO5!2i9TKX3eKNwBfdKX23a#bQZJ*wRjptA4+hap8Z|UyK*mOWz;W;?v zqn8H%F4Gs2y<*I7`X1}XbwK}V5a2(2e#75}UP|xtRf*s9Kg*m~%$xRs9V$8eL}Il` z1+o`CZm#a01yw?FD^?>))rY=_eCKV{Gb$I?wcS1GUYTFg#hbd|8o=~K!qeqo3@JeW zY>tm&&Br-zLFTdUI_$vRL$eg`M+#*$RDLsI zkM1!Wz`wb*cI$rs+5g=qy8~}K(zBBF4Fe5Nio40$@=HQ@aTHNrR3x3T$#nk@OMSzJ zzgDNGsm)}^9+l(~0sYO&Uz#3RET~`^Z4LMX{&0sH=iK(T;RC+i8qv}FhW#3Ahm)_# zy(qbVQg-2{o&UXN*z=VQ{PiYy^FQDIoBdHgjgUM%L$`sK|uWL@yt;7%ufD9 zxuAddARvO159qH#6xD?46eqTkFS?zgUTRVUUo5vH(rh0|xYU39w_Sr4h53Fe zK1rKHr7pk3zuCn+?8KtXl!JeT4Dg}{G!I#AE2FC^GH`BpW@;kC?zJ2>L~_qQiTGo9 z43r+Edr_Cf`YG6kj@4harp>N{I2{8hek1|;R~$QDlDvFrzN~i~|1CS8-RCR2Yy#no zs{0ITe6_5XFI)#stTYjOzfl@%qJsBp<>hqW>OaQUTzEACeVwXZJ&oq9Y#5wLSyhz^ zh>!UDj6ICmlF4qjxhi4|65!p zGa3cxN>wsFe0LdO#0soha`E)^uk0t)ISvXkr z*SEdD?0&<`c|N7r=_(@IdbN`M`Lh5-8jGrQqAVqL?S+T0OdDFiG* z#ni|*!SJ0~raz5BJlp1*zUS?Mpr-53H~!Tj96Y&s+3)4}caV|20TFrw!yi&u{2RCA z@^t7&zcCW1SuvN_t_yOE*qF7kc#241uQeN-0RK@=I?5~59wT)?e?(KY-vscF0*7OZ zd*o;QAMtoLO_p$jt9NAJANV62zB`jW7J=|aI&=mO8PC49IvSCs?2fQS5FuUX35b8; z5yt_i5_n<*|3Bw855x!Eu`5V$aa+gE6=#6LRb2$=uc$vM`Kxlc&tP3!FU&LR0sJ!& zDEcq$Jcqqn`bnEcfyRnWRzI_xFNinblg*3%fRcJ*kjq%V`()iTlzJICb8YT|8)ebKB(9W z-~T1G4Wo6tJ@*n9{V^Y%POZlBUFP**wC@S4O$#0Zm9@I-PMixeMerjJNP#}>P|ER7 zH_bh0U2S~dbDJXx*T&$BmM5Tp0)dw(3f!aydVd$?k{*>nh=I{N_fAX#W^`?J51CKMU-_8)S&gghuj_L@as&;lD) ze+{jFD=%eFuHXgqKjg&fyOWX1{}i*8j2F$;4A{q6dk#fd6>_rQ{MXavJCzejz`Wqt zGi{e6NrVd(%y!JSX#&9tqT8@?e#Orz1rk-xHUCK6%1wWzg8UQ;rh)qR0>e&ES z-Y(L``8M}PeOOe)@FQnw9Zs4JSPMCdR&Tz*i`mMtV=khcq+YhYzTQX(E!zok26ag~API5V zD=|g}$YGdlVFrfvQphi86!&*lMEdZFs8t;@gHwS2tLjI+X^q?yzkiy{P=N`Icdq8QM1!`JDCc!Z$W1I7i?OI~OT_y2{SpY0 z%JGml|4Rhl*ZwUFf$lG`;r8IXn}5d0-)+C?@({=)R2-1;Vo)61k#7V7{SO<6_n#LN zLO)qzpUcnma^pC^6IHUMmu4p_e=>P`7jDqjiIu}U?B>H#PY@@C3pBHP&trcaQv@X2 zWjm_ZNk4Vdf|L6Zf(}@?F{+~QywKtl%8P#3_VYmbJ1^PQza&%>x}*n-|H`xF@8-&T zS!gi{owA?aJ7oC&j0MBJz)xLdk! zKLPb`_@1I6{p;^op;NBS$JEc0b%6e=Z!tOhGU5Lp|K1;&jmW06QE71geo$$f_G2)f z^8~`NeoN#E_^(>3?&@d9Gk#>Q7fU=Vk97Jos(%y`1}DLdwdX5CrWBazXP;-zLq~PR z_4fX{J_F}3Da7nqXQw%~utA}RHD@AE@j|$EEqh<4=Qvdi+!aKW3_3h|wxrIih{m0u zCjR;Dc3V@Ei*_nV;QdQ+b9+|zP@XtaG)tTgH^9FKcjJv*(#E}1v|tf+UADz3?snFO zD-{Uah2vS9#O)bk_ZfGu*>jD&Py=y**6 zLzcUfE8J$OMM~vAA)LI0@3EIMSA<{#bmlOHL;PKw_!tBf;nS?*8oNjH+_5`)J2BD1 zc##{si+ZQ#Ln)+Jtw9%66*O$0U0#0gs?pFB5#8>2xNx6BK@zynl}OI(`5nI`^xpx~ ztt?9OO)nj|6iqt#XUk{u+7VSmVNF&?b(WU+^Tff87%Q{po4_5F{8>vOo@(umEHgU- z1^6#oq5<{y&pr^tGfhzGS|&jXG_9!^^6{yof!&1L9`v&?M)p&rb5PgUfwkQ+OLWoj zNp5=r=V-i1k% zXm8;GhlBV_&$NdO#1N*GYU2LN$O1>bpPm zZR9q>JSREOGuVk$k_f#3|KI%42$o|rjr}Kcj8wl2CIfR>KGS%GB;|;oVvKA{hqT)Y z-0P_DV&*|2(^b%&)zUJOR+uOE9YHKrQ{D_h(KA+Vk5wH;Bf!6o@5U%0F6RNPJdY|E z=O^+|+gHVWFs=eIABTSYf2Ay{Hayc__mN77^9NoAx*> z9^Qc1Cf#2iazri%T%TdS9Lz7)|Xm%QJNhOLxjoyzELElMw zx~<&UMXuAYO)a4b@LwU$Vh*^*q8_kGgVJf^41j+(o|>FVQ}I>N_O;!o-twrouk+_8 zw#qFTRv}N()qmCuT~gH^u;7&8AXhxd@Om#O$e`e>I~gBtaTEh3x%os-zlW6fjf`1C zjxTZSl^;{c{1bDu)Rs8jtim=YNDH~iopyRQvFZJhp_IKq{Rt1$pD7+bJYU#Fg*_-a=Bs*)rlO=U#Xq9Z{{-}pl}3~WprQgLr@t&J zWxsbHJPzgA0^Yx4>y>4gju2GSNo#aVy~DIaXFOEf)IZnmBF#mTO}D5Ub1MAO$-_vy zGsk;v?Hyt-D+_DjO_&A5Un2M7$RsCa?V>zR!2eYC-u(OZJIg<3I^*+XI%fXZPkCE; zIzAbO4)4@0NvU=lV!P*Ts{?h!TPMU#A6#4&Waxg_d5}-g^g1rV#h;KJ1Ri0xLRJ9$ ztzmR6EDP|T%pTeF|wFVl?i@K^n2ba>$LS2sMAx}9Er`H(t(=ZD@YY!*0fxJ+L za~4~*vZM}|I*N($MIiopO;gpyvkzH$hkRC4Ul3@;%`ND)Ec)Z7!e+XLgJpm2%oU)F zdiUWGZOu8u>=8w?i_4OSE20Q&!kw-`el%EtS} zS;LYqCC^b{zN`h7a#y$NwVcZ7dB1BySO(SRhfT7NU)CeTx?*c%uV$IFhrH*4VB!z} z{!1NCenM=7Fhg@*yll!F|7k}=F~B`(KK2IipLz5D!x7Mg*WXTexcZ;}5XLu|BU3xk2cW-jihNu>hnQ#F}gw z>4B3=1-Z;}7!F>F5n$|N6@*g%`5+jo_4bcoq#x}LdOe%X20wkhjZwF!-vidHz~3-= ze!bK@{)<~N5G^{x%%59G1i|)Y>FW=66Q9d=X6G>CJa6$C$-(vcI&}y2@i+YW2k`#T z0Q_IT|IYAj{`4d+&1TsOl!=P=TJv#bT6SO}=6XHnHetVo3?S#Gx(`Oi?ApXJ9Hlqj zw4(2}8PE{)L>~h5&%$>(fdBDyB7j$qOwGqreQGvX%%bkFi||Br!?HxsDG$beuHJ+Y zDUJpvXx#Y{V%H`Xuw5n+q7fyZfE8d-qp}q>+Op@c*oUatp_2}SM0%az87Pyp3sN0c zWdHQA7YQM56`Z>Q{Rhm3kN!fn!2Dx-Ox`}tc)iQ(wYBe#ASxq~7X=ZnRN7?jA1KYN zPUHx18wgoOng zEVc2!{=*^p?{|u&qT8tdmb`sGKk)q^nzo?#En#MP3kf8RL~r`fv(*jRfQ+$;5|3n# zvN{k2Kf4=drFsZkkPk{NeZ~C|Y^WQuN<{!YRkrLcthQjbt>(kpVK?3c`ULq5vREeFI zu>t=@xJ=0XJ}M26|DrP(_r}^y1N;kB$tqKpqrhxM?Xhh709;&_e*Q;fW4|iRw13cc zIS2_Ti$lC8hcKk=q$-#YvB&~EVE)eY@V)+)B~Ld!(EohnAGwXf?q|b;{0#~kYjOBw z^Fl7zU^gw^=6|8RCwcvhd8p%?jweOn|IpoY?@2F$!t|4hmeWfH-WSU-QUR0IbUYz- zI~{&*i6w?RIJGLj7wNRqPd)DlXSIWhS(K?MbW7{AmH4N6dxM>zOtuwJ4g+-L*R{mZ5-|7!g;G}pjbhpmX0ssH0JToqA}Q zcMoKyk)V7VR#jnd%H+Jd?+ZZuag}<{P)TZOAdaK zCDN;miQg>_jt5&FzvUk@(jWozzCwt%5B_D--kfAp?A3Rc+8&(WUe(kNK>YEdluD?S zB%FQtUJz#o7N-a1&x;+bOvUznuk~k_6DPtij#W)7byLKHJflzj8QWFw`vtr|6j9oC zLHg_H{z9GzE5~yb?+bqwG%v$VhXYEubhkbA-pT9pC)GdsVnA3C?Zymm701b?rh0+dnr z*SgmC4{{;-AL-P!<>>CRQNS$%XE9LYR9e5Um}n0PwHp0R5rkfd3rfEa1Nl#Q#{J{(j^ClmPb+e+hfu`RIz7 z9q`|9J)_qNQ%#P=e(X_)`6ipTnG0-RP*0 zgUyAXUs6k&rp#M%{+yc)atoHuI{6duOO1Uj)UBL!6n7=WeN}fRGQ&+PN}*+9u>8V6 zNsT|5BI=G8T(|#Ma$(WfV`V+R!ZxaR}dqV#94VUF~mmObcOjyt?L?Fmf20kvnQYlu82Rauu(~(*b8WmB z+)$VQqdh47N7%ZsgL_E7ipA6JwNeKR%<3n4_e$|fXTdGg*lt%Lj|7hS6!y!OXsI(9 zhDlb-`-MYX1LVOub zqbKWI-6(Et?chg!dmv;C!hwGxb+I0=gtX+B?)w)0;Expg2BH>gwj|t4A9e(@SnI=P zqjm zMkP?5#!$0^q+^u44VJ72H_CA^noW9(K{T00)`PK=>D=WfArGFpRh3A2f6g>4$dPFu z#72`UauVu2NR(SF?s81;ly=Hc?;PIlzb4^lVYI!4O0AF2NiI1y>2OQ(<=X}eEgDi; z=fE)3ay8poApaq`J)R?S3CMe)s*e*^Z|XnPFi(YM(bI30!WX!ZDuSWh_=Nn~+JK>@|ih#k~vL zL*H4Eh55OqHlu(qY2)utL4Nej54G1>9Mpjd{<Ad+6(o(!7~39#{hNqpc>`0FW)2d~g}cdo()esuu;@5s)+ z!O#LJbAqMzi2P6f-Wk}aiQt^w5>=vFu$Ss~aa1$}15IPImdKcYUDQ4iB@g0gd{>+@ zN6+kfc}(8`%>T3i2WIO5_m2yh|4t9wzoOP3iK*?TD{uK<6>$Hkf&Skc|7eh36aJbv zUBR~%?a{1%dt^LD=E$60yk#W|GfhWDC_)Li|D{0wM+Mw}PE%L@27x?yP>;WAQVI$f zjUwwl0~BsC3T|-jZhxu?muh+_Q8`)YV3=k04yEnb&1UgB&&TPIs2}h#E<3QFkly>3 z(6=YJYnqvt(c3ThU=>*9dT<@4tmYHPg)m`upmjhHKvuvXPyAv<_VS9*W7 zya4^pmfQy&Q&DS z5+MIkua)@)f&Op(jm{vG(UY>}_+43hzxZBRmd(VKfS0d}j&!&rQr(&CP>ea05sszb zVibr!((hlYB9%T7yHUR1>&O87$7OxV4Un2wQRWl<2{!Zym-glW|D7rU)IQ4qVE?^w zPHWY5-BNgD@GzeL5vI%KsSs$W{L$xn^Z)Chkja()hJb!`Nc}=EpWAr5W{rQ8Sb#Ga z=Xzpshwq5egR2h0Bjvt8kl!wAaiy34E`n!u{T6>Lci-XwHPhv= zbI+Od!b_#QV3mJQi;ychige@|C-Q=KW5qz!V9kVfysijRn0i}o`gT>viVh?qQUAlVqV*ce3P)7Az7)h^Kd@i z)eQMV{mtD~DSl?t`LT&GhgA7J8a2fd%_uwf9?(CY{9pgI_M(1pS{P;QyA`X$er^|M{T)a|ifK7l^+vQl}CY zc33*^k&wc_^XQ{LUCwgLZNj1!jtnj z>&h&>Q)NM{|GR(XdBjl*y4pzUVMn5R()7sevO;6b$r^hh(FtmxokgV1BZ+$^R&u{) z!2j~VKVC0yeXWq*kWkRT5gI`%UZtBdhSV`&G`UBR*{YROja+31^cR5sFgdo_l>+$w zXXHJ8aSNQn;tEc}Rt0g2o8^9k2kUug0!&6GFeM_gt zJ5GFBM|6h!kbm+1oG!NH)*V^}_df^u$3y+Q0Pf!n>c5BgFCEms7~uVb2&%h!zrdcU zHeEl`B}H$ltVdoYBgb$08Y)>_n7Q%`a$_G*cKQCKX3a&H$}CP9;wwkkcq5^65AStF zZ8TCLZpb5c`6%_LY|=Q?FHfN8llEz&^L4s6Q26S#O<4)g0$g63e(G0*94ts zlbq>ml8MFfvMrrtU!pZNwshef>g^=;ExxNJ15!#a>vLpSJwC><_%#nl7q z`~`!4%l!`6ZRdK2vl?Zl)5y$QetZ_Z0rt>Fv{yVWD&Q>c#0Sl5s@N z1tQ$u;O0}zr_Z}K*MgtZf=)5r+++?P_8%Y^pF2aG=Q*|bo@7AP46zIk+hgD!Il~R049lS#z@@<~ zk{MNeD^h+{mFt&6ZgXTS?)hwPbuvVo46WMsf)ca2Q&Vy4QASTgp*)iA?R{iVc)3{f zPs_XJX8bSlyKFz6ps)NA)z2fuc(0;DXz}9hAke=t1o`g`z`yKpB2j!n{wrY7YB5iJ z7fY?AP5l$hUm(EzyB(N+bJ}M&`h$~}pbqed_9Vc+3h)P8fPdD+OeJgyvn(GWBZY5) z{R4U6e`t+3*VNss17~3VrhZ&53!ehV@vopn1^W3BI@@oQKl#s7I{FOMIuYXUTxV9i zkxe(6+=lnZWX0A6Jqyxo4$=j_g;eDmN>M3N73hBL9eTlCZr| zF_@5CiU_@G+H}DOyO%jZe{%ny{>52-1moXm6{D!^)+EQI&Aa3I|KlHy1o!v5jLKut zu?}OvOYM9Q`2Sz?ijJRy`&&L!4`sjC5+9;crc=LN9ZK#t5K#7Y&QD6IQ+;1CxB4^= z^BZBSe-a!Ux4dult3kcTbL3Qp@WOneh_8LZ-cJzUo_uYi74?EC7hN3xkwsxz)Mjt# zQLYLX8@i)kH12!I|Frl|Ivnc_%EX8!i?`TIj+IF52!!6&WaPZGzI5xf2xVy-^T*2I zQ4cT46mB2&N2eXa&w^{<%vMl#4@i{2$gaTmSGK}&gbDTeW&WaVDNW%W9({IF@yOUCKbdYvt-ojE;F)(bZ~D3&!%{d+`xhm9+D^cXXQtt#C7R=n!SXb3 z!Zl;4?uyYy=D793eA#M2n7c}Ag2kT7a>D%gFwd1ObT&~gH&^$cmtN$M?_oxq+s4Nq z8|SSWGM^7b#CWjeXvn%#Z!EZo{%7=YO^kzTl-X6A%eO1blPYR*2f3tU=16tE3laW{ zCDtuw@%mgg0_`w_nEOjrK(;i3-CuMnAptQNS2GVKUfSmfZrDa86^=&kU2`k%_)p{N ziS+*N!~K)9QatgoN!M0ay5eAu5z{ts#~`W9rfG&7LhRL|H#|<#B^H${v4tGSA0RPCmJ^r*UbQ>-YOT{oSUw zH+L;j#1pl|y>1YcLvM>pE7soi?L+r33MFZk4k%0|?JcUkFw|z$NMQQaa$z*9aM4=X zk$2Zt;;ezuwVg~?gb2)_v?NEa;9WBB!r75i%^Ydf>I3^P!eIZUaPx#a)FrHykDWbm2`?=n?02WGW+I3` z!2ZpE{}F=t`&)!%If4`^Jb_*xz3o2B?K6nK4wI_`f{Du8!_so_*4Ox%i$oGJ@~bPF zyG@Rp^5xKuKB<5Em*+qJ@lOg2uoW0Rmv~<(4f1vxCt&AM@l^I5Bp1F$QSWMavd&^Ux|-5ur?xKbtn~esysh|C+Y?sI#|09@=3*kpc3r z@J5?11cRi$!%GW)EUAw#fncKMg8WVZt~$`j{Gpkm!xtR#f! zKhN%aD=S<_6=Ad(@-O+AVnyT>oJ{rL`)flq4yb?8dNb=qH%XBn$%LLZBL}lLH^^4m ziT%1mo&fXT;{sEko}6^}yb&^&##W>dnkrwrPZ29Wsj6pfQMQ?PU2_NT&w3#L$iw%i z5AX1=JWB1)0{i#E)RDe316@X6&Hgh+$QG7A#?6iqB_nUU0{M@wNQq9~(q_4=uIz#O ztQeP&*aQFO*wh;aizVmBsVe_D<_J^=uT5*%`|%QDAf^u+MX$r3TTgM1a8E6DD~>JJ zdK#%^Y;nlUXA^tI&X0oq^RKM@RB1G1y2UM6E9B*B&>QaST+H{^PoeISh`9t0gIBms z@w;G64MyGaBwg!WrF^&@ez`1mJE;G3sM301sPp&DMfK~XUkL1?8`v%G7k_Uxh8Rf5 ztMHuH8=q3p{SAMvK80k&JylqxIJW-p{0NQ;DeWqIkse0e1P*MfYL|2(GM=>&8gJdC z#55L>`fA_RwXRrS{8TcFTPsqMJJA0#AnlsM6jgMDyiJTf>rVFG?YOV@q-h7^ks7K(oR*Zpv~Bkd#`GJ?B@st?S?>EcU0eBss`B0r3g;l zv@MKR&yeaS2_E!+)E@CaO|H@k+d?jqfx;(figb*4ANC)r0RHuL7BBNF@ITAj6-|^z z$4xEZf8t>NQMJ2}O)uWeXB*6)e8P=HNn|x;=b=Sdq=WeX3g|B+0{?g0IpI!l4r|2+ z{!a?}pLCa6wUXubw*lw6h-P*Bw~q3_ zQ%*TJ8{q#M8J74E4bGSEaNOiaKs#Oqcta?A3fVfq`IK6;Nv-&2sc*b*=OG z50nPW@BI$wThz(YXYMniTWJg;o&To)5pH<_^cob0B)YOOA#X^lBV2Q*VS8~yEi2pZ z{Nl36N_L*>q=LJuhK;f^uz3cH+Qpj}&uq)CQPc(m7GGX`4@kji*c0Lc{Xc6jEuRER5KByY1eO1%#uRpU1{(eoTuLLn<-7n76=kmw5u|-)i^(R(_;1kQ`IK6B0 z%TE@iMY4!A5?5>$UQ&rF6xTKGs;}pAAdfuc`P|Xlc@=89!8rfK;cI%zGyA=3i!v~O zQ}U4i4FdkNRFoXtM-Tl+uh8U~WnF*i2D_L7`7)+zu>X*ImOvH5@?8~0O_1Q~fI?6) zOXj2lZDv^X=T=vr?3gmfzIt{=s>jJ+$r^&YGW3W2&l*H?eoLHpWxQC47p?QhSU%5{ zgK(ZG2*ae#VM|IR@vF~^vHot%>wfe>=S}<*p#NSc+qtM;LwJ{B_MEaiST8vQ?0;Av zItaabI%_j!iu{46N9Y=9FR9x|ig;)_RXOJaQbiS!f2a2-Uh|k_hQTYW5-h32SIZ`> z4#HoYdSjVjiJRqdLzl~$XbwJRs}Jwb`F`kW5azi+&L17dvVAkl$aW0_Uw(lpVo{)JI>~&2l^Kz`0fj`DYKX z{})nnaEy2OnK9%NG3}uL_Z7sShyIHR=>MUC{@)?6zlZ+sIk5j<=KmINt+_=<+3Im) zUBt7-g)WK~tQ5!L5(KOWU(QTX+i}p7GRVB7{tK<(DdwUO%B>;R>)q-$`@L<$s191g zhyG{ja*g1#n*FPA4u})qNqsude~31Az%Fk9^?yH_d+3;RPpiYPF-*3trR>`ZEzo~% zY)$c$ylxRKznpVYq$tJ-y)_{t`7;p3a+a+o?kQhna$n@vv=5F{yYct{|SKpW(C0if0NzC{=fM<50L-YxrMdf zT(BEag88R}<4)abkpH{{_+tmCzb7(*{qeIb8>1tIXG!a$mjnCb0{!P>uzxKC_Ajl^ zx!2SePtn3oX6a%eEuZ9To zzoS*Syh-gydJ3c#!t##6`MP$Q3C&nbQ5uwXdxDIC*jdCj)nws12hi8 zO3wLKzs7n6b$pYS;@8s=3j+9?4o8Ftz2leMKjUn48D#g+h~~{`q{({EH7u+qL_j6Hyo!HSKlg z+7&Ki?u`5y@R0ntkuf@gPuu-c0#dmDR=jY_C>s<-?)45c(wS&TxurK>Q&r)wUFtHa zV)0c-N8WGkGUwf1&FoI`#KY!W!R6fp|3CdmE|Z*Ab9-Qy7QsTkFh{ACq1eoWQL`r6@P|LlG&;VV@M)w>ICEBH#;kzvo~^Jcbd9IUm~ZAD^bv6ikT z*_`qV8%sgaAA6(6Uw&j0&_Kce*Io05?93OknQ0IRZB63Uo)vtP5pT1!8@u*XOc$^X zf6#w^a{Gq^^W_P59OfQ26Nl7|*yjXdi;kXdlYUi<#$)SqPeF4l#m9yflzVr}hB+Af zr6mTF+oW$>M>Rg)!bZw=y1etvpo21u)<4McPj#gH9Tzqy|Nd&a3z=!j{2C_n$fYVX zsS?v<=OdmgnoUN;D9WhjW%@;m#jDs$;=)DmAzx8QW*yzlO<+!l8>E3fj2^SFMc2AB z%G@~!4v$cp_wXysyKo#g6IE1h)YvEAq%A4?wN04b8lh3$0`2MEn2M`8c*m^3Ii0Bs#F`T8bwr#32|3hSj&$wxdC^23|laeNxxD8b}bmsW<=*bGb= z5xp_Q&rj=#_(p{Ru5`E@KaxkQOl=u=>%&4i6t?A^eL~?HDi@AyW=JDEYF3HJ&x=Mn zCilSpU28kTObhgHey432UahN4LBcye1P6uXr@OAVst|-mpLSASGoiOOh2eb>8pO|P zs~$_yR4z3_gvn7xsHdBRE{pcAn0ZlqM1!0_!<>DTJAfgao{isCo$)%`RHmi#rE#1p zen7B|OyJe7)L7bA@lG9{=Njuut;+B0u{3o0{p@x@#Whto%jXBcE4x5B4|7 z^WC@8-Rk#ijDf|43dS>s(3@FyOmpjEKbU-qXWiG^A3taLdIml%RcWK94`>-rxLG86{Pl*%ej{=$VmSKVWp40|M@3dlPc zn)lDlJX@*v)wT`U#gZ9G_=7noax^wr*zhLf4X>OF`*~j3$7DkAlqx+nX}eHjlM^!z z*M_it%iu9i*UFjlz-1X2qeN4*u?N0)G}nK4{&V_sh?FzsR4^J)S_piu|G;#SqoW{JdMkTu@$TjEhnF*I(#24LKC@BHH%UVx-`P z&s9ni-JFJ%95I3GO1YGD$Q8RfqJgky{!U%vKHNITAXw!(ATIRpRR( zy#_aF^s4pK7A1BsTY}ze)l#SkAWpcw85T@YDcW-JWAa{`!~1*tQS(|butLNl}WBuJ<5w@ z#%9tCIt;6(ou{Px()q$;n=Xbu9q$^4XuYdMle&DM5@s`%T0!C*969J0KQo{SF-_1n zEZCPFj*s6>6?OheR$HPYkg;_T$X>@dfn`4Bb`7ye6Nm_^`S0Uy;+@o)$=64t#sK#0 zpTG>9V6cB7?kZd^Sox??IV**=vj>sz>v+D*^p7Da*hm=fM{w| zx}n7z#5n&g2@%QJ>!^M>vf&_Wx4~(70#@hAuOW5_;t9~7kIzq8SXx9XDvCHtN72Vl zy>Ab8SkBz6xY_12x4Hd-rjzevHtsZTY?DhY3P0_lcasx@(7ZhnlM|fhiRKjk!3phR zNR+Q~zCfWX>XNcQ);(s5;vvn;^&Ne?BMhaz#%H>A31j@SG$7?~wfGY=i`wH|glqK8 zP@gXa)H~(vV*+hL#0`ttB^;TF>%L|Qk0sASq5qK&xvi4~z1nXE(cvjv*|bG75e{~; z^0BB?qwdc7Qgp2hSdz8)ZxDaj6sJP?_jrpNW|1O9>8r2yA^BV@o;Y_cl-qBHO`5mi ze^t){tM1er4PlhD0;IQ+%6GzTvk<6_2l(Fy5V3uVoT7J9clzcOVBHr1(wktcHm zDmmEF9cuv`sYmnv=?VD-pVnC={Tp%wwk-QAisl~bQmp^qX15rQtFpKJ!E~;#IwUK~ea#(E=|fKmo4O9u+MXr$ zSYRF_Z1Qo_apvAZh^2z6@5)hI?BI(8=QflAeSYs|P0*s59sGTXp@j>Re#JO?iN=C@ zvdArPx~*Q0H}u%I+t!ZU*`KD8reiCpm-S;#0(cC*&P@fRhvoGx;#AU~r&qU4F4utl z8+WKo4!1d#x`{V(djjF!#)Zb-MLZgnHap#J)^qio7-X1OPGzw0Mrq3rlf@eoBl+_K ziBB=^7n23b*L!Ueeh9 z?3N$<9%o*8|L3zVUl{Eyu5Efz1)XPn6x$xZ{YqhZvST+Rqms&V6FE}Nfh6=?a%5z# zby`SN0aY|H4YO@jD{(VL(q?{B@TXm~d$OsCAe4C|P259fSwBnBspju;&|QMQ*bcku zeEWH-YD5AIZaYvcsa8!;nUCMrc@T3=N{eVXeQbl{BH9KiktBXS&U>qBMY0*sD_KrS z;!yb`JCCM8j@7e2VSRT2@NZEDp%qX3<3E@iXZuyUB+PV5df(DrJErh)H}{g@WFv&v zisSO>xdcLpj|uSKWcB0&{u7lB7*q`MtilLw#%9XQ9yhewums7VRS-q%S}sc#+5w}4 ziC(n4r?Ie!M9AekynDYrxF&6|PV!P@D7%xoSmpX;VX~S0S`UXUVw?<81@>=FF-pUk z!2Z{WXtSqs!y_Mir^?;z3yL%2uW4g`X))^kW7EY+e5kI_NsCI&a217}IGclKXsrpY zO~LL^Fn{crikw_cQ+mYM<(BW3@$mgq1Vu{Lh+5ozqt)54+s-H?>jKZ|TCg%w3Af)z zoc#LbPuTpe2!}HIztqSKI^iRXNT7c=G1{7%N*wt4v_IuWN6HlN-|&I?58=|V*6>bt zqqh!e2|{jVFXNaQMGYAh%0J;H(!;NKnq z|K= z)p6!hDc8g_s+mg5Uk1aAD(2nOx1@=gSeM&7(=9i-W+n=Igu(pfdcl9$D`u;y8C1~~ zMgFHbC_dV0hwX_H$tS!~?kp?*YlOGED|9$cDS<@N>`TRgylE90n6tW!0df+s(|qn) zN=>Uz&Qnzcdn^G^-qzUG&Iz_M-z+utoHG;w$m-4;YRu~DH}bDp=_Z&rTO{FmxTHnl zERTM{h+v8Mo7M5v&P62tK{dt0a9XjU!Y#2yteDZPi@tFC-#x?OZt)xb3_L~YL8l8^ zS_$eA<5*DoTW-@Dl%L*4cPj6dvOJlhd(15_)u!HlrQ#v?DnZgG5cEf%@e@vrWaNv6 z3H+uIF6n$yIossu6w1AMw%zN8G_zGnz^DQ0|2D_HKe~EMPK9_9QD$aPg>}I*%r^{Z zjoLEZc`!-kx{14}I=?V)4s*=pU`M^cYzsF!yH*k}{Im*tdExT>YSk|_Ji+r{-E=LC zFX%%H2;Vug@8k^;+c|G+6Qm=wEHa{i|MOG9bc^{L-aBQx8yz6?@(uTQF+7?E{6{V@ zXh$OW|7Spd+sDXEM?HmB^fOi@iW-9{J2580f*0_Aj>>3LBZL3{8r1&}`diXsykvss z=?NO(|Mz*QWN_%)%vV)?m6}fn{1-{ggZGb7*FWSL0RD@*B)tdzi$OMy?jeiR)_Enz zdE$ah_fe;vXd6?cM*x2-LyUJn?Em6jxcro?+k-S>((+$mMlxj8m%Mu5U--s$O=G2LlhgYgFe-}{s=Kvqz|1YW?X)Lc@}R;W5#+Q z#4uaIi#HDIVPWqKpsuE9)fet1p(NFh<^}wJD}|g%jz5YKa+Y7Ce|lGDOSz*l{ebKq z&{mtB|{4qCZE7sxzOLg{K*fgy5R==M-d$6+(KafnS+j& zwC0=ehK>OGJdsADij$|m?OXM#3HESxjHwE48(}pQo7U?;oG%-C*NW_sn2ZLVN!&!T z%<4LIboWJi8y`Mb0`vcy`fmmVHRJXQ$7i-a>SAWz3`l&Yylyab4#(L<@ue5{EZ1iw z_btSwiZ*@z7KG}BJtdb@L~|fDvy5R81GeO|yFtgtFY@ReU-p}% zD!|5d>Bv<(;4QLX|BOVsgxYjSD4?>u1szGhL(o7tI4Gkvp1J&b4Fy)Y+$WCHK`G5>fP7^>1VPdgptq0eoG*(nd@(GzO;YM_@}6mX0slSRPEJNnc*W#fJn26t8kLOC4pCMaP_uyu|AZn+^Ybr-5z_sXtOI zK)n3<1^1T`kG2x-b=ddSfe3)V8Up+)73jY`@c&x@{-tf;f8K!q-wNPQ>;QjC2K@gF z;Qdtt_|r7NpOgXqbPe#Q41hlc0Q|`hyuX(Kf7$^1SDN7c#RvXp1m52V{9{R2J=C>m zDuEU3Up?esZ+G=sb_ugu`QGBpmOzfd{*@IGVtn~lk&|T8Fbe3O82VM^0sOI87V4QG zzvok84f5~kCt1(!zOAD(tX(ipnqK~tyl=fpnEYpdLK}pq`i>`V?3+{Hn_&e1LG*Ge4|s~5PM-$%Fkyj2VuYAq{FGXcIDY0ON`lR6?OYLRJ$l- zsT8Dlbdnv6b^9dOk(<9fm+7wNg?b0*KYABv)c-LjyL9Y%;D2J{PbIK0mGt?csxt+H z6-qq?`A77{1OMkQbV|U#_`5u*+^vD(4dt*;NM{GlqEWQtu{?cD63`QmAG6LiSUZ$!Z8tNFNj zy;eM{4*RP#{GGrmg*y;- z3dfVr&><$-)aDlZus2H4bpJL9=nuAf?ST24m8wD<>L{0g`OhKdYAD#hy2!ii=$CG( z?fX0>pYKc0__6LumT9D7m)yYO;Ah73+yvO9YgK$b)Gj{X^+MlHQMpxu+*4o#UOJs^ zCh30Zyyilf1wV?9OMN&$3aT`pGB4+)5vF)H$am8{1o96Sfd5ti{*kZ1{u==Piwo>u z3)nw8u>T{_|B?sxpA7VmsDSlJ(zzH0`o60Q~p*W;~a8SYJIPe_K2H&W*oHhRY`rSsmKO)GP|L&Ry>e@ zc@x$Qxct1WHZ_9%M>~M=^x^$ALoL8UA$`z4PEhB}>Qj+>PZ8`@xPBOF*R!Zlm6;0z z_PoF|gP4x5^bvL!;0a2boY9E63cfyL#Bx5CERxCVgLHo zcw+v4%_o?zY(pbH>iKzeXWXt>*=q{&CkQkApGvMw;R|WEPK9$l+CzGyfX2-1ucjRrVJmJM(qq zDcY`Ff!JJ@p)uD~q$Pyo$pu}@LLZV8C6QK|cbiXjUYMKHFxSZQ!RqfAuYyA?;wb#; zuPHLxuQ#Ql(ydctEy-FE#@?Fe5L#*F^Mk#Rj><*1@bNdwoaFJu>M;=jdDDF3?jzQ}* zn!4dk9+e0ACo#uZX_=?t*XBH8t66z(QU|YJZHNuvRmPJB;C+Hu6r*GfgY#$4$y)eR z3p^=Tt6L{GpP00Zr=h=O^@3Ed?;b>QzBuJU-yPY}jhG1U-tXH!@3EX6qdAEV*~Rhb zewnRrPJd&xuA8om+F9CGVZGGxL*8sM*UF}K@US!9UMhRfq!h2?o6+Q;4-OGj5s$N^ zfmkZE<}Rha(-w~0G4c~1^q(0){AmLI2M6(o<9Tvl_2WXe_rU+6f&VoC|H}pO=M?zg z1&BXWApcjwCOpd#1M_cR!dk_F|8YLl|3sZcI!-DRSq|3o{+sHdeOglqg0ESYy=job z9Vx1>o=RuA?ScBEmTq;x0mMHj;9sVmdPcW5#P`)l!xu-q!vwiTg%Z?X{uHAgBJRYU zzb{*)qw)+2a>4$m$%RM?1GD}9sZn&xE9z+#B1K|VKIWan0B31Tj<`7nR)1O4;j8Lm zZ@1dGJD~p}Z?ur6-dX)Vyp%4RR-$OlD4%YKCZ*vNZKQ=`?Z#nUA=sXD`W7i1868E+ z@#Q?z!Robbzhj@8qRM+?e2P+IDZ`h3pJQ)aNX3Xg?QTdcjM^3YH4eLbh!py}#jJ-g z&I(jN$ujwS>BlbfFa8yohLb8#hVV7nIpta(y9f?HWog6o5jtYy*EnFsM+CX^_sG4M zZHD9gZ23OWQctZaTmN(Pt37X(&&dwi32hs3r3SNOe~atPyWvR}NHIAksSB+ha>bkR z@Q9)}{KvU6?5ee;oHt)AoAUOgjcx?6K6l9c1^ORv)tP@X2fQkXzy7Z(cuq;rYGug5Iao9FZAx(z_ z_8-|gBx@h`-xdQneM-r*8!5{Mk{dE``Oh$?o-;d`&Iqtngo`9y(@}o=j^@Yk{NruN z1+7On-{I3If^4dz>6T`v%!$&{5vl&X#{TFqlM-`R0z zT;2I?x|lPg$Z49^rPsml9AfusDNaH$`&I6P+*AoY(;7=q0PzP28!23GL!YGy=+8_5{>^yM|5Qv@-Yy06 zC(R)LBLn$gAMn3M;D0nA{sn>f2Lpy-0 z@vjG*&jIp3ED-;?LH_rj%zN%aa;@QCYE#8eM7TOzcz0qjEB2rFO1! z)%^S6Z7Sgznm?}EJWLXLpW*HGSnFUjky24*-^2{e-!|T}`<;p^*g@8RpKycxq%$lNIL%Pyt&r0B(jtk`&&R%Onyy;%S;XV1kZOXDx(aHr zY?*FHmTmGYwlz;QM_rl699_Ll=DPRct?ij$O zybqIv4`f_Ri77frWieEL?SJR9(=1-DyZ6B}p$Yi^Ax0!U0bIuTs*DxrA1gVgd@=lC z%}0V!M>wpzG#ID;W0Kup^CJh=W%nRtM8`xXi`^FRU&+?4icFM1B&D-8cE^Uw(+&A{ zS2LbK6_>c`#RPf3OHCfMuvp%J{pbI-C@?O`ac+wk$ebp8XR1bell@lf{^5U{B``Ri z=-O1s=^C;rR&+`+&q(`zZKS%Uk*@$Y$UjF+q7*G;-w!|NUp;eIW|TI-1^M4^kpFS6 zsD~y2{_#fue^MX7kZuC`p8(Kbe270i0RJKb{pUL1e|`Y}(g*&h4)V_zp#G8u{?~7i z3>ls(Wcw>?=2Ox@OI}43iSjW2P>hSP2nPN~{?l7ZFND0kj(q3F@$i-FCp!oq;|;Hw zg=v>{@`mnugPJ|+&Hv$#rta7*-R75s;flmhFSjWgsi;Wlev$zGKMfj-97jHfoZram(#Qv@K1y}ra(D| z=0i~Ks+Ui2HGagY<4ne|F`ic5O8w)XS5?%?B4+jKGQ|0e)CcDO82L3;=Z9+20sqi$ zrfN6fAM4Tn3+DgL#aah*(EI^4^hU|&>j(TpCb{It$NFC&|Mdak<3z_81o(?@PN^`_2-PRJ!2kZk ze>xwr{>%SucH#8Zq_{uf-|3`EKO1x*=p}W00sl(^uViya#?Y|1yrb|`Qq76QoH`+* z>!9<`2cCCJVE%>~@ISr+^-nT*|49M<`Um7+sQ`bY2ldZW@cy%b_g@6WA7fDeM}zmj z+}8RU3hEyWVE?Yb{{I8@PYKvRAnnU?TL$wtA3^+iz#q6l{&n#`{duR#)k%n1SRvZX z57DphYy&#i_#4K>VGnz2e^m^^d1yO0`jm*-*zf+zGm&%2cS52`7@y!~Tha7#8Az z|58rLI4W`Y0sms}7^tfT`Nu%OqAvo}KZH>skD>pOemmYbg>odBqNZWBdVZ<52KtKz zaenOd7{uva2f5?zn_yr+wa@uc~#u~xacsAzdjnj`&a+d$4xLq1S(_oMpqXTdDP1kaL>>V z{@Z`!lPIp!xR5*-uQ1?O0F?rQm*yGAnTTnQd1T43&_(-6G3>_zT># z?SJu))~_};#&hdHhcA-z2@lUd{sGnh#UImo`~3e@PU-BsLvxI61=%o!Q$Mfvb^16? zQ~$HSL_yYn=Lg3U_bSMS#PYB3=t(?aJ|DuYbSd8^WX!=XxK|%Ea z0m(VCKa2v;YV-Q2ww`3wFT9n2S=+5F_r@yC*~qKK@cLgUpYIS1KQbh1X-;wKD?cn7 znLJ1y8eg`wxdZcGvS9v^8u;Hc;D11W>;K2!UjGk&SONaW0`zAe^atZW{v`wa&kMw# zVBmkb0Dt%d{I3V>pWT7@BMsuuE{H!mApSf9@ka&3A4}kWq+tGy;D7Pw9MoTVVE#=G z?B5H3^NRuh=rY*97Xjx#@V|Zq@uyx*oBA2>|Js<>u2P7nt-|3pMm1?EA|eh*#8zu! zV;9aG^Ntlk$s92%rv!$pxz3k+^~uv|Tdq=^O;FutM1&{ugV~6}?QZXX=qgl9L~@55Jvdv4BkWk1v5w zT`^DFZl$qyu$eZ}O8z^}R_7rIVt^^wtPYiE)Xun$y9vRVCuCy)Bd-t+?QC4!q9`{W zBLpQlVc@m$Abo?PV>Rmc?z5{tyOdyCN{B(hQ|NR?%QmVRT%Zg%ecK`$a-nKa?CWc(1bp2q~>7!aZTQ?Z_>Vbce|A1**zKd0MKD7E1N1nh)#=(<`zfD?$ zmwI=*sHfMBR;KU_!5>m_rHpGDsIK-K4qog3g_kgkMbQj0FBz`-{Y;~#O8+^DEPs8@ zb@+?S@>jRsYo(mJHRQA?MeXl}wc`O%>iX45MZd)E9lZvU05sNGX!|ApU~+11tPY((DLsOC)s7H9z46nFwfd z|0i!qjsM%Or`?7EDJ9>HS0<5U#m#%+!s-4}%(iCpc{)c=yQ7g2~rwQX~R^x2d z&zv-muVeUb=%GiGGGyPoRPwti=uRv8UDI~@#>WM^mysJNsD%>b9>~u9x8~Fv!#g_2 ze@4#+VFSj!sc6GIiS)eoN;^*P|3uhz!;xzWgkq_#*q&-bd{i?r$+;%tQ1tIj*;D5c z7WVyju{}jksV$K-r=AOb<8FjHx4!4%G18w%O91?@x^h7OG!@|gnn3^bN@J>e3Fw~^ z&-SPctqDBKfdsnkd*YmJQNC5pHssr0{!6wdVO8E!J%Gd8GW`isgvS`o$$VlZr{yPD zg%rt#coOR)o7MSG|8Vtwgwv*m&#JH=EAFVUnJyJ`a_NuIDYtKZU@I#JrIFIqK|&7$ zwNaAxVUd`h_f6}#yP!8$tP0XEvhkojVU@T!66LB_Z7PaLIM@81s{;zy%G*K(a&RXb zo@sb|Sf8m=F@7*F+oz>GBRz=u+rAqEFn>vF=Cl6QocyTrPJ((xi9R*=I$UXN=N&%i zKNf-gXG_38@(#=&iyyNa@q+zJgNsgG3pcE(V}<|YKac|a2eZ#umdnBZ^KlI-`gY(V zAJkK!{!Dju;JcyT_Tpd30cI4>?RdEStfoexfC2$m!!^lBXUn31VxLpd{CcfL;Fq-J zO}y>9Fu4MV%AXIfE$kOpgTidJsr^t1;UiiJdSqi^pBO}Vb(po?1H|Q^oD5=o=Rc8< zrfv2IuPlKsulj;P3Qw~QZD+pgYmT|!dNtNZ=vpNE{X?eDH~QX5s^pXmXba$9$rX^M zN}1tf#4eE}D?`lSH=&EhE4l8>c%vt;f|4rRak!7odC4Rdm_Ypz8@&t;XGXz%P^(Dx?YlUkk_A4YrNHKD`$YJb(0RR^BTf5IJ(2xySzU>A{_O8f34_|4GD&(z%Q|?r6y6pcZvwrSohljD}0y<&!9EQ%-Rvd*Q~kkREPD za$r_o!B7Sq%&;@!;ZhM#gbTeN?5~id1wK;q0_|G$-jSJGH>je`SgN(?+jD{&GozF_ zge`Myd;foV&gMemq}vBbz3wWbE)61*&$T%}<|Zo3r&5s)eQP+3Qyp# zwJ%cth4QNHx4vR!@HE$`te?{w zP#t4jEx61h%AKvpL(YwnvW3TzpRTiPktgX}bu19b)&^%89rCJwg^`ZE`D>~?dDVsT z)`^NOb}30B{`m`-uQ(S<{T?s$%i+2=1n~bEQ|g)dz$V!Vj>e)fI4>XGAElCq_a{2l z0@y$8Kpp=s6W||c1^+*Ajg1Et$S*FZV1fgoFN#bd&KL20q!(Hi5=(AkKNrEz1_ z9q}xu|NczG8GMAi={M0@X}eQ{2g)F20{x{JD%KTEaW6+wW5>ph{&GJ_I04|FGctN3 zn?Xx{H5ZG_csm#GLuGnv-+%Kusz{gmIQp+JAM}Jf5ccZfd?UcW3f{k;>Uv;JUtoFJ z?7&Vv6zG2@0R4ky^;x9wjy3(q8<2_AL`%lk(`0Py#bxNo_)jsEEfm5Cr zZN6XSJ=~vc>So4iaelKf{REvkW&U91yrjIHOr{>X;TAb6uM zn12yGpL*oqxMgrl(*EQ?Jrnf=M!DKQT-928*VK;Ztc_WC-!C5en{h*pEzoAW!nPUK zX_6?_PV6{MVy^eHEuCf^FRf3B_0oVXXT09P9fH#Rbw-~&6bJCH@t;g2z%QlCV0^}$ zi@7l}ixNaMWR1@4Uf}#a`Oq0n&cLVO`zuW02ZHa9zTfZW1-C{!Zl_s&CJ7Jx3qRFp zaWsFNd;hHS-~WGV?fD0sFAr%$VpLjBWe4|v)$Y6+Bxo3R$8%)Lo-)x?p51*F6>e|z zBm|pcw&KU5ieur(9)8w;|KG2bwb!tuPAjj)-Mu%64tile%y}%m#=NFB`AE6v6M-yC zeX2vVBiad^a&t(sN`4>2{}yK}d{=B>f4}E8WrdtPw?C1pOZT%RDj}#+xk$9lk~A_3 z$?-Vf;WFQuvlULq)_xG~ew&=GN9~P6GnKCXbPxL-uzyxIBgU~z{Ai^cO+91T{1#{D zc`rI>&;qbO={24$^%d`;a66EHK(bsLTu`oIw42W)4VAa+FEv`6j8IcfM)(u|Xa5iX zAK1S(Wv*yDCPdH77oI{3{y*^lTT^y{5X##ajLSC(8OBdS@AuD=35fTC+5#FxSoyNL z&+4n$Y`3+G~0o?=l zf0kXXt;s#FGq(YVva~ka2um}S!w(GO;s5;a-Mp4kzs%b&(Bax3#lDMI$`HR0o%Xzc z_wVlh75oTxU9ayka{lJ^f8NW$KnUE)+ok_?OLf;V*Fh#fJas zFFOo?fA=1*ep6%Ontf)lr4Z2`LQ)fxyzzhh0s6lYsGMi$C`uUB4oA1xNCN}=XV6m` z@dRoR%ec;S%t4SL{aB!WFvmdz&|e}g%&z`_acw($ z2cz6}w>#6}iw?1emg}hkYwQbdUsU7L7TuWVbU*p;V2%DR3N{TCBE*(IuJ^RAxfJH3 z2P*LiGS)WtgT{Y&V4~mgR#fYv!A8>icCEn;2_m3h!2FAo`>#LMjso5v2rq#77a>es z(qdXWlHWlg_HvECoq}77)TU? z%mV)(Lhe@+lE%OQ|2dW{M{awlY{xzT@E>>|eDw9aH{K3~V4b9@Dy3sxscPb{UqBNFcuq)~ptKY02AEE||V32Ln;u|x*z{IZ>J zzsbrOvN>sGLCl_D45{XgJkj5Wf=7fyL%7hx2mIe{;`%NPvd9Cb9FHR1 zDqvxkApf4^|9$Ee0RKPuqWIWD4n|Qx{(m+OJQVbt0qoNRjtEkK{vDpN4Du8`YzIT(2Kmv0+EZq< zl%CrZWmnFB`}b`p1f@s80RJwP${rl$?r2A~BSzgVSlP52D7Rcr@F%2^(|eNAe&%xS z^Zt)TTyO*6{$Iv4gh~F#{~p{i_%_PL@D5fUFc*-2=*JS}qDl|h$!Rv<6=)Vy(pPqB zyjk*M$a0xMYQ+1^tkhfwA!{Reeui>dfaWH&$H3J^%)V+Z&50$M4}1}u z0vAS8eg#?KW;)4fUb#~9;H=B)somTGg@}2Mt}~Y?+o;z?=@)ss4thBjWaFbMr}kAc zPw@AJiTBb)Y&|KgG+2j8y;#P8-6^D&Bmy#=NMJNlId&i6uX33aQi$TB{)_?c>pgJ;WT&5;%t5*GXPG6k=!zzn=1R%_5@&0Q5<+D+$Dv_-9rJ&6UJ>}&m5 z!kWt_mvbgxUXAHm$S=ycbrvVYJ6wP1n_5Vnd-Ek3ZAa+D1H6mgoU5e?>PdaP+o$*g zOV7ER(>e0X`c(Kd*uVC`gl9#+B)Tl*{NGm`n^PV3W?Qvus0z#t;bb~RBIT6wceuWX z)gH;WmPDyU3p_jhNaKu^C6<)RAn+%wJ=*Yr^HHLW2ilDn#w#PQG#mkQ<-O&H~R z<+{Pj#S)pu`0H)y20?ku`IxVaXXy>d%ahP< zRq*ZO7^F(%S;RaVkbY_jN{j8Um7RMR}a#T!kr$rX@$8eYBa zeAn?yXl1~~32HzT-eH+1{Q|P?H(yc9w6zJXBZpm0xuQ{@&edt_fnmLS?GP;3@E!cV5Ih5pk#N zcj~s~VWoC%@{sLe=YSug*}=izt}GF)M%~gw7XozKGV}uTnKy(-82ssNlDR3s{$*M( zz`s5skyXco%8C5?YcPC3$x`XyYm!HE@FOBfQ&C{gB1AM#q;-$1d_nxWBSdnv{bxj< zabl8;v(U(SF1}aFnko^Y9>kq1kU}A{bCcOtv0WycxzR`T>k6#a1djC&8S{I!U(^aZ z7w0H+bIn03uBj2fweM`aAYFX3Ilqks+WcVjY=HSthZE?Fh_$XBchV?;zx{tit>^rU zWk9DSG&cK1KpV;XhT-qnA-P#yV42(_0$~8+Ds$C{T}^X|6AkABbFhNb0RMgQ+m`#p0i{2`o{&`KzRC5D2yRO zoP6IS-$?578KMjp%xqDyl*a72A)>0Sl=Da0F6Hz?E!>l{-}+q>jpjLWE~$-XsIj~V z+2lSr=R>c86+Fq5P@}ziCDEm>AC>nb4Yh9Lk_$T{&WS(apQ&ZA<6hLNjLro$jW0if zK!=2p0Bj}{^5&l%_H)k*2@hw5Yy|?j$i&;P-S~!LiEx@G<$TV=4HVDr>dN9 zI38NzcEE`vC-s+Y8r*fYm5XKfOe{#{UJ}6 zvjUBi9uSDLD!$6@vE;Sexwj}m{qIte>z9^~laK3CStnARh`y0`Xu4R=0l)fBNJ_2lh}QyKakT^jZB0{s2J99uui z&D>JrBYmP58cc4G4ErFsL(lJfB7JyXyV3QB~bXE3!61IBqo9bCwNutlV51Z+D(aHS!lb>MH>7hZeG8Hi2UE8IUlqG-25kw11L{RXZd?$#RwGR|v{C=JK_CW!PU;*tLnpAt z3ZCw6P}ic%*N8$3ShLeSD}5`O((U7qUh*O;bUGyubQE6gp=t)R!0ff{t><^u`B|pl zWrmIlhQ9#ELA{^(%3EB(r|{8~C}V~&nA?16T~?8Psg6PFi$LO>GBKcneFCPx)*xs{ z!}TgI*h`O}sN0Ng)nM+X7deq!naPCyIVNdMX|eAeaoh1%zG)>GoCSHAuC@}xOgn@Hxy&cO zsVh;8My!-FK-o>oM9*r_9s@FKOiT_q|Esxz;a-7C0R$hg?riBjy)s{g9;hx<;@LO!;Ze%EN_abTh26lzj~UpC8MwK% zt#EqS7u8QMff!PcdN#IHA}_eRm%l_m^|B+I6`)6@I;ek%ttPp%uTN+EqB>LdA*rTG_6a)d1H6OhV6J3jAUVF zN`@`VU-j*3gdaN&y9;phLm$pL8J3YhTL)DOVn0##c*Ihwx`zjOg@7>tjbCpRI&(il z5o4Xqu9!A&?Wr-&+o|d)?JUS3cNIVRVe}F_c$B|sbU2SO$C93LU8}-U3<^D=0|d>9 zqd(4frc%F#Cm>v}Pd3p)dmR);qdAQb` z=*{n}KuH8UBJ|j&jdNFgC^tA-*yfeZegjY^uH!F6?!_UL35`WA8xATOX`D!$| zor%IW7PH1-nKcomGR={XOmY+(A}B5&Zg~68+#fVrk~^nV-hHgs?GV~%91GQ0T{Bo* z?OV|Hqa(-NF97~Gbi(c5<_@uWH1I)s(h5Z66N!ZWiPLsBuDU$>sa%G0-cel*k-&hw zvmXud2d0Z~qrjbeijoCTDyRBC%#TNKOPJ