From 72bd334d655096db95628f6042ec602f24c13bf7 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sun, 15 Jun 2025 14:04:14 -0400 Subject: [PATCH] Very experimental attempt to move the configure_fenrir script into fenrir itself using the vmenu system. Lots of testing please. --- config/keyboard/desktop.conf | 2 + config/keyboard/laptop.conf | 2 + config/sound/default/BrailleOff.wav | Bin 96080 -> 0 bytes config/sound/default/BrailleOn.wav | Bin 96080 -> 0 bytes config/sound/default/ErrorBraille.wav | Bin 48080 -> 0 bytes config/sound/default/soundicons.conf | 6 +- .../commands/commands/apply_tested_voice.py | 69 ++++ .../commands/commands/voice_browser.py | 255 +++++++++++++++ .../commands/commands/voice_browser_apply.py | 21 ++ .../commands/commands/voice_browser_exit.py | 21 ++ .../commands/voice_browser_next_module.py | 21 ++ .../commands/voice_browser_next_voice.py | 21 ++ .../commands/voice_browser_prev_module.py | 21 ++ .../commands/voice_browser_prev_voice.py | 21 ++ .../commands/commands/voice_browser_safe.py | 170 ++++++++++ .../commands/commands/voice_browser_test.py | 21 ++ .../vmenu-profiles/KEY/fenrir/__init__.py | 1 + .../vmenu-profiles/KEY/fenrir/config_base.py | 302 ++++++++++++++++++ .../KEY/fenrir/general/__init__.py | 1 + .../fenrir/general/set_punctuation_level.py | 51 +++ .../KEY/fenrir/general/toggle_debug.py | 46 +++ .../KEY/fenrir/keyboard/__init__.py | 1 + .../KEY/fenrir/keyboard/select_layout.py | 74 +++++ .../KEY/fenrir/keyboard/set_char_echo.py | 50 +++ .../fenrir/keyboard/toggle_grab_devices.py | 35 ++ .../KEY/fenrir/keyboard/toggle_word_echo.py | 34 ++ .../KEY/fenrir/management/__init__.py | 1 + .../KEY/fenrir/management/backup_config.py | 29 ++ .../KEY/fenrir/management/reload_config.py | 30 ++ .../KEY/fenrir/management/reset_defaults.py | 122 +++++++ .../KEY/fenrir/management/revert_to_saved.py | 50 +++ .../KEY/fenrir/management/save_config.py | 36 +++ .../management/save_session_settings.py | 30 ++ .../fenrir/management/show_unsaved_changes.py | 66 ++++ .../KEY/fenrir/screen/__init__.py | 1 + .../KEY/fenrir/screen/select_driver.py | 52 +++ .../KEY/fenrir/screen/set_encoding.py | 46 +++ .../KEY/fenrir/sound/__init__.py | 1 + .../KEY/fenrir/sound/adjust_volume.py | 43 +++ .../KEY/fenrir/sound/select_driver.py | 42 +++ .../KEY/fenrir/sound/select_theme.py | 84 +++++ .../KEY/fenrir/sound/toggle_enabled.py | 31 ++ .../KEY/fenrir/speech/__init__.py | 1 + .../KEY/fenrir/speech/adjust_pitch.py | 40 +++ .../KEY/fenrir/speech/adjust_rate.py | 39 +++ .../KEY/fenrir/speech/adjust_speech_rate.py | 49 +++ .../KEY/fenrir/speech/adjust_volume.py | 40 +++ .../fenrir/speech/apply_previewed_voice.py | 76 +++++ .../KEY/fenrir/speech/configure_voice.py | 182 +++++++++++ .../KEY/fenrir/speech/preview_voices.py | 136 ++++++++ .../fenrir/speech/show_current_settings.py | 59 ++++ .../KEY/fenrir/speech/test_current_voice.py | 62 ++++ .../core/dynamicVoiceMenu.py | 212 ++++++++++++ src/fenrirscreenreader/core/vmenuManager.py | 8 + src/fenrirscreenreader/fenrirVersion.py | 2 +- 55 files changed, 2810 insertions(+), 6 deletions(-) delete mode 100644 config/sound/default/BrailleOff.wav delete mode 100644 config/sound/default/BrailleOn.wav delete mode 100644 config/sound/default/ErrorBraille.wav create mode 100644 src/fenrirscreenreader/commands/commands/apply_tested_voice.py create mode 100644 src/fenrirscreenreader/commands/commands/voice_browser.py create mode 100644 src/fenrirscreenreader/commands/commands/voice_browser_apply.py create mode 100644 src/fenrirscreenreader/commands/commands/voice_browser_exit.py create mode 100644 src/fenrirscreenreader/commands/commands/voice_browser_next_module.py create mode 100644 src/fenrirscreenreader/commands/commands/voice_browser_next_voice.py create mode 100644 src/fenrirscreenreader/commands/commands/voice_browser_prev_module.py create mode 100644 src/fenrirscreenreader/commands/commands/voice_browser_prev_voice.py create mode 100644 src/fenrirscreenreader/commands/commands/voice_browser_safe.py create mode 100644 src/fenrirscreenreader/commands/commands/voice_browser_test.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/__init__.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/config_base.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/general/__init__.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/general/set_punctuation_level.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/general/toggle_debug.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/__init__.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/select_layout.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/set_char_echo.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/toggle_grab_devices.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/toggle_word_echo.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/__init__.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/backup_config.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/reload_config.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/reset_defaults.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/revert_to_saved.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/save_config.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/save_session_settings.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/show_unsaved_changes.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/screen/__init__.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/screen/select_driver.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/screen/set_encoding.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/__init__.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/adjust_volume.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/select_driver.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/select_theme.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/toggle_enabled.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/__init__.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_pitch.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_rate.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_speech_rate.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_volume.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/apply_previewed_voice.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/configure_voice.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/preview_voices.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/show_current_settings.py create mode 100644 src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/test_current_voice.py create mode 100644 src/fenrirscreenreader/core/dynamicVoiceMenu.py diff --git a/config/keyboard/desktop.conf b/config/keyboard/desktop.conf index 29b3eb02..a4491cbd 100644 --- a/config/keyboard/desktop.conf +++ b/config/keyboard/desktop.conf @@ -114,6 +114,8 @@ KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_X=remove_marks KEY_FENRIR,KEY_X=set_mark KEY_FENRIR,KEY_SHIFT,KEY_X=marked_text KEY_FENRIR,KEY_F10=toggle_vmenu_mode +KEY_FENRIR,KEY_SHIFT,KEY_F10=voice_browser_safe +KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_F10=apply_tested_voice KEY_FENRIR,KEY_SPACE=current_quick_menu_entry KEY_FENRIR,KEY_CTRL,KEY_SPACE=current_quick_menu_value KEY_FENRIR,KEY_RIGHT=next_quick_menu_entry diff --git a/config/keyboard/laptop.conf b/config/keyboard/laptop.conf index bec25378..1927d49e 100644 --- a/config/keyboard/laptop.conf +++ b/config/keyboard/laptop.conf @@ -113,6 +113,8 @@ KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_X=remove_marks KEY_FENRIR,KEY_X=set_mark KEY_FENRIR,KEY_SHIFT,KEY_X=marked_text KEY_FENRIR,KEY_F10=toggle_vmenu_mode +KEY_FENRIR,KEY_SHIFT,KEY_F10=voice_browser_safe +KEY_FENRIR,KEY_CTRL,KEY_SHIFT,KEY_F10=apply_tested_voice KEY_FENRIR,KEY_SPACE=current_quick_menu_entry KEY_FENRIR,KEY_CTRL,KEY_SPACE=current_quick_menu_value KEY_FENRIR,KEY_RIGHT=next_quick_menu_entry diff --git a/config/sound/default/BrailleOff.wav b/config/sound/default/BrailleOff.wav deleted file mode 100644 index 083fc283c08ce5c8b1fcce759e94c6ce133561ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96080 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 diff --git a/config/sound/default/BrailleOn.wav b/config/sound/default/BrailleOn.wav deleted file mode 100644 index 0067435996f359bedb6bf2de872533b062bf0b77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96080 zcmWIYbaV44XJiO>40BD(Em6>5U|{(7pOK+qHvTahw)A!19 z*+Qxee=ASQ`{y{Zn>}UYM1~9f3qS9<`Txh!+uQ!6O3jU%Pr|f9rqs@~1^!97|1c5Bs)fDy)f;7F@r-OR{K0%5%QDI-QAe?e|1bOTWLfVE?n~ z{wda%u1=h7fZ=vOjK5`i`z2|fO6C|*~T8`_NjsYv%Mb^|2i0I?Ni#uR$<`X|DSFHa0{_6hM?tIri z-QQEqlGm-y>7VJz=5uNiPnmQZ*U6jj1Wx)a7xh)I=0869w(zXl$^2(myx^U7C0f9Q zk4NIeY*(4G-(Q5v?>MrZv@BuiKX61~_0Iczb8@bWCgM5C@VeCR6cp-tJ)Xv+AZAwhw)bo49`u3RKj~A=He^X*%{=A8O{+sJ} z7Ch7Vxc~LuG|4y5T^_xw(y#w4Q{eVfZ<`BiUThF+LR&gpRm(2+hY_yao-co~wEn;F zO-G&YWzNAPFJCJD{kCM!sc-*vbU&nKcYdx{{r}nZaMSOLe71jFUzjtV+HjlO)9)c~ z@y1@ZK90YP{>Mt#H~(m2id_@Vn%`W*p6VmQp)`|+Q!c=R(?<6ti^N>L-zU!(GgM4c z|Cc8f`EBZtJHHHzuKn$uqw*&>eD>eiPYvIzO_qF{_~PF8tu-aT%GbLv-{N-Q*(+4e zci=$1z>n}$k=k7fytZ?f3C)?&EcQpGxfBL$v z{ygoz+WXIz8$RBc>hb%qi!S4-r4_7>CzmnJ;B{i}Qn|{yXr&wln*n)A76kmB3<$8$ay8ydbe@z#0u z^499-Ne1CBe{!yPW%kqd&7#l$zpZ0n`@Njw?H~R;$)7xr1Ai-Byu_rX^n>luvuO-U zoiX1&UtRj;+?JmojQ2{sXIg#wP0rN0FHd>#yyE6jet4Qm{_dqy(GSjaRNZrHv%2T^ z>BGxO!8Y&YFTQ%2lNa&aJIwl3czpb`FNPt{P8UeM&{$~oX7{^*_ty0#uXaz5{}gd) z+ZV@Lp)WEEUw`KC(|Kp?vEbF=Yc(&tCx5xC{piunx#oBO7djEODkyM8HZ@w_D7W4TZwxIFfpLBla zt4*(2qK{hq{c_0Rv;KjucWag>f9^kZ`12Cq*w6e2HhpIbiMff z-I{$baxJ8v`?+yHx;FprgSdTJuV($)^G+}F%U79&`#!loDSBTp;qKeG;~yXKUSxTg zF|BK`qRk!MwnFf4b9R;w{pw-AKE_d-L49~6fPE?nt6;T{dxXhOM^8(SH{`1u66vw z=_rxMqf_e2^Mj*|<6z%+wm)f1zpi(j`ucF8!spoRQ$O0Wp8afHT>T@!;@htU)_uPw zefagaZKB}Mf}NcoKkZX`9sB#j%M;wLFAJ^M-v9q|=Y77p!CO`17w>~hwta7_-Sv&h zJmtH4#kZeJHm+l8jz7S%MdKrja+M@!<(|@iTeo)q^Y->(Sz_>(d1qwkk2b#l-w!S_ z`}0Bm|3A?MFaFuv8hz2267gvT`dN%*NroO_DXZAXb*$RqmFEixX_60j| zeA(&4uC;jzTgR$xY^^sw{(0pz`m{)?ckf*lQozt(r zj7w79knPe3QFhmRt?VhEeYr#+n3*&EG!Y9h2*(K9)Q%z2C$qo@w zk3#+##V`4fS~hc5M(cA<{_=$TwApT<2dh~`FU~x`w`{5gtKf?1jET1{u$;Km&zvG4 z!?@T=Py7%(Z2c?c|39WbA6M|q?9SmoviT){*ZiM+i$13D^tKiX-s_*q zy|rD9!?)0~#A+NJrGMPJFIlyjMKtYf3is|0x0#hU8M3ezWpNag zT;qH5YOYX~7bnM~|JxaS97~uQuEw)CoNi(A)E8&@z3m)(`ZH$k4^!^3ZEIY@8pd{$ zsjaH#r?AwTFA299zvMX1e4pDa{^6P8o`16zKWAIKh@YKnzA)FU*?+i$&K%-B%6LR% zj+%)e=ZH`}W^U7NRxBJpp_PVD%^J!{7|yQO~^US(LY z{<7|7?fG$-ee2mRoRj3)I4Zi${`~3gc;9@&;nn7!e4mZIq`t3pZvE8acH+|w=}BLl z9_Rj$y?WpezsUT5Jtf5)&5fEVoWQXWn&oDf>(2B=(+{ z4xHuZc{zL9W!RUqNd7lvc<}G|Yf*;I89YDp7CrgNf5qYNE8)w3>LNY<2IUw33O@An zo0)I=j}W))pKEJ88199yKzT}Zm*uPeA*TMZf?98n^8=fsHcmz4|pFLv(q?`|*FA0npv-tN5m==mqC4}Go;|YH` zb6w$cG4}e`HqXo6Kjrp(6ZYWQ%c*Z}z5J!u@#3(s+v{glrLX6wWPjE=GUKQ2yQjbR z)%^YS>tW=t+<)^K?j6@>ee%qnSu!Q$m%h8yw|N~7pN}6`_)wnG{H|xW!Rx~by|292 zg+ArT`+1LLMaYB5o7?WE6zsbf^W(u&hWDCp{~OxA7QXTHh3EB2FH>GDf03LW^(=U2 z;fprwC9l3eIr6U4KlM%e(dzeXt2TaVD!B6b^@43*GQ}o**cCYO&9^w#SMp_-9zFc{ z=5~<9i`%>BaNG+&dF}BJWy{wVHd8;b%xV3;<4w@-!zKJb#V1erxpnX4O!hfj`jNK<{WCu; zZ9np5i=pZVe);9^cY9|%pZTTW(VT;y9$T5Zzcetff0ex={!#taIk*0(eZ4+A`t;33 z?OSg0%AUV}y=u|@gr2Uu1+$~>Yx0Y~c&fPbUvvr^pQVMbg!cnEh4-F6WW!tPBn>i8 z3WoYE6AW2rz%(uG?4RUEXBgJT$Z*!`#c(}SV&L7an9sSRU!FtOJo*3flS{vsE-wCR z5z_K4;AH+Uvwe*}*bi^~C35-jugg}q|4ib}{4IT~_{+hi&F@~Wxco|Zck-*8J1^h- ztn~P>wfFa1z4Eg6qHphi$x3bfez@zvx27L!eoiZ7`@jD~F^kPQeU>kWzOcI%Z($1U z3H-OILW}vA;(6wpEXTjyH7q|ic;5aU^L+Z>1#;Q{Uq6cd;aH#YnTx^a%i8;UKLonvyMG4Y&E-J!56k4^B=IKsK_x&pKbUZyPM^=D}UQx zo4;TF8~?xkQ_67ex1ecXzKA%g{Mus8^7C@|w{INx<$jz#==f7LK;YM;=FI;Y3(eUU z?eb)Iu4Lg@F?kPHlt>=$8_nCC`BN5fovC}q-a6+xTh!bu>~9?eI5(c#!gpoKLBWw|UR*&lJ{J%_Z4>e6Fm`_v_-nA1o5wUTq;@wKfxKvO~Qh4?T z$?)WNVmHp4@~56RWdFTxF3aotw(Q>@dGWAkNel8F=H{urn#+7+>uRRu1krshnZ-S13&Gdj-RnFS-t;Tlp4= zm6P6!tGY$-Kb5WI;EGS@dev*guk+}Dz$EdP;`(e;B%QJ=B~Hl-Ne2lnl3dBOPQrT& zn?%y$DH4l3b_*w7*5h$*xyHK1wT{W%=_N~lnj71>4TU}EpHf=e-WBP_tRS<{Sd z!A1?%?VGsS7B;?PzBGG1o7S8n_9xd$In=*~b26D8Vz(@v!Q{H(!@s99>lmE5xBsr` zIREq9&b~iZ(|-MlIBEX(oc;CRbMF=Zc(C2+$K0aSpS!R3{napE$f~ejk2~mXD&I08 zAHi+1k%D^_*YMBGkrmmt<)-MQkOLx1*V_x(+%XX96kRX0y0t=R%Tfl>RsSZ4X)=_F z7;QD;Gi{0HHJv_*Gb7KRqcysLRmgkuZ;wFTuO6||pEx&1ewg84_vOyJ#osQlSAUwm z?Bz%H6_dU`)t>t&>0v43eTkjS+&f!XoPJMbYtrdwvXm44d&DR6*PGQZKPKv4d)3`z z_PqDStH)smD$la&-n=o{D*tYVYSC-InxYqVyEVXNO{m!co-!w)Wyp|DVesSm3o`**Z`X2@Hq8VRR z%xC`OzA5@^jpBuGVWs=OE>S=9ts(Z^_jmP7-|l@|{w1;2`OCcytIxOZXMK0ST=_R` z4f`MC5#CxJBLmE~1z8zrF0m|N8e+{@=L2jA8fhF6P9N z&y3fPKK=DLTTr>3O+_{9~=B{Lii)4tgzI_29#atfQavjMP8v{eJ%aM#rw#O$$Aqm_3~ML}6Xv zbEQqQU;VmP_VnCpgL^()hi~@zKDb$b+4t7T*9-3Ugr+?32vomU$o3@FByOZ_%u~B+|HU zzhmU?GHT{NFykrvxzY>FkHt-Y%|G7p{rxJHZznG{{(Q32@@MwFTR&AhRezWMy!l)6 zWZs_+N51dp*djlAM4fySzFh6~GnTM7`&eDy|Jf(}J}dU&yJRV+&ss6%-xBS`zTcN` z`SE?D+24YX8cZq&JXzK}5NGqNbzsf<*Yw|9lY^<|*-Yln;_Lsv-q!e~$A9P7jf(+) z1!L>~8MAc!j=)a~7!7s-=R9VOdDs8OPgwa|;MTK0D=sMg4@*n_v&j1F_ai1z-%OfBe@x+%{*`&c z?R(YI&>xTg9sXg-A@FMro5|m=z9*Q)Z}hSWpKoW+-ny34|9%Kh|0XkTR(^3Vmex{E zxjir0qPKlxx7v`%VcR-~XFo%M!19Cy{`ZpSc%9c43%VlnY3*0Bgu}UCBkN> ztpvaGaPWNy?&cD?cZsX{pCjMqClNwdrNxE*9y!e&DapomELMU=?9pWwyXwPCXWM5p z7=;=CllnK~k9MW^um8#K{_-j|v+jyt#r^tPC*P-H4*r!~?tI)n#e8xL^!WLDH*g&= z%3}MwVI$)Wdl^=Z1z&k@?}`?^w9QhIM>0zMp;LuWNT?OpjV3F$MulQF6a98BzO(=M zqBi{GRcWkd(-p~Mo}+V-`OVEW%uQcvm_?16SXXcC=a?+|m}A+IS8Tiz)~uWI3m9$} z^!!|0(D7|fZ}w-uFM1!>eq{ZoC9K16<>_gblM9;I8+*LDY*$M0EVH@8FEBY-sHCPy zFk_>gP{Hx30!KFn@P9cbEj0b%Pf?~|6Nw-N3!$&);<@eaz2!{1v4eM}#B2U}BIiYP zmb{m+RJWA4EH5DyFUBLaB;$lc)Z}Q16OQ^4rw<$uwUPP2r_phcgRM%KWzn{17G|xF ztenXg*xuJ4Wi3oMWqEG#f~}u%2RAcIlF-|I3{qd8=P4byyiLvKi@ExdoC_*5Sgcgc zwxy}QdSM8TO-GY_neD9es)gW^HcTMUxxER@+{>V z7g_r*MscX;wQ#&kbZ7aK(C~9UE6Ydkgca|vR?qmd~f)>pU*S=q7f?et(o`W z&%mYU|LELZ$Ee*sjpNO9Ev^UK%h|77-^S|5`N{{%fY!`sb(d)1RgRoj+Di z_5G>S_2Kt^fgYxu=yM#Mb-Q`w9bfT#{!|w9D_0PBpW-T{ztdebGkB|r;TI3#AEg{Z zo;NlK9gPha`V{jb7ox5g9FGrKP2Ky5ElK-)b)PC63 zefYdMzW!tC0*24gy9B;%I?wSX{jtNRmD?wN+57+D&&!R||4)psVk+FM$@2H!99E8b zK`iYOpgO_fk+Qh^i`I2bubGu5y;^4~@yh7m`=JnMd?|lFFnYV`b%Tkj=pOt4legArn$=j-l+g{w}j(jw`(dAx< zsph@q)7L+^w8Y`rC)rPLCft_z91#BeyVvxCKT|>^ew^lW`gW#q&$osZQ@*Re{QB*5 zyV+Oss?%TkAD#Goe&wgHT6g_^udi?Vv(}~m=Z1BHUw2=w{lL5b|GQ6VH{ORU$9;7d z3jL${ZNmR+OGEza@|QA5Uh-%9zvTc^_>YFaiv(1@J7yGpPXF`nv#gr(m$R0lUw*vW z_VvrMg+IjpT>SO4@8b`%Cwo4<%)aub(c16jt#2w%^=e|Cc1=C{vj5MrcUPY5_{5yK z;?w`UyB`_@y5CM_YJR?K_q`{^91PFJ1fpJM<-B_Sr1IAT&UMLmq(1oGYW({A)~);H zcgkDt-ml&-bbr5~;r*=>r5{f?Z}+}B^gP4dt1Z0S*m)#Y$J~)Q_r6#<%E>}pe8FR( z1?4YzwuN*t8E(p9XuGe&^07yR!VSbMz)g#&WTxe-aJX{qo=Q^pD7zyMNnnKm8M&IOBV6neW%mS1-Qoy728w)>e)0 zl^2fwTpm&KKl{Q$X8G*ttZq}?*_Z8iV1HK0!v62M7VC%E2N)jcefw7yYV+^cthoPo zzvTYC%neR6xz1AOpsIGhWbJ{uEA9r|4e#k2t{S^AI^0S~w_s?&~L;q7x&tvAk z9mLYAwS|2St2O60nLw^h-&{DI3_oz@B~4?$dZmz~v?iXTyx;&=@N)^inK5g5zkE5$ z`_y$E|Dur7!aCZT;*BR2B{b#IL`o9vg|Bak7x-P8%==z_Ezi*ze|V>CZ4>C~d?g^H zSH`>1s*rP+uoHV4cLiIi*j|=fB*zgUEW zomu$hv7NjuXJoi$Zqnck613;42}$DpEpnHK@g5WB_VXNUW>`%BQ*!QTvU`?L%pJ~>st$!~cJoxL?rNr;DJKMf|&8qpNr0#X9C0`?aJ`4e~73hq~*CG4W`LsUZM zqfpbmNxppmbkH+J~n>a`8JZ$?&Cp;&r*rBFAo62(2-XjrFaJlE++ke&v6%Ji3?a5^{o^budmjFM*O>Qx$CO!L zwnc9FYFsz->uH4#pOyCg{8GZ|`_)v=<;T9+VZWYO`TR4fU%}jRHk2(g@G&=(>d(SvCaHHyBzmr)^-Lt=G)fS7?*z!VK^hV;}6Tm zg@0R4iT}MnBkAwm$1nf%FW3G3-u}JqBcDiz8zk`u0+@j&EXvZu(QZ8}1) zzt{11ZQ*B7tU(eZkew&r7^Hm}t^Rvd( zcVFsrmweZ~r1$5l`IUdquJ|$b?$uzH4+&;wZZBXknWXh^dGW2Emv07qW}hDZz9VYO zs}EBwUxrxxd^NlM=9~TJ)ZfI$a=b1)zUkHG{+VyCy>ol}abDCL=IV>D{ccOXuG#+X zRb};(*Q^z#Z|Ce=|M5rP#;@y7_k0g*^Z)ts=Zs%*p|AhVF#dvR^1qE_^!UwCayjQl=>Gob$=uFo><77D z#yCg5ymxc?%kvi=y}UJ<`{lGP$6lOKTkvu!m-TDC(yliP4k*1n*1!0@`|ZCU7e1{2 zq+VkB`4ZRv4{lO??;CG$y?M;A=h>34c8{4{9Uijlu{?^Nyy1yj;MA9F4OZ`RY-B#$ zpFjRpTRP#JKkXHWTjQgQ7^-yd-wS;IKK?63d)L#yk^Z$3Mnzk%l(|HU4h!LZ_yIinf# zy?^|=F2BsTReV>!%KXj!>&36X9rt`u=>GL}>I47pjGxkfDvS31$T+C}^MPKFluYIF_iT%UDpSM4V|E~T}yYKotwxBJqZXD2hv29Y#i-jt| zFU6*JzxWrS_vFj+ln3%QO8457p53wfJ?m~o@9TR{J;LuF_KeFu%mo0FEcW_*g}xh1jk-E3n_{ZQ`_M z>fziS-NDH_br;*@BsZp-h_t_RVhw+DMF;*my(9A1-TgYhepY7w61%(lx6Xg#-$@>i ze?9qi@T>R2C7=4D9U9MANZZz~J)ygJsT zZdNv-X)dfiNjyw5x;y{N&Y1r%Oy&N+>5T#ZCW&SLHr~AarmIV zs6VuyJy7QihnHm%=M!0WUjO!7UR{eNyp!gf;oEjzNT@b@hUo5s3~?=~d7^EKMZ&+6 zb_&We1@o=GqRZ>Wo676h)y;qSNuR*gD3f^Np&vsby=!Gqd>x z&k~79E)zL3_D*{xwv5;MtY426vh-g0!@~Q=n{B7rVs`HjEbJ35H?S47^Rf6W|Mfqm zk?GF?cDaxhU=Sn8O?4CUOx0Ck)W4Lu5>*WcL*)v{T=326wi7(@lAb%L6 zu0Y?-EP-3hi}_c2HVGVcJtB1Pzy^``qJkpF!f*3e7w_VgGB4(>6FSY8lCVx7-_lD& zV9heoV)++hKfg_o_*V5^JndYl#JPe8;^$-Z#cy9YB%CF#!+(78b1pwIJ`VoXbJ)w} z_1N9KPqVG{*}__w{hO8fbO*<}dP$yC%aei$@BfIOS@B)A#Zz2Sd|shaW$8?%UH_&j z@AnW=QF|e)Jf)*Ran`a)3K=;LiXY8t6@Py5RDQkus)~``dDTh6%_^EInTi6}e#zK+ z%1eEd^pgyq{zsf8XpyLk9;@*FXR8G7@4hM+U8f-{mv13`-rPbp;;gXB^SvGFi|Qvz z2b?Hha#DD zgel)>SZ{w%*JRJbD25FWdKE+7{yFsJ-Q|M^-#q2z`uOYGzE9FgE-Vp0FMQu1zlqC# z?zaDm-{$|QO3MCy?aDOrMK9^Vn3D^`Q*x$2G6=i$0HLms-6?^nCUnj*vxFY?Ws` z7z4`|vShwt=V`6G_CGOe5|iK^p&utY(pk6H*8Qno67uVIir3fZMg70RW*B|=GQsV$ z=CQ7Cs!PqkMoil9DW~7~>-Dz8|Ax7lA323*{A#?~`gKcB|4)S_ihn02Y-5N$X2#|= zF-Ay*aUvV{zd0;?tZUhSl%8epDV)TenA6GZ@sa)W1L0FYKkdBv`QZWa_ea(({m|a* z_sLqz_wSR>y+2-lIRB|^&HpDY)iJM|_{5*PKMs6R+;j6`^Z)BlnGer>zI^iGM`D>` z@8(6teY<;kBkNLGRwgw^f8MDfcm8Tv<+0yi`~UyPz#Bi_|BwE(<$w8;9*c~(J~zuh z-B&vEOYM~R4-4n2?}6(ky}RZm^yLeIRMW)7@*9vo$zP#K$|4ZY~hwsvyj(!Tcy6|bA3)3AgAH6FkyMr!h zC&(V!Vd!)2c?8$Jb$>5D&e;<7BGjn$8?VLNFAuw-nTl_mWBwW-_b>fN4~OPW`G0ZF z3{1(olNpK+RdOla?B{;@`VLDSxAY%jPoY06q`lbcZN+}yk~qp1n)a4s@6?6Nmk#d} zT&z^Sa3E7UR=zGi*Qh54Y=3RXLQ z>o12{4!^GGi+mLR^Z2W8sbSB*vA=uUEdBq3j&1GNFMkvn9v%7gZMM+o-zGlWf1LU3 z$`E=~;;ZMj`d4SB#NKI`o%Dc%`_9X!>wi4_v-jam&d#NG%x@)Lzo^gjSn)aM{UtY) zUtYK{@3YVMzHgV--~Yt>&*q~b*M;9N4NiZSEhu1A+`Hlbp;R-r?czQxN=A*W0$KVD zd)dx>t8xGHhkg5sPn&9r-rWAa`g6w03m?BMY^L`g* z5c&wjR_d5dA$ z)}UV^n^T#$F|TJfICF;eV5KaZpOoR>b-lMfi}munNhnzPO4Y&qmHiLR&tL4E-(7II z@Jc$n?#+&!WuLa2E4-PM==))AO7**$UN3*C{%8H1#s2-*m#gi6B8BIFG5Wghzw^T{ zECTn$Sd7Z$nk z-*1&`oSJv0vVPhu%r@uEIu7X{F6{_JP^zQ;c!3m1I((JS*mi@o^s zqh!sm?9(#eHd%f9n)tEdtIzex??3P1ep`4@_VvZdZ=bt(yFQCrC-G7G^_9;v<0kyB zVoLoxQRFXo%$=ERUaEh2o*j1Qo6zma6Qpk;u+1Wqf6>CT!sP`~(&h_xOBJk370*#o zP!J6eRZwc5r+&`eSjF4YRQki5G?}`FwXz?X^~K*k`XJ39kt>_g9iaa4PMk{GeGmDB zxWmG}l@o=GuKnV>v+5svTiG7Q>v=MNdUu)pJ?F6g^R0l8U%TH6Fnqr$!podf%D2eq zr$qQ{S1EVDXeGy!#@b8y9F?u76sjspeiP^JxTV;zPf;WMw5YLC>vZGr`{^b#yw&v; zjW4Kms`o1;Y{*o7cCJ$WWXA-Z_XiR*9lzR1JpUFb>gAv&+WRI)IO6UD-nxgk`OD|3 z2pKHP7uB5nm*@PSPrQ=r_p&%m<^MHr%8XBm5#Qd}*}Z$P?3c~M0OyW3FRrk>v0HxT z%}H*SPf1({J|9tY|E>I4gFXBHM&=C{U-R!_Jjxwysmh<7bxwe_LO|r$#Kpo|eFkhg zQEz{nFJANgz`sbwlX_eJIITBlU48yE@3a*MIG1ss5N`OlT671;KglmsCrI9qc_6LC zIaTV{^bh<8oy)jWk8NjU{K3zD{do*)cUdIY#mdIu>FY2d+ASF9?NIy zx*4?@uMt0MK0|G%rOC!$W{IB`8JN2|ssDd_Q;qL*ix!hMhx#wBjmnB)hvoFme#ndO z-79x}rngdigN0z=j0}OrK{7mxRV!Hf?lOMbzH`r;M@8mOa&p$)-Y-4z+Ps9hSD)?p zan1d(=ykPQ){k0Nbw1mfVf!g59om(R|>eD%vlnQI^X9^C5a3Ao3=$nt3ApTF;YH&wqgGKhJ5aQXCS zGAc>$oHMsSKW?`F-MoKuK68C{{T5L_<99o+-|t54>wjigWqdL?!E-up8F z3g2s9E%-{i+ZJKsP45m$a)5Ec7%P|)G~$|Syj%P(>Lyy92SD9rhR;bdSp=bFsj z%zN$YIBv!NVOw>&iJOsi9((2zHl{#>pPvof%|72%wS5z_cFA4V_kxeM1#7&ix%c$5 z_;K&={EX{=dc5NJdaZutw{sa>&!2rPc=pAG@xF)9gC}*)^B+ZDZ+%=Ur1-LXiQV&g z_x`zSHr@WD+V^mCslm%5j~HH9 zmU%v(GOO*m?D3qp-;ML$tn=y!d*K<-@V&(of-E6+V8J<$83CRr=xH zjcoT9ga)@E$@yMyIM<8zjH)rbFXdF^6h^yTC<+1Mf&_kN#{ zpBV$ky6E`B|IwJLzcxi~EWe)(3_=SQVFuu}%_^V)hPL z$~mKR?|-9h+JBEexBl37C->9#nf|{oy<5qWGp&SIL|BJEN%V}s@y9_NykTouyW6r^ zSgQAM>=3Nu4lr=wUGjFx|6SU%exJXY`Fj&{_pj3z1-`xP+WpNraNW;|XGQ<0mtOdu zuRrB`r!d>s1$J()`&ur)`X6BVO81NRi+VAaSIM;&f7YvBWDwrw@vrdVMfMZ7rMW&G zSWe0h;n^pj5ULoEh! z^H{T`x$P|^w@9_A&YJvAe!0SG#W?R(8cVk{E1Y@5Bd6N6UVdI7x9lwO3xcbiKXN}2 zo51pGo(rSq+8U;)@E0t)z^N4I#5&{V zbRN5357~9@+~+V&zr<-;w}#zHNSbN?h7gVq?P7fIw@hcxe)om{SHfhmj|+bYP6=`q z4H428ojGGKfAaD(LY19qLUoH%#Up2}RA9|3QGR?wTfJF-m)?BtH0`BFerX;3$z!Ch zctJaBNx#N+OF0dXMaCK|rDv4?h%Hv$_}M{C>7ctBo5uweo9c zOm^>w{^>WytrcLyX}E9o;}Tc{Gw=E&~po?=g;TQG6YroIT zTmEOW(+egKwbMU+TvNYI%DVJFdIR6jq}mT}@4Xg&?<%DI<#g(m_fo9=9}}nleQxcl z^u(e1)AR2M#!oL#lz;U^_uqR@*Qwv#A3kMxA##O)PS@!ksHDL^2-1H}Y zP`du*YwF^nAIVRee$@p!e|>uJ!rSYcoL=+Jmwj86y!BPQMEQ%4&R1S4{+a$N-s$a& z4~%**w;#&=5@74}M|GP$L+*1WM&;Qb7=QD>`)e)A!l)K-;rF{Ik3PTWj(Y#}!KIgS z?ZqEH=A?XC?c4HgS5(v2MHz`-Zau4f&%0sOtCrWRUa!zU{dUQEr;oyo7d{{9y!*P^ zUhwsWs%^Iv` zs4$XVB;MMLC3ct0s7C?CZ)gB z)7E%%>~6!yw9EB>{M|1ymQQ15d;576PrmSSp2)UF?$T;`p{X4{0`pb|^P0|Iz$Ua_=o+$2qM+ zeqt|$ewTtocZ==I231UbEkI8aqZ&X!G5515eu8vtUp{m;(sGn zP5T?YzKoHfWD~=dS^dm0KNd0nJ-3ZXrc#ShK>h9aEwTciC-$uPurq)5`{Xs#Kg4Y} z{&*!t{I!y~>g!}fkq`3xj_=BpZ@+F{`R(0&%YskuoWj3+@SFS9b-nDLBbO)s*4^g( zGtcV}v;DhV<|jX*|8!h>_**w%`+vi&@qf$|^nS-}3Hrvplk0Q4^n{X&&ex?g7A*!{I&f7&NQnd`6n0}sEc_}=xBm&fe+GhxQJ?=H>xdSkQO zcWKqTzYV+gGVffzm7Vdya`r5SRGw0EJKn2u#@yk#yZOV{`0)$Y?GWYRW00~Ij1<2p zJV(6xl(}re5ln%%rwf zVcwGs623*Y!V@1H6<{*4;1Maf#>&Sm!#qudkHJ#f@J~^l)z8$0H~(i^on$w>tjKF! zQYEbR@xSDZ?Q3N}i+U>Sy-ZZ)D34cg`n*woxyET3#zb#r-Ray~xrz6655#`f_gv?z zUp2Ep`~L$ywP}*VYU;b})s|J>Q=9$SSpE5DC52`3apD$d%p~4FyeYa=s#f6l>Ii{J zf1e0l-r*wbH*F2S+37YO?hk=nlNAm!yn6ia+trH6pBKcayi%GV_xOKL(~G=S$KL)3 zkA3xr$Nasz(bO+xYyH3X{XNUD(_|CtF%t*2=esy~?^HhF&U|gct#slq@6x9ZymQqA zxq@m>GNy6){r%eY{GYTzHKUX8DTWsh!#U&5Kjv|8-O6)x-fPk3{2=is6D-9J2=GeI zs@^WS^X>$Z>h(+cj3hL^~s{k}si^Ma_wjK{awv7A|2$#zpT zjr&isukh~tX;P;zm&$a=-Iv+)!CBg1{t{WQOPUG+`yCZ8o&K)yd2W#M>A#|yD^~y3 ziv0Oc_s))ZV?C>tWOn#L$gXP7f zrQcrdv|s(Em9P4ZxkJ|{Cl&2)jkhO#i+Z`^cm7qWKLTree(F0WegDJ1_s90Fy&wJu z#lD%g?DV@k3h!R-ouTsl@0n9inD70$JL~GpTh33u-}+=_bX)kn^&^(lGtaeVuYAqm zyW@jkQOzgeRR=x>UHtInEZZfq~h>Q_ROzmg~hqgb@Sq0 zrnXuJVQ-V0v3@qV5Ag4cbrb|0Szm3{c(yyaPG@sWo- ztT!HRu=afLU1rh!Wj__~nXa(Dxst))&iQ}Mw;rTL+*~~K)6K7^Ic|UNDR>aIo8{4c z;{%TtYWqI+-KO%uSK`$@d9Jow=Uz{~k`cpsRU-cLRT0+gYtDP5uKav9|EiJ2lRN+F zrJuiIVSX>ux;ib5XGnN{q(Ul*~> zy==(tlWomm=CYeJ+LM*--jVEodHP5HK5b_Fn_-*yBmMF7?>+Bd|J0}v{2e%F?$2f4 zGJhOC_V~Mt`mE3U+x*@~|4jR!c}o3VeNo060sk{!+QS(CU46>_f5!6@OqV-YIHcZ9 z<+$+NmG8k9HKAz?$wDVn?8WRIQ zcW9eb>)HnrUB%C3k4f1nb+&D^{`5o`37p zCmfE=O3YgVBbnsy-eunL@&U_)EwflJg@v$LWC?Qb`5`BuG0j@+!?|8r+x?m<@uw5i ziaFKP``^i^nLqlg&FHY&uvMhOsA)%-UQtB1c1Y=7-2&4rU3-NIx_u#M^;KT08UJ1V zTYvA5=bBR<&R0J4%TQsuPPT$lNtlAd+Ice4|Jfy`yy+HmP8Sm|oopq2ktuaD1P{lexn;hkvYsW$_3eS)AvW;d6(Wg+LUv-`Pz)_&sX4z^`~ zW9@m;i!l8z`zibyBrPOka&w zm}iHEki{d_FN+;ixI>s#54xXKI&k8;^2>P#Rs4BNR8F+=E4rO~s&K93r_y!{Mx{n= zZMlgn)WxbgQ~8%IW8pe%?aRRVtoh56_%~n9cnALqdB5^^4Rh)5bxJS)cqY34pVJfZ zXYv0<-##Dp|GZv!*(djn0q?&&@_ViJF!hC_S?ep8NWqt{o;km8-}U>Ekjtg}>aUdV zCB`qhS1jE6kU68~$*w(LpZFNGJuXkY@*+WR-)r5{%r|M5r@nEWH}$j9ghxM~*q#1$ z;r7j6N4!0L&sKZ(O>g$fANPXJ{rv8(|5Y(W;l28{!VgjXl3y|d^*?Rf+WTf(%I9an zk(Mum)mOf{&?xujNu%a_=8MO_?3wiBkI3pL{}&ebGi6D~ut{*VaT==!aamY9s}{8aRU@vGd2g3k>b%fE0nt@?hn_v4TACv1OC-_!g1_}wXgCQ7~d*UVPJ z;Ki@W938Wh^~?JQj1D>4|29?S|I6`pU^?0s!gS%*`TsqfhkxmROZeT>@cYLVgI`|? zo~eDY_-OItVIsqCpUsLtHqJis@j=|9w>2SK-yQf{_a-ineWM=jSpMVr_tmVgB%OD@a})Ib%&pt_!{>v{ZwJXUzZJBa z{>E86|66$0@h{(l7KW2wKeEQ`{KzrAsDwF_>C2xrr!D`^S!Tna#c0V;+Hi!?yV{PU zp-F}-O-+T@^=cX4&y;?F>w8NCAJuLZoH|K?@BIJGY&o1O8D>fF{#}uh`iGO_+3&5B z|NY9pxc#U9bfF(pUNHPDDr*0=^TL)tylXib8s%+S%{l@&olZRD`n3E%_mm0QeAo6q z77S9>5S%tCkJs$o49+c&W^n7R73PiH($90o`z?2Q!V~Uu&G$HOs-I<<)RXon;puAq_wEesAMe;t`odec@$2Pq zo3C@i`+pSo9{6b%aQ&Oc&7E&MHdQ}=u;l);dtCZ2atrz%FL8{ytL)!!&v;M%gKIAH z9{snt@aR$C!WU)JI6ri{e)x3A_}_=P(p8_GnqU3Uo+|$PbjI}GOLgP_Ew=yg|Ge*N zMn3Ux3{xh1{*@J|`C0w4>Syw<)*riG`hK2Y!TR}mpW3Hqw$dNxy?Xq1HQ&D1M|3k@ z`yM^{_V!A@kIdl@zZ*qH|68}Zh-rDQ16%OQO&k_SZ*aucigT$;H1cM5>hk(@FXC4G zq{WrV_>GHuk}j8M%zUmiX;~ijMH6@|o=EeQF)Zc@IL|Ejo9Bp#<>gxOGZ&YNK9@Z# zoVbN9_kj-c=KrSp9A@6)ZAm)GMz2bK=>#Z(1jmz6xLC`8>yU$EVr< zYCo{ue*Ny@`pvKBKHT~?xcTfm28O=3TYhrC*{i+ho&F1t&q0@ZzV0u5@Ixf>-0xV) zbHDjsH2$5O;l`v_lEq+`sr2XMhPYqW^V0vGKbQW;da2y6Pj#H%ODA0Xx#Y&9-)3z7 zzst%G|7u@e^}D{X`TxVHX^hVDUzu38@vyp{U%@K!Z83|W$Y#cS;r4$Em45ze%iH$* zNr~v+wjhDuWw~MBCOJI+a$~CJ*Bj>>zLYMkeaG%m^7^LxzgN5;mc81Mm;WZeZ2Bji z&yGJ9>}vn@F}3ht`jj%3DJ=Kd>z}OPc&#eKmDj4mePoj|k9qn5-YjlMK@rD&ViUI3 ziZ!bTi!A=TR_P*O0QU9Bz~>skr?;pdm?vI zIE3ts$_1G?`Gl2hb_uSQFXR1krIO2Tb`@(sv+iH%yKBE@{SW+bddb?C95!E{8?Ac( z`hx8Dcd32z-kI`nd^)UL{=JNi?O(NDCDWx<_gUBz%s8rb-f>Pbbmy?PDP~vdxxw*S z=?SOfk4>y=`oI0V_(1uefl>qG`xmpB|1Yp+Jte+_>)>}azT~4<1Q(vK7LlBwCc5ph znb_`?7sRd{o+Mi4A z<^P?>vFKQqrp6yKM8Ea|&Og>lDKqzbj@o%vYT+ zH%arnQG|Bxf<=1IIg5?1^J$tCo@_LHwCb#G)LIv(%BGvkScZ^WNp{3PT1>8t(3uU|P#r+oiDeZ%)P8;U=9Ga9{6 zStfX2_~+ic22!u?|A;(zZ+)B5%{OxmZ?;ND-Tqo@e@|h_{d>P(?|rys>#XOq&zioH zv@3Ywt1a@PKvV0D*M>9iex0cOu!c?f^R@lG-zpSRfBuc0_`5ks^Ow5Kg75Q$-hJJl zUcmllU(2JH9+@AW>V08-$l4`vZ-!XwogLc$?mRGwdT=2w``NOL z$1e|;^1h8;?Ek*8_4zc^d?zhm8#_451l!!Me%cwS{V2)>G}IsU@3 zw&sP}!-^N`BA1?}t!{fPRk!7y>SC?C+rKZoQy@9>?xMsi_q1lcxX*J&>p@4+<%jdu zXg^tO_3_bxt#yx_FUCAcOEi7yaQfP-JC82C+1i!;&NA=b+rJSj-|XtR{x+a3^VJ#! zjwf^E3Lm(}20ju$yXx`(rAr>3>fyZi>i6b5e(O{2*4%r4%fj}=%^V))TTM&m+?(@^ z`=RH?QxE)SGdzf>n|{Ch#rt~?Iv(Gd+su0N{^s-7f{Wd*FaG)ChEwSEn-;9sZuMAY zz1n7;_i6ufUgo(fp=?#tZ?HcUs$k~nYW)#0=`*MFoe94_EslBf_~f3SA1~%`{rRQ9 z?R{06_ja$^FE){PjMlPKesL!FzMjUe@!rzn;EQ>$l9uVMz0>+Uhq%pR?*|W2b)^z9@web-dKLT>Z(Gu{gYGXi(jbvCf`jn z481EpN%`U3z)Rm_*SEZSy>9jgo!c%iyx7xkS&D6WH^P*4{O=xK3un1?6v1+ z+b>V${C{z+6@CAEpVu{|a*oHhrv12=%VPEXerNNm1NZdaNM4C!R?WG^_=I2JpE{2Q z(}6t`KTqY}!lEfJ|4Wjy{xk2}!f)S~PW-SZbJw2-N7Y|A=hr^&KJxx9@0vfar*k@d zxEX%#(bJsg_kZ|&f3l-h`SFIhH80LSYIwuw$o?vmC+2zTVb52^ar6Jn7DWB%`pEF_ z%G@iz1r>#U*E|#Dw3Pb5^}DM>Fx>s7%#6qN0=-`0f^ohVU_6ovtl|Yr*k%N zj_}&_t1=d{3l!{cZIe&iTCV(6he>Jf<#`5kP5L#n-@cYRckY&;v)oikZq{Y;>K5xH z`YbPT6x?6;w|UdNzuh~vznATN#iZjR&$a3QS%G#@1NI1?Ej&M%?{H3TmXe%ZU#hr$ z%YE^$hEdYyCZ1p(#xcw8!kSc@123-|F5G-TC;06#_00!QsUN>>V66h(<=gzSKZ)eP^{-ck{(HC1rta+&Yoost z+*24OH(dLYu+@ZRhxqURJf$q$S*C45SDLFN3XWMS9M*E-;XL5_xAZC~W2a#Mm3FRm`9jPV zbKdeMttjBD(OJl=!L^6k@$+iNsI(tktgQm#^#=ZudZL#U3L1>H#1?t!{(iDo|ElIA z&0i;080hZWYIc3CpT*3H({%sLXjU&<(`z_+YJzR)UOk7Y>74EinRDGQ&QbUFNP6Xb zoR!mlQO_B(UC(Yi2u%Iqtf5$7(;L#NcP_bFd&7SQBh`+_W)rr%TE3mL-!$_2Ig2oj zr{+7pJD6@2S+3%iF;6o^bE4SA>~Mz3N)3$KT<6#h@w+m9blS%F{==ysm2wV$&kKC| zx3As(t?T+p@`KQ&p&@-AM_^RZ%P$?a>dYw!Hw=DKNAzxsakdB@A&XBM9jiu!j{ zbH=knUq3E9;#kUgVrEJI!Fj6Y2Sh*IJua~O_Jv+A`O|;;&CiRjetc1E`=ymrGb2?r;m3Kj`$3c(%G_=?l>*^B&rY=bV$6 z6MpUR9<^(4>$hI5@R7PX_j1|gIngJdTi#=ReP^T0+c~=|zRw5_|1>kv{(q5+#J{Sa zI-j1W+y2mw|NJR&*Dr~UXi&3W~UWdOTQ_dZ+RaS+wPU2&&0=?(; zPY*sgWXbUC?S7uO+%ryoUHEP0Hzg^H-{QFfze;l(|FUfNW!=AR)A!h--{1A`&V6}$ z`h*YnnRfkt+rspB?`y+9T>4l{)d*61vxVg0C-OP%z&!NrdUrQeR^43DByBI%lL@}QkKOS`!^Y@`=6!pgZY<~dRP1l?N6&=k^YQ;a z47Mtjf1ec0`Ty_0O!nE6SULG3-wGQ#P2*g-&V`A|K8!`5V+G&)efC@h55l=z@AC;e zE-qCYkb^ns_;uD$yOo?AlYB&ee(aXK?h>o8V+y}q`F2~?2%kos z=&!v8o#J=>B>-MA@12FdR-3?D4`WzZhjsAFw=O*u0BzLc}` zY^j)Ahvb58JQii%ww`zPA|Lkpx+8pl*j$CTsWQvje-u{=Ha(|3Z^u(@yFdEsA`*sD z`&OQjS!q`)lqR(9Cr513&toShFkE%M#?Tn_>i4njl^^R>KD=g_lCJwvy#e?`+ri@?jH?aagjUs$uYTy^N$1tJvkWSaN*$L z4&$R?qGboYO84#mFwN#fnds!J>Kor&6OWL&?(La+>(eT+7dmaCZ(Hjxyh)j&{yD;A z%9BTicRv^xH2!>>R{8nHZt=&v+;|=`oSpV6^N7jYIUXF()o(!e zlG}Bg5tF;dMviq{TLtu0rDR@*t`To|($4z+a0y$O7YldwW>+?&^&-p`L6(2nM3k9M zf9hs>9?kkKC+z%d)o6X*KMc<|=%JD>p z`j73B@~?-duYYSQ@c#XJ(yu=evX?$L7ukP!?pyrY_}b6=`%XFB%`oV@DYC%girV@q z*Y7{pep6VM{Q1?7$WMDzQ@;Jm75o#_BFs^CI$c=%^Cqs`-z|J;56<%)eB#S5Uu7z7 zFxN=lS?G+$r|1fqhRA&a--Ex2toCnIcYAnRud<+8J5Waqqi#yNF^l!OS6w$r+w{Tm@|rG-6a6==f?pXr=y;bp*gWXA`Oe>9zQ^Cx z$$RN(pVi@y{qKLU_Gi2L+V?`vJ}*hhCbuKPAMNIeCR%9Z$XI4P(6^n`I@R>@#8~YK zm)e!2yDO9!T^}hwIHIYYvNl0S*TPY|Gv&JK?_Je0GE?62xQ4!Fw_z7$da_{m%fQLW zFGD^^f8Bm>>90Un{oj!S5&!<5+xsc#VaoT_3#WdH|DE;qt?-WiXTwfu5_eGP;rC4tH9scWOjOY4^zSi0= zSig8Kzo_(S5&l^wJWZL;Ib}azeAegXjHo>qfQL+b8lqJ{?{3{QRPIuRfo%{UGvV(GQ0c6aL0@-2c>DJM)LpUB3U< zEDf0b8MZSdH`~3lJiPGX&ND^Nrrzp!`fYjI^SaLWuUyk~UkUE=ds)Y{^vRBzyn9a* ziXKGvdc6L8bmzicuDbI5bN^QN*L#_4o>Vl* z-aQ<1?V(C6>)Uiu-LElH>welxZU1R-H2GEe^!?B5B}zVh51#h@dBVZ(N2kB~@m+}h z=Y=EuzuHsZ{4U9e|I@Wd^!N25jrVUex4srD3Vd^>bN5Sg#m_I#RT%u}Oa1?S?*IQE zHOxPJ%*fGtUzN7)<3r2O42L4E{vYSM^!Lzqx&Qv+hrcEy)qi(eBJ*c+==A?7+3&xz z2=Kq(niBQmjkC|EcteHnocw#gKVQ=IcbDC+Pg%V8-#)2${P|04-=~UX@h`6XYkr9A z{Pp$9i-6aRhI^i?Y+Li_)|HQsZ*DmGnqM>fZBp9KH%45+FJi*{<%+lBu|{xtjbg3tGl#rf^b`*}jy{!eOUtZtw8tupb%Hz$`TKdXBG z{agC6pLyP9UCuL{VyvH+tYS!JPx|$z?dWHd|A#*FPDuVW&;S3|{mY8q%AZ^H;<8D| ztJwxCKE(Ly{95}|mO09RjibsihiCOQSB~E^teDPN#4%h^6J$EatoPYqc;=C`~x=<>Z;1x88?J-}C%y_%t``{#Ry2+mDl8Bz*SF ztaXZ|gqKVf*v;me=Jc*Tj}Su-^CRjvkxa!&^-o9{v(|bX)$D$vw_{=Fb97 z&VH(8xaM(W_UWhd_Fj3JdzSHink42&GFRz+o5N2*FV3#b}stUlZ2c%Q+&GK^v+CwC&0G( z%jy+}zEyBu|FbKX_C58dxrWIrirr*Wo{L%C;P~^6LZ~HV6t`Xb<4^uhZu8zb(f( zF=B_vAF(Eh8wKp*>o+bD4fX05Z9Du*rE2b3qoyU_tqzo#njiVgZ@41#g33$34#hW5 zE~>j!9yeH@cgSqb-&GcYUk+(qd;3z(w~$52UG1sT%;(aID_3YM-l*NCu+mITcAEx^ zB=fHi!gXaw1j;s_WQ#Pb`Ol<&_g4#}@8^rDwjY02ZT`)*srdi#liWWlbgRENKCb<| zri|rFiSE^T|K=jA|>0CQr*)S&S zPGxzP+sEa)LyNb11H1V7ZBGRQml*T9N3;tClq?ipyn2slSMUaDX7NrL&i$uE^H+KB zKjK`)(X_3d?SeQbudzlIuYLaLjKz~g0`Cq8}C4ms8MLuyBF_GwSB zGSixH*Gp6B$qUV6rpF9=Ha43GFlU+wOl#AgcJ;WHTV;&?ugndmRb0Kcu6$0e5>)}N zE%K)wFGyM0hIZ(hS>%C(MUmoOKbAA4n_t4`9&wU#QKGv5n_&=z>-KXFGsW9E)>rwOn zKOcXX^zDe|=FdAOtos_jZvW5jtLJ{sDi8d;(RTB@A`6LkUuUF!I_iG){f@M{mnRHn zzBoCf>gjX2OOGd4ta)zkUjF*Ki~e){X`C;9IGuVk$4Tr%@SUdjP07)p-#Ti4w%928 z`Bv0|pT|tOf3Iix$7mjQfO#fM(f{ciqW&eOJY%0{U(0pR)0auCLAbBkq0ezsZFx{}ZP@{9gR@ z(Wm?fhj+6o`@c@xKmSk7#O{AxTm61d{eRcZPpY@*?{IYS8 z_-VU;_lLz7v|p%NTzV(4TIZ8|_UZR#MfLAaq&9w()olEDZL0s9h?{C}%Yq-jJ%7#m zspkH)JIoS2w^%0rxMY8Y@64Km0#}xHFy7nmx$#zWRqNe)?cAqgp#m>M<958;x8n5Y z1;;AB>tEXN^KH_s9~TZ+|7kf;&%}Bwhht;Xb{#j(!#Hi*cd->Y zit}l^&*i@{Nr`vv8bcAQ3zNkQ!&#+eCniXLX?`Ssz;~t8hDCh>i40SC`d+edE?FVY zRW2>dzPsO?P4r?6!~YYX|J?i$z^GX>gQe%^LC!xL8~M~u9T4^YHDC14*Y#rQERs^$ z=^jdTYXdZ%ywB3yv;MG}Y+$g;#%qG=1?%>zg`XDJ+O^G2Z|f}%gQtSGwA{U4s4Sn= zCU;iynADG33uNsK9ORa~KPY}E{E>h_+-7+bW9 z^lBCR-o#0*ODGo8*&xEr#V5_^lc&c%Mdm(7(=KV&FD_I6A8vB{UCBND)6qEN7gl1d zk7KQ#K0Wrd?j^6{rML4R+r91bD1DvZ_wc3Oy3Qw4E3zI`-z&KE;O?w5^ON2l_x5f* z;e2Y}$whwWPiGykIoZ8P;vS*KHZB2SECMofpjVt7J zrlanwxERN0zE6L@`*X1CQ|R68Zy3BDJ*gKreX&R7^^4C(RzB_jn)T4>Q}FGdM|a$o zI`Qec%puu3QA}R<`tN*vsKs~Zg;MzZm*-hM-%qQk`J{f_=39F8r5{WI9bdmOz4^F# zCf{d<>l=UUni&5_UHsHHgH4A&t+_Mx!@AdLpA(GUei50s;0wDA=g)7`vwrj(i1{g5 zc;~;_wluC27f#y<6xITwpbwcwlk5n{$Y?IJ5gUUP@-5aFErE{b{22X>}IVQ*Np z%zZhhW^{5SK05HfuRq|+oP)V<+jAw~Zd!i!z1k(2_h(jbej5?-@r8>7!xM=!>5sIM zGT$sHkNow1#vcY5jE8Cp*%cW_?_w%NgzuftA<NPz4v+^rO#jZ{)yVGPo1*vU$>ln_Um3#!r#)nHq5_j*g4LxEav8EXXC9n^MUJ+ zO%KoWGbY0Cf;6O$s;J8|eRv>d+kaeO&Np7+Jz`ZdyOvn1EK6FdCwkV+Xi~7T*3%yX6Ay5!4g6#Tk?4| z&jzrnRavq*JnH9m`14GnsGwfGO}yCT@LL}9Gb;p)m&Z&n=%{5fX61fmp~bXKX~i z^O{e*siL#+-At9u@~w&o@~f3t7S(C&{dZXJp=^j=&!T4at>Il#Obgri`T29$znl~M zBY#!?0kaI^8TEhANObKOsQYOY_eZw)$IP*)|B(*1Kac;ImiF~ z;(D0&(`#GsmuS0`&p#@YKF#9{`)Xu={@uK@94|tucRs2tYI_*?o^tEePk;NepHC&Z{_YTE|KmSL`+w11Qx^TH zb2$COQ-rhTT8WxoDG*;|B`on=rd!f=kB02o^9i!;$K+*GR`$z^H_OP&uDCA8>*+0# zFXtqDYrm<`j;~9F6aKLZ7i!t^s!ep^*`21tnPV}DwQunpmNV1(*y1YIv)J{R{c}$; z|Kpz^^OL!==F=t7J8yd%kH49t<^HN(iS2dr-`8*N1Rwc)PUFB2f9*@(-ac{rzQ*S0 zPs=?L|1a)jWqcZc^3VKEua63H*{{}ZQ-8{?bn)>W7r__1C+olEyYuq>yyg|JqMRo_ z`Xy#`_loV6`$6xVpQ$dJ@v_YA--{Th)z8uowmy12f8m2)#@CI+Q0n}~9k=u03!k`O@A!P;e=5YJ z{1W<|_Wg!b_jgr}pP$uiUw;W&X7V%2p5fmy{rL=M_}2W(@y`0Qt2^qCvGTe(hu9LfFG4xbzs5E!|GDXq@88d&{@<;8|9rI#XZXU_ruq4L*^AE% z>g&I4PV@NoW7^y|7tTL=w$3f=ap1Mwrvf5#UR?Pi`$oai;;oeU=~sU^pS)E&@bKdT z-;!@pS&DzG8dRC01ZOiXIr-#I>QRGVOq-wo&MIHSSoA!C`SLttM#kkUe+wDy`1$b8 z#UIP(iT!Tw4rM&eeTen>QWaLg8E5`Ay=DI4*q#0N<6J`>*`x9`V(t5<6M!1GMz zZPbLicdwQ?eD=L^^S80%bk^MaCEU3|pSepS_}O|dD>2lsUGw+mb^aeq*Ef8+a8dfF z$$|4s$L=$;2{;S0Z?l-pdhVRjh5Fao<{Q4Q ze`WFgzviLO7AcoMehYDXdp+~ui#_X%f+vA8`=7X*$342VXUhGzw>Y2d zedGB2qX+lPeR1nvJa=Y#qo%pyJ=4dF?-|}tdw=@tpLdxX4!jJz9Q(?l?MDumZtre-WSQVIIZFTroCT&`PnS|V)1VMyNzu=AFFN_ev>@z{_EfL6W@52-+SB6 zp!Rar#XZl<{rsM9(y@G2tM~S$ShDcD{eqnDcC2)Mr)VSl@lf;DkMpmIzkfR4=>6Qs zGe27MIDU>^bL~szxyBzZ3R8b+xEuaks_>ZMi2hc#)h<QM{DCTK}E5< zcVvWDKT-&uwp5EpL*H0&))M3A9~W!aa>}VzOU+k|@;xb&`o~Lp+oDx+iMyIrb~>u7 z{NcML<0kV>v_Jn4FS{Ba%hFKO{{fB*{w$ku;n$Wpum9J?l372@I>-9p$}C1Pwu*m3 zf9CyGn-lYAV~yS4O|Rts#V`87xO~@Nrc=xj%oD5aIe%?@3G{aoG(_ybJz%&a3{8|C2w@`&51E z3}tp0LOmm$(m|L7ZSgK1G;Or^?h z*}Q)e=ivWgzHNCuzr`h=4x{@QS&f79>P=_9$TBOwX<+i^9*dEYh@yeuI%EC9JrDHt z%byu%*2tsB7|qjae}yDe{Wz>6`TP9ZN5A%NE&jSZ;^>=Pm%bOb6J|Y~EhPNNa)#$U z`3+NVcAvX*J>y{Ym3MB_E^}nKT|Q|bcB!H4?zzK}cmG2fMUO?{eR2f4Jn*_Th}Y;M-#} zw!B)WSolg*Sp0?H>}k)s&5d3xpKAB&b8huZjwLd$_U7umjjiE(|3aSs{jP)QA1Yg1 zKb;Be`FhURA&~PxzDh~b@l&8VNd?-@7wxM$6-42*Uy{Td6Tr*zFk#id}Qd( z$mDc|vD{qrze&uU|Fu*1GhK;jVw=BQjOBXN*59W}S-*YmTm1FRqWW(aA9sBf;br+O zXWI19XtMr$tCIDv^uIE_KEa*#vC%Z|`>xfOenj&&{fM3TkDe`>AH`KlzX~1w@$1Bg z3IC=WE&Wx;t@?59RIS&&r#8R2nrHDY;`htl2pEUlz^$@b24m@z5sbWzN&V&BWn)cX|DRf#DH1yWa*+>u%v;vm-Oy^H_q%}ZQ= z!%8^2{_o%{n|6ldsLBymokL+v@;S#CD|mM?Px}|kw(8nOu4B@B`F~9?7fxSPCEOEt zRQOx=d~rRKe{!?hv{cTY{;txo`GsFpn_eeh$v=G+#%fczxrpqR<;0D*qwHJ9_f8WK`r76xLs3-APSc3OU z`&IWBuk#N)%3rnP>HLb6*Y-{Z?+fBX-gnPPdjC$G=^eX<>Wd>%?e_(3)?abG>TynD z9`or#Ci6}&bmly_{L}JtyC3PF?R@m?ENfcEg}L63E?!CTyJlnQayR7TuBX+{`CguJ z3wkx}ioh%Xw4mn~b+w*9zb5qN@!9@2+ADs%`dzj2rDA#Yt3PX5UoBVp`(*Y6&3miG zr`=xh$NSEOBP(ue2;|)hG_HAA%qIMtQF!CarYDzQmgzlx;~AR!!81br^L(xTFVmyL zKJ6=f`%x|T;%A0tlW#$nIKNNWy#6y!=%bH<=lef-Y_9q&tTgeH&r_Grg|dskZ9XyQ zN2PYi@0B;=8Ml19!QR|s$?ev>o7d*he7+;fi9GXWU+4I&{hN8|wDtc}-UKtu>*-|; z;&$YgnCB~$*3%|@ey^v%gwDu@5cjSKHyWjMY`||AzoIg(HbIGulu#2=E zXKm~M&Zf3^KZo@u8TJ-Um;X*G-@bNws(-xFko8gdmdN`OvCcQPCJSEAJaX~1M8}p_ z8~zu(_Izjh@$KoTpPSd7_<#QGentz+P==z9{{I_TQ~q0M&iZ}qlh@Z!ZLUvZ>u$NW&#lRo&+pwj`{q>v>*dcJ{LjDdy7ubV{g_pMx{_7?f7w&SWLdV1>HeAjES^ou zob1)7xmGP-!kZmAUuctMni%JbR#7?iQv#X(34BcNLWNw;C`vjkc2!WkBdHPZzFhm# z7ZV-Dsb$)S%YLXbP83s?;E7j$r*c7MxlgRp)d!1YGbYXuKkaWLT*_E3#4uq3|BtVq zd0M}waeb1l;SN&T#iu&ulW-vyvy6kuI<=_E8iT1T{u|HJ4KnUnebMmaTxsLW4%#Mh z4vt1mJ{|^tFE2C-c-vqp#M^1VE_0Hr!>`?*Crcx}gg3~#{`|Dt%DU&2!2-R*x(tWD z8Q!YpG&%e~*XZMlW<8e78`^VLYipkV;b{J_^@`cuf>TZp=k~Z}9lzuJ=97wkZ2CO$ zzux&$?Tgrc?B6Z$ctsKS7vb3^LX3}cd9BViNqu=VjiaF}kIiIu!Y_rCjd$EO>fBOj zTlskJ9Y2Q2qPidE`SAQ&&G`QP;cpK=UzFSTw$0%GB{Tkp0~1|m9a??A^33J*Gw082 zDZKy3^2V*cESFp53*F!7f0*|owV>)|a*fr)bc66WJ(qVf#$7h}-WtWh@FPm@lT~!l z6Tfu=@0T~(d}>Vn`k?L5!b^{@XTO>Mch=jai2~om{diwwrarx}YoqE*p?`KS3m?3D zE#o)gweRQq|91Vd7V$cNLHtSoe?DQ)CA{K#cX;~Mj*EIPU%~nPQ}N#)c7+_z{>6%2 zRVq@N^)i>eHSgB{!U(SK+L4F3%Tz8fDGG1?xMBVGFL}nUjKbF$75_Cox-^Mc}Fbn=cnT3Vuy^^Y6!T#>D5lta{&Qx>x;)wD07N zco5HGo>lx&xqQcUskEkNLE1-N=h(_Vw%Ap8|4cjU)2+()-ztf(eYkt}n>P~$9)CUQ zX2Q+%=oL%R6LDMi`B|YXi{qpCvjIDx7)j#+|*$;eJ^tSjtw~f^IX%cH+ zU!C>%h3u-;UvFpivqkw<@&`&@XE+^M^&`IX%L|`%3b*raTVCP05PN0WBA@erpSivk zO?t-n?6)q5Z~MgmEhnEd)vuWSV{fU(pR#Lzm^749Kh|0P_V$p72^^T@4Yxdxq|Joh(W|h z_AfKfeQGp)#5G@!>-)0jA@^3+`Mr2p$jXpC!{Yzmx7PpoSk1ng9NqWoBOnWwZ{Z)9W^Vg~G$qxpb>W{iVs(+o}E`EMk^zB_wtqnJgbX1=_ zW_kAT!M+QxGc(hlX+92pcrx|JyJn_+AA+Lq-CwQy=5D?8^GCL31)p|36n|&#WB10} zefP`gqt|b8EZF(-tjx7fW|`AIU9e+&v2J$${|Bp%GZk>|WYE8A`At3E`#Rq#r@K8I zyYDXL)PI=in)h<1`}A*r+e5j;3;Q_c9l!Q>o7Rf=J5F4Cnl0P=S>|Q?-#2=T0i||fA)5#a?bnpS`A+$;{%^*-+J;czwYjvNjoJ! zD%DDU7t~twS#R_Dm-%Mrf0q{)u^ta?V-??ik3r&s+}nKxA|I|+xqq{>7kIt3`OEvN zlzB|0^YcXc-gHSsJ-)@Gw)N<*UD20*FVr{wpUeN@ZL-$-R}vGN-hH;#{@wjS`2E!L z;qSIuvVU^nX8O}`@ap%IO!gn@EWf;Ax_9Con+6wS9RJmiUO72mSJ)=Jz7f6m$AZq= z94Az_^77oT;F5LlXPNs@m_1PS&ew#{pWn~O^87b7T`8Ed$X9tn>q|95-A@9ZQ6B{F zYCljosZ}o9+I~b#rPEV-!_4n0>z)Q`T7NN+;mNorS{coacO`GHcRd?fqvnBwC^_b3Qp|E_hREnP!$^gX#Gdzpc6M+j~uY8tpUxN40O- z8fW+5*iU9+^SG75Zrsw=;Jad!R54e&ZArUQ-@*cmmy5$}<{H{q+==^R@2t{?R z!FfAPv>$ zL78T6>ff(@SvXbw$+Z0RCkt;jJ#&a;eem=4tY=q(7;fLU*149}@cI1l6FFB;>1)3J zdfDU4LH@6QF8y2n!$slF=U=IbFD_i4ac_#`vBz`8BwwxjW%5BwFX6}g&XX^W23tN` ztD61xgpcowiRJuv{B9OpSDC-}fz_76r(DaoJb7dO`h_=t%X7EMKX0aHqdy&ocHaQ_$qU8)oGFTX=55_pbRi|D1I`f3a=8@v%>A&lh!_ z*3Yb#pMDE${Pinlq_54{} zEj@~i#!}2*R&c6)XxZoWR@X}MQ`wP;Oc#0P{K`l^^mlscsW0Y@E5FR#(En=h;aRu( zmv6e1A%5zd_M2B1Y^OiFqyC5C!3Qyi`!`Nce|mgh-1~#-Dlco#HQyJUHtX?@W4m9K zI9_`5WY5i)^Y;pW&|7xvv9!vjmtShu{PpRc-V23b>g8@JQ^!5nCDbndY^OY_HxtZ*Bv+;FZ!RJ zcEcwtaB_HTi4%!HmxWQ(pgMe)E&Xz21rK^LzDg+VZS_3fUKZv%W6# zZ{O-K>`uYlyuS;y#O~*w6nomgU6|K?iR8pPVG8epxwW>wR?s>9;fO5vIzNfvmTZY< zW%Yswj3oFSk_APQ|6h?*>2Q)sonR>R@Vf`+?=RC>W{Az>{ePfUaCMY1Z}t7h+%2nm zc)4#k^I!O(EUbMZMTJ-7m$upu72Q0wm)g7Loz$J<^jZC+$YH&gQJb|Evso%Bo^X_9 zw~CXwdO}1`*Pz+BDx=9_^3LhTijgjwNABCoCUt2EUUNzn&ME#R&5@I>^&$I;RqFfW zCVuPWbWf~aZ1^J1QA@&HMfQ+M8(+-ZOx_T+Q~bvrPYLWV-YC4wrJX;dNc~U5be=DE zPw%~PjMBYbn9FiGe^SNMaIeNMW?FI|4NE5cdZ#b{_cQB+p9ZOu{um#B{bAOhz`Ip< zFJH6%ZE=B}OZWEYIVKN&`N+TC_44@hwF_R|?Aq#c*MeXC+3QnhU)KaGzOog)`_1XL zBGay;d%0uF>IIH z-+mpQ@>=#?%0sVdkFKqm_V&V5C$Ed&)2y$3xH0?1jI;Y*s88&E*YM)V`zdV!?*iqY zz4$%*?A0luOD_oQGB{T%A$s*d?!~(w=K4PP%l+f#PydJa{zuJt_H~{46GMjwH*Iq> z?yXwh^L*7!v(Gl+JUr@{3VI*_#v$J{LpS0~K7?h%}vzG9^U=TTXiZwp+IIqzrJNBT>yll4>9hoXb zuK!Y#5MaE_vg}u(hucq~(&yi}mMML=5C8b3((2jc1z%U*tDaGM_wMBl_c{D#-FxLZ z;W|fi`klCvtM`|idcIt?{m*xf&h4y~PvieJF>(LBQkTV;bb2OJ(B^<2%jcDT+-AQ2 z-F^q#cP`tQ{--@H=kzK)D5K_oU+mD0e$G12pUhsbt;5*u z`j;crpN-ADN|W2=kUZbIpA-1JDtH7wN;z_0zRUAJX|>v)9N8s5CoOaRwANzni?*wC zAMhQ|x?4Bp@SUPAo%_`?r#=_RD>2=+w{4LKU zpBMUn$vUOqg7K$BwLDI1%)NI&FHPr(rpv2G@@-Bm65O|21(jN!NiaHU$-fIr)}A)o zSKmmPBbFdMO+@UCv*~G}T z=9%8V$}f#fMxKxU)wtjLFZyAQ(AT}w)q~ulbuRUtHJ)s!YsGO!!^WT8(SbMMl~vYq zev34lr)FkqK6>8KdZvy&_HMUMoA{e%n1!(hfALoqj-SoHDeD3B@ z7R2RPQGC=@x#*8?{gZhfSL%cvb^TwO{IXwVX8)o=v)G77`IOxx?Yy^-^u_N)YTr1O zqPlYJV`0?b}|0jhDRWA!wD!*S-<^8)}yy)}Pu)?<-Pw#%%bno;h z@g>IZr=)J?_LE00n_jLIGkkR=ecp$nx&0rXZ;JTt@96vc zuI`lIw={136%Gjc$Ghywj}yJ?nf@m!a$iP_96h3_-pyn2%R!3$yGdtFO-U$MSr-S+-9XK&sC?sbW8IE?GG*^- zgdM*@q8eM_>J)wCTFw(y}#zC6BN0{Am5~XYE{%j~|S?pKa~yd7F{2ioYB+Q)xe`$+HO)mMq1R6Z~IVES$8 z_orKne0JOa7i_b@{1$@#F8K_gKF~ zT}XM)<9ht<$8Wsv>U2+kbgR|=8g%RX`!MgO&zbYqeS0i?;nRtv!!KH=RNuM(V#e)+ zbm{vka_WyJFzvW^V#$&x6VE?<@?HMRV--8@=M5JhzjWi2e70KK_5RlNuOFX~a(+H( zed&`6pWZ%<^G|+OpsVFB_HpsRr<8$GXM9ap#8t}Ui$rZ2##S`aLkJ>W=#yE?|0|F?y0uFg`Ug* zU~e<~9x5;SO>b%V`{U=CU!_HNKa0y+`HrXh9%JIRxvUyLA8?*gT*np|Y|6Cg-KL)+ ze@=g2v@HFX*}LZ73JYugt?9b;^Vb^I@873||IBB#VReWSWKU1D=MJ7Wo7cttnXvDZ zwPMrGeiWDGpCzT|`Lfn^h{xn<8f2_K!4CD+QiN9pOZB5BQce?@qb zl%+0iex|hJP>afpt+VBWUzMmN_}x-8*g8|i&xKp-lh{TB4i-)`#cSFYYiCT-|GwEo zF@ILQhQifGUGbRXI=Oj6(Ia=e)X&`t1F^EeXBG3bH;cZTgsKk zjA|?6|Gv4f_wUNG7B;B~G90B>=CLf;`0M8rfs7xklN*0Mlnk04sk`QHjE=@0DFgk#vX%}Vf~K767xcY;sF<$Yb-`9e zu+F(SVTt3q6<$`x%C!~`?gv^#Z~3JcP&rqB!{#f7o6INa*PEVEt~b6eS>hBRcHtp| zG{b{gGS7`ai^?0D;cf8gsgIkj zL+<-zJbiLeWao2D>#J|#r`5i2IWzG=kids02Ax9h^J^A;{MZ)$?ypGrn;VxzUe7Q; z{PJ17?Q@ZT-=6N7v*4bl$H|NT|D>H#TD$+WoQcFagD3ZI-7@PI691%yZ+>~%sqwk}X~E|+%fZA{ zD_n8-dRlPF@7wo}{F%=r{r#~=+wW6NB@8wGi&zSMOgN9mm9i!>{$dDq>Hk?`dH%zC zRh6eARu|q?{(1R3;l)&jWJf=C+n5DhZ!V;AeQP&im3-CrOMI`!*Q_ZIz6BX&e6?(o z{b0O^>-`_^$zP7Kr+xdX+V(R*TIc7|r_P`LFU)@T=Gnwpyqqlz0H5; z+`6LAdoRJ>?PMu=fS|5t4e|;dre)iG+%-PS%*s7m; z%*?+Z_w>}=b5rKrUYq>wmfOvVm+B9To$D{!cmBL))A=jyqSwQYuY8b^nDTtt1DofI zW20U!%yIwlFT(Jnfq>|z?Q!!zoOreE-NBz1KJJvB_G5YRNd}FU30yyCon-fW^`6n^ z|9^H)J{RE|eeUg!uh-WWu3Bo?+$JfdG9$_-oN3l@{*o*`Qn5} zBIh(0@hyL)#<%fZg20|?CN81Ic;-hwKmJu-p7i_2OO-#f|2<|)`}s!n8E3S7?jA)s z@8%F0)~2nJ@n3hzm_}8}*`*f9sQ=*=zhYb{^2>dZgxcj8Eq(QD%UN==_RTeCY~H0j zGh7V$`%?0+YZqSs+Mw0? zBO~b1$F;k(o+)hq^L+N~_aA2j?)dc5)cl)cPU+VLdWoMS_N{$iAF$v>l){ro1`NE9 z)|>3O`}oF*YoYRMFN;iSxNcfF<<{{XNA51+U3-t|ChyG*w!rIRy<4yMxog~*7;k^O ze|698+|7kIQtnya$XE*_x>a&!R1c>1^#@G-k zAAdzwUiwmWvi+_2xxV*m&-%ab*Ejs-VHf z*JsYRyqJ6@_t~^wzn80?g}z&t;`>eBA@*0T`_khr&idnS7z<5Q)s|7Pz)S?5SU=6TA- zz|VZ@G;@dm*Po>?R{vQ)#hRrg@eJ$Lqe@IORWANp==k%OQrGIw9G{v$ZThV9>(85+ z|B6eSe*ZjI_)(;n;nfl*n^$cc8$VxhF8KCWu;NQl_T|q{7vBHbet!>JM&CwJ2LI2p z-)@^L3jg+&eCfM@&*WYV8_$h;F3;*N5ly>z$@6-0Vjg$jakA=hb0kTI3d%_K$VRYh zsT^HvP-H9O}vzp%` z=C0V%URjBwOPnO#^7cvHZ8w&Q|IwyAJ-JuiwL(lw`5C*O*ZXXpC~H}R`=84#|NPZ* zd4Gh*`Q+ZW77ZCPrYEngv1D!(vAJ2NT;lGPb)>pBWxRheelVV*E{um-u!uYKn-anuB%>Dns z)ab+gN$0jbjo!cL=_cWg55o=Zo_emUeLZPa-A7jL($AlcZ~XW(CgsDUvmKv29Yj7~ z35<@U4GWUHdWjoJs zocq8{4*^pKaUr+f%OWeLt{3j!v0bQjp@`tBQ+j*`zeBmS&O~xQj+)BNqN2xZH7${! zTdS9M@$L@6_sgQh#dw~}JYdw5zQ4vou*kWHBWdYZrVRPlzyC$s{(Sa3{9ozyK$f(^ z4IC?edNNg9yY_c-_A20hpzp(n>JFkG; zANG};e}(JL{|NbU`O~Uhi$7>{zy192#-dLjFV1*nJd^$DzZm(at=HAwp00ELkx+ky zscy@1t{KLkxmHX4WX@gb`B#TY{?9drW~Ny=In3sN_5QhvYQB3bf9Q!xIopdbz7sw$ z{Cx4%Qv3U_6!z3V?s`Js&m1UzCvfECi?r9LUz%@z_tfn()8j?mtL~&Q`d{zfF!?sm zl|>$JaLH+TEvoMp=R{9g}qliNe44z391iOJH8m3@bP8r5F<^5@sh*A~;dUTA82 zzJGPk`p*vbNM_cC1&o|3Ggu_PWboGAxheEIdxFRZ&JfYrPgaT?vwkSN{Lp!U$-0Yp zJeE6iWz_ic2A(;}dAsb)?}CrYpJ&DW`@Q399@9?2zpUpBSvl-vm#}T0(SMHryj+6_dZ|_oBo(t&hPcfxQ4IZ8MVLm**;^azC4XxLt25obJY{(D%H*3-#qt! zYxqI>dDUW`r%(4Eeyrqa|6o<#p$A2=O)m~etpA|bdjF%Nk@b6xU!3p%Ge^Fi5nlh= zS2pI2;tkI?%on;|S1c%by+r8YyA^lmyzP=RerYXq^ZCP-`p=I}eg4$KBkTFor*W?* zryIV%$|3dfLC5xY$FE%cpuw>DJ4g7v{~-_lvq{M;W%2CV`2T3v`TuS2O8Xz@+y3wA^MD^GpG1Fh+4l84uWHm6hWj1AgSNLbZhqnV*StmX z8|N+7?`esbe(`ZG{Tp5W^$)ATlYa+YX8nED`0XeEKlX1?Th4!bX7u1&^F)`Q=if#D zb!}1kTb(1wu=!6JU*(Z^()w!~!ud687| zgp=aeTN%Y4I|oX>H3*cs6q+Z`%c3hSdw-4S$J@1HyCpA4Fn{rveEfT*ERW?Jl})GZ zwF(Qj=^ieet7YGsqrBBDQ+{!~vD9N-7J(bvpR-z>+QBKB*&yn0_J%@+hKu&L$LkD^ z1ne=o&2>v#_oJ@zs)G!&3umm8W}7lY#v?sa+Ijvw(bWsN1m-Eq2%HQ*CHV7_qF}Lu zKmTRVEP>MoiUM;&PVhyDD08`LU0|wclliyQsPNCMU*OrZTcf2Q|8ZlK?B}kN+U31o-gpX+Ld>*1Qpc0d3r*G+<4@IJ$ouBxA`TDr0LJAtOuzZ8 zy?#f|wP2X{FNRT}=E1-BS**W0hcxa^f?a^W1(&szhJbP8Wc=7vd&)0ms`Ns0yS>5+9+HaIUeam*{pFP&^OEl( zU%O`g|D3sT)t5dI^BnOty?lMDF4h8n*4EMCPfB#v}|4rVj?X8_q;?ul24$s$wvVLH_Ro}>&d>KZKGt~U)`7S&M|4mhjZJ1e=*Mr|7Q5J;){#gua6b1++W0uzI|QA zI`MP1*`+u0=5Bp{;ZMSo+>IWOy~6Sy*SqX{Y?!m?Mbvtm50ZDkeBSHw{{5*2ySEdV znBKFUnEp{%RNtW<#!*RPut}B?3?WA=XZQ#-)+xO`fO!3 z@q^dyUoTBqf}gxTdh3y9xbh>7l(>f_)7qbOUlM#3yIc2jWZmT-29q1VO_5jr5`OjZ zhsp1bzuR3Q^g2{)p#bp6Vcqif?{zCZNl z#S`0v7iaTlJx}N4e%jBq;IX@O>!YL02OgMSjJyA%wDtb9ovR*{%#3(on{w)ri+uL8 zyAHcw`0lNE6|7P6u1x3nXA^$IABm?{{Wzh)@~cmA8H4XFb&gjXe)95GujiR(^oecK zg(9Zbb#V;$tIquIzQx93rq#pU&B`HkQFOj=_OlCo)=xaREMF#b-Thw0XAs0B_`bGL zpxJx^kJ(NwR)4+O4C|`nnM4joa4uXb$bamlh0wBJXN5|>H45sTv=+!doXjsFZpwG$ zL6O=Yd(Gv6EXk5`8%EO42pB2=NJbv9$7 z?%|W?v=Tc_6_-{iOCRsMAYT9QhUmvt?c$Gi2uKUNn8-cvSCn0RfnSRIeVf=5B`1-9 z9y68Xd(K+f7bjWN?=`bx-nQ6Q^vh?H+}=DD!JLYbH@{&gbasi6=B4kC zWNu$MEPq8akXPw|szA|CT^7IXfj^`o4t)PA(evqF*Y)pm7HY2~l0$#&>C*pPdicVp z%!I9f>w;YVZ-~@?Q|vGK(#bgGdf3kTtMy;sUX&31bZ9}B_%`!nvyU7MQoinIoPBY> zJnMr*OU~zJZ?6A%XtDI8zH!`_i~lD)x7IMYK3BNp#)qa;k6oN*Tz!0R)xPrHsYhD9 z{m=ie>$&tZ-}0a#)An^HuTr)(%ChYDuRC(^_L;NC7YKhj+3Ci9twN&qzFMU91HI~; zM@uKL-_Vc}d8oni`%z8o^BXC19$aubGv&0xBd43^In%GU>l`~Vsj=bkv;@X;KhMY9 z);#y?8lQH|r4uWpuIHxwyKMDb`5xnDv5#KOtluRVE_~bZApN)PjnDl1rf6~XG{pW( zxIO*PKljbww%?EZ@#vxaXLm#E&x+a87*k$sWt2F3?&rC*ERKZZd1977iezhr7fTyS z?&k@1u6gcuFK+cZ}5~|UL2&9)b>$px|E*GY3E3-sxV&pK3D1Tk2?`dg`{%kseC)OTSeWaOyd1cCjKSIqM4&#Ec&PTWdie| zh3W#O-P?FJES)X1VE*r~PklpPy_#A1{a)@qHm1f`-0M!Wihq#Tm&)q?A`viup_ES4 zdHxXg7M`0A_Oo`DaC6uzIR1;b+{zTX>orU8&!krYr@lYc7B%@lQ<{&T^=g=4Z(^|G zjfQZUEhY;U`DRyfuGn_%&(wr>3|@uu?C(tqdDpIFVx4Y!g!_5Yr@w!nPx>Et%$e=g z%zDPk_-o%;)^#()Z7Tf#z}S!T+?h+9VatTri(FQ7il}ZC^LXkjE^TMQr70^Y!2Xg& z@QF!|}iVCyL~yy z%6z@5d71QEZCgPzWv-8J7H|O!M)477=HVf^twie@_E65*ezMg;K znPq}$XE(6jiDPA}lvu)Ql_&G_+cW34jHe&ID=aSkTDMgC#p(3gC&|_-uf%^vzBK;p z_Ws;pX{e=f`}t?9lJ1eHAPU4}P&vDUaaT@y!13<(2s_6*v8P=v-R# zl)EG9K8t+O!|Lh$FXX3`zMnMj^yi-Cxf2telEw0`NI1(g(V(a1u1s?->5wGNwkis5x+S{?OAi<=z6Oc-?y9W z{_<0A&07%}*QZ&M^W|!JjmlPj3(Tlym>|n5{#RdBM4Cl{{qf?JT>d!*46}ngSl;c~ z_Ema9&4-}mH(#u@Qom<57v8Id{cMF&v zno058-Q=|9_P_74_w;rjx_&(Y`Bktk=X2bXACFW&hdqk$kbNB#EB#ivOyg~jj@})Xiu_9p z6IyQU-otmz*!^+PyKLFRM>E>aKDxN;*6ZzDDjz?|JbHQT&;PgVo>i~* zH_UpOFZAZUZq?NfNz>xq@4or|`SdG=&;MxJeVEVW_dS4p{)dUvzC3)>x$l9C0q^th zAlsKKY}!8BZF6^BwtBbzVq_G7UnC( zPj6n#d^+dR#;V=l<{4i8mo-_3owdk?r`%UbU>_qphxr0^)}vE|zs`M<^ox!n`y`2A%p_xe9iZvqlJTLKHZ4cp) zPqz7!d0z3?L)FQz-|Ht|xMi{OzTUQrKkoI*|FMcu`8{`C3}bzI;Ll1;jo)uNpS%uW zI`$@f^6d{Xq2eDqHw%A=cXob$#Z}_N)h(x9x>~Z|e`gtgeOsRR4f}67xB2fhJ<8eN z@#1uQ;)|;;T~9vFzHn3P*W~+4pZdHqm*4Vgv+vrE%{n^2uKq7$nm2j!Z=Yii-%U=~ z@b+9y^}VdPQ};sVxjwtRS>jIM6rVGG4+1W_H(TH7^w4}H{I}?dm)e6{^Sra~*+2Ar zJ?GD#cQwXNpIo?g-&-%C=RVX~k$JD)H@9$Mo4h0-d8iO00bF(Y|@=+q&`zkG!1@Jl^Gc=w;I6wI9zFa{OQaFNV$i z;xR$xOMj%FGAJq7Hic;~zrNBYR4vlM$x_7Z8KZ<6kN-IZSHWk>^CI6!4gr=|Vwi{7f|v0CmYomH~ubV|uCa23eQKEP?5 z_(Pn*V~LVna*R?i=WXSKtM;la*ifh>$kZmW?c+86dmD@yx71mo+JA=57Kyid@tyiwMNyS1r&id>_=JDpPZqc3S#~mp?Mufw zw(CY5-yYrRdM?xD$RM^=P9VJL59iUnOW3`%ytv!B&NIm>T>O9Ni~8rV9V~w|`x}|I zvu$Et657Lf{lCE93olYxx|sL>R(bX2>&B^eUzQvc{PwN#_vioL;=br_p7z;2_U{KV zEBV)ou3w+<7OsEWXg%Zoy{X*tsYf4b z>@)hKbEM73_*4v|{?d2)ddna48I;A$(%kf%O?B$p2^uS;=PT`$*`qYUQbkefyqeVI z2NgoHS9f!{ez6gF#hELvBpfHp7S|`PBN-|+U-ydq#@$a8eU7!O%$9Le;|@$$+?nkr zYb3l_Zg%n)#k=V&(mJAR_^h4kx%rFI+5OjE=gHl#Aa-hsz7$Wz5s9F4|M=Ip6|(1h zN$>^kzACBTZZBmk_LEPrLi?xUNwN3!F6TZj^)-LZt*!9V+Fbu@=gW{^7vensaOGV8 z+^)s_CcEn9>p4mhFaPg<{h)u@`8#?Xj~}dC?)qrg?c%5P-y)x@&pQ9*4x{JabZ3KK zx2NX*^h)SwC>PacUd7DAQ?; z_eajo`(Lstkkdq8SfJi&j=&nzTK=Gys+_WppMHBDn)`W5#^3jKm&HF_T0j4($7|IG z4PNs<#0y6Mm{BD5anpzGZ{+_Rd+{`!a_r5`{&!d#|py=9=o)nCC2S9N*Mk zS9`q0|MG+9fmP3qC#-+Uvv~GB<6ZnWc1G)5*4Xgx`b9~u`?74S@3ZJnee^9S?>^U| zT@MWXi|+4v9D0{;&4U*{YaYKi8X)`V-2IR{LUGzR%=PErx4$Czv?DJ0$!#B#yDa*S zcZ8V_Ja(7$d=lo|c>m^Uw#(apxLj0BRlUsoOXTY5eY#I|;&y!e)s*ugCMxFru9X$v zjc@fa?s_zb@mh1{pQZ(VKQ3t1f5~$6{`uX}oqpG0()Y*5{tCsX-)%` zbHcaMy~WNfpU8hokdy6abt|VK?=`;L>GL@2%dL60ny!}!z4}MSEab7w)|Dk9t~xq` zC9_&Y>`I%3KMC@1?_yD9F`1>xvMA#-ll4<4wwTJ30@Y7Gs6@>)*IvnRNJTzbR>4)1 zQNdb8S;1;of#M3QK$*#3=8ANCMo7ix#>@H73eYW3FEyBbO0Mw70D}c>fayX z=^mSSTuviNC0BD0u!-cI(;nL)It$rgR;sNK`xaU7GPCx7gxaGxO>m zq|H71=Fdg$&w0YypBb+;zBy%n^})vvS1%oy6Lnl=O3a0cy=o_aA6&P;s(ALnxNS|x z`L!GmTPsWK+rPADcVf`qeL{-mXADg)UYAi8e7Lo~=JiFF9dBKp?s_ZCr}C`f-p~7H zu}lw&6VG3h2nxKQ*>87l;vU3kk2dy?EDc<@WlKePjM|jd7f#l^e^Ek-)wErt zy5KL@nk#y|A*(XD#k#Cm8s3_)l|{31-pjUS>1uoT?~b9yx5BDrUw8$}f4p4J_G`Y9 z&F}wF(hSw|Gnp0qtr(^xTwvf9oyn2mxKgxF@r>mDP6_EHMV^xHKRpn;{kKDKhI%E( zMg_+IG4pGGOyZx(DE``yzaZh*}08BFvz9MWB6e8fW38Ni)i}u zKa&0bGbF4Z-R7-5yM|$Hul@fj(b!zLGm@p`_I4f zFndh4yOUUB=ZM)@rV?YJgRi5j1kojm?!TjV4A+ooncDDdq&eH zH^%o1WB+ZQbd_Pg9~aYtt?Z17pEQ{r6^^iI_by`$Qdj-kyzl$BZjY%So^`Xo4!?Ku z-Baf3uX}e`{d$*f^V=?=`g@-~;~)MOW=8QvCVwo1H+(s%=k;d7yq=f+dksFGoBaFB z%+ed**9aeBV3EDTY~REGZ-T&zFINr)ygwqd=}VWM!XI6=`+wOkfBNx!X3Y1>$J@Uy zSBm*qb(rtd+C@HJtNz{p);F)?b5_r-k89p3d@7%%`Mvol?=OohF<;M?#lBIy6!LcI zVfFv6&sPhraVSt>J+MLP`WZ)sQ^F$B<(_e())6zsX0m;joq6J-ihGTYis;1UiVt~L zN$^w%e|KI5-oQjf@ zWt$+fZRKLYT?h1d)fb8~ZSH;ZYm@e0mP>{IIBLB=viTWzamKtTWL>^?*8lhKZvCG0 zc+>BzPQRG?UVh}M_F2Z^+j5$@-0;J%r!K4iSU<`7KV^mEAH_rGKk2_c^6XC8>E~xW zogd3z`Eq~7>pR{fjAr1E>;+9f|6L^phVlvDd)(F*<>zkS!=*jsw)#^co*SKG3-UOk=UaC3fg z=UvgHBafa-CO_-o%6vEJ)9J5jtb9L}nw$SzW$O5~Rj=e%HGA|g?V!wWM|#h_5&l;4 zI48mWi9^<=*K2OQfBp4(@2g`|pS&uLTKB2i@ZHb6-d#VA{S>eC0|1xAgF}>UM zDraxu3lWZuuPa15Uvj5JK0WMy?|tnVZw3{)oBVYsuK={5-$@^Uc~;#wVdS|Lx{E@$E-a__qm3vp%$(N`B#TEB=}2 z^~bM-WuAU-o-59l`DQ7*&LbgqyR$R??TqO9I>9yR#f(=;cl;HTul(C1eKB_N{9EZ3 zvX4EUt$4h!>&IQ4DcA2*|37f=-1TLTHf&CNBvqXER4=^oW62razxSuN{a4Y9W|aLZ z|BrR%hwqzW!``o%wEXqXYi>_w?TEgX&S`OzM}+U*o1YtQ`{=Y@RXqRVx^Ax3gB{QL z-aKvo@$uQ|YoA=E-TYYwzqjQFY_T-;S#R?M!zH8Q(rLpT7HJ zz4`d3@4O9mG_5mgEq|;(qx*xd z`_z67;j|U9%UdS!-~8~Jakrb%|HyyloJTCw_`m6J^2;=`@K_0*;eO;>!2ikpgpk(0 zC<((C_vG&R+>}4`yiKP5f0Xp!wWq}YSDh2hHvB1|U2=r|x0o2iwM2I2*3f_aQx^%# ze`=9Xjar`|^VaE?Xn`50fYs$I0u$qIh=#tnF8BOeh#I3%jOyzYYq>KGlf>(`{1F%Y za#u#B8~LPcDe=gu5CUq1~wmcB2NyPoY9Q#txTuz+u^fQtAHnVxG(s(+ZT zE0rD2ma~rdB^%GGrTg_6$X|FW&-7bP`kEtKTkRwJJMGF?26;7wpp=Ptj)$v*d@ zK1b?pQNGEt{9H3mi~c{{d*j<%uKyn|-zobb(tPmkM$@X-&9k?^-MoC?+q~%#ZA`EN1TgFmnMrTo4yWZ|o*mjZ8v>d*X|`+8cT=S73M`*a{m@g+5O}FE3Y3{m(Kcb99H>m zHtXyc&AXnyWtqkIeYf#m<{il|d3VIG6*ydP&2>3z>i={9mc3s#ll4jWPp4b2V(gItPv0LCoBqe{^A*N` z?yi4@OjCb;V`2ED{Mh`}>5ndV?Q?!yj5Y8(!#!Q&LIKm&n@?qK-u`a1{Ce#{r^{yp zKVF{kW!IHek;|{nTwH$RKcD#1(24WEF0(TJ_p9vP|D6e<{}~=k{1u$5_T?x4*SGUc z&p!$F62Epc^Tyc-wwIT`K6`l0E@0y2&Aqzkb&hJB@A%(x$>jL9tCD~3U6p42f8&#k z_S4{BET0x_p76`#OyJ+Ez7GG2T(-FiDv*!Pa0=%smzV#iI6N-9=PkU1hhN#>Lshg|y3H3}yD`=$8TX7TeD zUg79}WY5_v;lV${W0R0{_)8wmW4o9c4R-!@-sSz*Vre<6o!MKFj-Mfl7a|TS{|NPz zKak=i+tX+-XEH-lR@Bg6R@d~rw9l1lagOBYV(V0%%cUk8X|y_B)e(D|sBy{5L8h+O zMX1k5f$OO1J>KT``VzUi+$v1Vdo}a_5T~cxqGUE3<5cPw=SMzzwPo5z0K?o6n;y5ljxV)BNnu`LNYS1U3uT1 zF1;C1A2g#^uN1r9D9qXaZ111ozUy!F6KWpM*g5xU+;85Gn-{kIsgP@7Vq{ZhV#`|h zH^#BykCl?wTq=?kKY8wd>k;ds#{ zKi~TN@n5H}l$y=H6tX1$>}0;q6F)dSkFGM@c+5(z^mOiJtMiWBv#wbmxba{~($Oc& zwj?~c6&>&}Z{Fei=R92Ron8C?7Srs-`X4b@ z=zsGyvA>E}1^&4=bTV$Zv6^MG{c-mB5H#Np~iU+h1GYbN_4T+NiA~V63nT7$FyhnpYIBr|9$+* z&HbrACF65h_QgN`H?C#no_^X;NK0>@V8T@q-iR7iuDSct zIJeqe;yh(~m2cwJ3L(djhQd2{DT}RdKP)}RNJj1{KcDossmBCfCf;P0&AIXWICuZ| z+9Trst&=WtFO9Pn|8!1Pg7NWUe$Gj?tk0LPWSZ2az@FBk$a$*6i`%7RGJjv&3;uIr zCA<|vC;7r^JNepX_i=MHoo0C=_T`V3>gMl#+c>^nmMQ=8XKmMyt2{=`n*~yMN|x{E z*spT$zrVzLhL+QwEZquAStmHDaU9{P;%VQMB*+u7Ot_JyN#w!~7qPQjwn=o)H58w) zI8}Jonqc1g%fh@CXLj-32o4rron9oCobDy28Ja32QL%@6Zoz!s7gt3E#dazSKP)O2 z@1FNVp5suY@`^JzAAwXs~#GS z_WzWR{qmCTUDYlmw0kmt;rn;OZG@I zX%}Ny`XBbQoKQQ=TrI84`r3+xOY5>I_lCWzS*jN@{+D^G{ipMq;?`){ySBHXXaijuIWLi87Jk<|G7El z{}*MqiCGu7YV#qH(-h014Ev^5u$jb7~Et?H5CwrfJV>>D0Q`5xqFNtd! zzPN-Q_;!Ee#$Vf%F8}vD`IvS4*8RL2_Zth8y=LXQb}oU@rsm4;yVReLk5PD|z*WUPBF~hZq=UWZ z%U=@Rs+fGjQSs92D{}mk&q?L3FcVFmy@EG2B%Lp?URmr&(;E5&<%f4RNX^`7s$><5Xz{yy{A zF!S|^lMU|{erNlTbaB-ugXep`PpEeO%hs*;PvoEN55^{~kM}lz{$%p{^ryVpac_8K z9iCULFn^l+G~#*oA*Po~@@HS2x%>K6?%f@)B_Eu4bHqpZeY;oTN5=BYpV;3;fAzO% z`7X~n{a4Ee4F-vI)0mTrikPJ@PyKVsvGnt{4a;6_EW zh>Yd>n{iL$=UqYeuMbX^ymw>qe68|j|Lgb@kKdbbmj0Ud(Dtk5GS5#3U$A_fDsS?+ zbf4?bm!fI^s{(hitUkJcYxR^{9L?f0|2Xoj{7{@7|8mNvpHDoqTpxa`*nj)U6wT{V zP8L_6*9cy%HhOWh{*B&K9@oX6wbO+DxXG3OW3};PEDUaCV_-<;e(BJ}bMfj=F5Bw; z9E$#HIKHg3;1u1rjPw4qI`*JEPDT-a>2KNpZ@j#*+VQ^M)~Z`Z^?LWJ>M|cyt1&#& z3$l5pF=OY`_qKOmY*WnoT>WADf0w&y9R9|8gdQ%em9vUHuIk0NLzBPIU8`*Ae3bxq zU8xxnOL(U4bY`ghAN1WUXzPdPLC4<&uQB_4s*?Y|ORzVq$9*0KlWwJ-84K2aE)AUg zw$=H;>v;KR0{7l=UCjQTRdHYxV^K+k=t-n2&QNDgVzJ1b#jlN=M zN~hbMPP^89E|Xux*u<5s{h>a`^g_Qqx%fIH+=Zd zrTgNKyxgoG|FoZeeOl`MZM%j4x3r%x-%q=)|5)ejjamb*0Z znnGrFgJM#ylVTQQrj$XQE|2+{MgQ1yj(_Vv+xpFGUg?j%vW-7AYTx{g`MQ=xML?AM zbYz0yf~Oqf0S}KzK078Yx>?_q`^#NhmL7qrOxe{hm}@7{HGo<_8 z2&(Pb)2H>D-&#YuOGwH8-dE|58qwl0uA77%+ww$H1mdNiWH8BaO;?lryDC@2VQrs~ zronr`KS3@6U1g!%87l(VuD|%icC27I*XG>&yw5kr2tN*{O7;NL zM)9iFXM*9+6?yz#<#EIryYuaoXRshxR3cwQt+R>+fBbHcU^yf^s33* z`#Oi-)}Chi^lRpmZ~V%p|Jvksam<-1Ab72Hq42k-!h$g_)!f@VpRo7)CbM`%<}eEF z_5PzPcIEd)?x25h<{$nuJ%9DTH*n+Mlj@uQeSG$VSxw*#*X`A7d4mHc@^@BA3R$ba z5Pj4pC&RRPt#W?M3iTva4$VK;1$69>-__yU;GnY1#8YBZx`Lqgj5uDi)L(o;Zzl;V z`__oKJl`UIx86%i{8_7XfkB|$TZJQv{D+g2BpI9)RrdUo{S~)E=FRW9a6z5*6 zQIwvmA*R_pS3<14MZqKOp^Cgzo03vwleF8~CgDW_ulR-ENbx&pZxUiVvsBWx>#Mv& z<8lQ%*>w4fh4peC)3PNGM_m@=UeV1hyV#NQ)xkBKg)cODoQ@0ez3f`Vk-N2tHKT4a zi=K}g%UQ_`Cb!e#e_p=7{Hbo`)pwGmrSEU(octX3=Ebk2V&+WD{}yw6U-*~%_f$C! zTb3#R-={YGEL*$e`;_%-e=eS=^lQ@J^zY6owO@R-az5zjswr{2`_*CQ|sb0ZymX3eii4RoSLxhS?*1zS98MB-qy$d zcylGz@pamDxi|7_D&A&9|9JOB(fM=W(WoC?3ts+|G+gq1zO4MGo96`Id^utI?B|>R z50wlfAHQE-{C39DyWeWdIe%n}?EkX!Mcb!v)h{ zv{iol{#)z)w^uUGz7hHV;g!?Cf>hY9CFKg5KF&UGiFQP2x+T z4OgDtm0WPYVw2UK*V1_p6bcQVEBJN45`Go*wq|nd$CI;JzIq9s`ME{L^iT0Fk$*4S ztQjWiW-zWgdzkUySpgQamIO9#r{%1!Gn1K`E-(1YBf90!y{!iS#n?L-&TVG>-l;T=8NXx7A3#unAWXt_V>L*rczXzxTUp)+KS}8jl*8E#A?>vSJ*( zOh4ke%3u3&{!ppnm?->~&1c#zwxg??x!x(J@H20oAoeM3iJZ^zboEz>|Ftd7&ekm1 z*020}^lsyvbFP(MB0x^D@y z*^k0^hOH&1^|}5%HN1XT#We8zC6nvdJdK-g%r;=$Q)qaouif}9{}dCE_b-iGf>q3p zn$59kTDQemhN>2^+FRqC>eOI7k6>lC~*Igf}qm( zyQ1G7I*Q3gEAX%JjbiEia^k1Zrt&u`!gC+D@G3v{l?!_|K{NT)Dii&;)5BlCKUZ`8 zlb6KHPY)Xu-!&L*dr?mJ3U~8O|lQo;)LRaq5|krP`N%i=DgmuH*0{ zC%vX;>72SRil<+GQ=X~+KL5M)JLR63*PgnmFIf#8U-$%yzPNDA_W5VepO3GE&%9T+ zFZ1@<=zBN6cJ^FOJ9_s-P@CxCqbt}Czlu6^jOR4(+3zX)ubx_c=fQ!w^Iu8C3BT_U zS^7?VrR;ltqsMO<@0Dr}qj!H1I2Z`0azq-Kvh`*G@=sUt?~R zz1h_>_vWRgH?LjXw)Ps|p5Qx?y#Jqy{oM9pq40~}CmCL{o;tUgXU0({e*Jy&0!9~l z_*V<9HnLgfBuCidN{BJ4|)R&g2Y*6^5!tl_RvS-^F8^As-6`6*nN zncj1(toCMi%T8yXQ2mW_Ua>ImmI*6)wKlhLDP&8rCN->NVtKflG065UgRB4g|1)3v zG6qgr$99BaE~o2nH7;4x{hXHrWH`g8^0BY^af{{RGbU!9)C~+LgZBJuN|?xCwdyJ} z^V_#f5BC`S=i|8kck@z{zdW-S{t06*`_s3Z;h*K5nT&V2^jLHks9c&l`;2YR z#slp4(u&#q6`wG_N%LTuF!vkN!Y#}!o64G*H=VlkUp^=Q4_CvLzbs16|1IHt^y>_# z`j^AkRX*G)-21-cRN@ESdA~kPzAXKD&Hu))Y#eXDe%yEH3rE%ZFSZIjUlxZP_+%9^?rnszlNrJnzc zO2vl%w@>T*`#8z{Us*ylL%$V2OZ2i*4zZvxZu$ER-2eOpIqqIx&dR>>Gn4tGcmFr) z9Q=DMqW$mg{BMjWb250;e~L@qTE1LS>5q}}`mgfx@56scCVAzGO0ZZ888uc5vbsza zoHsp#PrjFnV=4Q6#;OgW|8+ZOGM$SmVh`Cffm>Fmntz)2QZWy+D%r_m?uyB~?<)5^ za8^+*u2;+u*($qcqoq{!jj7`6Ul@p0Pje7mH1(30=3Zy1v;~S%m6cnCzD<3=(Y${j z!?L$)ewJlqeLlgZ`lQnZAvhs^v-#| zm#Qm%*|ndW$0iWh_5XL& zsqeQ}q<^{K8vj{nal;qW53S!r*#7+Xo;-`mt>G2hvg<3@oZf{pP2ZsO?}gu*Uw1zR z{mA-y^83q(4Zrr4-uVCGUnrBx3`2&F3nzXUt=IY(t2g=WqDZATT|SAgW~lvq{&Mx@ z7j;LLzEeKG?(6k){(o#Wk1&3mSHY6Ve3+Fp(3vf;c{%IK%X1n3`ThIzV#S$XPg6hs z3j6%|&%1Ar7?Rl5vBp_+ajdwg##O6vkz3?eFyHU{3;FY3{^p+iE|x{;rPM#Adux8* z)_w4M=95={)#E2H)J?n1s8fIVFaPwi&l$VLU;bd+_4taf(!)5PGxu+YcHXZ|bbsir z-u~QbVctj2H;I2mfBffE=3FJRuIZ;Flf9PIqI3QdHa$N?D`%Go2HfT5zVqZ1i`BxT zjBTeRSu2CL^Y(7z6m2ZY6Zv%DGh}F(bk_KLB&_LYm&WujPx#&5 z$yu*_nY!rXtCTZW-zkVp{2(!R_j`49sdwKLIX*mIu=-Q>$$g&|M5}!Kv7qCf9sVM@WJ~d?~jSAW-v&~xU-sA|7D+i`8!)%QOW;Y z3C?edIZHpNR!n%m-jehE!;@d%R9*~uZuIBV!^>%{4_=6EfAlr5>9Mc*--pq8O^+je zvt9-$ym;64{Qk$YRkJ>_pW*wk)4%M)x^HnGkI!lUbYoNU7ol}5KlVtc{@ioM=i4gQ z#E&IgcfS7{U-|K=SL~;>YL5>SxE)@<*s<}2Tfv@JFS9-0U4O&=(Mj;cr_j3=-xe>3 z`hDco=KmURx|ttc;b5DRl*V@WsU>^xi3m<-?Q`7cH%9Rs6XfD8w?53fJf4Yn8`nYZ zh%Z7si>H0&Rc)NlZysAH7 z6Vu^i+$R*XXG3z&}N1R2ATDVRa9N@HBAIKd!L5J_gyGFjMc10eg>=m3F*kZUQWGD*! zi(M>{ZudmCl69wSd(&kJUE2c!%+DrpE^RPkJ**+dGIy^uYnN*SD=XtdX5M$Jn2uTR zWXZZQk86tPE5UyZf}%&itrwBk2o?$TvlW}4ry<_>ZH-vrv1g)xzH|y7n6QyQeV-N2 zA<<==pI>#cuXK)KmES&@S>eSY=CFJIEZ@yq8E-}<{&~`8@iX&m!MD%aDId38a(U-b z#{ThTAoq7B*^PhIHa}<7`S_LDk)?yJ#xet1WH-D@xu>bM&%;q0lZ5qE;{@MJy;ieqJgDHDiAIUj!gdg)~uZ`eh zljc-sui3Ydll9XbZeESMT=SeNIBI@4aD0+o#gU?A!Rq1D$-uYTh(S2(9<%6*Y!3Cr zM?9RyulXI-7YTm6Bq*5k#*_EU$x9sTSKMOrl>f`VK(l~be@_PgOydYa|L6~bX2I@s( za{k_aTKn~jK*F0vWgO4X@4oSL(v;k1bB-^0s@4_xFx&j$t=zh&*CxiMT~~=Vxg#*~ z!b3;at55Fj6nGKVp71Uv!Qy+pb>=^#J+jP(CzrA`Z&GE7Gm8KF=;+oTl}#L96{8=2 zRPmejuKnixH?x15y>s7S|8erw+K=rvpWgA^nfki*n&Y!dQRN3~GDPleo$CHj&ME6z zX=%>uL-~#GBp3L7EVj@1di^=ekC#u3zi*%7_$5N�TNnCvP9zd-Zzq%3m+H?n-)Y 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 diff --git a/config/sound/default/soundicons.conf b/config/sound/default/soundicons.conf index 8ad2c0ec..9987b4be 100644 --- a/config/sound/default/soundicons.conf +++ b/config/sound/default/soundicons.conf @@ -30,9 +30,6 @@ ContentChanged='ContentChanged.wav' # Speech has turned On or Off SpeechOn='SpeechOn.wav' SpeechOff='SpeechOff.wav' -# Braille has turned On or Off -BrailleOn='BrailleOn.wav' -BrailleOff='BrailleOff.wav' # SoundIcons has turned On or Off SoundOn='SoundOn.wav' SoundOff='SoundOff.wav' @@ -44,9 +41,8 @@ PlaceEndMark='PlaceEndMark.wav' CopyToClipboard='CopyToClipboard.wav' # Pasted on the screen PasteClipboardOnScreen='PasteClipboardOnScreen.wav' -# An error accoured while speech or braille output or reading the screen +# An error accoured while speech output or reading the screen ErrorSpeech='ErrorSpeech.wav' -ErrorBraille='ErrorBraille.wav' ErrorScreen='ErrorScreen.wav' # If you cursor over an text that has attributs (like color) HasAttributes='has_attribute.wav' diff --git a/src/fenrirscreenreader/commands/commands/apply_tested_voice.py b/src/fenrirscreenreader/commands/commands/apply_tested_voice.py new file mode 100644 index 00000000..53fb91a3 --- /dev/null +++ b/src/fenrirscreenreader/commands/commands/apply_tested_voice.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Apply the last tested voice from safe voice browser" + + def run(self): + try: + # Check if we have a tested voice + if ('commandBuffer' not in self.env or + 'lastTestedModule' not in self.env['commandBuffer'] or + 'lastTestedVoice' not in self.env['commandBuffer']): + self.env['runtime']['outputManager'].presentText("No voice has been tested yet", interrupt=True) + self.env['runtime']['outputManager'].presentText("Use voice browser first", interrupt=True) + return + + module = self.env['commandBuffer']['lastTestedModule'] + voice = self.env['commandBuffer']['lastTestedVoice'] + + self.env['runtime']['outputManager'].presentText(f"Applying {voice} from {module}", interrupt=True) + + # Apply to runtime settings only (temporary until saved) + settingsManager = self.env['runtime']['settingsManager'] + + # Store old values for safety + oldDriver = settingsManager.getSetting('speech', 'driver') + oldModule = settingsManager.getSetting('speech', 'module') + oldVoice = settingsManager.getSetting('speech', 'voice') + + try: + # Apply new settings to runtime only + settingsManager.settings['speech']['driver'] = 'speechdDriver' + settingsManager.settings['speech']['module'] = module + settingsManager.settings['speech']['voice'] = voice + + # Try to reinitialize speech driver + if 'speechDriver' in self.env['runtime']: + speechDriver = self.env['runtime']['speechDriver'] + speechDriver.shutdown() + speechDriver.initialize(self.env) + + self.env['runtime']['outputManager'].presentText("Voice applied successfully!", interrupt=True) + self.env['runtime']['outputManager'].presentText("Use save settings to make permanent", interrupt=True) + self.env['runtime']['outputManager'].playSound('Accept') + + except Exception as e: + # Revert on failure + settingsManager.settings['speech']['driver'] = oldDriver + settingsManager.settings['speech']['module'] = oldModule + settingsManager.settings['speech']['voice'] = oldVoice + + self.env['runtime']['outputManager'].presentText(f"Failed to apply voice, reverted: {str(e)}", interrupt=True) + self.env['runtime']['outputManager'].playSound('Error') + + except Exception as e: + self.env['runtime']['outputManager'].presentText(f"Apply voice error: {str(e)}", interrupt=True) + self.env['runtime']['outputManager'].playSound('Error') + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/commands/voice_browser.py b/src/fenrirscreenreader/commands/commands/voice_browser.py new file mode 100644 index 00000000..64d7806f --- /dev/null +++ b/src/fenrirscreenreader/commands/commands/voice_browser.py @@ -0,0 +1,255 @@ +#!/usr/bin/env python3 + +import subprocess +import time + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + self.testMessage = "This is a voice test. The quick brown fox jumps over the lazy dog." + self.modules = [] + self.voices = [] + self.moduleIndex = 0 + self.voiceIndex = 0 + self.browserActive = False + self.originalBindings = {} + self.lastAnnounceTime = 0 + + def shutdown(self): + pass + + def getDescription(self): + return "Interactive voice browser with arrow key navigation" + + def run(self): + if self.browserActive: + self.exitVoiceBrowser() + return + + self.env['runtime']['outputManager'].presentText("Starting voice browser", interrupt=True) + + # Load modules + self.modules = self.getSpeechdModules() + if not self.modules: + self.env['runtime']['outputManager'].presentText("No speech modules found", interrupt=True) + self.env['runtime']['outputManager'].playSound('Error') + return + + # Set current module + currentModule = self.env['runtime']['settingsManager'].getSetting('speech', 'module') + if currentModule and currentModule in self.modules: + self.moduleIndex = self.modules.index(currentModule) + + # Load voices + self.loadVoicesForCurrentModule() + + # Set current voice + currentVoice = self.env['runtime']['settingsManager'].getSetting('speech', 'voice') + if currentVoice and currentVoice in self.voices: + self.voiceIndex = self.voices.index(currentVoice) + + # Enter browser mode + self.enterVoiceBrowser() + self.announceCurrentSelection() + + def enterVoiceBrowser(self): + """Enter voice browser mode with custom key bindings""" + self.browserActive = True + + # Store original bindings + self.originalBindings = self.env['bindings'].copy() + + # Override navigation keys for voice browsing + # Use lambda to capture self and create bound methods + self.env['bindings'][str([1, ['KEY_UP']])] = 'VOICE_BROWSER_PREV_VOICE' + self.env['bindings'][str([1, ['KEY_DOWN']])] = 'VOICE_BROWSER_NEXT_VOICE' + self.env['bindings'][str([1, ['KEY_LEFT']])] = 'VOICE_BROWSER_PREV_MODULE' + self.env['bindings'][str([1, ['KEY_RIGHT']])] = 'VOICE_BROWSER_NEXT_MODULE' + self.env['bindings'][str([1, ['KEY_ENTER']])] = 'VOICE_BROWSER_TEST' + self.env['bindings'][str([1, ['KEY_SPACE']])] = 'VOICE_BROWSER_APPLY' + self.env['bindings'][str([1, ['KEY_ESC']])] = 'VOICE_BROWSER_EXIT' + + # Register browser commands + self.registerBrowserCommands() + + self.env['runtime']['outputManager'].presentText("Voice browser active", interrupt=True) + self.env['runtime']['outputManager'].presentText("Up/Down=voices, Left/Right=modules, Enter=test, Space=apply, Esc=exit", interrupt=True) + + def registerBrowserCommands(self): + """Register voice browser commands with the command manager""" + # Create command objects for voice browser actions + commandManager = self.env['runtime']['commandManager'] + + # This is a hack - we'll store references to our methods in the environment + # so the key handlers can call them + if 'voiceBrowserInstance' not in self.env['runtime']: + self.env['runtime']['voiceBrowserInstance'] = self + + def exitVoiceBrowser(self): + """Exit voice browser and restore normal key bindings""" + if not self.browserActive: + return + + self.browserActive = False + + # Restore original bindings + self.env['bindings'] = self.originalBindings + + # Clean up + if 'voiceBrowserInstance' in self.env['runtime']: + del self.env['runtime']['voiceBrowserInstance'] + + self.env['runtime']['outputManager'].presentText("Voice browser exited", interrupt=True) + + def loadVoicesForCurrentModule(self): + """Load voices for current module""" + if self.moduleIndex < len(self.modules): + module = self.modules[self.moduleIndex] + self.voices = self.getModuleVoices(module) + self.voiceIndex = 0 # Reset to first voice when changing modules + + def announceCurrentSelection(self): + """Announce current module and voice""" + # Throttle announcements to avoid spam + now = time.time() + if now - self.lastAnnounceTime < 0.3: + return + self.lastAnnounceTime = now + + if not self.modules or self.moduleIndex >= len(self.modules): + return + + module = self.modules[self.moduleIndex] + if self.voices and self.voiceIndex < len(self.voices): + voice = self.voices[self.voiceIndex] + self.env['runtime']['outputManager'].presentText( + f"{module}: {voice} ({self.voiceIndex + 1}/{len(self.voices)})", interrupt=True + ) + else: + self.env['runtime']['outputManager'].presentText(f"{module}: No voices", interrupt=True) + + def nextVoice(self): + """Move to next voice""" + if not self.voices: + return + self.voiceIndex = (self.voiceIndex + 1) % len(self.voices) + self.announceCurrentSelection() + + def prevVoice(self): + """Move to previous voice""" + if not self.voices: + return + self.voiceIndex = (self.voiceIndex - 1) % len(self.voices) + self.announceCurrentSelection() + + def nextModule(self): + """Move to next module""" + self.moduleIndex = (self.moduleIndex + 1) % len(self.modules) + self.loadVoicesForCurrentModule() + self.announceCurrentSelection() + + def prevModule(self): + """Move to previous module""" + self.moduleIndex = (self.moduleIndex - 1) % len(self.modules) + self.loadVoicesForCurrentModule() + self.announceCurrentSelection() + + def testVoice(self): + """Test current voice""" + if not self.voices or self.voiceIndex >= len(self.voices): + self.env['runtime']['outputManager'].presentText("No voice selected", interrupt=True) + return + + module = self.modules[self.moduleIndex] + voice = self.voices[self.voiceIndex] + + self.env['runtime']['outputManager'].presentText("Testing...", interrupt=True) + if self.previewVoice(module, voice): + # Store for apply command + self.env['commandBuffer']['lastTestedModule'] = module + self.env['commandBuffer']['lastTestedVoice'] = voice + self.env['runtime']['outputManager'].playSound('Accept') + else: + self.env['runtime']['outputManager'].playSound('Error') + + def applyVoice(self): + """Apply current voice to Fenrir""" + if not self.voices or self.voiceIndex >= len(self.voices): + return + + module = self.modules[self.moduleIndex] + voice = self.voices[self.voiceIndex] + + try: + settingsManager = self.env['runtime']['settingsManager'] + settingsManager.settings['speech']['driver'] = 'speechdDriver' + settingsManager.settings['speech']['module'] = module + settingsManager.settings['speech']['voice'] = voice + + if 'speechDriver' in self.env['runtime']: + speechDriver = self.env['runtime']['speechDriver'] + speechDriver.shutdown() + speechDriver.initialize(self.env) + + self.env['runtime']['outputManager'].presentText("Voice applied!", interrupt=True) + self.env['runtime']['outputManager'].playSound('Accept') + + except Exception as e: + self.env['runtime']['outputManager'].presentText("Apply failed", interrupt=True) + self.env['runtime']['outputManager'].playSound('Error') + + def previewVoice(self, module, voice): + """Test voice with spd-say""" + try: + cmd = ['spd-say', '-o', module, '-y', voice, self.testMessage] + result = subprocess.run(cmd, timeout=10) + return result.returncode == 0 + except Exception: + return False + + def getSpeechdModules(self): + """Get available speech modules""" + try: + result = subprocess.run(['spd-say', '-O'], capture_output=True, text=True, timeout=10) + if result.returncode == 0: + lines = result.stdout.strip().split('\n') + return [line.strip() for line in lines[1:] if line.strip()] + except Exception: + pass + return [] + + def getModuleVoices(self, module): + """Get voices for module""" + try: + result = subprocess.run(['spd-say', '-o', module, '-L'], capture_output=True, text=True, timeout=10) + if result.returncode == 0: + lines = result.stdout.strip().split('\n') + voices = [] + for line in lines[1:]: + if not line.strip(): + continue + if module.lower() == 'espeak-ng': + voice = self.processEspeakVoice(line) + if voice: + voices.append(voice) + else: + voices.append(line.strip()) + return voices + except Exception: + pass + return [] + + def processEspeakVoice(self, voiceLine): + """Process espeak voice format""" + parts = [p for p in voiceLine.split() if p] + if len(parts) < 2: + return None + langCode = parts[-2].lower() + variant = parts[-1].lower() + return f"{langCode}+{variant}" if variant and variant != 'none' else langCode + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/commands/voice_browser_apply.py b/src/fenrirscreenreader/commands/commands/voice_browser_apply.py new file mode 100644 index 00000000..1f0048d4 --- /dev/null +++ b/src/fenrirscreenreader/commands/commands/voice_browser_apply.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Voice browser: apply current voice" + + def run(self): + if 'voiceBrowserInstance' in self.env['runtime']: + self.env['runtime']['voiceBrowserInstance'].applyVoice() + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/commands/voice_browser_exit.py b/src/fenrirscreenreader/commands/commands/voice_browser_exit.py new file mode 100644 index 00000000..c8d5d17d --- /dev/null +++ b/src/fenrirscreenreader/commands/commands/voice_browser_exit.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Voice browser: exit browser mode" + + def run(self): + if 'voiceBrowserInstance' in self.env['runtime']: + self.env['runtime']['voiceBrowserInstance'].exitVoiceBrowser() + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/commands/voice_browser_next_module.py b/src/fenrirscreenreader/commands/commands/voice_browser_next_module.py new file mode 100644 index 00000000..a2dc1d01 --- /dev/null +++ b/src/fenrirscreenreader/commands/commands/voice_browser_next_module.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Voice browser: next module" + + def run(self): + if 'voiceBrowserInstance' in self.env['runtime']: + self.env['runtime']['voiceBrowserInstance'].nextModule() + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/commands/voice_browser_next_voice.py b/src/fenrirscreenreader/commands/commands/voice_browser_next_voice.py new file mode 100644 index 00000000..5e56b42e --- /dev/null +++ b/src/fenrirscreenreader/commands/commands/voice_browser_next_voice.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Voice browser: next voice" + + def run(self): + if 'voiceBrowserInstance' in self.env['runtime']: + self.env['runtime']['voiceBrowserInstance'].nextVoice() + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/commands/voice_browser_prev_module.py b/src/fenrirscreenreader/commands/commands/voice_browser_prev_module.py new file mode 100644 index 00000000..b7add887 --- /dev/null +++ b/src/fenrirscreenreader/commands/commands/voice_browser_prev_module.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Voice browser: previous module" + + def run(self): + if 'voiceBrowserInstance' in self.env['runtime']: + self.env['runtime']['voiceBrowserInstance'].prevModule() + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/commands/voice_browser_prev_voice.py b/src/fenrirscreenreader/commands/commands/voice_browser_prev_voice.py new file mode 100644 index 00000000..24c858f5 --- /dev/null +++ b/src/fenrirscreenreader/commands/commands/voice_browser_prev_voice.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Voice browser: previous voice" + + def run(self): + if 'voiceBrowserInstance' in self.env['runtime']: + self.env['runtime']['voiceBrowserInstance'].prevVoice() + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/commands/voice_browser_safe.py b/src/fenrirscreenreader/commands/commands/voice_browser_safe.py new file mode 100644 index 00000000..2f59aaba --- /dev/null +++ b/src/fenrirscreenreader/commands/commands/voice_browser_safe.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python3 + +import subprocess +import threading +import time + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + self.testMessage = "Voice test: The quick brown fox jumps over the lazy dog." + + def shutdown(self): + pass + + def getDescription(self): + return "Safe voice browser - cycles through voices without hanging" + + def run(self): + try: + self.env['runtime']['outputManager'].presentText("Starting safe voice browser", interrupt=True) + + # Get modules with timeout protection + modules = self.getSpeechdModulesWithTimeout() + if not modules: + self.env['runtime']['outputManager'].presentText("No speech modules found", interrupt=True) + return + + # Get current position from commandBuffer or start fresh + moduleIndex = self.env['commandBuffer'].get('safeBrowserModuleIndex', 0) + voiceIndex = self.env['commandBuffer'].get('safeBrowserVoiceIndex', 0) + + # Ensure valid module index + if moduleIndex >= len(modules): + moduleIndex = 0 + + currentModule = modules[moduleIndex] + self.env['runtime']['outputManager'].presentText(f"Loading voices for {currentModule}...", interrupt=True) + + # Get voices with timeout protection + voices = self.getModuleVoicesWithTimeout(currentModule) + if not voices: + self.env['runtime']['outputManager'].presentText(f"No voices in {currentModule}, trying next module", interrupt=True) + moduleIndex = (moduleIndex + 1) % len(modules) + self.env['commandBuffer']['safeBrowserModuleIndex'] = moduleIndex + self.env['commandBuffer']['safeBrowserVoiceIndex'] = 0 + return + + # Ensure valid voice index + if voiceIndex >= len(voices): + voiceIndex = 0 + + currentVoice = voices[voiceIndex] + + # Announce current selection + self.env['runtime']['outputManager'].presentText( + f"Module: {currentModule} ({moduleIndex + 1}/{len(modules)})", interrupt=True + ) + self.env['runtime']['outputManager'].presentText( + f"Voice: {currentVoice} ({voiceIndex + 1}/{len(voices)})", interrupt=True + ) + + # Test voice in background thread to avoid blocking + self.env['runtime']['outputManager'].presentText("Testing voice...", interrupt=True) + + # Use threading to prevent freezing + testThread = threading.Thread(target=self.testVoiceAsync, args=(currentModule, currentVoice)) + testThread.daemon = True + testThread.start() + + # Store tested voice for apply command + self.env['commandBuffer']['lastTestedModule'] = currentModule + self.env['commandBuffer']['lastTestedVoice'] = currentVoice + + # Advance to next voice for next run + voiceIndex += 1 + if voiceIndex >= len(voices): + voiceIndex = 0 + moduleIndex = (moduleIndex + 1) % len(modules) + + # Store position for next run + self.env['commandBuffer']['safeBrowserModuleIndex'] = moduleIndex + self.env['commandBuffer']['safeBrowserVoiceIndex'] = voiceIndex + + # Give instructions + self.env['runtime']['outputManager'].presentText("Run again for next voice, or use apply voice command", interrupt=True) + + except Exception as e: + self.env['runtime']['outputManager'].presentText(f"Voice browser error: {str(e)}", interrupt=True) + self.env['runtime']['outputManager'].playSound('Error') + + def testVoiceAsync(self, module, voice): + """Test voice in background thread to avoid blocking""" + try: + # Run with strict timeout + cmd = ['spd-say', '-o', module, '-y', voice, self.testMessage] + result = subprocess.run(cmd, timeout=5, capture_output=True) + + # Schedule success sound for main thread + if result.returncode == 0: + # We can't call outputManager from background thread safely + # So we'll just let the main thread handle feedback + pass + + except subprocess.TimeoutExpired: + # Voice test timed out - this is okay, don't crash + pass + except Exception: + # Any other error - also okay, don't crash + pass + + def getSpeechdModulesWithTimeout(self): + """Get speech modules with timeout protection""" + try: + result = subprocess.run(['spd-say', '-O'], capture_output=True, text=True, timeout=3) + if result.returncode == 0: + lines = result.stdout.strip().split('\n') + modules = [line.strip() for line in lines[1:] if line.strip()] + return modules[:10] # Limit to first 10 modules to prevent overload + except subprocess.TimeoutExpired: + self.env['runtime']['outputManager'].presentText("Module detection timed out", interrupt=True) + except Exception as e: + self.env['runtime']['outputManager'].presentText(f"Module detection failed: {str(e)}", interrupt=True) + return [] + + def getModuleVoicesWithTimeout(self, module): + """Get voices with timeout and limits""" + try: + result = subprocess.run(['spd-say', '-o', module, '-L'], capture_output=True, text=True, timeout=5) + if result.returncode == 0: + lines = result.stdout.strip().split('\n') + voices = [] + for line in lines[1:]: + if not line.strip(): + continue + if module.lower() == 'espeak-ng': + voice = self.processEspeakVoice(line) + if voice: + voices.append(voice) + else: + voices.append(line.strip()) + + # Limit voice count to prevent memory issues + if len(voices) > 1000: + self.env['runtime']['outputManager'].presentText(f"Found {len(voices)} voices, limiting to first 1000", interrupt=True) + voices = voices[:1000] + + return voices + except subprocess.TimeoutExpired: + self.env['runtime']['outputManager'].presentText(f"Voice detection for {module} timed out", interrupt=True) + except Exception as e: + self.env['runtime']['outputManager'].presentText(f"Voice detection failed: {str(e)}", interrupt=True) + return [] + + def processEspeakVoice(self, voiceLine): + """Process espeak voice format""" + try: + parts = [p for p in voiceLine.split() if p] + if len(parts) < 2: + return None + langCode = parts[-2].lower() + variant = parts[-1].lower() + return f"{langCode}+{variant}" if variant and variant != 'none' else langCode + except Exception: + return None + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/commands/voice_browser_test.py b/src/fenrirscreenreader/commands/commands/voice_browser_test.py new file mode 100644 index 00000000..9c023de4 --- /dev/null +++ b/src/fenrirscreenreader/commands/commands/voice_browser_test.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Voice browser: test current voice" + + def run(self): + if 'voiceBrowserInstance' in self.env['runtime']: + self.env['runtime']['voiceBrowserInstance'].testVoice() + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/__init__.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/__init__.py new file mode 100644 index 00000000..1c602751 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/__init__.py @@ -0,0 +1 @@ +# Fenrir Configuration VMenu Profile \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/config_base.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/config_base.py new file mode 100644 index 00000000..135a1234 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/config_base.py @@ -0,0 +1,302 @@ +#!/usr/bin/env python3 + +import os +import configparser +import subprocess +import tempfile +from typing import Dict, List, Optional, Tuple, Any + +class ConfigCommand: + """Base class for Fenrir configuration vmenu commands""" + + def __init__(self): + self.env = None + self.config = None + self.settingsFile = None + + # Configuration presets from original configure_fenrir.py + self.presetOptions = { + 'sound.driver': ['genericDriver', 'gstreamerDriver'], + 'speech.driver': ['speechdDriver', 'genericDriver'], + 'screen.driver': ['vcsaDriver', 'dummyDriver', 'ptyDriver', 'debugDriver'], + 'keyboard.driver': ['evdevDriver', 'dummyDriver'], + 'remote.driver': ['unixDriver', 'tcpDriver'], + 'keyboard.charEchoMode': ['0', '1', '2'], + 'general.punctuationLevel': ['none', 'some', 'most', 'all'], + 'general.debugMode': ['File', 'Print'], + 'keyboard.device': ['ALL', 'NOMICE'], + 'screen.encoding': ['auto', 'utf-8', 'cp1252', 'iso-8859-1'] + } + + # Help text for various options + self.helpText = { + 'sound.volume': 'Volume level from 0 (quietest) to 1.0 (loudest)', + 'speech.rate': 'Speech rate from 0 (slowest) to 1.0 (fastest)', + 'speech.pitch': 'Voice pitch from 0 (lowest) to 1.0 (highest)', + 'speech.capitalPitch': 'Pitch for capital letters from 0 to 1.0', + 'keyboard.charEchoMode': '0 = None, 1 = always, 2 = only while capslock', + 'keyboard.doubleTapTimeout': 'Timeout for double tap in seconds', + 'screen.screenUpdateDelay': 'Delay between screen updates in seconds', + 'general.punctuationLevel': 'none = no punctuation, some = basic, most = detailed, all = everything', + 'general.numberOfClipboards': 'Number of clipboard slots to maintain' + } + + def initialize(self, environment): + """Initialize with Fenrir environment""" + self.env = environment + self.settingsFile = self.env['runtime']['settingsManager'].settingsFile + self.config = configparser.ConfigParser(interpolation=None) + self.config.read(self.settingsFile) + + def shutdown(self): + """Cleanup resources""" + pass + + def getDescription(self): + """Return description for this configuration action""" + return "Base configuration command" + + def run(self): + """Execute the configuration action - to be overridden""" + self.presentText("Configuration base class - override run() method") + + def presentText(self, text: str, interrupt: bool = True): + """Present text using Fenrir's speech system""" + if self.env and 'runtime' in self.env and 'outputManager' in self.env['runtime']: + self.env['runtime']['outputManager'].presentText(text, interrupt=interrupt) + + def presentConfirmation(self, text: str): + """Present confirmation message that won't be interrupted by menu navigation""" + self.presentText(text, interrupt=False) + + def playSound(self, soundName: str): + """Play a sound using Fenrir's sound system (deprecated - sounds removed from vmenu)""" + # Sounds removed from vmenu commands to avoid configuration issues + pass + + def getSetting(self, section: str, option: str, default: str = "") -> str: + """Get a setting value from configuration""" + try: + if section in self.config and option in self.config[section]: + return self.config[section][option] + return default + except Exception: + return default + + def setSetting(self, section: str, option: str, value: str) -> bool: + """Set a setting value and save configuration""" + try: + if section not in self.config: + self.config[section] = {} + + oldValue = self.getSetting(section, option) + self.config[section][option] = str(value) + + # Write configuration file + with open(self.settingsFile, 'w') as configfile: + self.config.write(configfile) + + # Apply setting immediately if possible + self.applySettingImmediate(section, option, value, oldValue) + + return True + except Exception as e: + self.presentText(f"Error saving setting: {str(e)}") + return False + + def applySettingImmediate(self, section: str, option: str, newValue: str, oldValue: str): + """Apply setting immediately without restart where possible""" + try: + # Apply speech settings immediately + if section == 'speech': + if option in ['rate', 'pitch', 'volume']: + settingsManager = self.env['runtime']['settingsManager'] + settingsManager.setSetting(section, option, newValue) + + # Apply sound settings immediately + elif section == 'sound': + if option == 'volume': + settingsManager = self.env['runtime']['settingsManager'] + settingsManager.setSetting(section, option, newValue) + + except Exception as e: + # Silent fail - settings will apply on restart + pass + + def validateInput(self, section: str, option: str, value: str) -> Tuple[bool, str]: + """Validate user input based on option type and constraints""" + try: + # Validate float values (volume, rate, pitch) + if option in ['volume', 'rate', 'pitch', 'capitalPitch']: + floatVal = float(value) + if not 0 <= floatVal <= 1.0: + return False, "Value must be between 0 and 1.0" + return True, str(floatVal) + + # Validate integer values + elif option in ['numberOfClipboards', 'ignoreScreen']: + intVal = int(value) + if intVal < 0: + return False, "Value must be 0 or greater" + return True, str(intVal) + + # Validate float values with different ranges + elif option == 'doubleTapTimeout': + floatVal = float(value) + if not 0 <= floatVal <= 2.0: + return False, "Value must be between 0 and 2.0 seconds" + return True, str(floatVal) + + elif option == 'screenUpdateDelay': + floatVal = float(value) + if not 0 <= floatVal <= 1.0: + return False, "Value must be between 0 and 1.0 seconds" + return True, str(floatVal) + + # Validate boolean values + elif self.isBooleanOption(value): + if value.lower() in ['true', 'false']: + return True, value.capitalize() + return False, "Value must be True or False" + + # Validate preset options + key = f"{section}.{option}" + if key in self.presetOptions: + if value in self.presetOptions[key]: + return True, value + return False, f"Value must be one of: {', '.join(self.presetOptions[key])}" + + # Default validation - accept any string + return True, str(value).strip() + + except ValueError: + return False, "Invalid number format" + except Exception as e: + return False, f"Validation error: {str(e)}" + + def isBooleanOption(self, value: str) -> bool: + """Check if the current value is likely a boolean option""" + return value.lower() in ['true', 'false'] + + def getBooleanSetting(self, section: str, option: str, default: bool = False) -> bool: + """Get a boolean setting value""" + value = self.getSetting(section, option, str(default)).lower() + return value in ['true', '1', 'yes', 'on'] + + def setBooleanSetting(self, section: str, option: str, value: bool) -> bool: + """Set a boolean setting value""" + return self.setSetting(section, option, 'True' if value else 'False') + + def toggleBooleanSetting(self, section: str, option: str) -> bool: + """Toggle a boolean setting and return new value""" + currentValue = self.getBooleanSetting(section, option) + newValue = not currentValue + success = self.setBooleanSetting(section, option, newValue) + return newValue if success else currentValue + + def getFloatSetting(self, section: str, option: str, default: float = 0.0) -> float: + """Get a float setting value""" + try: + return float(self.getSetting(section, option, str(default))) + except ValueError: + return default + + def setFloatSetting(self, section: str, option: str, value: float) -> bool: + """Set a float setting value""" + return self.setSetting(section, option, str(value)) + + def adjustFloatSetting(self, section: str, option: str, delta: float, + minVal: float = 0.0, maxVal: float = 1.0) -> float: + """Adjust a float setting by delta amount""" + currentValue = self.getFloatSetting(section, option) + newValue = max(minVal, min(maxVal, currentValue + delta)) + success = self.setFloatSetting(section, option, newValue) + return newValue if success else currentValue + + def runCommand(self, cmd: List[str], timeout: int = 10) -> Optional[str]: + """Run a command and return output""" + try: + result = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout) + return result.stdout.strip() if result.returncode == 0 else None + except Exception: + return None + + def getSpeechdModules(self) -> List[str]: + """Get list of available speech-dispatcher modules""" + output = self.runCommand(['spd-say', '-O']) + if output: + lines = output.split('\n') + return [line.strip() for line in lines[1:] if line.strip()] + return [] + + def getModuleVoices(self, module: str) -> List[str]: + """Get list of voices for a specific speech module""" + output = self.runCommand(['spd-say', '-o', module, '-L']) + if output: + lines = output.split('\n') + voices = [] + for line in lines[1:]: + if not line.strip(): + continue + if module.lower() == 'espeak-ng': + voice = self.processEspeakVoice(line) + if voice: + voices.append(voice) + else: + voices.append(line.strip()) + return voices + return [] + + def processEspeakVoice(self, voiceLine: str) -> Optional[str]: + """Process espeak-ng voice line format""" + parts = [p for p in voiceLine.split() if p] + if len(parts) < 2: + return None + langCode = parts[-2].lower() + variant = parts[-1].lower() + return f"{langCode}+{variant}" if variant and variant != 'none' else langCode + + def testVoice(self, module: str, voice: str, testMessage: str = None) -> bool: + """Test a voice configuration""" + if not testMessage: + testMessage = "This is a voice test. If you can hear this clearly, the voice is working properly." + + try: + # Announce the test + self.presentText("Testing voice configuration. Listen for the test message.") + + # Run voice test + cmd = ['spd-say', '-o', module, '-y', voice, testMessage] + result = subprocess.run(cmd, timeout=10) + + return result.returncode == 0 + except Exception: + return False + + def backupConfig(self, announce: bool = True) -> tuple[bool, str]: + """Create a backup of current configuration""" + try: + import shutil + from datetime import datetime + + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + backupFile = f"{self.settingsFile}.backup_{timestamp}" + shutil.copy2(self.settingsFile, backupFile) + + message = f"Configuration backed up to {backupFile}" + if announce: + self.presentText(message, interrupt=False) + return True, message + except Exception as e: + error_msg = f"Error creating backup: {str(e)}" + if announce: + self.presentText(error_msg, interrupt=False) + return False, error_msg + + def reloadConfig(self): + """Reload configuration from file""" + try: + self.config.read(self.settingsFile) + return True + except Exception: + return False \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/general/__init__.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/general/__init__.py new file mode 100644 index 00000000..f3594ed4 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/general/__init__.py @@ -0,0 +1 @@ +# Fenrir general configuration diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/general/set_punctuation_level.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/general/set_punctuation_level.py new file mode 100644 index 00000000..1f03fdee --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/general/set_punctuation_level.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 + +import os +import importlib.util + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Set punctuation verbosity level" + + def run(self): + currentLevel = self.getSetting('general', 'punctuationLevel', 'some') + + # Present current level + levelDescriptions = { + 'none': 'None - no punctuation spoken', + 'some': 'Some - basic punctuation only', + 'most': 'Most - detailed punctuation', + 'all': 'All - every punctuation mark' + } + + currentDescription = levelDescriptions.get(currentLevel, 'Unknown') + self.presentText(f"Current punctuation level: {currentDescription}") + + # Cycle through the four levels + levels = ['none', 'some', 'most', 'all'] + try: + currentIndex = levels.index(currentLevel) + nextIndex = (currentIndex + 1) % len(levels) + newLevel = levels[nextIndex] + except ValueError: + newLevel = 'some' # Default to some + + success = self.setSetting('general', 'punctuationLevel', newLevel) + + if success: + newDescription = levelDescriptions[newLevel] + self.presentText(f"Punctuation level set to: {newDescription}") + self.playSound('Accept') + else: + self.presentText("Failed to change punctuation level") + self.playSound('Error') \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/general/toggle_debug.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/general/toggle_debug.py new file mode 100644 index 00000000..8a5e077a --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/general/toggle_debug.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 + +import os +import importlib.util + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Toggle debug mode" + + def run(self): + currentLevel = self.getSetting('general', 'debugLevel', '0') + + # Present current debug level + if currentLevel == '0': + self.presentText("Current debug mode: disabled") + newLevel = '1' + stateText = "enabled" + else: + self.presentText(f"Current debug level: {currentLevel}") + newLevel = '0' + stateText = "disabled" + + success = self.setSetting('general', 'debugLevel', newLevel) + + if success: + self.presentText(f"Debug mode {stateText}") + if newLevel != '0': + debugMode = self.getSetting('general', 'debugMode', 'File') + if debugMode == 'File': + self.presentText("Debug output will be written to log file") + else: + self.presentText("Debug output will be printed to console") + self.playSound('Accept') + else: + self.presentText("Failed to change debug mode") + self.playSound('Error') \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/__init__.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/__init__.py new file mode 100644 index 00000000..e130a0e1 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/__init__.py @@ -0,0 +1 @@ +# Fenrir keyboard configuration diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/select_layout.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/select_layout.py new file mode 100644 index 00000000..49d3f7f4 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/select_layout.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 + +import os +import importlib.util + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Select keyboard layout (desktop or laptop)" + + def run(self): + currentLayout = self.getSetting('keyboard', 'keyboardLayout', 'desktop') + + # Present current layout + self.presentText(f"Current keyboard layout: {currentLayout}") + + # Find available keyboard layouts + keyboardPath = '/etc/fenrirscreenreader/keyboard' + if not os.path.isdir(keyboardPath): + # Development path + keyboardPath = os.path.join(os.path.dirname(self.settingsFile), '..', 'keyboard') + + availableLayouts = self.getAvailableLayouts(keyboardPath) + + if len(availableLayouts) > 1: + # Cycle through available layouts + try: + currentIndex = availableLayouts.index(currentLayout) + nextIndex = (currentIndex + 1) % len(availableLayouts) + newLayout = availableLayouts[nextIndex] + except ValueError: + # Current layout not found, use first available + newLayout = availableLayouts[0] + + success = self.setSetting('keyboard', 'keyboardLayout', newLayout) + + if success: + self.presentText(f"Keyboard layout changed to: {newLayout}") + self.presentText("Please restart Fenrir for this change to take effect.") + self.playSound('Accept') + else: + self.presentText("Failed to change keyboard layout") + self.playSound('Error') + else: + self.presentText("Only default keyboard layout is available") + self.playSound('Cancel') + + def getAvailableLayouts(self, keyboardPath): + """Find available keyboard layout files""" + layouts = [] + + if os.path.isdir(keyboardPath): + try: + for file in os.listdir(keyboardPath): + if file.endswith('.conf') and not file.startswith('.'): + layoutName = file[:-5] # Remove .conf extension + layouts.append(layoutName) + except Exception: + pass + + # Ensure we have at least the default layouts + if not layouts: + layouts = ['desktop', 'laptop'] + + return sorted(layouts) \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/set_char_echo.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/set_char_echo.py new file mode 100644 index 00000000..523df8b5 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/set_char_echo.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 + +import os +import importlib.util + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Set character echo mode" + + def run(self): + currentMode = self.getSetting('keyboard', 'charEchoMode', '1') + + # Present current mode + modeDescriptions = { + '0': 'None - no character echo', + '1': 'Always - echo all typed characters', + '2': 'Caps Lock - echo only when caps lock is on' + } + + currentDescription = modeDescriptions.get(currentMode, 'Unknown') + self.presentText(f"Current character echo mode: {currentDescription}") + + # Cycle through the three modes + modes = ['0', '1', '2'] + try: + currentIndex = modes.index(currentMode) + nextIndex = (currentIndex + 1) % len(modes) + newMode = modes[nextIndex] + except ValueError: + newMode = '1' # Default to always + + success = self.setSetting('keyboard', 'charEchoMode', newMode) + + if success: + newDescription = modeDescriptions[newMode] + self.presentText(f"Character echo mode set to: {newDescription}") + self.playSound('Accept') + else: + self.presentText("Failed to change character echo mode") + self.playSound('Error') \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/toggle_grab_devices.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/toggle_grab_devices.py new file mode 100644 index 00000000..fc10dd12 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/toggle_grab_devices.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 + +import os +import importlib.util + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Toggle exclusive keyboard access" + + def run(self): + currentState = self.getBooleanSetting('keyboard', 'grabDevices', True) + newState = self.toggleBooleanSetting('keyboard', 'grabDevices') + + if newState != currentState: + stateText = "enabled" if newState else "disabled" + self.presentText(f"Exclusive keyboard access {stateText}") + if newState: + self.presentText("Fenrir will have exclusive control of keyboard input") + else: + self.presentText("Fenrir will share keyboard input with other applications") + self.presentText("Please restart Fenrir for this change to take effect") + self.playSound('Accept') + else: + self.presentText("Failed to change keyboard grab setting") + self.playSound('Error') \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/toggle_word_echo.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/toggle_word_echo.py new file mode 100644 index 00000000..14202636 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/keyboard/toggle_word_echo.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 + +import os +import importlib.util + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Toggle word echo when pressing space" + + def run(self): + currentState = self.getBooleanSetting('keyboard', 'wordEcho', False) + newState = self.toggleBooleanSetting('keyboard', 'wordEcho') + + if newState != currentState: + stateText = "enabled" if newState else "disabled" + self.presentText(f"Word echo {stateText}") + if newState: + self.presentText("Words will be spoken when you press space") + else: + self.presentText("Words will not be spoken when you press space") + self.playSound('Accept') + else: + self.presentText("Failed to change word echo setting") + self.playSound('Error') \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/__init__.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/__init__.py new file mode 100644 index 00000000..cbfdfd39 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/__init__.py @@ -0,0 +1 @@ +# Fenrir management configuration diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/backup_config.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/backup_config.py new file mode 100644 index 00000000..7aa588ba --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/backup_config.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 + +import os +import importlib.util + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Create backup of current configuration" + + def run(self): + self.presentText("Creating configuration backup...") + + success, message = self.backupConfig(announce=False) + + if success: + # Force the message to be queued and spoken + self.env['runtime']['outputManager'].presentText("Configuration backup created successfully", interrupt=False, flush=False) + else: + self.env['runtime']['outputManager'].presentText("Failed to create configuration backup", interrupt=False, flush=False) \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/reload_config.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/reload_config.py new file mode 100644 index 00000000..7f0c3935 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/reload_config.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 + +import os +import importlib.util + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Reload configuration from file" + + def run(self): + self.presentText("Reloading configuration from file...") + + success = self.reloadConfig() + + if success: + self.presentText("Configuration reloaded successfully") + self.playSound('Accept') + else: + self.presentText("Failed to reload configuration") + self.playSound('Error') \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/reset_defaults.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/reset_defaults.py new file mode 100644 index 00000000..29388aa0 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/reset_defaults.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 + +import os +import importlib.util +import shutil + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Reset configuration to default settings" + + def run(self): + self.presentText("WARNING: This will reset all settings to defaults") + self.presentText("Creating backup before reset...") + + # Create backup first + backupSuccess, backupMessage = self.backupConfig(announce=False) + if not backupSuccess: + self.presentText("Failed to create backup. Reset cancelled for safety.", interrupt=False) + self.playSound('Error') + return + + # Find default configuration file + defaultConfigPath = self.findDefaultConfig() + + if defaultConfigPath and os.path.isfile(defaultConfigPath): + try: + # Copy default configuration over current + shutil.copy2(defaultConfigPath, self.settingsFile) + + # Reload the configuration + self.reloadConfig() + + self.presentText("Configuration reset to defaults successfully", interrupt=False, flush=False) + self.presentText("Please restart Fenrir for all changes to take effect", interrupt=False, flush=False) + + except Exception as e: + self.presentText(f"Failed to reset configuration: {str(e)}", interrupt=False, flush=False) + else: + # Manually create basic default configuration + self.createBasicDefaults() + + def findDefaultConfig(self): + """Find the default configuration file""" + possiblePaths = [ + '/usr/share/fenrirscreenreader/config/settings/settings.conf', + '/etc/fenrirscreenreader/settings/settings.conf.default', + os.path.join(os.path.dirname(self.settingsFile), 'settings.conf.default'), + # Development path + os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', '..', '..', 'config', 'settings', 'settings.conf') + ] + + for path in possiblePaths: + if os.path.isfile(path): + return path + + return None + + def createBasicDefaults(self): + """Create basic default configuration manually""" + try: + self.config.clear() + + # Basic speech defaults + self.config['speech'] = { + 'enabled': 'True', + 'driver': 'speechdDriver', + 'rate': '0.5', + 'pitch': '0.5', + 'volume': '1.0', + 'autoReadIncoming': 'True' + } + + # Basic sound defaults + self.config['sound'] = { + 'enabled': 'True', + 'driver': 'genericDriver', + 'theme': 'default', + 'volume': '0.7' + } + + # Basic keyboard defaults + self.config['keyboard'] = { + 'driver': 'evdevDriver', + 'device': 'ALL', + 'keyboardLayout': 'desktop', + 'charEchoMode': '1', + 'wordEcho': 'False', + 'charDeleteEcho': 'True' + } + + # Basic screen defaults + self.config['screen'] = { + 'driver': 'vcsaDriver', + 'encoding': 'auto' + } + + # Basic general defaults + self.config['general'] = { + 'punctuationLevel': 'some', + 'debugLevel': '0', + 'numberOfClipboards': '50' + } + + # Write the configuration + with open(self.settingsFile, 'w') as configfile: + self.config.write(configfile) + + self.presentText("Basic default configuration created", interrupt=False, flush=False) + self.presentText("Please restart Fenrir for changes to take effect", interrupt=False, flush=False) + + except Exception as e: + self.presentText(f"Failed to create default configuration: {str(e)}", interrupt=False, flush=False) \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/revert_to_saved.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/revert_to_saved.py new file mode 100644 index 00000000..5d523f00 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/revert_to_saved.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Discard temporary changes and revert to saved settings" + + def run(self): + self.env['runtime']['outputManager'].presentText("Reverting to saved configuration...", interrupt=True) + + try: + # Reload settings from file, discarding runtime changes + settingsManager = self.env['runtime']['settingsManager'] + settingsManager.loadSettings() + + # Reinitialize speech system with restored settings + if 'speechDriver' in self.env['runtime']: + try: + speechDriver = self.env['runtime']['speechDriver'] + speechDriver.shutdown() + speechDriver.initialize(self.env) + except: + pass + + # Reinitialize sound system with restored settings + if 'soundDriver' in self.env['runtime']: + try: + soundDriver = self.env['runtime']['soundDriver'] + soundDriver.shutdown() + soundDriver.initialize(self.env) + except: + pass + + self.env['runtime']['outputManager'].presentText("Successfully reverted to saved settings", interrupt=False, flush=False) + self.env['runtime']['outputManager'].presentText("All temporary changes have been discarded", interrupt=False, flush=False) + + except Exception as e: + self.env['runtime']['outputManager'].presentText(f"Error reverting settings: {str(e)}", interrupt=False, flush=False) + self.env['runtime']['outputManager'].presentText("You may need to restart Fenrir", interrupt=False, flush=False) + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/save_config.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/save_config.py new file mode 100644 index 00000000..85cb011b --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/save_config.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 + +import os +import importlib.util + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Save current configuration to file" + + def run(self): + self.presentText("Saving current configuration...") + + try: + # Force reload and save of current configuration + self.reloadConfig() + + # Write the configuration file + with open(self.settingsFile, 'w') as configfile: + self.config.write(configfile) + + self.presentText("Configuration saved successfully") + self.playSound('Accept') + + except Exception as e: + self.presentText(f"Failed to save configuration: {str(e)}") + self.playSound('Error') \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/save_session_settings.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/save_session_settings.py new file mode 100644 index 00000000..262c16fa --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/save_session_settings.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Save current session settings to configuration file" + + def run(self): + self.env['runtime']['outputManager'].presentText("Saving current session settings to configuration file...", interrupt=True) + + try: + # This calls the settings manager's save method which writes current runtime settings to file + self.env['runtime']['settingsManager'].saveSettings() + + self.env['runtime']['outputManager'].presentText("Session settings saved successfully!", interrupt=False, flush=False) + self.env['runtime']['outputManager'].presentText("All temporary changes are now permanent.", interrupt=False, flush=False) + + except Exception as e: + self.env['runtime']['outputManager'].presentText(f"Failed to save settings: {str(e)}", interrupt=False, flush=False) + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/show_unsaved_changes.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/show_unsaved_changes.py new file mode 100644 index 00000000..dd9e9e45 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/management/show_unsaved_changes.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 + +import configparser + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Show temporary changes not yet saved to file" + + def run(self): + self.env['runtime']['outputManager'].presentText("Checking for unsaved changes...", interrupt=True) + + try: + # Read the current config file + settingsFile = self.env['runtime']['settingsManager'].settingsFile + fileConfig = configparser.ConfigParser(interpolation=None) + fileConfig.read(settingsFile) + + # Compare with runtime settings + runtimeSettings = self.env['runtime']['settingsManager'].settings + + changes = [] + + # Check speech settings specifically + speechSections = ['speech', 'sound', 'keyboard', 'screen', 'general'] + + for section in speechSections: + if section in runtimeSettings and section in fileConfig: + for option in runtimeSettings[section]: + runtimeValue = runtimeSettings[section][option] + try: + fileValue = fileConfig[section][option] + except: + fileValue = "" + + if runtimeValue != fileValue: + changes.append(f"{section}.{option}: {fileValue} → {runtimeValue}") + + if changes: + self.env['runtime']['outputManager'].presentText(f"Found {len(changes)} unsaved changes:", interrupt=True) + for change in changes[:5]: # Limit to first 5 changes + self.env['runtime']['outputManager'].presentText(change, interrupt=True) + + if len(changes) > 5: + self.env['runtime']['outputManager'].presentText(f"... and {len(changes) - 5} more changes", interrupt=True) + + self.env['runtime']['outputManager'].presentText("Use save command to make these changes permanent", interrupt=True) + self.env['runtime']['outputManager'].playSound('Accept') + else: + self.env['runtime']['outputManager'].presentText("No unsaved changes found", interrupt=True) + self.env['runtime']['outputManager'].playSound('Cancel') + + except Exception as e: + self.env['runtime']['outputManager'].presentText(f"Error checking for changes: {str(e)}", interrupt=True) + self.env['runtime']['outputManager'].playSound('Error') + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/screen/__init__.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/screen/__init__.py new file mode 100644 index 00000000..428c13ab --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/screen/__init__.py @@ -0,0 +1 @@ +# Fenrir screen configuration diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/screen/select_driver.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/screen/select_driver.py new file mode 100644 index 00000000..8b39be77 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/screen/select_driver.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 + +import os +import importlib.util + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Select screen driver" + + def run(self): + currentDriver = self.getSetting('screen', 'driver', 'vcsaDriver') + + # Present current driver + driverDescriptions = { + 'vcsaDriver': 'VCSA Driver - Linux TTY console access', + 'ptyDriver': 'PTY Driver - terminal emulation', + 'dummyDriver': 'Dummy Driver - for testing only', + 'debugDriver': 'Debug Driver - development/debugging' + } + + currentDescription = driverDescriptions.get(currentDriver, 'Unknown driver') + self.presentText(f"Current screen driver: {currentDescription}") + + # Cycle through the available drivers + drivers = ['vcsaDriver', 'ptyDriver', 'dummyDriver', 'debugDriver'] + try: + currentIndex = drivers.index(currentDriver) + nextIndex = (currentIndex + 1) % len(drivers) + newDriver = drivers[nextIndex] + except ValueError: + newDriver = 'vcsaDriver' # Default to VCSA + + success = self.setSetting('screen', 'driver', newDriver) + + if success: + newDescription = driverDescriptions[newDriver] + self.presentText(f"Screen driver changed to: {newDescription}") + self.presentText("Please restart Fenrir for this change to take effect.") + self.playSound('Accept') + else: + self.presentText("Failed to change screen driver") + self.playSound('Error') \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/screen/set_encoding.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/screen/set_encoding.py new file mode 100644 index 00000000..e94c36ce --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/screen/set_encoding.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 + +import os +import importlib.util + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Set screen text encoding" + + def run(self): + currentEncoding = self.getSetting('screen', 'encoding', 'auto') + + # Present current encoding + self.presentText(f"Current screen encoding: {currentEncoding}") + + # Cycle through available encodings + encodings = ['auto', 'utf-8', 'cp1252', 'iso-8859-1'] + try: + currentIndex = encodings.index(currentEncoding) + nextIndex = (currentIndex + 1) % len(encodings) + newEncoding = encodings[nextIndex] + except ValueError: + newEncoding = 'auto' # Default to auto + + success = self.setSetting('screen', 'encoding', newEncoding) + + if success: + self.presentText(f"Screen encoding set to: {newEncoding}") + if newEncoding == 'auto': + self.presentText("Fenrir will automatically detect text encoding") + else: + self.presentText(f"Fenrir will use {newEncoding} encoding") + self.playSound('Accept') + else: + self.presentText("Failed to change screen encoding") + self.playSound('Error') \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/__init__.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/__init__.py new file mode 100644 index 00000000..2b385da2 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/__init__.py @@ -0,0 +1 @@ +# Fenrir sound configuration diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/adjust_volume.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/adjust_volume.py new file mode 100644 index 00000000..ee26d606 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/adjust_volume.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 + +import os +import importlib.util + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Adjust sound volume" + + def run(self): + currentVolume = self.getFloatSetting('sound', 'volume', 0.7) + + # Present current volume + volumePercent = int(currentVolume * 100) + self.presentText(f"Current sound volume: {volumePercent} percent") + + # Adjust volume by 10% + newVolume = self.adjustFloatSetting('sound', 'volume', 0.1, 0.0, 1.0) + + if newVolume != currentVolume: + newPercent = int(newVolume * 100) + self.presentText(f"Sound volume set to {newPercent} percent", interrupt=False) + self.playSound('Accept') + else: + # If we hit the maximum, try decreasing instead + newVolume = self.adjustFloatSetting('sound', 'volume', -0.1, 0.0, 1.0) + if newVolume != currentVolume: + newPercent = int(newVolume * 100) + self.presentText(f"Sound volume set to {newPercent} percent", interrupt=False) + self.playSound('Accept') + else: + self.presentText("Sound volume unchanged", interrupt=False) + self.playSound('Cancel') \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/select_driver.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/select_driver.py new file mode 100644 index 00000000..d524492b --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/select_driver.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 + +import os +import importlib.util + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Select sound driver (genericDriver or gstreamerDriver)" + + def run(self): + currentDriver = self.getSetting('sound', 'driver', 'genericDriver') + + # Present current driver + self.presentText(f"Current sound driver: {currentDriver}") + + # Toggle between the two available drivers + if currentDriver == 'genericDriver': + newDriver = 'gstreamerDriver' + driverDescription = "GStreamer Driver - advanced multimedia framework" + else: + newDriver = 'genericDriver' + driverDescription = "Generic Driver - uses SOX for audio playback" + + success = self.setSetting('sound', 'driver', newDriver) + + if success: + self.presentText(f"Sound driver changed to {newDriver}. {driverDescription}") + self.presentText("Please restart Fenrir for this change to take effect.") + self.playSound('Accept') + else: + self.presentText("Failed to change sound driver") + self.playSound('Error') \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/select_theme.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/select_theme.py new file mode 100644 index 00000000..9203f0a5 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/select_theme.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python3 + +import os +import importlib.util + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Select sound theme" + + def run(self): + currentTheme = self.getSetting('sound', 'theme', 'default') + + # Present current theme + self.presentText(f"Current sound theme: {currentTheme}") + + # Look for available sound themes + soundPaths = [ + '/usr/share/sounds', + '/usr/share/fenrirscreenreader/sounds', + os.path.expanduser('~/.local/share/fenrirscreenreader/sounds') + ] + + availableThemes = self.getAvailableThemes(soundPaths) + + if len(availableThemes) > 1: + # For this implementation, cycle through available themes + try: + currentIndex = availableThemes.index(currentTheme) + nextIndex = (currentIndex + 1) % len(availableThemes) + newTheme = availableThemes[nextIndex] + except ValueError: + # Current theme not found in available themes, use first one + newTheme = availableThemes[0] + + success = self.setSetting('sound', 'theme', newTheme) + + if success: + self.presentText(f"Sound theme changed to: {newTheme}") + self.playSound('Accept') + else: + self.presentText("Failed to change sound theme") + self.playSound('Error') + else: + self.presentText("Only default sound theme is available") + self.playSound('Cancel') + + def getAvailableThemes(self, searchPaths): + """Find available sound themes in the search paths""" + themes = ['default'] # Always include default + + for path in searchPaths: + if os.path.isdir(path): + try: + for item in os.listdir(path): + fullPath = os.path.join(path, item) + if os.path.isdir(fullPath) and item != 'default' and item not in themes: + # Check if it looks like a sound theme (contains sound files) + if self.isValidSoundTheme(fullPath): + themes.append(item) + except Exception: + continue + + return themes + + def isValidSoundTheme(self, themePath): + """Check if a directory contains sound files""" + soundExtensions = ['.wav', '.ogg', '.mp3', '.flac'] + try: + for file in os.listdir(themePath): + if any(file.lower().endswith(ext) for ext in soundExtensions): + return True + except Exception: + pass + return False \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/toggle_enabled.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/toggle_enabled.py new file mode 100644 index 00000000..892c2758 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/sound/toggle_enabled.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 + +import os +import importlib.util + +# Load base configuration class +_base_path = os.path.join(os.path.dirname(__file__), '..', 'config_base.py') +_spec = importlib.util.spec_from_file_location("config_base", _base_path) +_module = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_module) +ConfigCommand = _module.ConfigCommand + +class command(ConfigCommand): + def __init__(self): + super().__init__() + + def getDescription(self): + return "Toggle sound output on or off" + + def run(self): + currentState = self.getBooleanSetting('sound', 'enabled', True) + newState = self.toggleBooleanSetting('sound', 'enabled') + + if newState != currentState: + stateText = "enabled" if newState else "disabled" + self.presentText(f"Sound {stateText}") + # Only play sound if we enabled sound + if newState: + self.playSound('Accept') + else: + self.presentText("Failed to change sound setting") \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/__init__.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/__init__.py new file mode 100644 index 00000000..3b31c6d8 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/__init__.py @@ -0,0 +1 @@ +# Fenrir speech configuration diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_pitch.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_pitch.py new file mode 100644 index 00000000..8b13cafb --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_pitch.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Adjust speech pitch (voice height)" + + def run(self): + try: + # Get current pitch + currentPitch = float(self.env['runtime']['settingsManager'].getSetting('speech', 'pitch')) + except: + currentPitch = 0.5 + + # Present current pitch + pitchPercent = int(currentPitch * 100) + self.env['runtime']['outputManager'].presentText(f"Current speech pitch: {pitchPercent} percent", interrupt=True) + + # Increase by 10%, wrap around if at max + newPitch = currentPitch + 0.1 + if newPitch > 1.0: + newPitch = 0.1 # Wrap to minimum + + # Apply the new pitch + self.env['runtime']['settingsManager'].setSetting('speech', 'pitch', str(newPitch)) + + newPercent = int(newPitch * 100) + self.env['runtime']['outputManager'].presentText(f"Speech pitch set to {newPercent} percent", interrupt=True) + self.env['runtime']['outputManager'].playSound('Accept') + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_rate.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_rate.py new file mode 100644 index 00000000..cc2be4aa --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_rate.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Adjust speech rate (speed)" + + def run(self): + try: + # Get current rate + currentRate = float(self.env['runtime']['settingsManager'].getSetting('speech', 'rate')) + except: + currentRate = 0.5 + + # Present current rate + ratePercent = int(currentRate * 100) + self.env['runtime']['outputManager'].presentText(f"Current speech rate: {ratePercent} percent", interrupt=True) + + # Increase by 10%, wrap around if at max + newRate = currentRate + 0.1 + if newRate > 1.0: + newRate = 0.1 # Wrap to minimum + + # Apply the new rate + self.env['runtime']['settingsManager'].setSetting('speech', 'rate', str(newRate)) + + newPercent = int(newRate * 100) + self.env['runtime']['outputManager'].presentText(f"Speech rate set to {newPercent} percent", interrupt=False, flush=False) + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_speech_rate.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_speech_rate.py new file mode 100644 index 00000000..376ef7f3 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_speech_rate.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Adjust speech rate (temporary - use save to make permanent)" + + def run(self): + try: + # Get current rate from runtime settings (may be temporary) + settingsManager = self.env['runtime']['settingsManager'] + currentRate = float(settingsManager.getSetting('speech', 'rate')) + except: + currentRate = 0.5 + + # Present current rate + ratePercent = int(currentRate * 100) + self.env['runtime']['outputManager'].presentText(f"Current speech rate: {ratePercent} percent", interrupt=True) + + # Increase by 10%, wrap around if at max + newRate = currentRate + 0.1 + if newRate > 1.0: + newRate = 0.1 # Wrap to minimum + + # Apply ONLY to runtime - this is temporary until saved + settingsManager = self.env['runtime']['settingsManager'] + settingsManager.settings['speech']['rate'] = str(newRate) + + # Apply to speech system immediately for this session + if 'speechDriver' in self.env['runtime']: + try: + self.env['runtime']['speechDriver'].setRate(newRate) + except: + pass + + newPercent = int(newRate * 100) + self.env['runtime']['outputManager'].presentText(f"Speech rate temporarily set to {newPercent} percent", interrupt=False, flush=False) + self.env['runtime']['outputManager'].presentText("Use save command to make permanent", interrupt=False, flush=False) + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_volume.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_volume.py new file mode 100644 index 00000000..360bfafa --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/adjust_volume.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Adjust speech volume (loudness)" + + def run(self): + try: + # Get current volume + currentVolume = float(self.env['runtime']['settingsManager'].getSetting('speech', 'volume')) + except: + currentVolume = 1.0 + + # Present current volume + volumePercent = int(currentVolume * 100) + self.env['runtime']['outputManager'].presentText(f"Current speech volume: {volumePercent} percent", interrupt=True) + + # Increase by 10%, wrap around if at max + newVolume = currentVolume + 0.1 + if newVolume > 1.0: + newVolume = 0.1 # Wrap to minimum + + # Apply the new volume + self.env['runtime']['settingsManager'].setSetting('speech', 'volume', str(newVolume)) + + newPercent = int(newVolume * 100) + self.env['runtime']['outputManager'].presentText(f"Speech volume set to {newPercent} percent", interrupt=True) + self.env['runtime']['outputManager'].playSound('Accept') + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/apply_previewed_voice.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/apply_previewed_voice.py new file mode 100644 index 00000000..724424f6 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/apply_previewed_voice.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Apply last previewed voice to current session (temporary)" + + def run(self): + # Check if we have a tested voice stored (must be tested first) + if ('commandBuffer' not in self.env or + 'lastTestedModule' not in self.env['commandBuffer'] or + 'lastTestedVoice' not in self.env['commandBuffer']): + self.env['runtime']['outputManager'].presentText("No voice has been tested yet", interrupt=True) + self.env['runtime']['outputManager'].presentText("Use test voice command first to confirm the voice works", interrupt=True) + self.env['runtime']['outputManager'].playSound('Cancel') + return + + module = self.env['commandBuffer']['lastTestedModule'] + voice = self.env['commandBuffer']['lastTestedVoice'] + + self.env['runtime']['outputManager'].presentText(f"Applying tested voice: {voice} from module {module}", interrupt=True) + self.env['runtime']['outputManager'].presentText("This will change your current voice temporarily", interrupt=True) + + try: + # Apply to runtime settings only (temporary until saved) + settingsManager = self.env['runtime']['settingsManager'] + + # Store old values in case we need to revert + oldDriver = settingsManager.getSetting('speech', 'driver') + oldModule = settingsManager.getSetting('speech', 'module') + oldVoice = settingsManager.getSetting('speech', 'voice') + + # Apply new settings to runtime only + settingsManager.settings['speech']['driver'] = 'speechdDriver' + settingsManager.settings['speech']['module'] = module + settingsManager.settings['speech']['voice'] = voice + + # Try to reinitialize speech driver with new settings + if 'speechDriver' in self.env['runtime']: + try: + speechDriver = self.env['runtime']['speechDriver'] + speechDriver.shutdown() + speechDriver.initialize(self.env) + + # Test the new voice + self.env['runtime']['outputManager'].presentText("Voice applied successfully. This is how it sounds.", interrupt=False) + self.env['runtime']['outputManager'].presentText("Use save command to make this change permanent", interrupt=False) + self.env['runtime']['outputManager'].playSound('Accept') + + except Exception as e: + # Revert on failure + settingsManager.settings['speech']['driver'] = oldDriver + settingsManager.settings['speech']['module'] = oldModule + settingsManager.settings['speech']['voice'] = oldVoice + + self.env['runtime']['outputManager'].presentText(f"Failed to apply voice: {str(e)}", interrupt=False) + self.env['runtime']['outputManager'].presentText("Reverted to previous settings", interrupt=False) + self.env['runtime']['outputManager'].playSound('Error') + else: + self.env['runtime']['outputManager'].presentText("Speech driver not available", interrupt=False) + self.env['runtime']['outputManager'].playSound('Error') + + except Exception as e: + self.env['runtime']['outputManager'].presentText(f"Error applying voice: {str(e)}", interrupt=False) + self.env['runtime']['outputManager'].playSound('Error') + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/configure_voice.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/configure_voice.py new file mode 100644 index 00000000..734fa41e --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/configure_voice.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python3 + +import subprocess +import time + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + self.testMessage = "This is a voice test. If you can hear this message clearly, press Enter to accept this voice. Otherwise, wait 30 seconds to cancel." + + def shutdown(self): + pass + + def getDescription(self): + return "Configure speech module and voice with testing" + + def run(self): + self.env['runtime']['outputManager'].presentText("Starting voice configuration wizard", interrupt=True) + + # Step 1: Get available speech modules + modules = self.getSpeechdModules() + if not modules: + self.env['runtime']['outputManager'].presentText("No speech-dispatcher modules found. Please install speech-dispatcher.", interrupt=True) + self.env['runtime']['outputManager'].playSound('Error') + return + + # For this implementation, cycle through modules or use the first available one + # Get current module + currentModule = self.env['runtime']['settingsManager'].getSetting('speech', 'module') + if not currentModule: + currentModule = modules[0] + + # Find next module or cycle to first + try: + currentIndex = modules.index(currentModule) + nextIndex = (currentIndex + 1) % len(modules) + selectedModule = modules[nextIndex] + except ValueError: + selectedModule = modules[0] + + self.env['runtime']['outputManager'].presentText(f"Selected speech module: {selectedModule}", interrupt=True) + + # Step 2: Get available voices for the module + voices = self.getModuleVoices(selectedModule) + if not voices: + self.env['runtime']['outputManager'].presentText(f"No voices found for module {selectedModule}", interrupt=True) + self.env['runtime']['outputManager'].playSound('Error') + return + + # Get current voice and cycle to next, or use best voice + currentVoice = self.env['runtime']['settingsManager'].getSetting('speech', 'voice') + if currentVoice and currentVoice in voices: + try: + currentIndex = voices.index(currentVoice) + nextIndex = (currentIndex + 1) % len(voices) + selectedVoice = voices[nextIndex] + except ValueError: + selectedVoice = self.selectBestVoice(voices) + else: + selectedVoice = self.selectBestVoice(voices) + + self.env['runtime']['outputManager'].presentText(f"Testing voice: {selectedVoice}", interrupt=True) + + # Step 3: Test the voice configuration + if self.testVoiceWithConfirmation(selectedModule, selectedVoice): + # User confirmed - save the configuration + self.env['runtime']['settingsManager'].setSetting('speech', 'driver', 'speechdDriver') + self.env['runtime']['settingsManager'].setSetting('speech', 'module', selectedModule) + self.env['runtime']['settingsManager'].setSetting('speech', 'voice', selectedVoice) + + self.env['runtime']['outputManager'].presentText("Voice configuration saved successfully!", interrupt=True) + self.env['runtime']['outputManager'].presentText(f"Module: {selectedModule}, Voice: {selectedVoice}", interrupt=True) + self.env['runtime']['outputManager'].playSound('Accept') + else: + # User cancelled or test failed + self.env['runtime']['outputManager'].presentText("Voice configuration cancelled. Settings unchanged.", interrupt=True) + self.env['runtime']['outputManager'].playSound('Cancel') + + def getSpeechdModules(self): + """Get list of available speech-dispatcher modules""" + try: + result = subprocess.run(['spd-say', '-O'], capture_output=True, text=True, timeout=10) + if result.returncode == 0: + lines = result.stdout.strip().split('\n') + return [line.strip() for line in lines[1:] if line.strip()] + except Exception: + pass + return [] + + def getModuleVoices(self, module): + """Get list of voices for a specific speech module""" + try: + result = subprocess.run(['spd-say', '-o', module, '-L'], capture_output=True, text=True, timeout=10) + if result.returncode == 0: + lines = result.stdout.strip().split('\n') + voices = [] + for line in lines[1:]: + if not line.strip(): + continue + if module.lower() == 'espeak-ng': + voice = self.processEspeakVoice(line) + if voice: + voices.append(voice) + else: + voices.append(line.strip()) + return voices + except Exception: + pass + return [] + + def processEspeakVoice(self, voiceLine): + """Process espeak-ng voice line format""" + parts = [p for p in voiceLine.split() if p] + if len(parts) < 2: + return None + langCode = parts[-2].lower() + variant = parts[-1].lower() + return f"{langCode}+{variant}" if variant and variant != 'none' else langCode + + def selectBestVoice(self, voices): + """Select the best voice from available voices, preferring English""" + # Look for English voices first + for voice in voices: + if any(lang in voice.lower() for lang in ['en', 'english', 'us', 'gb']): + return voice + + # If no English voice found, return the first available + return voices[0] if voices else "" + + def testVoiceWithConfirmation(self, module, voice): + """Test voice and wait for user confirmation""" + try: + # Start the voice test + self.env['runtime']['outputManager'].presentText("Starting voice test. Listen carefully.", interrupt=True) + time.sleep(1) # Brief pause + + # Use spd-say to test the voice + process = subprocess.Popen([ + 'spd-say', '-o', module, '-y', voice, self.testMessage + ]) + + # Wait for the test message to finish (give it some time) + time.sleep(2) + + # Now wait for user input + self.env['runtime']['outputManager'].presentText("Press Enter if you heard the test message and want to keep this voice, or wait 30 seconds to cancel.", interrupt=True) + + # Set up a simple confirmation system + # Since vmenu doesn't support input waiting natively, we'll use a simpler approach + # The user will need to run this command again to cycle through voices + # and the settings will be applied immediately for testing + + # Apply settings temporarily for immediate testing + oldModule = self.env['runtime']['settingsManager'].getSetting('speech', 'module') + oldVoice = self.env['runtime']['settingsManager'].getSetting('speech', 'voice') + + self.env['runtime']['settingsManager'].setSetting('speech', 'module', module) + self.env['runtime']['settingsManager'].setSetting('speech', 'voice', voice) + + # Test with Fenrir's own speech system + time.sleep(1) + self.env['runtime']['outputManager'].presentText("This is how the new voice sounds in Fenrir. Run this command again to try the next voice, or exit the menu to keep this voice.", interrupt=True) + + # For now, we'll auto-accept since we can't wait for input in vmenu + # The user can cycle through by running the command multiple times + return True + + except Exception as e: + self.env['runtime']['outputManager'].presentText(f"Error testing voice: {str(e)}", interrupt=True) + return False + finally: + # Clean up any running processes + try: + process.terminate() + except: + pass + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/preview_voices.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/preview_voices.py new file mode 100644 index 00000000..7855967a --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/preview_voices.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 + +import subprocess + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + self.testMessage = "This is a voice preview. The quick brown fox jumps over the lazy dog." + + def shutdown(self): + pass + + def getDescription(self): + return "Cycle through available voices (run multiple times to browse)" + + def run(self): + # Get available modules + modules = self.getSpeechdModules() + if not modules: + self.env['runtime']['outputManager'].presentText("No speech-dispatcher modules found", interrupt=True) + self.env['runtime']['outputManager'].playSound('Error') + return + + # Get stored indexes or initialize + moduleIndex = self.env['commandBuffer'].get('voicePreviewModuleIndex', 0) + voiceIndex = self.env['commandBuffer'].get('voicePreviewVoiceIndex', 0) + + # Ensure indexes are valid + if moduleIndex >= len(modules): + moduleIndex = 0 + + selectedModule = modules[moduleIndex] + + # Get voices for current module + voices = self.getModuleVoices(selectedModule) + if not voices: + self.env['runtime']['outputManager'].presentText(f"No voices found for {selectedModule}, trying next module", interrupt=True) + moduleIndex = (moduleIndex + 1) % len(modules) + self.env['commandBuffer']['voicePreviewModuleIndex'] = moduleIndex + self.env['commandBuffer']['voicePreviewVoiceIndex'] = 0 + return + + # Ensure voice index is valid + if voiceIndex >= len(voices): + voiceIndex = 0 + + selectedVoice = voices[voiceIndex] + + # Present current selection + self.env['runtime']['outputManager'].presentText( + f"Module: {selectedModule} ({moduleIndex + 1}/{len(modules)})", interrupt=True + ) + self.env['runtime']['outputManager'].presentText( + f"Voice: {selectedVoice} ({voiceIndex + 1}/{len(voices)})", interrupt=True + ) + + # Test the voice + self.env['runtime']['outputManager'].presentText("Testing voice...", interrupt=True) + if self.previewVoice(selectedModule, selectedVoice): + self.env['runtime']['outputManager'].presentText("Voice test completed", interrupt=True) + self.env['runtime']['outputManager'].presentText("Run again for next voice, or use Apply Voice to make this active", interrupt=True) + + # Store for potential application + self.env['commandBuffer']['lastTestedModule'] = selectedModule + self.env['commandBuffer']['lastTestedVoice'] = selectedVoice + + self.env['runtime']['outputManager'].playSound('Accept') + else: + self.env['runtime']['outputManager'].presentText("Voice test failed", interrupt=True) + self.env['runtime']['outputManager'].playSound('Error') + + # Advance to next voice for next run + voiceIndex += 1 + if voiceIndex >= len(voices): + voiceIndex = 0 + moduleIndex = (moduleIndex + 1) % len(modules) + + # Store indexes for next run + self.env['commandBuffer']['voicePreviewModuleIndex'] = moduleIndex + self.env['commandBuffer']['voicePreviewVoiceIndex'] = voiceIndex + + def previewVoice(self, module, voice): + """Preview voice using spd-say without affecting Fenrir""" + try: + cmd = ['spd-say', '-o', module, '-y', voice, self.testMessage] + result = subprocess.run(cmd, timeout=15) + return result.returncode == 0 + except Exception: + return False + + def getSpeechdModules(self): + """Get list of available speech-dispatcher modules""" + try: + result = subprocess.run(['spd-say', '-O'], capture_output=True, text=True, timeout=10) + if result.returncode == 0: + lines = result.stdout.strip().split('\n') + return [line.strip() for line in lines[1:] if line.strip()] + except Exception: + pass + return [] + + def getModuleVoices(self, module): + """Get list of voices for a specific speech module""" + try: + result = subprocess.run(['spd-say', '-o', module, '-L'], capture_output=True, text=True, timeout=10) + if result.returncode == 0: + lines = result.stdout.strip().split('\n') + voices = [] + for line in lines[1:]: + if not line.strip(): + continue + if module.lower() == 'espeak-ng': + voice = self.processEspeakVoice(line) + if voice: + voices.append(voice) + else: + voices.append(line.strip()) + return voices + except Exception: + pass + return [] + + def processEspeakVoice(self, voiceLine): + """Process espeak-ng voice line format""" + parts = [p for p in voiceLine.split() if p] + if len(parts) < 2: + return None + langCode = parts[-2].lower() + variant = parts[-1].lower() + return f"{langCode}+{variant}" if variant and variant != 'none' else langCode + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/show_current_settings.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/show_current_settings.py new file mode 100644 index 00000000..5a8d6979 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/show_current_settings.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Show current speech settings" + + def run(self): + # Get current speech settings + driver = self.env['runtime']['settingsManager'].getSetting('speech', 'driver') + module = self.env['runtime']['settingsManager'].getSetting('speech', 'module') + voice = self.env['runtime']['settingsManager'].getSetting('speech', 'voice') + rate = self.env['runtime']['settingsManager'].getSetting('speech', 'rate') + pitch = self.env['runtime']['settingsManager'].getSetting('speech', 'pitch') + volume = self.env['runtime']['settingsManager'].getSetting('speech', 'volume') + enabled = self.env['runtime']['settingsManager'].getSetting('speech', 'enabled') + + self.env['runtime']['outputManager'].presentText("Current speech settings:", interrupt=True) + + # Present all settings + self.env['runtime']['outputManager'].presentText(f"Speech enabled: {enabled}", interrupt=True) + self.env['runtime']['outputManager'].presentText(f"Driver: {driver}", interrupt=True) + + if module: + self.env['runtime']['outputManager'].presentText(f"Module: {module}", interrupt=True) + + if voice: + self.env['runtime']['outputManager'].presentText(f"Voice: {voice}", interrupt=True) + + try: + ratePercent = int(float(rate) * 100) + self.env['runtime']['outputManager'].presentText(f"Rate: {ratePercent} percent", interrupt=True) + except: + self.env['runtime']['outputManager'].presentText(f"Rate: {rate}", interrupt=True) + + try: + pitchPercent = int(float(pitch) * 100) + self.env['runtime']['outputManager'].presentText(f"Pitch: {pitchPercent} percent", interrupt=True) + except: + self.env['runtime']['outputManager'].presentText(f"Pitch: {pitch}", interrupt=True) + + try: + volumePercent = int(float(volume) * 100) + self.env['runtime']['outputManager'].presentText(f"Volume: {volumePercent} percent", interrupt=True) + except: + self.env['runtime']['outputManager'].presentText(f"Volume: {volume}", interrupt=True) + + self.env['runtime']['outputManager'].playSound('Accept') + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/test_current_voice.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/test_current_voice.py new file mode 100644 index 00000000..f5c51d69 --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/speech/test_current_voice.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 + +import subprocess + +class command(): + def __init__(self): + pass + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Test current voice configuration" + + def run(self): + # Get current speech settings + driver = self.env['runtime']['settingsManager'].getSetting('speech', 'driver') + module = self.env['runtime']['settingsManager'].getSetting('speech', 'module') + voice = self.env['runtime']['settingsManager'].getSetting('speech', 'voice') + rate = self.env['runtime']['settingsManager'].getSetting('speech', 'rate') + pitch = self.env['runtime']['settingsManager'].getSetting('speech', 'pitch') + volume = self.env['runtime']['settingsManager'].getSetting('speech', 'volume') + + # Present current configuration + self.env['runtime']['outputManager'].presentText("Testing current voice configuration", interrupt=True) + + if driver == 'speechdDriver' and module: + self.env['runtime']['outputManager'].presentText(f"Driver: {driver}", interrupt=True) + self.env['runtime']['outputManager'].presentText(f"Module: {module}", interrupt=True) + if voice: + self.env['runtime']['outputManager'].presentText(f"Voice: {voice}", interrupt=True) + + try: + ratePercent = int(float(rate) * 100) + self.env['runtime']['outputManager'].presentText(f"Rate: {ratePercent} percent", interrupt=True) + except: + pass + + try: + pitchPercent = int(float(pitch) * 100) + self.env['runtime']['outputManager'].presentText(f"Pitch: {pitchPercent} percent", interrupt=True) + except: + pass + + try: + volumePercent = int(float(volume) * 100) + self.env['runtime']['outputManager'].presentText(f"Volume: {volumePercent} percent", interrupt=True) + except: + pass + + # Test message + testMessage = "This is a test of your current voice configuration. The quick brown fox jumps over the lazy dog. Numbers: one, two, three, four, five. If you can hear this message clearly, your voice settings are working properly." + + self.env['runtime']['outputManager'].presentText("Voice test:", interrupt=True) + self.env['runtime']['outputManager'].presentText(testMessage, interrupt=True) + self.env['runtime']['outputManager'].playSound('Accept') + + def setCallback(self, callback): + pass \ No newline at end of file diff --git a/src/fenrirscreenreader/core/dynamicVoiceMenu.py b/src/fenrirscreenreader/core/dynamicVoiceMenu.py new file mode 100644 index 00000000..972ec776 --- /dev/null +++ b/src/fenrirscreenreader/core/dynamicVoiceMenu.py @@ -0,0 +1,212 @@ +#!/usr/bin/env python3 + +import subprocess +import importlib.util +import os + +class DynamicVoiceCommand: + """Dynamic command class for voice selection""" + def __init__(self, module, voice, env): + self.module = module + self.voice = voice + self.env = env + self.testMessage = "This is a voice test. The quick brown fox jumps over the lazy dog." + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return f"Select voice: {self.voice}" + + def run(self): + try: + self.env['runtime']['outputManager'].presentText(f"Testing {self.voice} from {self.module}", interrupt=True) + + # Test voice first + if self.testVoice(): + self.env['runtime']['outputManager'].presentText("Voice test completed. Press Enter again to apply.", interrupt=True) + + # Store for confirmation + self.env['commandBuffer']['pendingVoiceModule'] = self.module + self.env['commandBuffer']['pendingVoiceVoice'] = self.voice + self.env['commandBuffer']['voiceTestCompleted'] = True + + self.env['runtime']['outputManager'].playSound('Accept') + else: + self.env['runtime']['outputManager'].presentText("Voice test failed", interrupt=True) + self.env['runtime']['outputManager'].playSound('Error') + + except Exception as e: + self.env['runtime']['outputManager'].presentText(f"Voice selection error: {str(e)}", interrupt=True) + self.env['runtime']['outputManager'].playSound('Error') + + def testVoice(self): + """Test voice with spd-say""" + try: + cmd = ['spd-say', '-o', self.module, '-y', self.voice, self.testMessage] + result = subprocess.run(cmd, timeout=8) + return result.returncode == 0 + except Exception: + return False + + def setCallback(self, callback): + pass + +class DynamicApplyVoiceCommand: + """Command to apply the tested voice""" + def __init__(self, env): + self.env = env + + def initialize(self, environment): + self.env = environment + + def shutdown(self): + pass + + def getDescription(self): + return "Apply tested voice to Fenrir" + + def run(self): + try: + if not self.env['commandBuffer'].get('voiceTestCompleted', False): + self.env['runtime']['outputManager'].presentText("No voice has been tested yet", interrupt=True) + return + + module = self.env['commandBuffer']['pendingVoiceModule'] + voice = self.env['commandBuffer']['pendingVoiceVoice'] + + self.env['runtime']['outputManager'].presentText(f"Applying {voice} from {module}", interrupt=True) + + # Apply to runtime settings + settingsManager = self.env['runtime']['settingsManager'] + settingsManager.settings['speech']['driver'] = 'speechdDriver' + settingsManager.settings['speech']['module'] = module + settingsManager.settings['speech']['voice'] = voice + + # Reinitialize speech driver + if 'speechDriver' in self.env['runtime']: + speechDriver = self.env['runtime']['speechDriver'] + speechDriver.shutdown() + speechDriver.initialize(self.env) + + self.env['runtime']['outputManager'].presentText("Voice applied successfully!", interrupt=True) + self.env['runtime']['outputManager'].playSound('Accept') + + # Clear pending state + self.env['commandBuffer']['voiceTestCompleted'] = False + + # Exit vmenu after successful application + self.env['runtime']['vmenuManager'].setActive(False) + + except Exception as e: + self.env['runtime']['outputManager'].presentText(f"Apply failed: {str(e)}", interrupt=True) + self.env['runtime']['outputManager'].playSound('Error') + + def setCallback(self, callback): + pass + +def addDynamicVoiceMenus(vmenuManager): + """Add dynamic voice menus to vmenu system""" + try: + env = vmenuManager.env + + # Get speech modules + modules = getSpeechdModules() + if not modules: + return + + # Create voice browser submenu + voiceBrowserMenu = {} + + # Add apply voice command + applyCommand = DynamicApplyVoiceCommand(env) + voiceBrowserMenu['Apply Tested Voice Action'] = applyCommand + + # Add modules as submenus + for module in modules[:8]: # Limit to 8 modules to keep menu manageable + moduleMenu = {} + + # Get voices for this module (limit to prevent huge menus) + voices = getModuleVoices(module) + if voices: + # Limit voices to keep menu usable + if len(voices) > 50: + voices = voices[:50] + moduleMenu['Note: Showing first 50 voices Action'] = createInfoCommand(f"Module {module} has {len(getModuleVoices(module))} voices, showing first 50", env) + + # Add voice commands + for voice in voices: + voiceCommand = DynamicVoiceCommand(module, voice, env) + moduleMenu[f"{voice} Action"] = voiceCommand + else: + moduleMenu['No voices available Action'] = createInfoCommand(f"No voices found for {module}", env) + + voiceBrowserMenu[f"{module} Menu"] = moduleMenu + + # Add to main menu dict + vmenuManager.menuDict['Voice Browser Menu'] = voiceBrowserMenu + + except Exception as e: + print(f"Error creating dynamic voice menus: {e}") + +def createInfoCommand(message, env): + """Create a simple info command""" + class InfoCommand: + def __init__(self, message, env): + self.message = message + self.env = env + def initialize(self, environment): pass + def shutdown(self): pass + def getDescription(self): return self.message + def run(self): + self.env['runtime']['outputManager'].presentText(self.message, interrupt=True) + def setCallback(self, callback): pass + + return InfoCommand(message, env) + +def getSpeechdModules(): + """Get available speech modules""" + try: + result = subprocess.run(['spd-say', '-O'], capture_output=True, text=True, timeout=5) + if result.returncode == 0: + lines = result.stdout.strip().split('\n') + return [line.strip() for line in lines[1:] if line.strip()] + except Exception: + pass + return [] + +def getModuleVoices(module): + """Get voices for a module""" + try: + result = subprocess.run(['spd-say', '-o', module, '-L'], capture_output=True, text=True, timeout=8) + if result.returncode == 0: + lines = result.stdout.strip().split('\n') + voices = [] + for line in lines[1:]: + if not line.strip(): + continue + if module.lower() == 'espeak-ng': + voice = processEspeakVoice(line) + if voice: + voices.append(voice) + else: + voices.append(line.strip()) + return voices + except Exception: + pass + return [] + +def processEspeakVoice(voiceLine): + """Process espeak voice format""" + try: + parts = [p for p in voiceLine.split() if p] + if len(parts) < 2: + return None + langCode = parts[-2].lower() + variant = parts[-1].lower() + return f"{langCode}+{variant}" if variant and variant != 'none' else langCode + except Exception: + return None \ No newline at end of file diff --git a/src/fenrirscreenreader/core/vmenuManager.py b/src/fenrirscreenreader/core/vmenuManager.py index 53b40888..80b40cd6 100755 --- a/src/fenrirscreenreader/core/vmenuManager.py +++ b/src/fenrirscreenreader/core/vmenuManager.py @@ -152,6 +152,14 @@ class vmenuManager(): menu = self.fs_tree_to_dict( self.defaultVMenuPath) if menu: self.menuDict = menu + + # Add dynamic voice menus + try: + from fenrirscreenreader.core.dynamicVoiceMenu import addDynamicVoiceMenus + addDynamicVoiceMenus(self) + except Exception as e: + print(f"Error adding dynamic voice menus: {e}") + # index still valid? if self.currIndex != None: try: diff --git a/src/fenrirscreenreader/fenrirVersion.py b/src/fenrirscreenreader/fenrirVersion.py index 61fc2798..a43bb685 100644 --- a/src/fenrirscreenreader/fenrirVersion.py +++ b/src/fenrirscreenreader/fenrirVersion.py @@ -4,5 +4,5 @@ # Fenrir TTY screen reader # By Chrys, Storm Dragon, and contributers. -version = "2025.06.12" +version = "2025.06.15" codeName = "testing"