From 1d7f7af5cab400ec64741c6f32da4a31ceae2e38 Mon Sep 17 00:00:00 2001 From: Simon Jutzi Date: Wed, 12 Mar 2025 14:14:00 +0100 Subject: [PATCH 1/3] feat: add user state for presence Swyx offers more buddy states than standard SIP (e.g. AFK, on the phone, busy, ...). This commit allows Twinkle to parse these vendor-specific states and makes them available as "user_state" throughout the application. The states are used to render the buddy list (you can now see if one of your buddies is on the phone). --- .gitignore | 1 + CMakeLists.txt | 4 +- src/gui/buddylistview.cpp | 59 ++++++++++++----- src/gui/buddylistview.h | 3 +- src/gui/icons.qrc | 3 + src/gui/images/presence_afk.png | Bin 0 -> 349 bytes src/gui/images/presence_busy.png | Bin 0 -> 325 bytes src/gui/images/presence_offline.png | Bin 849 -> 385 bytes src/gui/images/presence_online.png | Bin 848 -> 2396 bytes src/gui/images/presence_talking.png | Bin 0 -> 354 bytes src/presence/pidf_body.cpp | 31 ++++++++- src/presence/pidf_body.h | 21 +++++- src/presence/presence_state.cpp | 85 ++++++++++++++++++++++++- src/presence/presence_state.h | 15 +++++ src/presence/presence_subscription.cpp | 3 + 15 files changed, 201 insertions(+), 24 deletions(-) create mode 100644 src/gui/images/presence_afk.png create mode 100644 src/gui/images/presence_busy.png create mode 100644 src/gui/images/presence_talking.png diff --git a/.gitignore b/.gitignore index ecce0115..3d983cab 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ src/parser/scanner.cxx src/sdp/sdp_parser.cxx src/sdp/sdp_parser.hxx src/sdp/sdp_scanner.cxx +/build # Qt Creator files CMakeLists.txt.user* diff --git a/CMakeLists.txt b/CMakeLists.txt index eab3902d..84e53843 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,8 +2,8 @@ cmake_minimum_required(VERSION 2.8.10...3.22 FATAL_ERROR) project(twinkle) -set(PRODUCT_VERSION "1.10.3") -set(PRODUCT_DATE "February 18, 2022") +set(PRODUCT_VERSION "1.11.0-beta") +set(PRODUCT_DATE "March 12, 2024") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") # Add -DDEBUG for non-release builds, or uCommon will unilaterally define NDEBUG # (https://lists.gnu.org/archive/html/bug-commoncpp/2019-12/msg00000.html) diff --git a/src/gui/buddylistview.cpp b/src/gui/buddylistview.cpp index 38d89ae5..8654cdce 100644 --- a/src/gui/buddylistview.cpp +++ b/src/gui/buddylistview.cpp @@ -26,26 +26,50 @@ #include "qsize.h" #include -void AbstractBLVItem::set_icon(t_presence_state::t_basic_state state) { - switch (state) { - case t_presence_state::ST_BASIC_UNKNOWN: - setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_unknown.png")); + +void AbstractBLVItem::set_icon( t_presence_state::t_basic_state basic_state, + t_presence_state::t_user_state user_state) +{ + switch (user_state) + { + case t_presence_state::ST_USER_TALKING: + setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_talking.png")); break; - case t_presence_state::ST_BASIC_CLOSED: - setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_offline.png")); + case t_presence_state::ST_USER_AFK: + setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_afk.png")); break; - case t_presence_state::ST_BASIC_OPEN: - setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_online.png")); + case t_presence_state::ST_USER_BUSY: + setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_busy.png")); break; - case t_presence_state::ST_BASIC_FAILED: - setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_failed.png")); + case t_presence_state::ST_USER_ONLINE: + setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_online.png")); break; - case t_presence_state::ST_BASIC_REJECTED: - setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_rejected.png")); + case t_presence_state::ST_USER_OFFLINE: + setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_offline.png")); break; default: - setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_unknown.png")); - break; + // fallback to SIP basic states + switch (basic_state) + { + case t_presence_state::ST_BASIC_UNKNOWN: + setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_unknown.png")); + break; + case t_presence_state::ST_BASIC_CLOSED: + setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_offline.png")); + break; + case t_presence_state::ST_BASIC_OPEN: + setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_online.png")); + break; + case t_presence_state::ST_BASIC_FAILED: + setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_failed.png")); + break; + case t_presence_state::ST_BASIC_REJECTED: + setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_rejected.png")); + break; + default: + setData(0, Qt::DecorationRole, QPixmap(":/icons/images/presence_unknown.png")); + break; + } } } @@ -78,7 +102,9 @@ void BuddyListViewItem::set_icon(void) { QString failure; t_presence_state::t_basic_state basic_state = buddy-> get_presence_state()->get_basic_state(); - AbstractBLVItem::set_icon(basic_state); + t_presence_state::t_user_state user_state = buddy-> + get_presence_state()->get_user_state(); + AbstractBLVItem::set_icon(basic_state, user_state); tip += "
"; tip += ""; @@ -155,6 +181,7 @@ t_buddy *BuddyListViewItem::get_buddy(void) { void BLViewUserItem::set_icon(void) { t_presence_state::t_basic_state basic_state; + t_presence_state::t_user_state user_state; QString failure; QString profile_name = QString::fromStdString(presence_epa->get_user_profile()->get_profile_name()); @@ -180,7 +207,7 @@ void BLViewUserItem::set_icon(void) { break; case t_presence_epa::EPA_PUBLISHED: basic_state = presence_epa->get_basic_state(); - AbstractBLVItem::set_icon(basic_state); + AbstractBLVItem::set_icon(basic_state, t_presence_state::ST_USER_UNKNOWN); switch (presence_epa->get_basic_state()) { case t_presence_state::ST_BASIC_CLOSED: diff --git a/src/gui/buddylistview.h b/src/gui/buddylistview.h index 2283f918..2f573137 100644 --- a/src/gui/buddylistview.h +++ b/src/gui/buddylistview.h @@ -31,7 +31,8 @@ class AbstractBLVItem : public QTreeWidgetItem { QString tip; // Set the presence icon to reflect the presence state - virtual void set_icon(t_presence_state::t_basic_state state); + virtual void set_icon(t_presence_state::t_basic_state basic_state, + t_presence_state::t_user_state user_state); public: AbstractBLVItem(QTreeWidgetItem *parent, const QString &text); diff --git a/src/gui/icons.qrc b/src/gui/icons.qrc index f9d276a9..60eda618 100644 --- a/src/gui/icons.qrc +++ b/src/gui/icons.qrc @@ -98,6 +98,9 @@ images/presence.png images/presence_rejected.png images/presence_unknown.png + images/presence_afk.png + images/presence_busy.png + images/presence_talking.png images/print images/qt-logo.png images/redial-disabled.png diff --git a/src/gui/images/presence_afk.png b/src/gui/images/presence_afk.png new file mode 100644 index 0000000000000000000000000000000000000000..0ee63087c01eadd06b7246197894fbd239a25f72 GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;x#X;^) zj5kl})B`yR$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG z?e4|OqTRgnQoh!PBcc}n18SM|?iI4X=sL1tvE*vW zIFTD?b{5qiw4N5~m}B9fmc(ym!R$I)Oa(1j%Dz4^>bP0l+XkKq%e5a literal 0 HcmV?d00001 diff --git a/src/gui/images/presence_busy.png b/src/gui/images/presence_busy.png new file mode 100644 index 0000000000000000000000000000000000000000..8df5a521d63daa3b44b9632843b18dff53858085 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;x#X;^) zj5kl})B`yR$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG z?e4_VF8SfHqFohR2{%U4hoU~%!5_yxCfw$OertJ1!Wx&Ar z!E$QDi?C^0zO8YsfvmM1fvx+(Y{I*~&&XHQH;=cnJgczZ()8T<-BXvIZcm7CV7S3} zkKu#rfi>%H6t52A>|k@SVYrzX?EJB$@M*eoG->Z(LVrPVX`EWRD45bDP46hOx7_4S6Fo+k-*%fF5lweEpc6VX;4}uH!E}sk(;VkfoEM{Qf z76xHPhFNnYfP(BLp1!W^FPXXdOohxe>YL94#g2NqIEGl9UOIWL;2{TrR(ppF3|zA! zT2*6JKC$^S3%<~ZN!y@3Sx-oGw{Aj)0&jv|L5jlU`Rd=x?(f}hzd>MiyyNpboE?oP z+O-yhT&l~n;+RIH4{B+78dGPZt8NP6 zy=GIPbFVcRwg!$7Cg0i_g5sc2GSKA-F7nA)u6kQVK!{2q9><+weROwryiD7`Q@+M;!pp&(D9AQleBUO$sA~ zK-08|JW)sf44WBUGzZD5U@ZH#axf z+uH*GtgWq~-EMbIPEKALhVd}If~Zs~->quFd; z9~>OKXfzrxIp-Y!Y61WNAp|m+3|m=Q`KnkferenGhlCIohM`-p*K4&}?Knx2zZqlq z|1?|U7ytlDDI`e(LI@><%mSE_QVyk*K4UD@G)=y}($`79pVdJ>{l@?R002ovPDHLk FV1g+>bY=hm diff --git a/src/gui/images/presence_online.png b/src/gui/images/presence_online.png index f42ff86546e9290e60203847bde155fc56ef0185..47173152e027cf60965cc1e5ffb5fe7903bc787a 100644 GIT binary patch literal 2396 zcmb_dYfuzN5T3ogyS*34<4~Xw4miC9(cpmr%z=O`a2S<6j3Pf0K}EDo!b^>h7(8Ba z%ZLg-V+b6mhz3PbB8gEWB49*Oh&+-K1Q95)1O$|XTzVly%Su%sX102^XL{%B{(5?5 zw+Al>Fc4Xa5JCp(KtBz$Z$xvEfX^rRJOM!vLZLt;ks3(EVu^)`=>+LyOB?ISmR43W`3!~3&dJ`&iga^u za-Qkx>T09#@N`$IX1KU2SrAMp6iUPra{~i&rLC2%a@=vGky4`bU0xbBUNtO zoh`8UExcl;seUSViHOw-MH45PTUbt+svsR4U1z=R=I$|jt{>$e5U36cS@hoGC80~h zmakYDxhiV)nz;CN>oUM;;=cD=l!^3L6w+Mn;$)i*RhXlZ@e_Ncw1v%9DFSzrIa^B03GFP7(M8)5bu zFJs`v;c{^;(&%*IAc`=6NoP3$GF1|-2T*gV`A%|Qc$q%Og|lGI(Y@JeDBGT$kMAx}8n(lOJr zYKkf8;3ynEj-V>8sMzO6f3*4A8r)()a5a#~UhZhCG$4%CTg~f<$EysXL2w z3~5eNQmlVSO8Y1*DCv?G#qAwB#$m@zfX!{6UQLyZg5`Evst7VOR&fS^fwcJJ5O$g37gw5+sd@mV zeBsgYL^c|EJtTHvf$9k$99P9X34^3s^h}3saNmeg(%|t5;Q?u^wyx;!lG5*{w*uS` z(LEf<;dn*jNa`;3HhSHI)X#N!6QCdfYH9SU1)z{O0{XuqGK_^}XM5&!HITZz#5bU3 zxB!5TdB#0i1G|PlfIce+>h;vus%3C4*t0Pf!9}oSOFxrAQ)|@&W>Q*X-^`G@BK#Z3 zSla~IXr+wh-3qli7LjWhof!vD|?-6mP=`Bsl0}!B7@bh;?iaN`)P`w1{BHJo6$rZtV1^%+c4w%{>b)Z0;(b z`9260rip(K=fN0@(**cp^%YK^!9cb=P%|H)O;h3borKUJOeM4#V%&puffkEO$mFgkE)971AKRxotvusKW;@#^^$(SeH%m6L>cb1F=g ztNnZyx!*XF?rEs?HcFmTc>2icJ1Ot%sw*i@Xh^CO2Zx5#?+$&;Ynm8b-DR<_>`;=p z&Z)#?%IWW8*SB?T?!~7SzA%%RRC#j+ruhk)d7WyltQqBA?z@%hv1@fjoM3IhwGBJRDA}(AgRH0iH)Qv?qMJq@Iv07>BgJ5ctDwd|xHc1o0lp5M5W;%J; zOeeWBbMM^$aWPfY56L-<0)IpBfnjr zo;`l(z00R=+^&da1sL2zM36klG}MO3t`EOB7_8pZ@;?Iimdp&ld-g!zrpHnnw{Tx) zqYM#&-wnJ4wwA7LA8dW@c(+P6gVG=hB!IvLT?Jic@u&BTuYGvF|J>|`vr$Vh0q}_} zk8sRtYwuRx41a#Xz||2pBtswpUd5$cTBSANl1@k3j_h6k^yL9(=W<0YDgbZE*yWe# z3)y*ab1ckH@x`}ipgIBdN#^Dz`RwGc;7?NZrpb2HvioG|jLA8Jc*9hsGIFz~6jTzzX&?eqvtWjyuBmEGV+Zk!ea6rb zw&9y0Ab$qfK)4aYYVy1qy4Sm8!=b1#n{2`A&RzX&=nb!}$4oVG{^71jS`I zc?!C_8WWCA$H&TU=nq7Mo(Hm4{`1(El0$M|BM1AD(XD5fj9!Wyi$$bhhzR#@$+BKGcw$?<=kW8ZAN6iu--Dy^t58=EO#+s|m0WE0?W0Yf zoXdp=l8&AS~Odt^ii=l}o!07*qoM6N<$ Ef>_y!x&QzG diff --git a/src/gui/images/presence_talking.png b/src/gui/images/presence_talking.png new file mode 100644 index 0000000000000000000000000000000000000000..935adfe8be05912bcead2353ec99c842acae3918 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;x#X;^) zj5kl})B`yR$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG z?e47A7)m*)&`g=oj z!0M}YcFfERid7lrtyp%SoY5lAf%N8YML>y3Xzrf2<_0mz;YUA@L7S9LL9DlkMRL_K(?4IQHvhl29qWgq5 omzaw-9phE?TlPVJ{!4>-dV94*u149s2fCQS)78&qol`;+09oC7T>t<8 literal 0 HcmV?d00001 diff --git a/src/presence/pidf_body.cpp b/src/presence/pidf_body.cpp index 251fdb6b..27fab82a 100644 --- a/src/presence/pidf_body.cpp +++ b/src/presence/pidf_body.cpp @@ -26,6 +26,7 @@ #define PIDF_XML_VERSION "1.0" #define PIDF_NAMESPACE "urn:ietf:params:xml:ns:pidf" +#define SWYX_NAMESPACE "http://sip.lanphone.de/presence/" #define IS_PIDF_TAG(node, tag) IS_XML_TAG(node, tag, PIDF_NAMESPACE) @@ -56,6 +57,7 @@ bool t_pidf_xml_body::extract_status(void) { pres_entity.clear(); tuple_id.clear(); basic_status.clear(); + user_status.clear(); // Get presence entity xmlChar *prop_entity = xmlGetProp(root_element, BAD_CAST "entity"); @@ -114,14 +116,32 @@ void t_pidf_xml_body::process_pidf_status(xmlNode *status) { xmlNode *child = status->children; for (xmlNode *cur_node = child; cur_node; cur_node = cur_node->next) { + // Process user status + if (IS_XML_TAG(cur_node, "userstatus", SWYX_NAMESPACE)) { + process_pidf_userstatus(cur_node); + } + // Process status if (IS_PIDF_TAG(cur_node, "basic")) { process_pidf_basic(cur_node); - break; } } } +void t_pidf_xml_body::process_pidf_userstatus(xmlNode *userstatus) +{ + assert(userstatus); + + xmlNode *child = userstatus->children; + if (child && child->type == XML_TEXT_NODE) { + user_status = tolower((char *)child->content); + } else { + log_file->write_report(" element has no content.", + "t_pidf_xml_body::process_pidf_userstatus", + LOG_NORMAL, LOG_WARNING); + } +} + void t_pidf_xml_body::process_pidf_basic(xmlNode *basic) { assert(basic); @@ -188,6 +208,10 @@ string t_pidf_xml_body::get_tuple_id(void) const { return tuple_id; } +string t_pidf_xml_body::get_user_status(void) const { + return user_status; +} + string t_pidf_xml_body::get_basic_status(void) const { return basic_status; } @@ -202,6 +226,11 @@ void t_pidf_xml_body::set_tuple_id(const string &_tuple_id) { tuple_id = _tuple_id; } +void t_pidf_xml_body::set_user_status(const string &_user_status) { + clear_xml_doc(); + user_status = _user_status; +} + void t_pidf_xml_body::set_basic_status(const string &_basic_status) { clear_xml_doc(); basic_status = _basic_status; diff --git a/src/presence/pidf_body.h b/src/presence/pidf_body.h index 8d67dcdb..712f3d7d 100644 --- a/src/presence/pidf_body.h +++ b/src/presence/pidf_body.h @@ -29,13 +29,20 @@ #define PIDF_STATUS_BASIC_OPEN "open" #define PIDF_STATUS_BASIC_CLOSED "closed" +#define PIDF_STATUS_USER_ONLINE "logged on" +#define PIDF_STATUS_USER_OFFLINE "logged off" +#define PIDF_STATUS_USER_TALKING "active" +#define PIDF_STATUS_USER_AFK "away" +#define PIDF_STATUS_USER_BUSY "donotdisturb" +#define PIDF_STATUS_USER_UNKNOWN "UNKNOWN" /** RFC 3863 pidf+xml body */ class t_pidf_xml_body : public t_sip_body_xml { private: - string pres_entity; /**< Presence entity */ - string tuple_id; /**< Id of tuple containing the basic status. */ + string pres_entity; /**< Presence entity */ + string tuple_id; /**< Id of tuple containing the basic status. */ string basic_status; /**< Value of basic-tag */ + string user_status; /**< Vaue if ippbx:userstatus-tag */ /** * Extract the status information from a PIDF document. @@ -63,6 +70,12 @@ class t_pidf_xml_body : public t_sip_body_xml { */ void process_pidf_basic(xmlNode *basic); + /** + * Process userstatus element. + * @param userstatus [in] userstatus element. + */ + void process_pidf_userstatus(xmlNode *userstatus); + protected: /** * Create a pidf document from the values stored in the attributes. @@ -81,6 +94,7 @@ class t_pidf_xml_body : public t_sip_body_xml { //@{ string get_pres_entity(void) const; string get_tuple_id(void) const; + string get_user_status(void) const; string get_basic_status(void) const; //@} @@ -88,7 +102,8 @@ class t_pidf_xml_body : public t_sip_body_xml { //@{ void set_pres_entity(const string &_pres_entity); void set_tuple_id(const string &_tuple_id); - void set_basic_status(const string &_basic_status);; + void set_user_status(const string &_user_status); + void set_basic_status(const string &_basic_status); //@} /** diff --git a/src/presence/presence_state.cpp b/src/presence/presence_state.cpp index b93c5648..81d95681 100644 --- a/src/presence/presence_state.cpp +++ b/src/presence/presence_state.cpp @@ -39,6 +39,23 @@ string t_presence_state::basic_state2str(t_presence_state::t_basic_state state) } } +string t_presence_state::user_state2str(t_presence_state::t_user_state state) { + switch (state) { + case ST_USER_BUSY: + return "busy"; + case ST_USER_AFK: + return "afk"; + case ST_USER_OFFLINE: + return "offline"; + case ST_USER_ONLINE: + return "online"; + case ST_USER_TALKING: + return "talking"; + default: + return "UNKNOWN"; + } +} + string t_presence_state::basic_state2pidf_str(t_presence_state::t_basic_state state) { if (state == ST_BASIC_OPEN) { return PIDF_STATUS_BASIC_OPEN; @@ -48,13 +65,52 @@ string t_presence_state::basic_state2pidf_str(t_presence_state::t_basic_state st return PIDF_STATUS_BASIC_CLOSED; } +string t_presence_state::user_state2pidf_str(t_presence_state::t_user_state state) { + switch (state) { + case ST_USER_OFFLINE: + return PIDF_STATUS_USER_OFFLINE; + case ST_USER_ONLINE: + return PIDF_STATUS_USER_ONLINE; + case ST_USER_TALKING: + return PIDF_STATUS_USER_TALKING; + case ST_USER_AFK: + return PIDF_STATUS_USER_AFK; + case ST_USER_BUSY: + return PIDF_STATUS_USER_BUSY; + default: + // Convert all other states to "closed". + return PIDF_STATUS_BASIC_CLOSED; + } +} + +t_presence_state::t_user_state t_presence_state::pidf_str2user_state(string user_state) { + if (user_state == PIDF_STATUS_USER_OFFLINE) { + return ST_USER_OFFLINE; + } + else if (user_state == PIDF_STATUS_USER_ONLINE) { + return ST_USER_ONLINE; + } + else if (user_state == PIDF_STATUS_USER_TALKING) { + return ST_USER_TALKING; + } + else if (user_state == PIDF_STATUS_USER_AFK) { + return ST_USER_AFK; + } + else if (user_state == PIDF_STATUS_USER_BUSY) { + return ST_USER_BUSY; + } else { + return ST_USER_UNKNOWN; + } +} + t_presence_state::t_presence_state() { assert(false); } t_presence_state::t_presence_state(t_buddy *_buddy) : buddy(_buddy), - basic_state(ST_BASIC_UNKNOWN) + basic_state(ST_BASIC_UNKNOWN), + user_state(ST_USER_UNKNOWN) { } @@ -66,6 +122,14 @@ t_presence_state::t_basic_state t_presence_state::get_basic_state(void) const { return result; } +t_presence_state::t_user_state t_presence_state::get_user_state(void) const { + t_user_state result; + mtx_state.lock(); + result = user_state; + mtx_state.unlock(); + return result; +} + string t_presence_state::get_failure_msg(void) const { string result; mtx_state.lock(); @@ -74,6 +138,25 @@ string t_presence_state::get_failure_msg(void) const { return result; } +void t_presence_state::set_user_state(t_presence_state::t_user_state state) +{ + mtx_state.lock(); + user_state = state; + + log_file->write_header("t_presence_state::set_user_state", LOG_NORMAL, LOG_DEBUG); + log_file->write_raw("Presence state changed to: "); + log_file->write_raw(user_state2str(user_state)); + log_file->write_endl(); + log_file->write_raw(buddy->get_sip_address()); + log_file->write_endl(); + log_file->write_footer(); + + mtx_state.unlock(); + + // Notify the stat change to all observers of the buddy. + buddy->notify(); +} + void t_presence_state::set_basic_state(t_presence_state::t_basic_state state) { mtx_state.lock(); basic_state = state; diff --git a/src/presence/presence_state.h b/src/presence/presence_state.h index 47de4a4c..da99d4e6 100644 --- a/src/presence/presence_state.h +++ b/src/presence/presence_state.h @@ -42,6 +42,15 @@ class t_presence_state { ST_BASIC_FAILED, /**< Failed to determine basic state. */ ST_BASIC_REJECTED,/**< Subscription has been rejected. */ }; + + enum t_user_state { + ST_USER_UNKNOWN, /**< Presence state is unknown. */ + ST_USER_ONLINE, /**< Online and free. */ + ST_USER_OFFLINE, /**< Offline. */ + ST_USER_TALKING, /**< On the phone (active). */ + ST_USER_AFK, /**< Away (but available). */ + ST_USER_BUSY, /**< Busy (unavailable). */ + }; /** * Convert a basic state to a string representation for internal usage. @@ -49,6 +58,7 @@ class t_presence_state { * @return String representation of the basic state. */ static string basic_state2str(t_basic_state state); + static string user_state2str(t_user_state state); /** * Convert a basic state to a PIDF string representation. @@ -56,6 +66,8 @@ class t_presence_state { * @return PIDF representation of the basic state. */ static string basic_state2pidf_str(t_basic_state state); + static string user_state2pidf_str(t_user_state state); + t_user_state pidf_str2user_state(string user_state); private: /** Mutex for concurrent access to the presence state. */ @@ -66,6 +78,7 @@ class t_presence_state { /** Basic presence state. */ t_basic_state basic_state; + t_user_state user_state; /** Detailed failure message */ string failure_msg; @@ -79,12 +92,14 @@ class t_presence_state { /** @name Getters */ //@{ + t_user_state get_user_state(void) const; t_basic_state get_basic_state(void) const; string get_failure_msg(void) const; //@} /** @name Setters */ //@{ + void set_user_state(t_user_state state); void set_basic_state(t_basic_state state); void set_failure_msg(const string &msg); //@} diff --git a/src/presence/presence_subscription.cpp b/src/presence/presence_subscription.cpp index cd24dc3e..5f4f1d62 100644 --- a/src/presence/presence_subscription.cpp +++ b/src/presence/presence_subscription.cpp @@ -52,6 +52,9 @@ bool t_presence_subscription::recv_notify(t_request *r, t_tuid tuid, t_tid tid) { t_pidf_xml_body *body = dynamic_cast(r->body); assert(body); + + string user = body->get_user_status(); + presence_state->set_user_state(presence_state->pidf_str2user_state(user)); string basic = body->get_basic_status(); if (basic == PIDF_STATUS_BASIC_OPEN) { From 08a40a13efc831b3d6511cd8934a809870e0448c Mon Sep 17 00:00:00 2001 From: Simon Jutzi Date: Thu, 3 Apr 2025 18:54:20 +0200 Subject: [PATCH 2/3] fix: revert to existing icons --- src/gui/images/presence_offline.png | Bin 385 -> 849 bytes src/gui/images/presence_online.png | Bin 2396 -> 848 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/gui/images/presence_offline.png b/src/gui/images/presence_offline.png index 2f3f6ef076c691149ba345ba6bb6e1217452aa81..28a3738692c6e6d46990644a22d82e6189d7c6b7 100644 GIT binary patch delta 827 zcmV-B1H}A+1JMSMBYy)JNkll~n;+RIH4{B+78dGPZt8NP6 zy=GIPbFVcRwg!$7Cg0i_g5sc2GSKA-F7nA)u6kQVK!{2q9><+weROwryiD7`Q@+M;!pp&(D9AQleBUO$sA~ zK-08|JW)sf44WBUGzZD5U@ZH#axf z+uH*GtgWq~-EMbIPEKALhVd}If~Zs~->quFd; z9~>OKXfzrxIp-Y!Y61WNAp|m+3|m=Q`KnkferenGhlCIohM`-p*K4&}?Knx2zZqlq z|1?|U7ytlDDI`e(LI@><%mSE_QVyk*K4UD@G)=y}($`79pVdJ>{l@?R002ovPDHLk FV1g+>bY=hm delta 359 zcmcb}*2p|Txt@U~-O<;Pfnj4m_n$;o1_lPk;vjb?#+xT~>VX`EWRD45bDP46hOx7_4S6Fo+k-*%fF5lweEpc6VX;4}uH!E}sk(;VkfoEM{Qf z76xHPhFNnYfP(BLp1!W^FPXXdOohxe>YL94#g2NqIEGl9UOIWL;2{TrR(ppF3|zA! zT2*6JKC$^S3%<~ZN!y@3Sx-oGw{Aj)0&jv|L5jlU`Rd=x?(f}hzd>MiyyNpboE?oP z+O-yhT&JRDA}(AgRH0iH)Qv?qMJq@Iv07>BgJ5ctDwd|xHc1o0lp5M5W;%J; zOeeWBbMM^$aWPfY56L-<0)IpBfnjr zo;`l(z00R=+^&da1sL2zM36klG}MO3t`EOB7_8pZ@;?Iimdp&ld-g!zrpHnnw{Tx) zqYM#&-wnJ4wwA7LA8dW@c(+P6gVG=hB!IvLT?Jic@u&BTuYGvF|J>|`vr$Vh0q}_} zk8sRtYwuRx41a#Xz||2pBtswpUd5$cTBSANl1@k3j_h6k^yL9(=W<0YDgbZE*yWe# z3)y*ab1ckH@x`}ipgIBdN#^Dz`RwGc;7?NZrpb2HvioG|jLA8Jc*9hsGIFz~6jTzzX&?eqvtWjyuBmEGV+Zk!ea6rb zw&9y0Ab$qfK)4aYYVy1qy4Sm8!=b1#n{2`A&RzX&=nb!}$4oVG{^71jS`I zc?!C_8WWCA$H&TU=nq7Mo(Hm4{`1(El0$M|BM1AD(XD5fj9!Wyi$$bhhzR#@$+BKGcw$?<=kW8ZAN6iu--Dy^t58=EO#+s|m0WE0?W0Yf zoXdp=l8&AS~Odt^ii=l}o!07*qoM6N<$ Ef>_y!x&QzG literal 2396 zcmb_dYfuzN5T3ogyS*34<4~Xw4miC9(cpmr%z=O`a2S<6j3Pf0K}EDo!b^>h7(8Ba z%ZLg-V+b6mhz3PbB8gEWB49*Oh&+-K1Q95)1O$|XTzVly%Su%sX102^XL{%B{(5?5 zw+Al>Fc4Xa5JCp(KtBz$Z$xvEfX^rRJOM!vLZLt;ks3(EVu^)`=>+LyOB?ISmR43W`3!~3&dJ`&iga^u za-Qkx>T09#@N`$IX1KU2SrAMp6iUPra{~i&rLC2%a@=vGky4`bU0xbBUNtO zoh`8UExcl;seUSViHOw-MH45PTUbt+svsR4U1z=R=I$|jt{>$e5U36cS@hoGC80~h zmakYDxhiV)nz;CN>oUM;;=cD=l!^3L6w+Mn;$)i*RhXlZ@e_Ncw1v%9DFSzrIa^B03GFP7(M8)5bu zFJs`v;c{^;(&%*IAc`=6NoP3$GF1|-2T*gV`A%|Qc$q%Og|lGI(Y@JeDBGT$kMAx}8n(lOJr zYKkf8;3ynEj-V>8sMzO6f3*4A8r)()a5a#~UhZhCG$4%CTg~f<$EysXL2w z3~5eNQmlVSO8Y1*DCv?G#qAwB#$m@zfX!{6UQLyZg5`Evst7VOR&fS^fwcJJ5O$g37gw5+sd@mV zeBsgYL^c|EJtTHvf$9k$99P9X34^3s^h}3saNmeg(%|t5;Q?u^wyx;!lG5*{w*uS` z(LEf<;dn*jNa`;3HhSHI)X#N!6QCdfYH9SU1)z{O0{XuqGK_^}XM5&!HITZz#5bU3 zxB!5TdB#0i1G|PlfIce+>h;vus%3C4*t0Pf!9}oSOFxrAQ)|@&W>Q*X-^`G@BK#Z3 zSla~IXr+wh-3qli7LjWhof!vD|?-6mP=`Bsl0}!B7@bh;?iaN`)P`w1{BHJo6$rZtV1^%+c4w%{>b)Z0;(b z`9260rip(K=fN0@(**cp^%YK^!9cb=P%|H)O;h3borKUJOeM4#V%&puffkEO$mFgkE)971AKRxotvusKW;@#^^$(SeH%m6L>cb1F=g ztNnZyx!*XF?rEs?HcFmTc>2icJ1Ot%sw*i@Xh^CO2Zx5#?+$&;Ynm8b-DR<_>`;=p z&Z)#?%IWW8*SB?T?!~7SzA%%RRC#j+ruhk)d7WyltQqBA?z@%hv1@fjoM3IhwGB Date: Wed, 25 Jun 2025 14:38:57 +0200 Subject: [PATCH 3/3] feat: improve icons --- src/gui/images/answer-disabled.png | Bin 370 -> 648 bytes src/gui/images/answer.png | Bin 381 -> 881 bytes src/gui/images/bye-disabled.png | Bin 389 -> 614 bytes src/gui/images/bye.png | Bin 423 -> 662 bytes src/gui/images/dtmf-disabled.png | Bin 374 -> 555 bytes src/gui/images/dtmf.png | Bin 354 -> 621 bytes src/gui/images/hold-disabled.png | Bin 329 -> 381 bytes src/gui/images/hold.png | Bin 488 -> 345 bytes src/gui/images/invite-disabled.png | Bin 318 -> 658 bytes src/gui/images/invite.png | Bin 338 -> 816 bytes src/gui/images/missed-disabled.png | Bin 411 -> 581 bytes src/gui/images/mute-disabled.png | Bin 399 -> 565 bytes src/gui/images/mute.png | Bin 343 -> 594 bytes src/gui/images/presence_offline.png | Bin 849 -> 385 bytes src/gui/images/presence_online.png | Bin 848 -> 2396 bytes src/gui/images/redial-disabled.png | Bin 385 -> 627 bytes src/gui/images/redial.png | Bin 425 -> 664 bytes src/gui/images/redirect-disabled.png | Bin 326 -> 564 bytes src/gui/images/redirect.png | Bin 387 -> 583 bytes src/gui/images/reject-disabled.png | Bin 361 -> 631 bytes src/gui/images/reject.png | Bin 392 -> 622 bytes src/gui/images/transfer-disabled.png | Bin 333 -> 481 bytes src/gui/images/transfer.png | Bin 424 -> 431 bytes 23 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/gui/images/answer-disabled.png b/src/gui/images/answer-disabled.png index de1dafd782727b0a435794cf2baed1b548a43ba5..2c280a8761fa3c8cf758703b7fa6c7132219be7c 100644 GIT binary patch delta 597 zcmV-b0;>J;0*D2WBt`^hK}|sb0I`n?{9y$E0004VQb$4o*~u(_0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmwkuM&9=>{1K7&aa{?|uLP0p3YO zK~yNuZIWF`lVKFcf6pd?qcY0MKG43DE-Z-(gD}Q3F_H`=Dll=`be6BJi-LmQi!R0<9<7oMBL;r#gj&*2;=i-h%6 z9+W9Hm8nI4c2nBfQfvFE(Vk=;pQRgWCWM9iobR>XoNXS7VuR5Z4N{K@G)} zHGWF#46WfbULq_f#$oEsxI)5I(+k4-%?e^X;G%H9eSV)L zo&D?)kM%0Pu}S&l2bzSX0SNJz%gu9Xsev}VpD{6iqGObEgyI~Y;RaSV*Jj*q`6(0U z^b`^LI3XVDQ#lOc2BwE?B;lt#*9VE0>?O*9r%}1fVcsDMv?uZd1W2?{Bm4mZFi*ai z!%+x0fb+modJKYI>c#PR%D{jkCUgn&C3(yUkjO!rSP<>nOSQR>b)GtASdAe7EEf}m zso+X~c(RCnEz5&F1@Z!rBntv!OGiWi|A&vvzmaMlf7Jm24l^1EY}ly)009F@L_t(|oQ;w# zPXj>|MbB;~YjGqsi>V?Rk}CX|3TkSLsYSCIfiIS%Y7I3NRiu!H{slx6k_`pVe$@bUcml=^4LhZDTF44nS@qPD4b?*ao{YyVS6p+%jCUS@ zN8pCEyeIE<%Z69pe%((w;iB@)fRj_9C(n?DoXS5@A^U<4-~gCaJ^qd#{M&0C7WG>Q P00000NkvXXu0mjfKLUw+ diff --git a/src/gui/images/answer.png b/src/gui/images/answer.png index 6ecffafb399e34c77d50e3d49fa5cbc6c51e4717..b0b12d3068e15e4cf8a94d438e7405f527bc0ad4 100644 GIT binary patch delta 859 zcmV-h1El=@0`UfrBYyw{XF*Lt006O%3;baP00001b5ch_0olnce*gdgAY({UO#lFT zCIA3{ga82g0001h=l}q9FaQARU;qF*m;eA5aGbhPJOBUy32;bRa{vGf6951U69E94 zoEQKA00(qQO+^Rk1{n(&Gj32D@c;k<$4Nv%R5;6plwWAoWq%mQKi~H~=h&9USdJiu zbEj=6+0EJ@sEZ^UT}04DgV6{icXqZ^BCE>uR8!6PG7$}VW zaa)CuIzdpk^LyW?i*t574o`jW-uHR(nvo$IPq` zIO&}opB}g6+JCqM=p6MUcr9kqUP*{QwB=}A51Kg|KHQK=y(UN}370xX+(2#IKbKcN zgm?_JF__&D+!ShEp5phlq^=MA%bU9SB1yvi)@L^tN~P8BS69Q4=3ZV{zQ`ni+H)+K z(JBW*x4fq>33jHT!M9!gJlwBZ%WG$dw%edb;%y>JCV$R2r;~GE*@OdHQ90S*=@9j* z&}6B^8*7lZA;uE3=J_J;d8d6CzogRsnUrV1j6>NGwKzHbApusQVIMi!!BP??*Fc$+ zPCFQA&+%(C`^`BWNRsgF%rX8Fd?U19*}M*690Wi_=h!iG)UNRuWrsN&B2O(GXJ31c z%fN0#kbiW-ZAhn!h*-8KVz7UxqYyX(3|883&Y*X`z!fv=cGtdKT@?Dd?8=;T?r=TO z!UT7LCV*(HK>2xFnQjoG zLGqgPm(2~#s$P|m2;Gw02D{@Pq%y0&-<>DPU|`rLkWA*W(Sj;=5s6R@g;13khT*EK zN+?9AMwtZP0T`gb_a0t*$Nl9h8#Cv9KRr+H9w$2+ytTq@?U9Xx5~p)iN~H|cHldE% z$+_i9nGfY`*IY!vi=fHLz&H%>^#x|+O10J%S&q?s*ZPzq7r^1;$GQDH@8;oI5CKc` zeOq1HTtLuS&grq0r9A^`W)on$16n6}>oxLM`vraOHqGqS`y>DW002ovPDHLkV1m~b BtX2R3 diff --git a/src/gui/images/bye-disabled.png b/src/gui/images/bye-disabled.png index 8d99eb1da5129c30668c5d5dd4dff28858d1d50d..d8b8c0c28dd032dcdbfa36534b42a493b1294f34 100644 GIT binary patch delta 562 zcmV-20?qw}1Lg#fBt`^hK}|sb0I`n?{9y$E0004VQb$4o*~u(_0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmwkuM&9=>{1KHZBHHegpsj0lY~> zK~yNuWzfw_(*Xd+@sFD(COC^qqY0HQUrIDXqzI!4?iyqvor5lQlOULvw(379%m`0L zj5<^ZSt$gThX#fc3X#yXk|0t8tzWhd3JN{X@%i%b@Dz{=JEuZ_&ky1@Gz?Nviv_6? zaVw7b=H5tuaCH-O6Q`oinh(bl4x6)Tk8L-mDs1?mqP@;o_An%d784d6>We}~28=c8 zv}~Yfu~0E+_uO&c$*2W=jS}WP8d)M7uUCSwAU6;TCS0;#wMdhMSr5vW>--Wjy}om< zSJs3(NS)MSRwfx-MnuS40ccJa(JL#R&}v2|8IV_hDx7|#uL`-=rj7#0GLE#RdS>Wn9cph1HyvT7AVGDr`I zsS!0Q2X~Qm+l0?V?(S=0inXS6nJ(p?saJ*0zG;7a6w)zP zIQ)iTa8_}d^GXd~nH(ji06Xkb>4j3#DiA?hS7RgEX*Iy%|&7eR#h4KPV zbF&xMqEA)*PTRQ&E26-EN`)NJV7I&(uX?`l4?pvj)M*@44*&oF07*qoM6N<$f=I*Z AWdHyG delta 336 zcmV-W0k8h%1cd{TBntv!OGiWi|A&vvzmaMlf7Jm24lE~~UYaHV009;krAjlF`h;tec<7YMn)Hhzt@g$NdsGK(-4 zn_Z1ozG{m93~$~{vZbT=t{17Rifv%}vm-jN_(rD6t*KLpMI!x09&iFOE-lh#(%=U& zfACug&SK_K?NDQaUDnOdcm-L;Ov#5wltFp5tV8dPdeo{$X@2KE%AsEjq6 z-UbI7^X%i(N}&fj&2S;(6|6c>RCZOeQUyw-8nrO_x(v%03J+ zb^%UhJnPTWMmgMAZ(M<6m))61v5ts!I;`6pHR5;6x)ICVnQGXQ2@z4FI6biLu2uVso z88tNY3G7|qdB$^o_j`Zmp2H0gE36eg#vbes6Gp8vVx1a{C$Zi}+YR6o%JDQ-C|NZm z7!uq~(1R8`tbaikyF|DD3#oSyLzonuN^m@1>$1&#jG;Mhwr>R|t)f9pqBi7=Cs-CA+@B&SXA%BpBte?1;%I(C>l#|{(63ftd9hwKz`!a>bMf ztJ(5o;b=^WnnX3CE>jxtJZ9!wj@3G2wO_H?x#e1`6urV$beM7i4Jqv-{4wL1S$!zM zr7+@p0e2J|Y%%8zHla1-+>03}aR_QmP6JmoZQC3uj!y)Hw!DYq) z4CW6k3kxGcV$PgsTF{t=Kp6HKnfx@hg11)**9A2V34Eq3o Y0aBi$Dgvv1DF6Tf07*qoM6N<$f}oTEtN;K2 delta 398 zcmV;90dfA81*Zd$BYy#INkl z0Gts?;xvxE{D0*z+ku%2RCAAP(k^Q*XTQEjT&~w)(MOd*!LlZ*nZdmW5OneHx6*eD zpvR7`AYDJ=^S%3D-(>Mb5D`$-h{#baKm11&A0h&gv$jt~qB$aZXO}k6nK)WXLhjad sJxUg@-^?~M#oafvXU}%$(SPg*b{+h3;nsWW00000Ne4wvM6N<$f)5<9k^lez diff --git a/src/gui/images/dtmf-disabled.png b/src/gui/images/dtmf-disabled.png index c4a7a94ce9f9d84755f9cb13780fe4d5f1ed5782..803ba9b50e8a039d629de477975b9d96b0e84dde 100644 GIT binary patch delta 537 zcmV+!0_Oep0;>dSiBL{Q4GJ0x0000DNk~Le0000I0000I2m}BC0Q|>B+yDRo1ZP1_ zK>z@;j|==^1poj50drDELIK&yEPnt103c&XQcVB=dL{q>fP?@5`Tzg`fam}Kbua(` z>RI+y?e7jT@qQ9O|^9)IZu84MgSmU@}W0004jNklIBJ0~sy2@<>wiGkE zd0+vnUu-dJNn(xkw7HGGLP|-)F;8lng>fa<)l`3Xd~RM>GJ4P;78kzVGdW~GzFsTb zF}2q)it%F_=LGa;?|+_P)BzMn3d5$x97Z&qw0xrlyFF_eq%mV37HQ*^6|5va@j?l! zgsUd?+cAvR^{Obz%UN=9+jzxbhc5gmG#JY0M&)^}?o3KAs>&xf7eyb|G$@Lq|VM*7B!1;xqQnR00000NkvXXu0mjfK|SL$ delta 355 zcmV-p0i6D;1oi?iiBL{Q4GJ0x0000DNk~Le0000M0000I2m}BC0QD^9rT_o{0%A)? zL;(MXkIcW3Y94>p0Ra^UHj(WMEC2uj2T4RhRCt_~(yLBGQ4j^tb=yn8)ifyv1O``G ziD-l36EM|S{s2|OXYdP{23$=Y4}$$UZF~9%kA1|~yfkQdaRy4(etp6xh7Csyd89m9Wkicy?LKSV@-R@)KMQ<=*S zu!m7n7f~smFva6iT}0L{$vM7Uqp5*D?s1bC%~NI7;jFJ2II*d_yp2>d@uq>6mP?!^ zTS*K~Z`?A*7(94Q4X)a#CH=nb)L`f&77L6ujBR>Xb-Lc*XE{tj!_dIur)Qz~ZsoRL zN`rJ)(vd3_Q7eK(UGBq%u604m=DGYmqS=4K{|!M2U`I<~5V-&V002ovPDHLkV1o4> BmfHXT diff --git a/src/gui/images/dtmf.png b/src/gui/images/dtmf.png index 92df50f025ce256fd069b25b854c0239f1d79d65..f537779bbadb51851d481743d985dcce15104a62 100644 GIT binary patch literal 621 zcmV-z0+RiSP)5WEQFvXG*O9^YN|ptf?KM+W-Q+8y=6^eR+DFD&Ybhi9R9Zvz`=Ysv)3|u*AN=fr+@WG6XgBM2sF%-Gzq~v{=^^pV~|59eS43 z(YvHwx|%Igi+6;Wg_zBITy9#7FH8Q>@RAmJSn`^C{>$+brNWw8%qV&;00000NkvXX Hu0mjff0zs) literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g!!3-obe&3S^QsDtUA+G=b|F3UgICO|%^=gKK zf`Whl7~Z~RVo+?oe3{|hJBHuC8Gil*iZHx<$?*L>-`NQz^DZ~GF#{d5t z&zxxtGzn>t+^^K*%(o;D1xuN^^A@~{n0t7q{JxKGOQ*lmJZ)FQ rw&Gth@BU4(U8Y}FHOumeS)X7pdnoj>)-O5<=pF`7S3j3^P6004R> z004l5008;`004mK004C`008P>0026e000+ooVrmwkuM&9=>{1L5HGjK+cN+F0MkiC zK~yNub;b#e<4jdu}pvqB@D7b(_dW^fLIh(HBOYq?q|CWq30I?IPr_2<A zaOjgVO%-x>Z~#5{v~%zw>)b;39rV=m@ubtO#;a#9-OW-x3LYDccYEJ$Caf$+&|qQO zE~J-eW^O*JI>@vT9KHFOe&%B~L`R3@6a-dXj+mUT>|Ls}T$^#GLh6*XnP#fH^E#wO Z_yzMTHJ!)0@E!mF002ovPDHLkV1mAshCcuR delta 275 zcmV+u0qp+$0?7i9Bntv!OGiWi|A&vvzmaMlf7Jm24m2_Ak+&`Y007!aL_t(|oSo1y zN&`_4#_``5ET7qAmcPat>;I~xnJmaS6=L1Kc6$uk*?#IP$d zM8EFMd^6ww4NG($?RQ$%KK)T$x#3sa+QzkP|5Ad>*z>5X@6Cs?SI=%6KiuRb4qUr8 zeQ8ZsQKyCpjvVUg8|dkJ5~u>|G&g0R# zrf4!{r7b(MB9c2-#R^h&xrx$mXg0apv8~iwD__-4@s47F8pmvq1iX Zz5w-YOOLU3BZ~k4002ovPDHLkV1io!ehL5p diff --git a/src/gui/images/hold.png b/src/gui/images/hold.png index 6cd6db7c69a95b5b814b13566956f3faca6c51c7..eb32e0ace864f1b6cfe45eeb6a7bed4316090801 100644 GIT binary patch delta 319 zcmV-F0l@y~1K9$QBYyw{XF*Lt006O%3;baP00001b5ch_0olnce*gdgAY({UO#lFT zCIA3{ga82g0001h=l}q9FaQARU;qF*m;eA5aGbhPJOBUy32;bRa{vGf6951U69E94 zoEQKA00(qQO+^Rk1{n+xGo!|bd;kCduSrBfR5;7MlTi|aFn?0m5Nf z5{m>$5cm$%B=Sd~LmBOqC+}lpr6_MxfW?IsX}_O5o3@JnURc53VTnlJB7bc~|5Q_?=)CF*6`cp_ zQdr>6)K-?}WPE&-&CMG1tv%c$pD;Y86~)Bb@GET5IP_Tkw0@>vmWVL>bVeRMyvv)n z?^)aUfu!cls?BDEyHlrH+wCFi+N1mT?r?kRCXI&6k?Z680sH%h)VF@Jy?1~}2tZ|I zI5)OUniD13kbk5pIyPvd@w@=v4+w%LQLM?blr+r%7@M5Pi&sX5rCQsyE^PLz*YCR8 z%Zco=!{Fc*1c)PZx*woQCCZM2ZJ$IxbhT!e9R>y*hK8N%0l(RN~Na-zrJPF&ip{RZkFar6$V>n#8P002ovPDHLk FV1kon?DPNt diff --git a/src/gui/images/invite-disabled.png b/src/gui/images/invite-disabled.png index 6197d2f0d4d4bd21972b838f74d244c311120a2d..9863039d712fe8e8643a37f72a999c730ba1ef29 100644 GIT binary patch delta 607 zcmV-l0-*iA0+I!gBt`^hK}|sb0I`n?{9y$E0004VQb$4o*~u(_0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmwkuM&9=>{1KG6x`!BWwTw0q99Y zK~yNub&*dc8I-m zjQ^ZKxKj&%*c$V1^xEgSe?{G9kh`G ze+HMpyroHdT~>4K7erDkPcPm8I8B{<jI$&Z3ZgR+>r$0h;lB>*OtdsnX+puxvt=dK*&kTaDZxTehYBN z>Ri&67Q6I#TXu?GMo|#Wa0x&kh&chI;>WFXTh9-_$`+*xVCMiYf$H2aK=*>4Nb-&7 z+P6S|11($f<5U|E`P>0}?ec)c!N--HWfZWQ?Do0I7VRB&+C46Qi$|T&2S2FY5wo=b zq?zUTY-W;EfSX-7jKk6@_cFQgL`i2V;Y2%+jAAfNs|<3$KeGlhL0?nhnc-NSJH;V? tx}+;!n%MWFPh4ZDa z7Fc*wr*QBB4?}H%i$ipxYE}xD(U}g`@mpGqRd4KSZSuhx>{X9;ZqP4*Uo@o21svJ{ O0000t( diff --git a/src/gui/images/invite.png b/src/gui/images/invite.png index 765f2537b571efddd7fc0953389152ab319d02b4..fa778b01a28a56243458d5898cd7cb487525730e 100644 GIT binary patch delta 794 zcmV+#1LgeE0b%9hDk(0R5;6(lTApJQGXPMpL0LQQ8N_NMJ4@# zwF<%(6|}HFi83f~6Sk^M$MI(jT!e%z#2}~{b<~uijTI4;m_|y`%0=!XXyYOp7ZItL zj+oB(eW!&pHVta@?(X?{xaZvW3USrk)pRSJy&`0F)XF&jDFaZ~sXiL;R)vikqfU#&n*{#aQ?tp}n3(K4IMMfq^Y?~P|h$vnKdtr|2 zgPk%gzMxL3QYZ!lrY(z7+u==SCOhv{$s)kTW}R4E;PF66ZY9IZ{92Tg$NT6{nhj8h ztRxh+I4&guBe58#0nP`sWqFygR0zOOmrTq~b09m1Hh&|APa-RnxSEX69J3h#Nb^t} zTViy*oeg)(l&eJ3fI)%%2q3t|a6DWmkwl?m^V#F!1n^|d<=1Gw7`(>op%1}LjORN1 zNG^OClpEd*N-i{NYbvCyUW;-I_!OPvrU3ZcwNIfE1!L$7*GpA$!x^8N{B6ume`8N} zE+b;dFn<2doZRY1@XmA`xhP!0u zFCVQsyIrrS@*sYUY~IAdJC!mO-$Sk^o!Wtrv~K8ZfbIr)2n@xKJE99bO?sJG$7SrF zUnHRnFPDJ`fUBIW4r*^Aw{;gEd_jHW3+mOiK!1`NsO!|jw!=GB694VBz!E}nnxVpR z>35ae_Zy{eLl8hsNXuR2dBX0xTHeA zz|ro2Ol}AQs1Ivt%;uTKZILv`R|}4H1?0<`%T85Ct&Cd2KFbgm;k&GiIBr2883OPd Y)Dw95zNv!LZvX%Q07*qoM6N<$f<)_IqW}N^ delta 312 zcmV-80muHZ2GRnMBYy!INkl9^4qiIrqQZjv-XTeBv$JmhLwo;88$f+8~+P(!7Y- z1v8U%c;7CV7csGQ@c7ccDcbpBOuhrdQ=&Y*v^Bx4{rMTW)_wrVq_5Uy%R+00(qQO+^Rk1{n+vFJp$}>;M1( zn@L1LR4C7F(mhDjaU93-*Z(}s^DHj12TAlCg2=^)EU4kMmNpAo8o~o1T5M@_C@`8T zXle8+4x^SEqBb9@r76dt2a%G*(>fpG694Bl`1dmKvwZpSeg8h+-@_-cgNDISZ5?cH z_D1!b1F16)g8tu%er2!Zf~|dH$bl#5{P45utxHPEt_ATss*%gpnqx~Q-_?mvD%KFM zB8b2(txA~l)j@#@Vu+BZZfetlqE?}!5*AbqZ$g`@dT7p~0sAu>R#Y_lp*}}^3mK@v z&(gt-gkze$*C_sY8|6%v=@@u z^%9p|kDOu90CoR!?__ZXlS$6 zKpP^1GCe%u6ikE>+|`3pXU)0LBCG5wX~9Oc%y2HLBM6P7Q1DW8ZH5!OUAf} ztsr^Cqdf>{qEey66wpKQ165}6SYnh9^T?XUa_H53N4nEZZ|&JiubX4w?L2kk>I&H?e zW{9YnvH*nS$|xlrqre6o9Kd3jsCkt8It@U#pmM+}W#)M2fkj)7@85q13(5JDr+YMb zp~M7>`LMZb|27MNuqufVEyDJ?rJn3qeY+*wb#;$_^$8yFXBkMjP#ypP002ovPDHLk FV1o7Itn~l@ diff --git a/src/gui/images/mute-disabled.png b/src/gui/images/mute-disabled.png index 3f35181240edc6283d863d42a37178fd7f6fd181..c09f88202cddba66c4274b5b5095a1e35c1a74ef 100644 GIT binary patch delta 551 zcmV+?0@(eJ1GNN@8Gi%-008{QM%(}Z00d`2O+f$vv5yP0Dy!50Qvv`0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L z01FWS01FWTe`H^g00007bV*G`2k8bG3=a^@`}mLm00E0hM1Mh4D9=^WPe{{o7{~F~ zZ>_Ycrx*yqM1l^U5)2{;B8XxL1<}PIf<(b?*>6BS=M)=hmc`5eqka1`%XP&L`=m zN)a&#HK=S*)-xx6ul^Lu)}RKh=$G}>g*WR7OSWyi1pT$L=#(2~yw%rjUP62mYTKK? zjIT}`Q?TMT>(_dE+Py%mzOrs7EI4DrjH*kZS9gn4q<`HP70d3K#t@j(?nA5H*aDrJ zzNwfrq1gZ!SJo@@cRj2@pIz}|zr3p^ZMW4&qh{SV&^3QoC*tt#fN2-K_e#N(&=I#} zx*nu3vH^K0(>h)h+vTib;>v+9h6?=h* zk|l&7Ap}`#iIex|_X>!$miB!Q%PZgKu#XTTqNZuWzG<2yGJk7r0{h|8ZQGVDL#)2< z%NlVh`KUhGc~qBge|^8-*tQME7!1RJ+wBGbIF6$@o1}K0XJUJZQVPZxtm_(l=XnNj z0g4Z8+r~!eVRc;x8$g;`UDw|-{d(>K{Jqw$>qu)I9LAVnFU!J4HqUc-=|yVOG+~-1 z0Dw{o0N|Vp@OZc`u>$CNy%qqk$K#QFi)&MWIKZ+jcs`$q8{0$Tv;gq$h^xssju?gk z^E?A6rvTd`T5H_zcWABQoI_PrNfhiTi91+INm5F3&XIF2w1Skf7#sPj^1(KaBRkNP dQv5*s*Dt5aqZsDMkf;Cv002ovPDHLkV1k8Ku~q;8 diff --git a/src/gui/images/mute.png b/src/gui/images/mute.png index f721deb37f132ff7e0f32f2921d2b09f7a3b1a7a..570ee55dedbac6bb09f533db4dc3202645fcda0f 100644 GIT binary patch delta 570 zcmV-A0>%B;0@4JKBYyw{XF*Lt006O%3;baP00001b5ch_0olnce*gdgAY({UO#lFT zCIA3{ga82g0001h=l}q9FaQARU;qF*m;eA5aGbhPJOBUy32;bRa{vGf6951U69E94 zoEQKA00(qQO+^Rk1{n+w6}*uQ9{>OWs7XXYR5;6>)K7>`QGXZ)@ZY&jMA$H;EGRoW zik&EmnJkoSn1zYlX;!|wkYvZg#y4X(ccxfb*i5NUW2Tf@D9Vy7lvr3$Gdn}%z83D7 zY5M*Q&+eS_oacSs=RKXI1M+6oFS#R}MkMJ`h(=jt3+?!s&X^U3umxK~4B_$LLgTSH zAB(HY>(s%`Ab(mN3Y^4CNeflk$c}V#w5!AZ5;kI9_$ksruhvp~ku-w4c#pxdNK5O< zXf?h{X@t0ir#M>{+4uE^y^KX%5^)nxaHTA=U;i>S_=NM4+nB{`$+@0c{}x=kAC49N^HaBRp(RKhYfh%P3VwN;zr%l(Ui`EX<%-xnQn-H-Td~fks(mQ){QT;wYtQq9_~LWIe&XxQNl3@ereBk$v_*$eYzf z-mE5i@iV$U$b3BZNNESQ=gn$&H*Q~#LT^NDs?!{(|E9M14WAN&B~IZgnE(I)07*qo IM6N<$g4QSgKmY&$ delta 317 zcmV-D0mA;$1lIzPBYy!NNkl@U6Z?^8 z)QEd$m{FrgFo084SYq$Z53yEft$%ia5CNjPyV>SKXOYb8}3t!bVIA|22E15pKj zpZPuRs+A_#kNH4YLwaiodmmB@V>h0?+IZCDAObKGMEtPszkk;C0?9NMA*4izF(M^` z$hc2Hv<3A|BD8)22G|H*^2k2CYTfq%?&Mc&nRzTBvp3~a+HY>;glv0pV!dTc1GKK{hMcV*xF*8CCB>rCdDq1rkuj|5b z9JsCvIcGTMCN?k3Rx(w82pU4roU`Vfd!>gkRk~&F-PoAfZfG%@4Xx=9&&x}gZYZC@ P00000NkvXXu0mjfF8hs1 diff --git a/src/gui/images/presence_offline.png b/src/gui/images/presence_offline.png index 28a3738692c6e6d46990644a22d82e6189d7c6b7..2f3f6ef076c691149ba345ba6bb6e1217452aa81 100644 GIT binary patch delta 359 zcmcb}*2p|Txt@U~-O<;Pfnj4m_n$;o1_lPk;vjb?#+xT~>VX`EWRD45bDP46hOx7_4S6Fo+k-*%fF5lweEpc6VX;4}uH!E}sk(;VkfoEM{Qf z76xHPhFNnYfP(BLp1!W^FPXXdOohxe>YL94#g2NqIEGl9UOIWL;2{TrR(ppF3|zA! zT2*6JKC$^S3%<~ZN!y@3Sx-oGw{Aj)0&jv|L5jlU`Rd=x?(f}hzd>MiyyNpboE?oP z+O-yhT&l~n;+RIH4{B+78dGPZt8NP6 zy=GIPbFVcRwg!$7Cg0i_g5sc2GSKA-F7nA)u6kQVK!{2q9><+weROwryiD7`Q@+M;!pp&(D9AQleBUO$sA~ zK-08|JW)sf44WBUGzZD5U@ZH#axf z+uH*GtgWq~-EMbIPEKALhVd}If~Zs~->quFd; z9~>OKXfzrxIp-Y!Y61WNAp|m+3|m=Q`KnkferenGhlCIohM`-p*K4&}?Knx2zZqlq z|1?|U7ytlDDI`e(LI@><%mSE_QVyk*K4UD@G)=y}($`79pVdJ>{l@?R002ovPDHLk FV1g+>bY=hm diff --git a/src/gui/images/presence_online.png b/src/gui/images/presence_online.png index f42ff86546e9290e60203847bde155fc56ef0185..47173152e027cf60965cc1e5ffb5fe7903bc787a 100644 GIT binary patch literal 2396 zcmb_dYfuzN5T3ogyS*34<4~Xw4miC9(cpmr%z=O`a2S<6j3Pf0K}EDo!b^>h7(8Ba z%ZLg-V+b6mhz3PbB8gEWB49*Oh&+-K1Q95)1O$|XTzVly%Su%sX102^XL{%B{(5?5 zw+Al>Fc4Xa5JCp(KtBz$Z$xvEfX^rRJOM!vLZLt;ks3(EVu^)`=>+LyOB?ISmR43W`3!~3&dJ`&iga^u za-Qkx>T09#@N`$IX1KU2SrAMp6iUPra{~i&rLC2%a@=vGky4`bU0xbBUNtO zoh`8UExcl;seUSViHOw-MH45PTUbt+svsR4U1z=R=I$|jt{>$e5U36cS@hoGC80~h zmakYDxhiV)nz;CN>oUM;;=cD=l!^3L6w+Mn;$)i*RhXlZ@e_Ncw1v%9DFSzrIa^B03GFP7(M8)5bu zFJs`v;c{^;(&%*IAc`=6NoP3$GF1|-2T*gV`A%|Qc$q%Og|lGI(Y@JeDBGT$kMAx}8n(lOJr zYKkf8;3ynEj-V>8sMzO6f3*4A8r)()a5a#~UhZhCG$4%CTg~f<$EysXL2w z3~5eNQmlVSO8Y1*DCv?G#qAwB#$m@zfX!{6UQLyZg5`Evst7VOR&fS^fwcJJ5O$g37gw5+sd@mV zeBsgYL^c|EJtTHvf$9k$99P9X34^3s^h}3saNmeg(%|t5;Q?u^wyx;!lG5*{w*uS` z(LEf<;dn*jNa`;3HhSHI)X#N!6QCdfYH9SU1)z{O0{XuqGK_^}XM5&!HITZz#5bU3 zxB!5TdB#0i1G|PlfIce+>h;vus%3C4*t0Pf!9}oSOFxrAQ)|@&W>Q*X-^`G@BK#Z3 zSla~IXr+wh-3qli7LjWhof!vD|?-6mP=`Bsl0}!B7@bh;?iaN`)P`w1{BHJo6$rZtV1^%+c4w%{>b)Z0;(b z`9260rip(K=fN0@(**cp^%YK^!9cb=P%|H)O;h3borKUJOeM4#V%&puffkEO$mFgkE)971AKRxotvusKW;@#^^$(SeH%m6L>cb1F=g ztNnZyx!*XF?rEs?HcFmTc>2icJ1Ot%sw*i@Xh^CO2Zx5#?+$&;Ynm8b-DR<_>`;=p z&Z)#?%IWW8*SB?T?!~7SzA%%RRC#j+ruhk)d7WyltQqBA?z@%hv1@fjoM3IhwGBJRDA}(AgRH0iH)Qv?qMJq@Iv07>BgJ5ctDwd|xHc1o0lp5M5W;%J; zOeeWBbMM^$aWPfY56L-<0)IpBfnjr zo;`l(z00R=+^&da1sL2zM36klG}MO3t`EOB7_8pZ@;?Iimdp&ld-g!zrpHnnw{Tx) zqYM#&-wnJ4wwA7LA8dW@c(+P6gVG=hB!IvLT?Jic@u&BTuYGvF|J>|`vr$Vh0q}_} zk8sRtYwuRx41a#Xz||2pBtswpUd5$cTBSANl1@k3j_h6k^yL9(=W<0YDgbZE*yWe# z3)y*ab1ckH@x`}ipgIBdN#^Dz`RwGc;7?NZrpb2HvioG|jLA8Jc*9hsGIFz~6jTzzX&?eqvtWjyuBmEGV+Zk!ea6rb zw&9y0Ab$qfK)4aYYVy1qy4Sm8!=b1#n{2`A&RzX&=nb!}$4oVG{^71jS`I zc?!C_8WWCA$H&TU=nq7Mo(Hm4{`1(El0$M|BM1AD(XD5fj9!Wyi$$bhhzR#@$+BKGcw$?<=kW8ZAN6iu--Dy^t58=EO#+s|m0WE0?W0Yf zoXdp=l8&AS~Odt^ii=l}o!07*qoM6N<$ Ef>_y!x&QzG diff --git a/src/gui/images/redial-disabled.png b/src/gui/images/redial-disabled.png index 5bfbf9b1a136f9e1ffe8b22d59fce687e71e1992..640996baac626b80c08eb2ee8135fe0c38dcda58 100644 GIT binary patch delta 613 zcmV-r0-F7S1M>us8Gi%-008{QM%(}Z00d`2O+f$vv5yP0Dy!50Qvv`0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L z01FWS01FWTe`H^g00007bV*G`2k8bG3>_wWwH?|300GHKM1Mh4D9?4!Pl(I`0LAgo zZ)Y85vAfy)X|^GUQN+RjjBMB~8cIajP+0$RAQ$(%$gNXL_v$s5T@`J4WuAYJK-eqEYv8r@wOjB8{; zx;EEGkUnk&_J3HT%HkaZJQLQdGu9_hY_=_PuS^5j>!^f{RoZI94sC|(^3E=z(TsIuW4rhg(eXsO9~Z z60)#1y|T!2~-R=zlQgz{b)YO|HheZOuoOrYf3o zHcH<4`re_aI(m`%5>`Y@w0dcGz!70wyJ;A(etYkUId+gQg>G%5*jo9*+m!`xjUUfv)Rt&Y4`As*?Uu z*LA?t#AIq3H%*g4=zqIe=9nE8`XldWazm@=FC4T~y)Rp2JQ0T*#1;CyS P00000NkvXXu0mjfH1@El diff --git a/src/gui/images/redial.png b/src/gui/images/redial.png index 2e273cfaade2839216306543fe87ad2d47f0c12a..6749d483a544efe17d5c30dc7023e48e24a66aa7 100644 GIT binary patch delta 640 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 delta 361 zcmV-v0ha#91cL*RBYy!(NklD%45Qe{0;d_Iz-~vbOD@=Qap#cYkk4z)e z(0G6ihPqd%N?J11Dh9)TitKvh{v3NQrh!$#LYf};5MM+b;D;N0aP=YK$(BP<87PH{W8+}*1` z!4`9ebsEFoqb#eEdtf^K24KA&CxId+%K@}UB=;Hl~B~F zTGFkU%w?=bM9v)AcZa*tu}@n|^%RUcduWG%r*ZK$a&7zo<+b&>Ti?$T00000NkvXX Hu0mjf004R> z004l5008;`004mK004C`008P>0026e000+ooVrmwkuM&9=>{1L12e)Y#_j+B0nJH7 zK~yNub<$5r(*YC*@Q>SUYN(mnpGj?kR8U>oA)$==B@yHy3k-zFNTRwGoxQJDDs}3G479kXAJ9OwT1?wNtL72|Unns5$@Y1_HzJK21y~hiastVeJiJ*{q=06ch zMU8o6sWUErcbO{Fjna!vPHDH=Eq$rItz+=6*$yL$q@|YWawif(=*egSDk6Y6{$H?D>1HBN zqil;#gJJ56u{VyOS)@9%pmw@;vUYC4Dm3LsCoX*t^IHA;Sc5j~oXu`{TkGxV*>kg_ zu_9M;r4cD_ab92x2D3-a+p1erc7NT^l2}nnU6Kh|%gZGLnjCOPcYhJWCHA%YeC&zC z8xW*kEQ-XX1jT;O9F9+5NTehGvZKUd~UFrZ+q6~1}pWPh$C`~_N1jXK-& RohJYQ002ovPDHLkV1kcq3n%~p delta 308 zcmV-40n7gP1nB~hBntv!OGiWi|A&vvzmaMlf7Jm24mJvCtUQPS008<)L_t(|oQ={g zP6JUC1>o;BlWt%H0aY`Q)D}lVGD$a3#SYL2)=-70#;}B00tr~U08)dZLCgkVl82Z# zKdtIj@1A?^?|GbHVeG78onE(3QSt4 ze?T+zP6>r+H`6MXYCmc`*kWOW+?gA{u?iDvGt5!i$YeIkgv`|XcD!S0ZEtUFnUH?F z+xX}MpGVtW;o6h8kY=50TspSgUpIK}OM&kr%0(iQQ3bK+!9#mdgWg^* diff --git a/src/gui/images/reject.png b/src/gui/images/reject.png index dbffecd623cd3cdf9b964066ec9d5afcc9c480f2..f11864f58bdfeee6ad3d9660d72eaeae94eb4336 100644 GIT binary patch delta 598 zcmV-c0;&Co1MUQnBYyw{XF*Lt006O%3;baP00001b5ch_0olnce*gdgAY({UO#lFT zCIA3{ga82g0001h=l}q9FaQARU;qF*m;eA5aGbhPJOBUy32;bRa{vGf6951U69E94 zoEQKA00(qQO+^Rk1{n+kI=l6LN&o->#7RU!R5;6>)IUg8QGXc6@y~Hd-nO8Y&Q%)} z3LGL@Dx(@K$RQevh=`E>ZZ!n$(cIS1&>#pk)uNJ6Mhzu2IYkjFFGQ`D1qDw-$G7W6 z3p{Y)^89}1d!9e%UJzM##mHR8RIO@BqDS^+^nK9u)M9doa4DJF1+n2gHi(vBWt21kXl6j{^`nJVQ~sclCG zRv8i|i}sRqnV3Ky7H}v<_5+*Bo<$r(JGCvXDx-2hbPiJUA53ivB6}8DL>5uG_pgRV zHrnz2dG^$s{p7FH$;evkKz8F!BRm$__7%_rI%RCbjej*DdnMCFpT}9!H|)erRPu`P zRxRDHkqvYpJz9}{D%!_C(;~9{ku8<@s})cyviCLEY-C;asYNyyxvQs<>AuKmE^_Lx z2ZtMtyltZ^vbzn~NKLyI*~9gQks6>DUSqI?mT?}xFoID$$MMwmeO*w2_2DhHG^G33 ziW7K@Q%|YwXZ;?nPO)vin3o&U#d1wv6#ZuN>$e8%W%;cvHl%aq9zDYJe?bNI2D@+z k?@IVHeo8K+w%PiI-zGb~WNO-Mc>n+a07*qoM6N<$g3^rtp#T5? delta 366 zcmV-!0g?Xh1c(EWBYy!;Nkl#{a_n$&f(`$7nqomlu) zu`prha~ruf?`@WD2uBD7gq-jTG293_3J`*DQg=VQ+MHQ5O#^^4{?S}SAB1TfePFJF z(=-j!%@(BrD8|`rpjQuJ5Js;av!UQDQRSRbrM!FJarf~u8Vvi%T)=EpIz2q|`Sgir zugXB0W8v8EI%j9DI4wT6)8g^i@mSYjB3QqE0AmqW6X2IXs%^8cq zjwnyn7BwGIVwwM&wa9AIPGwFBpAxOVG;Jx^XTHb40v}%g_Kf@&U)(sfQiM_{_5c6? M07*qoM6N<$f?YnX`v3p{ diff --git a/src/gui/images/transfer-disabled.png b/src/gui/images/transfer-disabled.png index 79a62efe71587177cdad97814c46d8fae12be688..f3adad0ec662d668dbfcb4dbf743512e292caf18 100644 GIT binary patch delta 428 zcmV;d0aO0X0^tLYBt`^hK}|sb0I`n?{9y$E0004VQb$4o*~u(_0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmwkuM&9=>{1L3NsVyeWw5b0XIoR zK~yNuZP2kxTTv7T;O~~##eyK+1Pyd4Wb2eJItVQUZ9Akx2gy>mkHeq9>MTOzzjU7Os-g(Ct-4T_)hfZmF4XTCfVb z?GHIRi{0|$`$EljPQJA6L_j|$Pkr+UJB?N;r)r5?g^Hoa_-ef=D^UDVuuySm9^bvI zU6vESI#94_GdQvwFE(Wp6cIBAwme7t>6M{+91kXhL=XisZ05aVbp^-~@jBzo|LY$x WSXBNj5x(010000sCqE8$dv@MEt|Uro9srIHw{ecaEPoel-`RvlK#(SB!R_brh)_F)BrY&cyJR3v`gL?&OJo3(ViPAeYpi3{8tEw~3; e6k<_0l^sP6L^YB|(0{ z3=Yq3qyagc1s;*b3=G^tAk28_ZrvZCAbW|YuPggYHc1{Xy@I!bbwD8tPZ!4!iOb0e z4b04JB?$=$4Xz!tlGp?cnRyzVIlA3S9#3pZ5L0S-;Mc${sj&IN-rggJgTe~DWM4fbSpva delta 201 zcmV;)05<=x1E>R#Bn7TeOjJdYc&;873u@Q^0004WQchCy@0001UNkl}iy(o>eSm}i|6{g| zTCMoT$0faH82*sTOIW2zftd&LF>c}HGE|FL2?4sfPrJrw%rQHR%7^lJv!&9#|5Tdb zom$o|l}jwB&Tw@t%a}6R@Kb+opA-@xyIXX}c@}d3@F*5M7=J|c00000NkvXXu0mjf D$PiJt