From 31bef80530edbf622a6678947dc832bc179b52fb Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sun, 20 Dec 2020 22:10:45 -0500 Subject: [PATCH] add mention/emoji/channel completion --- components/chatwindow.cpp | 35 +++++ components/chatwindow.hpp | 3 + components/completer.cpp | 323 ++++++++++++++++++++++++++++++++++++++ components/completer.hpp | 61 +++++++ css/main.css | 15 +- discord/user.cpp | 4 + discord/user.hpp | 1 + emojis.cpp | 26 ++- emojis.hpp | 2 + res/emojis.bin | Bin 3101035 -> 3157174 bytes util.cpp | 24 +++ util.hpp | 4 + 12 files changed, 491 insertions(+), 7 deletions(-) create mode 100644 components/completer.cpp create mode 100644 components/completer.hpp diff --git a/components/chatwindow.cpp b/components/chatwindow.cpp index 25492f8..71b0fb0 100644 --- a/components/chatwindow.cpp +++ b/components/chatwindow.cpp @@ -52,9 +52,41 @@ ChatWindow::ChatWindow() { m_input_scroll->set_max_content_height(200); m_input_scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + m_completer.SetBuffer(m_input->get_buffer()); + m_completer.SetGetChannelID([this]() -> auto { + return m_active_channel; + }); + + m_completer.SetGetRecentAuthors([this]() -> auto { + const auto &discord = Abaddon::Get().GetDiscordClient(); + std::vector ret; + + std::map ordered(m_id_to_widget.begin(), m_id_to_widget.end()); + + for (auto it = ordered.crbegin(); it != ordered.crend(); it++) { + const auto *widget = dynamic_cast(it->second); + if (widget == nullptr) continue; + const auto msg = discord.GetMessage(widget->ID); + if (!msg.has_value()) continue; + if (std::find(ret.begin(), ret.end(), msg->Author.ID) == ret.end()) + ret.push_back(msg->Author.ID); + } + + const auto chan = discord.GetChannel(m_active_channel); + if (chan->GuildID.has_value()) { + const auto others = discord.GetUsersInGuild(*chan->GuildID); + for (const auto id : others) + if (std::find(ret.begin(), ret.end(), id) == ret.end()) + ret.push_back(id); + } + + return ret; + }); + m_input_scroll->add(*m_input); m_scroll->add(*m_list); m_main->add(*m_scroll); + m_main->add(m_completer); m_main->add(*m_input_scroll); } @@ -141,6 +173,9 @@ Snowflake ChatWindow::GetActiveChannel() const { } bool ChatWindow::on_key_press_event(GdkEventKey *e) { + if (m_completer.ProcessKeyPress(e)) + return true; + if (e->keyval == GDK_KEY_Return) { if (e->state & GDK_SHIFT_MASK) return false; diff --git a/components/chatwindow.hpp b/components/chatwindow.hpp index 823e988..419b69a 100644 --- a/components/chatwindow.hpp +++ b/components/chatwindow.hpp @@ -6,6 +6,7 @@ #include #include "../discord/discord.hpp" #include "chatmessage.hpp" +#include "completer.hpp" class ChatWindow { public: @@ -65,6 +66,8 @@ protected: Gtk::TextView *m_input; Gtk::ScrolledWindow *m_input_scroll; + Completer m_completer; + public: typedef sigc::signal type_signal_action_message_delete; typedef sigc::signal type_signal_action_message_edit; diff --git a/components/completer.cpp b/components/completer.cpp new file mode 100644 index 0000000..d673d40 --- /dev/null +++ b/components/completer.cpp @@ -0,0 +1,323 @@ +#include "completer.hpp" +#include "../abaddon.hpp" +#include "../util.hpp" + +constexpr const int CompleterHeight = 150; +constexpr const int MaxCompleterEntries = 15; + +Completer::Completer() { + set_reveal_child(false); + set_transition_type(Gtk::REVEALER_TRANSITION_TYPE_NONE); // only SLIDE_UP and NONE work decently + + m_scroll.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + m_scroll.set_max_content_height(CompleterHeight); + m_scroll.set_size_request(-1, CompleterHeight); + m_scroll.set_placement(Gtk::CORNER_BOTTOM_LEFT); + + m_list.set_adjustment(m_scroll.get_vadjustment()); + m_list.set_focus_vadjustment(m_scroll.get_vadjustment()); + m_list.get_style_context()->add_class("completer"); + m_list.set_activate_on_single_click(true); + + m_list.set_focus_on_click(false); + set_can_focus(false); + + m_list.signal_row_activated().connect(sigc::mem_fun(*this, &Completer::OnRowActivate)); + + m_scroll.add(m_list); + add(m_scroll); + show_all(); +} + +Completer::Completer(const Glib::RefPtr &buf) + : Completer() { + SetBuffer(buf); +} + +void Completer::SetBuffer(const Glib::RefPtr &buf) { + m_buf = buf; + m_buf->signal_changed().connect(sigc::mem_fun(*this, &Completer::OnTextBufferChanged)); +} + +bool Completer::ProcessKeyPress(GdkEventKey *e) { + if (!IsShown()) return false; + if (e->type != GDK_KEY_PRESS) return false; + + switch (e->keyval) { + case GDK_KEY_Down: { + if (m_entries.size() == 0) return true; + const int index = m_list.get_selected_row()->get_index(); + if (index >= m_entries.size() - 1) return true; + m_list.select_row(*m_entries[index + 1]); + ScrollListBoxToSelected(m_list); + } + return true; + case GDK_KEY_Up: { + if (m_entries.size() == 0) return true; + const int index = m_list.get_selected_row()->get_index(); + if (index == 0) return true; + m_list.select_row(*m_entries[index - 1]); + ScrollListBoxToSelected(m_list); + } + return true; + case GDK_KEY_Return: { + if (m_entries.size() == 0) return true; + DoCompletion(m_list.get_selected_row()); + } + return true; + default: + break; + } + + return false; +} + +void Completer::SetGetRecentAuthors(get_recent_authors_cb cb) { + m_recent_authors_cb = cb; +} + +void Completer::SetGetChannelID(get_channel_id_cb cb) { + m_channel_id_cb = cb; +} + +bool Completer::IsShown() const { + return get_child_revealed(); +} + +CompleterEntry *Completer::CreateEntry(const Glib::ustring &completion) { + auto entry = Gtk::manage(new CompleterEntry(completion, m_entries.size())); + m_entries.push_back(entry); + entry->show_all(); + m_list.add(*entry); + return entry; +} + +void Completer::CompleteMentions(const Glib::ustring &term) { + if (!m_recent_authors_cb) + return; + + const auto &discord = Abaddon::Get().GetDiscordClient(); + + Snowflake channel_id; + if (m_channel_id_cb) + channel_id = m_channel_id_cb(); + auto author_ids = m_recent_authors_cb(); + if (channel_id.IsValid()) { + const auto chan = discord.GetChannel(channel_id); + if (chan->GuildID.has_value()) { + const auto members = discord.GetUsersInGuild(*chan->GuildID); + for (const auto x : members) + if (std::find(author_ids.begin(), author_ids.end(), x) == author_ids.end()) + author_ids.push_back(x); + } + } + const auto me = discord.GetUserData().ID; + int i = 0; + for (const auto id : author_ids) { + if (id == me) continue; + const auto author = discord.GetUser(id); + if (!author.has_value()) continue; + if (!StringContainsCaseless(author->Username, term)) continue; + if (i++ > 15) break; + + auto entry = CreateEntry(author->GetMention()); + + entry->SetText(author->Username + "#" + author->Discriminator); + + if (channel_id.IsValid()) { + const auto chan = discord.GetChannel(channel_id); + if (chan.has_value() && chan->GuildID.has_value()) { + const auto role_id = discord.GetMemberHoistedRole(*chan->GuildID, id, true); + if (role_id.IsValid()) { + const auto role = discord.GetRole(role_id); + if (role.has_value()) + entry->SetTextColor(role->Color); + } + } + } + + auto &img = Abaddon::Get().GetImageManager(); + const auto placeholder = img.GetPlaceholder(24); + if (author->HasAvatar()) { + auto pb = img.GetFromURLIfCached(author->GetAvatarURL()); + if (pb) { + entry->SetImage(pb); + } else { + entry->SetImage(placeholder); + img.LoadFromURL(author->GetAvatarURL(), sigc::mem_fun(*entry, &CompleterEntry::SetImage)); + } + } else + entry->SetImage(placeholder); + } +} + +void Completer::CompleteEmojis(const Glib::ustring &term) { + if (!m_channel_id_cb) + return; + + const auto &discord = Abaddon::Get().GetDiscordClient(); + const auto channel_id = m_channel_id_cb(); + const auto channel = discord.GetChannel(channel_id); + if (!channel->GuildID.has_value()) return; + const auto guild = discord.GetGuild(*channel->GuildID); + + const auto make_entry = [&](const Glib::ustring &name, const Glib::ustring &completion, const Glib::ustring &url = "") -> CompleterEntry * { + const auto entry = CreateEntry(completion); + entry->SetText(name); + if (url == "") return entry; + auto &img = Abaddon::Get().GetImageManager(); + const auto placeholder = img.GetPlaceholder(24); + const auto pb = img.GetFromURLIfCached(url); + if (pb) + entry->SetImage(pb); + else { + entry->SetImage(placeholder); + img.LoadFromURL(url, sigc::mem_fun(*entry, &CompleterEntry::SetImage)); + } + return entry; + }; + + int i = 0; + for (const auto tmp : guild->Emojis) { + const auto emoji = discord.GetEmoji(tmp.ID); + if (!emoji.has_value()) continue; + if (emoji->IsAnimated.has_value() && *emoji->IsAnimated) continue; + if (term.size() > 0) + if (!StringContainsCaseless(emoji->Name, term)) continue; + if (i++ > MaxCompleterEntries) break; + + const auto entry = make_entry(emoji->Name, "<:" + emoji->Name + ":" + std::to_string(emoji->ID) + ">", emoji->GetURL()); + } + + // if <15 guild emojis match then load up stock + if (i < 15) { + auto &emojis = Abaddon::Get().GetEmojis(); + const auto &shortcodes = emojis.GetShortCodes(); + for (const auto &[shortcode, pattern] : shortcodes) { + if (!StringContainsCaseless(shortcode, term)) continue; + if (i++ > 15) break; + const auto &pb = emojis.GetPixBuf(pattern); + if (!pb) continue; + const auto entry = make_entry(shortcode, pattern); + entry->SetImage(pb); + } + } +} + +void Completer::CompleteChannels(const Glib::ustring &term) { + if (!m_channel_id_cb) + return; + + const auto &discord = Abaddon::Get().GetDiscordClient(); + const auto channel_id = m_channel_id_cb(); + const auto channel = discord.GetChannel(channel_id); + if (!channel->GuildID.has_value()) return; + const auto channels = discord.GetChannelsInGuild(*channel->GuildID); + int i = 0; + for (const auto chan_id : channels) { + const auto chan = discord.GetChannel(chan_id); + if (chan->Type == ChannelType::GUILD_VOICE || chan->Type == ChannelType::GUILD_CATEGORY) continue; + if (!StringContainsCaseless(*chan->Name, term)) continue; + if (i++ > MaxCompleterEntries) break; + const auto entry = CreateEntry("<#" + std::to_string(chan_id) + ">"); + entry->SetText("#" + *chan->Name); + } +} + +void Completer::DoCompletion(Gtk::ListBoxRow *row) { + const int index = row->get_index(); + const auto completion = m_entries[index]->GetCompletion(); + const auto it = m_buf->erase(m_start, m_end); // entry is deleted here + m_buf->insert(it, completion + " "); +} + +void Completer::OnRowActivate(Gtk::ListBoxRow *row) { + DoCompletion(row); +} + +void Completer::OnTextBufferChanged() { + const auto term = GetTerm(); + + for (auto it = m_entries.begin(); it != m_entries.end();) { + delete *it; + it = m_entries.erase(it); + } + + switch (term[0]) { + case '@': + CompleteMentions(term.substr(1)); + break; + case ':': + CompleteEmojis(term.substr(1)); + break; + case '#': + CompleteChannels(term.substr(1)); + break; + default: + break; + } + if (m_entries.size() > 0) { + m_list.select_row(*m_entries[0]); + set_reveal_child(true); + } else { + set_reveal_child(false); + } +} + +Glib::ustring Completer::GetTerm() { + const auto iter = m_buf->get_insert()->get_iter(); + Gtk::TextBuffer::iterator dummy; + if (!iter.backward_search(" ", Gtk::TEXT_SEARCH_TEXT_ONLY, m_start, dummy)) + m_buf->get_bounds(m_start, dummy); + else + m_start.forward_char(); // 1 behind + if (!iter.forward_search(" ", Gtk::TEXT_SEARCH_TEXT_ONLY, dummy, m_end)) + m_buf->get_bounds(dummy, m_end); + return m_start.get_text(m_end); +} + +CompleterEntry::CompleterEntry(const Glib::ustring &completion, int index) + : m_index(index) + , m_completion(completion) + , m_box(Gtk::ORIENTATION_HORIZONTAL) { + set_halign(Gtk::ALIGN_START); + get_style_context()->add_class("completer-entry"); + set_can_focus(false); + set_focus_on_click(false); + m_box.show(); + add(m_box); +} + +void CompleterEntry::SetTextColor(int color) { + if (m_text == nullptr) return; + const auto cur = m_text->get_text(); + m_text->set_markup("" + Glib::Markup::escape_text(cur) + ""); +} + +void CompleterEntry::SetText(const Glib::ustring &text) { + if (m_text == nullptr) { + m_text = Gtk::manage(new Gtk::Label); + m_text->get_style_context()->add_class("completer-entry-label"); + m_text->show(); + m_box.pack_end(*m_text); + } + m_text->set_label(text); +} + +void CompleterEntry::SetImage(const Glib::RefPtr &pb) { + if (m_img == nullptr) { + m_img = Gtk::manage(new Gtk::Image); + m_img->get_style_context()->add_class("completer-entry-image"); + m_img->show(); + m_box.pack_start(*m_img); + } + m_img->property_pixbuf() = pb->scale_simple(24, 24, Gdk::INTERP_BILINEAR); +} + +int CompleterEntry::GetIndex() const { + return m_index; +} + +Glib::ustring CompleterEntry::GetCompletion() const { + return m_completion; +} diff --git a/components/completer.hpp b/components/completer.hpp new file mode 100644 index 0000000..259fcdc --- /dev/null +++ b/components/completer.hpp @@ -0,0 +1,61 @@ +#pragma once +#include +#include +#include "../discord/snowflake.hpp" + +class CompleterEntry : public Gtk::ListBoxRow { +public: + CompleterEntry(const Glib::ustring &completion, int index); + void SetTextColor(int color); // SetText will reset + void SetText(const Glib::ustring &text); + void SetImage(const Glib::RefPtr &pb); + + int GetIndex() const; + Glib::ustring GetCompletion() const; + +private: + Glib::ustring m_completion; + int m_index; + Gtk::Box m_box; + Gtk::Label *m_text = nullptr; + Gtk::Image *m_img = nullptr; +}; + +class Completer : public Gtk::Revealer { +public: + Completer(); + Completer(const Glib::RefPtr &buf); + + void SetBuffer(const Glib::RefPtr &buf); + bool ProcessKeyPress(GdkEventKey *e); + + using get_recent_authors_cb = std::function()>; + void SetGetRecentAuthors(get_recent_authors_cb cb); // maybe a better way idk + using get_channel_id_cb = std::function; + void SetGetChannelID(get_channel_id_cb cb); + + bool IsShown() const; + +private: + CompleterEntry *CreateEntry(const Glib::ustring &completion); + void CompleteMentions(const Glib::ustring &term); + void CompleteEmojis(const Glib::ustring &term); + void CompleteChannels(const Glib::ustring &term); + void DoCompletion(Gtk::ListBoxRow *row); + + std::vector m_entries; + + void OnRowActivate(Gtk::ListBoxRow *row); + void OnTextBufferChanged(); + Glib::ustring GetTerm(); + + Gtk::TextBuffer::iterator m_start; + Gtk::TextBuffer::iterator m_end; + + Gtk::ScrolledWindow m_scroll; + Gtk::ListBox m_list; + Glib::RefPtr m_buf; + + get_recent_authors_cb m_recent_authors_cb; + get_channel_id_cb m_channel_id_cb; +}; diff --git a/css/main.css b/css/main.css index 7dbed4f..890791c 100644 --- a/css/main.css +++ b/css/main.css @@ -121,8 +121,21 @@ color: #cfd8dc; } +.completer { + background-color: #2c3e50; + padding: 5px; +} + +.completer-entry { + color: #cfd8dc; +} + +.completer-entry-image { + margin-right: 6px; +} + paned separator { - background:#37474f; + background: #37474f; } scrollbar { diff --git a/discord/user.cpp b/discord/user.cpp index 56f0350..01efe45 100644 --- a/discord/user.cpp +++ b/discord/user.cpp @@ -13,6 +13,10 @@ Snowflake User::GetHoistedRole(Snowflake guild_id, bool with_color) const { return Abaddon::Get().GetDiscordClient().GetMemberHoistedRole(guild_id, ID, with_color); } +std::string User::GetMention() const { + return "<@" + std::to_string(ID) + ">"; +} + void from_json(const nlohmann::json &j, User &m) { JS_D("id", m.ID); JS_D("username", m.Username); diff --git a/discord/user.hpp b/discord/user.hpp index 04817de..6480f57 100644 --- a/discord/user.hpp +++ b/discord/user.hpp @@ -31,4 +31,5 @@ struct User { bool HasAvatar() const; std::string GetAvatarURL(std::string ext = "png", std::string size = "32") const; Snowflake GetHoistedRole(Snowflake guild_id, bool with_color = false) const; + std::string GetMention() const; }; diff --git a/emojis.cpp b/emojis.cpp index 6e9a293..e0bae2a 100644 --- a/emojis.cpp +++ b/emojis.cpp @@ -13,14 +13,24 @@ bool EmojiResource::Load() { int num_entries; std::fread(&num_entries, 4, 1, m_fp); for (int i = 0; i < num_entries; i++) { - static int strsize, len, pos; - std::fread(&strsize, 4, 1, m_fp); - std::vector str(strsize); - std::fread(str.data(), strsize, 1, m_fp); + static int pattern_strlen, shortcode_strlen, len, pos; + std::fread(&pattern_strlen, 4, 1, m_fp); + std::string pattern(pattern_strlen, '\0'); + std::fread(pattern.data(), pattern_strlen, 1, m_fp); + + const auto pattern_hex = HexToPattern(pattern); + + std::fread(&shortcode_strlen, 4, 1, m_fp); + std::string shortcode(shortcode_strlen, '\0'); + if (shortcode_strlen > 0) { + std::fread(shortcode.data(), shortcode_strlen, 1, m_fp); + m_shortcode_index[shortcode] = pattern_hex; + } + std::fread(&len, 4, 1, m_fp); std::fread(&pos, 4, 1, m_fp); - m_index[std::string(str.begin(), str.end())] = std::make_pair(pos, len); - m_patterns.push_back(HexToPattern(Glib::ustring(str.begin(), str.end()))); + m_index[pattern] = std::make_pair(pos, len); + m_patterns.push_back(pattern_hex); } std::sort(m_patterns.begin(), m_patterns.end(), [](const Glib::ustring &a, const Glib::ustring &b) { return a.size() > b.size(); @@ -113,3 +123,7 @@ void EmojiResource::ReplaceEmojis(Glib::RefPtr buf, int size) { const std::vector &EmojiResource::GetPatterns() const { return m_patterns; } + +const std::map &EmojiResource::GetShortCodes() const { + return m_shortcode_index; +} diff --git a/emojis.hpp b/emojis.hpp index b84feb7..3d494c2 100644 --- a/emojis.hpp +++ b/emojis.hpp @@ -15,9 +15,11 @@ public: static Glib::ustring PatternToHex(const Glib::ustring &pattern); static Glib::ustring HexToPattern(Glib::ustring hex); const std::vector &GetPatterns() const; + const std::map &GetShortCodes() const; void ReplaceEmojis(Glib::RefPtr buf, int size = 24); private: + std::map m_shortcode_index; // shortcode -> pattern std::unordered_map> m_index; // pattern -> [pos, len] FILE *m_fp = nullptr; std::string m_filepath; diff --git a/res/emojis.bin b/res/emojis.bin index 2d765e00ca49fee934a14dd6c25727c62051289e..6c89d749e79fca19ad0b307c80710713defb9dea 100644 GIT binary patch delta 104897 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�em%>wi^?3_kk3qi2nb&F@sA7rEQ};-Q`FspHaCG6w{zh3Bc0 zN9vxPd^#3&9{ReSe5HHS9a1jsA_y9=S#;gmo<_w4K|j88F+tFb@9Zn(d!rmdP==#! zG45DcfH>N@vdrONUW}$5{-=Hx^13UMw_nhCw;>MN?xN!S(u_wgd zY;M3602upe0O!(61*14<)lSEy(3M!vo*S*(XggTY$07wto)Lq0I5~#J;)mAN24l7x z^K0OGWQDgDf*a=4(v=L+ZdYF^;y4z;m=A*S=QUo&R?$kh7zE=?QB2?kFh2coJr1mK z^YoD0O2E=%G?2{^*+n)s3kLu;KY*GtmRt$o+s7(kCgkKqY=I6>!^&|uy8Z+O3vn37 zCJQX^t;5>BrXJw*>M0t+*-KpzY^ik0`S5fF2}@IVm_nqiuRyxwtiej%5oSdkbSb1D z=nLuRgmgW5U<@{e(j@*o zL&j@-@ePB#Y11^Riq5rBDB7Y{BaQ5J(=|fHD8*?93<5lM(&Q&5sYArX$c$t%enNjOWAAx7_BxKE~-3~K&9 znG}L-{@q?l?%Vk+Nv2p(M3P@T397Pc$g1h5(fi_IuO#>Fd^UbG9_@RNih+Az2diC} z73(<*h>$dU__S4nhjz#wIAyu+PckND0<6?wR(KyU6^}zW#h%3?F&mn$Qe-cOEOM{ zq|@H@N^;MxEJ=oFDk8}gR~MATu2Bt}ypr6rD@&3o))$fF7r%n4W>;2CKLv=mY^zt2 zdv;~xX$-#qUexZHJG-)gh(@!gYj$~PnLV>-mxp}qo>{ZYp^7I_u4b20O75nw|E*^i zA9?NB!+N=!qD#m8ZTE{R zP>#qM89!O}ep&A2Zsi*p{{&!nF~uz%?b(uVkOJa*2x23jtVa+KFLv~ma=ayPs{`WQ zj=r+a^!>{u{w5Q@qHGE&yc{-zA-&@<`#R^lu)Kez2_T;y8Fc%ORrCl)(9qg_c&R54 zXYd4|GRKSCy7>BZGEEEoOKw2X`jfb5ce9$+MdG|pzCkF)K6$hHwG6+gktJbJ-nMKW zK~^OV$F5y{j#I=6@WX(rP1r?Nh$`NTqT5nVQG|-#M$!10T(rAC#3(VRvm^W=^=mzT zvGDb%u=xtfqiReA@t`1PPtLQ8YWOySjt1+l7Ky!lqXvfPIM{5l1yen43`ny>m)f@d zwTSKIW3RpvaijY627a-)?%-YVZ)VgXO2Vk8hd)5V`gRO*$!mCJ8zYg4Bl272*2;w*& z{TudF}nOP#U`{NnDv49xCVP|ZG_>=&J`Jl4#0 zidbSDiZ(2iMfM~akD{7uxoG!*!6@;8;{T`mHK2D}Q^K^T#0fycysOCMkw}ArLf-bE z*xuVWYDlE$Dq{YFRzC44LwB`!G`2zt3NbGI`#7UO8jE}R|B?jljz#l*IVp8qkIq9 zr2p%S&4`R$^xQCMf_B(?Z9hy1xiQ=h>~-IBft(>NDA@leD%h=>+aP}L>vV1Je$KCh z)vvShiyJW(70dS!V+YW#Blm)NC`xp6iXznf4Ji7ni!8FI2z}AM(bFknnN2`F-iM1Y zA9x)RqxN=$AE$mb;};7jJEN0EiOT-IQ6ocTkW+9a@XHBOipPFQ1y_)7DnpRGz}AEVSl@+tI*x9Q`ofJsoJtZEuM;2l#q-tU~H~waKgjLbm3|0XcKSPjjO_DW(n5 z$A(*h{-uSB)Un~%fsW|7`n3SR_&Jb|>@SzvJmh9Vm*m0OP7&`WbSbr9fn6l03f*LW za*b0Ip&?s`qKmKRB6Vz-TIL8pU;VljzgYOIs4(Jw$-~}PwxQ_9hwUP{ulP{3>2Yz$ zK6ucfGRP@7RRZ=}QnOE6tByn(qVa!3;(!Tc@%2ga^moJXMOMk?MvJabfnU(G>912~ zony-rc%%&*sKj+_DSMX->|;yAAZJA9s$UPQUvJ_UkL|5!#_eB=frGP;Eqw+%GwKlh z8bOck-)Ke0Ux#`&DL%>Sg(x7-8|>Q~NW2->;TOv|6MwJXN!&KX*B!Gh%*6Ey_MHQx z6>8944C`ddIYxGXqPtzwKCv9SuOnb8ez5>Lh%Vem)^sgC)=*i~ACfX3Q8m{(HJ?Py z{-&&HPc6DGeXCm5bdD@#Lwv&q^gzS&%_*9Thm55PJ?vBE3wS)`M^Q=7UHMcgGDDn3 zFUBu!H0=~CaheCHgW4zlI8oM;4c?||br|ZSuN{oWNcC$1ezDEV9iXg;4RgLOB5W;S&Hhqk6toUJcIOFV&o- zXEA@jda;Hm2OG{Bl)o9vjaUb7fWjY zcA=TsuE{jlLeOg?ZM^-7C?C~gz%N?tg-c)iT)08-0k>qqCm{EabhgjMn}mPn_AET5 z3M$YVzt}_rT7ViLX4~%7eP`pq>`oEn$_KSP`!bxCLwURDTwFv_@ZpNeF<600LzbvY zqI|e-55A8mSjAX|Dq9{`RU%Rj9}5dsLfnPn_I*S_jGq{Xp7%25^}JxEz^kYC%7-8epBvZcX4)Rj z{ZPeLALXkhwt;VP*~mt{pKs`tBC-wo=DB~PS9Z9#Y~y6qI{jmD{(jKcPzuZ9%|K3S zG=uLj3k-oNZr;yVI;6N%lcdhxDn5f$a#k-c6q%{p5b780M)*oO)O+D!_KV&l+8So$ zrv|3jBMy*$=Cgmi!;G{H#U3$oRFCkLxs=`6(?Bc+^-#LT%^lV2A#dkS!_}r!?#-plYGEBkMG%`5#SybZZBm>K!n*|74b=fOu|H zmL}byiVsn)H0e$$eUXog>d942RyOu4ZDdiSid1M0}|UHt`7`b<@_=L zLk1Kzhx36pV?{nPt$Snpmk-cVF{SfW6p8<(5y(aj*jdFJVSI{49Cd-W5#cr)Vf4ai z4Y^qSJ=&g(Z4L_3Riiz;F4-@3p1vV-b-Aziu(pQ4By+y~7KmWETr=Agj&#=LZ3;(b z>vCTyduZyFGfyLt@y=uOW%-ef3U`-q!k_xN+eQ&}mY7rNlL{#wD;=9g;h+W~9AG3{2+n7Qt-5ldZwAll!^LOdN$0V=EO89W z&l0CE(^tAz_5k3tWfmA(9I`;lGqizI(Tsf$@eY9Wvr|t7XDQQH#^PKLO)N&?FtWE* z{SATJO~>x1PEMQ|k~=Ndq5-a?FVo>hNoh0fgA#}b(N`vM$|BL5*yD8FKHK_>t{k#( z!sjo@AIBpQ56{QnCgaW=&&Pn5z=ND5@qX0V`fI!SU04aW%t61sRK;K)&Jn^dDau6CN+!La%@5v-QaKZhR<71g=?aEbswx!Pp$!?6MI z94g3rDEmT|YT*y12i?JMiRP9X9riGE{zWy5z<&xbySf8DMhahO*I zhlx0LjJ-I@6$HWSoShv6WvQ%+pT)W1*}rweY;!i^sW9T<{5-L(gKz-H5W#xl;Eg5V zdHbFt)HWh{ayu2~H((}r76;eZkC#U{yUEzoYn%~wvB#EPgD2u{q4_7c9nn|Z25z*- z=V68&Js&e{=wQ~#%?$fFka<{OI|m_W2m>!d`22EjciBP0=`J?&{e5K}NsQA+ar*wg zeFpP$mYsVXY%bh?gj&-h_?w=An1iaWJ)zEu$1L#x3WpLudilACHt))#bbSk-S0zLd zA3+koCsOvT1iqau@fSF-YX)(UWpoAn_+-t3^F~S1&LH)kqDV4%4ZOl)ar(yWH&s*E z1;)FjdG%DT6q-##*`Dbn(k+~!liLTaCw zCedPALjI9Qq1$`KHGy51QtiZd`%6}fwb95 zXOgj6_}ACd8xy`z)2SgPk$7+^{_SyzE@ziBBv_&xS9Axq;c`u5hruA6=UY;bqNlgc z)g)Fd%k0@RDO@cQ=D^xbN4E&PCnnt=@_`6PPL0n<7Gft-)t<4z4RX1u3yY{E+$)SD$ zsy}p#CXt6sNoz0}pN9v2@NJqj+8_X+Fh{|sKtpUN|jdqu%@t6S_q*otn^w4e_)9waZF;$iB3-9%|UECWXL!3NsS<*sghJ8 z*!%;2EPuu(WTG|E2n`=x;p27IL!dppR99jzLd-rZ)|{S%{-3!*)7Voj9)y2rEgTn- z3ywa~9(dUS1gk4(XQbc`RvM8I6ISXUH0irl8c^Ad=0E(&YT*$NW9ih4SW~JcmL3A! zw`(ZbK zNko>TUy=7Uq=uXuf{}VF6+;YrJGTjCFd6cp21(zAG-Bx{;9=ZsZ36wUPZWJj1+9Ip z353Ak6{9lfb4{UdKSWMQTkqk=u*_ynF=#b~r)Mx+-;%c81^Mr-n#$K}WQ+LrHeJYl zd=X=^V}~vbfKACpG~m%+bzv11(yY1iPgPh`(TQ$y;80OVS2UDbD;)&nly)QSO(0mq z_i*fFKtW8N+Er8dW-A$-l}MJN^HsZRiiy8Vf-^00=$N>tF6XqmX^jyGNFQSYlL|9C!h*L>>LN5@k2v>(Klh79jlTkzotO!7tLuMYvb0;^bMePU#qC>XC|qL{y#mIXi41<#DlMo0jfUniK6qX zNDZ*bYeAm>sUmae6`Z0Hh{`4FUyc5qu?YYgf5RU(@OMemEVTTG&+KY}V36L`5aMSw z$b^@6M!)k>TK|GJ@+soor%5sfA|soz{_s*02y^r$iJ%-` z4&=tK9Yi$L9g?M_CZtYiX|hERG|m(9+BE%-*kIH=)_Og&CQh-xI+HBpR0 znYU1Y>9JcCnzMXmGxdPKaKKd+eE3SW#N(~q@Em7-YjdfpkcXMZL`!5M2y?!7=3i9> zpS@a|5IGB;&jy(sy}wOW3@SvwSsqrBmR$V$@ zbQjW`=!gwO=7oq`mE!m# ze7!P~;3_v3g266(c^E`;aOOPV7IpRD_~ma#WNRhIPy7b=@Zi|f6u68A1_=0gFV!oK zC+D!53)+!=9GX!^6WIlW-84v1Ij1+iGwKr&JTI1!!Yedws6qs3D}x6fzK0N=FN`?1VJn_) zfRHbTDG)0~C>RXqUz#*R5jZFd#j2`p#b*9IYV9=IA(~@I?a7Y3^xYCc%%G;=Yk(~E zDM$^qK8o!ujz!G42*k?`MdT1PnAfc?n8c`sw+SC$NJ*S|4!xQ*M$!4r zP}I*s+;e|LEyCA9(aS5I(g0p4X&nP6QkjfWU(Nm1yP#S;~sw;8C5po2hQs00|BlN6DIO$Dd5 za7Ef?Z$ClN_#?F$Q4FnAXVf}mvZC;|hu1!Z8-D~iqbMesi6=YcDj7|wIfxYT|A6H) zrz#4osKSj%BK`>oPoJg;ye6>LEA=)g*Pfv$9GET=3&IgAk`kbubEcxPP6DCMQq9Q> zrcbIB4QW^FkgHjVj}5F94qSDZKC^;~#PR-cpv2=$w?2t#pG6dnd#Byc7l1129BK`} zjaZ_vGvoU|+%O7^hn+JjW3O&CJZhK>__(L9m&r}4CL7`L8;H-=6w+-+QluTcE};+s zTAXNCA-8s!ed%fNSe#ObDpq=cY^BKmeDZXMlBwYkP#{1_8GZ$g`e&v?tKrMdIv5@9 z!1%2^PnFYkSP3FSHqm?c^!cisv&g`yyd^n0VvTN$r4rzGz=aN7##+KwOYiJtRK4$F z)&F26pcv`qr4aSkrK$>lqtW*D+~ul_gL=xHS!XxiW45BptiXJd(DXazIP{R6tuBhE zI4Faz96V2vxD_qQ_>pMM*;lDzsWU>5Ln}$K@9tWpC_Evcq_SvxBZb48H#oE~2UfE; z(h*>I(=Cd`*<>kYcLtG*c<)|1!pP6?l6z{r; z=K5F*lqji#!D7xmiWsG*L{n`F%3r(BDUVdr!d-7QViT{Ok)bdXJh@20H|Rly;`vCL zka%i$)St3MQFxDzC!obmCtDxE{mNJDQpEkusi(Bslu-6j`!0RCzn*?jH z-I96IAw?_ro;}eLPebTQXwA516iudk!ah=8>zoeAB=e>h6oOZzs9l>@%E)p>BZ~&a z>}!m6M4eTysB)ZU4#F;iPs&z58uRvQMX}?l#h{uErfKipW397+M_thl#ox#Hda=fU zKKWmI%Y%tPY{`D0e7(^_v4|oL9p~$HDE%UzyFp(l=`u(v0)i$2pusIfO6}oSc-VrF|i_c${wtTfEQ(L_WYWG-qGw*N{xX z7%LCvJdEU||B80wA(8?m6%}cSKZ=Wlf86-CL>i z&9Va(j+Cw?X)GTU_wm57s+aI{0L z2+(QR-Vo@c0)|w{hE8}pex9H({EYz157zsV-Cn!n6pe%9IhRtR^Rd2Or_k4fPV7tZ z)&4tqwEU*1u8?**Y&NAZMinsSr+P3lf|`>f*%ZfvH(vs(dVW9ZEk4szkIxbc6Cn9- zoUPi+14vXFq+KGau5Cm@>${!NnH;a>>;D9XI#Wvb%z&gJPz#kn1?Ng z0PsRhv5tC_PokeBo|f=%;j1w(mjFRKCsqI0+rwM_AE~ozRsJ@RZP;G-1L7Q0ABz}fWJEc4_)8^M74+jaaewlYIL|=1;%|k3Ept2 zs%C$F(r!K@$+;`p8Qxx!Z$_)*d1(eY1Gk^&;luH{a`>1OVf3J@JXj8{m4n4{gV9WRPa2KO@QAkE?vN_^GfFBj;<3UO2$$RZ-L7fk0_v@Tqz`wzt(}Y)mZqhqR+u6A9b*Pz7tBtGl?09#o1ud#Qy4W zMdhQo-JCxm_W>Ea(pam@z1a;SpyUdzgKCC~!u_irgGe-_*FTblm`V(1-3Iv>X+|2)Jj&p%9#z_G%T3qgnOAD%0`6>^U}h4PB&@=P@~>=P?2 zm}^!tF4qn^7!2MC&;NqYZ0?nc`vG8Z#}{_7p^E=P@h4x}e2p6RYd|Rcx@0ijg6spB zJSkXqlzg~ZL0B7vv=vD!JrdnKW2?I5_;U#SRWTd~aO{P6)0)AUN!fV8J6K$O1VC?$AhZNJ4_UYw)0f zpb3!RP6%%AQ?pW}-~2&+*l#~oEz{G})6+Az{@l)(I}5hO3{H(njZICHnl?3EYFuji z)C{TdsTorygw!0VIa70`=1$F%YEI3YnlCkfYJt>(sfnqDQVXXh zr4~sonp!Nicxs8%rBX|$mPsv}S}wKxT1)%5V98jMDXqz5N{4?o-Kyxb(wIzT z0Ykv%v6jb=efSjtwnH%{)8q6EG&>aA;u+|Zp?Huf3cT8nPz=oy1wNY%pj>v7DHx9G zv$p|hmxCpabO0N3F>pRW)NOefxW0vAXLe_raChA*MR!$|HI1H zXyF14WVL!7LFP1+u|5gv)JCC}^BXOdf&%7g!a|SHbnY?0HUB4L&oua-Xf9)4W8h97 z%h)ge$Y?Q7%Y>@_gW@E&kp=23_~maaV{Iv_x~`p!bu-j{zl3$$NvQh;WNa6}b@dR= zL{&9vraQ!a6i8&xj8b)iH6Y4_!WE{u}b=&|ME5D&3 zat#dO_e!OSw0~6=SI8Yh5#XK1+8iGt&AY*kR3jbnZ2#ZbGP@H4g(9R_gWbqPi zXYVt(ANq;ieMUR`pQ6OOmdRKV?X#m!gJD{{g5uzMNuk>}B7>hd$kzPTt zm5bvOwgj|SR}^a6PFDLvquNTSO}l06e+IhpXBjI;5aj#4GFIy%$fx@ytb0nMy|y0= zVG*AL?NvAjs#*=Eloc+MPH-vxy%2i$uN)&_lur}O$>lgqixUX<_c=+S+egB2&+jsJ zQvaxbNyZ++uFITnKn%%=)}bL~(4VYUjNCn2P|7}k$=G)YxI6~M$Q2@__WMwhXE$XW zXbZLVwv3g`P>;DA!lG3!v`)`lsOm(R;1;Bvc_g{$_88zvk7ewjI!#6m{#6{^^(oH( z0l1R<8@tb=I1gXQ*mDm-4!sUx(Iq#E6U>d`%!jE`87*HWZHyF2`4Pn#m|n)(PGnFr zJ|;3>&=g_KgE~zIE{lOIQXG|N?U zG=Hch#sx~vhp;~vV4)T|3pDuuUQot99061H!ZP+#dpnXOtlPvgGaBp|nMW|e@tE3- zNtR{qvnWD=ax(T9ldAGE_Fh9?+frogqarM@avN*K5p}eUb$a}rJI^D1y|x(@K*gQ!lo8qMfG1NY{Y!q|(W8{*3UP>6C>Wx2W) zQGzvOtcf@I(1eBa!&HL_9)+w7iV*HNp`f}aJAyvPT;bnXp;hA?!aLWvo%F?@=VITgCPQ zsOx2z;4#E&ilI7EOq+3%_-H;@K;r57+fm@Ik%b=TuiOoeh8Yk+H8BD)m=i8T-Eij{9830nsiIbq$i44-@PQ*}8#} zOt(@0E;U%jb{a|(hRE3Q90l%gW6!YHgT|UDMGON{5bmI%5IICcS zA0chd1lh&+D>Ar>o0@-T;HT^LhN&_R;0!RW#^mSLhbMybWL~5*iW@A^|Oovi}N7L^Z&;cF{mgC zI1eTm4@FswJ^#u_w>>~W=W!X^bH&lEBqe9Mza}p z(|uxGF_da0Ot2v&ga6{@aG^t)j$Y$Xp}ST05@78H>)fs2nDrLxLbqoAjwoQKI}+B7 z+0*{}GWMqCfqdlynft}j;^?vtWKrfH&eMacnA$yMb@+xurE21wjkIhCdqleusAZ7M ze3+mK-aBJsC7E)Na2gq_eNnQJSTgu`P>sfy*BNB2Q@`z*Ny55y4b;srfuNHaGRFwrb-0D46kHm^7`IIIG4YO+DWnL*z|n>E zn15ph=aR{dL;7#5osB_K}!bXoa^2A)Ja%q&RBTVpn1- z?CFdJZd+Z(p0&X3YslD_9r@&_DdWK3Xr!XGWUOFVHRY-o!gP7pL#5JbO0l{=x2dlo zgu5HDf9R&kO=CdzCNfq&Kq21AShtJc%b=RM5qoBH$w&9LM-D4m%2?}+P+3~bSlq2vMKQ+3B^}I-C2G)J^aF^3;2)k=^kNVHBSaG(zC3|o&V(t2do%GN}g$7N1 zl#G>FRPfDcj-{W3?%lWuuv=}kGH_x71N$}r_oOJW`RgLb$CJY#sN3y2P8L%oEcAsM z!tSsy0O*a|p$Kqf0mwOvfs@YVB;3?Q6t2$ziea)E0q&c~clvw=p7j8O7c%e$0fKHc zK*Yy~!OOJnI|lwlfCE27fy>$*4RGy81~wcnQ`6-U;ILZhcJ0tg2DWNw|Ey~n*oQ;W zXk!TA9>igFltGZwTUg?J2g$o_3|##H-tJ=HUVy@XzL$aLM=0{{XW%V`e0LvW;5&z0 zZXadfe-~>Cn)aMv5?F|)*nNtDvK&FQ^9YohsEO428Jqm1AI-2ut zGq5cIsE+9kG7Dm&?XcMwBFLQwEO9gi826Zgb2Y%_rwm+ZbJL`k4BTs>sQQM1rv<=2 zrZnNh>#%v}0n|;)z?T{uM3bav;%^H{kBkfgbUi~Ap#24K z59{R-7kwIn9Gc`dXf8Uj2>|L(4dAfTx^5@j28V+<93xTqMjtb97DLpt ztr)ng71ixaSQNHPe4D>H3=+G!|T34W`6~0LmdAj3p+HlD>-5SXfdm3a| zZVUs*T?9#)$iPX1LV;-vTsX9*$uk(Z2O{Xt-!kz00!6jC41(TCh?)iGU$}ZsADwA) zzh~f&2WavWgFthD*2@_v8e*(i#XxNjkZU~yEh}95Y-XV2lrjz8mL?d<*JW*vvX0#u zmAGu1Ao+7Q13OMK)2w|A97T}L@`DVVJphg!Vc_MY3KVaX7zCOCR4UHE=p*AwGEf_$ z1doGdnP^njYBmPC71?-QQQ)!u1<={Yz~%s`SDAsmHo&0j3>;LueIGG!VmZPzvu+p! zb%)1w3_dCKS>nD-wQ0=2(;ncDW(>St04la*;6pDoEpEfWzX*q>M+XLht5DNPWW(o)HoF6lgY#UL%Q=c=i-$c+c{TMi2 zz~$3{A%Mxf!)pw!-G`(N&m0|Ix~q2R0lGJzFighEMc~#WWvt?iF}cUeSQ8DaVy=sG z!*pi~7s7P{;P`X~?v*I!{BId}(xX|L%xB=WqP<#v$H3PSiV;6B@Y8|3xr{-e8WbB= zr;QG?UgbCB`+NgS)Hr~nTNr3*;d5#`1O00#&hCia{w@Q%35wm17&vH>u=@!ErwRF1d&$5> zm8ph{Yq&-HZmf)$uD*+cpx;C7d@?3oRN^fSa2Aan@$r=fh{?dfUkLe@%fuis1=-Zi z#z5Hw@J9jzwG&)KE(Tg2fVX+Ei6WAX{utThN{oVlmHJisA`EQ%06fJQ*l{H@y(z)K zL4AEqX$DRgT*j4W;F^vG*pm_gK}W!iwLw!GTZA|Qo=gam$-%(;79fwCfe+8}Ot~sB z@Y9o{d+&h&_046KSfOA7Y_g);hpQVp|9@;3mUKA)+8oPQo zVqohDkh^KR$N-_(Lj%N4IHop}v9bdA!&dL(bTpo*VrMPfByU9O{J{IEl&G%(ZqLgRE_}Pfm~lxrotZBCYT^_r66!(m4;0@ok`=n>U(b>xmck_5 zhhoV}F1ACwg`@bOKD_B5%-+V{v|x*2RV+qg+&vU-+eH3ozeN-&50SZ^Y0h~v| zn4cm2qYJXLDjt)<+7OBdP^8?J6`Gid#JGQu_~@~i*AU@5PECn3XGCGHJ(tzGsMg4m z6ubuY!Pq!cuF#04ILq6uR<*p{?X;KIHLHFb>C4l{MS7Luq$58)GXodR&RZrha1Tbq z^v@j^?J~5SipuvzF<#}Ba6VnB1Ky*M#L;C2H%6;0gK@NmVw8n*@DRA_VBjr`EGzpM z_{0ZI&=h@uKdCCJH3@eiGj20Xf7IZ-Xwiy}%QaH>K;q)M;tr{ekyzn~UHn!&VdhVWyXp+D__F*k$5 z&Cj_G{+<98zY^`6Bjkh@DRH7@b4zk!4m9_=Asm+$q)>&z!25@Z#1;_0tBp=&Zh<1F z0ev`D7As;R62)(%$O%Q!nX*C^jX#EBDvTLZInyWK$qG$mYY9a&7&GO)b+xR}#nG0Q z5+ZXeONoRSD6;I}x&=hvR`6a4WA1{qa);TQR?6s@CVZI0lm(3ATe`cYONj38Bz+rf^mU>SO>{4hGui$n-!S2D-qYS~-6dsMh}I(5DMBFcy~@ z7iD0l>+FHz>7(-*)j@mlx|L*!Gc$s;D8s;o37jdA!oZCQwdsa~fd}_Trh;AuUV3D9 z{{sd-T5URAnL*HB6Fy&5WfFJ|$<`VS6uNqEtjR#_3h-MU1{&_5OjR2)&`(2Aq-hjr zR@x@{v;_lOA-IfenLaw7(d<@8zHh@4M*!eVTL#WvsEw~Z16LvxOFA-eXN6*)pMhr- zz$t}+Hw7;3^(Y8xKAPc-?Gz=NpYC7#cVQ4n18}?>1H}iIU%N9tzm;;uixDSwd%va(_0J=^AORl(6 z&{Z5jprH66V96==2Q022-L||L#NN&ch`($N;FbH7xm1(lzeyl4*8ck=3N+8n=1{#6=?*W~_*E1sur`1Y(U#iSvV4Dq) zFo%I%0a!kdK~2YLk}PE6q|@~JVg{}O0Bx5ra1Vpa*`*9TBD-cO5c~_ejjI`ZJD^== zt!LnCgH!Y6W(LM|uK7*|0XJgg-orqth#2+uF;GeI%^?Qbhfr)glHSxF!Era@wCal> zi8&dS*sOE`Tzr~=O$9KYV_@%(ApI{gaM1nj)5{E;VvKGn7+eV5mK%&+a{$`kW#CSa z#(Djafd}_mrZm_L9WI{D+X(ZaxMgNxVBz&8!sI)+`aTEjXC_t|<40NnQm@1Ep0;g4s>1HX|LPL|E zpT^jB7`m7&0+=E+zU)=zL#L_TA`mlJjJ$?_9tX%`cq zw&Vp)Sk3D2O%FXmExk_0s(1$%Ivx>MrXyKx5$;a+W>< zOCGTvg zgLb5c98ELIiE1ox^K3HK#AWy-yvFI-DqnnL>~{u4p}rQg*@=u>7h|8$9fTr!P$CVn zJ4?%nn%IuS7FHw{w{k#*Kr;uc=|MaW3@x0bx@D};I?gzsj8!r4Q=AXvv#^Sss1sgR zowHO4Y^cdPdU%g4>5<2-+A=mCLY}H8W0ll58@`W4@H0!g?m56;HF=*?aGh|L=3EGk zK;f3Gqs;&)M0qs0t&NP8GQjOS$XFFkK1XM##8sW-MBM^>p&MsuEb+(pit1dnAr@JR zO9*12mFm*{+ipxX&e*A2fcy}Pk*m(?mv<^{!5d%Nn z-OT--L0}8OwjUWNWdQmuXP{n1E(=yM2x`qYo{yOn`$4?w>i z4D9r9{e#^M9C%o5y7e;yC+(SxJHWt&4GpHl2jfdd&U1J8vOrh1uYZXitT0wYyRUG| zJp`uI5Gc}|krg^Qrk>{<+~Nw<7FrNYy~66yr9eppUUW^ySi$ITF{flg;^}*GqD~XQ z%a1q*Pi}y>PvS+)AWPni4u{qgzjM9}{Z8ZXI7H$AOVK!*zwM6|y$4zH#pB`0A(Zpa zIOAs;htDDAk>+=3e$5(&ey_+p5RjGx_L##^Q^gQKv5it1A!TdvP)L{ElMz2Nl@1AA zc13g>1Pv|s?X(fhAM3M=OM@(qc$$8%t&q`FQal`D$tAikvE+_XMS~!c1d?9W_;->n zwgi#oYZzmlE53=?6}04!35ecVs0&X_Pn+s!683h?yQu%o8ZOtr(zkj5DZh=!@C*JzkHTJ%l#J*54F6#f}7wgL4#YWz&&3)n=`H^_#Xul(rGAfkvSB3wd z5`&i);2Ad$>8=mOqp_C!8T|S-l>c;X`c)vtDprg|!S0YLJPxJ}Oxz#Pr)y;>GOBYh zJNTu zV&jmUZj*R0$x<%8x)?tuZ!>PMvt60?fo7Z57C7V5iUkwN{JWN*_LGU*GO=6&Mb9CU5uS=DHuoR ze8FC#@f=I8SX^{2fr)oy3eSP53loQD%cirbB*`7)6>|s$f!2%-dEw&nY7Rzd?_4C% zex=(pMa*1FZn0yoB~yAg-8G+_6D668Rskr!FtaIpXbs8j4L$$Ca+2Fq2x-dq;@CVq zqUd_uk~yviz>uFp-aY04(9wFZf)r(A+~VLoi#={6P@YXuO{N%+s50MT7lY@cR6Fp$ zX$$bH+5$_-AbBr2^-d=>Z zEW8+|KAA5UTgr-6i!JVibEt1(p)8TftJ^Cweuuu+5y9G&5ZS*&-}E?!;hMZ z?k2`h7!k%qo~TJO(#8hLEBh5)1zXiV5UnYcq2CQ}PbH|j( zPaEBXWtblMX{Q~8g99xFzO>G3RZWQB}WB!FvuKaSu7zB0Nogs!pF%nFypafb_b^j7d z@H<7)3b4{(Uz`pxTpK2Wi4$b9t%PX^6W1P+;&(`rFCL@VYWy7f!1$SlE(vc*_`xbP zP97A#+#6AC6g6YG|#A&?iz8a_i(5O5iq=^ea>5BsG zNy;iFEXRxk4Nb$vwGyGiWsxjQZ$|h!wD6# zVlaHP9Fx)qYc28dX;DOX)hMff3?^R3{2_+MzDUdmHoR+y(S>*e>M)kfVVJm&ky>H^ zrBXY4XaY1~u<;W;T@k^J&|CprGcu$>*QQzjlyTEGqm3`mu%s83O=!+6sOlkMz;MHV z3oKreX}lSN91vt$3ITQN--*x>sJK297OhRsNke}%xVTouX^xf_eY_0T|C&0@J~>=<@_Q}G=DA2%**BZiK{YXMFGA9!VSInlf1)Hz5o$I6opt(H71KJ8J4P{H!)7^b^yb zTZrRb82PDmMQV}nLlI~WS>yn!(iSG}I#RZ-4GGb4skIku5(x*57R+=IEl3xqGrJ9x zUM)y1xIdJxiItRI66oCtLdoLzYK+&4XnP2}CV1V8QJy{y8=OqzuTWO`WBt0QcNp1I z7hZguSb_Am%=mHdp7A5bE?z~_%RdgKD}SIQpFItwtKz^f$S~6pbX$7jQ!t%KID&55 za5lQ_kR#zCI9*oJ>!>AH28TwceS-w!7fqAi9Kkg^@hD6sGF@Tfc0jTsnIyT>dq2RB z9%Vy%^w|fbDt63LveX+CGOsUt^jhuX*^m2Yq~)%Z-BbWGBXQ!mr9kE~2y?C~ll;Xz zH2F+Z^FIT4XynUZN5q`Kg}(AJOJ*_bxTRzqZ4hkNgeXm!ULD6|sNxAsje4KJQ?@^m z*dp*>;Q~rkg!AhEk%m6d8EO5x{%4x93u%{o{6`wDD^HL%zi%`xr#spJ=styzIIW*J zeiD;W9O6SK(P}Trl=~G8OheP7;gp&?y@RgF#YcvID5v1peT?w~H=FN%MfKgMU^JNc zWk{?#H@m5@D16$I6pMMzAEz(}%5&P{7VTktZ6TPnB71Zq;xkX(ib~qtf24CdOVw^puv^p!Cf} zM5ozONY~aY zC{q_0a}M|%{UVwTKHL>rYu-bOd!(R~^~+RQp@>?Spy&-_rc*utL|LJV!$^#y<2-eS zIB^NJyZjQDu%yda7HM=D&R@cKX!YxxA7y8~74Y2U3E|y$PLwOM`z~CwXO~g4d{9;0 z5UrWVDym#T;2~soUBT!`3z30+qSBv{Bj@=O1*Ro|Pmge(^uYw$Ao&v##XU0R|H6^; z|Aqf8gh`|ga6SH%9kc_$7q5v9S0hKR)m20%@x8mUSQkgGT9RzE>AToJTrXR+UZGuu zKO#NDbFPt1bhw5U-u=KQ-*L>)V^w7@@QgG$BK_49!m4-+pHc^rn3zdU)aeQB^{hD} z{oi936R)G5r(w(+kybZ9yM!L1Vybupiit30dRgXq30a|t_?u8PAT$0Z+Pwk}%o3N# zb_*@j>tpok_*-G;pDM}Dnizsau{WX^P)AniqS9^j`p;lW9YX=CHRs|xtjH>RD|U(O zD1CPu?M4;4*HKPX*8(qAWvq#TchGL+li?H2!AVaXcJ^d-_*DS$2x^gd7f*KRp8U*L zvcmX^*vLUL))zzV8p;{C#4ZG})CV3hlGUMy1q$I)V`PkHcjZKN18~}hGS&!hc`Rd{)*|~n<1D?a0Ls2%;KN2<)5W(8{4G$Z zduelKjGjpW(d03ntI|BJZ|0oQlQQzqbv6=%^i(4*x16Za!cFshGS)u^UXYkGnuAgY z;6)JzYH1X+dNKp;TTIHjm1dyRu9);?!XTsW^je35JSitG{ewejY@a>%4-QK|L|SQ& z7Qq`D6mjl9!GRl3=GYUQ*&`rpSyj|~3g?IZlsHlIDF#S-FqK$Kc2;?X|& z4lmJ(hrNXJP8h>^)L7XW%QUZ`Xbod-j|fAAtkA`#SLo(9VG>$Gq0Z;3*hR`~^q=xL z#(92V$H?~mfk+J2K;rO~a-v4__=9U@tdlzJCeFd(0jRZ&fio}q!k}I37#`c&08iT^ zW85hQ-&pcgq15^ZJf}N9u1ejV6MnX?Tw6@-O@m@62|---knRy3PqGj z3q?;DGp)66bjk`<+#-b~9Zc_ZD9{h|zk6h?aroIO4&|E%6QrB?eXY2Bp6m#?r5ywB zV?2RA>}TLh2bb*%1OHnn_UH@(AK>Wh>dZiS1@O8n19cX_v+lW~kMX@4?FE_CizPa} z@v*ya6!@$HC0qFg16wA5S_2r^@p`0kzqKLDIxGjP%iHaUhf2)ZmFLq;%h(;2j4 z6ax?Ka7;grfiaBVo5;ZTHyU8hR0e)(vk8Jh;1R&rGZ-l3^69Kx(Vd1ql?EYwHcPZG z0nW^0pwowd8ZU|hzqJTJtM3@t=ym6>eqdmyZMUU=V&K5%RZMS}MZw2@=WvuHWo4B3 zU2$mEb*mV-yTE75ItHFya4C*2;^H2Fw!-?oxuLkWiGfeN$(Uje(#!SDc0@a;KeP)< zc@A7}w~SR%*Vrp#jc|nnGS=~p0+a19XXz(U@+gBqAczJ`Ji$bHh;j!{F;MBdKs|qB zpiM{J>z`$ycSMY<7o#9xO$+ehWd^n+fZBgCuxCd>I$s9}y>#ykI5r@gem7a-^g@zy zn}Lfyq1ov!12-+At+>y?Qw`wKLk8X@X#J$e415QnIQX1_KS(d?PkO~9@D2rWyk(%w z1+bfPM~-AbU4q)2h+&|0hT^Mq40Kv&`!g;I6zgn&K^Ym?@EI;sfvmZsC%0m+h=Tl* zjU|qqkYvcgz&RA)Ku!j(U*J+VHv{(>fIN8_c*elxUVa8%QhZsELD2UbNaMmx{FC96 zT$DjzAi$<#43vj(ahG7A(y>Y|#Xw60XkUhbPPOY_E(%mDy&AE>k~?~Gt2X*{bv`Rg z?DRg#M|K7d`pSaM#lTq^pq+<-s{+6*9|Jc&Cu2JO0R!V}UTrH!K~VLQ&$OyhqWba! z9Iwv6e+c0AhYSKA0<5jYK$(ZyJg>t*r3=9HdJHsrCuMd+26{=vn9(>GC3v+BWM@+b zHZRV!Lz{`+dW1MN zZ%s&Mb!OmO48`Sc4E%2pbyyDufs9ZL?ZrSj3oxb+1N9p}7I`AC>=NAAEeqi9Dmx1)3LI5BAaar93 zK)NhriDxNVF?9t4Zvg=7Dh9qa0QFWg@Q+7~w`&*#szWh$Jp&~Z6vs9&P_9Q7%1E5 zqdzZxXQI;KTz{E?Mz^Ac{$ikagyORsQDC>`Lz|tx#lUtRiu-pN*nb5$@PL7XMyFYS z6EHsd8vSF_{!Tt4tI)ebvwaUzcUzrzfpHTNniDLGi}U zK%wqj+npye|8P0gJ&^42vP7d5zu^_5z-7$_(7Y-GTUG$I1_L`?C;EKEz>yIOa~%dw z0!8XG2)aIjPuWIH+?gN|O&Ay-4_?rWfp;!kR)5UEml-ZiS~Kv|)u&xM1_Ao;m#ZTK zh0fM9fjp7CV757T{(t2KEO4pY>(n zpm!3~&!Zsdc20q$)0a`=HeTC$)t`ZzzE|;j5CcyqxWo=+psxeyk{SgbYYVs(`i6mV zQ}gMlJf{5UZW!`Bk>%R9MN+bfo<(q*OnoHNggoI}ZC30?qPRQLmIDJ$@(s3;U& zV2l`<7s(1$Y$e5YGTDpa-r83zB{{AwqU~BMsuW8JeHK8BrKI)6Qc8$RFbNHiZr#mQ zaEcPe;g*cPeeQrLTO4l2R~Y6OhudLFqQ{{ZPKgtgMDNR+Y4c#Zb6lLzDvKg|mq1BY zlDSs`&gNt|JK&u6o=8lFv+=$>-S*deBs*(j8`R=8Od>5k^m`*Kbb4~rD@M#OnUXK^ zJZM(QloG}|!kl>HQw+u-aJ_{8@uNEOJ*z)R2Rs^wwe8xNO3`OVRz z7JiF{o-bu7_%B?5p0y-^7f$*Y2Uf-XQn(jQkHo5_)(IyzjppgI5*W~&b>UUGb!gKIE#Jq+M?)0Ru`GJaIGFAvdD-rLiSZbf@QMzc zgNuObXI*%4jkdStQ)H~r({@uQ8Dn>TIW)mFB<}AaC+g(0v=3+Lz6vnz^C<8;X&t4{ zR}5T5sZawL7;~B71EU~dqg#<7K?e50_->Es#t-BCXXpCZec_~}C>-B&OOv{I-e7h}QvYJ&dyc|Sxz4~}5Q;Ik z7zCCA{BW0nLNn234;iQ@p(y#7fz}D&#Zv}4U8p<0G)HDCZkv^QK%qBLiOseHpujr@ z_6_hkZ^|2wj#(^br|?5s=EP$z%qbijTtC|5p+N^2I?s&UbhG`(HcQ=yfp)3{!_SJ z6gaGOPMqq%z(y}p7f>14X)%36X9f;B^=@=y;4A@`bv+{>=ytfSBj59VBgE}6zAd)% za|Rw-I$7S2f!B{E$jAK|`1$}e8^XZ<4B6}(&LDu#eVMk6W}y59#pU1xCh7%{JyRKI z_-LAG&P)b61sOFr3Y^wY0G2IcVDqCg`F>~$|_iEM_6~9!DRB9iR%mFwLE-O20qCyq;4S+GzZn{lgS)q%E zRZywqs(6M*+lF7&%oja&ZZWhfytl)cXFPGol{Vk=2hdW||p(^||b(B9i+XH{%LqIg55QZ2Ma z?^^iZ8W82p*`JZ%zVp{!Y`Q%t!`NDODDS3h1&QE z*`>OOpRFG1*#O2|70z1{@<&gUkh3Z_Au;YIvTBi6?5GE4VIPyI7>kB-8crW8fclr6Z1!> zXkIt%ht4{MC7!XWVc zqf<1WYYQa3cCy4xv-Yxk7BUH&`TRsG=&HT3QOqfbO)ONfo()!Z^AxeyH$ zlU~VUm6qJTdYfOIXql2PG!HlgwV6UUOj{r_=7d9QqGBr)X&{WD$ecx1;I)iaI30_( z#5mfuf=#3IbOA zQ7Kcrhe0vhw~(y$GO^RttZ_vK4l$=K+Veb&c`wqGy3zIwMAi?hw}WC3jCnm2^IOUa zMO;Us@gjX}K-_JIgH96%Gra_GOqbQF7}XwX%B)5&F`<2AsO^BE*3tnvb%hDiOY}{@ zmVNbuz=cK>2=85Xqlo|BySy9eH^%%|dT0;u0i-XP$klgl0O&ofKzPm69SF~B#qy4L zWz3jXh>obZ9g~d?^SC$>S%M!0ZUJMaSLBYakQI3Oj}*BBP~bbkro203g(}7)QJjh> zx*e4j_@=c2#bg*Wy`Qw^cUhr}EGoMEM=%NWeogW{uAxi(prW~lq9ZhaCYGyoa4;Vb zNgCR_k%quyV9XlQ^QJ2pIokr^9kSvn5{=o?`Ap)q7Cy3~hYsi2I-JkLnCX$;lzg(Y zCO+&0#Sj={$KK{*vO*VkI-%SJJL6QPWxm(t3r0@WfSYDct!)fE>2Rp_I2m|piRXZq zfsZ!i=pQif(__$*l^7U*!Kq9Y21-{brdKOy!uNxXJEDL}pH_+ekR=)oX3aigpnnEX zzD~3q&1Embmcu(M-?I^z+D_&Cw>G2&tt?WKPCz^Ybm%SjbmVI3J|P4k%|3B z^pKfT7&!7E>W5PqIO(>g^$Z5C1e8pf&A>FmO_k$154QXeKgwEdw{Lr#;!g!1E!3{=JETw;6zYI|CnP@j=t5 z-Aw%7AnN|T3eg>nw1`?jy}e~Mj-hF1LINtu9FNLq-cA}0QBVE zqZyBBpPgojYY&dZq%#cMKLa#B%fLg5eCHT=NpbN#;3F{aJS+SJ)C&v(Kby+ot7{h{ z-P~sl->Q9+7AtZ8591pUy>Z6$N8;btWFL)i_uDeohXCKaAITFr3i`pz>3 z8ui@YUvQ-G4FwG($6pnUd=JTI4RM9;1NXg^<*Mk_2j}=4m>?a`xu!P^EP zYX#PYKZz%aqo2C69XC7QYknIU9Wk+}jBY=fh6Z7fSQ+JRDaB4-jliD=<^<`fw#^tOa! zx{Ou26F)FZ#@bBaj&t9~^jFt(oua&4z=bft`0t{?Zmo%Pr1*~vY;-;8vYde(yQxfl zRx@zq#M$%bItET!0C}>Rfon~yNu(W+QcP4IK$EcnxRoo4unP}}R|7DeGj8RcASsc~ z&>6?0<+g`sfQi7fPl@FNAvSL1ei#UG4CsW5vREwwJn^#d4}#cO(QPvblfRsxQ*X** zO&md@$Qp!c5X7Mx9K>939Zc{URl-y#G9=lJ>-XKX3_PD9WcGLl#-`U{Ss3_en|#~s z4EzKh=VB0`_0&=M7%1fcUL_VXRSyqIc9rhzN)}~__6a1vmSCW-1E^A_P-Jv+M4o6* z9D*9{B=dkwp`lo+qrC(JD@UCjR?!Ps%q4S_%o~_ee?#SN$`L~^3+Z%eE!BdZZDP>Z za9Ih{q8kb^BET-;cNGag)@7`92X5a@#(Edv!#z0zyO@)TbBAW0-}Ym5_zwRT@R0s8 zR!QA;kc_n}z>S8;Sf^(#)>O{Y@fSdzZ&>FnkH3?N?=w=HycqdDCv5z&xI1HItcpj& z!tHo^s+_35MX3EVI8Uc&Jsh_<)K;74i;lzT7KiSSmJdhkUPO|J`v%7P4Su$#|BZk# z+aT|-lY@uu2UT&I6d6ZAK@Ut?9+4HA2q006AqB+6V|5{L%V#py<^#WaDPv<>`?qg7OE*RJ#ug6WAp0Di z@}lvmlw4xqC{$q#67$9vj`se@V~0CPjH6Y?8rj98QD{=*u>;K?$K;gNikLnc>Uv0A znP1EqO$UHh4`^}pRidm`Ma?l#)3R#u5~AK1sA>7jP^EZ-&Z7fWWvG_T6Y)X=c zp2n81P&m9|K;@6D7=%^?W+AqPr0 za5f$a^Z{77Nmgqjb}Hgkg)zRESA4&$(8bcJI3NCiDN0Y#7MtW2D zp?H{4R;a=~1ByW~#*2*KpF>)u#3SI1*nUZ8%jl_&4lcGHre<0^y zerx6zaA+|BMos`T<&G)pZ6MePrzJ9R_+PWRvhH3fxv&l_~gyfsHnk+g~s+Ua@)n znt_7`_h;{dOq_cVvAyg(rM7k%)mzlsaJr3 zpC%od3r9fE=MKz;fAFPvT;#z4yoMU#<5qT_)_r~BOwW1|wU)rK}VO<-Vq3m@Aw2KL_pQf4u5 z6adIPkAagO?U!7{z%>yd_YVw$?v5be{lvsG8bRV#F!0jS%)~VeeEpzEyMclKM}Pra z7z9S6?8!SBC_AB8wU2?C9-#N(BGK`{tI@=v-!Ycx`2lYI8U;S6u zeIvlHml-(nqadTNF>w9>#o{|r5cC;;45z`vDDk;_LUQmi0}u5=?{fy;NobK(uNn9< z0@N@SjhxCpe?@eO25A@s=mF%&3=9<77Tz~gkcoN@KAp2M&>jI)%gsQ?A5t{g3q*n6 z`X{+0F|Zv#)Vj$G>}LUTlwsh&U$`^fE*}9wpWoRK)qCoQ5TD;w8{k7P1NT;dF%=nj z=z>?f8Uyb_D723l_-I)nLp=umEXX&Z5raS>C<+CeGf{p-Su3_;pgsn;-j;!O2|njK zGSKOrtc_X}1gr(o&W$@Uuw?`IqzeQ4CvfTCEevw&_~3D^cf6tHMbiZx9KqB6D$ib71=xIgln+K`kDVDZd)` z7Sz|i`bA7wof7@%)u`3jT}R6^1x|B?yfo_OI46p%K?cSxQ-L*@9n#Ikk}I4`_~znk z;6m5MaS|J=PlrfMyX!JOki|-0;7*T4a4p2f>eH8NAx;IY@mdzELxJ~WPwYB~jT@;_ z>ma5z_C4{%qFp6a3~eg#hgrq%BsM0gXGlB{^nYeqtWN|!UO)_9kGrh)>(RJht;g*M z-2fdaUMw=Q1bia_?4=p_#e?-J5}%%0B&b1|FK+HSbTL0zHiNDPGzj^wnUN z_)Y;7N@d{BjUa!2!yq7DY(k%}0^NoQ;@u`3UgK8xAC&Lu)0XMD19 z8*X+6!X(fGn+dzQ+^RUS4c^(d!@C2bm-&UgBX@88kr+1wiDyrWA={C)v8?hjK&#(m zwIWLFfVw*p-(D1DcThXfurPNA3VIAlBFj!>MfbVi+?Jg+@g)+CKV|yiBN5yQXZowI z9(w0z{Xeo=H(mvLUMzB_s%X(WRcq*5dChmB#6EhBA+jL^ZE-GOw zOPulDyuR_pBPXm9*)msaHwrxj#!PQ3-OMd36mg9dh4(;F7>edaWrZrfMxxk8iXk8yGV!X7~RmsbeV=WQ$g0!Ye&ISfdDlcG36pUV@{pee=jUs4?LFk_@T2WQ-BSKvY6kp$g;z&V-6BU(0BVPtl_MKP$I$AnU=nG^)BoC) zh@4*dD2K6@PMc0M21JqLp*BBu43Shwon1o=-y1J*90jWeV=N@j`aG0?PhgKF=7hNH zV1s4Q0yLNJkQ!3p&jY+81>IL19!rc`UJ><9AYN~nxC2P}dS)nvzC6B-U7wzk@Y{)+oZS@)MjsUamS6+G5(f>4KUHCO zqZRx7645wB)>F_NM_~8K2vkMuQ|P4hXnXNR(eYGD{e&k>?kGy}`%B`+3BQ$CVbma78gb%m3jP*|-&+l?_y95eG`@9h z`3;(rfN!#gH0ZO}5aw9!kcJv^9%<-$Tcl73(g(2b5~Od<)+rf+)MveC(2C<>;^^g( zZ(XAD8MLk{63>G7fQh4h_UAq%591rlhtHzyk6?@z?A(MB3gFwymCgZC@4M5&KD>FLdHM6<)4X#Z@#uU?etch<8uZC$#xMH5^4#;t zpcL5iK_Q0o{SKH&xPSz@@%N7oCEzq~M~rSk|CkaAr>V3+l{$ldg--KhBpC?UV1X!d z5q0p00v8dk8jSJBjvlQDiK&^!UPMdSkVm#nqT26hAw_)fI}nYg_4gPky+$8fR}X}K z=uZ&&^CO`MG+K8217WFsl70(AoWM&7QrCNV(SYcQ#u;qA6wxT6&?RW*A@qV9V$P-a zPvIVy(4^C0%-EQ^7^}XbTf?_{w6Hp2A|0o-{XW&71~pfW`LZilTW)K=U^wW zaVYB|AA;?D6%(`BFjZ&?!#h@1XtZ#BXo8G&Qn#PN88}3>Ylzf~%v>@@$-IF{m<8#B zB`kG{M%Pi>J-{Vaap2IyOohhLn`>o^_sHQ>iV_1`ws?07Ge+Y+?*)>~^!DGy zzh!4l^u7(hbui{7P+WN@D|Au*4!VN|lQ08{G+9bTyMtToy@MevJ-X08xy9i-p($#5 zQS~ma^*!$*@G=dBuMa+Ge zO80TZy3_xDf-%!3kBT454!STuK)LI{B+wk|W?A=E}PkDej2`8kd-ZSKpELnJ;&QyO<p3>3&5dPqwSOvAX3uC6$nry{o zg(~X3Ks=g^=E5I8dx3by&E<|4$m$xBMAAz*e~k3vRb*#f1Ye?&m%}8`BKPe2rKA1W zFP^~B_#xx_5xMKuJbP8@xf%XK#=+97$V8ivDkqME8#39wp^|iz0pmlR%gDTC=!_ z_zN{}QNaUb-oAyj)I0pI1B`hMr1>^*eM8&Lu(6sHPf0-o$B4bMLY>;enml!^HQBrg z>92m3)3vGhtjVHy3!P%p?>CfYk9kCqFkLA;h^#;38G#TxqGT^KXnCZ-mZ9W+rZ zEfj-c48?ehtkA`UwAQ5m>*~y-tElcc{z8c?LQs|zjs+xPQAl9+_XZRd2$ou!13>{H zg?Vpg0A(o!Y(UHd6^pV;3(pdxLcsz8vV=`yB!-=cH0-6a2n333HXf|V((muRncqF< z{ga%}=ll$tw9h)^cPh5{kXCsEDOSB0?p zA);}i5Mla^BGZM4ltDC|Aw)EOfmt9?n{IS+9Mp9j*#+gY+QRS#HVFKIJsz9euWV3(^TqCUsyqj z4!Ns)g^=4pd{-%iLfvo=9TGxqiiniMQDHRderk41h)_A|wNDCR($L~|r-ZQ1Li9Mz zA|$1vWf|WJAs>h6P%VUV4C3AuUqr2tN}WtcZurIuX7BYy=IVwC3Q!k;gAqA-N}8_RS4xMS{5DqlrU-wg!If2LVFluXdfZ; z9F#hyuMh_HEN{paB6t^Ve<4qZ&_Yy`H-JT0qNlHy2PXu^^jcy07D6WcUW6#rgFVU? zLZu&;xub;8en!NAu|nvDh{&BNgz-IE_EiCkh%^jY%BBh-pQNc7EngQ#2_w&~87ypR zCQ2Rjwh(epM4X)?gi?)&%y)%QX=Caw5<(jTalc3io%%6HFNq79nqk?-dnomRk2?jB z5KtsFvJ3w|Sn0E7{(w(6vdUvwQ5<{>16TX3n*EVpy4Gh?D+Z^nW7ZdeKUvRg34 z5ll(y^dYU-0Z}%*t#u z_~Z@d_`)zw4YNiMW7Qv-9lFWx^Rv&g+rDZlvN^{AUq;u)^9B@txpA~5Znp^b< zvqF!frnF{OYonQCGMJ4C*#G0(Gg~hs{z3TMDj~?Xw!%4=(G% zY`y`WsW4k~rT3ujvnFjvg}EVStJS`mR4IdgxQFJU&@cN2u((TDZ_jY zhDTtRPO+Gs%}76IGrRM_u@OF-N*3Zfyu_^15u7)MS)=Rs_r@{nTajKAoxsANN4|Nl zFb8*|!21QvCSBg|n#vreV_<6`b9`oFx9L7xQXbM*y~!+>A^+XCn1l44jc%XG!lIdh zb!Rb$iT^&^=deWI!R~XJT9Hg4v}xxcgW6Y|92J$XLUy)^Y6GP2-Oa3NXuy$u%sQPn>Q?$^7uOrUpN&!$ z9*o;qWlQP7EV`=s@^Dg^{W$EU6G;|tf@>wEKiU>)8Rxm8AYDxMzRVno4QnN}i!Gr) z=MW$7W61p}mfu=xk?4&Y*jj3rJ`J1e*2?xynr@;yC=xq>v{=JO5kTY8?lwvaz*>q( zi&fyyuf`!@RLi6QXEN-GHnC_M)D|E6F}V#2`vdIZj!Cg@>{=VCZS1iOscn32XHF>F zJ0-aB(dRp!V75%`?I)gLwrP;Sq+T8eCFR$sVD+=idPD5}AD&|lok4uc@0d-R!F{%$ z*Px)Jdh34b2>U6Iwb!{sbDld7OtN-tNv4$EUPD?@eo~rC<$OJytFvM$ZSjM%36*vm z!Li<0l@i#SqmrymvCBp$S%>W4aY;75d|TQdxwbGxRZQe4Zwg@(I;$1@DM?2f!_JzL zWNo^vDSj=b#g@Op)#Hu7?WFV`^oa4o+Z^ll#L$z>dUKO(e5mS^3zDo8 zv)W^)QD@e?#ay~gt88rffZ6>sHulC+pJj!nt-i9HS)(6=s(&yW)KRc*C9_RyS$F%y zXGNx00CZZ-91Yz>fi-J{hVUNerpe4Tyk+s(k2us7Ug|U6i?g8+R2Rt@atrYQJ9%R<(ilp#R zcH&0Bir)y7K$%ruNLbP*fv+8AHeLsZkAmY@Nnt7YCd7qfet;a_iAIk+!5paoXPxv} zm#!oJhG6|3_?uISHeedJ-xbw+CVQ*dc6fLddsGp;h6*oPl$5jAP&VM~+ zBx;niq$V#?x6AljUP36IK+RYF=P7#6tE1M1`pxZZDkWf bool { + const auto selected = list.get_selected_row(); + if (selected == nullptr) return false; + int x, y; + selected->translate_coordinates(list, 0, 0, x, y); + if (y < 0) return false; + const auto adj = list.get_adjustment(); + if (!adj) return false; + int min, nat; + selected->get_preferred_height(min, nat); + adj->set_value(y - (adj->get_page_size() - nat) / 2.0); + + return false; + }; + Glib::signal_idle().connect(sigc::track_obj(cb, list)); +} + +// surely theres a better way to do this +bool StringContainsCaseless(const Glib::ustring &str, const Glib::ustring &sub) { + const auto regex = Glib::Regex::create(Glib::Regex::escape_string(sub), Glib::REGEX_CASELESS); + return regex->match(str); +} + std::string IntToCSSColor(int color) { int r = (color & 0xFF0000) >> 16; int g = (color & 0x00FF00) >> 8; diff --git a/util.hpp b/util.hpp index 4860eb7..f5f9edf 100644 --- a/util.hpp +++ b/util.hpp @@ -105,3 +105,7 @@ inline void AlphabeticalSort(T start, T end, std::function