Mercurial > pidgin.yaz
changeset 26982:e22e1f45065d
merge of '6a6409370fa50e23bc8fdedcef230220fa680a36'
and 'dd33cca1c5e6f5f7ea4cb392ed2954841617c1f1'
author | Peter Hjalmarsson <xake@rymdraket.net> |
---|---|
date | Mon, 18 May 2009 19:54:24 +0000 |
parents | 47d963966c9a (diff) 6bc0e4e76207 (current diff) |
children | 5e83f9fe4d09 |
files | libpurple/protocols/yahoo/yahoo_auth.c libpurple/protocols/yahoo/yahoo_auth.h libpurple/protocols/yahoo/yahoo_crypt.c libpurple/protocols/yahoo/yahoo_crypt.h |
diffstat | 90 files changed, 2424 insertions(+), 3224 deletions(-) [+] |
line wrap: on
line diff
--- a/.mtn-ignore Fri May 01 21:36:29 2009 +0000 +++ b/.mtn-ignore Mon May 18 19:54:24 2009 +0000 @@ -52,6 +52,7 @@ libpurple/dbus-types.h libpurple/example/nullclient libpurple/gconf/purple.schemas$ +libpurple/marshallers.[ch] libpurple/plugins/dbus-example-bindings.c libpurple/plugins/perl/common/Makefile.PL$ libpurple/plugins/perl/common/Makefile.old
--- a/COPYRIGHT Fri May 01 21:36:29 2009 +0000 +++ b/COPYRIGHT Mon May 18 19:54:24 2009 +0000 @@ -424,6 +424,7 @@ Lex Spoon Chris Stafford Kevin Stange +Joshua Stein Jakub Steiner Richard Stellingwerff Charlie Stockman
--- a/ChangeLog Fri May 01 21:36:29 2009 +0000 +++ b/ChangeLog Mon May 18 19:54:24 2009 +0000 @@ -16,35 +16,31 @@ * Report idle time 'From last message sent' should work properly. XMPP: - * Add voice & video support with Jingle (XEP-0166, 0167, 0176, & 0177), - and voice support with GTalk and GMail. (Mike "Maiku" Ruprecht) - * Add support for in-band bytestreams for file transfers (XEP-0047). - * Add support for sending and receiving attentions (equivalent to "buzz" + * Voice & Video support with Jingle (XEP-0166, 0167, 0176, & 0177), and + voice support with GTalk and GMail. (Mike "Maiku" Ruprecht) + * Support for in-band bytestreams for file transfers (XEP-0047). + * Support for sending and receiving attentions (equivalent to "buzz" and "nudge") using the command /buzz. (XEP-0224) * Support for connecting using BOSH. (Tobias Markmann) * A buddy's local time is displayed in the Get Info dialog if the remote client supports it. * The set_chat_topic function can unset the chat topic. - * Fix crash on connection with recent gstreamer0.10-plugins-bad. - * Don't create a new conversation window for incoming messages of - type 'headline'. * The Ad-Hoc commands associated with our server are now always shown at login. * Support showing and reporting idle times in the buddy list. (XEP-0256) * Support most recent version of User Avatar. (XEP-0084 v1.1) * Updated Entity Capabilities support. (Tobias Markmann) - - IRC: - * Correctly handle WHOIS for users who are joined to a large number of - channels. - * Notify the user if a /nick command fails, rather than trying - fallback nicks. - - MSN: - * Fix a race condition in the SOAP code that caused mysterious crashes. - (Thanks to Florian Quèze for noticing the cause) - * Fix a regression in 2.5.5 that caused numerous "Friendly name changes - too rapidly" pop-ups at login. + * Better support for receiving remote users' nicknames. + * /affiliate and /role will now list the room members with the specified + affiliation/role if possible. (Andrei Mozzhuhin) + * Put section breaks between resources in "Get Info" to improve readability. + * XHTML markup is only included in outgoing messages when the message + contains formatting. + * Show when the user was last logged in when doing "Get Info" on an offline + buddy, provided the server supports it. + * Support custom smileys in MUCs (only when all participants supports the + "Bits of Binary" extension, and a maximum of 10 participants are in the + chat (to avoid getting too many fetch requests). Yahoo: * P2P file transfers. (Sulabh Mahajan) @@ -72,6 +68,8 @@ * The nicks of the persons who leave the chatroom are italicized in the chat's conversation history. The nicks are un-italicized when they rejoin. + * Always set unseen-count and unseen-state on conversations. + (Joshua Stein) Finch: * The hardware cursor is updated correctly. This will be useful
--- a/ChangeLog.API Fri May 01 21:36:29 2009 +0000 +++ b/ChangeLog.API Mon May 18 19:54:24 2009 +0000 @@ -13,6 +13,9 @@ * account-actions-changed * account-created * account-destroying + * blist-node-added and blist-node-removed signals (see + blist-signals.dox) + * Jabber plugin signals (see jabber-signals.dox) * purple_buddy_destroy * purple_buddy_get_protocol_data * purple_buddy_set_protocol_data @@ -54,6 +57,7 @@ xmlnode_remove_with_namespace. Deprecated: + * buddy-added and buddy-removed blist signals * purple_buddy_get_local_alias * purple_notify_user_info_remove_entry * purple_status_type_set_primary_attr @@ -76,6 +80,7 @@ gtk_imhtml_link_activate functions to process GtkIMHtmlLink objects from GtkIMHtml protocol callbacks. * gtk_imhtml_set_return_inserts_newline + * gtk_imhtml_set_populate_primary_clipboard * pidgin_blist_set_theme * pidgin_blist_get_theme * pidgin_prefs_labeled_password
--- a/Makefile.mingw Fri May 01 21:36:29 2009 +0000 +++ b/Makefile.mingw Mon May 18 19:54:24 2009 +0000 @@ -96,15 +96,15 @@ -not \( -false $(EXTERNAL_DLLS_FIND_EXP) \) -exec $(STRIP) --strip-unneeded {} ';' installer: create_release_install_dir - $(MAKENSIS) /V3 /DPIDGIN_VERSION="$(PIDGIN_VERSION)" /DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" /DWITH_GTK /DPIDGIN_INSTALL_DIR="$(STRIPPED_RELEASE_DIR)" /DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi + $(MAKENSIS) $(MAKENSISOPT)V3 $(MAKENSISOPT)DPIDGIN_VERSION="$(PIDGIN_VERSION)" $(MAKENSISOPT)DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" $(MAKENSISOPT)DWITH_GTK $(MAKENSISOPT)DPIDGIN_INSTALL_DIR="$(STRIPPED_RELEASE_DIR)" $(MAKENSISOPT)DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi mv pidgin/win32/nsis/pidgin-$(PIDGIN_VERSION).exe ./ installer_nogtk: create_release_install_dir - $(MAKENSIS) /V3 /DPIDGIN_VERSION="$(PIDGIN_VERSION)" /DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" /DPIDGIN_INSTALL_DIR="$(STRIPPED_RELEASE_DIR)" /DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi + $(MAKENSIS) $(MAKENSISOPT)V3 $(MAKENSISOPT)DPIDGIN_VERSION="$(PIDGIN_VERSION)" $(MAKENSISOPT)DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" $(MAKENSISOPT)DPIDGIN_INSTALL_DIR="$(STRIPPED_RELEASE_DIR)" $(MAKENSISOPT)DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi mv pidgin/win32/nsis/pidgin-$(PIDGIN_VERSION)-no-gtk.exe ./ installer_debug: install - $(MAKENSIS) /V3 /DPIDGIN_VERSION="$(PIDGIN_VERSION)" /DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" /DPIDGIN_INSTALL_DIR="$(PIDGIN_INSTALL_DIR)" /DDEBUG /DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi + $(MAKENSIS) $(MAKENSISOPT)V3 $(MAKENSISOPT)DPIDGIN_VERSION="$(PIDGIN_VERSION)" $(MAKENSISOPT)DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" $(MAKENSISOPT)DPIDGIN_INSTALL_DIR="$(PIDGIN_INSTALL_DIR)" $(MAKENSISOPT)DDEBUG $(MAKENSISOPT)DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi mv pidgin/win32/nsis/pidgin-$(PIDGIN_VERSION)-debug.exe ./ installer_zip: create_release_install_dir
--- a/configure.ac Fri May 01 21:36:29 2009 +0000 +++ b/configure.ac Mon May 18 19:54:24 2009 +0000 @@ -1663,7 +1663,7 @@ [enable_nss="$enableval"], [enable_nss="yes"]) -msg_ssl="None. MSN, Novell Groupwise and Google Talk will not work without GnuTLS or NSS. OpenSSL is NOT usable!" +msg_ssl="None. MSN, Novell Groupwise, Yahoo! and Google Talk will not work without GnuTLS or NSS. OpenSSL is NOT usable!" looked_for_gnutls="no" dnl # dnl # Check for GnuTLS if it's specified.
--- a/doc/blist-signals.dox Fri May 01 21:36:29 2009 +0000 +++ b/doc/blist-signals.dox Mon May 18 19:54:24 2009 +0000 @@ -74,13 +74,30 @@ a GList of PurpleBlistNodeAction's allowing a plugin to add menu items @endsignaldef + @signaldef blist-node-added + @signalproto +void (*blist_node_added)(PurpleBlistNode *node) + @endsignalproto + @signaldesc + Emitted when a new blist node is added to the buddy list. + @endsignaldef + + @signaldef blist-node-removed + @signalproto +void (*blist_node_removed)(PurpleBlistNode *node) + @endsignalproto + @signaldesc + Emitted when a blist node is removed from the buddy list. + @endsignaldef + @signaldef buddy-added @signalproto void (*buddy_added)(PurpleBuddy *buddy) @endsignalproto @signaldesc Emitted when a new buddy is added to the buddy list. - @endsignaldef + @deprecated Use blist-node-added instead. + @endsignaldef @signaldef buddy-removed @signalproto @@ -88,7 +105,8 @@ @endsignalproto @signaldesc Emitted when a buddy is removed from the buddy list. - @endsignaldef + @deprecated Use blist-node-removed instead. + @endsignaldef @signaldef buddy-icon-changed @signalproto
--- a/libpurple/account.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/account.c Mon May 18 19:54:24 2009 +0000 @@ -99,7 +99,7 @@ const char *name; PurpleAccountSetting *setting; xmlnode *node, *child; - char buf[20]; + char buf[21]; name = (const char *)key; setting = (PurpleAccountSetting *)value; @@ -110,7 +110,7 @@ if (setting->type == PURPLE_PREF_INT) { xmlnode_set_attrib(child, "type", "int"); - snprintf(buf, sizeof(buf), "%d", setting->value.integer); + g_snprintf(buf, sizeof(buf), "%d", setting->value.integer); xmlnode_insert_data(child, buf, -1); } else if (setting->type == PURPLE_PREF_STRING && setting->value.string != NULL) { @@ -119,7 +119,7 @@ } else if (setting->type == PURPLE_PREF_BOOLEAN) { xmlnode_set_attrib(child, "type", "bool"); - snprintf(buf, sizeof(buf), "%d", setting->value.boolean); + g_snprintf(buf, sizeof(buf), "%d", setting->value.boolean); xmlnode_insert_data(child, buf, -1); } } @@ -281,7 +281,7 @@ PurpleProxyType proxy_type; const char *value; int int_value; - char buf[20]; + char buf[21]; proxy_type = purple_proxy_info_get_type(proxy_info); @@ -304,7 +304,7 @@ if ((int_value = purple_proxy_info_get_port(proxy_info)) != 0) { - snprintf(buf, sizeof(buf), "%d", int_value); + g_snprintf(buf, sizeof(buf), "%d", int_value); child = xmlnode_new_child(node, "port"); xmlnode_insert_data(child, buf, -1); } @@ -342,7 +342,7 @@ return node; child = xmlnode_new_child(node, "type"); - snprintf(type_str, sizeof(type_str), "%u", err->type); + g_snprintf(type_str, sizeof(type_str), "%u", err->type); xmlnode_insert_data(child, type_str, -1); child = xmlnode_new_child(node, "description");
--- a/libpurple/blist.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/blist.c Mon May 18 19:54:24 2009 +0000 @@ -125,7 +125,7 @@ const char *name; PurpleValue *value; xmlnode *node, *child; - char buf[20]; + char buf[21]; name = (const char *)key; value = (PurpleValue *)hvalue; @@ -138,7 +138,7 @@ if (purple_value_get_type(value) == PURPLE_TYPE_INT) { xmlnode_set_attrib(child, "type", "int"); - snprintf(buf, sizeof(buf), "%d", purple_value_get_int(value)); + g_snprintf(buf, sizeof(buf), "%d", purple_value_get_int(value)); xmlnode_insert_data(child, buf, -1); } else if (purple_value_get_type(value) == PURPLE_TYPE_STRING) { @@ -147,7 +147,7 @@ } else if (purple_value_get_type(value) == PURPLE_TYPE_BOOLEAN) { xmlnode_set_attrib(child, "type", "bool"); - snprintf(buf, sizeof(buf), "%d", purple_value_get_boolean(value)); + g_snprintf(buf, sizeof(buf), "%d", purple_value_get_boolean(value)); xmlnode_insert_data(child, buf, -1); } } @@ -303,7 +303,7 @@ node = xmlnode_new("account"); xmlnode_set_attrib(node, "proto", purple_account_get_protocol_id(account)); xmlnode_set_attrib(node, "name", purple_account_get_username(account)); - snprintf(buf, sizeof(buf), "%d", account->perm_deny); + g_snprintf(buf, sizeof(buf), "%d", account->perm_deny); xmlnode_set_attrib(node, "mode", buf); for (cur = account->permit; cur; cur = cur->next) @@ -1468,6 +1468,9 @@ if (ops && ops->update) ops->update(purplebuddylist, (PurpleBlistNode *)cnode); + + purple_signal_emit(purple_blist_get_handle(), "blist-node-added", + cnode); } void purple_blist_add_buddy(PurpleBuddy *buddy, PurpleContact *contact, PurpleGroup *group, PurpleBlistNode *node) @@ -1615,6 +1618,9 @@ /* Signal that the buddy has been added */ purple_signal_emit(purple_blist_get_handle(), "buddy-added", buddy); + + purple_signal_emit(purple_blist_get_handle(), "blist-node-added", + PURPLE_BLIST_NODE(buddy)); } PurpleContact *purple_contact_new() @@ -1952,6 +1958,9 @@ for (node = gnode->child; node; node = node->next) ops->update(purplebuddylist, node); } + + purple_signal_emit(purple_blist_get_handle(), "blist-node-added", + gnode); } void purple_blist_remove_contact(PurpleContact *contact) @@ -1994,6 +2003,9 @@ if (ops && ops->remove) ops->remove(purplebuddylist, node); + purple_signal_emit(purple_blist_get_handle(), "blist-node-removed", + PURPLE_BLIST_NODE(contact)); + /* Delete the node */ purple_contact_destroy(contact); } @@ -2066,6 +2078,9 @@ /* Signal that the buddy has been removed before freeing the memory for it */ purple_signal_emit(purple_blist_get_handle(), "buddy-removed", buddy); + purple_signal_emit(purple_blist_get_handle(), "blist-node-removed", + PURPLE_BLIST_NODE(buddy)); + purple_buddy_destroy(buddy); /* If the contact is empty then remove it */ @@ -2109,6 +2124,9 @@ if (ops && ops->remove) ops->remove(purplebuddylist, node); + purple_signal_emit(purple_blist_get_handle(), "blist-node-removed", + PURPLE_BLIST_NODE(chat)); + /* Delete the node */ purple_chat_destroy(chat); } @@ -2141,6 +2159,9 @@ if (ops && ops->remove) ops->remove(purplebuddylist, node); + purple_signal_emit(purple_blist_get_handle(), "blist-node-removed", + PURPLE_BLIST_NODE(group)); + /* Remove the group from all accounts that are online */ for (l = purple_connections_get_all(); l != NULL; l = l->next) { @@ -2699,8 +2720,10 @@ static void purple_blist_node_destroy(PurpleBlistNode *node) { + PurpleBlistUiOps *ui_ops; PurpleBlistNode *child, *next_child; + ui_ops = purple_blist_get_ui_ops(); child = node->child; while (child) { next_child = child->next; @@ -2708,6 +2731,14 @@ child = next_child; } + /* Allow the UI to free data */ + node->parent = NULL; + node->child = NULL; + node->next = NULL; + node->prev = NULL; + if (ui_ops && ui_ops->remove) + ui_ops->remove(purplebuddylist, node); + if (PURPLE_BLIST_NODE_IS_BUDDY(node)) purple_buddy_destroy((PurpleBuddy*)node); else if (PURPLE_BLIST_NODE_IS_CHAT(node)) @@ -2973,6 +3004,16 @@ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_BLIST_BUDDY)); + purple_signal_register(handle, "blist-node-added", + purple_marshal_VOID__POINTER, NULL, 1, + purple_value_new(PURPLE_TYPE_SUBTYPE, + PURPLE_SUBTYPE_BLIST_NODE)); + + purple_signal_register(handle, "blist-node-removed", + purple_marshal_VOID__POINTER, NULL, 1, + purple_value_new(PURPLE_TYPE_SUBTYPE, + PURPLE_SUBTYPE_BLIST_NODE)); + purple_signal_register(handle, "buddy-added", purple_marshal_VOID__POINTER, NULL, 1, purple_value_new(PURPLE_TYPE_SUBTYPE, @@ -3018,6 +3059,10 @@ { PurpleBlistNode *node, *next_node; + /* This happens if we quit before purple_set_blist is called. */ + if (purplebuddylist == NULL) + return; + if (save_timer != 0) { purple_timeout_remove(save_timer); save_timer = 0;
--- a/libpurple/blist.h Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/blist.h Mon May 18 19:54:24 2009 +0000 @@ -260,8 +260,8 @@ PurpleBlistNode *purple_blist_get_root(void); /** - * Returns a list of every buddy in the list. The usage of this function - * is discourage if you do not actually need every buddy in the list. Use + * Returns a list of every buddy in the list. Use of this function is + * discouraged if you do not actually need every buddy in the list. Use * purple_find_buddies instead. * * @return A list of every buddy in the list. Caller is responsible for
--- a/libpurple/buddyicon.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/buddyicon.c Mon May 18 19:54:24 2009 +0000 @@ -753,6 +753,8 @@ } unref_filename(old_icon); + old_img = g_hash_table_lookup(pointer_icon_cache, account); + if (img) g_hash_table_insert(pointer_icon_cache, account, img); else @@ -770,7 +772,7 @@ prpl_info->set_buddy_icon(gc, img); } - if ((old_img = g_hash_table_lookup(pointer_icon_cache, account))) + if (old_img) purple_imgstore_unref(old_img); else if (old_icon) {
--- a/libpurple/dbus-analyze-functions.py Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/dbus-analyze-functions.py Mon May 18 19:54:24 2009 +0000 @@ -31,6 +31,15 @@ "purple_account_unregister", "purple_connection_new_unregister", + # These functions are excluded because they involve setting arbitrary + # data via pointers for protocols and UIs. This just won't work. + "purple_blist_get_ui_data", + "purple_blist_set_ui_data", + "purple_blist_node_get_ui_data", + "purple_blist_node_set_ui_data", + "purple_buddy_get_protocol_data", + "purple_buddy_set_protocol_data", + # This is excluded because this script treats PurpleLogReadFlags* # as pointer to a struct, instead of a pointer to an enum. This # causes a compilation error. Someone should fix this script.
--- a/libpurple/dnsquery.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/dnsquery.c Mon May 18 19:54:24 2009 +0000 @@ -325,7 +325,7 @@ return; already_done = TRUE; ppid = getppid(); - snprintf(s, sizeof(s), "/proc/%d/exe", ppid); + g_snprintf(s, sizeof(s), "/proc/%d/exe", ppid); n = readlink(s, e, sizeof(e)); if(n < 0) return;
--- a/libpurple/mime.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/mime.c Mon May 18 19:54:24 2009 +0000 @@ -403,7 +403,7 @@ char *b = (char *) buf; gsize n = len; - const char *bnd; + char *bnd; gsize bl; bnd = g_strdup_printf("--%s", boundary);
--- a/libpurple/network.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/network.c Mon May 18 19:54:24 2009 +0000 @@ -303,7 +303,7 @@ /* * Get a list of addresses on this machine. */ - snprintf(serv, sizeof(serv), "%hu", port); + g_snprintf(serv, sizeof(serv), "%hu", port); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_flags = AI_PASSIVE; hints.ai_family = AF_UNSPEC;
--- a/libpurple/plugins/perl/perl-handlers.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/plugins/perl/perl-handlers.c Mon May 18 19:54:24 2009 +0000 @@ -284,6 +284,8 @@ DATATYPE **copy_args; dSP; + PERL_SET_CONTEXT(my_perl); + SPAGAIN; ENTER; SAVETMPS; PUSHMARK(sp); @@ -364,7 +366,8 @@ break; case PURPLE_TYPE_STRING: - if (strcmp(*((char **)copy_args[i]), SvPVX(sv_args[i]))) { + if (!*((char **)copy_args[i]) || !SvPVX(sv_args[i]) || + strcmp(*((char **)copy_args[i]), SvPVX(sv_args[i]))) { g_free(*((char **)copy_args[i])); *((char **)copy_args[i]) = g_strdup(SvPVutf8_nolen(sv_args[i]));
--- a/libpurple/plugins/signals-test.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/plugins/signals-test.c Mon May 18 19:54:24 2009 +0000 @@ -145,16 +145,39 @@ } static void -buddy_added_cb(PurpleBuddy *buddy, void *data) +blist_node_added_cb(PurpleBlistNode *bnode, void *data) { - purple_debug_misc("signals test", "buddy_added_cb (%s)\n", - purple_buddy_get_name(buddy)); + const char *name; + if (PURPLE_BLIST_NODE_IS_GROUP(bnode)) + name = purple_group_get_name(PURPLE_GROUP(bnode)); + else if (PURPLE_BLIST_NODE_IS_CONTACT(bnode)) + /* Close enough */ + name = purple_contact_get_alias(PURPLE_CONTACT(bnode)); + else if (PURPLE_BLIST_NODE_IS_BUDDY(bnode)) + name = purple_buddy_get_name(PURPLE_BUDDY(bnode)); + else + name = "(unknown)"; + + purple_debug_misc("signals test", "blist_node_added_cb (%s)\n", + name ? name : "(null)"); } static void -buddy_removed_cb(PurpleBuddy *buddy, void *data) +blist_node_removed_cb(PurpleBlistNode *bnode, void *data) { - purple_debug_misc("signals test", "buddy_removed_cb (%s)\n", purple_buddy_get_name(buddy)); + const char *name; + if (PURPLE_BLIST_NODE_IS_GROUP(bnode)) + name = purple_group_get_name(PURPLE_GROUP(bnode)); + else if (PURPLE_BLIST_NODE_IS_CONTACT(bnode)) + /* Close enough */ + name = purple_contact_get_alias(PURPLE_CONTACT(bnode)); + else if (PURPLE_BLIST_NODE_IS_BUDDY(bnode)) + name = purple_buddy_get_name(PURPLE_BUDDY(bnode)); + else + name = "(unknown)"; + + purple_debug_misc("signals test", "blist_node_removed_cb (%s)\n", + name ? name : "(null)"); } static void @@ -643,10 +666,10 @@ plugin, PURPLE_CALLBACK(buddy_signed_on_cb), NULL); purple_signal_connect(blist_handle, "buddy-signed-off", plugin, PURPLE_CALLBACK(buddy_signed_off_cb), NULL); - purple_signal_connect(blist_handle, "buddy-added", - plugin, PURPLE_CALLBACK(buddy_added_cb), NULL); - purple_signal_connect(blist_handle, "buddy-removed", - plugin, PURPLE_CALLBACK(buddy_removed_cb), NULL); + purple_signal_connect(blist_handle, "blist-node-added", + plugin, PURPLE_CALLBACK(blist_node_added_cb), NULL); + purple_signal_connect(blist_handle, "blist-node-removed", + plugin, PURPLE_CALLBACK(blist_node_removed_cb), NULL); purple_signal_connect(blist_handle, "buddy-icon-changed", plugin, PURPLE_CALLBACK(buddy_icon_changed_cb), NULL); purple_signal_connect(blist_handle, "blist-node-aliased",
--- a/libpurple/prefs.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/prefs.c Mon May 18 19:54:24 2009 +0000 @@ -118,7 +118,7 @@ { xmlnode *node, *childnode; struct purple_pref *child; - char buf[20]; + char buf[21]; GList *cur; /* Create a new node */ @@ -128,7 +128,7 @@ /* Set the type of this node (if type == PURPLE_PREF_NONE then do nothing) */ if (pref->type == PURPLE_PREF_INT) { xmlnode_set_attrib(node, "type", "int"); - snprintf(buf, sizeof(buf), "%d", pref->value.integer); + g_snprintf(buf, sizeof(buf), "%d", pref->value.integer); xmlnode_set_attrib(node, "value", buf); } else if (pref->type == PURPLE_PREF_STRING) { @@ -161,7 +161,7 @@ } else if (pref->type == PURPLE_PREF_BOOLEAN) { xmlnode_set_attrib(node, "type", "bool"); - snprintf(buf, sizeof(buf), "%d", pref->value.boolean); + g_snprintf(buf, sizeof(buf), "%d", pref->value.boolean); xmlnode_set_attrib(node, "value", buf); }
--- a/libpurple/protocols/irc/msgs.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/irc/msgs.c Mon May 18 19:54:24 2009 +0000 @@ -1193,7 +1193,7 @@ if (!purple_utf8_strcasecmp(to, purple_connection_get_display_name(gc))) { serv_got_im(gc, nick, msg, 0, time(NULL)); } else { - convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, to, irc->account); + convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, irc_nick_skip_mode(irc, to), irc->account); if (convo) serv_got_chat_in(gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(convo)), nick, 0, msg, time(NULL)); else
--- a/libpurple/protocols/jabber/buddy.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/buddy.c Mon May 18 19:54:24 2009 +0000 @@ -50,6 +50,8 @@ int timeout_handle; GSList *vcard_imgids; PurpleNotifyUserInfo *user_info; + long last_seconds; + gchar *last_message; } JabberBuddyInfo; void jabber_buddy_free(JabberBuddy *jb) @@ -72,7 +74,7 @@ if (js->buddies == NULL) return NULL; - if(!(realname = jabber_normalize(js->gc->account, name))) + if(!(realname = jabber_get_bare_jid(name))) return NULL; jb = g_hash_table_lookup(js->buddies, realname); @@ -642,6 +644,7 @@ g_free(jbi->jid); g_hash_table_destroy(jbi->resources); + g_free(jbi->last_message); purple_notify_user_info_destroy(jbi->user_info); g_free(jbi); } @@ -852,6 +855,13 @@ jbr = resources->data; + /* put a section break between resources, this is not needed if + we are at the first, because one was already added for the vcard + section */ + if (resources != jbi->jb->resources) { + purple_notify_user_info_prepend_section_break(user_info); + } + if(jbr->client.name) { tmp = g_strdup_printf("%s%s%s", jbr->client.name, (jbr->client.version ? " " : ""), @@ -1032,6 +1042,24 @@ } } + if (!jbi->jb->resources) { + /* the buddy is offline */ + gchar *status = + g_strdup_printf("%s%s%s", _("Offline"), + jbi->last_message ? ": " : "", + jbi->last_message ? jbi->last_message : ""); + if (jbi->last_seconds > 0) { + char *last = purple_str_seconds_to_string(jbi->last_seconds); + gchar *message = g_strdup_printf(_("%s ago"), last); + purple_notify_user_info_prepend_pair(user_info, + _("Logged off"), message); + g_free(last); + g_free(message); + } + purple_notify_user_info_prepend_pair(user_info, _("Status"), status); + g_free(status); + } + g_free(resource_name); purple_notify_userinfo(jbi->js->gc, jbi->jid, user_info, NULL, NULL); @@ -1484,6 +1512,38 @@ jabber_buddy_info_show_if_ready(jbi); } +static void jabber_last_offline_parse(JabberStream *js, const char *from, + JabberIqType type, const char *id, + xmlnode *packet, gpointer data) +{ + JabberBuddyInfo *jbi = data; + xmlnode *query; + const char *seconds; + + g_return_if_fail(jbi != NULL); + + jabber_buddy_info_remove_id(jbi, id); + + if(!from) + return; + + if (type == JABBER_IQ_RESULT) { + if((query = xmlnode_get_child(packet, "query"))) { + seconds = xmlnode_get_attrib(query, "seconds"); + if(seconds) { + char *end = NULL; + long sec = strtol(seconds, &end, 10); + if(end != seconds) { + jbi->last_seconds = sec; + } + } + jbi->last_message = xmlnode_get_data(query); + } + } + + jabber_buddy_info_show_if_ready(jbi); +} + static void jabber_time_parse(JabberStream *js, const char *from, JabberIqType type, const char *id, xmlnode *packet, gpointer data) @@ -1681,6 +1741,15 @@ g_free(full_jid); } + if (!jb->resources && strchr(jid, '/') == NULL) { + /* user is offline, send a jabber:iq:last to find out last time online */ + iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:last"); + xmlnode_set_attrib(iq->node, "to", jid); + jabber_iq_set_callback(iq, jabber_last_offline_parse, jbi); + jbi->ids = g_slist_prepend(jbi->ids, g_strdup(iq->id)); + jabber_iq_send(iq); + } + js->pending_buddy_info_requests = g_slist_prepend(js->pending_buddy_info_requests, jbi); jbi->timeout_handle = purple_timeout_add_seconds(30, jabber_buddy_get_info_timeout, jbi); }
--- a/libpurple/protocols/jabber/buddy.h Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/buddy.h Mon May 18 19:54:24 2009 +0000 @@ -86,6 +86,7 @@ GList *exts; } caps; GList *commands; + gboolean commands_fetched; } JabberBuddyResource; void jabber_buddy_free(JabberBuddy *jb);
--- a/libpurple/protocols/jabber/caps.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/caps.c Mon May 18 19:54:24 2009 +0000 @@ -35,13 +35,7 @@ GList *values; } JabberDataFormField; -typedef struct _JabberCapsKey { - char *node; - char *ver; - char *hash; -} JabberCapsKey; - -static GHashTable *capstable = NULL; /* JabberCapsKey -> JabberCapsClientInfo */ +static GHashTable *capstable = NULL; /* JabberCapsTuple -> JabberCapsClientInfo */ static GHashTable *nodetable = NULL; /* char *node -> JabberCapsNodeExts */ static guint save_timer = 0; @@ -86,7 +80,7 @@ } static guint jabber_caps_hash(gconstpointer data) { - const JabberCapsKey *key = data; + const JabberCapsTuple *key = data; guint nodehash = g_str_hash(key->node); guint verhash = g_str_hash(key->ver); /* @@ -99,22 +93,14 @@ } static gboolean jabber_caps_compare(gconstpointer v1, gconstpointer v2) { - const JabberCapsKey *name1 = v1; - const JabberCapsKey *name2 = v2; + const JabberCapsTuple *name1 = v1; + const JabberCapsTuple *name2 = v2; return g_str_equal(name1->node, name2->node) && g_str_equal(name1->ver, name2->ver) && purple_strequal(name1->hash, name2->hash); } -void jabber_caps_destroy_key(gpointer data) { - JabberCapsKey *key = data; - g_free(key->node); - g_free(key->ver); - g_free(key->hash); - g_free(key); -} - static void jabber_caps_client_info_destroy(JabberCapsClientInfo *info) { @@ -132,10 +118,18 @@ } free_string_glist(info->features); - free_string_glist(info->forms); + + while (info->forms) { + xmlnode_free(info->forms->data); + info->forms = g_list_delete_link(info->forms, info->forms); + } jabber_caps_node_exts_unref(info->exts); + g_free((char *)info->tuple.node); + g_free((char *)info->tuple.ver); + g_free((char *)info->tuple.hash); + g_free(info); } @@ -172,16 +166,16 @@ } static void jabber_caps_store_client(gpointer key, gpointer value, gpointer user_data) { - JabberCapsKey *clientinfo = key; - JabberCapsClientInfo *props = value; + const JabberCapsTuple *tuple = key; + const JabberCapsClientInfo *props = value; xmlnode *root = user_data; xmlnode *client = xmlnode_new_child(root, "client"); GList *iter; - xmlnode_set_attrib(client, "node", clientinfo->node); - xmlnode_set_attrib(client, "ver", clientinfo->ver); - if (clientinfo->hash) - xmlnode_set_attrib(client, "hash", clientinfo->hash); + xmlnode_set_attrib(client, "node", tuple->node); + xmlnode_set_attrib(client, "ver", tuple->ver); + if (tuple->hash) + xmlnode_set_attrib(client, "hash", tuple->hash); for(iter = props->identities; iter; iter = g_list_next(iter)) { JabberIdentity *id = iter->data; xmlnode *identity = xmlnode_new_child(client, "identity"); @@ -251,8 +245,8 @@ if(client->type != XMLNODE_TYPE_TAG) continue; if(!strcmp(client->name, "client")) { - JabberCapsKey *key = g_new0(JabberCapsKey, 1); JabberCapsClientInfo *value = g_new0(JabberCapsClientInfo, 1); + JabberCapsTuple *key = (JabberCapsTuple*)&value->tuple; xmlnode *child; JabberCapsNodeExts *exts = NULL; key->node = g_strdup(xmlnode_get_attrib(client,"node")); @@ -286,10 +280,10 @@ id->type = g_strdup(type); id->name = g_strdup(name); id->lang = g_strdup(lang); - + value->identities = g_list_append(value->identities,id); } else if(!strcmp(child->name,"x")) { - /* FIXME: See #7814 -- this will cause problems if anyone + /* TODO: See #7814 -- this might cause problems if anyone * ever actually specifies forms. In fact, for this to * work properly, that bug needs to be fixed in * xmlnode_from_str, not the output version... */ @@ -336,7 +330,7 @@ void jabber_caps_init(void) { nodetable = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)jabber_caps_node_exts_unref); - capstable = g_hash_table_new_full(jabber_caps_hash, jabber_caps_compare, jabber_caps_destroy_key, (GDestroyNotify)jabber_caps_client_info_destroy); + capstable = g_hash_table_new_full(jabber_caps_hash, jabber_caps_compare, NULL, (GDestroyNotify)jabber_caps_client_info_destroy); jabber_caps_load(); } @@ -349,7 +343,29 @@ } g_hash_table_destroy(capstable); g_hash_table_destroy(nodetable); - capstable = NULL; + capstable = nodetable = NULL; +} + +gboolean jabber_caps_exts_known(const JabberCapsClientInfo *info, + char **exts) +{ + int i; + g_return_val_if_fail(info != NULL, FALSE); + + if (!exts) + return TRUE; + + for (i = 0; exts[i]; ++i) { + /* Hack since we advertise the ext along with v1.5 caps but don't + * store any exts */ + if (g_str_equal(exts[i], "voice-v1") && !info->exts) + continue; + if (!info->exts || + !g_hash_table_lookup(info->exts->exts, exts[i])) + return FALSE; + } + + return TRUE; } typedef struct _jabber_caps_cbplususerdata { @@ -425,7 +441,7 @@ "http://jabber.org/protocol/disco#info"); jabber_caps_cbplususerdata *userdata = data; JabberCapsClientInfo *info = NULL, *value; - JabberCapsKey key; + JabberCapsTuple key; if (!query || type == JABBER_IQ_ERROR) { /* Any outstanding exts will be dealt with via ref-counting */ @@ -477,7 +493,7 @@ jabber_caps_client_info_destroy(info); info = value; } else { - JabberCapsKey *n_key = g_new(JabberCapsKey, 1); + JabberCapsTuple *n_key = (JabberCapsTuple *)&info->tuple; n_key->node = userdata->node; n_key->ver = userdata->ver; n_key->hash = userdata->hash; @@ -545,16 +561,19 @@ } void jabber_caps_get_info(JabberStream *js, const char *who, const char *node, - const char *ver, const char *hash, const char *ext, + const char *ver, const char *hash, char **exts, jabber_caps_get_info_cb cb, gpointer user_data) { JabberCapsClientInfo *info; - JabberCapsKey key; + JabberCapsTuple key; jabber_caps_cbplususerdata *userdata; - if (ext && *ext && hash) + if (exts && hash) { purple_debug_info("jabber", "Ignoring exts in new-style caps from %s\n", who); + g_strfreev(exts); + exts = NULL; + } /* Using this in a read-only fashion, so the cast is OK */ key.node = (char *)node; @@ -603,9 +622,8 @@ } /* Are there any exts that we don't recognize? */ - if (ext && *ext && !hash) { + if (exts) { JabberCapsNodeExts *node_exts; - gchar **splat = g_strsplit(ext, " ", 0); int i; if (info) { @@ -617,23 +635,23 @@ /* We'll put it in later once we have the client info */ node_exts = userdata->node_exts = jabber_caps_find_exts_by_node(node); - for (i = 0; splat[i]; ++i) { - userdata->exts = g_list_prepend(userdata->exts, splat[i]); + for (i = 0; exts[i]; ++i) { + userdata->exts = g_list_prepend(userdata->exts, exts[i]); /* Look it up if we don't already know what it means */ - if (!g_hash_table_lookup(node_exts->exts, splat[i])) { + if (!g_hash_table_lookup(node_exts->exts, exts[i])) { JabberIq *iq; xmlnode *query; char *nodeext; ext_iq_data *cbdata = g_new(ext_iq_data, 1); - cbdata->name = splat[i]; + cbdata->name = exts[i]; cbdata->data = cbplususerdata_ref(userdata); iq = jabber_iq_new_query(js, JABBER_IQ_GET, "http://jabber.org/protocol/disco#info"); query = xmlnode_get_child_with_namespace(iq->node, "query", "http://jabber.org/protocol/disco#info"); - nodeext = g_strdup_printf("%s#%s", node, splat[i]); + nodeext = g_strdup_printf("%s#%s", node, exts[i]); xmlnode_set_attrib(query, "node", nodeext); g_free(nodeext); xmlnode_set_attrib(iq->node, "to", who); @@ -643,11 +661,11 @@ ++userdata->extOutstanding; } - splat[i] = NULL; + exts[i] = NULL; } /* All the strings are now part of the GList, so don't need * g_strfreev. */ - g_free(splat); + g_free(exts); } if (userdata->info && userdata->extOutstanding == 0) { @@ -794,9 +812,11 @@ } static GString* -jabber_caps_verification_append(GString *verification, const gchar *string) +jabber_caps_verification_append(GString *verification, const gchar *str) { - verification = g_string_append(verification, string); + char *tmp = g_markup_escape_text(str, -1); + verification = g_string_append(verification, tmp); + g_free(tmp); return g_string_append_c(verification, '<'); } @@ -822,9 +842,23 @@ /* concat identities to the verification string */ for (node = info->identities; node; node = node->next) { JabberIdentity *id = (JabberIdentity*)node->data; + char *category = g_markup_escape_text(id->category, -1); + char *type = g_markup_escape_text(id->type, -1); + char *lang = NULL; + char *name = NULL; + + if (id->lang) + lang = g_markup_escape_text(id->lang, -1); + if (id->name) + name = g_markup_escape_text(id->name, -1); - g_string_append_printf(verification, "%s/%s/%s/%s<", id->category, - id->type, id->lang ? id->lang : "", id->name); + g_string_append_printf(verification, "%s/%s/%s/%s<", category, + type, lang ? lang : "", name ? name : ""); + + g_free(category); + g_free(type); + g_free(lang); + g_free(name); } /* concat features to the verification string */
--- a/libpurple/protocols/jabber/caps.h Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/caps.h Mon May 18 19:54:24 2009 +0000 @@ -30,11 +30,19 @@ typedef struct _JabberCapsNodeExts JabberCapsNodeExts; +typedef struct _JabberCapsTuple { + const char *node; + const char *ver; + const char *hash; +} JabberCapsTuple; + struct _JabberCapsClientInfo { GList *identities; /* JabberIdentity */ GList *features; /* char * */ GList *forms; /* xmlnode * */ JabberCapsNodeExts *exts; + + const JabberCapsTuple tuple; }; /* @@ -60,7 +68,10 @@ void jabber_caps_init(void); void jabber_caps_uninit(void); -void jabber_caps_destroy_key(gpointer value); +/** + * Check whether all of the exts in a char* array are known to the given info. + */ +gboolean jabber_caps_exts_known(const JabberCapsClientInfo *info, char **exts); /** * Main entity capabilites function to get the capabilities of a contact. @@ -68,10 +79,13 @@ * The callback will be called synchronously if we already have the * capabilities for the specified (node,ver,hash) (and, if exts are specified, * if we know what each means) + * + * @param exts A g_strsplit'd (NULL-terminated) array of strings. This + * function is responsible for freeing it. */ void jabber_caps_get_info(JabberStream *js, const char *who, const char *node, const char *ver, const char *hash, - const char *ext, jabber_caps_get_info_cb cb, + char **exts, jabber_caps_get_info_cb cb, gpointer user_data); /**
--- a/libpurple/protocols/jabber/chat.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/chat.c Mon May 18 19:54:24 2009 +0000 @@ -916,6 +916,68 @@ return TRUE; } +static void +jabber_chat_affiliation_list_cb(JabberStream *js, const char *from, + JabberIqType type, const char *id, + xmlnode *packet, gpointer data) +{ + JabberChat *chat; + xmlnode *query, *item; + int chat_id = GPOINTER_TO_INT(data); + GString *buf; + + if(!(chat = jabber_chat_find_by_id(js, chat_id))) + return; + + if (type == JABBER_IQ_ERROR) + return; + + if(!(query = xmlnode_get_child(packet, "query"))) + return; + + buf = g_string_new(_("Affiliations:")); + + item = xmlnode_get_child(query, "item"); + if (item) { + for( ; item; item = xmlnode_get_next_twin(item)) { + const char *jid = xmlnode_get_attrib(item, "jid"); + const char *affiliation = xmlnode_get_attrib(item, "affiliation"); + if (jid && affiliation) + g_string_append_printf(buf, "\n%s %s", jid, affiliation); + } + } else { + buf = g_string_append_c(buf, '\n'); + buf = g_string_append_len(buf, _("No users found"), -1); + } + + purple_conv_chat_write(PURPLE_CONV_CHAT(chat->conv), "", buf->str, + PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG, time(NULL)); + + g_string_free(buf, TRUE); +} + +gboolean jabber_chat_affiliation_list(JabberChat *chat, const char *affiliation) +{ + JabberIq *iq; + char *room_jid; + xmlnode *query, *item; + + iq = jabber_iq_new_query(chat->js, JABBER_IQ_GET, + "http://jabber.org/protocol/muc#admin"); + + room_jid = g_strdup_printf("%s@%s", chat->room, chat->server); + xmlnode_set_attrib(iq->node, "to", room_jid); + + query = xmlnode_get_child(iq->node, "query"); + item = xmlnode_new_child(query, "item"); + xmlnode_set_attrib(item, "affiliation", affiliation); + + jabber_iq_set_callback(iq, jabber_chat_affiliation_list_cb, GINT_TO_POINTER(chat->id)); + jabber_iq_send(iq); + + return TRUE; +} + gboolean jabber_chat_role_user(JabberChat *chat, const char *who, const char *role) { char *to; @@ -945,6 +1007,67 @@ return TRUE; } +static void jabber_chat_role_list_cb(JabberStream *js, const char *from, + JabberIqType type, const char *id, + xmlnode *packet, gpointer data) +{ + JabberChat *chat; + xmlnode *query, *item; + int chat_id = GPOINTER_TO_INT(data); + GString *buf; + + if(!(chat = jabber_chat_find_by_id(js, chat_id))) + return; + + if (type == JABBER_IQ_ERROR) + return; + + if(!(query = xmlnode_get_child(packet, "query"))) + return; + + buf = g_string_new(_("Roles:")); + + item = xmlnode_get_child(query, "item"); + if (item) { + for( ; item; item = xmlnode_get_next_twin(item)) { + const char *jid = xmlnode_get_attrib(item, "jid"); + const char *role = xmlnode_get_attrib(item, "role"); + if (jid && role) + g_string_append_printf(buf, "\n%s %s", jid, role); + } + } else { + buf = g_string_append_c(buf, '\n'); + buf = g_string_append_len(buf, _("No users found"), -1); + } + + purple_conv_chat_write(PURPLE_CONV_CHAT(chat->conv), "", buf->str, + PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG, time(NULL)); + + g_string_free(buf, TRUE); +} + +gboolean jabber_chat_role_list(JabberChat *chat, const char *role) +{ + JabberIq *iq; + char *room_jid; + xmlnode *query, *item; + + iq = jabber_iq_new_query(chat->js, JABBER_IQ_GET, + "http://jabber.org/protocol/muc#admin"); + + room_jid = g_strdup_printf("%s@%s", chat->room, chat->server); + xmlnode_set_attrib(iq->node, "to", room_jid); + + query = xmlnode_get_child(iq->node, "query"); + item = xmlnode_new_child(query, "item"); + xmlnode_set_attrib(item, "role", role); + + jabber_iq_set_callback(iq, jabber_chat_role_list_cb, GINT_TO_POINTER(chat->id)); + jabber_iq_send(iq); + + return TRUE; +} + gboolean jabber_chat_kick_user(JabberChat *chat, const char *who, const char *why) { JabberIq *iq; @@ -1039,5 +1162,59 @@ g_free(room_jid); } +typedef struct { + const gchar *cap; + gboolean *all_support; + JabberBuddy *jb; +} JabberChatCapsData; +static void +jabber_chat_all_participants_have_capability_foreach(gpointer key, + gpointer value, + gpointer user_data) +{ + const gchar *cap = ((JabberChatCapsData *) user_data)->cap; + gboolean *all_support = ((JabberChatCapsData *) user_data)->all_support; + JabberBuddy *jb = ((JabberChatCapsData *) user_data)->jb; + JabberChatMember *member = (JabberChatMember *) value; + const gchar *resource = member->handle; + JabberBuddyResource *jbr = jabber_buddy_find_resource(jb, resource); + if (jbr) { + *all_support &= jabber_resource_has_capability(jbr, cap); + } else { + *all_support = FALSE; + } +} + +gboolean +jabber_chat_all_participants_have_capability(const JabberChat *chat, + const gchar *cap) +{ + gchar *chat_jid = NULL; + JabberBuddy *jb = NULL; + gboolean all_support = TRUE; + JabberChatCapsData data; + + chat_jid = g_strdup_printf("%s@%s", chat->room, chat->server); + jb = jabber_buddy_find(chat->js, chat_jid, FALSE); + + if (jb) { + data.cap = cap; + data.all_support = &all_support; + data.jb = jb; + + g_hash_table_foreach(chat->members, + jabber_chat_all_participants_have_capability_foreach, &data); + } else { + all_support = FALSE; + } + g_free(chat_jid); + return all_support; +} + +guint +jabber_chat_get_num_participants(const JabberChat *chat) +{ + return g_hash_table_size(chat->members); +}
--- a/libpurple/protocols/jabber/chat.h Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/chat.h Mon May 18 19:54:24 2009 +0000 @@ -81,8 +81,10 @@ const char *why); gboolean jabber_chat_affiliate_user(JabberChat *chat, const char *who, const char *affiliation); +gboolean jabber_chat_affiliation_list(JabberChat *chat, const char *affiliation); gboolean jabber_chat_role_user(JabberChat *chat, const char *who, const char *role); +gboolean jabber_chat_role_list(JabberChat *chat, const char *role); gboolean jabber_chat_kick_user(JabberChat *chat, const char *who, const char *why); @@ -93,5 +95,8 @@ char *jabber_roomlist_room_serialize(PurpleRoomlistRoom *room); +gboolean jabber_chat_all_participants_have_capability(const JabberChat *chat, + const gchar *cap); +guint jabber_chat_get_num_participants(const JabberChat *chat); #endif /* PURPLE_JABBER_CHAT_H_ */
--- a/libpurple/protocols/jabber/disco.h Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/disco.h Mon May 18 19:54:24 2009 +0000 @@ -1,5 +1,5 @@ /** - * @file iq.h JabberID handlers + * @file disco.h service discovery handlers * * purple *
--- a/libpurple/protocols/jabber/google.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/google.c Mon May 18 19:54:24 2009 +0000 @@ -638,7 +638,6 @@ const char *to, *url; const char *in_str; char *to_name; - char *default_tos[1]; int i, count = 1, returned_count; @@ -658,14 +657,20 @@ /* If Gmail doesn't tell us who the mail is to, let's use our JID */ to = xmlnode_get_attrib(packet, "to"); - default_tos[0] = jabber_get_bare_jid(to); message = xmlnode_get_child(child, "mail-thread-info"); if (count == 0 || !message) { - if (count > 0) - purple_notify_emails(js->gc, count, FALSE, NULL, NULL, (const char**) default_tos, NULL, NULL, NULL); - g_free(default_tos[0]); + if (count > 0) { + char *bare_jid = jabber_get_bare_jid(to); + const char *default_tos[2] = { bare_jid }; + + purple_notify_emails(js->gc, count, FALSE, NULL, NULL, default_tos, NULL, NULL, NULL); + g_free(bare_jid); + } else { + purple_notify_emails(js->gc, count, FALSE, NULL, NULL, NULL, NULL, NULL, NULL); + } + return; } @@ -673,10 +678,10 @@ * accordingly */ for (returned_count = 0; message; returned_count++, message=xmlnode_get_next_twin(message)); - froms = g_new0(const char* , returned_count); - tos = g_new0(const char* , returned_count); - subjects = g_new0(char* , returned_count); - urls = g_new0(const char* , returned_count); + froms = g_new0(const char* , returned_count + 1); + tos = g_new0(const char* , returned_count + 1); + subjects = g_new0(char* , returned_count + 1); + urls = g_new0(const char* , returned_count + 1); to = xmlnode_get_attrib(packet, "to"); to_name = jabber_get_bare_jid(to); @@ -726,16 +731,12 @@ if (i>0) purple_notify_emails(js->gc, count, count == i, (const char**) subjects, froms, tos, urls, NULL, NULL); - else - purple_notify_emails(js->gc, count, FALSE, NULL, NULL, (const char**) default_tos, NULL, NULL, NULL); - g_free(to_name); g_free(tos); - g_free(default_tos[0]); g_free(froms); - for (; i > 0; i--) - g_free(subjects[i - 1]); + for (i = 0; i < returned_count; i++) + g_free(subjects[i]); g_free(subjects); g_free(urls); @@ -761,6 +762,13 @@ if (type != JABBER_IQ_SET) return; + /* Acknowledge the notification */ + iq = jabber_iq_new(js, JABBER_IQ_RESULT); + if (from) + xmlnode_set_attrib(iq->node, "to", from); + xmlnode_set_attrib(iq->node, "id", id); + jabber_iq_send(iq); + purple_debug(PURPLE_DEBUG_MISC, "jabber", "Got new mail notification. Sending request for more info\n");
--- a/libpurple/protocols/jabber/ibb.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/ibb.c Mon May 18 19:54:24 2009 +0000 @@ -503,6 +503,8 @@ { jabber_ibb_sessions = g_hash_table_new(g_str_hash, g_str_equal); + jabber_add_feature(XEP_0047_NAMESPACE, NULL); + jabber_iq_register_handler("close", XEP_0047_NAMESPACE, jabber_ibb_parse); jabber_iq_register_handler("data", XEP_0047_NAMESPACE, jabber_ibb_parse); jabber_iq_register_handler("open", XEP_0047_NAMESPACE, jabber_ibb_parse);
--- a/libpurple/protocols/jabber/iq.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/iq.c Mon May 18 19:54:24 2009 +0000 @@ -42,7 +42,7 @@ #endif GHashTable *iq_handlers = NULL; - +GHashTable *signal_iq_handlers = NULL; JabberIq *jabber_iq_new(JabberStream *js, JabberIqType type) { @@ -289,6 +289,16 @@ const char *xmlns; const char *iq_type, *id, *from; JabberIqType type = JABBER_IQ_NONE; + gboolean signal_return; + + from = xmlnode_get_attrib(packet, "from"); + id = xmlnode_get_attrib(packet, "id"); + iq_type = xmlnode_get_attrib(packet, "type"); + + signal_return = GPOINTER_TO_INT(purple_signal_emit_return_1(jabber_plugin, + "jabber-receiving-iq", js->gc, iq_type, id, from, packet)); + if (signal_return) + return; /* * child will be either the first tag child or NULL if there is no child. @@ -301,10 +311,6 @@ break; } - iq_type = xmlnode_get_attrib(packet, "type"); - from = xmlnode_get_attrib(packet, "from"); - id = xmlnode_get_attrib(packet, "id"); - if (iq_type) { if (!strcmp(iq_type, "get")) type = JABBER_IQ_GET; @@ -361,12 +367,23 @@ } } - /* Apparently not, so lets see if we have a pre-defined handler */ + /* + * Apparently not, so let's see if we have a pre-defined handler + * or if an outside plugin is interested. + */ if(child && (xmlns = xmlnode_get_namespace(child))) { char *key = g_strdup_printf("%s %s", child->name, xmlns); JabberIqHandler *jih = g_hash_table_lookup(iq_handlers, key); + int signal_ref = GPOINTER_TO_INT(g_hash_table_lookup(signal_iq_handlers, key)); g_free(key); + if (signal_ref > 0) { + signal_return = GPOINTER_TO_INT(purple_signal_emit_return_1(jabber_plugin, "jabber-watched-iq", + js->gc, iq_type, id, from, child)); + if (signal_return) + return; + } + if(jih) { jih(js, from, type, id, child); return; @@ -408,9 +425,48 @@ g_hash_table_replace(iq_handlers, key, handlerfunc); } +void jabber_iq_signal_register(const gchar *node, const gchar *xmlns) +{ + gchar *key; + int ref; + + g_return_if_fail(node != NULL && *node != '\0'); + g_return_if_fail(xmlns != NULL && *xmlns != '\0'); + + key = g_strdup_printf("%s %s", node, xmlns); + ref = GPOINTER_TO_INT(g_hash_table_lookup(signal_iq_handlers, key)); + if (ref == 0) { + g_hash_table_insert(signal_iq_handlers, key, GINT_TO_POINTER(1)); + } else { + g_hash_table_insert(signal_iq_handlers, key, GINT_TO_POINTER(ref + 1)); + g_free(key); + } +} + +void jabber_iq_signal_unregister(const gchar *node, const gchar *xmlns) +{ + gchar *key; + int ref; + + g_return_if_fail(node != NULL && *node != '\0'); + g_return_if_fail(xmlns != NULL && *xmlns != '\0'); + + key = g_strdup_printf("%s %s", node, xmlns); + ref = GPOINTER_TO_INT(g_hash_table_lookup(signal_iq_handlers, key)); + + if (ref == 1) { + g_hash_table_remove(signal_iq_handlers, key); + } else if (ref > 1) { + g_hash_table_insert(signal_iq_handlers, key, GINT_TO_POINTER(ref - 1)); + } + + g_free(key); +} + void jabber_iq_init(void) { iq_handlers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); + signal_iq_handlers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); jabber_iq_register_handler("jingle", JINGLE, jingle_parse); jabber_iq_register_handler("mailbox", "google:mail:notify", @@ -446,5 +502,6 @@ void jabber_iq_uninit(void) { g_hash_table_destroy(iq_handlers); - iq_handlers = NULL; + g_hash_table_destroy(signal_iq_handlers); + iq_handlers = signal_iq_handlers = NULL; }
--- a/libpurple/protocols/jabber/iq.h Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/iq.h Mon May 18 19:54:24 2009 +0000 @@ -31,6 +31,7 @@ } JabberIqType; #include "jabber.h" +#include "connection.h" typedef struct _JabberIq JabberIq; @@ -106,4 +107,8 @@ void jabber_iq_register_handler(const char *node, const char *xmlns, JabberIqHandler *func); +/* Connected to namespace-handler registration signals */ +void jabber_iq_signal_register(const gchar *node, const gchar *xmlns); +void jabber_iq_signal_unregister(const gchar *node, const gchar *xmlns); + #endif /* PURPLE_JABBER_IQ_H_ */
--- a/libpurple/protocols/jabber/jabber.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.c Mon May 18 19:54:24 2009 +0000 @@ -70,6 +70,7 @@ static PurplePlugin *my_protocol = NULL; GList *jabber_features = NULL; GList *jabber_identities = NULL; +GSList *jabber_cmds = NULL; static void jabber_unregister_account_cb(JabberStream *js); static void try_srv_connect(JabberStream *js); @@ -383,6 +384,11 @@ char *data_start, *tag_end = strchr(tag_start, '>'); text = g_strdup(data); + /* Better to print out some wacky debugging than crash + * due to a plugin sending bad xml */ + if (tag_end == NULL) + tag_end = tag_start; + data_start = text + (tag_end - data) + 1; last_part = strchr(data_start, '<'); @@ -2585,21 +2591,32 @@ { JabberChat *chat = jabber_chat_find_by_conv(conv); - if (!chat || !args || !args[0] || !args[1]) + if (!chat || !args || !args[0]) return PURPLE_CMD_RET_FAILED; - if (strcmp(args[1], "owner") != 0 && - strcmp(args[1], "admin") != 0 && - strcmp(args[1], "member") != 0 && - strcmp(args[1], "outcast") != 0 && - strcmp(args[1], "none") != 0) { - *error = g_strdup_printf(_("Unknown affiliation: \"%s\""), args[1]); + if (strcmp(args[0], "owner") != 0 && + strcmp(args[0], "admin") != 0 && + strcmp(args[0], "member") != 0 && + strcmp(args[0], "outcast") != 0 && + strcmp(args[0], "none") != 0) { + *error = g_strdup_printf(_("Unknown affiliation: \"%s\""), args[0]); return PURPLE_CMD_RET_FAILED; } - if (!jabber_chat_affiliate_user(chat, args[0], args[1])) { - *error = g_strdup_printf(_("Unable to affiliate user %s as \"%s\""), args[0], args[1]); - return PURPLE_CMD_RET_FAILED; + if (args[1]) { + int i; + char **nicks = g_strsplit(args[1], " ", -1); + + for (i = 0; nicks[i]; ++i) + if (!jabber_chat_affiliate_user(chat, nicks[i], args[0])) { + *error = g_strdup_printf(_("Unable to affiliate user %s as \"%s\""), nicks[i], args[0]); + g_strfreev(nicks); + return PURPLE_CMD_RET_FAILED; + } + + g_strfreev(nicks); + } else { + jabber_chat_affiliation_list(chat, args[0]); } return PURPLE_CMD_RET_OK; @@ -2610,23 +2627,32 @@ { JabberChat *chat = jabber_chat_find_by_conv(conv); - if (!chat || !args || !args[0] || !args[1]) + if (!chat || !args || !args[0]) return PURPLE_CMD_RET_FAILED; - if (strcmp(args[1], "moderator") != 0 && - strcmp(args[1], "participant") != 0 && - strcmp(args[1], "visitor") != 0 && - strcmp(args[1], "none") != 0) { - *error = g_strdup_printf(_("Unknown role: \"%s\""), args[1]); + if (strcmp(args[0], "moderator") != 0 && + strcmp(args[0], "participant") != 0 && + strcmp(args[0], "visitor") != 0 && + strcmp(args[0], "none") != 0) { + *error = g_strdup_printf(_("Unknown role: \"%s\""), args[0]); return PURPLE_CMD_RET_FAILED; } - if (!jabber_chat_role_user(chat, args[0], args[1])) { - *error = g_strdup_printf(_("Unable to set role \"%s\" for user: %s"), - args[1], args[0]); - return PURPLE_CMD_RET_FAILED; + if (args[1]) { + int i; + char **nicks = g_strsplit(args[1], " ", -1); + + for (i = 0; nicks[i]; i++) + if (!jabber_chat_role_user(chat, nicks[i], args[0])) { + *error = g_strdup_printf(_("Unable to set role \"%s\" for user: %s"), + args[0], nicks[i]); + return PURPLE_CMD_RET_FAILED; + } + + g_strfreev(nicks); + } else { + jabber_chat_role_list(chat, args[0]); } - return PURPLE_CMD_RET_OK; } @@ -3134,89 +3160,126 @@ void jabber_register_commands(void) { - purple_cmd_register("config", "", PURPLE_CMD_P_PRPL, + PurpleCmdId id; + id = purple_cmd_register("config", "", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY, "prpl-jabber", jabber_cmd_chat_config, _("config: Configure a chat room."), NULL); - purple_cmd_register("configure", "", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("configure", "", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY, "prpl-jabber", jabber_cmd_chat_config, _("configure: Configure a chat room."), NULL); - purple_cmd_register("nick", "s", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("nick", "s", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY, "prpl-jabber", jabber_cmd_chat_nick, _("nick <new nickname>: Change your nickname."), NULL); - purple_cmd_register("part", "s", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("part", "s", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_part, _("part [room]: Leave the room."), NULL); - purple_cmd_register("register", "", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("register", "", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY, "prpl-jabber", jabber_cmd_chat_register, _("register: Register with a chat room."), NULL); + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + /* XXX: there needs to be a core /topic cmd, methinks */ - purple_cmd_register("topic", "s", PURPLE_CMD_P_PRPL, + id = purple_cmd_register("topic", "s", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_topic, _("topic [new topic]: View or change the topic."), NULL); - purple_cmd_register("ban", "ws", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("ban", "ws", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_ban, _("ban <user> [reason]: Ban a user from the room."), NULL); - purple_cmd_register("affiliate", "ws", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("affiliate", "ws", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_affiliate, - _("affiliate <user> <owner|admin|member|outcast|none>: Set a user's affiliation with the room."), + _("affiliate <owner|admin|member|outcast|none> [nick1] [nick2] ...: Get the users with an affiliation or set users' affiliation with the room."), NULL); - purple_cmd_register("role", "ws", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("role", "ws", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_role, - _("role <user> <moderator|participant|visitor|none>: Set a user's role in the room."), + _("role <moderator|participant|visitor|none> [nick1] [nick2] ...: Get the users with an role or set users' role with the room."), NULL); - purple_cmd_register("invite", "ws", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("invite", "ws", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_invite, _("invite <user> [message]: Invite a user to the room."), NULL); - purple_cmd_register("join", "ws", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("join", "ws", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_join, _("join: <room> [password]: Join a chat on this server."), NULL); - purple_cmd_register("kick", "ws", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("kick", "ws", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_kick, _("kick <user> [reason]: Kick a user from the room."), NULL); - purple_cmd_register("msg", "ws", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("msg", "ws", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY, "prpl-jabber", jabber_cmd_chat_msg, _("msg <user> <message>: Send a private message to another user."), NULL); - purple_cmd_register("ping", "w", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("ping", "w", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY, "prpl-jabber", jabber_cmd_ping, _("ping <jid>: Ping a user/component/server."), NULL); - purple_cmd_register("buzz", "w", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("buzz", "w", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_buzz, _("buzz: Buzz a user to get their attention"), NULL); } +void jabber_unregister_commands(void) +{ + while (jabber_cmds != NULL) { + purple_cmd_unregister(GPOINTER_TO_UINT(jabber_cmds->data)); + jabber_cmds = g_slist_delete_link(jabber_cmds, jabber_cmds); + } +} + /* IPC functions */ /** @@ -3292,6 +3355,12 @@ jabber_add_feature("http://jabber.org/protocol/xhtml-im", 0); jabber_add_feature("urn:xmpp:ping", 0); + /* Buzz/Attention */ + jabber_add_feature(XEP_0224_NAMESPACE, jabber_buzz_isenabled); + + /* Bits Of Binary */ + jabber_add_feature(XEP_0231_NAMESPACE, 0); + /* Jingle features! */ jabber_add_feature(JINGLE, 0); jabber_add_feature(JINGLE_TRANSPORT_RAWUDP, 0); @@ -3311,6 +3380,7 @@ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_ACCOUNT), purple_value_new(PURPLE_TYPE_STRING), purple_value_new(PURPLE_TYPE_STRING)); + purple_plugin_ipc_register(plugin, "add_feature", PURPLE_CALLBACK(jabber_ipc_add_feature), purple_marshal_VOID__POINTER, NULL, 1, @@ -3320,6 +3390,8 @@ void jabber_uninit_plugin(void) { + purple_plugin_ipc_unregister_all(jabber_plugin); + jabber_features_destroy(); jabber_identities_destroy(); }
--- a/libpurple/protocols/jabber/jabber.h Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.h Mon May 18 19:54:24 2009 +0000 @@ -75,6 +75,8 @@ /* Index into attention_types list */ #define JABBER_BUZZ 0 +PurplePlugin *jabber_plugin; + typedef enum { JABBER_STREAM_OFFLINE, JABBER_STREAM_CONNECTING, @@ -366,6 +368,7 @@ PurpleMediaCaps jabber_get_media_caps(PurpleAccount *account, const char *who); void jabber_register_commands(void); +void jabber_unregister_commands(void); void jabber_init_plugin(PurplePlugin *plugin); void jabber_uninit_plugin(void);
--- a/libpurple/protocols/jabber/jutil.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/jutil.c Mon May 18 19:54:24 2009 +0000 @@ -105,6 +105,8 @@ { char *at; char *slash; + char *node = NULL; + char *domain; JabberID *jid; if(!str || !g_utf8_validate(str, -1, NULL)) @@ -116,22 +118,31 @@ slash = g_utf8_strchr(str, -1, '/'); if(at) { - jid->node = g_utf8_normalize(str, at-str, G_NORMALIZE_NFKC); + node = g_utf8_normalize(str, at-str, G_NORMALIZE_NFKC); if(slash) { - jid->domain = g_utf8_normalize(at+1, slash-(at+1), G_NORMALIZE_NFKC); + domain = g_utf8_normalize(at+1, slash-(at+1), G_NORMALIZE_NFKC); jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC); } else { - jid->domain = g_utf8_normalize(at+1, -1, G_NORMALIZE_NFKC); + domain = g_utf8_normalize(at+1, -1, G_NORMALIZE_NFKC); } } else { if(slash) { - jid->domain = g_utf8_normalize(str, slash-str, G_NORMALIZE_NFKC); + domain = g_utf8_normalize(str, slash-str, G_NORMALIZE_NFKC); jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC); } else { - jid->domain = g_utf8_normalize(str, -1, G_NORMALIZE_NFKC); + domain = g_utf8_normalize(str, -1, G_NORMALIZE_NFKC); } } + if (node) { + jid->node = g_utf8_strdown(node, -1); + g_free(node); + } + + if (domain) { + jid->domain = g_utf8_strdown(domain, -1); + g_free(domain); + } if(!jabber_nodeprep_validate(jid->node) || !jabber_nameprep_validate(jid->domain) || @@ -193,28 +204,21 @@ JabberStream *js = gc ? gc->proto_data : NULL; static char buf[3072]; /* maximum legal length of a jabber jid */ JabberID *jid; - char *node, *domain; jid = jabber_id_new(in); if(!jid) return NULL; - node = jid->node ? g_utf8_strdown(jid->node, -1) : NULL; - domain = g_utf8_strdown(jid->domain, -1); - - - if(js && node && jid->resource && - jabber_chat_find(js, node, domain)) - g_snprintf(buf, sizeof(buf), "%s@%s/%s", node, domain, + if(js && jid->node && jid->resource && + jabber_chat_find(js, jid->node, jid->domain)) + g_snprintf(buf, sizeof(buf), "%s@%s/%s", jid->node, jid->domain, jid->resource); else - g_snprintf(buf, sizeof(buf), "%s%s%s", node ? node : "", - node ? "@" : "", domain); + g_snprintf(buf, sizeof(buf), "%s%s%s", jid->node ? jid->node : "", + jid->node ? "@" : "", jid->domain); jabber_id_free(jid); - g_free(node); - g_free(domain); return buf; }
--- a/libpurple/protocols/jabber/libxmpp.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/libxmpp.c Mon May 18 19:54:24 2009 +0000 @@ -46,6 +46,8 @@ #include "data.h" #include "ibb.h" +PurplePlugin *jabber_plugin = NULL; + static PurplePluginProtocolInfo prpl_info = { OPT_PROTO_CHAT_TOPIC | OPT_PROTO_UNIQUE_CHATNAME | OPT_PROTO_MAIL_CHECK | @@ -125,6 +127,8 @@ static gboolean load_plugin(PurplePlugin *plugin) { + jabber_plugin = plugin; + purple_signal_register(plugin, "jabber-receiving-xmlnode", purple_marshal_VOID__POINTER_POINTER, NULL, 2, purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION), @@ -140,16 +144,65 @@ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION), purple_value_new_outgoing(PURPLE_TYPE_STRING)); + purple_signal_register(plugin, "jabber-receiving-message", + purple_marshal_BOOLEAN__POINTER_POINTER_POINTER, + purple_value_new(PURPLE_TYPE_BOOLEAN), 6, + purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION), + purple_value_new(PURPLE_TYPE_STRING), /* type */ + purple_value_new(PURPLE_TYPE_STRING), /* id */ + purple_value_new(PURPLE_TYPE_STRING), /* from */ + purple_value_new(PURPLE_TYPE_STRING), /* to */ + purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE)); + + purple_signal_register(plugin, "jabber-receiving-iq", + purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER, + purple_value_new(PURPLE_TYPE_BOOLEAN), 5, + purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION), + purple_value_new(PURPLE_TYPE_STRING), /* type */ + purple_value_new(PURPLE_TYPE_STRING), /* id */ + purple_value_new(PURPLE_TYPE_STRING), /* from */ + purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE)); + + purple_signal_register(plugin, "jabber-watched-iq", + purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER, + purple_value_new(PURPLE_TYPE_BOOLEAN), 5, + purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION), + purple_value_new(PURPLE_TYPE_STRING), /* type */ + purple_value_new(PURPLE_TYPE_STRING), /* id */ + purple_value_new(PURPLE_TYPE_STRING), /* from */ + purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE)); /* child */ + + purple_signal_register(plugin, "jabber-register-namespace-watcher", + purple_marshal_VOID__POINTER_POINTER_POINTER, + NULL, 2, + purple_value_new(PURPLE_TYPE_STRING), /* node */ + purple_value_new(PURPLE_TYPE_STRING)); /* namespace */ + + purple_signal_register(plugin, "jabber-unregister-namespace-watcher", + purple_marshal_VOID__POINTER_POINTER_POINTER, + NULL, 2, + purple_value_new(PURPLE_TYPE_STRING), /* node */ + purple_value_new(PURPLE_TYPE_STRING)); /* namespace */ + + purple_signal_connect(plugin, "jabber-register-namespace-watcher", + plugin, PURPLE_CALLBACK(jabber_iq_signal_register), NULL); + purple_signal_connect(plugin, "jabber-unregister-namespace-watcher", + plugin, PURPLE_CALLBACK(jabber_iq_signal_unregister), NULL); + + purple_signal_register(plugin, "jabber-receiving-presence", + purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER, + purple_value_new(PURPLE_TYPE_BOOLEAN), 4, + purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION), + purple_value_new(PURPLE_TYPE_STRING), /* type */ + purple_value_new(PURPLE_TYPE_STRING), /* from */ + purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE)); + return TRUE; } static gboolean unload_plugin(PurplePlugin *plugin) { - purple_signal_unregister(plugin, "jabber-receiving-xmlnode"); - - purple_signal_unregister(plugin, "jabber-sending-xmlnode"); - - purple_signal_unregister(plugin, "jabber-sending-text"); + purple_signals_unregister_by_instance(plugin); /* reverse order of init_plugin */ jabber_bosh_uninit(); @@ -161,9 +214,13 @@ jabber_caps_uninit(); jabber_iq_uninit(); + jabber_unregister_commands(); + /* Stay on target...stay on target... Almost there... */ jabber_uninit_plugin(); + jabber_plugin = NULL; + return TRUE; } @@ -251,8 +308,9 @@ option = purple_account_option_string_new(_("File transfer proxies"), "ft_proxies", - /* TODO: Is this an acceptable default? */ - "proxy.jabber.org"); + /* TODO: Is this an acceptable default? + * Also, keep this in sync as they add more servers */ + "proxy.eu.jabber.org"); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); @@ -298,10 +356,6 @@ jabber_ibb_init(); jabber_si_init(); - - jabber_add_feature(XEP_0224_NAMESPACE, jabber_buzz_isenabled); - jabber_add_feature(XEP_0231_NAMESPACE, jabber_custom_smileys_isenabled); - jabber_add_feature(XEP_0047_NAMESPACE, NULL); }
--- a/libpurple/protocols/jabber/message.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/message.c Mon May 18 19:54:24 2009 +0000 @@ -532,16 +532,25 @@ void jabber_message_parse(JabberStream *js, xmlnode *packet) { JabberMessage *jm; - const char *type; + const char *id, *from, *to, *type; xmlnode *child; + gboolean signal_return; + + from = xmlnode_get_attrib(packet, "from"); + id = xmlnode_get_attrib(packet, "id"); + to = xmlnode_get_attrib(packet, "to"); + type = xmlnode_get_attrib(packet, "type"); + + signal_return = GPOINTER_TO_INT(purple_signal_emit_return_1(jabber_plugin, + "jabber-receiving-message", js->gc, type, id, from, to, packet)); + if (signal_return) + return; jm = g_new0(JabberMessage, 1); jm->js = js; jm->sent = time(NULL); jm->delayed = FALSE; - type = xmlnode_get_attrib(packet, "type"); - if(type) { if(!strcmp(type, "normal")) jm->type = JABBER_MESSAGE_NORMAL; @@ -559,9 +568,9 @@ jm->type = JABBER_MESSAGE_NORMAL; } - jm->from = g_strdup(xmlnode_get_attrib(packet, "from")); - jm->to = g_strdup(xmlnode_get_attrib(packet, "to")); - jm->id = g_strdup(xmlnode_get_attrib(packet, "id")); + jm->from = g_strdup(from); + jm->to = g_strdup(to); + jm->id = g_strdup(id); for(child = packet->child; child; child = child->next) { const char *xmlns = xmlnode_get_namespace(child); @@ -912,11 +921,12 @@ static gboolean jabber_conv_support_custom_smileys(const PurpleConnection *gc, - const PurpleConversation *conv, + PurpleConversation *conv, const gchar *who) { JabberStream *js = (JabberStream *) gc->proto_data; JabberBuddy *jb; + JabberChat *chat; if (!js) { purple_debug_error("jabber", @@ -925,7 +935,6 @@ } switch (purple_conversation_get_type(conv)) { - /* for the time being, we will not support custom smileys in MUCs */ case PURPLE_CONV_TYPE_IM: jb = jabber_buddy_find(js, who, FALSE); if (jb) { @@ -934,12 +943,76 @@ return FALSE; } break; + case PURPLE_CONV_TYPE_CHAT: + chat = jabber_chat_find_by_conv(conv); + if (chat) { + /* do not attempt to send custom smileys in a MUC with more than + 10 people, to avoid getting too many BoB requests */ + return jabber_chat_get_num_participants(chat) <= 10 && + jabber_chat_all_participants_have_capability(chat, + XEP_0231_NAMESPACE); + } else { + return FALSE; + } + break; default: return FALSE; break; } } +static char * +jabber_message_smileyfy_xhtml(JabberMessage *jm, const char *xhtml) +{ + PurpleAccount *account = purple_connection_get_account(jm->js->gc); + PurpleConversation *conv = + purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY, jm->to, + account); + + if (jabber_conv_support_custom_smileys(jm->js->gc, conv, jm->to)) { + GList *found_smileys = jabber_message_xhtml_find_smileys(xhtml); + + if (found_smileys) { + gchar *smileyfied_xhtml = NULL; + const GList *iterator; + + for (iterator = found_smileys; iterator ; + iterator = g_list_next(iterator)) { + const PurpleSmiley *smiley = + (PurpleSmiley *) iterator->data; + const gchar *shortcut = purple_smiley_get_shortcut(smiley); + const JabberData *data = + jabber_data_find_local_by_alt(shortcut); + + /* the object has not been sent before */ + if (!data) { + PurpleStoredImage *image = + purple_smiley_get_stored_image(smiley); + const gchar *ext = purple_imgstore_get_extension(image); + JabberStream *js = jm->js; + + JabberData *new_data = + jabber_data_create_from_data(purple_imgstore_get_data(image), + purple_imgstore_get_size(image), + jabber_message_get_mimetype_from_ext(ext), js); + purple_debug_info("jabber", + "cache local smiley alt = %s, cid = %s\n", + shortcut, jabber_data_get_cid(new_data)); + jabber_data_associate_local(new_data, shortcut); + } + } + + smileyfied_xhtml = + jabber_message_get_smileyfied_xhtml(xhtml, found_smileys); + g_list_free(found_smileys); + + return smileyfied_xhtml; + } + } + + return NULL; +} + void jabber_message_send(JabberMessage *jm) { xmlnode *message, *child; @@ -1025,56 +1098,7 @@ } if(jm->xhtml) { - PurpleAccount *account = purple_connection_get_account(jm->js->gc); - PurpleConversation *conv = - purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY, jm->to, - account); - - if (jabber_conv_support_custom_smileys(jm->js->gc, conv, jm->to)) { - GList *found_smileys = jabber_message_xhtml_find_smileys(jm->xhtml); - - if (found_smileys) { - gchar *smileyfied_xhtml = NULL; - const GList *iterator; - - for (iterator = found_smileys; iterator ; - iterator = g_list_next(iterator)) { - const PurpleSmiley *smiley = - (PurpleSmiley *) iterator->data; - const gchar *shortcut = purple_smiley_get_shortcut(smiley); - const JabberData *data = - jabber_data_find_local_by_alt(shortcut); - - /* the object has not been sent before */ - if (!data) { - PurpleStoredImage *image = - purple_smiley_get_stored_image(smiley); - const gchar *ext = purple_imgstore_get_extension(image); - JabberStream *js = jm->js; - - JabberData *new_data = - jabber_data_create_from_data(purple_imgstore_get_data(image), - purple_imgstore_get_size(image), - jabber_message_get_mimetype_from_ext(ext), js); - purple_debug_info("jabber", - "cache local smiley alt = %s, cid = %s\n", - shortcut, jabber_data_get_cid(new_data)); - jabber_data_associate_local(new_data, shortcut); - } - } - - smileyfied_xhtml = - jabber_message_get_smileyfied_xhtml(jm->xhtml, found_smileys); - child = xmlnode_from_str(smileyfied_xhtml, -1); - g_free(smileyfied_xhtml); - g_list_free(found_smileys); - } else { - child = xmlnode_from_str(jm->xhtml, -1); - } - } else { - child = xmlnode_from_str(jm->xhtml, -1); - } - if(child) { + if ((child = xmlnode_from_str(jm->xhtml, -1))) { xmlnode_insert_child(message, child); } else { purple_debug(PURPLE_DEBUG_ERROR, "jabber", @@ -1088,14 +1112,51 @@ xmlnode_free(message); } +/* + * Compare the XHTML and plain strings passed in for "equality". Any HTML markup + * other than <br/> (matches a newline) in the XHTML will cause this to return + * FALSE. + */ +static gboolean +jabber_xhtml_plain_equal(const char *xhtml_escaped, + const char *plain) +{ + int i = 0; + int j = 0; + gboolean ret; + char *xhtml = purple_unescape_html(xhtml_escaped); + + while (xhtml[i] && plain[j]) { + if (xhtml[i] == plain[j]) { + i += 1; + j += 1; + continue; + } + + if (plain[j] == '\n' && !strncmp(xhtml+i, "<br/>", 5)) { + i += 5; + j += 1; + continue; + } + + g_free(xhtml); + return FALSE; + } + + /* Are we at the end of both strings? */ + ret = (xhtml[i] == plain[j]) && (xhtml[i] == '\0'); + g_free(xhtml); + return ret; +} + int jabber_message_send_im(PurpleConnection *gc, const char *who, const char *msg, PurpleMessageFlags flags) { JabberMessage *jm; JabberBuddy *jb; JabberBuddyResource *jbr; - char *buf; char *xhtml; + char *tmp; char *resource; if(!who || !msg) @@ -1114,7 +1175,6 @@ jm->chat_state = JM_STATE_ACTIVE; jm->to = g_strdup(who); jm->id = jabber_get_next_id(jm->js); - jm->chat_state = JM_STATE_ACTIVE; if(jbr) { if(jbr->thread_id) @@ -1130,15 +1190,18 @@ jm->typing_style |= JM_TS_JEP_0022; } - buf = g_strdup_printf("<html xmlns='http://jabber.org/protocol/xhtml-im'><body xmlns='http://www.w3.org/1999/xhtml'>%s</body></html>", msg); - - purple_markup_html_to_xhtml(buf, &xhtml, &jm->body); - g_free(buf); + purple_markup_html_to_xhtml(msg, &xhtml, &jm->body); + tmp = jabber_message_smileyfy_xhtml(jm, xhtml); + if (tmp) { + g_free(xhtml); + xhtml = tmp; + } - if(!jbr || jbr->capabilities & JABBER_CAP_XHTML) - jm->xhtml = xhtml; - else - g_free(xhtml); + if ((!jbr || jbr->capabilities & JABBER_CAP_XHTML) && + !jabber_xhtml_plain_equal(xhtml, jm->body)) + jm->xhtml = g_strdup_printf("<html xmlns='http://jabber.org/protocol/xhtml-im'><body xmlns='http://www.w3.org/1999/xhtml'>%s</body></html>", xhtml); + + g_free(xhtml); jabber_message_send(jm); jabber_message_free(jm); @@ -1150,7 +1213,8 @@ JabberChat *chat; JabberMessage *jm; JabberStream *js; - char *buf; + char *xhtml; + char *tmp; if(!msg || !gc) return 0; @@ -1167,14 +1231,17 @@ jm->to = g_strdup_printf("%s@%s", chat->room, chat->server); jm->id = jabber_get_next_id(jm->js); - buf = g_strdup_printf("<html xmlns='http://jabber.org/protocol/xhtml-im'><body xmlns='http://www.w3.org/1999/xhtml'>%s</body></html>", msg); - purple_markup_html_to_xhtml(buf, &jm->xhtml, &jm->body); - g_free(buf); + purple_markup_html_to_xhtml(msg, &xhtml, &jm->body); + tmp = jabber_message_smileyfy_xhtml(jm, xhtml); + if (tmp) { + g_free(xhtml); + xhtml = tmp; + } - if(!chat->xhtml) { - g_free(jm->xhtml); - jm->xhtml = NULL; - } + if (chat->xhtml && !jabber_xhtml_plain_equal(xhtml, jm->body)) + jm->xhtml = g_strdup_printf("<html xmlns='http://jabber.org/protocol/xhtml-im'><body xmlns='http://www.w3.org/1999/xhtml'>%s</body></html>", xhtml); + + g_free(xhtml); jabber_message_send(jm); jabber_message_free(jm);
--- a/libpurple/protocols/jabber/oob.h Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/oob.h Mon May 18 19:54:24 2009 +0000 @@ -1,5 +1,5 @@ /** - * @file jutil.h utility functions + * @file oob.h out-of-band transfer functions * * purple *
--- a/libpurple/protocols/jabber/pep.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/pep.c Mon May 18 19:54:24 2009 +0000 @@ -44,7 +44,10 @@ } void jabber_pep_uninit(void) { - /* any PEP handlers that need to clean things up go here */ + /* any PEP handlers that need to clean things up go here. The standard + * cleanup of removing the handler and feature are handled here and by + * jabber_features_destroy() in jabber.c + */ g_hash_table_destroy(pep_handlers); pep_handlers = NULL; } @@ -67,12 +70,15 @@ JabberIqType type, const char *id, xmlnode *packet, gpointer data) { - xmlnode *pubsub = xmlnode_get_child_with_namespace(packet,"pubsub","http://jabber.org/protocol/pubsub"); + xmlnode *pubsub; xmlnode *items = NULL; JabberPEPHandler *cb = data; - if(pubsub) - items = xmlnode_get_child(pubsub, "items"); + if (type == JABBER_IQ_RESULT) { + pubsub = xmlnode_get_child_with_namespace(packet, "pubsub", "http://jabber.org/protocol/pubsub"); + if(pubsub) + items = xmlnode_get_child(pubsub, "items"); + } cb(js, from, items); }
--- a/libpurple/protocols/jabber/ping.h Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/ping.h Mon May 18 19:54:24 2009 +0000 @@ -1,5 +1,5 @@ /** - * @file ping.h utility functions + * @file ping.h ping functions * * purple *
--- a/libpurple/protocols/jabber/presence.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/presence.c Mon May 18 19:54:24 2009 +0000 @@ -340,7 +340,7 @@ xmlnode *packet, gpointer blah) { JabberBuddy *jb = NULL; - xmlnode *vcard, *photo, *binval; + xmlnode *vcard, *photo, *binval, *fn, *nick; char *text; if(!from) @@ -352,6 +352,29 @@ if((vcard = xmlnode_get_child(packet, "vCard")) || (vcard = xmlnode_get_child_with_namespace(packet, "query", "vcard-temp"))) { + /* The logic here regarding the nickname and full name is copied from + * buddy.c:jabber_vcard_parse. */ + gchar *nickname = NULL; + if ((fn = xmlnode_get_child(vcard, "FN"))) + nickname = xmlnode_get_data(fn); + + if ((nick = xmlnode_get_child(vcard, "NICKNAME"))) { + char *tmp = xmlnode_get_data(nick); + char *bare_jid = jabber_get_bare_jid(from); + if (strstr(bare_jid, tmp) == NULL) { + g_free(nickname); + nickname = tmp; + } else + g_free(tmp); + + g_free(bare_jid); + } + + if (nickname) { + serv_got_alias(js->gc, from, nickname); + g_free(nickname); + } + if((photo = xmlnode_get_child(vcard, "PHOTO")) && (( (binval = xmlnode_get_child(photo, "BINVAL")) && (text = xmlnode_get_data(binval))) || @@ -381,8 +404,10 @@ JabberPresenceCapabilities *userdata) { JabberBuddyResource *jbr; - char *resource = g_utf8_strrchr(userdata->from, -1, '/'); - resource += 1; + char *resource = g_utf8_strchr(userdata->from, -1, '/'); + + if (resource) + resource += 1; jbr = jabber_buddy_find_resource(userdata->jb, resource); if (!jbr) { @@ -404,13 +429,15 @@ jbr->caps.info = info; jbr->caps.exts = exts; - if (jabber_resource_has_capability(jbr, "http://jabber.org/protocol/commands")) { + if (!jbr->commands_fetched && jabber_resource_has_capability(jbr, "http://jabber.org/protocol/commands")) { JabberIq *iq = jabber_iq_new_query(userdata->js, JABBER_IQ_GET, "http://jabber.org/protocol/disco#items"); xmlnode *query = xmlnode_get_child_with_namespace(iq->node, "query", "http://jabber.org/protocol/disco#items"); xmlnode_set_attrib(iq->node, "to", userdata->from); xmlnode_set_attrib(query, "node", "http://jabber.org/protocol/commands"); jabber_iq_set_callback(iq, jabber_adhoc_disco_result_cb, NULL); jabber_iq_send(iq); + + jbr->commands_fetched = TRUE; } g_free(userdata->from); @@ -419,8 +446,8 @@ void jabber_presence_parse(JabberStream *js, xmlnode *packet) { - const char *from = xmlnode_get_attrib(packet, "from"); - const char *type = xmlnode_get_attrib(packet, "type"); + const char *from; + const char *type; const char *real_jid = NULL; const char *affiliation = NULL; const char *role = NULL; @@ -441,10 +468,20 @@ char *avatar_hash = NULL; xmlnode *caps = NULL; int idle = 0; + gchar *nickname = NULL; + gboolean signal_return; + + from = xmlnode_get_attrib(packet, "from"); + type = xmlnode_get_attrib(packet, "type"); if(!(jb = jabber_buddy_find(js, from, TRUE))) return; + signal_return = GPOINTER_TO_INT(purple_signal_emit_return_1(jabber_plugin, + "jabber-receiving-presence", js->gc, type, from, packet)); + if (signal_return) + return; + if(!(jid = jabber_id_new(from))) return; @@ -463,6 +500,11 @@ gboolean onlist = FALSE; PurpleBuddy *buddy = purple_find_buddy(purple_connection_get_account(js->gc), from); JabberBuddy *jb = NULL; + xmlnode *nick; + + nick = xmlnode_get_child_with_namespace(packet, "nick", "http://jabber.org/protocol/nick"); + if (nick) + nickname = xmlnode_get_data(nick); if (buddy) { jb = jabber_buddy_find(js, from, TRUE); @@ -474,8 +516,9 @@ jap->who = g_strdup(from); jap->js = js; - purple_account_request_authorization(purple_connection_get_account(js->gc), from, NULL, NULL, NULL, onlist, + purple_account_request_authorization(purple_connection_get_account(js->gc), from, NULL, nickname, NULL, onlist, authorize_add_cb, deny_add_cb, jap); + g_free(nickname); jabber_id_free(jid); return; } else if(type && !strcmp(type, "subscribed")) { @@ -526,6 +569,8 @@ stamp = xmlnode_get_attrib(y, "stamp"); } else if(!strcmp(y->name, "c") && !strcmp(xmlns, "http://jabber.org/protocol/caps")) { caps = y; /* store for later, when creating buddy resource */ + } else if (g_str_equal(y->name, "nick") && g_str_equal(xmlns, "http://jabber.org/protocol/nick")) { + nickname = xmlnode_get_data(y); } else if(!strcmp(y->name, "x")) { if(!strcmp(xmlns, "jabber:x:delay")) { /* XXX: compare the time. jabber:x:delay can happen on presence packets that aren't really and truly delayed */ @@ -626,6 +671,7 @@ jabber_id_free(jid); g_free(status); g_free(avatar_hash); + g_free(nickname); return; } @@ -633,15 +679,18 @@ if(type && !strcmp(type, "unavailable")) { gboolean nick_change = FALSE; - /* If we haven't joined the chat yet, we don't care that someone - * left, or it was us leaving after we closed the chat */ - if (!chat->conv || chat->left) { + /* If the chat nick is invalid, we haven't yet joined, or we've + * already left (it was probably us leaving after we closed the + * chat), we don't care. + */ + if (!jid->resource || !chat->conv || chat->left) { if (chat->left && jid->resource && chat->handle && !strcmp(jid->resource, chat->handle)) jabber_chat_destroy(chat); jabber_id_free(jid); g_free(status); g_free(avatar_hash); + g_free(nickname); return; } @@ -695,6 +744,19 @@ } } } else { + /* + * XEP-0045 mandates the presence to include a resource (which is + * treated as the chat nick). Some non-compliant servers allow + * joining without a nick. + */ + if (!jid->resource) { + jabber_id_free(jid); + g_free(avatar_hash); + g_free(nickname); + g_free(status); + return; + } + if(!chat->conv) { char *room_jid = g_strdup_printf("%s@%s", jid->node, jid->domain); chat->id = i++; @@ -728,6 +790,7 @@ jabber_id_free(jid); g_free(avatar_hash); g_free(buddy_name); + g_free(nickname); g_free(status); return; } else { @@ -784,6 +847,8 @@ jabber_google_presence_incoming(js, buddy_name, found_jbr); purple_prpl_got_user_status(js->gc->account, buddy_name, jabber_buddy_state_get_status_id(found_jbr->state), "priority", found_jbr->priority, "message", found_jbr->status, NULL); purple_prpl_got_user_idle(js->gc->account, buddy_name, found_jbr->idle, found_jbr->idle); + if (nickname) + serv_got_alias(js->gc, buddy_name, nickname); } else { purple_prpl_got_user_status(js->gc->account, buddy_name, "offline", status ? "message" : NULL, status, NULL); } @@ -800,16 +865,30 @@ /* v1.3 uses: node, ver, and optionally ext. * v1.5 uses: node, ver, and hash. */ if (node && *node && ver && *ver) { - JabberPresenceCapabilities *userdata = g_new0(JabberPresenceCapabilities, 1); - userdata->js = js; - userdata->jb = jb; - userdata->from = g_strdup(from); - jabber_caps_get_info(js, from, node, ver, hash, ext, - (jabber_caps_get_info_cb)jabber_presence_set_capabilities, - userdata); + gchar **exts = ext && *ext ? g_strsplit(ext, " ", -1) : NULL; + jbr = jabber_buddy_find_resource(jb, jid->resource); + + /* Look it up if we don't already have all this information */ + if (!jbr || !jbr->caps.info || + !g_str_equal(node, jbr->caps.info->tuple.node) || + !g_str_equal(ver, jbr->caps.info->tuple.ver) || + !purple_strequal(hash, jbr->caps.info->tuple.hash) || + !jabber_caps_exts_known(jbr->caps.info, (gchar **)exts)) { + JabberPresenceCapabilities *userdata = g_new0(JabberPresenceCapabilities, 1); + userdata->js = js; + userdata->jb = jb; + userdata->from = g_strdup(from); + jabber_caps_get_info(js, from, node, ver, hash, exts, + (jabber_caps_get_info_cb)jabber_presence_set_capabilities, + userdata); + } else { + if (exts) + g_strfreev(exts); + } } } + g_free(nickname); g_free(status); jabber_id_free(jid); g_free(avatar_hash);
--- a/libpurple/protocols/jabber/si.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/si.c Mon May 18 19:54:24 2009 +0000 @@ -407,7 +407,7 @@ { PurpleXfer *xfer = data; JabberSIXfer *jsx = xfer->data; - char buffer[256]; + char buffer[42]; /* 40 for DST.ADDR + 2 bytes for port number*/ int len; char *dstaddr, *hash; const char *host; @@ -431,16 +431,19 @@ jsx->rxlen += len; return; } else if(jsx->rxqueue[0] != 0x05 || jsx->rxqueue[1] != 0x01 || - jsx->rxqueue[3] != 0x03) { - purple_debug_info("jabber", "invalid socks5 stuff\n"); + jsx->rxqueue[3] != 0x03 || jsx->rxqueue[4] != 40) { + purple_debug_info("jabber", "Invalid socks5 conn req. header[0x%x,0x%x,0x%x,0x%x,0x%x]\n", + jsx->rxqueue[0], jsx->rxqueue[1], jsx->rxqueue[2], + jsx->rxqueue[3], jsx->rxqueue[4]); purple_input_remove(xfer->watcher); xfer->watcher = 0; close(source); purple_xfer_cancel_remote(xfer); return; } else if(jsx->rxlen - 5 < jsx->rxqueue[4] + 2) { - purple_debug_info("jabber", "reading umpteen more bytes\n"); - len = read(source, buffer, jsx->rxqueue[4] + 5 + 2 - jsx->rxlen); + purple_debug_info("jabber", "reading %u bytes for DST.ADDR + port num (trying to read %u now)\n", + jsx->rxqueue[4] + 2, jsx->rxqueue[4] + 2 - (jsx->rxlen - 5)); + len = read(source, buffer, jsx->rxqueue[4] + 2 - (jsx->rxlen - 5)); if(len < 0 && errno == EAGAIN) return; else if(len <= 0) { @@ -455,6 +458,7 @@ jsx->rxlen += len; } + /* Have we not read all of DST.ADDR and the following 2-byte port number? */ if(jsx->rxlen - 5 < jsx->rxqueue[4] + 2) return; @@ -468,9 +472,16 @@ /* Per XEP-0065, the 'host' must be SHA1(SID + from JID + to JID) */ hash = jabber_calculate_data_sha1sum(dstaddr, strlen(dstaddr)); - if(jsx->rxqueue[4] != 40 || strncmp(hash, jsx->rxqueue+5, 40) || + if(strncmp(hash, jsx->rxqueue + 5, 40) || jsx->rxqueue[45] != 0x00 || jsx->rxqueue[46] != 0x00) { - purple_debug_error("jabber", "someone connected with the wrong info!\n"); + if (jsx->rxqueue[45] != 0x00 || jsx->rxqueue[46] != 0x00) + purple_debug_error("jabber", "Got SOCKS5 BS conn with the wrong DST.PORT" + " (must be 0 - got[0x%x,0x%x]).\n", + jsx->rxqueue[45], jsx->rxqueue[46]); + else + purple_debug_error("jabber", "Got SOCKS5 BS conn with the wrong DST.ADDR" + " (expected '%s' - got '%.40s').\n", + hash, jsx->rxqueue + 5); close(source); purple_xfer_cancel_remote(xfer); g_free(hash); @@ -531,11 +542,13 @@ purple_input_remove(xfer->watcher); xfer->watcher = 0; + /* If we sent a "Success", wait for a response, otherwise give up and cancel */ if (jsx->rxqueue[1] == 0x00) { xfer->watcher = purple_input_add(source, PURPLE_INPUT_READ, jabber_si_xfer_bytestreams_send_read_again_cb, xfer); g_free(jsx->rxqueue); jsx->rxqueue = NULL; + jsx->rxlen = 0; } else { close(source); purple_xfer_cancel_remote(xfer); @@ -556,6 +569,7 @@ xfer->fd = source; + /** Try to read the SOCKS5 header */ if(jsx->rxlen < 2) { purple_debug_info("jabber", "reading those first two bytes\n"); len = read(source, buffer, 2 - jsx->rxlen); @@ -573,8 +587,9 @@ jsx->rxlen += len; return; } else if(jsx->rxlen - 2 < jsx->rxqueue[1]) { - purple_debug_info("jabber", "reading the next umpteen bytes\n"); - len = read(source, buffer, jsx->rxqueue[1] + 2 - jsx->rxlen); + purple_debug_info("jabber", "reading %u bytes for auth methods (trying to read %u now)\n", + jsx->rxqueue[1], jsx->rxqueue[1] - (jsx->rxlen - 2)); + len = read(source, buffer, jsx->rxqueue[1] - (jsx->rxlen - 2)); if(len < 0 && errno == EAGAIN) return; else if(len <= 0) { @@ -589,6 +604,7 @@ jsx->rxlen += len; } + /* Have we not read all the auth. method bytes? */ if(jsx->rxlen -2 < jsx->rxqueue[1]) return;
--- a/libpurple/protocols/jabber/si.h Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/si.h Mon May 18 19:54:24 2009 +0000 @@ -1,5 +1,5 @@ /** - * @file jutil.h utility functions + * @file si.h SI transfer functions * * purple *
--- a/libpurple/protocols/jabber/useravatar.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/useravatar.c Mon May 18 19:54:24 2009 +0000 @@ -33,9 +33,6 @@ void jabber_avatar_init(void) { - jabber_pep_register_handler(NS_AVATAR_0_12_METADATA, - update_buddy_metadata); - jabber_add_feature(NS_AVATAR_1_1_METADATA, jabber_pep_namespace_only_when_pep_enabled_cb); jabber_add_feature(NS_AVATAR_1_1_DATA, @@ -48,6 +45,43 @@ static void remove_avatar_0_12_nodes(JabberStream *js) { +#if 0 + /* See note below for why this is #if 0'd */ + + /* Publish an empty avatar according to the XEP-0084 v0.12 semantics */ + xmlnode *publish, *item, *metadata; + /* publish the metadata */ + publish = xmlnode_new("publish"); + xmlnode_set_attrib(publish, "node", NS_AVATAR_0_12_METADATA); + + item = xmlnode_new_child(publish, "item"); + xmlnode_set_attrib(item, "id", "stop"); + + metadata = xmlnode_new_child(item, "metadata"); + xmlnode_set_namespace(metadata, NS_AVATAR_0_12_METADATA); + + xmlnode_new_child(metadata, "stop"); + + /* publish */ + jabber_pep_publish(js, publish); +#endif + + /* + * This causes ejabberd 2.0.0 to kill the connection unceremoniously. + * See https://support.process-one.net/browse/EJAB-623. When adiumx.com + * was upgraded, the issue went away. + * + * I think it makes a lot of sense to not have an avatar at the old + * node instead of having something interpreted as "no avatar". When + * a contact with an older client logs in, in the latter situation, + * there's a race between interpreting the <presence/> vcard-temp:x:update + * avatar (non-empty) and the XEP-0084 v0.12 avatar (empty, so show no + * avatar for the buddy) which leads to unhappy and confused users. + * + * A deluge of frustrating "Read error" bug reports may change my mind + * about this. + * --darkrain42 + */ jabber_pep_delete_node(js, NS_AVATAR_0_12_METADATA); jabber_pep_delete_node(js, NS_AVATAR_0_12_DATA); } @@ -59,6 +93,7 @@ if (!js->pep) return; + /* Hmmm, not sure if this is worth the traffic, but meh */ remove_avatar_0_12_nodes(js); if (!img) { @@ -169,35 +204,29 @@ } static void +do_got_own_avatar_0_12_cb(JabberStream *js, const char *from, xmlnode *items) +{ + if (items) + /* It wasn't an error (i.e. 'item-not-found') */ + remove_avatar_0_12_nodes(js); +} + +static void do_got_own_avatar_cb(JabberStream *js, const char *from, xmlnode *items) { xmlnode *item = NULL, *metadata = NULL, *info = NULL; PurpleAccount *account = purple_connection_get_account(js->gc); const char *server_hash = NULL; - const char *ns; - if ((item = xmlnode_get_child(items, "item")) && + if (items && (item = xmlnode_get_child(items, "item")) && (metadata = xmlnode_get_child(item, "metadata")) && (info = xmlnode_get_child(metadata, "info"))) { server_hash = xmlnode_get_attrib(info, "id"); } - if (!metadata) - return; - - ns = xmlnode_get_namespace(metadata); - if (!ns) + if (items && !metadata) return; - /* - * We no longer publish avatars to the older namespace. If there is one - * there, delete it. - */ - if (g_str_equal(ns, NS_AVATAR_0_12_METADATA) && server_hash) { - remove_avatar_0_12_nodes(js); - return; - } - /* Publish ours if it's different than the server's */ if (!purple_strequal(server_hash, js->initial_avatar_hash)) { PurpleStoredImage *img = purple_buddy_icons_find_account_icon(account); @@ -210,7 +239,7 @@ { char *jid = g_strdup_printf("%s@%s", js->user->node, js->user->domain); jabber_pep_request_item(js, jid, NS_AVATAR_0_12_METADATA, NULL, - do_got_own_avatar_cb); + do_got_own_avatar_0_12_cb); jabber_pep_request_item(js, jid, NS_AVATAR_1_1_METADATA, NULL, do_got_own_avatar_cb); g_free(jid); @@ -247,7 +276,7 @@ do_buddy_avatar_update_data(JabberStream *js, const char *from, xmlnode *items) { xmlnode *item, *data; - const char *checksum, *ns; + const char *checksum; char *b64data; void *img; size_t size; @@ -262,12 +291,6 @@ if(!data) return; - ns = xmlnode_get_namespace(data); - /* Make sure the namespace is one of the two valid possibilities */ - if (!ns || (!g_str_equal(ns, NS_AVATAR_0_12_DATA) && - !g_str_equal(ns, NS_AVATAR_1_1_DATA))) - return; - checksum = xmlnode_get_attrib(item,"id"); if(!checksum) return; @@ -290,7 +313,7 @@ update_buddy_metadata(JabberStream *js, const char *from, xmlnode *items) { PurpleBuddy *buddy = purple_find_buddy(purple_connection_get_account(js->gc), from); - const char *checksum, *ns; + const char *checksum; xmlnode *item, *metadata; if(!buddy) return; @@ -306,15 +329,9 @@ if(!metadata) return; - ns = xmlnode_get_namespace(metadata); - /* Make sure the namespace is one of the two valid possibilities */ - if (!ns || (!g_str_equal(ns, NS_AVATAR_0_12_METADATA) && - !g_str_equal(ns, NS_AVATAR_1_1_METADATA))) - return; - checksum = purple_buddy_icons_get_checksum_for_user(buddy); - /* check if we have received a stop */ + /* <stop/> was the pre-v1.1 method of publishing an empty avatar */ if(xmlnode_get_child(metadata, "stop")) { purple_buddy_icons_set_for_user(purple_connection_get_account(js->gc), from, NULL, 0, NULL); } else { @@ -347,10 +364,7 @@ /* the avatar might either be stored in a pep node, or on a HTTP(S) URL */ if(!url) { - const char *data_ns; - data_ns = (g_str_equal(ns, NS_AVATAR_0_12_METADATA) ? - NS_AVATAR_0_12_DATA : NS_AVATAR_1_1_DATA); - jabber_pep_request_item(js, from, data_ns, id, + jabber_pep_request_item(js, from, NS_AVATAR_1_1_DATA, id, do_buddy_avatar_update_data); } else { PurpleUtilFetchUrlData *url_data;
--- a/libpurple/protocols/jabber/usernick.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/jabber/usernick.c Mon May 18 19:54:24 2009 +0000 @@ -35,7 +35,7 @@ xmlnode *nick; char *nickname = NULL; - /* ignore the tune of people not on our buddy list */ + /* ignore the nick of people not on our buddy list */ if (!buddy || !item) return; @@ -65,7 +65,10 @@ static void do_nick_got_own_nick_cb(JabberStream *js, const char *from, xmlnode *items) { char *oldnickname = NULL; - xmlnode *item = xmlnode_get_child(items,"item"); + xmlnode *item = NULL; + + if (items) + item = xmlnode_get_child(items,"item"); if(item) { xmlnode *nick = xmlnode_get_child_with_namespace(item,"nick","http://jabber.org/protocol/nick");
--- a/libpurple/protocols/msn/httpconn.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/msn/httpconn.c Mon May 18 19:54:24 2009 +0000 @@ -219,7 +219,13 @@ g_free(tmp); t = strchr(full_session_id, '.'); - session_id = g_strndup(full_session_id, t - full_session_id); + if (t != NULL) + session_id = g_strndup(full_session_id, t - full_session_id); + else { + purple_debug_error("msn", "Malformed full_session_id[%s]\n", + full_session_id ? full_session_id : NULL); + session_id = g_strdup(full_session_id); + } if (session_action == NULL || strcmp(session_action, "close") != 0) {
--- a/libpurple/protocols/msn/notification.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/msn/notification.c Mon May 18 19:54:24 2009 +0000 @@ -612,8 +612,23 @@ static void update_contact_network(MsnSession *session, const char *passport, MsnNetwork network) { - MsnUser *user = msn_userlist_find_user(session->userlist, passport); + MsnUser *user; + + if (network == MSN_NETWORK_UNKNOWN) + { + purple_debug_warning("msn", + "Ignoring user %s about which server knows nothing.\n", + passport); + /* Decrement the count for unknown results so that we'll continue login. + Also, need to finish the login process here as well, because ADL OK + will not be called. */ + if (--session->adl_fqy == 0) + msn_session_finish_login(session); + return; + } + /* TODO: Also figure out how to update membership lists */ + user = msn_userlist_find_user(session->userlist, passport); if (user) { xmlnode *adl_node; char *payload; @@ -774,13 +789,17 @@ purple_debug_info("msn", "Invalid XML in ADL!\n"); return; } - for (domain_node = xmlnode_get_child(root, "d"); domain_node; domain_node = xmlnode_get_next_twin(domain_node)) { + for (domain_node = xmlnode_get_child(root, "d"); + domain_node; + domain_node = xmlnode_get_next_twin(domain_node)) { const gchar * domain = NULL; xmlnode *contact_node = NULL; domain = xmlnode_get_attrib(domain_node, "n"); - for (contact_node = xmlnode_get_child(domain_node, "c"); contact_node; contact_node = xmlnode_get_next_twin(contact_node)) { + for (contact_node = xmlnode_get_child(domain_node, "c"); + contact_node; + contact_node = xmlnode_get_next_twin(contact_node)) { const gchar *list; gint list_op = 0; @@ -829,10 +848,10 @@ MsnSession *session; PurpleAccount *account; PurpleConnection *gc; - /*char *adl = g_strndup(payload, len);*/ - char *reason = g_strdup_printf(_("Unknown error (%d)"), - GPOINTER_TO_INT(cmd->payload_cbdata)/*, adl*/); - /*g_free(adl);*/ + char *adl = g_strndup(payload, len); + char *reason = g_strdup_printf(_("Unknown error (%d): %s"), + GPOINTER_TO_INT(cmd->payload_cbdata), adl); + g_free(adl); session = cmdproc->session; account = session->account; @@ -942,10 +961,10 @@ passport = g_strdup_printf("%s@%s", local, domain); - if (type != NULL) + if (!g_ascii_isdigit(cmd->command[0]) && type != NULL) network = (MsnNetwork)strtoul(type, NULL, 10); else - network = MSN_NETWORK_PASSPORT; + network = MSN_NETWORK_UNKNOWN; purple_debug_info("msn", "FQY response says %s is from network %d\n", passport, network); @@ -960,6 +979,26 @@ } static void +fqy_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) +{ + MsnCommand *cmd = cmdproc->last_cmd; + + purple_debug_warning("msn", "FQY error %d\n", error); + if (cmd->param_count > 1) { + cmd->payload_cb = fqy_cmd_post; + cmd->payload_len = atoi(cmd->params[1]); + cmd->payload_cbdata = GINT_TO_POINTER(error); + } +#if 0 + /* If the server didn't send us a corresponding email address for this + FQY error, it's probably going to disconnect us. So it isn't necessary + to tell the handler about it. */ + else if (trans->data) + ((MsnFqyCb)trans->data)(session, NULL, MSN_NETWORK_UNKNOWN); */ +#endif +} + +static void fqy_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { purple_debug_info("msn", "Process FQY\n"); @@ -1852,14 +1891,11 @@ if (count > 0) { - const char *passport; - const char *url; - - passport = msn_user_get_passport(session->user); - url = session->passport_info.mail_url; + const char *passports[2] = { msn_user_get_passport(session->user) }; + const char *urls[2] = { session->passport_info.mail_url }; purple_notify_emails(gc, count, FALSE, NULL, NULL, - &passport, &url, NULL, NULL); + passports, urls, NULL, NULL); } } @@ -1921,14 +1957,11 @@ if (count > 0) { - const char *passport; - const char *url; - - passport = msn_user_get_passport(session->user); - url = session->passport_info.mail_url; + const char *passports[2] = { msn_user_get_passport(session->user) }; + const char *urls[2] = { session->passport_info.mail_url }; purple_notify_emails(gc, count, FALSE, NULL, NULL, - &passport, &url, NULL, NULL); + passports, urls, NULL, NULL); } } @@ -2153,6 +2186,7 @@ msn_table_add_error(cbs_table, "ADD", add_error); msn_table_add_error(cbs_table, "ADL", adl_error); + msn_table_add_error(cbs_table, "FQY", fqy_error); msn_table_add_error(cbs_table, "REG", reg_error); msn_table_add_error(cbs_table, "RMG", rmg_error); msn_table_add_error(cbs_table, "USR", usr_error);
--- a/libpurple/protocols/msn/oim.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/msn/oim.c Mon May 18 19:54:24 2009 +0000 @@ -668,9 +668,15 @@ if (tokens[1] != NULL) from = (const char *)tokens[1]; - start = strchr(from, '<') + 1; - end = strchr(from, '>'); - passport = g_strndup(start, end - start); + start = strchr(from, '<'); + if (start != NULL) { + start++; + end = strchr(from, '>'); + if (end != NULL) + passport = g_strndup(start, end - start); + } + if (passport == NULL) + passport = g_strdup(_("Unknown")); g_strfreev(tokens); } @@ -764,14 +770,14 @@ if (iu_node != NULL && purple_account_get_check_mail(session->account)) { char *unread = xmlnode_get_data(iu_node); - const char *passport = msn_user_get_passport(session->user); - const char *url = session->passport_info.mail_url; + const char *passports[2] = { msn_user_get_passport(session->user) }; + const char *urls[2] = { session->passport_info.mail_url }; int count = atoi(unread); /* XXX/khc: pretty sure this is wrong */ if (count > 0) purple_notify_emails(session->account->gc, count, FALSE, NULL, - NULL, &passport, &url, NULL, NULL); + NULL, passports, urls, NULL, NULL); g_free(unread); }
--- a/libpurple/protocols/msn/slplink.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/msn/slplink.c Mon May 18 19:54:24 2009 +0000 @@ -493,7 +493,7 @@ { MsnSlpMessage *slpmsg; const char *data; - gsize offset; + guint64 offset; gsize len; #ifdef MSN_DEBUG_SLP @@ -565,6 +565,7 @@ if (slpmsg->buffer == NULL) { purple_debug_error("msn", "Failed to allocate buffer for slpmsg\n"); + msn_slpmsg_destroy(slpmsg); return; } } @@ -682,9 +683,9 @@ size = st.st_size; if(!file_name) { - base = g_path_get_basename(file_path); - u8 = purple_utf8_try_convert(base); - g_free(base); + gchar *basename = g_path_get_basename(file_path); + u8 = purple_utf8_try_convert(basename); + g_free(basename); file_name = u8; }
--- a/libpurple/protocols/msn/soap.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/msn/soap.c Mon May 18 19:54:24 2009 +0000 @@ -80,7 +80,7 @@ conn->session = session; conn->host = g_strdup(host); conn->queue = g_queue_new(); - conn->unsafe_debug = g_getenv("PURPLE_MSN_UNSAFE_DEBUG") != NULL; + conn->unsafe_debug = g_getenv("PURPLE_UNSAFE_DEBUG") != NULL; return conn; } @@ -434,7 +434,7 @@ g_free(line); return; } else if (strcmp(key, "Content-Length") == 0) { - conn->body_len = atoi(value); + sscanf(value, "%" G_GSIZE_FORMAT, &(conn->body_len)); } else if (strcmp(key, "Connection") == 0) { if (strcmp(value, "close") == 0) { conn->close_when_done = TRUE; @@ -667,7 +667,8 @@ conn->handled_len = 0; conn->current_request = req; - purple_input_remove(conn->event_handle); + if (conn->event_handle) + purple_input_remove(conn->event_handle); conn->event_handle = purple_input_add(conn->ssl->fd, PURPLE_INPUT_WRITE, msn_soap_write_cb, conn); if (!msn_soap_write_cb_internal(conn, conn->ssl->fd, PURPLE_INPUT_WRITE, TRUE)) {
--- a/libpurple/protocols/msnp9/notification.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/msnp9/notification.c Mon May 18 19:54:24 2009 +0000 @@ -1280,14 +1280,11 @@ if (count > 0) { - const char *passport; - const char *url; + const char *passports[2] = { msn_user_get_passport(session->user) }; + const char *urls[2] = { session->passport_info.file }; - passport = msn_user_get_passport(session->user); - url = session->passport_info.file; - - purple_notify_emails(gc, atoi(unread), FALSE, NULL, NULL, - &passport, &url, NULL, NULL); + purple_notify_emails(gc, count, FALSE, NULL, NULL, + passports, urls, NULL, NULL); } }
--- a/libpurple/protocols/msnp9/slplink.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/msnp9/slplink.c Mon May 18 19:54:24 2009 +0000 @@ -510,7 +510,7 @@ { MsnSlpMessage *slpmsg; const char *data; - gsize offset; + guint64 offset; gsize len; #ifdef MSN_DEBUG_SLP @@ -581,6 +581,7 @@ if (slpmsg->buffer == NULL) { purple_debug_error("msn", "Failed to allocate buffer for slpmsg\n"); + msn_slpmsg_destroy(slpmsg); return; } }
--- a/libpurple/protocols/myspace/myspace.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/myspace/myspace.c Mon May 18 19:54:24 2009 +0000 @@ -847,8 +847,6 @@ MsimMessage *body; guint old_inbox_status; guint i, n; - const gchar *froms[5], *tos[5], *urls[5], *subjects[5]; - /* Information for each new inbox message type. */ static struct { @@ -863,16 +861,22 @@ { "FriendRequest", MSIM_INBOX_FRIEND_REQUEST, "http://messaging.myspace.com/index.cfm?fuseaction=mail.friendRequests", NULL }, { "PictureComment", MSIM_INBOX_PICTURE_COMMENT, "http://home.myspace.com/index.cfm?fuseaction=user", NULL } }; + const gchar *froms[G_N_ELEMENTS(message_types) + 1] = { "" }, + *tos[G_N_ELEMENTS(message_types) + 1] = { "" }, + *urls[G_N_ELEMENTS(message_types) + 1] = { "" }, + *subjects[G_N_ELEMENTS(message_types) + 1] = { "" }; + + g_return_if_fail(reply != NULL); /* Can't write _()'d strings in array initializers. Workaround. */ + /* khc: then use N_() in the array initializer and use _() when they are + used */ message_types[0].text = _("New mail messages"); message_types[1].text = _("New blog comments"); message_types[2].text = _("New profile comments"); message_types[3].text = _("New friend requests!"); message_types[4].text = _("New picture comments"); - g_return_if_fail(reply != NULL); - body = msim_msg_get_dictionary(reply, "body"); if (body == NULL) @@ -882,7 +886,7 @@ n = 0; - for (i = 0; i < sizeof(message_types) / sizeof(message_types[0]); ++i) { + for (i = 0; i < G_N_ELEMENTS(message_types); ++i) { const gchar *key; guint bit;
--- a/libpurple/protocols/null/nullprpl.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/null/nullprpl.c Mon May 18 19:54:24 2009 +0000 @@ -909,7 +909,8 @@ static void nullprpl_set_buddy_icon(PurpleConnection *gc, PurpleStoredImage *img) { purple_debug_info("nullprpl", "setting %s's buddy icon to %s\n", - gc->account->username, purple_imgstore_get_filename(img)); + gc->account->username, + img ? purple_imgstore_get_filename(img) : "(null)"); } static void nullprpl_remove_group(PurpleConnection *gc, PurpleGroup *group) {
--- a/libpurple/protocols/oscar/family_locate.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/oscar/family_locate.c Mon May 18 19:54:24 2009 +0000 @@ -68,12 +68,8 @@ {0x09, 0x46, 0x00, 0x02, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, + /* "Live Video" (SIP/RTC Video) support in Windows AIM 5.5.3501 and newer */ {OSCAR_CAPABILITY_VIDEO, - {0x09, 0x46, 0x01, 0x00, 0x4c, 0x7f, 0x11, 0xd1, - 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, - - /* "Live Video" (SIP/RTC Video) support in Windows AIM 5.5.3501 and newer */ - {OSCAR_CAPABILITY_LIVEVIDEO, {0x09, 0x46, 0x01, 0x01, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}},
--- a/libpurple/protocols/oscar/family_oservice.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/oscar/family_oservice.c Mon May 18 19:54:24 2009 +0000 @@ -151,7 +151,7 @@ memset(&csi, 0, sizeof(csi)); csi.exchange = exchange; - strncpy(csi.name, roomname, sizeof(csi.name)); + g_strlcpy(csi.name, roomname, sizeof(csi.name)); csi.instance = instance; /*
--- a/libpurple/protocols/oscar/oscar.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/oscar/oscar.c Mon May 18 19:54:24 2009 +0000 @@ -714,9 +714,6 @@ case OSCAR_CAPABILITY_ICHATAV: tmp = _("iChat AV"); break; - case OSCAR_CAPABILITY_LIVEVIDEO: - tmp = _("Live Video"); - break; case OSCAR_CAPABILITY_CAMERA: tmp = _("Camera"); break; @@ -930,7 +927,7 @@ PurpleGroup *g = NULL; struct buddyinfo *bi = NULL; char *tmp; - const char *bname, *gname = NULL; + const char *bname = NULL, *gname = NULL; od = purple_connection_get_protocol_data(gc); account = purple_connection_get_account(gc); @@ -938,14 +935,14 @@ if ((user_info == NULL) || ((b == NULL) && (userinfo == NULL))) return; - bname = purple_buddy_get_name(b); if (userinfo == NULL) - userinfo = aim_locate_finduserinfo(od, bname); + userinfo = aim_locate_finduserinfo(od, purple_buddy_get_name(b)); if (b == NULL) b = purple_find_buddy(account, userinfo->bn); if (b != NULL) { + bname = purple_buddy_get_name(b); g = purple_buddy_get_group(b); gname = purple_group_get_name(g); presence = purple_buddy_get_presence(b); @@ -3571,8 +3568,10 @@ purple_account_get_username(account), emailinfo->domain ? "@" : "", emailinfo->domain ? emailinfo->domain : ""); + const char *tos[2] = { to }; + const char *urls[2] = { emailinfo->url }; purple_notify_emails(gc, emailinfo->nummsgs, FALSE, NULL, NULL, - (const char **)&to, (const char **)&emailinfo->url, NULL, NULL); + tos, urls, NULL, NULL); g_free(to); }
--- a/libpurple/protocols/oscar/oscar.h Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/oscar/oscar.h Mon May 18 19:54:24 2009 +0000 @@ -369,12 +369,11 @@ OSCAR_CAPABILITY_SMS = 0x00400000, OSCAR_CAPABILITY_VIDEO = 0x00800000, OSCAR_CAPABILITY_ICHATAV = 0x01000000, - OSCAR_CAPABILITY_LIVEVIDEO = 0x02000000, - OSCAR_CAPABILITY_CAMERA = 0x04000000, - OSCAR_CAPABILITY_ICHAT_SCREENSHARE = 0x08000000, - OSCAR_CAPABILITY_TYPING = 0x10000000, - OSCAR_CAPABILITY_GENERICUNKNOWN = 0x20000000, - OSCAR_CAPABILITY_LAST = 0x40000000 + OSCAR_CAPABILITY_CAMERA = 0x02000000, + OSCAR_CAPABILITY_ICHAT_SCREENSHARE = 0x04000000, + OSCAR_CAPABILITY_TYPING = 0x08000000, + OSCAR_CAPABILITY_GENERICUNKNOWN = 0x10000000, + OSCAR_CAPABILITY_LAST = 0x20000000 } OscarCapability; /*
--- a/libpurple/protocols/qq/qq_crypt.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/qq/qq_crypt.c Mon May 18 19:54:24 2009 +0000 @@ -163,9 +163,11 @@ c32_prev[0] = crypted32[0]; c32_prev[1] = crypted32[1]; /* set next 64 bits want to crypt*/ - crypted_ptr += 8; - memcpy(crypted32, crypted_ptr, sizeof(crypted32)); - plain32[0] = crypted32[0] ^ c32_prev[0]; plain32[1] = crypted32[1] ^ c32_prev[1]; + if (count64 > 0) { + crypted_ptr += 8; + memcpy(crypted32, crypted_ptr, sizeof(crypted32)); + plain32[0] = crypted32[0] ^ c32_prev[0]; plain32[1] = crypted32[1] ^ c32_prev[1]; + } } } @@ -275,7 +277,7 @@ } count64 = crypted_len / 8; - while (count64-- > 0){ + while (--count64 > 0){ c32_prev[0] = crypted32[0]; c32_prev[1] = crypted32[1]; crypted_ptr += 8;
--- a/libpurple/protocols/qq/utils.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/qq/utils.c Mon May 18 19:54:24 2009 +0000 @@ -222,7 +222,8 @@ * The return should be freed later. */ guint8 *hex_str_to_bytes(const gchar *const buffer, gint *out_len) { - gchar *hex_str, *hex_buffer, *cursor, tmp; + gchar *hex_str, *hex_buffer, *cursor; + gchar tmp[2]; guint8 *bytes, nibble1, nibble2; gint index; @@ -242,7 +243,9 @@ index = 0; for (cursor = hex_str; cursor < hex_str + sizeof(gchar) * (strlen(hex_str)) - 1; cursor++) { if (g_ascii_isdigit(*cursor)) { - tmp = *cursor; nibble1 = atoi(&tmp); + tmp[0] = *cursor; + tmp[1] = '\0'; + nibble1 = atoi(tmp); } else if (g_ascii_isalpha(*cursor) && (gint) *cursor - 87 < 16) { nibble1 = (gint) *cursor - 87; } else { @@ -254,7 +257,9 @@ nibble1 = nibble1 << 4; cursor++; if (g_ascii_isdigit(*cursor)) { - tmp = *cursor; nibble2 = atoi(&tmp); + tmp[0] = *cursor; + tmp[1] = '\0'; + nibble2 = atoi(tmp); } else if (g_ascii_isalpha(*cursor) && (gint) (*cursor - 87) < 16) { nibble2 = (gint) *cursor - 87; } else {
--- a/libpurple/protocols/yahoo/Makefile.am Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/yahoo/Makefile.am Mon May 18 19:54:24 2009 +0000 @@ -11,10 +11,6 @@ yahoochat.c \ yahoo_aliases.c \ yahoo_aliases.h \ - yahoo_auth.c \ - yahoo_auth.h \ - yahoo_crypt.h \ - yahoo_crypt.c \ yahoo_doodle.h \ yahoo_doodle.c \ yahoo_filexfer.h \
--- a/libpurple/protocols/yahoo/Makefile.mingw Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/yahoo/Makefile.mingw Mon May 18 19:54:24 2009 +0000 @@ -41,8 +41,6 @@ yahoo.c \ yahoochat.c \ yahoo_aliases.c \ - yahoo_auth.c \ - yahoo_crypt.c \ yahoo_doodle.c \ yahoo_filexfer.c \ yahoo_friend.c \
--- a/libpurple/protocols/yahoo/yahoo.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/yahoo/yahoo.c Mon May 18 19:54:24 2009 +0000 @@ -44,8 +44,6 @@ #include "yahoo.h" #include "yahoochat.h" #include "yahoo_aliases.h" -#include "yahoo_auth.h" -#include "yahoo_crypt.h" #include "yahoo_doodle.h" #include "yahoo_filexfer.h" #include "yahoo_friend.h" @@ -281,7 +279,7 @@ f->status = YAHOO_STATUS_OFFLINE; if (name) { purple_prpl_got_user_status(account, name, "offline", NULL); - purple_prpl_got_user_status_deactive(account, name, YAHOO_STATUS_TYPE_MOBILE); + purple_prpl_got_user_status_deactive(account, name, YAHOO_STATUS_TYPE_MOBILE); } break; } @@ -356,7 +354,7 @@ f->version_id = strtol(pair->value, NULL, 10); break; case 241: /* protocol buddy belongs to */ - if(strtol(pair->value, NULL, 10) == 2) { + if(strtol(pair->value, NULL, 10) == 2) { msn_name = g_strconcat("msn/", name, NULL); name = msn_name; } @@ -512,7 +510,7 @@ break; case 301: /* This is 319 before all s/n's in a group after the first. It is followed by an identical 300. */ - if(temp != NULL) { + if(temp != NULL) { if(protocol == 2) norm_bud = g_strconcat("msn/", temp, NULL); else @@ -530,7 +528,7 @@ purple_blist_add_buddy(b, NULL, g, NULL); } yahoo_do_group_check(account, ht, norm_bud, yd->current_list15_grp); - if(protocol != 0) { + if(protocol != 0) { f->protocol = protocol; purple_debug_info("yahoo", "Setting protocol to %d\n", f->protocol); } @@ -538,7 +536,7 @@ f->presence = YAHOO_PRESENCE_PERM_OFFLINE; /* set p2p status not connected and no p2p packet sent */ - if(protocol == 0) { + if(protocol == 0) { yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_NOT_CONNECTED); f->p2p_packet_sent = 0; } else @@ -778,7 +776,7 @@ if (!g_ascii_strncasecmp(msg, "TYPING", strlen("TYPING")) && (purple_privacy_check(account, from))) { - if(msn) { + if(msn) { if (*stat == '1') serv_got_typing(gc, msn_from, 0, PURPLE_TYPING); else @@ -843,7 +841,7 @@ while (l != NULL) { struct yahoo_pair *pair = l->data; - if (pair->key == 4) { + if (pair->key == 4) { sms = g_new0(struct _yahoo_im, 1); sms->from = g_strdup_printf("+%s", pair->value); sms->time = time(NULL); @@ -861,8 +859,8 @@ l = l->next; } - if( (pkt->status == -1) || (pkt->status == YAHOO_STATUS_DISCONNECTED) ) { - if (server_msg) { + if( (pkt->status == -1) || (pkt->status == YAHOO_STATUS_DISCONNECTED) ) { + if (server_msg) { PurpleConversation *c; c = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, sms->from, account); if (c == NULL) @@ -929,7 +927,7 @@ if (im) im->msg = pair->value; } - if (pair->key == 241) { + if (pair->key == 241) { if(strtol(pair->value, NULL, 10) == 2) msn = TRUE; } @@ -1027,7 +1025,7 @@ if (!strcmp(m, "<ding>")) { char *username; - if(c == NULL) { + if(c == NULL) { if(msn) c = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, msn_from); else @@ -1057,7 +1055,7 @@ g_free(m2); /* laters : implement buddy icon for msn friends */ - if(!msn) { + if(!msn) { if ((f = yahoo_friend_find(gc, im->from)) && im->buddy_icon == 2) { if (yahoo_friend_get_buddy_icon_need_request(f)) { yahoo_send_picture_request(gc, im->from); @@ -1520,18 +1518,26 @@ g_free(dec_subj); g_free(from); } else if (count > 0) { - const char *to = purple_account_get_username(account); - const char *url = yahoo_mail_url; - - purple_notify_emails(gc, count, FALSE, NULL, NULL, &to, &url, + const char *tos[2] = { purple_account_get_username(account) }; + const char *urls[2] = { yahoo_mail_url }; + + purple_notify_emails(gc, count, FALSE, NULL, NULL, tos, urls, NULL, NULL); } } + +/* We use this structure once while we authenticate */ +struct yahoo_auth_data +{ + PurpleConnection *gc; + char *seed; +}; + /* This is the y64 alphabet... it's like base64, but has a . and a _ */ static const char base64digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._"; -/* This is taken from Sylpheed by Hiroyuki Yamamoto. We have our own tobase64 function - * in util.c, but it has a bug I don't feel like finding right now ;) */ +/* This is taken from Sylpheed by Hiroyuki Yamamoto. We have our own tobase64 function + * in util.c, but it is different from the one yahoo uses */ static void to_y64(char *out, const unsigned char *in, gsize inlen) /* raw bytes in quasi-big-endian order to base 64 string (NUL-terminated) */ { @@ -1558,605 +1564,270 @@ *out = '\0'; } -static void yahoo_process_auth_old(PurpleConnection *gc, const char *seed) +static void yahoo_auth16_stage3(PurpleConnection *gc, const char *crypt) { - struct yahoo_packet *pack; + struct yahoo_data *yd = gc->proto_data; PurpleAccount *account = purple_connection_get_account(gc); const char *name = purple_normalize(account, purple_account_get_username(account)); - const char *pass = purple_connection_get_password(gc); - struct yahoo_data *yd = gc->proto_data; - - /* So, Yahoo has stopped supporting its older clients in India, and undoubtedly - * will soon do so in the rest of the world. - * - * The new clients use this authentication method. I warn you in advance, it's - * bizarre, convoluted, inordinately complicated. It's also no more secure than - * crypt() was. The only purpose this scheme could serve is to prevent third - * party clients from connecting to their servers. - * - * Sorry, Yahoo. - */ - - PurpleCipher *cipher; - PurpleCipherContext *context; - guchar digest[16]; - - char *crypt_result; - char password_hash[25]; - char crypt_hash[25]; - char *hash_string_p = g_malloc(50 + strlen(name)); - char *hash_string_c = g_malloc(50 + strlen(name)); - - char checksum; - - int sv; - - char result6[25]; - char result96[25]; - - sv = seed[15]; - sv = sv % 8; - - cipher = purple_ciphers_find_cipher("md5"); - context = purple_cipher_context_new(cipher, NULL); - - purple_cipher_context_append(context, (const guchar *)pass, strlen(pass)); - purple_cipher_context_digest(context, sizeof(digest), digest, NULL); - - to_y64(password_hash, digest, 16); - - crypt_result = yahoo_crypt(pass, "$1$_2S43d5f$"); - - purple_cipher_context_reset(context, NULL); - purple_cipher_context_append(context, (const guchar *)crypt_result, strlen(crypt_result)); - purple_cipher_context_digest(context, sizeof(digest), digest, NULL); - to_y64(crypt_hash, digest, 16); - - switch (sv) { - case 1: - case 6: - checksum = seed[seed[9] % 16]; - g_snprintf(hash_string_p, strlen(name) + 50, - "%c%s%s%s", checksum, name, seed, password_hash); - g_snprintf(hash_string_c, strlen(name) + 50, - "%c%s%s%s", checksum, name, seed, crypt_hash); - break; - case 2: - case 7: - checksum = seed[seed[15] % 16]; - g_snprintf(hash_string_p, strlen(name) + 50, - "%c%s%s%s", checksum, seed, password_hash, name); - g_snprintf(hash_string_c, strlen(name) + 50, - "%c%s%s%s", checksum, seed, crypt_hash, name); - break; - case 3: - checksum = seed[seed[1] % 16]; - g_snprintf(hash_string_p, strlen(name) + 50, - "%c%s%s%s", checksum, name, password_hash, seed); - g_snprintf(hash_string_c, strlen(name) + 50, - "%c%s%s%s", checksum, name, crypt_hash, seed); - break; - case 4: - checksum = seed[seed[3] % 16]; - g_snprintf(hash_string_p, strlen(name) + 50, - "%c%s%s%s", checksum, password_hash, seed, name); - g_snprintf(hash_string_c, strlen(name) + 50, - "%c%s%s%s", checksum, crypt_hash, seed, name); - break; - case 0: - case 5: - checksum = seed[seed[7] % 16]; - g_snprintf(hash_string_p, strlen(name) + 50, - "%c%s%s%s", checksum, password_hash, name, seed); - g_snprintf(hash_string_c, strlen(name) + 50, - "%c%s%s%s", checksum, crypt_hash, name, seed); - break; - } - - purple_cipher_context_reset(context, NULL); - purple_cipher_context_append(context, (const guchar *)hash_string_p, strlen(hash_string_p)); - purple_cipher_context_digest(context, sizeof(digest), digest, NULL); - to_y64(result6, digest, 16); - - purple_cipher_context_reset(context, NULL); - purple_cipher_context_append(context, (const guchar *)hash_string_c, strlen(hash_string_c)); - purple_cipher_context_digest(context, sizeof(digest), digest, NULL); - purple_cipher_context_destroy(context); - to_y64(result96, digest, 16); - - pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, YAHOO_STATUS_AVAILABLE, 0); - - if(yd->jp) { - yahoo_packet_hash(pack, "sssss", - 0, name, - 6, result6, - 96, result96, - 1, name, - 135, YAHOOJP_CLIENT_VERSION); - } else { - yahoo_packet_hash(pack, "ssssss", - 0, name, - 6, result6, - 96, result96, - 1, name, - 244, YAHOO_CLIENT_VERSION_ID, - 135, YAHOO_CLIENT_VERSION); - } - - yahoo_packet_send_and_free(pack, yd); - - g_free(hash_string_p); - g_free(hash_string_c); -} - -/* I'm dishing out some uber-mad props to Cerulean Studios for cracking this - * and sending the fix! Thanks guys. */ - -static void yahoo_process_auth_new(PurpleConnection *gc, const char *seed) -{ - struct yahoo_packet *pack = NULL; - PurpleAccount *account = purple_connection_get_account(gc); - const char *name = purple_normalize(account, purple_account_get_username(account)); - const char *pass = purple_connection_get_password(gc); - char *enc_pass; - struct yahoo_data *yd = gc->proto_data; - - PurpleCipher *md5_cipher; - PurpleCipherContext *md5_ctx; - guchar md5_digest[16]; - - PurpleCipher *sha1_cipher; - PurpleCipherContext *sha1_ctx1; - PurpleCipherContext *sha1_ctx2; - - char *alphabet1 = "FBZDWAGHrJTLMNOPpRSKUVEXYChImkwQ"; - char *alphabet2 = "F0E1D2C3B4A59687abcdefghijklmnop"; - - char *challenge_lookup = "qzec2tb3um1olpar8whx4dfgijknsvy5"; - char *operand_lookup = "+|&%/*^-"; - char *delimit_lookup = ",;"; - - char *password_hash = (char *)g_malloc(25); - char *crypt_hash = (char *)g_malloc(25); - char *crypt_result = NULL; - - unsigned char pass_hash_xor1[64]; - unsigned char pass_hash_xor2[64]; - unsigned char crypt_hash_xor1[64]; - unsigned char crypt_hash_xor2[64]; - char resp_6[100]; - char resp_96[100]; - - unsigned char digest1[20]; - unsigned char digest2[20]; - unsigned char comparison_src[20]; - unsigned char magic_key_char[4]; - const char *magic_ptr; - - unsigned int magic[64]; - unsigned int magic_work = 0; - unsigned int magic_4 = 0; - - int x; - int y; - int cnt = 0; - int magic_cnt = 0; - int magic_len; - - memset(password_hash, 0, 25); - memset(crypt_hash, 0, 25); - memset(&pass_hash_xor1, 0, 64); - memset(&pass_hash_xor2, 0, 64); - memset(&crypt_hash_xor1, 0, 64); - memset(&crypt_hash_xor2, 0, 64); - memset(&digest1, 0, 20); - memset(&digest2, 0, 20); - memset(&magic, 0, 64); - memset(&resp_6, 0, 100); - memset(&resp_96, 0, 100); - memset(&magic_key_char, 0, 4); - memset(&comparison_src, 0, 20); + PurpleCipher *md5_cipher; + PurpleCipherContext *md5_ctx; + guchar md5_digest[16]; + gchar base64_string[25]; + struct yahoo_packet *pkt; + + purple_debug_info("yahoo","Authentication: In yahoo_auth16_stage3\n"); md5_cipher = purple_ciphers_find_cipher("md5"); md5_ctx = purple_cipher_context_new(md5_cipher, NULL); - - sha1_cipher = purple_ciphers_find_cipher("sha1"); - sha1_ctx1 = purple_cipher_context_new(sha1_cipher, NULL); - sha1_ctx2 = purple_cipher_context_new(sha1_cipher, NULL); - - /* - * Magic: Phase 1. Generate what seems to be a 30 byte value (could change if base64 - * ends up differently? I don't remember and I'm tired, so use a 64 byte buffer. - */ - - magic_ptr = seed; - - while (*magic_ptr != '\0') { - char *loc; - - /* Ignore parentheses. */ - - if (*magic_ptr == '(' || *magic_ptr == ')') { - magic_ptr++; - continue; + purple_cipher_context_append(md5_ctx, (guchar *)crypt, strlen(crypt)); + purple_cipher_context_digest(md5_ctx, sizeof(md5_digest), md5_digest, NULL); + + to_y64(base64_string, md5_digest, 16); + + pkt = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, YAHOO_STATUS_WEBLOGIN, yd->session_id); + if(yd->jp) { + yahoo_packet_hash(pkt, "ssssssss", + 1, name, + 0, name, + 277, yd->cookie_y, + 278, yd->cookie_t, + 307, base64_string, + 2, name, + 2, "1", + 135, YAHOOJP_CLIENT_VERSION); + } else { + yahoo_packet_hash(pkt, "sssssssss", + 1, name, + 0, name, + 277, yd->cookie_y, + 278, yd->cookie_t, + 307, base64_string, + 244, YAHOO_CLIENT_VERSION_ID, + 2, name, + 2, "1", + 135, YAHOO_CLIENT_VERSION); + } + if (yd->picture_checksum) + yahoo_packet_hash_int(pkt, 192, yd->picture_checksum); + yahoo_packet_send_and_free(pkt, yd); + + purple_cipher_context_destroy(md5_ctx); +} + +static void yahoo_auth16_stage2(PurpleUtilFetchUrlData *unused, gpointer user_data, const gchar *ret_data, size_t len, const gchar *error_message) +{ + struct yahoo_auth_data *auth_data = user_data; + PurpleConnection *gc = auth_data->gc; + struct yahoo_data *yd; + gboolean try_login_on_error = FALSE; + + purple_debug_info("yahoo","Authentication: In yahoo_auth16_stage2\n"); + + if (!PURPLE_CONNECTION_IS_VALID(gc)) { + g_free(auth_data->seed); + g_free(auth_data); + g_return_if_reached(); + } + + yd = (struct yahoo_data *)gc->proto_data; + + if (error_message != NULL) { + purple_debug_error("yahoo", "Login Failed, unable to retrieve stage 2 url: %s\n", error_message); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_message); + g_free(auth_data->seed); + g_free(auth_data); + return; + } + else if (len > 0 && ret_data && *ret_data) { + gchar **split_data = g_strsplit(ret_data, "\r\n", -1); + int totalelements = g_strv_length(split_data); + int response_no = -1; + char *crumb = NULL; + char *crypt = NULL; + + if (totalelements >= 5) { + response_no = strtol(split_data[1], NULL, 10); + crumb = g_strdup(split_data[2] + strlen("crumb=")); + yd->cookie_y = g_strdup(split_data[3] + strlen("Y=")); + yd->cookie_t = g_strdup(split_data[4] + strlen("T=")); } - /* Characters and digits verify against the challenge lookup. */ - - if (isalpha(*magic_ptr) || isdigit(*magic_ptr)) { - loc = strchr(challenge_lookup, *magic_ptr); - if (!loc) { - /* SME XXX Error - disconnect here */ - } - - /* Get offset into lookup table and shl 3. */ - - magic_work = loc - challenge_lookup; - magic_work <<= 3; - - magic_ptr++; - continue; - } else { - unsigned int local_store; - - loc = strchr(operand_lookup, *magic_ptr); - if (!loc) { - /* SME XXX Disconnect */ - } - - local_store = loc - operand_lookup; - - /* Oops; how did this happen? */ - - if (magic_cnt >= 64) - break; - - magic[magic_cnt++] = magic_work | local_store; - magic_ptr++; - continue; - } + g_strfreev(split_data); + + if(response_no != 0) { + /* Some error in the login process */ + PurpleConnectionError error; + char *error_reason = NULL; + + switch(response_no) { + case -1: + /* Some error in the received stream */ + error_reason = g_strdup(_("Received invalid data")); + error = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + break; + case 100: + /* Unknown error */ + error_reason = g_strdup(_("Unknown error")); + error = PURPLE_CONNECTION_ERROR_OTHER_ERROR; + break; + default: + /* if we have everything we need, why not try to login irrespective of response */ + if((crumb != NULL) && (yd->cookie_y != NULL) && (yd->cookie_t != NULL)) { + try_login_on_error = TRUE; + break; + } + error_reason = g_strdup(_("Unknown error")); + error = PURPLE_CONNECTION_ERROR_OTHER_ERROR; + break; } - - magic_len = magic_cnt; - magic_cnt = 0; - - /* Magic: Phase 2. Take generated magic value and sprinkle fairy - * dust on the values. - */ - - for (magic_cnt = magic_len - 2; magic_cnt >= 0; magic_cnt--) { - unsigned char byte1; - unsigned char byte2; - - /* Bad. Abort. */ - - if ((magic_cnt + 1 > magic_len) || (magic_cnt > magic_len)) - break; - - byte1 = magic[magic_cnt]; - byte2 = magic[magic_cnt+1]; - - byte1 *= 0xcd; - byte1 ^= byte2; - - magic[magic_cnt+1] = byte1; - } - - /* - * Magic: Phase 3. This computes 20 bytes. The first 4 bytes are used as our magic - * key (and may be changed later); the next 16 bytes are an MD5 sum of the magic key - * plus 3 bytes. The 3 bytes are found by looping, and they represent the offsets - * into particular functions we'll later call to potentially alter the magic key. - * - * %-) - */ - - magic_cnt = 1; - x = 0; - - do { - unsigned int bl = 0; - unsigned int cl = magic[magic_cnt++]; - - if (magic_cnt >= magic_len) - break; - - if (cl > 0x7F) { - if (cl < 0xe0) - bl = cl = (cl & 0x1f) << 6; - else { - bl = magic[magic_cnt++]; - cl = (cl & 0x0f) << 6; - bl = ((bl & 0x3f) + cl) << 6; - } - - cl = magic[magic_cnt++]; - bl = (cl & 0x3f) + bl; - } else - bl = cl; - - comparison_src[x++] = (bl & 0xff00) >> 8; - comparison_src[x++] = bl & 0xff; - } while (x < 20); - - /* First four bytes are magic key. */ - memcpy(&magic_key_char[0], comparison_src, 4); - magic_4 = magic_key_char[0] | (magic_key_char[1] << 8) | - (magic_key_char[2] << 16) | (magic_key_char[3] << 24); - - /* - * Magic: Phase 4. Determine what function to use later by getting outside/inside - * loop values until we match our previous buffer. - */ - for (x = 0; x < 65535; x++) { - int leave = 0; - - for (y = 0; y < 5; y++) { - unsigned char test[3]; - - /* Calculate buffer. */ - test[0] = x; - test[1] = x >> 8; - test[2] = y; - - purple_cipher_context_reset(md5_ctx, NULL); - purple_cipher_context_append(md5_ctx, magic_key_char, 4); - purple_cipher_context_append(md5_ctx, test, 3); - purple_cipher_context_digest(md5_ctx, sizeof(md5_digest), - md5_digest, NULL); - - if (!memcmp(md5_digest, comparison_src+4, 16)) { - leave = 1; - break; + if(error_reason) { + purple_debug_error("yahoo", "Authentication error: %s\n", + error_reason); + purple_connection_error_reason(gc, error, error_reason); + g_free(error_reason); + g_free(auth_data->seed); + g_free(auth_data); + return; } } - if (leave == 1) - break; - } - - /* If y != 0, we need some help. */ - if (y != 0) { - unsigned int updated_key; - - /* Update magic stuff. - * Call it twice because Yahoo's encryption is super bad ass. - */ - updated_key = yahoo_auth_finalCountdown(magic_4, 0x60, y, x); - updated_key = yahoo_auth_finalCountdown(updated_key, 0x60, y, x); - - magic_key_char[0] = updated_key & 0xff; - magic_key_char[1] = (updated_key >> 8) & 0xff; - magic_key_char[2] = (updated_key >> 16) & 0xff; - magic_key_char[3] = (updated_key >> 24) & 0xff; + crypt = g_strconcat(crumb, auth_data->seed, NULL); + yahoo_auth16_stage3(gc, crypt); + g_free(crypt); + g_free(crumb); } - - enc_pass = yahoo_string_encode(gc, pass, NULL); - - /* Get password and crypt hashes as per usual. */ - purple_cipher_context_reset(md5_ctx, NULL); - purple_cipher_context_append(md5_ctx, (const guchar *)enc_pass, strlen(enc_pass)); - purple_cipher_context_digest(md5_ctx, sizeof(md5_digest), - md5_digest, NULL); - to_y64(password_hash, md5_digest, 16); - - crypt_result = yahoo_crypt(enc_pass, "$1$_2S43d5f$"); - - g_free(enc_pass); - enc_pass = NULL; - - purple_cipher_context_reset(md5_ctx, NULL); - purple_cipher_context_append(md5_ctx, (const guchar *)crypt_result, strlen(crypt_result)); - purple_cipher_context_digest(md5_ctx, sizeof(md5_digest), - md5_digest, NULL); - to_y64(crypt_hash, md5_digest, 16); - - /* Our first authentication response is based off of the password hash. */ - for (x = 0; x < (int)strlen(password_hash); x++) - pass_hash_xor1[cnt++] = password_hash[x] ^ 0x36; - - if (cnt < 64) - memset(&(pass_hash_xor1[cnt]), 0x36, 64-cnt); - - cnt = 0; - - for (x = 0; x < (int)strlen(password_hash); x++) - pass_hash_xor2[cnt++] = password_hash[x] ^ 0x5c; - - if (cnt < 64) - memset(&(pass_hash_xor2[cnt]), 0x5c, 64-cnt); - - /* - * The first context gets the password hash XORed with 0x36 plus a magic value - * which we previously extrapolated from our challenge. - */ - - purple_cipher_context_append(sha1_ctx1, pass_hash_xor1, 64); - if (y >= 3) - purple_cipher_context_set_option(sha1_ctx1, "sizeLo", GINT_TO_POINTER(0x1ff)); - purple_cipher_context_append(sha1_ctx1, magic_key_char, 4); - purple_cipher_context_digest(sha1_ctx1, sizeof(digest1), digest1, NULL); - - /* - * The second context gets the password hash XORed with 0x5c plus the SHA-1 digest - * of the first context. - */ - - purple_cipher_context_append(sha1_ctx2, pass_hash_xor2, 64); - purple_cipher_context_append(sha1_ctx2, digest1, 20); - purple_cipher_context_digest(sha1_ctx2, sizeof(digest2), digest2, NULL); - - /* - * Now that we have digest2, use it to fetch characters from an alphabet to construct - * our first authentication response. - */ - - for (x = 0; x < 20; x += 2) { - unsigned int val = 0; - unsigned int lookup = 0; - - char byte[6]; - - memset(&byte, 0, 6); - - /* First two bytes of digest stuffed together. */ - - val = digest2[x]; - val <<= 8; - val += digest2[x+1]; - - lookup = (val >> 0x0b); - lookup &= 0x1f; - if (lookup >= strlen(alphabet1)) - break; - sprintf(byte, "%c", alphabet1[lookup]); - strcat(resp_6, byte); - strcat(resp_6, "="); - - lookup = (val >> 0x06); - lookup &= 0x1f; - if (lookup >= strlen(alphabet2)) - break; - sprintf(byte, "%c", alphabet2[lookup]); - strcat(resp_6, byte); - - lookup = (val >> 0x01); - lookup &= 0x1f; - if (lookup >= strlen(alphabet2)) - break; - sprintf(byte, "%c", alphabet2[lookup]); - strcat(resp_6, byte); - - lookup = (val & 0x01); - if (lookup >= strlen(delimit_lookup)) - break; - sprintf(byte, "%c", delimit_lookup[lookup]); - strcat(resp_6, byte); + g_free(auth_data->seed); + g_free(auth_data); +} + +static void yahoo_auth16_stage1_cb(PurpleUtilFetchUrlData *unused, gpointer user_data, const gchar *ret_data, size_t len, const gchar *error_message) +{ + struct yahoo_auth_data *auth_data = user_data; + PurpleConnection *gc = auth_data->gc; + + purple_debug_info("yahoo","Authentication: In yahoo_auth16_stage1_cb\n"); + + if (!PURPLE_CONNECTION_IS_VALID(gc)) { + g_free(auth_data->seed); + g_free(auth_data); + g_return_if_reached(); + } + + if (error_message != NULL) { + purple_debug_error("yahoo", "Login Failed, unable to retrieve login url: %s\n", error_message); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_message); + g_free(auth_data->seed); + g_free(auth_data); + return; } - - /* Our second authentication response is based off of the crypto hash. */ - - cnt = 0; - memset(&digest1, 0, 20); - memset(&digest2, 0, 20); - - for (x = 0; x < (int)strlen(crypt_hash); x++) - crypt_hash_xor1[cnt++] = crypt_hash[x] ^ 0x36; - - if (cnt < 64) - memset(&(crypt_hash_xor1[cnt]), 0x36, 64-cnt); - - cnt = 0; - - for (x = 0; x < (int)strlen(crypt_hash); x++) - crypt_hash_xor2[cnt++] = crypt_hash[x] ^ 0x5c; - - if (cnt < 64) - memset(&(crypt_hash_xor2[cnt]), 0x5c, 64-cnt); - - purple_cipher_context_reset(sha1_ctx1, NULL); - purple_cipher_context_reset(sha1_ctx2, NULL); - - /* - * The first context gets the password hash XORed with 0x36 plus a magic value - * which we previously extrapolated from our challenge. - */ - - purple_cipher_context_append(sha1_ctx1, crypt_hash_xor1, 64); - if (y >= 3) { - purple_cipher_context_set_option(sha1_ctx1, "sizeLo", - GINT_TO_POINTER(0x1ff)); + else if (len > 0 && ret_data && *ret_data) { + gchar **split_data = g_strsplit(ret_data, "\r\n", -1); + int totalelements = g_strv_length(split_data); + int response_no = -1; + char *token = NULL; + + if(totalelements >= 5) { + response_no = strtol(split_data[1], NULL, 10); + token = g_strdup(split_data[2] + strlen("ymsgr=")); + } + + g_strfreev(split_data); + + if(response_no != 0) { + /* Some error in the login process */ + PurpleConnectionError error; + char *error_reason; + + switch(response_no) { + case -1: + /* Some error in the received stream */ + error_reason = g_strdup(_("Received invalid data")); + error = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + break; + case 1212: + /* Password incorrect */ + error_reason = g_strdup(_("Incorrect Password")); + error = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; + break; + case 1213: + /* security lock from too many failed login attempts */ + error_reason = g_strdup(_("Account locked: Too many failed login attempts")); + error = PURPLE_CONNECTION_ERROR_OTHER_ERROR; + break; + case 1235: + /* the username does not exist */ + error_reason = g_strdup(_("Username does not exist")); + error = PURPLE_CONNECTION_ERROR_INVALID_USERNAME; + break; + case 1236: + /* indicates a lock of some description */ + error_reason = g_strdup(_("Account locked: See the debug log")); + error = PURPLE_CONNECTION_ERROR_OTHER_ERROR; + break; + case 100: + /* username or password missing */ + error_reason = g_strdup(_("Username or password missing")); + error = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; + break; + default: + /* Unknown error! */ + error_reason = g_strdup(_("Unknown error")); + error = PURPLE_CONNECTION_ERROR_OTHER_ERROR; + break; + } + purple_debug_error("yahoo", "Authentication error: %s\n", + error_reason); + purple_connection_error_reason(gc, error, error_reason); + g_free(error_reason); + g_free(auth_data->seed); + g_free(auth_data); + } + else { + /* OK to login, correct information provided */ + PurpleUtilFetchUrlData *url_data = NULL; + char *url = NULL; + gboolean yahoojp = purple_account_get_bool(purple_connection_get_account(gc), + "yahoojp", 0); + + url = g_strdup_printf(yahoojp ? YAHOOJP_LOGIN_URL : YAHOO_LOGIN_URL, token); + url_data = purple_util_fetch_url_request(url, TRUE, YAHOO_CLIENT_USERAGENT, TRUE, NULL, FALSE, yahoo_auth16_stage2, auth_data); + g_free(url); + g_free(token); + } } - purple_cipher_context_append(sha1_ctx1, magic_key_char, 4); - purple_cipher_context_digest(sha1_ctx1, sizeof(digest1), digest1, NULL); - - /* - * The second context gets the password hash XORed with 0x5c plus the SHA-1 digest - * of the first context. - */ - - purple_cipher_context_append(sha1_ctx2, crypt_hash_xor2, 64); - purple_cipher_context_append(sha1_ctx2, digest1, 20); - purple_cipher_context_digest(sha1_ctx2, sizeof(digest2), digest2, NULL); - - /* - * Now that we have digest2, use it to fetch characters from an alphabet to construct - * our first authentication response. - */ - - for (x = 0; x < 20; x += 2) { - unsigned int val = 0; - unsigned int lookup = 0; - - char byte[6]; - - memset(&byte, 0, 6); - - /* First two bytes of digest stuffed together. */ - - val = digest2[x]; - val <<= 8; - val += digest2[x+1]; - - lookup = (val >> 0x0b); - lookup &= 0x1f; - if (lookup >= strlen(alphabet1)) - break; - sprintf(byte, "%c", alphabet1[lookup]); - strcat(resp_96, byte); - strcat(resp_96, "="); - - lookup = (val >> 0x06); - lookup &= 0x1f; - if (lookup >= strlen(alphabet2)) - break; - sprintf(byte, "%c", alphabet2[lookup]); - strcat(resp_96, byte); - - lookup = (val >> 0x01); - lookup &= 0x1f; - if (lookup >= strlen(alphabet2)) - break; - sprintf(byte, "%c", alphabet2[lookup]); - strcat(resp_96, byte); - - lookup = (val & 0x01); - if (lookup >= strlen(delimit_lookup)) - break; - sprintf(byte, "%c", delimit_lookup[lookup]); - strcat(resp_96, byte); +} + +static void yahoo_auth16_stage1(PurpleConnection *gc, const char *seed) +{ + PurpleUtilFetchUrlData *url_data = NULL; + struct yahoo_auth_data *auth_data = NULL; + char *url = NULL; + char *encoded_username; + char *encoded_password; + gboolean yahoojp; + + purple_debug_info("yahoo", "Authentication: In yahoo_auth16_stage1\n"); + + if(!purple_ssl_is_supported()) { + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, _("SSL support unavailable")); + return; } - purple_debug_info("yahoo", "yahoo status: %d\n", yd->current_status); - pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, yd->current_status, 0); - - if(yd->jp) { - yahoo_packet_hash(pack, "sssss", - 0, name, - 6, resp_6, - 96, resp_96, - 1, name, - 135, YAHOOJP_CLIENT_VERSION); - } else { - yahoo_packet_hash(pack, "ssssss", - 0, name, - 6, resp_6, - 96, resp_96, - 1, name, - 244, YAHOO_CLIENT_VERSION_ID, - 135, YAHOO_CLIENT_VERSION); - } - - if (yd->picture_checksum) - yahoo_packet_hash_int(pack, 192, yd->picture_checksum); - - yahoo_packet_send_and_free(pack, yd); - - purple_cipher_context_destroy(md5_ctx); - purple_cipher_context_destroy(sha1_ctx1); - purple_cipher_context_destroy(sha1_ctx2); - - g_free(password_hash); - g_free(crypt_hash); + + yahoojp = purple_account_get_bool(purple_connection_get_account(gc), + "yahoojp", 0); + auth_data = g_new0(struct yahoo_auth_data, 1); + auth_data->gc = gc; + auth_data->seed = g_strdup(seed); + + encoded_username = g_strdup(purple_url_encode(purple_account_get_username(purple_connection_get_account(gc)))); + encoded_password = g_strdup(purple_url_encode(purple_connection_get_password(gc))); + url = g_strdup_printf(yahoojp ? YAHOOJP_TOKEN_URL : YAHOO_TOKEN_URL, + encoded_username, encoded_password, purple_url_encode(seed)); + g_free(encoded_password); + g_free(encoded_username); + + url_data = purple_util_fetch_url_request(url, TRUE, YAHOO_CLIENT_USERAGENT, TRUE, NULL, FALSE, yahoo_auth16_stage1_cb, auth_data); + g_free(url); } static void yahoo_process_auth(PurpleConnection *gc, struct yahoo_packet *pkt) @@ -2181,11 +1852,10 @@ if (seed) { switch (m) { case 0: - yahoo_process_auth_old(gc, seed); - break; + /* used to be for really old auth routine, dont support now */ case 1: - case 2: /* This case seems to work, could probably use testing */ - yahoo_process_auth_new(gc, seed); + case 2: /* Yahoo ver 16 authentication */ + yahoo_auth16_stage1(gc, seed); break; default: { @@ -2198,7 +1868,7 @@ purple_notify_error(gc, "", _("Failed Yahoo! Authentication"), buf); g_free(buf); - yahoo_process_auth_new(gc, seed); /* Can't hurt to try it anyway. */ + yahoo_auth16_stage1(gc, seed); /* Can't hurt to try it anyway. */ break; } } @@ -2426,10 +2096,10 @@ if(protocol) f->protocol = protocol; - if( !g_hash_table_lookup(yd->peers, who) ) { + if( !g_hash_table_lookup(yd->peers, who) ) { /* we are not connected as client, so set friend to not connected */ if(msn) - yahoo_friend_set_p2p_status(f,YAHOO_P2PSTATUS_DO_NOT_CONNECT); + yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_DO_NOT_CONNECT); else { yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_NOT_CONNECTED); f->p2p_packet_sent = 0; @@ -2565,7 +2235,7 @@ * WHEN WE ARE SERVER: we send val_13 = 0 to yahoo server, peer sends us val_13 = 1, we send val_13 = 5, * receive val_13 = 6, send val_13 = 7, receive val_13 = 7. HALT. Keep sending val_13 = 7 as keep alive. */ - switch(p2p_data->val_13) { + switch(p2p_data->val_13) { case 1 : val_13_to_send = 5; break; case 5 : val_13_to_send = 6; break; case 6 : val_13_to_send = 7; break; @@ -2590,12 +2260,12 @@ yahoo_packet_free(pkt_to_send); if( val_13_to_send == 7 ) - if( !g_hash_table_lookup(yd->peers, p2p_data->host_username) ) { + if( !g_hash_table_lookup(yd->peers, p2p_data->host_username) ) { g_hash_table_insert(yd->peers, g_strdup(p2p_data->host_username), p2p_data); /* If the peer is a friend, set him connected */ f = yahoo_friend_find(p2p_data->gc, p2p_data->host_username); - if (f) { - if(p2p_data->connection_type == YAHOO_P2P_WE_ARE_SERVER) { + if (f) { + if(p2p_data->connection_type == YAHOO_P2P_WE_ARE_SERVER) { p2p_data->session_id = f->session_id; yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_WE_ARE_SERVER); } @@ -2668,7 +2338,7 @@ yahoo_packet_read(pkt, buf + pos, pktlen); /* packet processing */ - switch(pkt->service) { + switch(pkt->service) { case YAHOO_SERVICE_P2PFILEXFER: yahoo_p2p_process_p2pfilexfer(data, source, pkt); break; @@ -2754,7 +2424,7 @@ if(!(p2p_data = data)) return ; - if(listenfd == -1) { + if(listenfd == -1) { purple_debug_warning("yahoo","p2p: error starting p2p server\n"); yahoo_p2p_disconnect_destroy_data(data); return; @@ -2855,7 +2525,7 @@ return ; yd = p2p_data->gc->proto_data; - if(error_message != NULL) { + if(error_message != NULL) { purple_debug_warning("yahoo","p2p: %s\n",error_message); yahoo_send_p2p_pkt(p2p_data->gc, p2p_data->host_username, 2);/* send p2p init packet with val_13=2 */ @@ -2962,7 +2632,7 @@ account = purple_connection_get_account(gc); - if(val_11==0) { + if(val_11==0) { if(!f) return; else @@ -2979,7 +2649,7 @@ p2p_data->source = -1; /* connect to host */ - if((purple_proxy_connect(NULL, account, host_ip, YAHOO_PAGER_PORT_P2P, yahoo_p2p_init_cb, p2p_data))==NULL) { + if((purple_proxy_connect(NULL, account, host_ip, YAHOO_PAGER_PORT_P2P, yahoo_p2p_init_cb, p2p_data))==NULL) { purple_debug_info("yahoo","p2p: Connection to %s failed\n", host_ip); g_free(p2p_data->host_ip); g_free(p2p_data->host_username); @@ -3411,7 +3081,7 @@ i += strlen("Set-Cookie: "); for (;*i != ';' && *i != '\0'; i++) g_string_append_c(s, *i); - + g_string_append(s, "; "); /* Should these cookies be included too when trying for xfer? * It seems to work without these @@ -4272,14 +3942,14 @@ gchar *request = g_strdup_printf( "POST %s/config/cookie_token HTTP/1.0\r\n" "Cookie: T=%s; path=/; domain=.yahoo.com; Y=%s;\r\n" - "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n" + "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" "Host: login.yahoo.com\r\n" "Content-Length: 0\r\n\r\n", use_whole_url ? base_url : "", yd->cookie_t, yd->cookie_y); url_data = purple_util_fetch_url_request(base_url, use_whole_url, - "Mozilla/4.0 (compatible; MSIE 5.5)", TRUE, request, FALSE, + YAHOO_CLIENT_USERAGENT, TRUE, request, FALSE, yahoo_get_inbox_token_cb, gc); g_free(request); @@ -4358,7 +4028,7 @@ PurpleAccount *account = purple_connection_get_account(gc); PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, sms_cb_data->who, account); - if (error_message != NULL) { + if (error_message != NULL) { purple_conversation_write(conv, NULL, "Cant send SMS, Unable to obtain mobile carrier", PURPLE_MESSAGE_SYSTEM, time(NULL)); g_free(sms_cb_data->who); @@ -4380,7 +4050,7 @@ purple_debug_info("yahoo","SMS validate data: Mobile:%s, Status:%s, Carrier:%s\n", mobile_no, status, carrier); - if( strcmp(status, "Valid") == 0) { + if( strcmp(status, "Valid") == 0) { g_hash_table_insert(yd->sms_carrier, g_strdup_printf("+%s", mobile_no), g_strdup(carrier)); yahoo_send_im(sms_cb_data->gc, sms_cb_data->who, sms_cb_data->what, PURPLE_MESSAGE_SEND); } @@ -4430,7 +4100,7 @@ request = g_strdup_printf( "POST /mobileno?intl=us&version=%s HTTP/1.1\r\n" "Cookie: T=%s; path=/; domain=.yahoo.com; Y=%s; path=/; domain=.yahoo.com;\r\n" - "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n" + "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" "Host: validate.msg.yahoo.com\r\n" "Content-Length: %" G_GSIZE_FORMAT "\r\n" "Cache-Control: no-cache\r\n\r\n%s", @@ -4441,13 +4111,13 @@ use_whole_url = TRUE; url_data = purple_util_fetch_url_request(YAHOO_SMS_CARRIER_URL, use_whole_url, - "Mozilla/4.0 (compatible; MSIE 5.5)", TRUE, request, FALSE, + YAHOO_CLIENT_USERAGENT, TRUE, request, FALSE, yahoo_get_sms_carrier_cb, data); g_free(request); g_free(validate_request_str); - if (!url_data) { + if (!url_data) { PurpleAccount *account = purple_connection_get_account(gc); PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, sms_cb_data->who, account); purple_conversation_write(conv, NULL, "Cant send SMS, Unable to obtain mobile carrier", PURPLE_MESSAGE_SYSTEM, time(NULL)); @@ -4490,7 +4160,7 @@ msn = g_str_has_prefix(who, "msn/") || g_str_has_prefix(who, "MSN/"); - if( strncmp(who, "+", 1) == 0 ) { + if( strncmp(who, "+", 1) == 0 ) { /* we have an sms to be sent */ gchar *carrier = NULL; const char *alias = NULL; @@ -4498,7 +4168,7 @@ PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, account); carrier = g_hash_table_lookup(yd->sms_carrier, who); - if (!carrier) { + if (!carrier) { struct yahoo_sms_carrier_cb_data *sms_cb_data; sms_cb_data = g_malloc(sizeof(struct yahoo_sms_carrier_cb_data)); sms_cb_data->gc = gc; @@ -4540,7 +4210,7 @@ } pkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE, YAHOO_STATUS_OFFLINE, 0); - if(msn) { + if(msn) { yahoo_packet_hash(pkt, "ss", 1, purple_connection_get_display_name(gc), 5, who+4); yahoo_packet_hash_int(pkt, 241, 2); } @@ -4587,9 +4257,9 @@ yahoo_packet_hash_str(pkt, 206, "2"); /* We may need to not send any packets over 2000 bytes, but I'm not sure yet. */ - if ((YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt)) <= 2000) { + if ((YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt)) <= 2000) { /* if p2p link exists, send through it. To-do: key 15, time value to be sent in case of p2p */ - if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !msn ) { + if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !msn ) { yahoo_packet_hash_int(pkt, 11, p2p_data->session_id); yahoo_p2p_write_pkt(p2p_data->source, pkt); } @@ -4624,7 +4294,7 @@ pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YAHOO_STATUS_TYPING, 0); /* check to see if p2p link exists, send through it */ - if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !msn ) { + if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !msn ) { yahoo_packet_hash(pkt, "sssssis", 49, "TYPING", 1, purple_connection_get_display_name(gc), 14, " ", 13, state == PURPLE_TYPING ? "1" : "0", 5, who, 11, p2p_data->session_id, 1002, "1"); /* To-do: key 15 to be sent in case of p2p */ @@ -4753,8 +4423,10 @@ status = purple_presence_get_active_status(purple_account_get_presence(purple_connection_get_account(gc))); tmp = purple_status_get_attr_string(status, "message"); if (tmp != NULL) { - msg = yahoo_string_encode(gc, tmp, NULL); + gboolean utf8 = TRUE; + msg = yahoo_string_encode(gc, tmp, &utf8); msg2 = purple_markup_strip_html(msg); + yahoo_packet_hash_str(pkt, 97, utf8 ? "1" : 0); yahoo_packet_hash_str(pkt, 19, msg2); } else { /* get_yahoo_status_from_purple_status() returns YAHOO_STATUS_CUSTOM for @@ -4895,7 +4567,7 @@ group2 = yahoo_string_encode(gc, group, NULL); pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0); - if(msn) { + if(msn) { yahoo_packet_hash(pkt, "sssssssssss", 14, "", 65, group2, @@ -5058,7 +4730,7 @@ if (!f) return; - if(f->protocol == 2) { + if(f->protocol == 2) { msn = TRUE; temp = who+4; } else
--- a/libpurple/protocols/yahoo/yahoo.h Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/yahoo/yahoo.h Mon May 18 19:54:24 2009 +0000 @@ -31,10 +31,12 @@ #define YAHOO_PAGER_HOST "scs.msg.yahoo.com" #define YAHOO_PAGER_PORT 5050 #define YAHOO_PAGER_PORT_P2P 5101 +#define YAHOO_LOGIN_URL "https://login.yahoo.com/config/pwtoken_login?src=ymsgr&ts=&token=%s" +#define YAHOO_TOKEN_URL "https://login.yahoo.com/config/pwtoken_get?src=ymsgr&ts=&login=%s&passwd=%s&chal=%s" #define YAHOO_P2P_KEEPALIVE_SECS 300 #define YAHOO_P2P_SERVER_TIMEOUT 10 #define YAHOO_PROFILE_URL "http://profiles.yahoo.com/" -#define YAHOO_MAIL_URL "https://login.yahoo.com/config/login?.src=ym" +#define YAHOO_MAIL_URL "http://rd.yahoo.com/messenger/client/?http://mail.yahoo.com/" #define YAHOO_XFER_HOST "filetransfer.msg.yahoo.com" #define YAHOO_XFER_PORT 80 #define YAHOO_XFER_RELAY_HOST "relay.msg.yahoo.com" @@ -44,6 +46,8 @@ /* really we should get the list of servers from http://update.messenger.yahoo.co.jp/servers.html */ #define YAHOOJP_PAGER_HOST "cs.yahoo.co.jp" +#define YAHOOJP_TOKEN_URL "https://login.yahoo.co.jp/config/pwtoken_get?src=ymsgr&ts=&login=%s&passwd=%s&chal=%s" +#define YAHOOJP_LOGIN_URL "https://login.yahoo.co.jp/config/pwtoken_login?src=ymsgr&ts=&token=%s" #define YAHOOJP_PROFILE_URL "http://profiles.yahoo.co.jp/" #define YAHOOJP_MAIL_URL "http://mail.yahoo.co.jp/" #define YAHOOJP_XFER_HOST "filetransfer.msg.yahoo.co.jp" @@ -79,11 +83,13 @@ #define YAHOO_STATUS_TYPE_INVISIBLE "invisible" #define YAHOO_STATUS_TYPE_MOBILE "mobile" -#define YAHOO_CLIENT_VERSION_ID "2097087" -#define YAHOO_CLIENT_VERSION "8.1.0.421" +#define YAHOO_CLIENT_VERSION_ID "4194239" +#define YAHOO_CLIENT_VERSION "9.0.0.2152" -#define YAHOOJP_CLIENT_VERSION_ID "524223" -#define YAHOOJP_CLIENT_VERSION "7,0,1,1" +#define YAHOOJP_CLIENT_VERSION_ID "4194239" +#define YAHOOJP_CLIENT_VERSION "9.0.0.2152" + +#define YAHOO_CLIENT_USERAGENT "Mozilla/4.0 (compatible; MSIE 5.5)" /* Index into attention types list. */ #define YAHOO_BUZZ 0
--- a/libpurple/protocols/yahoo/yahoo_aliases.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/yahoo/yahoo_aliases.c Mon May 18 19:54:24 2009 +0000 @@ -166,7 +166,7 @@ url = yd->jp ? YAHOOJP_ALIAS_FETCH_URL : YAHOO_ALIAS_FETCH_URL; purple_url_parse(url, &webaddress, NULL, &webpage, NULL, NULL); request = g_strdup_printf("GET %s%s/%s HTTP/1.1\r\n" - "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n" + "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" "Cookie: T=%s; Y=%s\r\n" "Host: %s\r\n" "Cache-Control: no-cache\r\n\r\n", @@ -334,7 +334,7 @@ } request = g_strdup_printf("POST %s%s/%s HTTP/1.1\r\n" - "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n" + "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" "Cookie: T=%s; Y=%s\r\n" "Host: %s\r\n" "Content-Length: %" G_GSIZE_FORMAT "\r\n"
--- a/libpurple/protocols/yahoo/yahoo_auth.c Fri May 01 21:36:29 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,925 +0,0 @@ -/* - * yahoo_auth.c: Authentication routines. - * - * Written by Kevin Kurtz and Scott Werndorfer - * Copyright(c) 2003 Cerulean Studios - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA - * - */ - -#include "internal.h" - -#include "yahoo.h" -#include "yahoo_auth.h" - -/************* - * Ugliness * - *************/ -static const auth_function_t main_function_list[5][96] = { - { - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 }, - { 0, 0x0, 0x0 } - }, - { - { 2, 0x36056cd7, 0x4387 }, - { 3, 0x538920, 0x0 }, - { 3, 0x538a20, 0x0 }, - { 4, 0x55f320, 0x0 }, - { 3, 0x539320, 0x0 }, - { 4, 0x55f340, 0x0 }, - { 2, 0x4abb534d, 0x3769 }, - { 1, 0x1d242da5, 0x0 }, - { 2, 0x3c23132d, 0x339b }, - { 1, 0x191265c, 0x0 }, - { 1, 0x3db979db, 0x0 }, - { 3, 0x539868, 0x0 }, - { 1, 0x1a550e1e, 0x0 }, - { 1, 0x2f140a2d, 0x0 }, - { 2, 0x7c466a4b, 0x29bf }, - { 1, 0x2d3f30d3, 0x0 }, - { 2, 0x7e823b21, 0x6bb3 }, - { 4, 0x55f360, 0x0 }, - { 3, 0x5395a8, 0x0 }, - { 4, 0x55f604, 0x0 }, - { 3, 0x539ba8, 0x0 }, - { 4, 0x5628c4, 0x0 }, - { 3, 0x547818, 0x0 }, - { 4, 0x5628e4, 0x0 }, - { 3, 0x547978, 0x0 }, - { 4, 0x5628a4, 0x0 }, - { 2, 0x5b756ab9, 0x7e9b }, - { 3, 0x539d48, 0x0 }, - { 1, 0x1d1c4911, 0x0 }, - { 3, 0x539f60, 0x0 }, - { 3, 0x53a060, 0x0 }, - { 1, 0x46bd7771, 0x0 }, - { 1, 0x51ae2b42, 0x0 }, - { 2, 0x2417591b, 0x177b }, - { 2, 0x57f27c5f, 0x2433 }, - { 3, 0x53a588, 0x0 }, - { 3, 0x53a688, 0x0 }, - { 1, 0x71422261, 0x0 }, - { 4, 0x55f6a4, 0x0 }, - { 2, 0x58e937f9, 0x1075 }, - { 3, 0x53a7c8, 0x0 }, - { 4, 0x55f6c4, 0x0 }, - { 3, 0x53a8c8, 0x0 }, - { 3, 0x53aa20, 0x0 }, - { 2, 0xb4c3d13, 0x1597 }, - { 4, 0x55f6e4, 0x0 }, - { 1, 0xfe07d38, 0x0 }, - { 2, 0x689b4017, 0x3cfb }, - { 4, 0x562928, 0x0 }, - { 3, 0x547b00, 0x0 }, - { 1, 0x35413df3, 0x0 }, - { 2, 0x5b611ab, 0x570b }, - { 2, 0xda5334f, 0x3ac7 }, - { 1, 0x47706008, 0x0 }, - { 4, 0x55f744, 0x0 }, - { 3, 0x547548, 0x0 }, - { 4, 0x562884, 0x0 }, - { 1, 0x57611b36, 0x0 }, - { 2, 0x314c2cd1, 0x2b5b }, - { 1, 0x1ef33946, 0x0 }, - { 2, 0x28ea041f, 0x638f }, - { 3, 0x53b1d0, 0x0 }, - { 3, 0x53b2d0, 0x0 }, - { 3, 0x53b418, 0x0 }, - { 2, 0x511537cb, 0x7135 }, - { 2, 0x1cf71007, 0x5e17 }, - { 1, 0x583d4bcf, 0x0 }, - { 3, 0x53b550, 0x0 }, - { 1, 0x373e6856, 0x0 }, - { 2, 0x4d595519, 0x1a7d }, - { 3, 0x53b718, 0x0 }, - { 3, 0x53b838, 0x0 }, - { 1, 0xe2a36a7, 0x0 }, - { 3, 0x53bc10, 0x0 }, - { 3, 0x53bd10, 0x0 }, - { 4, 0x55f784, 0x0 }, - { 4, 0x55f7a4, 0x0 }, - { 1, 0x53f3604f, 0x0 }, - { 4, 0x55f7c4, 0x0 }, - { 4, 0x55f7e4, 0x0 }, - { 2, 0x1edc0ba3, 0x7531 }, - { 3, 0x53be50, 0x0 }, - { 1, 0x10df1038, 0x0 }, - { 4, 0x55f804, 0x0 }, - { 3, 0x53bf68, 0x0 }, - { 1, 0x4ede0cac, 0x0 }, - { 2, 0x2f076eeb, 0x5bcf }, - { 1, 0x6d86030f, 0x0 }, - { 1, 0x3f331713, 0x0 }, - { 3, 0x53c0e8, 0x0 }, - { 2, 0x41cd726f, 0x3f79 }, - { 4, 0x55f824, 0x0 }, - { 1, 0xece0054, 0x0 }, - { 2, 0x19b32b03, 0x4ad1 }, - { 4, 0x55f844, 0x0 }, - { 4, 0x55f864, 0x0 } - }, - { - { 2, 0x39731111, 0x419b }, - { 1, 0x54f7757a, 0x0 }, - { 4, 0x55f884, 0x0 }, - { 4, 0x55f8a4, 0x0 }, - { 3, 0x53c240, 0x0 }, - { 3, 0x53c368, 0x0 }, - { 2, 0x3cc0256b, 0x7ce7 }, - { 1, 0x79991847, 0x0 }, - { 2, 0x228f7fb5, 0x472d }, - { 2, 0x32da290b, 0x7745 }, - { 1, 0x7a28180d, 0x0 }, - { 4, 0x55f91c, 0x0 }, - { 4, 0x55f93c, 0x0 }, - { 2, 0x5c814f8b, 0x227f }, - { 3, 0x53c7b0, 0x0 }, - { 2, 0xb496f6d, 0x412d }, - { 1, 0x6f4b62da, 0x0 }, - { 3, 0x53c8b8, 0x0 }, - { 1, 0x64973977, 0x0 }, - { 3, 0x53c9e8, 0x0 }, - { 3, 0x53cae8, 0x0 }, - { 4, 0x55f9d0, 0x0 }, - { 3, 0x53cd28, 0x0 }, - { 3, 0x547230, 0x0 }, - { 1, 0x6dd14c92, 0x0 }, - { 3, 0x53ceb0, 0x0 }, - { 4, 0x560280, 0x0 }, - { 4, 0x56034c, 0x0 }, - { 4, 0x56036c, 0x0 }, - { 3, 0x53d168, 0x0 }, - { 1, 0x5e6324d8, 0x0 }, - { 3, 0x53d2d0, 0x0 }, - { 3, 0x53d3d0, 0x0 }, - { 3, 0x53d798, 0x0 }, - { 4, 0x5605b0, 0x0 }, - { 1, 0x62745ed0, 0x0 }, - { 2, 0x102c215b, 0x581 }, - { 3, 0x53d970, 0x0 }, - { 3, 0x53da70, 0x0 }, - { 3, 0x53dbd0, 0x0 }, - { 2, 0x19511111, 0x12c1 }, - { 3, 0x53dd70, 0x0 }, - { 2, 0x2a6e2953, 0x6977 }, - { 3, 0x53e0d0, 0x0 }, - { 1, 0x55cd5445, 0x0 }, - { 4, 0x560bcc, 0x0 }, - { 4, 0x560bec, 0x0 }, - { 2, 0x646c21eb, 0x43e5 }, - { 1, 0x71dc4898, 0x0 }, - { 1, 0x167519cb, 0x0 }, - { 1, 0x6d3158f8, 0x0 }, - { 1, 0x7ea95bea, 0x0 }, - { 4, 0x560c10, 0x0 }, - { 1, 0x47377587, 0x0 }, - { 1, 0x2d8b6e8f, 0x0 }, - { 2, 0x5e6105db, 0x1605 }, - { 1, 0x65b543c8, 0x0 }, - { 3, 0x540278, 0x0 }, - { 4, 0x560d34, 0x0 }, - { 2, 0x48af73cb, 0xa67 }, - { 1, 0x4fb96154, 0x0 }, - { 3, 0x5406e8, 0x0 }, - { 4, 0x560e38, 0x0 }, - { 1, 0x622c4954, 0x0 }, - { 4, 0x561014, 0x0 }, - { 1, 0x20d220f3, 0x0 }, - { 1, 0x361d4f0d, 0x0 }, - { 1, 0x2b2000d1, 0x0 }, - { 1, 0x6fb8593e, 0x0 }, - { 3, 0x5409e8, 0x0 }, - { 4, 0x561074, 0x0 }, - { 1, 0x2b7f7dfc, 0x0 }, - { 2, 0x5fc41a57, 0x693 }, - { 2, 0x17154387, 0x2489 }, - { 4, 0x561094, 0x0 }, - { 4, 0x5610b4, 0x0 }, - { 4, 0x5610d4, 0x0 }, - { 3, 0x540d18, 0x0 }, - { 1, 0x7e221470, 0x0 }, - { 1, 0x7a600061, 0x0 }, - { 4, 0x561190, 0x0 }, - { 4, 0x5611b0, 0x0 }, - { 3, 0x541218, 0x0 }, - { 4, 0x5611d0, 0x0 }, - { 2, 0xe813a5, 0x2ce5 }, - { 2, 0x3d707e25, 0x3827 }, - { 2, 0x77a53e07, 0x6a5f }, - { 4, 0x562968, 0x0 }, - { 3, 0x547d98, 0x0 }, - { 3, 0x547f10, 0x0 }, - { 1, 0x43a73788, 0x0 }, - { 3, 0x5387b0, 0x0 }, - { 4, 0x55f214, 0x0 }, - { 3, 0x539420, 0x0 }, - { 1, 0x55f4606b, 0x0 }, - { 4, 0x55f380, 0x0 } - }, - { - { 5, 0x55f3f8, 0x0 }, - { 2, 0x32ca58e3, 0x4f9 }, - { 1, 0x11756b30, 0x0 }, - { 2, 0x218b2569, 0x5db1 }, - { 1, 0x77d64b90, 0x0 }, - { 5, 0x562948, 0x0 }, - { 3, 0x547c10, 0x0 }, - { 2, 0x7d1428cb, 0x3d }, - { 1, 0x6f872c49, 0x0 }, - { 1, 0x2e484655, 0x0 }, - { 2, 0x1e3349f7, 0x41f5 }, - { 3, 0x541400, 0x0 }, - { 5, 0x561258, 0x0 }, - { 1, 0x61640311, 0x0 }, - { 5, 0x561278, 0x0 }, - { 3, 0x541588, 0x0 }, - { 3, 0x541688, 0x0 }, - { 3, 0x541988, 0x0 }, - { 1, 0x7044d3, 0x0 }, - { 5, 0x561298, 0x0 }, - { 2, 0x5c221625, 0x576f }, - { 3, 0x541b30, 0x0 }, - { 3, 0x541c30, 0x0 }, - { 1, 0x2d406bb1, 0x0 }, - { 2, 0x680b1f17, 0x12cd }, - { 5, 0x5613a0, 0x0 }, - { 2, 0x12564d55, 0x32b9 }, - { 2, 0x21a67897, 0x6bab }, - { 3, 0x541db8, 0x0 }, - { 2, 0x6405119, 0x7143 }, - { 1, 0x351d01ed, 0x0 }, - { 2, 0x46356f6b, 0xa49 }, - { 2, 0x32c77969, 0x72f3 }, - { 5, 0x5613c0, 0x0 }, - { 3, 0x541fe0, 0x0 }, - { 3, 0x5420e0, 0x0 }, - { 5, 0x5613e4, 0x0 }, - { 3, 0x542220, 0x0 }, - { 5, 0x561404, 0x0 }, - { 2, 0x74d52c55, 0x5f43 }, - { 1, 0x26201ca8, 0x0 }, - { 1, 0x7aeb3255, 0x0 }, - { 3, 0x53ab20, 0x0 }, - { 2, 0x578f1047, 0x640b }, - { 3, 0x542738, 0x0 }, - { 3, 0x542df8, 0x0 }, - { 5, 0x5615a0, 0x0 }, - { 5, 0x561628, 0x0 }, - { 1, 0x4a1352cf, 0x0 }, - { 2, 0x4bfb6ef3, 0x704f }, - { 2, 0x1b4c7fe7, 0x5637 }, - { 2, 0x4091a3b, 0x4917 }, - { 1, 0x270c2f52, 0x0 }, - { 3, 0x5430b8, 0x0 }, - { 5, 0x561748, 0x0 }, - { 3, 0x543220, 0x0 }, - { 5, 0x561768, 0x0 }, - { 2, 0x127549d5, 0x579b }, - { 2, 0xab54121, 0x7a47 }, - { 5, 0x5617f0, 0x0 }, - { 1, 0x751e6e49, 0x0 }, - { 3, 0x543580, 0x0 }, - { 3, 0x543680, 0x0 }, - { 1, 0x670c3f74, 0x0 }, - { 2, 0x6b080851, 0x7e8b }, - { 1, 0x71cd789e, 0x0 }, - { 1, 0x3eb20b7b, 0x0 }, - { 5, 0x561ea0, 0x0 }, - { 3, 0x543848, 0x0 }, - { 2, 0x58a67753, 0x272b }, - { 2, 0x1ab54ad7, 0x4d33 }, - { 2, 0x7d30a45, 0x569 }, - { 2, 0x737616bf, 0x70c7 }, - { 3, 0x543990, 0x0 }, - { 2, 0x45c4485d, 0x2063 }, - { 5, 0x561f38, 0x0 }, - { 1, 0x2598043d, 0x0 }, - { 2, 0x223a4fe3, 0x49a7 }, - { 1, 0x1eed619f, 0x0 }, - { 5, 0x561f58, 0x0 }, - { 1, 0x6f477561, 0x0 }, - { 5, 0x561f7c, 0x0 }, - { 5, 0x561f9c, 0x0 }, - { 3, 0x543bf8, 0x0 }, - { 2, 0x4bc13c4f, 0x45c1 }, - { 1, 0x3b547bfb, 0x0 }, - { 3, 0x543d08, 0x0 }, - { 2, 0x71406ab3, 0x7a5f }, - { 1, 0x2f1467e9, 0x0 }, - { 2, 0x9366d1, 0x22d1 }, - { 2, 0x587d1b75, 0x2ca5 }, - { 2, 0x213a4be7, 0x4499 }, - { 2, 0x62653e89, 0x2d5d }, - { 5, 0x562198, 0x0 }, - { 2, 0x4f5f3257, 0x444f }, - { 2, 0x4c0e2b2b, 0x19d3 } - }, - { - { 2, 0x3f867b35, 0x7b3b }, - { 2, 0x32d25cb1, 0x3d6d }, - { 5, 0x5622f0, 0x0 }, - { 2, 0x50fa1c51, 0x5f4f }, - { 3, 0x544130, 0x0 }, - { 1, 0x5fe7af1, 0x0 }, - { 2, 0x14067c29, 0x10c5 }, - { 3, 0x544298, 0x0 }, - { 2, 0x4a5558c5, 0x271f }, - { 1, 0x3c0861b1, 0x0 }, - { 5, 0x562864, 0x0 }, - { 3, 0x546d50, 0x0 }, - { 2, 0x18837c9d, 0x6335 }, - { 5, 0x56238c, 0x0 }, - { 1, 0x7dab5033, 0x0 }, - { 3, 0x544548, 0x0 }, - { 2, 0x3b87321, 0x7225 }, - { 1, 0x7f906745, 0x0 }, - { 3, 0x544700, 0x0 }, - { 5, 0x5623ac, 0x0 }, - { 1, 0x21c46c2c, 0x0 }, - { 2, 0x2b36757d, 0x28d }, - { 5, 0x5623cc, 0x0 }, - { 3, 0x5448a8, 0x0 }, - { 1, 0x106b4a85, 0x0 }, - { 1, 0x17640f11, 0x0 }, - { 3, 0x544a28, 0x0 }, - { 1, 0x69e60486, 0x0 }, - { 3, 0x547670, 0x0 }, - { 2, 0x3782017d, 0x5bf }, - { 5, 0x5623ec, 0x0 }, - { 3, 0x5480c8, 0x0 }, - { 1, 0x6bca53b0, 0x0 }, - { 3, 0x546af0, 0x0 }, - { 3, 0x546bf0, 0x0 }, - { 3, 0x544d20, 0x0 }, - { 3, 0x544e20, 0x0 }, - { 1, 0xb8236e3, 0x0 }, - { 5, 0x562908, 0x0 }, - { 2, 0x5ee51c43, 0x4553 }, - { 5, 0x56249c, 0x0 }, - { 3, 0x546fd8, 0x0 }, - { 3, 0x5470d8, 0x0 }, - { 3, 0x546970, 0x0 }, - { 2, 0x42b14c6f, 0x5531 }, - { 1, 0x4a2548e8, 0x0 }, - { 2, 0x5c071d85, 0x2437 }, - { 3, 0x5467d8, 0x0 }, - { 2, 0x29195861, 0x108b }, - { 1, 0x24012258, 0x0 }, - { 3, 0x546690, 0x0 }, - { 1, 0x63cc2377, 0x0 }, - { 1, 0x8d04b59, 0x0 }, - { 2, 0x3fd30cf5, 0x7027 }, - { 1, 0x7c3e0478, 0x0 }, - { 2, 0x457776b7, 0x24b3 }, - { 1, 0x86652bc, 0x0 }, - { 2, 0x302f5b13, 0x371d }, - { 3, 0x546548, 0x0 }, - { 2, 0x58692d47, 0x671 }, - { 1, 0x6601178e, 0x0 }, - { 2, 0xf195b9b, 0x1369 }, - { 1, 0x7ba21d8, 0x0 }, - { 5, 0x562544, 0x0 }, - { 5, 0x562564, 0x0 }, - { 1, 0x13ac3d21, 0x0 }, - { 2, 0x5bcf3275, 0x6e1b }, - { 2, 0x62725c5b, 0x16b9 }, - { 2, 0x5b950fdf, 0x2d35 }, - { 5, 0x5625a0, 0x0 }, - { 5, 0x5625c0, 0x0 }, - { 2, 0x73ba5335, 0x1c13 }, - { 5, 0x5625e0, 0x0 }, - { 5, 0x562600, 0x0 }, - { 1, 0x3e144154, 0x0 }, - { 2, 0x4eed7b27, 0x38ab }, - { 3, 0x545c58, 0x0 }, - { 2, 0x627c7e0f, 0x7f01 }, - { 2, 0x5d7e1f73, 0x2c0f }, - { 3, 0x545aa0, 0x0 }, - { 2, 0x55c9525f, 0x4659 }, - { 1, 0x3765334c, 0x0 }, - { 2, 0x5df66ddf, 0x7c25 }, - { 3, 0x545d78, 0x0 }, - { 3, 0x545e78, 0x0 }, - { 1, 0x16ae5776, 0x0 }, - { 3, 0x545ff8, 0x0 }, - { 3, 0x546190, 0x0 }, - { 5, 0x562620, 0x0 }, - { 5, 0x562640, 0x0 }, - { 3, 0x546290, 0x0 }, - { 2, 0x4392327b, 0x7e0d }, - { 3, 0x546398, 0x0 }, - { 2, 0x3d8b0cb5, 0x640d }, - { 2, 0x32865601, 0x4d43 }, - { 5, 0x562660, 0x0 } - } -}; - -static const struct buffer_t type_three_list[NUM_TYPE_THREES]={ - { 0x538920, "\x7a\x61\x31\x57\x9\xbc\x11\x8d\x6a\x12\x3a\x4d\x76\xbf\x19\x86\x2c\xc8\x69\x60\x84\x1\xc9\x21\xb1\xa6\xf\x99\xcd\xa0\x71\x8b\x5f\xb2\xd2\x53\xed\xf9\x55\xa\x50\x14\x15\xad\x88\x52\x5d\xbb\xe\xe5\xd\x56\x3e\x9b\xc7\x17\x9a\x97\x92\x23\x0\x37\xaa\x27\xf6\xb6\x33\xb5\xc5\xd1\x38\x1b\x85\x42\x13\xe1\x64\x1d\x4c\x87\x9f\x3c\x40\xdf\x7b\xd5\xae\xc6\x7c\xec\xd7\x49\x35\x2f\x2b\x9d\x32\xbd\x93\x45\x73\x91\x34\xd4\x39\x1e\x96\x65\xeb\x82\x5a\xf3\xd8\xf1\x41\xce\x9c\xe6\x90\x7d\x6b\x29\x6\xc1\x3d\x4e\xe3\xdb\x48\x6c\x62\x72\x7f\xfe\xdd\xcf\xa1\x24\x4f\xc0\xd0\x3f\x2d\x5c\x78\x6f\x3b\x10\xef\xba\xb\x25\xd6\x1f\x58\x8c\xf8\xcc\xc2\x5\xb3\xfa\xa4\xac\x6e\xf5\x18\x2a\x26\x5e\xf4\x79\xb8\xc3\x16\xe2\xf2\x83\x30\x59\xda\xe9\x36\x7\x46\xa9\xde\x77\xd3\xa3\x98\x8\x1c\xe7\xee\x51\xe8\xfb\x2\xc4\xfd\xff\x22\xaf\x7e\xcb\x68\xc\x28\xe4\x63\xca\x70\x75\xb0\x74\xa7\xea\x20\x4\x4b\xa5\xb7\xf7\xfc\x4a\x47\xf0\xa8\x81\xbe\xe0\x66\x8e\x44\x54\x6d\x80\xb9\x95\x2e\xab\x8a\x1a\x94\xdc\x89\xb4\x5b\x9e\xd9\x8f\xa2\x43\x67\x3" }, - { 0x538a20, "\x28\xeb\x74\xef\xb7\x73\x79\xd1\x46\xcc\xfb\x3b\x91\xc2\x16\xcb\x93\xaf\x51\x88\xb0\x5d\xfa\xfc\xc\xf\xc8\x4a\x53\x17\x8e\xec\x81\x36\xc6\xdc\xbc\x89\xa\x1f\x78\xdd\x76\x6c\x85\xd2\x13\xb9\x3a\x97\xde\x86\x3e\x12\xbe\x68\x23\x6a\x58\xce\xea\xe3\xa8\x5a\x8c\x3\x8a\x9d\xfe\xf3\x47\x63\xdf\x44\xaa\xd9\x24\xf0\x5b\xe2\x9c\xd3\xa9\x2e\xfd\x8b\xbd\xa4\x7a\x42\x5f\x4d\xa2\x48\x83\xcd\xe\x27\x61\xcf\xd\x50\x6f\x49\xae\xc7\x2f\x31\x39\x8f\x11\xdb\xad\x6b\x7f\xb6\x55\x62\x4c\x66\xc4\x75\xf6\x1b\xc1\xf1\x90\x95\x65\x9\xe0\xb4\xbf\xf4\x35\x37\x1c\x67\xe8\xf9\xe6\x56\x99\x22\xc0\xe9\x92\x21\xe1\x7d\x6e\x34\xd4\x8d\x96\x20\x52\xd0\x69\x2d\xf8\x7e\x4f\xb\xac\x71\xa3\xe5\x2a\xa5\xc5\x18\x5e\x6\xca\x2\x4b\x26\xf5\xab\x9f\xe7\x15\x3d\xd6\x4\x8\xee\xbb\x57\x0\x40\xd5\xa7\x1d\x45\xa6\x2c\xff\x9a\x32\x84\x1a\x14\xf7\x80\xd8\x43\x72\x7\x98\x38\x87\x33\xb1\x29\xb3\x7c\x30\xba\x94\xc9\x64\xe4\x1\x77\x3c\x2b\x82\x54\x6d\x9e\xf2\x3f\xed\xc3\x4e\x5c\x60\x70\x19\xa0\xb8\xda\x5\xb2\x10\x7b\x25\xb5\x9b\x59\x41\x1e\xa1\xd7" }, - { 0x539320, "\x9c\x3b\xec\x3e\x7b\x79\x6f\x88\x42\xe6\xe1\x9b\xa3\xd\x83\x86\x7a\xfc\xc5\xb3\xdb\x7c\xf6\xa\xb7\xe7\x3c\x53\x28\x65\xf2\xa9\x6a\xf4\xef\x2c\x3d\xf8\xed\x6\xaf\x31\x75\xab\xf3\x73\xee\x20\x95\x1b\xe\x19\xa8\x5b\xa5\x66\x74\x85\x11\x60\x1e\x2a\x6c\x48\x50\x2f\x9a\x2e\x55\xaa\xcb\x64\x40\x4c\x25\xe9\xd0\xfd\x2d\x46\x8b\x81\x8d\xd2\x32\x4a\xc6\x7\xd6\xbf\xfb\x98\xd4\x76\x7e\xc\xfa\xde\x14\xa6\xd5\xe2\x90\xd1\xeb\xd3\x58\xbb\x5f\x94\xf7\x78\x54\x27\x52\xb6\x22\xea\x8c\xc8\x7d\x87\x12\x9d\xa1\x63\x38\xd8\x35\x2b\xc9\x56\x10\x9f\x1a\x2\xbe\xf1\x59\x17\x9e\xac\x5a\xb8\x1\xb5\x30\xad\xff\xe0\x49\xe8\x23\x4e\x6b\x16\xdc\x4f\x89\x68\x43\xc1\x99\x4\xa7\x33\x92\x84\xa4\x26\x34\x41\x1d\xb2\x91\x61\xc2\x51\x8f\x36\xfe\x5\xa2\xf9\xb\x13\x71\x82\x6e\x5d\xb4\xdf\xdd\x7f\xa0\xcd\x44\xc7\x70\x4d\xf0\x1c\x4b\x45\x57\x37\x3a\xcc\xf5\x8a\xd9\xe4\xbc\x15\xc3\x62\xc4\x39\x72\x47\x97\xbd\x8\xe5\x67\x18\xb1\x77\x8e\x1f\x9\xba\xf\xd7\xb0\x24\xce\xda\x0\x96\xca\x69\x3\x6d\x93\xae\xe3\x3f\x5c\xcf\xc0\xb9\x29\x80\x21\x5e" }, - { 0x539868, "\xf2\xc3\x9\x40\x62\x4b\x94\xd2\xf8\x4a\xdf\xa\xb1\x61\xf9\x9c\x13\x35\x3\xe8\xc4\xf6\x49\x1a\xc\x45\x97\xe\x83\x33\x6d\xa0\x73\xb9\x3d\x9d\xff\x60\xc6\xaf\x68\xb6\x89\x10\xb0\xde\x98\x7f\x8c\x5a\xa5\x1e\x6f\x7c\x17\x12\xd7\xdc\x75\xfc\x20\x1d\x92\xcf\xf1\x16\xd\x50\x41\x39\xab\xeb\x14\x65\xc8\xa4\x99\xb5\x8a\x21\x90\xba\x4d\x3c\xf3\x66\xd1\x96\xf\xac\xa6\x7b\xbc\x8f\xd0\x29\x1f\xb3\xce\xd8\x79\x2\x36\x0\xe5\x91\x5e\xbb\xaa\x52\xc2\x31\x6b\x88\x8b\x9b\x2a\x44\x6c\x2f\x8e\xfb\xa3\x6\x48\xa2\x69\xc9\x28\x43\x47\x37\xef\xb8\x84\xe0\x4f\x30\xae\x56\xb7\x4e\x34\x81\x77\x67\xfd\x74\x93\xcd\x7a\x51\x76\x54\x5b\x2b\x3e\x80\xea\x9f\x15\xe1\x9a\xbf\x38\xfa\x8\x24\x42\xee\x7e\x4\x5f\xa8\xc5\xdb\x4c\x2d\xd9\xca\x19\xcc\xcb\x85\xa1\x32\x25\xec\x64\x57\xad\xf5\xb\x71\x11\x3f\xfe\x58\x1c\xd3\xb2\x72\xf7\x2c\xa9\xf0\x8d\xe9\xbe\x70\xe7\x95\xe6\x6e\x7\x9e\x46\x53\xdd\xed\xe2\xf4\x3b\x22\xc1\x3a\x55\x26\xd6\xc7\xd4\xc0\x27\x5\x7d\x5d\xe4\xd5\x5c\xe3\xb4\x63\xa7\x59\x82\xda\x18\x23\x2e\x1b\x1\xbd\x78\x86\x6a\x87" }, - { 0x5395a8, "\xfa\xb9\xda\x78\xde\x7f\x6\xab\xd7\xb1\x5c\x10\x1b\xf5\x62\x85\xf4\x98\xfb\xb2\xff\x5e\x5\x2b\x81\xd1\x7d\x58\xa7\x6b\x23\x7b\x26\x9f\xa9\xe\x59\xb8\xac\xd9\x64\x6e\x4f\x6a\x2d\x3c\x15\xc7\x63\x42\x54\x9\x90\xf6\xa0\x86\x9d\xea\xcf\x7c\xfe\xc5\xd4\x4d\xa6\xd5\xba\xcd\x5d\x9b\x2a\x6c\xb5\x7a\xbe\xf0\x44\x65\x0\x17\x3\xaf\xed\xfd\x1f\xc2\xd8\x5a\x16\xad\xc3\x35\x43\xbb\xa5\x37\x40\xf\x60\x99\x94\x1e\x89\x68\x88\xc8\xc4\x4a\x66\x24\x55\x3d\x4b\xe2\x1d\x1a\xe8\x19\x5b\xbf\x51\x8c\xae\x8a\x87\x8d\x3b\x22\x82\xd6\x80\x95\xef\x50\x21\xd\xd3\x33\x6d\x2c\xf1\xee\x38\xdc\xc1\x6f\x2\x46\xc6\x7e\x18\xb0\xce\x8\xd2\xb6\x53\x73\xe6\xf9\x3a\x4c\x48\x96\x1c\x70\x8b\x93\x69\xf7\x56\x30\x31\xdb\xa1\x1\xb\x77\xbc\xf2\x8e\x27\xa3\x7\xe4\x3f\xfc\x49\xcb\xe0\x45\x12\x67\x13\xb7\x74\xc\x52\xcc\xdd\x76\x29\x32\x57\xe1\xe9\x8f\xca\xaa\xbd\x71\x2e\x4\x97\xa4\xc9\x79\xdf\x83\xb3\x3e\x72\xc0\xb4\xec\x9a\x14\xa\x2f\x5f\x39\x25\x28\x75\xa2\xf8\x9c\xe3\xa8\x11\x9e\x4e\xd0\xe7\x61\x41\x84\xeb\x20\x36\x34\xf3\xe5\x92\x91\x47" }, - { 0x539ba8, "\x88\x82\x72\x56\xde\xa5\x45\x91\xf9\xe4\xee\x32\x59\x18\xb8\x6f\x79\xc7\xb0\x8c\x11\xd2\xe7\xef\x48\xe6\x20\xa1\x22\x12\xc8\x15\x6a\x8f\x3b\xd5\x3c\xe8\x63\x28\x10\xe9\x2c\xf5\x69\xa7\xf6\xd0\x83\xe0\x80\x81\x46\x29\x38\x2e\xf8\x34\x5b\x1a\x9d\xfa\xa4\x35\x54\xc1\x7e\xe\xae\x7f\x6e\x57\xb4\xbc\xff\x9b\x4a\xb7\x2b\x0\x5f\x31\x6d\x74\xd8\x36\x5c\xc3\xa2\xdf\x3d\xe2\x86\xfb\x5a\xca\x30\x50\x3e\x73\x4e\x9a\x94\xf0\x7d\xc5\x4f\xe3\x66\x39\xeb\x70\x52\x4b\xe5\x71\xc0\x76\x44\xa9\xa0\x7b\x27\xb1\x6c\xf\xc6\x96\xcb\xba\xda\xea\x37\x1c\xac\xb3\xd6\xb9\xbf\xdb\x1d\x8a\xfe\x9\x21\x75\x5d\x97\xe1\x8e\x25\xbd\x2d\xdd\xf7\xcd\x2a\x1e\x5e\x7a\xc\xfd\x9f\x60\x8\x64\xce\xf4\x61\x8d\x9e\xcf\xd4\x49\xb\x67\x1\xf1\x87\x53\x13\xaf\x2f\xa\xec\x3a\xbb\xa8\xbe\xc9\x90\x43\x6\x7c\xb6\xcc\xc2\x4c\x62\xb5\xc4\x77\x3\xf3\xab\xd3\x33\x24\xf2\x55\x6b\x1b\xa3\x2\x4\x23\x16\x14\x95\x3f\x65\xad\x89\x26\x5\x42\xfc\x98\x7\xaa\x19\x9c\xa6\xd\x93\xed\xb2\x8b\x40\xd7\x47\x1f\x99\x78\x17\x92\xd1\x4d\x51\x58\x84\xdc\x41\xd9\x68\x85" }, - { 0x547818, "\x73\x5\xde\x12\xaf\xb4\xaa\x9\x31\xcb\xba\x55\xd3\x1b\xf7\xbe\xd9\x45\x6d\x50\x2d\x74\xfa\x9c\xb3\xb2\xc0\x34\x16\x8d\x3d\x3f\x65\x13\xc8\xe3\xc\xfd\xea\x56\x67\x32\x7b\x24\xd1\xee\xc4\x1f\x3e\x4d\xd7\x33\xd5\xbf\xf\xca\x82\x63\x8b\x60\x86\xfe\x37\x51\x6\xe5\xe8\xe6\x64\x2b\x8a\xbb\xd0\xb8\xb1\xdc\xb9\x8c\x75\x5c\x14\x88\x22\x94\x96\x9d\xb7\x58\x2e\xbc\xc9\xa1\x1\x77\xec\xa2\x2\x6b\xc1\xad\xac\x62\xe1\x9b\x40\xb5\xd6\x78\x80\xc3\x4\x3\x4a\xa0\xeb\x8e\xf5\xc6\xab\xf6\x57\xa5\x8\xcc\x5b\xf2\xff\x2f\xa\x25\xb0\x3a\x7d\xf4\x43\x10\x85\x15\x44\xae\x92\x61\x27\x1c\xce\x19\xf9\xa6\xc5\x48\xe2\x59\xb\x89\xef\xc2\x0\xa8\x5d\x99\x54\xed\x2a\x3b\x4e\x42\xf3\x8f\x2c\x18\x6f\x69\x53\x68\xcd\x29\x6a\x1d\xc7\xf0\xd\x23\x4c\xe\x91\xfc\xe9\xcf\x98\x9a\x52\xfb\x21\x1e\x5f\x30\xda\x9e\x9f\xa9\x7a\x6c\x4b\x39\x7f\x20\x5a\xd2\x83\xdb\x49\x81\x93\x7\x3c\x95\xe0\x70\x26\x41\xa3\x79\x47\xa4\x11\x76\x97\x17\x35\xd8\xf8\x5e\x7e\x71\xbd\xf1\x28\x84\x46\xb6\xa7\xdf\x38\x66\x72\xdd\x90\xe4\x7c\x6e\xe7\x87\x36\x1a\xd4\x4f" }, - { 0x547978, "\x4f\xf2\x63\xe9\xdd\x53\x55\xf0\xf6\x86\x76\xab\x8b\x91\x5\xa9\x5c\x92\xc9\xf3\x24\xdc\x3c\x6\xf4\x54\xb\xad\x28\x46\xaf\x60\xc1\xae\xc2\xec\x74\x84\xb3\xcc\x75\x1b\x34\xa6\xf\x6e\x85\xf9\x44\x69\x3d\x4e\x8e\x1f\xed\x15\x12\x62\xdb\xbd\xea\x68\x50\xfc\x30\xde\x5b\x9b\x33\x99\x8d\x61\x98\x56\x78\x19\xc\xb4\x8f\xc8\x10\xb0\x38\x17\x21\x2a\x5e\xe1\xb1\x81\xbc\x2b\xe3\x94\x7b\x6f\x9a\x7e\x48\x3\xc6\xb5\x65\x43\xaa\x23\x1d\x59\x31\xcf\x1\xb7\xfa\xfe\xbf\x1a\x96\xf5\x87\xac\xbb\xfd\xdf\x82\xd1\x13\x8a\x11\xe4\x40\x0\xc5\x7\xa5\xb6\xd9\x4b\xba\x3b\x93\xa0\x9e\x52\x9c\xe\x14\xd2\x3e\x7d\x9f\xd8\x72\x9\xe0\x39\x27\x77\x97\x29\xd5\x88\x95\xee\x22\x3a\x47\xc7\x16\xc4\x25\xb9\x6d\x8\x2c\x35\x6c\xcd\xb2\x5f\xf8\xff\x41\x18\x3f\xe5\x57\x2e\x67\xc3\x49\x89\x90\xcb\xe6\x26\x4\xa8\xbe\xca\x2f\xfb\xd4\x71\xf7\xda\xe8\x6b\x5d\x79\x70\x1c\xce\x7a\xa3\x2d\x4a\xd7\xe2\xb8\x64\x6a\x51\x73\xa\x37\xa2\xd3\x4d\x80\x5a\xa1\x36\x45\x66\xa4\x20\x58\x4c\xd6\x1e\xd\xeb\xe7\x42\x7f\x9d\xf1\xa7\xef\x32\xc0\x2\x8c\x83\x7c\xd0" }, - { 0x539d48, "\x29\x0\x10\x9\x37\xc0\xb\xa\x91\xc8\xc9\xb6\x8e\x1\x9f\x64\xae\x13\xa6\xb7\x62\x27\xf7\xd0\x9e\x68\xf1\xf9\x15\xdd\x3a\x56\xca\xde\x96\x89\x8\x90\x38\xeb\x99\x57\xb8\xd7\x65\x94\x77\xb1\x16\x45\x5d\x67\x2f\x79\xd5\xcc\xdf\x44\xbe\x31\x8a\xef\x88\x7a\xfb\xa3\xa5\x39\x78\x84\x3\xe8\xbd\x8c\x85\x6f\xb2\x59\x6d\x93\x7\xaa\x36\xee\xe7\x7c\x21\x2b\xc7\x40\x54\xcd\xb9\x1f\x30\x80\xea\xcb\xfd\x20\xbf\x2c\xd\x6e\x73\x4b\xe5\x74\x18\x9d\x3f\xb4\xb3\x50\x81\x9a\xd4\xf3\xf2\x3e\x6b\x1d\x9b\x12\x49\xa1\xcf\x4f\x51\x41\x71\xc2\xd9\xdb\x5a\x97\x6a\xe0\x87\x6\x5\x2d\xf8\x47\x5b\x1b\x69\xc4\xad\xff\x43\x46\x24\xc\x82\x33\x8d\x26\x86\xab\x5c\x61\xe4\x66\xaf\x11\xa0\x42\xa2\x2e\x34\xdc\x25\x4d\xd6\xd2\x63\x70\x22\x83\x19\xa7\x4e\x92\xb5\xf\xda\x55\xed\x7f\x7b\xa4\xfc\x1a\x1e\x8b\xbc\xb0\xc3\x98\xec\x17\x60\xc1\x3d\x8f\x4c\x48\xac\xce\x7e\x72\xd1\x5e\x35\xa8\x32\x4\x1c\xe\x3b\xfa\xbb\xa9\x2a\xf6\xd8\x2\x6c\x23\x76\xe2\x53\xba\x28\x9c\xe1\xd3\x52\xf0\xe9\x7d\xe6\xfe\x58\x14\x5f\xf4\xe3\xc5\x4a\x3c\xf5\x75\xc6\x95" }, - { 0x539f60, "\x5f\xfc\x77\xa1\x39\xa6\x43\xf3\x2b\xbf\xab\x35\x4b\xbe\xad\xcd\xd3\x87\x22\x4f\x62\x3a\x1b\x3c\xef\xb1\x71\xae\x8c\x96\xc4\x86\x38\xf8\xa\xf9\x9b\xfb\x33\x41\xea\x69\x4e\x5c\x42\x58\xcc\x67\xf1\x26\xc9\xf5\xa3\x74\xe4\xbb\x56\x8\x7d\xbd\x99\x72\x80\x5d\xed\x2d\x65\xe6\x9\xa0\xb3\xb5\xc5\xa9\x85\x7\xd\x82\x1f\x9e\xd2\x6f\x2\xaf\x57\x55\x93\x48\x76\xc6\x30\x16\xe0\x60\x51\xf7\x59\x1c\x45\x6c\x4\x92\x32\x7a\xf2\x2f\x4a\x36\x63\x2c\xdd\x70\xd7\x4c\xec\xce\x13\xd9\x89\x97\xc7\x81\x15\xdc\xa5\x7c\x5a\x3\x1a\x2a\x49\xb2\x11\x88\x68\xc1\xb4\x9d\x73\x9a\xc0\x47\x21\x12\xe2\x78\x31\x0\x3e\x6\x6d\xca\xb8\x7f\xcf\x25\xb0\x91\xff\xb\x84\x24\xe9\x8e\xa4\x6b\xc\xac\xe3\x17\xc2\xe7\x6a\xc8\x8d\xf0\x14\xe\x95\xcb\xc3\xd6\x3f\x6e\x64\xfa\xd4\xee\x90\x9f\xe8\xd5\x98\xdf\xeb\xf\x2e\x19\x20\xaa\x44\x46\xbc\x53\x8b\x4d\x3b\x7b\xfd\xa7\x29\x28\x34\xe5\x8f\xb7\xa2\xd8\xa8\x3d\xb9\x5b\x75\xdb\x5\x83\xb6\x50\x5e\x7e\x52\xfe\x37\xe1\x54\x66\x9c\xda\x1d\x40\x10\xba\x1e\x27\xf4\x1\xd0\x18\x94\xde\x8a\x79\x23\x61\xd1\xf6" }, - { 0x53a060, "\x1e\x91\xb3\x15\xe7\xc6\x8d\xfe\xc9\xb5\xa6\xdf\x86\xa\x8e\x2b\x54\xbf\x2c\x1d\xbd\x9e\x5f\xcf\x6\x4d\x14\xf\x9c\x2f\x3f\xe8\x49\x1b\xa7\x4a\x10\x88\x7d\xbe\xb0\x35\x11\xe1\xa4\x6d\x30\x2e\x38\x60\xf6\xf7\xdb\xb7\x33\x75\xc\x20\x77\xa9\x9f\xef\xf4\x9b\x79\xfa\x5e\xd5\x3a\x3e\xe6\x44\xd8\x17\xda\xe5\x31\x78\xde\x39\x19\x93\xb4\xa3\xcb\x48\x9d\x45\x21\xf1\x67\xed\xce\x29\x95\xe0\x55\xc1\xfc\x5c\x82\x5\xd3\x80\x76\xab\x72\xb\x97\xd1\xf3\xea\xae\x34\x2d\x98\x73\xc2\xf5\x26\x8a\x1\x37\xfd\x47\xeb\x5d\x0\x56\x8\x66\x36\xd6\x7b\xb2\xe9\x70\xc7\xa5\x7a\x6b\x4c\xdd\x74\x6a\xbc\x43\xc8\x81\x64\x62\xa0\xd2\xfb\x83\x4e\x53\x1c\x52\xcc\x1a\x59\xd0\x99\xf8\x3b\x5a\x28\x41\xf0\xd9\x40\x90\xc0\x69\x7f\x4f\x8f\x8b\x42\x18\xe2\x57\xb6\xb1\xe4\x16\x61\xbb\x23\xa2\xd7\x1f\xc4\x85\xa1\x7c\x9\x65\x8c\xb8\x58\x7\x22\x12\xdc\x13\xcd\xc3\x89\x2a\xee\x27\x7e\xa8\xe\xba\x3d\x4b\x96\x50\x3\xac\x94\xad\xec\x6f\x5b\x87\xb9\xaf\xd4\x63\xf2\x6e\x51\x84\x68\x92\x25\xaa\xe3\x46\x3c\xc5\x24\x4\xd\xff\xf9\x2\xca\x9a\x71\x6c\x32" }, - { 0x53a588, "\x87\xca\xb5\xe\xb6\xee\x76\xd4\xda\x6a\x2b\x3b\x46\x9e\x44\x1d\x38\x3\xa\xb3\x1b\xf5\xea\x80\x94\xe6\x33\x43\x95\x0\xe1\x5c\x41\xc8\x97\x36\xaf\x34\x53\xb0\x6d\x29\xf9\x32\x2\xd6\x75\xbe\x7\xae\xe3\x6c\xa8\xe5\x4d\x56\x68\xb\xf4\x5d\x51\xc5\x54\x6b\x85\xba\x65\x86\xa7\xa9\x2f\xf1\x28\x5b\x4\x9c\xe7\x3f\x70\xd\xd5\xbf\xac\x5e\xad\x5a\x6\x2d\x30\x45\xd2\x17\x8d\x25\xed\x16\xc7\xd3\xde\x78\x22\x4a\xa0\x20\xe2\x89\x11\xa6\x2e\xff\xfc\xec\xfe\x9d\x18\xfd\x27\x60\xb1\xc0\x81\x99\x69\xa5\x64\x3d\xf2\x39\x1c\x9b\xc9\xc4\x8a\x21\x1f\x57\x4b\x5\x62\xb2\x14\x59\x2a\x12\x5f\xd1\x50\x90\x52\xcf\x1\x9\x4f\x7d\x74\x10\x42\x19\x8e\xe0\x40\x8f\xc2\xc\x82\x6f\xbb\xa4\x63\x55\xd7\x24\xab\x92\xbd\xf8\xcb\x8\xe9\x26\x49\x58\xf3\x1a\xc1\xd9\xdb\x4c\xbc\xb8\x84\xc3\x88\x8c\x98\x77\xeb\xcc\x3c\x83\xdf\xfa\x79\x15\x91\x7e\x3a\xf\x93\x66\xce\xa2\x7b\x37\x9a\x1e\xd0\xa3\x71\x3e\x47\xaa\xb4\x23\x96\xe4\xb9\x4e\x7f\xf0\xcd\x9f\x61\xf6\xfb\x7a\xdd\x73\xb7\x13\x7c\x35\x2c\xa1\xe8\x8b\x31\xd8\x72\xc6\x67\xdc\x6e\xf7\x48\xef" }, - { 0x53a688, "\x62\x6f\x9b\x9c\x31\x48\x4c\xca\xc1\xe6\xa2\x2e\xed\xb4\xe2\xc8\x8f\x45\xc7\x76\x7a\xa5\x40\xb8\x15\x36\x93\x13\xc2\xf6\x17\x2f\xf0\x23\xc5\x95\x79\x1e\xba\xc\x73\x8\x0\x60\xc9\x1f\x54\x58\xc6\xbb\x2c\xb3\x68\x55\xbe\x41\xfa\xc0\x2\xa7\xbd\x78\x57\xa9\x69\x6d\xe4\x12\xe8\x7\x3f\xac\x6c\x16\x4\x87\xb5\xa0\x33\x5e\xe1\x28\xee\x4f\x6b\x50\x99\xaf\x51\xbf\x7c\x7d\x6\x5c\xfe\x6a\x53\x9d\x2a\xd4\x14\x66\xcc\x65\xa3\x3b\xfd\xfc\xf9\x3\xb2\x19\x8e\x91\x49\xdf\x1\x44\xa\x98\x9f\x3a\x80\xf8\xb1\x42\x32\x3d\x22\x37\x8a\x35\xae\xd0\x8c\xdc\xab\xc3\x18\xd9\xe5\x10\x5d\x38\x27\xaa\x52\x3c\xf\x74\xf5\x90\xe7\xec\xd1\x81\x84\x2d\xd5\x8b\x82\x5b\x46\x11\x5\x4a\x4b\xea\x5a\xb\x92\x24\xf4\x1b\x5f\x21\x9e\x7f\xff\x6e\xb6\x8d\xfb\xdd\xcb\x1d\xf2\xe3\xb0\xef\xb7\x4e\x25\x86\xa1\xce\xcd\x72\x34\x64\xd3\xf7\x83\x94\x89\x9a\xd\xd8\x71\x67\xad\xbc\xf1\xa6\x63\x88\xd7\xe\x70\xc4\x20\xde\x3e\xd2\x7b\xb9\x1c\x1a\x39\x30\xda\x59\x47\x43\x29\x9\xe0\xcf\x77\x4d\x75\x97\x56\xdb\x2b\xa4\xa8\x7e\x96\x85\x26\xf3\xd6\xe9\x61\xeb" }, - { 0x53a7c8, "\x84\x5c\x65\xae\x56\xa1\xcc\x60\xa9\x28\x29\xf5\x35\x54\x33\xd1\xd6\x48\x44\x68\x34\xef\xee\xf3\x80\xa5\xcf\x2c\x22\xdf\xac\x53\x18\x2a\x19\xdb\xf1\x3d\xbb\x1b\xc4\xf2\xa6\xbf\x32\x2b\xe7\x8c\xb6\xba\xf8\x8b\x1c\xb7\xfe\x11\x75\xf6\xf7\x59\x76\x9c\xb1\x6e\xb4\xc6\xd\xb2\xb8\xc\x1f\x6\x12\x62\xa0\x47\x74\x5e\xd3\xde\x6a\xe\xaf\xc1\x8d\x57\x7\x89\x0\xa8\xbc\x51\x95\x4d\x97\x98\xfb\x9a\xea\x61\x7d\xe5\x50\x4f\xdd\x52\x64\xe4\x16\x8\x70\xff\x40\xd7\x9\x87\xad\xc7\xf4\x4c\x83\xd2\x63\x6c\xeb\x3\x79\xf\x13\x27\x88\xc5\x8e\x20\x3c\xb9\xf0\xc9\x94\xc3\x96\x1\x67\xb\x3e\x7e\xd8\xd5\x2d\x42\x58\x6f\x6b\xcd\x86\xdc\xab\xed\xfc\x24\xa3\x5d\xe9\x9d\x3a\x38\x8f\x55\x30\x46\xca\xc2\x25\x5f\x66\xc8\xe2\x23\x7a\x6d\xfa\xce\xe6\x36\x45\xb3\xb5\xfd\x92\x1a\x39\x21\x31\xaa\x7f\x71\x9b\xbd\x93\x43\x4\xa4\xd0\x81\x41\xf9\x78\x5a\xa7\x17\xcb\x9f\x3b\x90\x2\xe3\x5b\x69\x1e\xec\xe1\x5\x91\xd4\x4b\x7b\x8a\x77\x4a\x7c\xd9\x82\xc0\x26\xbe\x85\xda\x14\x2e\xa\x9e\x72\x4e\xe0\xa2\xe8\x99\x3f\x37\x10\x2f\x15\x73\xb0\x1d\x49" }, - { 0x53a8c8, "\xfe\x9b\xe5\x18\xb2\x38\x1d\xd4\x98\xa9\x52\x58\xc3\xe1\xe8\xbf\x39\x4a\x36\x9\x6f\x7e\xb0\x4f\xca\xcd\x3\xe0\x66\x1e\xdf\xd2\x59\x95\x71\x2a\x16\xa2\x86\xcf\x64\xf0\xdb\xf3\x8e\x35\x7f\x19\xb1\x33\x90\xbe\xc0\x8f\x5d\x6e\x51\x56\xda\xaf\xa\x25\x54\xd3\x41\xb9\x7d\x82\x62\x97\xfc\x4d\x88\xe3\x57\xff\xb4\xc7\x1c\xbd\x80\xef\xe6\x1\x23\xce\x17\x44\xdc\x67\x26\x6a\xbc\x8d\x45\xb8\xa3\x1f\x9e\x7\x74\xb3\xc9\x0\x9c\x78\xf4\xf1\x32\x49\x14\x73\xc5\x7a\x65\x5b\xf\x42\xbb\xa4\xb\xcc\xe7\x27\x9a\xfb\x55\xd6\xd\xad\xeb\x10\x79\x1a\x2d\xed\xe4\x2e\x5a\x7c\x3f\x3c\x47\xa6\x20\x92\x46\xb5\x84\x7b\x37\x89\xee\x2b\xf8\xa1\x30\x48\x9f\x87\x68\xb7\xae\xa0\x29\xb6\xc6\xf9\x2f\x22\xf6\x43\x83\x5c\x21\x5\xd1\xfd\x6b\x50\x11\x93\x8c\xe2\x28\xa5\x3b\x2c\xba\xd0\xcb\x91\x4c\xc1\x69\x53\x75\x12\x85\xab\x4\xf2\xd8\x34\xf7\xc2\x40\xec\x3d\xe9\xc\xa7\xd7\x8a\xaa\xac\x99\x15\x2\x31\xea\x6\x60\x4e\x72\x70\x94\x63\xfa\xc8\xc4\x3a\x4b\x13\x3e\xa8\xf5\xde\x24\xd9\x6c\x76\x5e\x96\x5f\x1b\x6d\x9d\xd5\xdd\xe\x77\x61\x8b\x8\x81" }, - { 0x53aa20, "\xfc\x7a\xc6\x79\x44\xfa\x78\x60\xb5\xd8\xa\xc0\x19\x5e\x12\xa9\x29\xb3\xcd\x75\xe3\x7b\x3a\xf1\x85\xab\x2f\x33\xe9\xc1\x14\xf0\x96\x82\xf9\x72\x77\xa3\xdd\xc9\x8c\x53\x4e\x1\xd1\x2e\x5\xec\x16\xdb\xd7\xb2\x35\x10\x74\xb1\xf6\xbe\x8a\x15\x50\x92\xe0\x7\xde\x24\x9c\xe7\x22\xda\x5d\xc3\x9e\x42\x59\xb\x11\x4a\xaf\x5f\x76\xd0\x94\x2c\x3f\x48\x97\x99\x2b\x34\x1e\x89\x6b\x23\x30\xce\xc\x8b\xaa\x57\x91\xc7\xea\xf4\xb8\x21\x8d\x3e\x70\x6\xa2\x64\xd3\x9f\xf3\x4b\x13\x2a\x1c\x7d\xee\xa1\xe5\x58\xbf\x98\x3\xfb\x6e\x81\x61\x56\x8e\x71\xa6\x26\x5a\x46\x80\x7e\x9\x37\xa4\x6a\x90\x1b\x1d\x51\x27\x5b\x2d\xba\x4f\xbb\x7c\xa8\x93\xf7\x4\xf5\x68\xd5\xc8\xc4\xef\x36\x84\xe8\xcf\x62\x2\xcc\x67\x49\xb0\x43\xc2\x3b\xa7\xa5\x1f\xfe\xac\x40\xb9\xc5\xae\x6f\xd4\x9a\x95\xbc\x17\x47\x9d\x86\xb7\xfd\xeb\x63\x65\x39\x69\x3c\x55\xe1\x9b\xd2\x66\xdc\x73\xbd\xf8\x83\xff\xf\xcb\x52\xb4\x88\x4d\xe6\x8\x6c\x20\x18\xe2\x45\x25\xe\xf2\x32\xdf\x38\x41\x4c\x5c\x31\x8f\xb6\xed\x0\x54\x28\x3d\xe4\xd9\x6d\xca\xad\xd\x7f\xd6\x87\xa0\x1a" }, - { 0x547b00, "\x72\xf0\x14\xcb\x61\xa5\xb2\x2\x75\x22\xc3\x9d\x5a\x63\xfa\x5f\xd9\x55\x58\x43\x24\x7d\x77\x93\xba\x50\x1d\xf7\x49\x18\xb0\x42\xbb\xec\x52\x38\xdc\xc8\x16\x54\x17\x19\x89\x67\x33\x3c\xa\xad\xc9\xde\x81\xed\xbd\xe\xb\x6d\x46\x30\x35\x2b\x8c\xa0\x1c\xd\xfd\xa1\x70\xc6\xd8\x41\xb3\xc0\x44\xeb\x92\xbe\x6b\x98\x1a\x76\x71\xc5\x51\x56\x80\xfc\x1\x53\x4b\xd0\x8b\xd2\x7b\xe7\x15\x5d\xe5\xa6\x8a\xd3\x9b\xf4\x69\x23\xe8\xb6\xc7\xe2\x73\x9f\x88\xdf\xb4\x28\xee\xc2\x94\xb8\xf9\x7f\x4a\x57\x6\xf6\xbf\xc1\xab\xfb\xa4\x8e\xd1\xd7\xf5\x7c\xa3\x1e\x3b\x32\x3\xaa\x90\x5c\x48\xe0\xe3\xcf\xd4\xef\x59\xd5\x1b\x34\x1f\x95\xce\x7a\x20\x26\x87\xb7\x78\x9c\x4f\xa2\x12\x97\x27\x3f\xff\x7\x84\x96\x4\xaf\xa8\xea\x2c\x6c\xae\x37\x91\xa9\x10\xdb\xcd\xda\x8\x99\xf1\x4d\xcc\x68\x79\x2e\xb1\x39\x9e\xe9\x2f\x6a\x3d\xf\x85\x8d\xca\x29\x86\xd6\xdd\x5\x25\x3a\x40\x21\x45\xac\x11\xf3\xa7\x9\x2a\x31\xe4\xc\xf8\x6e\x3e\xb5\x82\xfe\x74\x13\x65\xe1\x2d\x8f\xe6\xc4\x0\x5b\x4e\xb9\x66\xf2\x62\x36\x4c\x83\x5e\x6f\x47\x64\xbc\x9a\x60\x7e" }, - { 0x547548, "\x7c\x11\x4d\x5b\x41\x55\x97\x3f\x59\xed\xda\x6f\x85\x33\x16\xc8\xb1\x18\x50\x6c\x9c\x38\x2\x71\x2e\xec\x93\xa1\xa5\x0\x91\xaf\x7a\x92\x1b\xc7\x3a\xa9\xbe\xb6\x9b\xe5\xee\x57\xf1\x99\x47\x4\x6b\xd8\x20\xf4\x3\xd3\x75\xe3\xb8\xdc\x7\x54\x4f\x2d\x37\x49\x14\x9f\x69\xc4\xf7\xc6\xf0\xce\x24\x7b\x7e\x89\x4e\x3c\x7f\xcc\x9\xe6\x2f\x61\xfc\xcd\x86\x62\x83\x56\x29\xd6\x32\xc\x76\xc1\x5c\x68\x51\xf3\xa8\xe2\x87\xcb\xe0\xdb\xb\xba\xe4\x46\x9a\x84\x95\xf\x10\x81\x82\x53\x1c\x26\xc2\x31\xb0\x8c\xb3\x9d\xd9\x96\x5a\x79\xd1\xb2\x25\x80\x1f\xa4\xff\x60\x44\x1a\xb9\x45\xf9\xd2\x6e\xd0\x5e\x35\x98\x66\xc3\x90\xae\xa0\x78\xb5\x34\x2c\x12\xf5\xcf\xaa\xe9\x77\x8b\x70\xde\xeb\x65\xbb\x72\xa6\x88\x58\xa2\x27\xc5\x4b\xbc\x19\xdf\x36\x1e\xa\x74\x15\x17\xbd\x22\xe7\xac\xf6\xf2\x30\xe8\x13\x1\xef\x8f\xd4\x2b\x23\x48\x5f\x21\x3d\x73\x8\xa7\xd\xfd\x63\x67\x4a\x8e\x6a\xd7\xb4\x3b\x40\xc9\xfa\x64\x39\x7d\xea\xab\xfb\xd5\x8d\x42\x8a\x6d\xca\x94\xc0\xe1\xad\xbf\xa3\x9e\x28\x3e\x1d\x43\x6\xb7\x52\xe\x2a\xfe\xf8\x5d\x4c\xdd\x5" }, - { 0x53b1d0, "\xf\x8\xef\x6c\x8f\x19\x5e\x9c\xdb\xec\x35\x6f\xe9\x5\xe0\xd\xf3\x17\xa2\xb3\xcf\x28\x46\xe1\xa0\x6\x4e\x38\x4d\x25\x3f\xb5\x12\x80\xb2\xa7\x3\xbc\xca\x41\x6b\x2f\x1d\x4b\x66\x6a\x68\xaa\xc4\x77\xa4\x59\x4\xbe\xc9\xb9\x7b\xd1\xc5\xde\x57\x85\xa9\xcc\xc8\x6e\x78\xb\x82\x2\x5f\xae\x51\x7f\x2d\x8c\xee\xcb\x69\x62\x67\x81\x87\x5c\x1f\x8b\x74\xa5\xe\xf2\x5b\xc0\xc2\x18\xe5\xfd\x95\x65\x20\x97\x58\xc6\x3b\xb7\x9\xdc\x21\x11\xe4\xe3\x16\xa8\x63\xf6\x33\x6d\x8d\x9e\xb6\x34\x7\x14\x36\x71\x60\x45\xfb\x4a\x9a\xea\x1b\x90\x31\xb0\x99\x1c\xd3\x7c\x24\x47\xe2\xdf\xe8\xc7\x29\x30\x1\x2b\xd4\x8e\xb8\xd6\x7e\x2a\x7a\x3d\xf4\xdd\xd0\xb1\xf0\x73\xab\xbb\xa6\xf7\x3a\x1e\xba\x52\x4f\xbd\x4c\xb4\x72\xc1\xe7\xfa\x1a\x54\xf5\xac\xff\x5d\x40\x37\xd9\x43\x23\x93\xa1\x3c\x79\xad\x44\x76\xed\xaf\x84\x94\x49\x50\x91\x10\x70\x5a\xce\xc\xd8\x0\xfe\x92\xd5\x55\x56\x2e\xeb\x89\x13\x88\xc3\x64\xe6\x75\xa3\xf8\xf9\xa\x9f\xcd\x61\x83\x96\xfc\x22\x9d\x7d\x2c\x53\xd2\xbf\xd7\x39\x3e\xf1\x48\x8a\x15\x42\x98\x27\xda\x26\x32\x9b\x86" }, - { 0x53b2d0, "\xab\xdf\x86\xff\xce\xfa\xaa\x1\xd2\x41\x9e\xe7\xbc\xc0\x77\x22\xe8\x7c\x4e\xfb\x8e\xf3\x33\xc9\x4b\x26\x60\x89\xc4\x69\x79\x96\x54\xcd\x10\x48\x23\x31\x38\x44\x82\xe5\x6a\x8\xd7\x3f\xe1\x28\xd3\xa6\x4c\x7\x34\x5b\x7f\xb0\xd\x81\xd0\xf\xc1\xaf\xcc\x3d\x99\x19\x24\x57\xb4\x2c\x8d\x7d\x58\x55\x27\x8a\x42\xb\xa2\xca\x53\xc5\xe0\xf4\x4f\x2f\x8b\x21\x2\x2d\x12\x65\xf5\xf2\xc8\xed\x1d\x47\x5c\x1c\xa8\x40\x7a\x8f\xda\x87\xd5\xb1\x4\x70\xea\xe\xeb\x29\xb5\xb8\x9f\xf8\x2a\x3b\xb3\xfd\x5d\x0\x71\x2e\xc2\x46\xec\x92\xf9\x6\x74\xe4\x6d\xa0\x59\x6e\x25\xa9\x7b\x5f\xe2\x64\x3e\x37\xfc\xd4\x9b\x5\x61\x84\x20\xa\xc6\xa7\x76\x83\x62\x32\xa3\x6f\xc7\x78\xa5\xf6\x30\x6c\xdc\xa1\x2b\xbd\xae\x15\x3a\xf1\x4d\x45\x5e\x75\x98\x68\xad\x1b\xd1\x49\x35\x6b\x52\x14\x1a\x11\x88\xbe\x8c\xac\xc\xe3\x66\x13\xd9\x17\xcf\xdd\x93\xbf\x39\x56\xf7\x18\x94\x63\x3\x1f\xd8\xb6\xcb\xf0\x9d\x9\x16\xe6\x90\xa4\xb2\xba\x85\x3c\xd6\xfe\x36\x50\xc3\x43\x80\x1e\xb9\xee\xb7\x9a\x51\x9c\xdb\xef\x67\xde\xe9\x7e\x97\xbb\x5a\x72\x4a\x73\x95\x91" }, - { 0x53b418, "\xc6\xcb\x61\x7f\xb\x44\x1c\xea\xc1\x87\x7d\x4e\xd4\x23\xbc\x82\x10\xa7\x3e\xaa\xbf\x46\xb2\xd2\xa3\x33\x20\x27\xc0\x9f\xe2\x45\x6b\x96\x6\x8b\x1d\xb7\x26\x56\x88\xc3\x13\x2b\x15\x37\x9e\x57\xe5\xc8\x21\xa9\x92\x2\x38\xfe\xd7\xba\x9a\xc7\x5a\x84\x28\x58\xfb\xa8\x90\x42\xf4\x3d\xfa\xdc\xa\x4c\x48\x8f\x8e\x39\x3b\x63\x5\x79\x4a\x2c\x65\x71\xe\xdb\x29\xe0\x50\x1\x8d\x19\x31\x94\xd\xb4\x9c\x6c\xb3\x68\xc2\x2e\xce\x97\xe6\x2d\xcf\x36\x91\x1f\x7a\xf\xc4\x8a\x5d\x9b\xad\xfd\x93\xd8\x3f\x9d\x64\x85\x4d\x99\x69\xd5\xd1\x18\x1a\xd9\x12\x2f\xf5\xf2\xda\x80\x51\x1e\x4\x60\x7c\xd6\x86\x54\x62\xac\x5b\x17\xf8\x66\xa4\x43\x49\xff\x0\xe1\x9\xb9\xed\xdf\xd3\x55\x72\x16\x4f\xe9\xe3\xab\x81\xe8\x2a\xcd\xb1\x53\x77\x75\xb0\xdd\xc5\x67\xf3\xa6\xe4\x34\x3a\x40\x1b\x83\x6f\xef\xa5\xa2\xca\x73\xb5\x47\x8\x76\x11\xc9\x3\x3c\xf7\x6a\x25\x41\x30\xf9\xaf\x5c\x95\xa0\xb6\x35\x78\xbe\xd0\x14\xec\x59\xbb\x70\x5e\x74\x6e\xb8\xae\x7e\xfc\x7\x6d\x52\xe7\x32\x8c\xcc\xeb\xf1\x89\x7b\xbd\xa1\xf0\xc\x98\x24\xf6\x5f\xde\x22\x4b\xee" }, - { 0x53b550, "\xa0\xb9\x6e\x86\xd9\x98\x97\x73\x25\x76\xf\xcc\x7\xe8\x7a\x79\xb5\xe5\x38\xf4\xc2\x16\x10\x2f\xa2\xec\x3a\xb0\xdf\x5f\xb4\x6a\xb1\x60\xd4\x3e\xd2\xde\x6\x95\x62\xd5\xab\x9\x13\x11\x92\xa6\x37\xa\x2c\x64\xf1\x80\x1b\xfc\x31\x22\x3b\xff\x94\x70\xca\x84\x24\xdd\xd7\xd3\xb2\x32\x3d\xb6\xb7\xa9\x26\x9b\x48\xc0\x1f\xaf\x83\x6c\x58\x29\xc3\x7d\xc5\xf3\x8d\xb\x8a\x2a\x69\x1d\x91\x7e\x9c\x3\xb8\xf2\x9f\x45\x28\x4c\xbb\xcb\x2b\xfd\x61\x7f\xb3\x99\x6b\xbc\x7c\x19\x52\x2\x78\xea\x5c\x49\x74\xa7\xc7\x59\xf6\xf0\x8f\x81\x82\x8c\x1\xf5\xc4\xad\x21\xa5\x0\x5a\x39\x75\xd8\xc\xc1\x85\x17\x5b\x77\x43\xc6\x89\xa1\xf9\x20\x93\xee\x12\x1e\x1a\xe1\x57\xf7\x4\xae\x18\xcf\x33\x47\xfe\xe9\x8\x71\x65\xbd\xd\xcd\x6d\xe4\xac\xba\xdc\xd0\xf8\x4e\xe0\x8e\x5d\x41\x3f\x54\x42\xa4\x40\x34\x5e\x87\x7b\xe3\xdb\xe7\x51\xd6\x9a\xaa\xce\xbe\x36\x67\x35\xd1\x68\x4f\xfa\x23\xfb\xed\x8b\x44\x9d\x50\xeb\xc8\x14\x15\xe6\xc9\xe\x88\x4d\x66\xa8\x5\x3c\x46\x2e\x27\x6f\x72\xbf\xa3\x2d\x96\x9e\xda\xe2\x63\x1c\x53\x55\xef\x56\x4b\x90\x4a\x30" }, - { 0x53b718, "\xd4\x58\xf7\x7\xc3\xfd\x69\x49\x23\x17\x65\x84\x9b\xf\x77\x97\xb\xc4\x67\xb1\xbd\xba\x85\xc7\xff\x8f\x32\x28\xea\x6b\xd7\x9f\x31\xab\x9e\x5b\x11\xa8\x36\x8\x96\xa4\x4f\xa2\x70\xed\xd3\x91\x2a\xd9\x73\x6\xb4\xaa\x35\x72\x48\xf3\x0\x1e\xc0\xdf\x2e\x29\xdd\xb7\xa\xd\xaf\x2f\x56\x19\xc\x39\x5c\x46\xec\xac\xfc\x7d\xe6\x92\xf2\x15\xa3\x5d\x93\x3d\x98\x2d\x79\xb0\x52\x5f\xb3\x89\x3\x4\x1d\x55\x42\xcc\xe9\x83\x16\x80\xd2\x8e\x5a\x66\x1b\x47\xfa\x88\xa7\x9a\xd1\x25\xf8\x44\xe2\x26\x59\x9\x61\x40\x3c\x34\xd8\x30\x45\xbb\xc6\x7f\xe7\xbc\x7b\xa9\x3a\x1c\xe5\x68\x21\x5e\xb2\x12\x2c\x74\xcf\x8a\xb9\x24\x1\xcd\xe4\xb5\x9d\x1f\x18\x3b\xe0\x71\x4e\x4b\x4d\x62\xa0\xd0\xc2\xd6\xeb\x43\x51\xf9\xa6\xf4\x2\x90\x1a\xa5\xef\x5\x7c\xb8\x57\xc1\xfb\x8d\xde\x50\x33\xf5\x82\x86\x3e\x76\xc9\x8c\xa1\x8b\xc5\xee\xbe\xe3\xda\xae\x14\xf1\x6f\xe1\xd5\x10\xf6\x27\xfe\x6d\xce\x9c\x6e\x94\xe8\xb6\xca\x60\x37\x53\xe\x54\x3f\x99\x75\x81\x20\xcb\x4c\x7a\x6c\x38\x78\xdb\x64\x95\x6a\x13\x4a\xf0\xbf\x22\x41\xdc\x87\xc8\x7e\x63\x2b\xad" }, - { 0x53b838, "\xe3\x57\xc6\x8b\x64\x27\x80\x87\x9b\x49\x29\x6e\xa8\xda\x5b\x20\xbb\x69\x19\xd3\x5e\x30\x9e\x9d\x24\xcd\x2c\x1c\x79\xb\x9f\x8d\xff\x41\x6f\x68\xbd\xd9\x55\xcf\x36\xe6\x5f\x93\x99\x33\xe1\x72\xf2\xe\xd2\xe2\x2e\xd7\xa7\x32\x31\xa2\x25\xfd\xef\x67\x21\xe4\x2d\x3e\xd0\xac\x34\x35\xf1\x44\xee\x5a\x83\x71\xc1\x59\x3f\xa3\x10\xfb\xa6\xcc\x0\x40\x18\x3b\x9a\x47\xfa\xa5\x66\x5d\x6a\x2f\x16\x23\x88\x7a\x84\xc5\xc9\xea\xce\x58\xeb\x11\xaf\x5\x37\x89\x17\x1a\xe5\xb8\xa\xc0\x95\x48\x81\xb7\xf\xf6\x7e\x60\x8f\x8\xd5\x42\xd1\xf8\x45\x2b\x5c\x1b\x76\xf0\xc8\xf4\x3\x7d\x50\xb5\x86\xb3\xe0\x7b\x3a\x1f\xdc\x92\x28\xca\x61\x4a\x78\x1e\x51\xdd\x3d\xbc\x77\xd8\x53\xf9\x94\x74\xc3\x9\x4f\xb6\xec\x2a\x91\x8c\xd4\x38\x4e\x26\x1d\x96\xdf\x4\xd\xab\xa4\xfc\xc4\x15\xa9\x3c\x97\x6b\x7\xde\x9c\xe8\x22\xe7\x2\x6d\xa1\x39\xf3\x54\xba\x6\x65\x90\xb0\x6c\x63\xad\xf5\xb4\xb9\xc\xe9\x1\xc7\xd6\xc2\xb2\x56\xbe\xaa\xb1\xcb\x52\x82\x14\xed\x7c\xfe\xae\x85\x8a\x13\xbf\x4c\x98\x4b\x62\x12\xa0\x4d\x7f\x73\x8e\x43\x75\xf7\x46\x70\xdb" }, - { 0x53bc10, "\xf\xc6\xa1\xa3\x50\xbd\xce\xa7\x9\xa4\xf7\x1b\x8c\x3d\xf0\xe5\xdf\x3c\x20\x75\x3f\xdd\x12\x81\xde\x3b\xaf\x68\xf6\xea\x41\x58\xeb\x5d\xae\x61\xa\x46\xed\x91\x23\x65\x99\x86\x27\x92\x8e\x83\x51\x8\x4b\x3e\x32\x1f\xbf\x5b\xa9\xc5\xfe\x7c\xf4\x15\xdc\x89\xf5\x2b\x72\xad\x6b\xba\x5a\xf2\x24\x53\xe7\x29\xee\x4\xd\xf3\xe0\xb7\x67\xcf\xb0\xc3\xbc\xc9\xfa\x66\xcd\xb4\xd5\xd9\x71\xe3\xb8\xa0\x25\xf8\x78\xc4\x5\xe9\x87\xfd\x35\x1a\x98\x9f\x16\xb3\x6\x26\x22\xb2\xd6\x74\xc7\x84\xc2\x7d\x64\xec\x54\x37\x4c\xef\x70\xe\x48\x9b\x4e\xd7\x80\x7\x73\xbe\xd3\x2\x3\x94\xfc\x59\xb5\x8b\x21\x9d\xf1\x69\xe1\x10\x38\x2d\xd2\x45\x30\x42\x85\x6e\x52\xc\x76\x82\x6d\xa6\xd4\xe4\x90\xa2\x62\x7e\x1\xe6\x1d\x4a\xff\x8d\x79\x8a\x55\x77\x2f\xca\x9e\x47\x19\x6c\x28\xb6\x93\x97\x6a\x18\x5c\x4f\x95\x6f\xc0\x14\x40\xdb\xa8\x17\x34\x36\x39\x56\x11\x13\xd1\xc8\xcc\x1e\x2c\x5f\x43\x5e\xa5\xe8\xd0\x9a\xe2\xab\xf9\x4d\x3a\xaa\x1c\xb\x2a\xb9\x31\x7a\x60\xac\xfb\xb1\x44\x0\x88\x8f\x33\xc1\x7b\x49\x2e\xda\x63\xd8\x96\x57\xcb\xbb\x7f\x9c" }, - { 0x53bd10, "\xba\x9d\x27\x84\x89\xcd\x60\x67\x68\xd9\x1f\xea\xf2\x15\xd2\x6\x12\x5d\x54\x75\xbc\xa0\x29\xe8\x16\x70\xc8\xf1\x9\xa4\x26\x30\x49\xd\xbd\xf4\xf8\xef\x8d\x1d\x41\x38\xf7\x9c\x1e\x87\xf3\xbe\x7a\x37\x88\xcb\x36\xe6\xfc\xd6\xd0\xad\x78\x71\x93\x96\xf0\x3c\xfe\x57\xe9\x4f\x7d\xaa\xf9\x62\x9a\xab\x18\x39\xbf\xc\xc3\x4d\xe7\x97\x7f\x8a\x3f\x1\xc9\x80\x76\x9e\xfb\xa1\x3e\xfa\xb3\x45\x3b\xdc\x5c\x5b\x58\x61\x2b\xec\xb4\x55\x1a\x9f\x6a\x3\x11\x32\xd1\xe1\xb2\xa8\x6c\xe4\xa3\xa7\x4b\xf5\x17\x40\x6e\x8\xff\x81\x4c\x5\x79\xae\x1c\x83\x46\x25\x6b\xdf\x24\x64\x2e\x4e\x21\x31\x2\x73\x6f\x3a\x8b\xc4\x7b\xac\x23\x72\x20\x65\x7\x33\xa2\xe0\x47\x77\x85\x2d\xdd\x0\xf6\xd8\x9b\xb9\x63\xd4\x53\xaf\xb7\xda\xa5\xc5\xc6\x2f\xa\x6d\x92\xb8\x50\x74\xbb\x14\xd3\xf\xb0\x4a\x95\xe3\xce\xee\xca\xe\x91\x82\x8c\x3d\x8f\x22\xa9\xb1\x86\xc0\x5f\x28\x90\xdb\x7c\x4\x94\xb\xc7\xd5\xfd\xc2\x2a\x1b\x98\xed\xcc\x59\x8e\xe5\xe2\x42\xb6\x34\xd7\xa6\x13\x2c\xc1\x44\x51\xcf\x99\x48\x69\xeb\x7e\xb5\x52\x35\x19\x66\x10\x56\x5e\x43\xde\x5a" }, - { 0x53be50, "\x64\xe7\x66\xd5\xf\xc3\xc8\x20\x4e\x9\xd3\x30\x3f\xef\xa9\x80\xe3\x72\x42\x68\xa5\x51\x99\xb\xbf\x4d\xd1\x34\xaa\xdf\x2f\xec\x55\x58\xb0\xdb\xb8\xd6\xc5\x9b\x9a\xa\xbb\x40\xc2\xb2\x2e\x78\x89\x97\x5d\x74\xf7\x52\x5b\xa1\x2b\x83\xae\x7b\xd9\x5e\xfe\xfd\x98\xd2\x29\x13\xc6\x8e\x5c\xca\x7\xd4\xe4\x49\xa8\xa0\xff\xee\xc9\xcf\x16\xb4\x61\x8f\x60\x1\x84\xb5\xac\x62\x54\x6\x2d\x63\xa7\x48\x73\x1e\x92\x2c\x3c\x82\xe1\xcb\x10\xf2\xd8\x50\xf1\xfb\x96\xc\xd7\x6b\x87\x77\x7e\x15\x8a\xde\x31\xe\xab\x59\xd\x3b\xf3\x79\x1f\xfc\x81\x27\x1a\xf9\x94\x2a\x45\x88\xfa\x47\xe9\x7d\xb7\xed\x7c\x32\x7f\xe2\xbd\x6f\x18\x76\x4b\x65\x70\x22\x1d\xaf\xeb\x28\x4f\x9c\xbc\xf8\xcd\xc0\x1b\x43\xb1\xea\xa3\x6c\x12\x35\x44\x8d\x25\xb3\x1c\x24\xc4\x9d\xa2\x36\x56\xb9\x19\xe8\x21\x11\xf0\x75\x5\x17\xc7\xce\x41\x4\x4a\xe0\x6e\x67\x69\x4c\xdd\x53\x3e\xa6\xd0\x3d\xdc\xcc\xe6\x9f\x93\xc1\x33\x90\x57\x37\xb6\xa4\x9e\x6d\x8b\x46\xad\xba\x86\x38\x85\xf6\x5f\x8\x14\x2\xe5\x8c\x5a\x39\x95\xf5\x91\xda\x7a\xbe\x23\x26\x6a\x71\x3\xf4\x0\x3a" }, - { 0x53bf68, "\x36\xbe\x8a\x3c\x5d\xaa\xc4\xf5\xfa\xc\x3f\xd\xa0\xc6\x49\xc1\xe1\x20\x7a\x31\x84\x87\xf7\x9f\x71\x6b\xeb\xa8\x11\x35\x22\x78\xe4\x83\x97\xdd\x53\x39\x45\xb9\x3\xad\x4c\x34\x8e\x79\xfc\x57\xb8\x47\x66\xfd\x54\x96\x33\x48\x4b\x88\xf9\x7\xa2\x3e\x64\x1b\xb2\xf\x5f\xcb\xcd\x18\xfb\x74\x70\xb1\x2a\x37\x2c\x98\x9a\x7c\x30\xe2\x75\x28\x26\x63\x1c\xec\x3a\xa3\x8\x85\xc5\xe\x2b\x4\xe9\xc9\x4f\xd1\xd2\x25\x9d\x6c\xd0\xfe\xce\xca\x15\xbc\x82\x2d\x27\x3d\xbb\x56\xe6\x24\xd7\xe3\xf2\x6e\x12\x9c\x6a\xe0\xe8\x4a\x9b\xd5\x10\x86\xc7\x90\x7d\x61\x67\xd8\xb5\xf1\x1a\x8f\xf8\x89\x4d\xa\xe5\xf4\x7b\x60\xa1\x40\x42\x2f\x1\xb6\x1f\xef\xd3\x81\xc2\x5b\x6d\x41\x5c\xff\x95\xc8\x76\x94\xd6\xd9\x19\xf3\x38\xb4\xdf\x59\xb\x52\xb7\xab\x73\x14\x62\xbf\x9e\xb3\x21\x3b\x17\xba\x58\xcc\xdb\x6\xda\x5\xa5\x16\x4e\x80\x1e\xa7\x8d\xa6\x7e\x99\xae\x0\x5e\x2e\x77\x50\x65\x29\x7f\xd4\xee\xf6\x2\x13\xdc\x69\xa4\x44\x8b\x32\xde\x92\x68\x1d\x51\xcf\xa9\xbd\xf0\xc3\x72\xed\xb0\x8c\xac\xc0\x23\x9\x46\x55\x91\x43\x5a\xe7\x93\xaf\x6f\xea" }, - { 0x53c0e8, "\x6d\x90\x16\x84\x89\x48\x99\x24\xad\xbc\x92\xe\x6a\xf5\x4e\xea\xaf\x38\xcb\xbd\x8a\x12\x9e\xd6\xb\x8e\x9c\xf8\xb5\xa1\x81\xe3\x9d\xfa\x65\x77\x6\x7b\xb8\x98\xda\x54\xf6\x3b\x7\x93\x5c\x7a\x15\xfe\x2a\x30\x36\x80\x39\x8c\x2b\x4b\x5b\x21\xe0\x13\x6c\x29\xc0\xbb\x27\x3a\xdd\x3f\xa2\xe9\xac\x4c\xef\x44\x70\x19\x5a\x72\x7c\xc5\x3c\xdc\xcf\x88\xf2\x51\x47\x61\x3\x67\x82\xfb\xed\x18\x9f\xb7\xa7\xb0\xc4\xf\x26\x5\x28\xe5\xd2\x4f\xa\xd0\xb3\x1\xd5\x1a\x37\x6e\x8\x9a\x1f\x60\x45\x5f\xf9\x33\x9b\x6f\x2d\xca\x9\xb4\x3e\xbf\x96\x95\x4a\x11\x1d\x74\xcd\x87\xce\xb9\x20\x68\xc3\x40\xf1\x31\x8d\x25\x7f\x2\x17\xb6\xcc\xd3\xa5\x59\xf4\x91\xd1\x83\x4d\xc2\xe1\x22\xec\x4\x52\xf0\xd9\xae\xc8\x56\xf7\xd4\x85\x42\x1e\x35\x1c\x7e\xeb\xe2\x76\x6b\x49\x75\x3d\x58\xff\x57\xbe\x43\x46\xf3\xba\x2e\x69\xa3\x34\x78\xb2\x73\x5e\xe7\x1b\x8f\xd8\x8b\x94\xa8\xe6\x97\x7d\xde\x2c\xa6\xab\x23\xfd\x50\xe8\x79\x62\xa4\x66\xfc\xee\x86\x41\xc6\xd7\xa0\xc7\xe4\x5d\xc9\x53\x32\x63\xaa\xc1\x64\xdb\xb1\x0\x10\x2f\xc\xdf\xd\x14\x55\x71\xa9" }, - { 0x53c240, "\x74\x4b\x7\xe3\x16\x70\x33\x94\xb\xb6\xe6\xc0\x62\xd5\xe5\xfb\xbe\x8d\x67\xc8\xc7\x58\xc6\x2e\xf9\x47\x77\x12\x4a\x68\x6c\x84\x35\xe1\x69\x14\xc4\x48\x32\x11\x9d\xb1\xe\x5a\xd0\x17\x60\xed\x28\x21\xef\x10\x2b\x5b\x31\xab\x23\x89\xf0\x18\x66\x0\x87\x99\x30\xe2\xda\x49\x7f\xd2\x4d\xcc\x81\xd6\xdf\x37\xd\x1a\xaa\x51\x97\xb3\x73\xd3\x50\xb2\xdd\xc3\xbf\x3e\x92\x1\x64\xf4\xcd\x1c\x8f\xaf\xa9\x24\x36\x91\x9e\xa4\xd1\x75\xc9\x59\x42\x4e\xb4\x6a\x4f\xa1\xe8\x6d\x61\x63\xea\x3c\x38\x5\xe9\x9c\x46\xb9\x9f\xb7\x43\xeb\xf5\x5c\x76\x3b\xd7\xba\xa5\x7b\x6f\x5f\xde\xad\xe7\x15\x2\x2f\x5e\xf7\xa6\xbb\x52\x95\xd9\x86\x26\xa\xa8\x8\x20\xf1\x45\x13\xca\xf6\x65\xcf\xe4\x98\xdc\x80\x19\x7a\xfd\x9b\x4\x1e\xa3\x9a\x5d\x72\xb5\xfa\x3\x53\xc2\xc\xa7\x57\x55\x7e\x29\x6e\x83\xb0\x1f\xbd\x8e\x93\x8a\x79\x96\x39\x7d\x88\x27\xcb\x71\xf\xf3\xfc\x25\x40\x3a\xd8\x85\x2c\x6b\xd4\x2d\x34\x54\xec\x8c\xe0\x1b\xb8\x8b\x3f\xf2\xac\xff\x7c\xa0\xee\xbc\x22\x44\xce\xc5\x9\xdb\x82\x78\x90\xae\xc1\x6\xa2\x41\x4c\x1d\x3d\xf8\xfe\x2a\x56" }, - { 0x53c368, "\x8b\x9c\xe5\x1a\x2d\x5a\xf5\xa6\x77\x3\xd4\xb4\x99\x84\x32\x53\xcd\xca\x43\xb5\xe2\xcb\x1e\x8c\xc7\x81\x89\x49\xb3\xf7\x71\xbb\x4e\xe8\x7d\xaa\x2e\xd0\x7f\x3e\xf1\xe9\x60\xbf\x87\xe6\x6c\x6d\xff\x47\x10\xc5\xc9\x3a\x5e\x30\x3b\x0\x4a\x18\x63\x11\x8e\x92\xab\xf9\x8a\x9f\x9e\x1d\x45\x62\xf8\x83\xce\x5d\xcf\x78\xdd\x93\x8f\xc2\x76\x2b\xd3\x54\xd\x4d\x44\x31\xa\x42\x91\x23\xfd\x36\x48\x79\x2a\x4f\x2c\x80\x7c\x7\xb9\xb0\x68\x52\x33\x70\xe1\x6a\x9\xbe\xad\xf0\xb8\x37\x5c\x41\x95\x59\x72\xa5\x67\xf6\xa2\x13\x82\xfb\x19\x34\x66\x3f\x5b\xac\x5f\x9d\xeb\xd8\xb7\x21\x1c\x3c\x75\x4c\xd1\x7e\x74\x40\xb6\x22\x98\x69\xee\xea\xa4\x7a\xe4\x6e\x58\xc0\x12\x1b\xe\x14\xae\xde\x9a\x7b\xd7\x28\xed\x1f\x61\x55\xf\xb\x57\x17\x9b\xef\xe7\x97\xfa\xaf\x24\x4b\xd2\xa3\xd9\x85\x64\x8\x2f\x96\x50\x35\xa7\xe3\x25\xc1\x46\x8d\xcc\x73\xe0\x56\x15\x90\xa8\xbd\x5\x4\x20\xc4\xf3\x39\x16\x6\x38\x65\xf2\xdb\x86\x6f\x27\x1\xf4\x6b\xb1\xbc\xdc\xba\xc6\x26\x3d\xdf\xa1\x29\x51\x2\xa0\xc8\xda\xa9\xec\x94\xc3\xc\x88\xd6\xb2\xd5\xfe\xfc" }, - { 0x53c7b0, "\x5f\xb6\xef\xa1\xfb\xd0\xa3\xb\xc9\x67\x54\xdd\x92\x4\xa5\xe0\x99\xa7\x62\x53\x87\x3c\xf6\xcc\x12\x45\xd5\xa6\x7b\xb4\x8e\x6f\x3e\x6e\xe3\x41\x44\x61\x8b\x5e\x2a\xb9\x2b\xdc\x46\x7c\x4b\xf0\x50\x4d\x9b\xad\xc3\xa8\x7d\x81\x8f\x2e\x1d\x79\xf3\xfe\x29\x8a\x3f\x22\x35\x4c\xa2\xf1\x90\x58\x9a\x70\xac\x88\xc4\xbb\x43\xb5\xbd\xaf\x24\x2c\x1c\xb0\xe9\xbc\x3\x3d\x18\xc5\x7\xd8\x9f\x97\xdf\xd9\xc6\x68\x5c\x15\x2\xda\xa9\xc2\xaa\x6\x55\xc7\x76\xf4\x2d\x7a\x32\x85\x86\xee\x19\x95\x4a\xec\x94\x80\x89\xbe\x9c\xcd\x56\x38\x10\xd3\x8\xdb\xb1\x6d\x6a\x2f\xf5\x33\x52\xcf\xab\xe6\x1f\xa4\x73\xf9\xf\xc8\xc0\xe8\x93\x13\xd\x84\xf7\x9d\xba\x64\x83\xb3\xae\x71\x37\x1e\x8c\x25\x0\xf2\x21\x9\xea\xd1\x1a\x7f\x42\xe1\x16\x48\x6c\xc1\x1b\xf8\xd6\x20\x27\x74\xb8\x49\x60\xcb\x6b\xa\x3b\x72\x75\x9e\x47\xeb\x4f\x91\x31\xe4\x63\xd2\xe7\xfc\xde\xb2\x28\x4e\xce\x57\xc\xb7\x98\xed\x36\x7e\x5a\x34\x40\x51\x23\x30\x59\x77\xfa\x5d\x1\x96\x39\x8d\xff\x17\x11\x66\x5\xfd\xd7\x14\xe5\xa0\xbf\x69\xe2\x82\x26\x65\x5b\xd4\x3a\x78\xca\xe" }, - { 0x53c8b8, "\x69\x23\xad\xbe\xc\x4e\x2f\x48\x7e\xe3\x30\xaa\x9d\x42\xc3\xc1\x6e\x13\x64\xff\x3d\xd9\xdf\xb3\x4b\x98\xfc\xeb\x92\x83\x95\x50\xaf\xc9\x7b\xf\xc7\x8d\x53\xa8\xbb\xb5\xd8\x2e\x9f\x3\x81\xe8\x2d\xed\x74\x6c\x97\xe9\xb\xbd\x1d\x15\x4\xa0\x5a\x16\xbf\x3f\x7c\x35\x6\xcf\x7a\xae\x44\x8b\xf4\xf7\x5e\x1e\xef\x27\x8f\x29\x55\xf2\x4f\xd\xea\xc4\x5\x88\x18\x94\x34\x8\xb4\x62\xd7\x26\x56\xfb\xf8\x37\x33\xce\x1c\xd0\x47\xd5\xe0\x71\x41\xd6\x87\xee\x72\xf1\x70\xe5\x75\x7f\x21\x54\xca\x80\xb2\x11\x7d\xbc\xdc\x7\xe\x91\x38\x96\xa1\xb6\x3a\xfd\x2\x6f\xa6\x3e\x10\x60\x9c\x63\x77\x59\xec\xa\x86\xf5\x28\xfa\xe7\xe1\xb7\x76\x36\x1a\x1f\xa5\x9a\x45\x39\xdb\x5d\xd2\x5f\x2b\xf9\xfe\xde\x31\xab\x52\xd1\xa4\x3b\x4a\xb0\x0\xb9\x9b\x9e\x43\xc0\x12\x89\xa9\xa3\x20\x65\x14\x1\x46\x2c\xcc\x17\x8a\x68\xe2\x19\x4c\xd3\x32\x5b\xdd\x66\x73\xcb\x85\x1b\xc6\x67\x6a\xd4\xc2\x8e\x61\xda\xf3\x57\x79\xa7\xb8\x8c\x9\x40\x5c\x6d\xb1\xa2\x22\xc8\xf0\x25\x49\x58\x24\x6b\xe4\xcd\xba\x93\x2a\x99\xc5\x4d\xe6\xf6\x84\x3c\xac\x90\x82\x51\x78" }, - { 0x53c9e8, "\x1\x69\x88\x4f\xf0\x48\xe7\xbd\xc3\xba\x8\x63\x75\x6d\x3a\x4b\xd7\x86\x59\x47\xb\xde\xa\xf1\xbe\x58\xe1\x5d\x91\xab\x9\xee\xad\x5e\x28\xca\x6\xa9\x4\xe9\x8e\xc5\x6f\xd0\xfe\xdf\x12\xc1\x7e\x4c\x2b\xcb\xb1\x96\x7a\x90\xf8\xc2\xa4\xe6\x73\xa2\xdd\x1c\xaa\xe4\x30\x3f\xcc\xc4\x35\x66\xb3\x1d\xdb\xa0\x7\x36\xa3\x54\xb9\x43\x94\xc\x8b\x98\x72\x44\xbc\xf5\xcd\x2d\x2\x5b\xed\x1f\x29\xf7\x0\x7f\x53\xda\x85\x2f\xc0\x89\x33\xa5\x9f\x9a\x8d\x64\x68\xd2\x9e\xaf\x40\xeb\xec\xfa\x26\x41\x9d\xd4\xa1\x10\x8c\x37\xbf\x4a\x81\xac\x45\xd6\xa7\xe3\x9c\x8f\x21\xf2\xff\x42\xea\x87\x32\x1a\x2e\xcf\xbb\x3e\x15\x22\x65\x7b\x61\x3d\x83\xa6\x78\x6a\xd8\xf\x2c\x31\x62\x97\x5c\x14\x27\x49\x46\xf4\xd1\xf3\x93\xb6\x60\x95\x3b\x99\xc6\x70\xfb\x67\x24\x6c\x9b\x25\xc9\xe5\xb4\x4d\xd5\x76\x71\x2a\x1b\xdc\xfc\x8a\xae\xe2\xef\xe0\x17\x13\x5f\x57\xb5\x79\x50\x6b\x56\x7c\x52\x11\x3\xd\x23\x7d\xa8\xd9\xe\x6e\x3c\x16\x38\x92\xce\x51\x34\xc7\x55\x18\xb7\xe8\x74\x82\xb2\xd3\x19\x20\x77\x5\xb8\xc8\xfd\xf9\x80\xf6\x1e\x4e\x84\x5a\x39\xb0" }, - { 0x53cae8, "\xa4\x6d\xc3\xfc\x24\xa5\xb7\x3f\x26\xc0\x2d\xe3\x49\x71\xe0\x36\xaa\x39\x6a\xb4\x21\x67\x9a\xfa\x23\xe5\xec\x12\x25\xd\x72\x87\x27\x7a\x5d\x60\x6f\x57\x78\x94\x44\x56\xde\xc9\x95\x97\x2f\x77\x9d\x53\x89\xfe\xff\x8b\x46\x2c\xcb\x61\x8\xdf\x79\xb6\x20\xc\x15\x3d\x4a\x2e\xb2\x7\x73\x3e\xcf\x6\x88\xf4\x37\x32\x19\x3a\xf6\xe9\x75\xac\xeb\x30\xf9\xbb\xa7\x84\x63\x5f\xa8\x1a\x91\xc8\x9c\x7f\xd6\xd5\xed\x3c\x98\xd8\xbc\xb1\xf\xfd\x9\x3\x99\x6b\x16\x8e\x59\x4e\x1f\x66\x82\x2\x8d\x96\x4b\x22\xc5\xa3\x50\x74\xdd\x2b\x5e\xa1\xda\xcd\x5b\x58\x9e\x28\x1d\xe8\x62\x47\xf1\x33\x35\xaf\x34\xef\x5a\xa2\xbd\xe\x81\x4\x5\xee\x7c\x51\x4f\xbe\xc4\x42\xb\xca\xd3\x70\x9f\xba\xd4\x8c\x10\xfb\x90\x14\x13\x1b\x3b\x11\xc1\xad\xb9\x64\x48\xd0\x31\x4d\x8a\xd2\x86\x38\x0\x92\xdb\xf5\x5c\x9b\xea\x17\xf8\x68\x83\x18\x4c\x52\x1e\x2a\xe6\xa\x69\xab\x6c\x6e\xf7\xd9\xc7\x41\xf3\xc2\xa6\x1c\x7d\xb3\xd7\xdc\xd1\x93\xe2\xce\x85\xbf\xb8\xe1\x76\x40\x54\xcc\x7b\x8f\xa9\x7e\xe4\xae\x55\x1\x80\xf0\x43\xc6\xb5\xf2\x65\x29\xb0\xa0\x45\xe7" }, - { 0x53cd28, "\xed\x8e\xda\x43\x63\x70\xc8\x69\xee\x7\x3b\xd6\xe9\x1c\x17\xc\x38\x97\xa3\xe1\xe\x6\x40\x96\x0\x7c\xbb\x39\x9\x2b\xd7\x78\x19\x59\x4\x44\xb9\xa7\x13\x68\x16\xcd\x8d\xa8\xc2\x54\xb5\x30\xac\x72\x5b\x12\x1b\x6b\x89\x6f\x99\xc6\xd3\x51\x76\x87\x91\x60\x27\xa0\x4d\x4f\x47\xf3\xd\xcc\x98\xaf\xf8\x6e\x9d\x9f\x7b\xfc\x36\x5e\x9c\xb8\xf5\x8b\xdf\x7f\xfa\xe4\x75\xcb\x9b\xf0\x77\x3\x41\x62\xb3\x11\x32\xa5\x2d\xa2\x6c\x3d\x86\xdb\x80\xba\x2a\x83\x90\xf2\x22\x24\xc5\xff\x5f\xb0\x15\x31\xbd\x1e\xcf\x57\x4e\xc7\xae\xf4\xe3\xb4\x4b\xce\x35\x3c\xb2\xa\x95\xfe\xa1\x5\xf9\xd1\x8a\xf6\xdd\x74\xa6\x2\x1\xe2\x52\xa4\x10\xb7\x93\xf7\xc4\x18\x28\xd4\x84\xa9\x9a\xc0\xe8\x8f\x53\x2f\x7a\x5c\x58\x26\x79\x42\x4a\x25\xad\x33\x67\xbe\x7d\x34\x1a\x46\x29\xde\x20\xd5\x3f\x1d\xd8\x3e\xe0\xb\xc1\x71\x14\x1f\x73\x6a\xfb\x61\x55\xab\x50\x85\xbc\xb6\x7e\x9e\xd9\xeb\x5d\xd0\xd2\x21\x64\xf1\xbf\xdc\x56\x45\x94\x65\x4c\xe5\x3a\xb1\x6d\xe6\x49\x8\x23\x88\xaa\xfd\xc9\x5a\x81\x37\x2e\xf\xef\x2c\xca\x92\xe7\x48\x82\x8c\xc3\xec\x66\xea" }, - { 0x547230, "\x31\x69\xdc\xcc\x61\xe2\xd4\xad\x9a\x51\xe5\xfa\x53\x6d\xfe\x6\x89\x79\x46\x99\x24\x7c\xa0\x18\x56\x27\x7f\x2e\x2a\x77\x0\xd8\xcd\xb6\x1e\x4b\x4e\xfc\x4\x23\xa4\x75\x8\x44\x19\x80\x7\xf3\x16\x5c\x9\x93\xb9\xdb\x92\x10\x30\xd0\x43\xd7\x85\xfb\xdd\xe\x49\x39\xca\x2\x64\x8a\x35\xa6\xee\x13\xe0\x91\x9b\xce\xc2\x12\x82\xab\x4d\x74\x22\xd\x70\xb2\x90\x98\x3\xec\xc7\xcb\x9c\x71\xba\xac\x50\x21\xf8\xc0\xda\x67\xa\x72\xfd\x2d\xc\xf6\xa7\x52\x65\xaf\xc3\xa3\xa1\xea\x5a\xd5\x17\xbe\x7e\xcf\x94\xb0\x34\xd1\x1b\x6e\xf0\x54\xf2\xe8\x76\xbc\xe4\x3f\xf4\x73\xe9\xae\x7b\x6c\x3a\xbb\x8f\xe7\x4a\xb1\xb\x7a\x68\x86\x11\x2f\xf1\x8d\x81\x47\x42\x2c\x7d\x8c\x95\x55\xf7\xc5\x84\x1d\x59\x41\xd6\xbf\x8b\x33\x9f\xe6\x38\x45\x87\x1\xc4\x1a\x78\x40\x3c\xbd\xe1\xb7\x1f\x26\x6a\x6b\xa8\x96\xf5\xa9\x60\x37\xed\xa2\x15\x58\x3d\x8e\x48\x3b\x9d\xb4\x5b\x29\x62\x4c\xc6\x83\x66\xb3\xb8\xde\x1c\x2b\x5e\x63\x57\xd2\x5f\x25\x36\x20\x28\xb5\xc1\x5d\xc9\xf9\x9e\xf\x88\xa5\x5\xef\xdf\x97\x4f\x14\xc8\xd3\xff\xd9\xeb\xe3\x32\xaa\x3e\x6f" }, - { 0x53ceb0, "\xbc\xb2\x5e\x24\x9d\xc6\x26\xc5\x91\x6c\x87\xb3\x70\x47\x6f\x5f\x1\xad\x7f\xa5\xea\x4\x7c\x31\x39\xdb\x15\x9e\xdd\x64\xb8\xf4\x9a\xd0\xe0\xf\xf0\xcd\xef\xd4\x23\xc0\x14\xcf\x79\x5b\xba\x48\x2f\x18\xc\x95\x55\x43\xab\x67\x99\xa3\xbd\xd9\x90\xec\xbf\x21\xff\xd2\xb6\x96\xf1\x5d\x6a\xe3\xd5\x4f\x7d\x8f\x46\xb1\x7e\x12\xb4\x6e\x97\x37\xa\x36\x94\xc8\x1f\x51\x8d\x60\x78\xaf\xfa\x9c\x2a\x40\x7b\x1d\xbb\xe9\x75\xe8\x5a\x3a\x11\xf5\x7\xed\x5\xc7\x9b\xf7\xb5\xb0\x1c\xd1\x4a\x83\xc4\x81\x7a\x92\xf2\x3b\x4e\xb9\x2\xde\xaa\xe\x1a\xcb\x5c\x44\xe1\xd6\x98\xa2\x4c\xee\xd7\x45\x9\x32\x20\x3e\x3d\xa7\x57\x58\x0\x73\xa6\x10\xfb\x6\x4b\xce\x74\x35\xfc\xae\x77\x89\xfe\x19\x53\xfd\x82\xc2\x85\x30\x50\x84\x8\xc3\x28\xf9\x22\x80\x65\x62\x13\xe4\xca\x34\x3f\xdc\x4d\xf3\x8a\x86\x8b\x69\xf8\xda\xa4\xc9\x61\xe7\x38\x6b\x54\x2b\x49\x29\xa0\xc1\x71\xd8\x2e\xa1\x1b\xd\xcc\x8e\x8c\xa8\x2d\x27\x42\x56\x16\x41\xf6\x72\xa9\xb\xe2\x68\x25\x63\x93\x1e\xb7\x9f\x59\xd3\xac\xe5\xdf\x2c\xe6\x88\x76\xeb\x3c\x52\x33\x17\x66\xbe\x3\x6d" }, - { 0x53d168, "\x3\x21\xa0\xee\x97\xa8\x35\x87\x9f\x6e\x88\xf0\xc1\x1a\x19\xbd\xd2\x17\x78\xb9\xd6\x29\xf4\x28\x40\xe6\x8d\x1c\x2f\xf6\x56\x14\xdd\xa5\x57\x48\x9a\xce\xb4\xff\x5a\x5\x3a\x9d\x7e\x6d\x96\x6c\x55\x3b\x38\x4b\x51\x1f\x60\x8\x1d\x70\x22\xae\xd3\x8f\x99\xc3\x83\xe0\xde\xea\x6\xf9\x9b\x5c\x52\x2a\x72\xb7\xc9\xdb\xfa\xd7\xdf\x68\xbc\xb6\x59\x98\x74\xb2\x27\x9\xf\x44\x6f\x91\x7d\xcc\x12\x4e\x2d\x42\x7a\xf7\x9c\x7c\xe4\xf8\x94\xad\x23\xef\x8a\xaf\xb8\xe2\x80\xb5\x86\x54\x47\x4a\x2\x3c\x5f\xf3\xec\x4d\xe7\x8b\xbf\xb0\x26\xc5\x67\x24\x3e\xca\xbb\xd8\x1b\x63\xc6\x82\x75\x69\x5e\xdc\x45\xac\x71\x30\x76\xa\x81\xda\x33\x32\xd5\xbe\xd\xfc\xf2\x3d\xa4\xf1\x73\xed\x43\xd4\xe5\x2e\xe9\xd0\xcb\x41\x37\x5d\x34\xd9\x77\x7b\x7f\xa3\x39\x6a\x61\x16\xcf\x1\x7\xfd\x58\x13\xa2\x20\xc7\xc2\x66\x2c\x50\xd1\x65\x79\xc8\xb1\x64\xb3\x90\x0\x5b\x11\x31\xe\x25\x6b\x89\xe1\x8c\x53\x10\xaa\xc\x4\x4f\xa1\xa7\xc4\x85\x92\x36\x46\x1e\x3f\xfb\x84\xe8\xc0\x8e\xa6\xa9\xcd\xf5\xba\xab\x62\x15\x18\x9e\xb\x4c\x2b\x49\xeb\x93\x95\xe3\xfe" }, - { 0x53d2d0, "\x43\x2f\x53\xa0\xc2\xfd\xcc\x6\x29\x3e\x1f\x44\xab\x65\x74\x54\x49\x27\xb7\xe2\x2c\x5a\x33\x34\x1e\x16\xa7\xae\xa\x92\x55\x20\xad\x98\xf8\xa9\xe\x8b\x32\xdf\xa5\x15\xfc\x9f\x23\x3c\xc4\xc0\x4c\xbe\x89\x9a\xf0\xe4\x73\x59\x30\x9e\x82\x58\x51\x8f\xbf\xa1\xc7\xeb\xf1\x64\x1b\x4b\xc8\xc3\x38\x31\xd2\xfe\x3d\xd0\x77\xcb\xd6\x24\xf7\xc\xe5\xff\xd8\x4d\xac\x10\xe6\x76\xbb\xf\x9c\x6c\x2e\xb\x75\x78\x5d\xa3\xaf\x17\x5e\xb0\xe1\xb1\x9b\xf9\x7\x39\x6d\x7b\x1c\x2a\x9\x3f\x12\x4\xc9\xc1\xc5\x19\x61\x5\xb4\x47\x37\x5f\xd5\x94\x28\x21\x88\x97\xfa\xd3\xcf\x7f\xdd\xd4\xf3\x68\xf4\x81\x62\x84\x91\x83\x8c\x7e\x67\x63\x66\xed\xe7\xe9\x85\x6f\xdb\xaa\x87\xec\xde\x90\xba\x25\xa2\xd\x6b\x5b\x7a\x96\x70\xe0\x86\xa8\xe8\x6a\x4e\x42\x57\x2b\xb6\x40\xce\x69\x46\xb5\x72\x80\xcd\x13\xf6\xf2\x0\xda\x93\x22\x60\x3b\x7c\xb2\x48\xef\x3\xb9\x71\x4f\xc6\x45\x36\x26\xfb\xf5\xca\x2\x6e\xd9\x8d\x95\x14\x2d\x8a\xd7\xdc\x52\xee\x99\xa4\xbc\xb8\x8e\x1a\x3a\x1d\x4a\x7d\x1\xe3\x56\xa6\x50\x35\x18\x8\x79\x5c\xbd\x41\xb3\xea\x9d\x11\xd1" }, - { 0x53d3d0, "\xf1\xbb\x4b\x7e\xc1\x8a\x41\x12\x97\x5e\x57\x56\x9f\x2c\x5f\xb6\x47\xff\xb1\x4c\x8b\x9c\x63\xc4\xa7\x98\xb2\x31\x84\xb4\xd\x1d\xe0\x67\xfd\x2\x13\x10\xdb\x8\x83\x48\xc6\x86\xaa\xe5\x80\x9\x38\xfc\xe2\x85\xc7\x8d\xa9\x3b\x18\xa5\xb7\x32\x9b\x6a\x2e\x87\xc0\x24\xa0\xfa\x6b\x76\xa2\xe6\x7f\x5d\x7b\x40\x33\xfb\x62\xf6\x43\xd1\x6d\xa1\x29\xd5\x17\x50\xf9\x1c\xeb\xf2\x22\xc2\x51\xe4\x26\xca\x5b\xf\xf8\x96\x4e\xba\xf3\x55\xa4\x37\x36\x82\x70\x99\x20\xc9\xf5\x7c\xa8\x92\x6\x72\xe7\xb5\x9d\x44\xd2\xbf\x64\x16\x49\x3\x4a\xe3\x68\xd0\x1a\x34\x95\x7d\xcb\xbc\xd3\x78\xd7\x5a\xb0\xb9\x2f\x27\x77\xf7\x45\x25\x52\x1b\x3c\x3d\x9e\x2b\x74\x89\xa\x1f\xfe\xf0\x2a\xe1\x1\x3a\x9a\x39\x8e\x79\x71\xd8\xcc\x46\xe8\x69\x3e\xaf\x7a\x21\xad\xea\x75\x93\x15\x30\xf4\xe9\xdd\xe\x60\x28\x6e\x88\xae\x81\x4\x59\xc5\x90\xee\x61\xcf\x8f\xb8\xb3\x54\xed\x58\x6c\x91\x3f\x65\x6f\xd6\xbe\x4d\xef\xde\xa6\x8c\xc\xc3\x23\x35\x5c\xac\xd4\xda\x5\xc8\x14\x94\xd9\x19\xcd\x4f\x2d\x0\xdf\xbd\x7\x42\xab\xdc\x73\xa3\xb\x66\x53\x1e\xce\x11\xec" }, - { 0x53d798, "\xcc\xbb\x69\x91\x5\x73\xbe\x41\xf4\x59\x24\xa5\xf6\x28\xc7\x7a\xc1\xd5\xd\x62\x40\xb1\x32\x16\x6d\x77\xdb\xee\x65\x95\xd7\x35\x2f\x64\x30\x7\xfa\x5a\xe3\x88\x93\x6a\xeb\x31\xde\xd4\xcb\x4f\x92\xc8\x11\xfb\xd0\x4e\x3a\xdc\x7e\x15\xf1\xb4\x61\x58\xad\x9e\xfe\xb9\x6\x4a\x0\x6f\x3\x7f\x8a\x20\x3d\x22\x78\xe1\xe9\xe6\x14\xbc\x75\xe4\xf8\x19\x5b\xc4\xb3\x7d\x76\x2d\x3c\x9d\x9b\xac\x8e\xb2\x3b\xb5\xa7\x47\x9f\xc3\x36\xdf\xf9\x90\x80\x43\xf5\xa4\xe\x4d\x33\xe0\xc\xdd\xb8\x2\x7c\x8b\xf0\x45\x46\xa9\x8c\xcf\x9a\xca\xce\x84\x83\x71\x48\x39\xba\xfc\x2a\xe2\x57\xc5\x98\x97\x60\xc6\xae\xc0\xd8\x37\x81\xaa\xb6\x2b\xea\x26\x21\x4b\x55\xe5\xd2\x85\xab\xb7\x34\xbf\xd9\x70\xcd\x53\x96\xc2\xef\x63\x13\x1e\xed\x12\xc9\x74\x42\x5e\x3e\x54\x9\xd3\x89\x6e\x72\x49\x2e\xd6\x1a\x9c\xa\xa8\x6c\xbd\x10\x86\x4\x38\x50\xf2\xb\x1f\x87\x2c\x29\x17\xfd\x52\x66\x67\xf\x8d\x1\xb0\x18\xda\xe8\x1d\x94\xa3\x25\x79\x3f\x8f\x51\xa2\x23\xf3\xaf\x68\x5d\xa1\xf7\x99\x1b\xff\xec\x56\x44\x8\xa6\x6b\xe7\x5c\xd1\x1c\xa0\x5f\x7b\x4c\x82\x27" }, - { 0x53d970, "\xb9\xd7\x6b\x9c\x5b\xfb\xc0\x9b\xf\x49\x55\xa9\x6d\xa5\x17\xd0\xc3\xdc\x4b\xb8\xf2\xb0\x93\xee\x3c\xeb\xdf\x8d\xe1\xf6\x2f\xe2\xc4\x32\x4c\x35\x62\xb4\x92\x91\x1c\x6f\xb6\x30\xe3\x5a\xb2\x2\x5e\x64\x21\xd5\x0\xcd\xd2\xb7\xd\x81\xef\x14\xb1\x87\xf0\x8f\x20\x39\xfc\x16\x63\x38\x1a\x7a\x56\xe4\xf3\x6e\xf4\xcb\x27\x57\x34\x2b\x12\x86\x79\x3f\x7\x6\x5d\xe\xbd\x7b\x54\x8e\xf1\xc8\x51\xf5\xbf\xd8\x5\x26\x47\x67\xda\x53\x95\x98\xea\xed\x5f\x74\x41\x3a\xc\x8c\xa6\x94\x59\xb3\x8b\x46\x6c\x7c\xbe\x9e\x7d\x83\x36\x88\x31\x7e\x18\xdb\x5c\x19\xe6\xe0\x58\x9d\x72\x13\x77\xdd\xc2\xac\x75\x96\x8\x73\xd4\xa\x2c\x22\xe5\x2d\xf8\x71\xaf\x45\x2e\xc6\x76\x3d\x65\xf9\x29\x4f\x80\xd1\xd3\xe9\x69\x9a\xab\x90\x1b\x1\x1e\xc7\x15\x24\xec\xcc\xe8\xad\x3b\x10\x4d\xcf\x85\xa1\xa7\x89\x25\x11\xd9\xc1\x1d\xae\x9\xde\x6a\x44\x4a\x3e\xbb\x48\xca\xe7\x70\x4\x9f\xa8\x68\x43\xb\x8a\x52\x42\x50\xba\xfa\xce\xd6\x33\x61\x60\xa0\xa3\xf7\x3\x1f\x84\xfd\xbc\x40\x7f\x66\xaa\xc5\xb5\xa4\x37\xfe\x97\x28\xff\x78\x23\x82\xc9\x2a\x4e\x99\xa2" }, - { 0x53da70, "\x46\x47\x9d\xa8\xcf\xa7\x62\xc7\x30\x42\x69\x3a\x34\x5a\xbe\xd5\x59\x63\x33\x21\x2c\xa0\x6\x1e\x31\xa6\x92\x3f\xc8\x57\x5e\xbf\xa9\x90\x19\xb0\x29\x7\x12\x1f\x23\x97\xe3\xa4\xdd\xb8\x3c\xb2\x5c\xce\xda\xd0\x52\x8\x64\xc3\xc0\x9a\xca\xea\x43\x6b\x41\x1c\x8c\x7a\x7b\xd1\x94\x5\xc\x93\x15\x51\xd9\xd4\x3e\x4c\x2f\x49\x4\xd2\xee\x73\x0\xa2\x8d\x6d\x55\x2\x3\xfe\xb\xc2\x1a\xe2\xf1\x83\x80\x36\x78\xf5\x96\x40\x75\xe\x9c\x7d\xad\x32\x5f\x2b\xc9\xbb\xf4\x7c\x66\xb7\x54\x8a\x89\xff\x50\xdc\x60\x25\xb3\x6a\xfb\xe4\x4d\xab\xb9\x74\xc5\xbc\xb6\xe8\xc6\xfd\x7f\x4a\x76\x3b\x9f\x45\x18\x4f\x9e\x95\x13\xb5\x10\xf8\x22\x5d\x1d\xdb\xbd\xb4\x6f\x84\xba\x17\xd\x6c\xaa\x44\xae\xf6\xde\x81\x11\x79\x85\x86\x39\x99\x82\x38\x6e\xa3\x26\x68\xeb\xc1\x27\xed\xcb\x2e\xdf\xf7\xef\xfa\xb1\x9\xd7\xd8\x8b\xac\x37\x4e\xe7\xf0\xe1\xd6\xa\xd3\xec\x61\x72\x5b\x28\xa1\x87\x70\xf3\x71\x98\x8e\x20\x53\x16\x3d\xa5\xf2\xf9\x4b\x9b\x91\x88\x2a\x65\xf\xfc\x67\xe6\x58\x2d\x14\x56\x48\x1\x7e\x35\xaf\xc4\xe9\x8f\xe0\x1b\xcc\x24\xe5\xcd\x77" }, - { 0x53dbd0, "\x77\x1f\x49\xca\xc3\x17\x39\x14\x66\xde\xc5\xd9\x2f\xf\x6e\xd3\x7d\x21\x60\xec\x9a\x4b\x25\xc2\x71\xfc\xb\x81\x8e\xbf\x36\x99\xf7\x6b\x7e\x86\x10\xdc\xa7\xb0\x8b\xb9\x72\x20\xf4\x5e\x31\x74\x6c\x4f\x80\x4\xb1\xc9\xb7\xd0\xab\x7b\xd\xf6\x1d\xbc\x38\x78\xaa\x43\x3f\xf0\x82\xcf\xcb\x96\xf5\xeb\xce\xb5\x12\x29\xc0\x62\x63\x9\xf1\x2\xc1\x44\x32\x2c\xe8\x4e\xe6\x57\x7a\x83\x95\xb8\xfb\x37\xd7\x2a\x3\x5d\xef\xc7\x11\xd6\xa2\xb2\x5c\x85\xa3\x5a\x19\xfe\x8a\xad\xd2\xbd\x28\x9b\x34\x6f\x3c\x67\xe1\xc\x24\x68\x97\xb4\xda\xe3\x98\x7c\x2b\xd5\xee\xe4\xcc\x47\xcd\xb3\xe7\xfd\x61\x42\x3d\x4d\x9c\x5\x9e\x4a\xdd\xa9\xdf\x6d\x45\x6a\xd8\xfa\x16\xae\x58\x1b\x76\xf9\xa0\xe5\xb6\x1a\x59\xa5\xba\x9f\x65\xbb\xa4\xe\xd1\xd4\x51\x41\x40\xc8\xe2\xdb\xaf\x94\x64\x7f\x22\x3b\xf2\x2d\xc4\x70\x2e\x5b\x69\xc6\x56\x33\x7\xa\x15\xea\x91\x53\x1\xf8\x84\xe0\x30\x90\x75\x87\x5f\x54\x6\x46\xe9\x35\x92\x50\x79\x88\x1e\x8d\x3e\x8f\x73\x0\x18\x89\x93\x9d\x8c\x27\x1c\xa6\xbe\x23\xf3\xed\x55\x52\xa8\x26\xff\x8\x13\xac\x4c\x48\x3a\xa1" }, - { 0x53dd70, "\x97\xd5\x40\x91\xed\xf1\xce\xf3\xc2\x6e\x94\x19\x5f\x5b\x7d\x9b\xc\x29\x5d\xda\x71\x7c\xab\x9d\xb4\x9e\x2d\x48\x2\xa8\x0\xbe\x7b\x86\xf\x38\x56\xee\xd3\x34\xa6\xbf\x7f\x1b\x8d\x53\xe8\xdb\x61\xa4\xe2\xe1\x2e\x78\x3d\xb6\x80\xd8\xe\xfa\x6d\xd1\xe7\x6\x4e\x14\x77\x54\xae\x5\xd4\xbc\x6a\x74\x3b\x1c\x8a\xc0\xb7\x45\x92\x26\x11\xd0\x99\x57\xaf\xb3\x95\x84\xfd\xc4\xa3\x22\xa7\x39\xbd\x41\x1e\x4f\x3e\x1a\x2b\x15\xba\x64\x1\x23\xa9\x37\x58\xd\x67\x76\x2c\x8e\xca\xc8\xdc\x65\x98\x90\xea\xad\x6f\xcc\xe5\x32\xbb\x28\x70\xf5\xa5\x12\xb9\xc6\x75\xf0\x3c\x4c\x6c\x85\x73\x88\xe6\x7\x72\x69\x82\x8b\x2f\xb2\xde\x10\x6b\xdd\xff\xb1\x43\xd6\x50\xcf\xd7\xb8\x4\x68\xe0\x93\x18\x79\xa\x9\xc5\xaa\x83\x7e\x16\xf4\xc3\xcb\x96\x87\xc7\xb\x49\x3a\x62\x3f\xb5\x31\x24\xa0\x8f\xf7\x13\x30\xe9\x51\x59\xa2\x4d\x47\x4a\xe3\x8c\x55\x81\xa1\x5c\x1d\xfc\x2a\xfe\xeb\xcd\xdf\x60\x25\x89\xef\x33\x7a\x20\x66\x27\xc1\xb0\x3\xf2\x9f\xf8\x1f\x9a\x5a\x9c\x5e\xf6\x35\x21\x52\xd9\x44\xe4\x4b\xc9\xec\xd2\x63\xf9\x36\x8\xac\x42\xfb\x17\x46" }, - { 0x53e0d0, "\xed\xb6\x90\x15\xcd\x25\x37\x67\xfc\xf3\xd9\x12\xb8\x36\x3\x5d\xe5\x44\x43\x20\x93\x47\xfb\x9b\xca\x3b\xd0\x9c\xbf\x34\x42\x3a\x68\x73\x76\x3c\xc1\x8e\xb1\x51\x31\x98\x19\x1b\xb\xfe\xeb\x3d\xe6\x82\xea\x2\x9f\x9e\xf2\x46\x87\xfd\xb2\x83\x1f\x9\x8b\x4f\x5e\xa8\x16\xd7\xad\x71\xd2\x64\x24\x66\xe4\x48\xa\x79\x4\x84\x49\x52\xda\x8\x58\x8d\xec\x0\x7b\xe1\x2b\xd3\xc7\x96\x38\x32\x74\x2f\x60\x7a\x7d\xac\x85\x99\xa5\xbb\xc0\xf4\x10\xd4\x61\x6f\xba\x26\xc5\x3f\x8c\xb0\xf7\xee\xe8\xb3\x11\xa6\x2d\x54\x30\x1d\x2e\xe0\x1e\x6b\xc\xce\xcb\x6c\x65\x39\x4e\x5f\xdd\xef\x41\xc9\xf8\xe7\xf6\x92\xd8\x4a\xdc\x53\x40\xbd\xa4\xb5\x22\x9a\xe\x5b\xb7\xde\x5c\x8f\x29\xaf\x8a\x56\xb9\x95\x94\x5\x27\x35\x5a\x78\x18\xae\xd5\xb4\x3e\xa9\x6e\xaa\xc4\x6\x80\xc8\xf5\x6d\x55\x33\x72\xa0\x1c\x89\xa1\xa7\x2a\x97\x4b\xcf\x4d\x6a\xf9\x9d\x28\xf\x14\xa2\xff\x7e\xd6\x81\x91\x7f\x23\xd\x57\x62\x4c\x17\xc2\xc6\xf0\x77\xf1\xa3\x21\x88\x7\xab\x69\x63\xe2\xd1\x50\xcc\xe9\xdb\xc3\x86\xbc\x59\xe3\xbe\xfa\x75\x1\x45\x13\x70\xdf\x1a\x7c\x2c" }, - { 0x540278, "\x6c\x9f\x49\x77\xa9\x27\x95\x66\xde\xf\x58\x2f\x4c\x1c\x4b\x73\x22\xcc\xfb\x1a\x85\xf6\x9c\x8b\xc5\xdd\xb0\x15\x46\x37\x79\x2\xab\x3d\x44\x8a\x10\x87\x9e\xfc\xba\xb9\x2b\xa\xf4\xd9\xbf\x78\xf1\xef\x11\xdc\x80\xd2\xd5\xf7\x5c\xbe\xe2\xd4\x9d\xd3\x13\x1\xe1\x18\x50\x53\x43\xd7\x64\xf8\xdb\xf2\x62\xcd\x99\xe7\xa2\x0\xaf\xbc\xff\x25\x91\x5f\x83\x60\xec\x42\xb6\x47\x8e\x6a\xd\x4f\x16\xe6\x51\x14\x8f\x5\xea\x70\x3a\xca\xc7\x74\xce\x5d\x98\x31\x3b\xe9\xe0\xc3\xa4\x1b\x92\xd0\xc\x40\x4d\xb5\x7f\x8\xf9\x39\xb1\x29\xc4\xd1\x21\xac\xc0\x54\x4\x55\xcb\x17\x69\xfe\xe5\x3e\x88\x1d\xe\x7c\x76\xb2\xc6\x24\x81\x9\xe4\x59\x34\x7a\x86\xf5\xad\x5e\x38\xbb\x4a\xe3\xc8\x26\x30\xbd\xfd\x33\x72\xb4\x20\x2a\x19\x6b\x97\x32\x96\x7b\xa1\xa6\xdf\x61\x71\x7\x23\xee\xc2\x75\xb7\xaa\x7e\x67\xa0\xa3\x94\xd8\xa5\x1e\x68\xda\xa7\x48\x8c\xf0\xb3\x4e\xfa\x9b\xb\x6f\x2d\x6d\x8d\xcf\x5b\xc9\xae\x9a\x3f\x6\x1f\x90\x65\x6e\xf3\x93\xa8\x45\x12\x2c\x52\x36\xeb\x82\x3c\x7d\x57\x28\x56\xed\xd6\x63\x2e\x3\x41\xc1\xb8\x5a\x89\x35\xe8\x84" }, - { 0x5406e8, "\xbb\x3b\x8c\x61\x95\x4d\x8e\x4c\xe1\xae\xff\xc4\x47\x64\xc9\xb7\xd3\xca\xb\xed\xef\xc0\xc7\x43\x1c\x66\xb9\xd9\xea\x2f\xa0\xfb\xcc\xfa\x50\xd\x55\x46\x96\x24\x21\x70\xe0\x6\x33\xf3\x0\xd5\x67\x1a\x13\xde\xa5\x7c\x74\xfe\x1f\xaa\x73\xc3\x15\x93\x9f\xd7\x2b\x14\xcb\x7b\xb8\xe4\x91\xf0\xaf\x9\x23\x4f\x5e\x6d\xe\x89\xc5\x30\x77\x68\x1\xfc\xe3\xf4\xa8\x9e\xc2\xcd\xe6\x71\x44\x2c\x3\xc1\xa9\x62\x9b\xee\xbf\x2e\x65\x12\xb2\x25\x8f\x5a\x31\xe2\xf6\x7\xd6\x48\xad\xeb\xcf\x19\xd0\xbc\x29\x92\x16\xba\x9d\x3c\x9c\x94\x3a\x80\x2\xa4\x7f\x11\x1d\x63\xe7\x6c\x40\x86\x76\xf9\x83\x54\xa3\x84\x72\x18\x4b\xf7\x7a\xf1\x4a\xd2\xfd\xec\x2d\x8a\x3d\x7e\x78\xda\x42\x3e\x27\xdd\x5c\x69\xc6\xe9\xf8\xa1\x98\x36\x35\x60\x51\x85\x88\x53\xac\x10\xd4\x4\xdc\x6a\x7d\x9a\xb0\xa6\xc\xe5\x56\x32\x6b\xa2\xe8\x57\x38\x20\xce\x5b\x8d\xf2\x81\x22\x1b\x3f\x87\xbd\xa\x17\xb5\x34\xc8\x1e\x8b\x5\x8\xb1\x75\x59\xf5\x45\x79\x49\x5f\x41\x37\x28\xd1\x39\xab\x26\xa7\xb4\xf\xdf\xb6\xdb\xb3\x4e\x2a\x58\x52\xd8\x82\x90\x5d\x99\xbe\x6f\x97\x6e" }, - { 0x5409e8, "\x2e\x94\x26\x55\x6c\xd6\xe3\x30\x16\x24\xae\xb8\x39\x13\x48\x85\x2\xa\xa8\xb9\xfb\x58\x3e\x59\x40\x37\x89\x4c\x68\xc9\x5b\xdb\xee\x83\xb\x64\x49\xf0\x52\xeb\x3f\x65\xbc\xfa\xa4\x6\x76\x27\xec\xc2\xe0\x53\x2a\x3c\x2b\xa2\x3d\x12\xde\xc7\xfc\xd7\x5\xed\xff\xc0\x9d\x14\x4a\xf7\xa3\x87\x79\x96\xa6\x7e\xd3\x1b\xf5\x90\x3\x80\x19\x4f\x77\x2f\xb1\x84\x7a\xe\x8e\xef\x62\xcd\xce\x9a\xd8\xb2\x69\xc4\xb0\xda\x23\x8\x11\xa0\x6b\x73\x4d\x9\x4e\x8c\x17\x21\x67\xbb\xd5\xcc\x20\x36\xea\x95\xe1\x5c\xe2\x7d\xe7\xc\x33\x5f\x99\xa5\xf4\x44\xdd\x25\xc1\x35\x29\x1a\x1c\x28\xb4\x9c\x34\x6f\x15\xa7\xf9\xe6\xb5\xd4\xe9\x9b\x1\x31\xf8\x72\xb3\x2d\x70\xdc\xfd\x46\x1f\x42\x8f\xcb\x54\x63\x93\x8d\x41\x5e\x9f\xe8\xf1\xe4\xb6\x71\x18\xbd\x6e\x7f\x81\x32\xd0\x74\xfe\x0\xcf\x47\xc6\xaf\x82\x38\x91\xac\xad\xc3\xb7\x6d\x1d\x8a\x98\xca\x97\x1e\x60\x7b\x88\xaa\xd2\xd1\xa1\x86\x61\xba\xc8\x10\x22\x3a\x9e\x51\x43\x92\x75\x3b\x56\xf2\x45\xa9\xbe\xd9\x78\x5d\x5a\x4\x4b\xd\x66\xf3\x7\x57\x7c\x2c\xe5\x50\xc5\xbf\xf\x6a\xf6\xdf\x8b\xab" }, - { 0x540d18, "\x7a\x2e\x7c\x16\x54\x74\xa6\xd7\x3d\x42\x25\xa\x4c\x87\xff\xbd\xc6\xcf\xaa\x78\x0\x95\x91\x68\x50\x7e\x4\xbe\xf\x83\xc7\x82\x9a\xa1\x36\xe2\x9b\x43\x62\x79\xe4\x73\x93\x56\x17\xb5\x60\xf9\xf0\xd\x2\xef\xbb\x22\x1c\xfb\x28\x94\x1e\xdc\x1d\x2a\x7\x72\xa0\x2f\x40\xed\x6c\x7b\xcc\xb4\xbc\xeb\xf4\xa3\x96\x7d\xb8\xf6\x75\x9\xc5\xf2\x70\x33\xc2\x13\xf7\xdb\x97\x1b\x6f\x3\xe3\x6\x44\xc1\xd3\x2b\x4d\xe9\xb9\xe1\x64\x20\x8d\x18\x76\x9d\xda\x67\xa7\x9c\x32\xb\x6a\x99\xf1\x41\x59\x71\x23\x14\x88\xac\x49\x37\xba\xe6\xe0\x51\x4f\xfd\x8e\xe7\xd5\xcd\xd6\xb2\x58\xa8\x55\xa2\xc3\xdf\x5e\x9e\xc9\xd2\xd8\x7f\x84\x39\xb6\xab\x63\x9f\xfa\x69\xfe\x21\xb0\x3a\x1f\x34\x5c\x4a\xbf\xe8\x52\x8a\x4e\x30\x5b\x92\x46\x4b\x8b\x5f\x8f\x90\x6e\x61\x89\x3e\xd9\x27\xaf\xee\x26\x98\xb1\xde\x19\xca\xf3\x86\x53\xa4\xd0\xad\x1a\x47\x80\x85\x45\x2d\xc8\xe\xa9\x3b\x65\xb7\x8\x24\xb3\xc\x11\x35\x15\xdd\x5\xce\x5a\xea\x2c\x6b\xec\xe5\xf8\x3c\x77\xcb\x6d\xc0\xd4\xae\x81\x57\x31\x12\x10\xfc\x3f\x1\x29\xd1\x38\x8c\x5d\xf5\xc4\xa5\x66\x48" }, - { 0x541218, "\x6e\x60\xba\x8c\x16\x67\xc7\xd9\xa1\xf9\x25\x41\x77\x6\x4b\x81\x98\xfb\x39\xe0\x7d\xa0\x10\xa4\x31\xf\xe5\x2b\x2d\xea\x68\xdf\x3d\xc8\xd5\x62\xaf\x83\xbd\xdb\x18\x88\xc4\xa9\x14\x38\x7f\x95\x5b\x51\xeb\x8e\xc\x2\xd0\x1\x6a\xcf\x92\x20\x7e\xc2\xc5\x36\xa6\xcd\x89\x64\x22\x8a\x96\xff\x49\xad\xb0\xc1\x13\x32\xa2\x99\x59\x17\xa5\x56\x29\x3b\x84\x93\x33\x5\x1c\x26\x94\xe8\x5d\xb8\x4\x5c\x4d\x46\xe9\x80\x4c\x45\x85\x9c\xb6\x11\xb1\xdd\x9b\x78\x9e\x8d\xac\xe2\x73\xbf\x82\xd2\x97\x57\x12\x63\xa8\x1a\xf2\xbc\x0\xc3\xcb\x7c\xf3\xe4\xdc\xd1\xed\xce\xd4\x6d\x15\x44\x8b\x52\x75\xd8\x7\x48\xfe\xe\xf6\x1f\xe3\x6c\x4e\x40\x4a\x91\x61\x70\xae\xe6\x19\xcc\x66\x1e\xa7\xd3\x43\xda\xde\x2a\xb4\x3e\x3a\xca\x9a\x5e\x71\xd\x34\xef\xb5\xb\x55\xbb\xee\x35\x50\x69\x4f\x9\x7b\x1d\x47\x86\x53\xb3\xbe\x79\xa3\xb9\x24\x8f\xe1\x1b\x58\xa\xd7\x2f\xfc\x8\x72\xf5\xe7\x7a\x5a\x54\xb7\x87\xfd\xf0\xc0\xc9\x30\x27\x3\xf1\xd6\x74\x3f\x90\xf7\x37\xf8\x28\x9f\x42\x6b\xab\x76\x23\x65\x6f\x2e\xb2\x21\xc6\x3c\x2c\xfa\xf4\x9d\x5f\xec\xaa" }, - { 0x547d98, "\x84\xf6\x55\x2c\x2b\xb\x30\xb6\xd7\x91\x7b\xea\xfc\x8b\xb9\x6d\x11\x2a\x4a\xba\xc5\xfb\x8\x5c\xda\x3\x9f\x52\x8e\x81\xc4\xb3\xa5\x38\xf1\xc7\xca\xd9\xfe\x58\xcd\x42\x1a\xd8\xbd\x9a\xa4\x45\x36\x4f\x4e\x43\x9c\xe0\x9d\xd2\xd4\x19\x98\x26\xdd\x5d\xa8\x28\xfd\xc2\x31\xa0\xed\xbe\x1d\xd6\x68\x3a\x9\x12\xcc\x48\xa6\x95\x66\x6a\x92\xbb\xbc\xaf\xaa\x93\x53\x2d\xb0\xf2\xd\xd1\xcb\x2\x76\xb4\x5\x4c\x85\xde\x51\xe1\x54\x47\x8f\x70\xf5\xb1\x96\x18\x78\xfa\x39\x62\x88\x6e\x9b\x59\x8d\x8c\x87\x1\xf\x4d\x6\xa7\xe3\xb7\x77\xb2\xf0\x1b\x7a\x83\x50\x1f\x8a\xe8\x5f\xae\x4b\xeb\x13\xe5\xdf\x7\x41\x63\xf4\xc3\x64\x32\x21\x29\x94\xa9\x16\x6b\xa\x3b\xd3\x69\x5a\xa2\xff\x72\xef\x89\x2e\x7c\x82\xab\x49\x22\x61\x34\xdb\x7d\x5b\x5e\x65\x6c\xdc\xf7\x2f\x10\x3f\x60\xac\xc\xf3\xbf\x46\x86\x44\x99\xf9\xc8\x35\xec\xd5\x1e\x6f\x15\x4\x97\xc6\x25\x90\x1c\x80\x75\x3d\xa1\x33\x0\xd0\x7e\xb5\xe\x57\xe7\x67\x23\x17\x74\x27\x7f\xce\x3c\xad\xee\x3e\x37\x24\xe9\x71\x20\xe6\xe4\x9e\xa3\x73\xf8\xe2\x14\xc1\x56\x79\xcf\xb8\xc0\xc9\x40" }, - { 0x547f10, "\x5\x3d\xbf\x26\xdf\xc3\xc0\xfd\xa2\xb\xee\x82\xad\xbd\x48\x1f\x66\x2c\x57\x13\x3e\x5c\x50\xe7\x29\xb7\x62\x32\x85\xe3\x9c\xf0\x69\xa6\x65\x92\x84\x9f\x54\xec\xa0\x15\xf9\x0\x78\xf7\xe1\xb5\xb8\xf2\x7f\xae\xf5\x44\xb2\xd6\xcb\xc\x8e\x7d\x4\xb1\x36\x24\xe\xa\x16\x43\xfe\x77\xb9\x63\xc5\x49\x3f\x71\xf6\x64\xc6\x87\xd0\x1c\xa1\x7e\x7c\x23\xd8\x67\x9b\x59\x53\xf3\xa5\xce\x7a\xb0\x68\x3a\xd9\xe9\x8a\xcc\x80\x45\xe4\x6\x4e\x2f\xd5\x6c\xea\x19\x9e\x97\xe2\x8d\x60\x37\x8b\xd4\xdd\x81\x5b\xa4\x8\xf1\x2d\x4d\x6a\xfa\xe0\x75\xa9\xe6\xd3\x76\x31\x86\xc1\xa8\x46\x72\x58\x38\x2a\x96\x73\xc4\xc7\x51\x9d\x30\xd2\x88\x27\xc8\x95\x52\x1d\x21\x94\x5e\x1\x56\x3b\x9\xdc\xa7\x79\x3\x7b\x39\x28\x6e\x1e\xc2\x2b\x70\x99\x6f\xff\x17\x18\xda\xaf\x2e\xb3\xba\x42\x5a\x55\x10\xd7\xe8\x47\xfb\x83\x8c\x5d\x6b\x3c\xab\xeb\xef\x25\x5f\x22\xb6\x33\x9a\xcd\x2\xb4\x91\x7\xd\xf\xdb\x1a\x61\x12\xbc\xcf\x34\xbb\x6d\x20\x4c\x11\x4a\xaa\xfc\x41\xe5\x1b\x74\xde\xbe\x4b\x40\x90\x98\xf8\x4f\x14\xca\xf4\xac\x93\x35\x8f\xc9\x89\xd1\xed\xa3" }, - { 0x5387b0, "\x78\x56\x88\x23\x55\xb3\xa8\xaf\x59\xea\x6\x1f\x73\x25\xb0\xe1\x70\x4d\x82\x58\x26\xe7\x40\x1a\x6c\xc1\x48\xb1\xf0\xba\xff\x0\xab\x2d\xa6\x22\x43\xee\x19\x8c\xe\xda\x17\x53\x85\xbd\x1d\x6b\xf8\x50\xce\x76\x4\xdd\xa7\xf1\x8e\x52\x37\xa2\x51\xe3\x69\x3a\x1c\x16\x68\x4a\x86\xbb\xb6\x6f\xdc\xfe\x14\xc\x79\x5e\xf4\x96\x42\x54\x2e\x84\x5f\xb5\xbf\xcf\x61\x7d\xd7\x98\x71\x3e\xcd\x20\x3f\xd0\xae\xa9\xd\xc7\x8\x65\x8d\x3c\x81\x29\xb8\x6d\xb4\x80\xd1\x4b\x5b\x28\xa5\x4c\xa0\x6e\x90\xa\x11\x3\x64\x21\xdf\x2f\x24\xeb\xf2\x7b\xc5\xac\xb\xec\xed\x66\xd6\xe0\x9\x41\x32\xcb\x83\x93\xfa\x15\xe5\x27\x5a\x87\x44\xd4\xde\xf\x3b\x1\xb7\x2a\xf3\xa1\xd5\x72\xb2\x6a\x2b\x95\x7a\x8b\xca\x7e\x18\x7f\x47\xe6\xdb\x49\xf7\x9a\x9e\xad\x9d\x57\xf6\x60\xd2\xfc\x30\xfb\x9b\x45\xd9\x2c\xf5\x5d\x33\x1b\xc4\x89\x13\x35\x67\xef\x2\x36\x92\x99\x39\xf9\xaa\x74\xe2\x5c\x3d\xc3\x63\xcc\xc9\x62\xa4\xfd\x34\x12\xbe\xc0\xc8\xc2\x7\x10\x75\x31\xe8\xbc\xd8\x97\x4f\x46\x1e\x7c\x38\x4e\x94\x9f\xc6\x8f\xe9\x91\xe4\x8a\xa3\xb9\x9c\x5\x77\xd3" }, - { 0x539420, "\xbb\x1a\x8e\x40\x7\x47\x3e\x6e\xb1\xfa\xa5\x63\x7c\xec\xa9\x75\x55\x76\xd2\xa6\xcb\xe4\x2d\xc6\x43\xa8\x18\x79\x48\xf0\x38\xd0\x9a\x8\xd5\xa0\x22\x7b\xc1\x84\x5a\x6b\xae\xd7\xbe\xb9\x50\xcf\x46\x70\x91\xed\xba\x8f\x7f\x1\xc5\x7d\x34\xf4\x14\x2\xe3\x2f\x64\x96\xb2\xee\x94\x4e\x90\x20\xd9\x95\x30\xca\x65\xf\xb\xd4\xd6\xde\xeb\x2a\x62\xd8\xc7\xdd\xe8\xe2\x4c\xbc\x77\x81\x66\x24\xc9\xb7\x60\x12\x39\xda\x71\xf1\x4d\x6c\xa\xf9\xb5\x6\x52\x3b\xa3\xb3\x7a\x35\x13\xe5\x57\x33\xc0\x16\x17\xfb\x87\xe7\xa1\x42\xe1\x67\x44\x54\x3d\xa4\x9\x19\x61\x15\x29\xb0\x0\xbf\xac\x5d\x1e\x27\x99\x56\x26\x83\x11\x5f\x69\x4f\x1d\xf5\x5\x8c\xff\x2b\x1c\x59\x21\xaf\xa2\xe\xdc\xb8\x85\x78\x80\x6a\x5c\x4\xfd\x25\x6d\x32\x9c\x8a\xc2\x8b\xf3\x9f\xb4\xd\x74\x9b\x8d\x97\x4a\xc3\x9d\x7e\xad\x28\x1b\x98\x53\xaa\x36\xf2\x49\xc8\xce\x73\xf8\xfc\x68\xef\xe6\x89\x3a\xea\x37\x31\xcd\xe0\x86\x3f\xb6\xab\xdf\x58\x23\x41\x3c\x88\x1f\xbd\x2e\xe9\xc4\x82\x72\xcc\x6f\xf6\xd3\x4b\xa7\x93\x5e\xfe\xf7\x51\x45\xd1\x10\x2c\x92\x5b\x9e\xdb\x3\xc" }, - { 0x547c10, "\xb4\x8f\x68\x29\x2d\x91\x41\x34\x56\x3a\x46\xf8\xcf\x63\xb8\xb2\x1d\xcc\xb5\x5f\xe0\x83\xd0\x66\x28\x60\xa0\x20\x88\x3\x9b\x4\x36\x55\x1f\x6d\x24\x62\x7b\x99\x53\xf2\x86\x4b\xff\x3b\xe9\xce\x92\xa5\x71\x5a\x7\xd2\x4a\xdb\xa2\x9d\xf4\xfc\xc9\x90\xac\x72\x77\x1\xb9\x2a\xf1\xd4\xfa\xc2\x61\xc0\xcb\xf5\x6b\x18\x67\xc6\x0\x9\x58\xfb\xba\x3c\x1c\x49\xae\xe6\x38\x40\x80\x97\xdd\x14\xf\x69\x89\x4c\x59\x16\x9a\x2e\x4f\x4e\x5\x33\x3d\xa6\xb6\x6a\x13\x30\xca\xeb\x25\x65\xd7\x57\xa9\x6c\xb1\xde\xd5\xcd\xed\x7c\x15\xbc\x19\xa4\x85\xc1\xa1\x73\xef\xbe\xc5\x35\xe\x7e\x47\x8\x64\xf6\x3f\x8a\xf7\x52\x75\xe5\x48\x37\x23\x8c\xdf\xa7\xd3\xe1\x2\xd\xa8\xe4\x74\x5d\xc4\xad\xf3\xbb\x54\x70\xbf\xdc\x1a\xec\xc3\x31\x1b\xa\x7d\x93\xb7\x9e\x2c\xd1\xfd\xe3\x3e\x96\xd9\x51\x12\xe7\xd8\x50\xb\xe8\xe2\x17\x4d\x5e\xd6\x39\xc7\x5b\x6e\x21\x84\x22\x11\x82\xf9\x26\x1e\x6f\x95\x6\xea\x10\x98\x2f\x78\x5c\x32\x45\xaf\x8d\xf0\x7a\xbd\xaa\x81\xda\xb3\xc\xfe\xc8\x2b\x76\x79\x8b\x94\xb0\xa3\x7f\xee\x42\x87\xab\x27\x9c\x44\x43\x8e\x9f" }, - { 0x541400, "\x7b\x35\x11\x79\x7\x2f\xf6\x82\x8e\xb4\x6e\xd2\x6d\xc5\x8c\x1c\xe0\xd6\x34\xf0\x4f\x25\x59\xe8\xdf\x1d\xeb\x32\x86\x51\xa4\xf2\x5c\xd1\xc8\x41\xec\x9d\x62\xac\xdd\x3e\xb8\x65\x75\x89\x12\x6c\x40\x4e\xc7\x27\xe1\x37\xcf\x9\x16\x78\xaa\x58\xd\xe6\x54\xfe\x8f\xfd\xf9\x61\x26\x3f\x2e\xcd\x2c\x4\xb2\x80\xf\x14\x6f\xc6\xab\xfb\x13\xdb\x9a\x21\xb3\xc0\xa9\x19\x70\xf3\x2b\xae\x9b\x49\xb7\xa8\x24\x1b\x48\xea\xed\xd9\x47\x9e\x9c\x69\x3c\x66\xbb\x6\x46\x38\x17\xb5\xcb\x5\x4a\x5e\x15\x20\xb9\xb6\x33\x4c\x7d\xa3\xd7\xb1\x23\x72\xc3\x4b\x63\xbe\xf7\x5b\x74\x64\x77\xcc\xd3\x85\xde\x1a\x31\x97\xa2\x8b\xfc\x10\x5f\xdc\xd5\xb0\xbd\x55\xc1\xe7\xc\x50\x43\x39\x71\x52\xe5\xaf\x8a\x60\x92\x2d\xd8\x3\xf5\x28\xca\xef\xd0\xc2\x53\x91\xa6\x73\x56\xa5\xf1\x57\x42\xf4\xd4\x36\x8d\xbc\xe9\x7e\x2\x76\x18\xb\x84\x5a\xe2\xbf\x68\x95\x29\x98\xad\x88\x1f\x81\x67\xa1\x3a\xa7\x22\xf8\x1\xa0\xce\x7a\xda\x30\xc4\xe4\xee\x7c\x3b\x4d\x3d\xe3\xfa\x6a\x7f\x99\x0\x93\xe\xff\x90\xa\x2a\x5d\x96\x8\x6b\x83\xba\x1e\x44\x87\x45\x9f\xc9\x94" }, - { 0x541588, "\x11\x2b\xc0\x60\xd2\xf5\x1f\x42\xf7\x8e\x13\x8c\x68\x7b\x90\x26\xd1\x28\xa3\x9d\xd\xb6\x9a\x1b\xb5\xa0\xba\x7d\xa8\xd5\xe\x88\x93\xa6\xbe\x98\xd6\xe4\x50\xa1\x3e\xb7\x8d\x94\x46\x4a\xbc\xd7\xd4\xf1\x59\x97\x2a\x66\x2\xe1\x3d\xf\x1e\xe5\xc5\x49\xe9\xa4\x99\x6f\x6\x37\x96\xdb\x58\xd0\xfe\x2c\xe8\x21\x38\x71\x62\xb4\xda\x12\xac\x79\x17\x5b\xc8\x82\xeb\xf0\xe2\x3\x80\xaa\x9e\xb\xe3\x5a\xc1\x91\x35\x75\xea\xfa\x20\xdd\x23\x84\x31\x9b\x5d\x78\x7a\xc\x27\xa7\xf3\xa2\xa9\x87\x52\xb8\xf9\x5e\x9\x6e\x64\xc9\x18\xd8\xee\x86\x2f\x30\x7f\xb2\x3a\x47\xb3\x74\xde\xe7\x4b\x2e\x41\x29\x5\x33\x15\xfd\x7e\x22\xf6\x70\xbb\x67\x34\xf4\xab\x92\x1a\xe6\xa5\x7\x65\x3f\x39\x95\xef\xb1\x24\x85\xfc\x53\xf2\x1c\x8f\x81\x48\x5f\x25\x76\xdc\x19\x56\xcd\x2d\xff\x43\xbf\x4e\xb0\x1\x0\x9f\x51\xc7\x57\xad\x73\x72\xc4\x8\xbd\xa\x7c\x1d\x40\x77\x61\xb9\x89\x9c\x3b\x8a\x16\xc6\xcb\xce\x4f\x63\xd9\x6d\xcf\x3c\x6b\x54\xdf\x4c\x10\x8b\x69\x32\xe0\x45\xaf\x4d\x83\x5c\xec\xc3\x14\xf8\xed\xc2\x6c\xca\x55\x44\x6a\xcc\xfb\x36\xae\x4\xd3" }, - { 0x541688, "\x6b\x1d\x53\x81\xa\x82\x7\x16\x41\x54\xa0\xbd\x87\x3\x20\x2d\xf7\xb5\x4\x59\x1b\xdf\x8c\x22\xe2\x10\x9\x55\x9e\xef\xa6\x57\x65\x7f\x3a\x35\x9c\x3e\xfe\x40\xfd\x17\xc0\x26\x33\x38\x7b\x6a\x5c\xd1\x50\x14\xec\x49\xfb\xa9\xe5\x1e\xf3\xea\xde\xdd\x44\x75\x46\xc9\x2b\xcb\xbb\x27\xab\x15\xe7\xed\x91\xda\x25\x4e\x5b\xb7\xee\x77\x58\xb8\xe4\x48\x63\x47\xd9\x0\xb0\xfa\xe1\xff\xb3\x72\x32\x3f\x29\x19\x68\x1\x23\xcc\x93\x8d\xd3\x31\xf9\xcf\xf6\x73\x8a\x4f\x11\xe6\xca\xa8\x18\x97\xc2\xd\x92\x62\x84\x85\x3b\x52\x6f\x9b\x6e\x5f\xe3\x9a\xce\xdb\x3d\x70\x95\xb\xdc\xc1\x2\xae\xc5\x56\x7e\x8b\x2a\xf5\x86\x28\xe0\xf1\x42\x83\xd5\xc8\xc7\x8\x4a\x5e\xf\xf8\x78\x5a\x1a\x66\x36\xfc\xd7\x34\x2c\xc3\x76\xbf\xe8\x21\x8e\x2f\x69\x7d\xa3\x98\x67\xa4\x8f\xe\xf2\xaf\x61\x4d\x24\xba\xaa\x7a\x6d\x5\xb9\x89\xbc\x2e\x30\x4b\xb4\x6c\x80\x1c\x9d\xc6\x3c\xb1\xd0\x88\xb6\xa1\xcd\xb2\xc\xbe\x79\xa2\xd8\x99\x4c\xd2\x74\x37\x51\x71\x9f\x13\x6\x90\xeb\xc4\xa7\xf0\xa5\xd6\x12\x45\xac\x64\xf4\x1f\xe9\x43\x96\x7c\x5d\x39\xd4\xad\x60\x94" }, - { 0x541988, "\x4b\x8e\xb4\x43\x5a\xcc\x15\xc0\xa0\x22\x21\x58\xec\xad\xde\x42\x4a\x70\xd4\x26\xc6\xeb\x3a\x61\xbd\x99\x20\x92\xfe\x9d\x68\xae\x1f\x11\x5c\xcb\x8\x66\x49\xe1\x2e\x96\xf2\xca\xdd\xb0\x37\xfd\x86\xa1\x7d\x7b\xbe\xf5\xd9\x60\x6d\x63\xe0\xe8\x84\xf8\x75\x44\x6b\xab\x81\xe5\xa5\xe4\xd6\x3e\x10\x3\x97\xd8\xbc\x5\x98\x1a\xa\xd\x5d\xf1\x8a\x2c\x82\x34\xc8\x4e\x2b\xfa\x7\x4c\x2d\x6c\xc1\x5e\x46\x29\x9a\xc7\xb8\xb9\x56\xa2\x7f\x1d\x3d\x1e\x9c\x80\x6e\xb5\xe\x7a\xcf\xfc\x30\xd5\x95\xa3\xb2\x1b\xf4\xe2\x89\x28\x12\xc5\x3f\xf9\x2f\xc9\x4d\xed\x40\x1\x59\xb6\x85\x50\x77\xe7\xf7\x2a\x76\x51\x78\xc2\x8f\x94\x87\xe6\x8b\x9\x93\x8d\x57\xda\x79\x2\x71\x55\x19\xb3\x5f\x69\xdc\x25\x18\xd2\xf3\x4f\xba\xea\x9e\xaf\x31\xee\xa9\x0\x35\x90\xff\x6\x1c\x4\x13\xce\x14\x39\x5b\xdb\x38\x36\x24\x27\xfb\xac\x52\xd0\x6a\x74\xf0\x62\x45\x72\xbf\x65\x9b\x91\x48\xd1\xb\x32\xb7\xdf\x88\xf6\x41\xa6\x9f\xd3\xc\x7e\x6f\xaa\x73\xd7\xc4\xa4\xe9\x17\xcd\xb1\x3b\x64\x8c\xf\xef\x54\x83\x7c\xa8\x23\xe3\x16\xc3\x47\x3c\xa7\x33\x67\x53\xbb" }, - { 0x541b30, "\xc9\x4d\x8e\xe5\xaf\x88\xa5\x73\xeb\x9e\x4e\xdc\x6b\x68\x28\x79\x7b\xad\x2c\xe\x51\xe1\xc6\x1f\x71\xb2\x61\x7\x42\x49\x35\x1a\xf2\x80\xd2\xd7\x82\xc3\x2b\xa2\xb6\x8b\xec\xa0\x2a\x29\xe7\x8a\x1c\x4b\xdf\xf7\xba\xb1\xdb\xee\x43\x7e\x87\xa7\xfa\x19\xb5\xf1\x95\x4f\xce\x66\xd9\xae\x11\x46\xa\xb8\x40\xf6\xe3\xbc\x77\xf8\xb3\x78\xf3\x5a\xac\xb0\x63\x8d\xcd\x64\x39\xa1\xa4\x9a\x4a\x69\x41\xed\x98\x37\xfb\x3f\xd0\xaa\x6\x7c\x7d\x3d\x94\xa6\x5f\x24\x12\x8\x9d\x32\xc4\x3b\xda\xa3\x10\x34\x8c\xd8\x5c\xcb\x20\x5b\x70\x86\x14\x27\x36\x1\xe9\x3\xc5\xa9\x67\xfd\x9b\x57\x6c\x0\x2e\x4\x84\xf\x26\x72\x92\x58\x17\x83\x2d\xdd\x6f\x62\xc7\xc\x55\x6d\xd5\x13\x3c\x5d\xb4\x5e\xea\x47\xc8\x25\xca\x59\xe0\x97\x21\x9c\x96\x93\x2f\x1e\x8f\x7a\xbf\xcc\xde\xf9\x16\x22\xf0\x81\x75\x3e\xd\x4c\xfe\x23\xbe\xa8\x76\x1b\xf5\x56\x18\x2\xe2\x33\xd3\xf4\xab\xb9\x6e\xc0\xff\xb\x1d\x60\x85\x30\x3a\xe6\x65\xd1\x52\x53\x54\xb7\x9f\x48\x89\xc2\x15\x74\xcf\x9\xc1\x38\x7f\x44\x99\xbb\x45\x31\x90\xd4\x5\xbd\x91\xfc\xef\x50\xe8\x6a\xd6\xe4" }, - { 0x541c30, "\x76\xad\x9\x82\xbd\xb\x69\x6a\xe0\xac\xd4\x34\x31\xd2\x83\xe2\xe7\x28\x70\xe8\xc1\xdf\xa\x2d\xbe\xd5\xe9\xe3\xfb\x79\x7c\xff\xf0\xe6\x85\x43\x47\xb2\x64\x92\x81\x80\xb4\x6d\xf7\xee\x1\x1f\x60\x48\x8e\xa4\x54\x74\x50\x4a\x2a\x5e\x39\x5f\x8f\x46\xb1\x8\x12\xf3\xde\xbf\xcb\x2\xdd\xa2\x9e\xd6\x6f\x9a\x9c\x3d\x93\x77\x2f\x21\xf1\x19\x9f\xcd\x2c\xeb\x30\x13\x89\x88\xa1\x71\x17\x7\x73\x32\x16\xc6\x4d\x3a\xb5\xa3\xa7\x1e\x10\x65\x23\x7b\x5c\xd7\xcc\x15\xca\xae\x6b\x91\xef\x1c\xe\x8c\xda\x72\x4c\x6\x0\xdb\x8d\xbb\xb7\x26\xd\x6c\x37\x8a\x84\x2b\xf2\xd3\x41\xaa\x6e\x7d\xc2\xfc\x3e\xd1\x4\x45\x68\xb9\x27\xe4\x58\xb0\x1b\x44\x40\xba\x53\xd8\x66\x14\xe1\x67\x5\x5d\xc\x96\xf8\x4e\x98\x7e\xf4\x3\x99\x52\x51\x4f\x11\xa8\x1a\x9d\x86\x97\xc5\xf\x25\x75\xc8\x94\xa5\xb8\xec\xa6\xa0\x38\xab\xc9\x36\x24\x35\xc0\xc7\x90\xd0\x55\xfa\x95\xaf\x49\xfd\x7f\x42\x87\x7a\x3f\x56\xf5\x3c\x62\xc3\x59\xb3\x33\xa9\x2e\x1d\xea\xbc\x63\x18\xed\xd9\x3b\xf9\xc4\x78\x22\x5a\x29\xfe\x9b\x61\xe5\x5b\x8b\xce\x4b\x57\xcf\x20\xdc\xf6\xb6" }, - { 0x541db8, "\xf\x3\xdb\xb5\x48\x8b\xe2\xbd\x4a\xc7\xdc\x63\xe9\x71\x94\x3d\xf7\xf9\x1c\xfa\x77\x1e\xea\x97\x9e\x57\x43\x91\xf8\xae\x4f\x55\x9b\xd1\x32\x67\xcf\x90\x2b\xac\x3a\xb4\x6\x85\x98\xc\xc1\x2c\xec\x40\xbf\x9\x59\xde\xcb\x6b\xa1\xad\x47\xbb\xd2\x22\x64\xa4\xb\xe5\xce\xd0\xff\xd4\x41\x45\x51\x65\xb9\xdd\x5\x38\xb6\xc2\x35\x21\xab\xc4\x1d\x1f\xa2\x74\x0\x5e\x93\xa\xe\x68\xda\x95\xf5\x6a\x1\xbc\xfe\x16\x12\xfc\x62\x2a\xf3\xf6\x7c\x5a\x46\x1a\xcd\xc3\x7b\x42\x27\x8f\x25\xa6\xca\x6c\xa7\xf2\x23\x5d\xd5\x54\xe4\xc5\x20\x50\x56\x3e\x69\x70\x52\xed\x7\x17\x66\x8a\xb1\x82\x37\xef\x3b\xfb\xd9\x7e\x36\x2e\x9a\x1b\x2f\x29\xe7\xa9\x83\xe3\xa3\x8c\xf1\x2d\x49\xd7\x31\x10\x78\x8e\xb2\x87\xd8\xe8\x5f\xb0\x76\x9d\x79\xc9\x4e\xe1\xe0\xee\xf4\x13\x9f\x14\xbe\x73\xb8\x88\x3c\x86\x7a\xa5\xba\x58\x7d\x6e\xa0\xc8\x11\x30\x61\x81\x33\xd6\x4c\x9c\x18\xf0\xfd\x99\x3f\xc0\x80\x28\x5b\x72\x4d\x6f\x92\xeb\x24\x75\x89\x8d\x15\xcc\x60\xaa\x4\x26\xd3\xdf\x8\x2\x5c\xa8\xe6\x44\x7f\xb7\x96\x39\xc6\x19\x34\xaf\xd\x53\x6d\x4b\xb3\x84" }, - { 0x541fe0, "\x30\x7a\x4b\x48\x47\x3f\xc8\x2e\xde\xb1\x5f\x96\xe3\x40\xb3\xdf\x70\x73\x67\x87\x78\xdd\xa\x6b\xb5\x2f\xf0\x13\xc5\x1c\x7f\xa1\x8b\xb4\x8e\xeb\x63\xd5\x89\x9d\x0\x68\xab\x9\xfe\x76\x71\xb7\x5d\x92\xc1\xdc\x46\x79\x8c\x16\xf3\x1a\xc9\xd\x3b\xf6\xad\xe7\xa5\x45\x3\xee\xd1\x5c\xb6\xbc\x52\xc3\x3a\x94\x1f\xe2\x6f\x14\xca\x29\x69\x4a\xe5\x51\x31\xff\xaf\x50\x9a\xcc\xf4\x39\x7\x86\x82\xfa\xac\x20\x26\x83\x9f\x54\x11\xa3\x1e\x81\x43\x2c\x8\x8d\x5a\x85\xa2\xcb\x2a\x35\xb2\xda\x2d\xfd\xc4\x37\xa7\x3e\x7e\x75\x65\xa8\x66\x1\x25\x32\xd4\x4f\xa0\x1b\x6\xae\x28\x15\x9b\xba\x2b\x34\x77\x8f\xec\x99\x7c\xc0\xb9\xf9\x88\xce\xe9\x84\x93\xb0\x22\xcf\xed\xf\x7d\x74\xe0\x61\x2\xa6\xbf\x58\xea\xf2\x95\xfc\x6c\x56\x91\x4c\xe4\x80\x49\xbb\x18\xd0\xa9\xa4\xaa\x5e\x8a\xb\x33\x38\xd6\x53\xdb\xf7\x60\x44\xc\xc6\x62\x55\xd7\xbd\xfb\xcd\x5\x42\xef\x57\x24\x12\x90\xd9\x19\x27\x5b\x6a\xd2\x98\x23\xbe\x36\x4\xc2\x7b\xf8\x6e\xe\xc7\x6d\xd3\xf1\x97\xe1\xe6\xd8\x10\x9e\xe8\xf5\x59\x9c\x4d\x64\x3d\x21\x1d\x72\x41\x17\x4e\x3c\xb8" }, - { 0x5420e0, "\xd8\x40\x46\x1c\x9c\xba\x77\xfd\x1d\xe0\xc0\x42\x92\xf0\xff\xa8\x78\x9e\x3f\xcd\x60\xea\xc7\x3c\x2f\x5f\x72\x74\xb3\x2c\xee\x94\x47\x80\xe8\xf5\x67\x8f\x53\x43\xd\xb9\xe9\xaf\x7e\x7a\xe\x63\xb6\xd2\xd4\x27\xc4\x7\x76\xad\x4e\x3\x5d\x2\xd6\xaa\x56\x6b\x12\x21\x37\xa0\xd1\xab\x3a\x11\x51\x90\x48\x23\x26\x6a\x6\x97\xc1\x9d\x35\xec\xa3\x24\x10\xfb\xf8\x41\x65\x1\x1f\x6d\x5\x8e\x7b\xb1\xfc\x44\xbc\x6e\x89\xa9\xc3\x2d\xb2\x18\xde\x71\xbe\xfe\xc5\x54\x73\x2b\x0\xa7\x5c\xae\xd3\x57\x95\xfa\xf1\x7c\xdf\xc\x31\xa6\x3d\x4a\x58\x79\x66\x87\xb8\x19\xf6\xf7\x8d\xbf\xcb\x45\x33\x6f\xb5\x91\x32\x5a\xbb\xdc\x62\x55\xa1\x4\x70\xa5\x8c\x16\x3e\x49\x64\x82\xf9\xdb\x59\x28\xcc\x50\x96\xb7\x38\xc6\x7d\x69\x29\xb4\x1b\xe7\x2e\xc2\xbd\x84\x85\x4d\xe1\x3b\xf4\xac\xd7\xe3\x8b\x4f\x30\x9f\x7f\x5b\xb\x20\xb0\x86\x88\xeb\xa2\xca\x34\x15\x81\x83\x13\xd9\x5e\x25\xf\xc8\xda\x4b\x99\xe5\x9\xf2\x93\xdd\x52\x6c\x2a\xc9\xef\x14\x9b\xf3\x68\xa4\x22\xce\x1a\x1e\xe4\xd5\x8\xe6\x9a\x98\xed\x61\x17\xa\x39\xcf\xe2\x4c\xd0\x8a\x36\x75" }, - { 0x542220, "\xee\xa9\x92\x52\x24\x57\x44\x8e\xa0\xb9\x95\x20\x5b\x70\xbd\xc3\xa7\x17\x4d\x1d\x12\x9a\x0\xd0\xfc\x9d\x41\x6\xf4\x86\x50\x74\xe1\x5d\xa2\xdf\xa1\xa3\xf\xd5\x1b\x62\x28\x7c\x10\x79\x9b\xe2\x13\x7d\xce\x97\xd7\xb\x56\xf0\x63\x3c\x68\xdc\x21\xed\x7\x3d\x7a\xb6\xb5\x23\xe6\x3f\x29\xeb\xd6\x67\x89\xb3\x87\xf2\xfb\x71\x90\x5a\xc6\x42\x2f\x32\x77\xd4\x15\xde\x84\xff\x7b\xd3\x47\xa5\xb8\xc4\x8b\x55\x6c\xc2\x5\x54\x1a\x65\xfe\xcf\x6a\xb7\xa6\x4\xc9\xaf\xf8\xf7\x40\x8d\x16\xae\x3e\x99\x6f\x4b\xac\x26\x3\xb4\x2e\xf3\x69\x34\xb0\x8f\x45\xcc\xd9\x2d\xcd\x4c\x9e\x5f\x85\xe5\xca\x58\xe\x9c\xf5\xfa\x38\xc1\x30\xd\x94\x36\x6b\xc8\xe4\xad\x39\x3b\x22\x46\x96\xc7\xbc\x5c\xe9\x80\xa\x73\x33\xfd\xd8\x88\x2a\x4e\xef\x4f\x5e\xc0\x1e\xc5\x27\xec\x18\xf1\xd2\xc\xba\x8c\xa8\x59\x98\xe8\x9f\x43\x51\x49\x72\x19\xbf\x2\x1f\xbe\x64\xda\x53\x4a\xab\x82\xf6\x3a\xbb\x91\xaa\x6d\x78\x81\x66\x7f\x75\x76\x1\x25\x35\xb2\x8a\xcb\x11\x48\xdb\x61\xe3\x6e\x93\x60\x14\x37\xf9\x9\x1c\x2c\xd1\x2b\x8\xa4\x7e\xea\xdd\x31\x83\xe7\xe0\xb1" }, - { 0x53ab20, "\xa5\xff\x5f\x5c\x76\xd0\x2c\x5d\x56\x88\x78\x11\x5\xaa\x2d\x3\x25\x2f\x32\x44\xae\x7d\xd4\xc\x38\xda\x6b\xde\xb1\x9f\xb5\x2b\xd1\xa8\x30\xf8\x1e\x73\xb6\x95\x55\x4\xaf\xf6\x48\x7c\xb3\x3f\x4b\xe2\x8b\xcd\x3e\xe0\x9c\x67\xc9\xf1\xfe\xea\xd6\x42\x63\xcb\x82\x94\x28\xc6\x54\x2e\x81\x52\x46\x41\x1\xe\x12\x43\x9\xf7\x3c\x2\x8c\xc7\x74\xd3\x45\x37\xbf\x58\x59\x6c\xfd\x7\xb0\x16\x39\x64\x23\xf9\x6a\x7a\x14\xd9\xb7\x86\x50\x19\x8\x57\x4e\x97\xac\x22\x7e\xbb\xad\x79\x4f\x85\x27\xc2\x61\x71\xe9\x1c\xc8\xc1\x93\x36\x70\x24\xc3\x3d\x1b\xf2\x6d\x15\x51\xfa\xbe\x87\xc4\xc0\x96\xb\xca\xa4\x75\xd8\x77\x1d\x53\x62\xe6\x2a\xb2\x4a\x8e\xd5\xdc\xf5\x35\x72\x5e\x34\xa1\x33\xc5\x69\x18\xa\xb4\x7b\x83\x31\xab\xa0\x9b\x21\xbc\x84\xfb\xd7\x89\x0\xd2\x3a\xfc\x13\x1a\xcf\xf3\xdd\x10\x90\x3b\xe4\x26\xf4\x4d\xa7\xf\x40\x7f\xe5\x29\x17\x8f\x20\xeb\xbd\x80\x99\x65\xa6\x6f\x4c\x47\xdb\x60\x1f\xec\x98\xe8\xa2\xb8\xb9\x5b\x91\xed\xf0\x9d\x68\x8d\x6\x5a\xba\x66\xdf\xa9\xe7\xe1\xef\x9e\x8a\xcc\x9a\xee\xd\x6e\xa3\xe3\x49\xce\x92" }, - { 0x542738, "\xa5\xc3\x4\xb9\x92\x3d\x8a\x86\xe9\x67\x74\xd8\x9b\xcc\xe6\xd\xc6\x23\xf\xa1\xac\x42\x28\x93\xf8\x9c\x8d\xc7\xb7\x3\x8c\x69\x3c\xd1\x81\xf9\xa0\xfd\xba\x0\x75\x49\xc4\xb\xfc\x68\x65\xb0\x80\x64\xa\xda\x83\xf5\x58\x14\xec\x46\x1f\x61\x13\x27\x6b\xce\x1d\xbe\x96\x19\xc2\x9\xef\x37\x2f\xe2\x47\xf1\x7e\x21\x30\x90\xf7\x2b\xf4\x3b\x7\x1a\x56\xd3\x72\x5b\x4b\x85\xe\xd5\x8\x6f\x5d\xc0\x79\x59\x26\x98\xfe\x7d\x6\x4d\x10\xbf\xf3\xee\x2e\xe0\xe7\xd7\xd2\x9f\x60\x88\x25\xde\x7f\x4e\xe1\xae\xdf\xe4\x38\xb8\xe5\x8f\xa2\xd9\xcd\xa4\x73\xdb\x84\xb5\xca\x17\xa7\x54\xab\x97\x91\xfa\x66\x1c\x2d\xea\x31\x35\xe3\x77\xa9\x36\x5c\xc\x76\x95\x5a\x7c\x1b\xbd\x8e\x94\xff\xf2\xbc\xc1\xb4\x87\x2c\x44\xb6\xaa\xc8\x33\xf6\xa8\x45\x48\xa6\x6c\x1\x63\x55\x6a\xd6\x9a\x57\x40\x15\xad\xb3\x3a\x5\x43\x51\xfb\x71\x9d\x22\x1e\xed\x53\xd0\xc5\x8b\xeb\x18\x6d\x20\x3e\xcb\x89\x34\xf0\x3f\x2a\xcf\x39\x16\x4a\xaf\x9e\x29\xb1\x6e\x62\x11\x82\x5f\x7a\xbb\x52\x12\xc9\x99\xa3\xdd\xdc\x4c\x5e\x24\x50\xd4\x78\x70\x4f\xe8\x32\xb2\x2\x7b\x41" }, - { 0x542df8, "\x94\x3b\xd0\xd7\xba\xb3\x84\xc4\x36\xdc\x30\xa9\xdd\xc7\xb1\x75\xe6\xa4\x71\xc2\x60\xbf\xf3\xea\x51\x49\x2f\x4e\xa5\x1\xa2\x44\x2\xfe\x85\xf0\x4\xcf\xac\xb7\x2c\x35\x5f\xa6\x18\x6a\x7a\xae\x9\xd3\x3c\x1a\xd1\x12\xcd\xaf\xcb\xb6\xe2\xef\x73\x7d\x47\x2d\xe0\x4b\xf5\x89\xbd\x79\x4c\xdf\x29\x19\x7\xbc\x66\x5c\xed\x62\x68\x3f\x81\x1b\xb4\x11\xc5\x93\xd\xc\x16\x52\x23\xff\xf1\x37\x83\x6d\x58\xab\x77\x59\x65\x46\x97\x56\x6e\xbe\xa1\xf9\x7c\x34\xc3\x76\xf\xb5\x96\x24\x10\xce\x82\x1d\x45\x1f\x67\xd4\xaa\x53\xad\xeb\xe5\x3\xa0\x64\x27\x38\xc8\x8b\x9f\xc1\x8c\x2b\xe9\x2a\xf6\xd8\x4f\xfa\x41\xe4\x7e\x8e\xe8\x90\x63\x9b\xb0\x72\x4a\x40\x57\xde\x61\xfc\x48\x1c\x17\x13\x14\x95\x99\x39\x28\xc0\x31\xe1\x98\x50\x5e\x0\x78\x3d\xfb\xf7\xda\xd5\x70\xca\x8f\x88\x6\xf4\xc9\xb8\xa7\x15\x5d\x6b\xbb\x8\x74\x1e\xcc\xd9\x21\x3a\x20\x3e\x92\x2e\x33\x54\x8d\x4d\x80\xf2\x5b\x91\xee\x42\xa8\xd2\xb9\x7b\xe\x9c\xf8\x9d\x86\x25\xa3\x22\xec\x5\xc6\x87\x32\x9e\xb2\xe7\x5a\x55\xa\xdb\x43\x8a\xb\x6c\x9a\xe3\x26\x69\x7f\x6f\xfd\xd6" }, - { 0x5430b8, "\x18\xde\x60\xb0\x52\x81\xc0\x13\xd9\xf6\x7f\x69\x1b\xa4\x27\x73\xa1\xe9\xad\x2a\x9b\x45\xc5\xa5\x2d\x16\xb6\x33\x5e\xc7\x3e\xd5\xbe\x5\x98\xa7\x82\x5c\xec\x29\xd1\x6b\x5b\x85\xf5\x89\xf1\x1c\xf9\x4b\x58\xa9\xac\x23\x2e\xe2\x7c\x36\x8c\x63\x2\x3b\x61\x39\x17\xe0\x32\xc1\xab\x4\x3d\x8f\x26\xd4\xef\xc9\x35\x2f\xe7\xd7\xa6\xcc\x9f\x44\xe4\xc2\xdc\x3f\x4d\x7e\x4a\xf7\x66\x38\x12\x3c\x96\x64\x5f\xf8\xcd\x7d\xb\x70\x76\x99\xba\xdf\xf\xa8\xff\xd2\x56\xeb\x94\xae\xbd\x78\xdb\xf4\xb5\x3\x7b\x80\xfe\xd0\xc6\x41\x0\xc\x86\x8e\x6d\x54\xb3\x4e\x8b\xb2\xb7\xe3\x43\xfd\x53\x11\xd6\xd3\x77\xed\x21\x14\x9a\x6\x9\x1a\x87\x9d\xcf\x37\xc4\x49\x6c\xe1\x10\x5d\x6f\x72\x19\x2b\x51\x15\x4f\x2c\x57\x55\x84\x92\x30\xd\x8d\x25\x24\x8a\xe6\xe\xf0\x22\xc3\x9e\xe8\x28\xbc\x1f\x65\xb1\x1\x20\xa\x46\x67\xfc\x31\x91\xe5\x5a\xca\x71\x90\xbb\xfb\x34\xea\xa0\x79\xee\xa3\xa2\xb9\xdd\x62\x7\xbf\x47\xce\x50\x88\x1d\xf2\x1e\xaa\xda\x9c\xd8\xf3\xcb\xb4\x48\x42\xfa\x4c\xb8\x6a\x68\x6e\x83\x7a\x97\x59\x93\xc8\x40\xaf\x75\x8\x74\x3a\x95" }, - { 0x543220, "\xbd\x7f\xc8\xb9\x77\x27\x36\x86\xbf\x96\xfe\xcd\xd\x93\xe0\xae\xec\x69\xee\x90\x3b\x91\x5a\xc0\xcb\x8\xfb\x5d\xa8\xe8\x26\x4c\x22\xf0\xa5\x5e\xff\xd5\x58\xc5\x89\x51\xf9\xfd\xfc\xce\xac\x74\x80\xa6\xde\x2e\x75\xd7\x61\x67\x3d\x35\xf6\x84\xdf\x3f\x5\xd8\x32\xc9\x54\x5b\x24\xc6\x6c\x11\x82\x9e\x2c\x99\x37\x9d\x1d\xd0\xbe\x6d\x6e\x92\xc7\x60\xe9\xaa\x47\x7e\x39\x2f\x97\x2\xad\x9a\xdc\xb3\x34\xca\xdd\x2d\xf5\x18\x81\xa4\x3c\x15\x40\x17\x63\xbc\xef\xcf\x1a\x52\xd2\x41\x55\x4a\x62\x8c\xf3\x68\x57\xe5\x9\xd6\x78\x59\xda\x7d\xe7\x50\x73\xba\x4f\xe1\x2a\xb0\xaf\x1e\x1b\xab\xcc\x9c\x0\x7\xe3\x46\x1f\x13\x85\x64\xe\x12\x45\x38\xdb\x79\x72\x70\xc2\x43\xb\xed\x44\xeb\xf2\x48\x30\x87\x8e\x31\x88\xb6\x49\x8f\xe2\x14\x7c\x76\xc3\xd9\xfa\x71\xa1\x6a\x25\x20\x98\x5c\x10\xf\x66\x94\xe6\xa7\x6b\xb4\xa0\xd4\x5f\x1c\x6\xd1\x7b\x8b\xb1\x4e\x28\x56\xb8\xf1\xc1\x16\x1\xea\xf8\x4\xbb\x19\x9b\x8d\x33\x42\xb7\x3a\x4d\xc\x7a\xe4\xf4\x83\x23\x9f\x3e\xc4\xd3\xb5\x3\x53\xb2\x95\x21\xa3\xa2\x8a\x29\x65\x4b\xf7\x2b\xa9\x6f\xa" }, - { 0x543580, "\xb3\xd\xc5\xef\x7f\x75\x36\xd3\xbb\x73\x87\x24\x17\x6b\xeb\x25\x53\x5c\xfb\xf9\x13\x67\x77\xe7\x1c\xcf\x8\x79\xba\xab\xa7\xc8\xc7\x98\x74\x2d\x34\xf\xaa\xf6\x97\x69\x9f\xc0\x8c\xd9\x51\xcc\xa0\xb1\xf3\xd4\x4d\xe8\x88\xd2\x90\xe2\xbd\x52\xf7\x72\x57\xb0\x4a\x96\x81\xd0\x1f\xbf\xf5\x6d\x10\xea\xb4\x4e\x85\xf8\xde\x56\x5\x4c\xa9\x38\x41\x8d\x4b\x0\xae\x84\x80\xc4\xb2\x15\x3f\x7e\xee\xfc\x7d\x27\xbc\xdc\x70\x6c\x2c\x78\x39\x40\x9b\xbe\x68\xe6\xdd\x5e\xc9\xf1\x2a\x2f\xa1\xe4\xa8\xa\xce\x18\xd8\x22\xa3\x4f\x1e\xe3\xe1\x11\x92\x46\xc\x99\x28\x54\x47\x5d\x7c\x3d\xb8\x5f\x6a\xad\xfe\xfd\x63\x60\x43\x59\xb\x91\x71\xcd\x48\x35\xd5\x2e\x61\x9\x65\x33\x3c\xe9\x1d\x26\x89\x1a\xf4\xb5\x9a\x7b\xa4\x37\x93\x94\x14\x8a\x6\x8f\xe0\xd1\x30\x4\xa2\xdb\x7\xc3\xd7\x8b\xaf\xdf\x82\x50\x3b\x23\x49\xfa\x3e\x42\xa6\xc6\x5b\x9e\x9d\x12\x62\x32\xb7\xed\x55\xca\x8e\xcb\xe\x45\xc2\x19\x6e\x64\x31\x86\x2b\xda\xd6\xc1\xe5\x3a\x7a\x3\x95\x5a\xf2\x21\x1\x9c\x29\xb6\xa5\x16\xec\xb9\x2\x66\xac\x1b\x44\xff\x20\x58\x6f\x83\xf0\x76" }, - { 0x543680, "\x82\x70\x6d\x44\x64\xe7\xe0\xb\x73\xf7\x12\x60\x5\x13\x9e\xe\x1a\xb8\xe1\xa0\x37\xe8\x61\xde\x55\xe3\x29\x25\x3e\xb6\x92\xcd\x6\x96\x56\x31\xa3\xe4\xcf\xe2\x7c\x23\x53\x84\xfd\xc\x62\x7f\xdd\xb0\x75\x15\x9b\xdf\xf3\x2a\x68\x87\x7\x5c\xd4\xfc\x6e\x80\x38\x5e\xd5\x3a\x50\xd0\x3b\x9\x9c\x4c\x8e\x40\xc2\x91\x58\x22\xae\xb3\x7e\xa6\x54\x90\x5a\x45\x7b\x2f\x18\xf8\x35\x3d\x48\xd\xc6\x20\x51\xfb\x3c\xf5\x2b\xa5\x32\xc3\xd7\x36\x6c\x74\xe6\x85\x1c\x88\xd3\x0\x6a\xa1\xac\xec\x97\xf1\x52\xf0\xf6\x1e\xeb\xfa\xd8\x27\x3f\xa9\x83\x9f\x86\x41\x5d\xaf\xdc\x8b\x8d\xa\x8a\x4b\x4a\xef\x99\xea\x7a\x77\x28\x21\x6b\x8\xc4\x2c\x81\xce\xd9\x14\xf2\xab\x69\x8f\xa2\x1b\xa7\xb7\xc1\x79\x72\x63\x6f\x33\x59\xaa\xb1\x42\x8c\x95\x10\x94\x76\x3\x7d\x16\x1d\xff\x24\xb9\x67\xbf\x66\x47\x4d\x9a\x4f\xc8\xbc\xd1\xed\xdb\xf4\x43\x49\x89\xbd\x1f\x5b\xb2\xc0\x98\x57\x4e\xe9\xc9\xba\x71\x39\xd6\x11\x19\x4\xa4\xfe\xb4\xcb\x26\xc7\x34\xee\x5f\xe5\xbb\x2d\xc5\x93\x46\x1\x78\xca\xad\xf\xcc\x17\xa8\xbe\x65\xda\xb5\x30\x2e\x2\xf9\x9d\xd2" }, - { 0x543848, "\x5c\x7c\xa2\x4a\x63\x12\x58\x19\xbb\xc7\x60\xfa\x18\xc3\x49\x84\xc8\x5d\x61\xa\xbc\x55\xb3\xf3\x57\xb\xc4\x5f\x56\xc9\x4c\xd0\xe\x90\x9d\x2d\x4\x54\x93\x8\x17\x52\x79\x3c\xb9\x2c\x51\x4d\xb4\xb8\x3b\xfe\x6b\x3f\xd4\x86\x38\xa7\x92\xa8\xea\x30\xcc\xa3\xd6\x8d\xdd\xeb\xbe\x82\xe5\x1a\x98\x77\x1c\xef\x7b\xe1\x41\x22\xc1\x36\x3d\xe0\x9e\x31\xd7\xe3\xc6\x59\x46\x73\xe2\xae\xcd\x1b\x42\x11\xa4\xdc\x9f\x9\xce\x35\x67\x8f\x96\x4e\x83\x5b\xf2\x10\x80\x81\x4f\x2f\x37\xed\xfc\x64\x0\x24\xf0\x99\x78\x9b\x7d\x7\xc0\x6e\xdb\x7a\x39\x76\x75\xbf\x25\x4b\xa5\xc2\x7e\x1d\xd3\x2e\xc5\x6f\x34\xb1\xee\x8b\x68\x21\x2\xab\xd1\x14\xf4\xd\x5e\x23\xf1\x1\xca\xb7\xf5\x95\xa1\x44\x9c\xc\xb5\x6a\xad\xe4\x29\x8c\xd8\xf\x7f\x3a\xec\x32\x6c\x5\x13\x5a\x70\xda\xcf\x53\xa9\xe8\xd9\x74\xa6\x27\x89\x47\x1e\x8a\xd2\xb0\x50\xa0\x9a\x94\x3\x87\x71\xbd\xb6\x62\x65\xd5\xe9\xb2\xaf\xf7\x26\xac\x66\xfb\x85\xaa\xe7\x33\x88\x20\xdf\xfd\x15\xff\x69\x1f\xcb\x3e\xf9\xe6\x16\x45\xde\x6\x40\x8e\x43\x97\x72\xf8\x48\x2b\x91\xf6\xba\x28\x6d\x2a" }, - { 0x543990, "\x43\x8a\x90\x7d\xc9\xb4\x33\x62\x2a\xc8\xdc\xcc\xe5\xd8\x8\x20\x5f\x53\x67\x18\xe0\x23\xad\xae\x93\x69\x59\x6d\x10\xd4\xef\xab\x5\xcf\xa1\xd7\x85\x97\x28\x98\x5e\x4a\xe1\xf\x13\x21\xc5\x86\x76\x22\x57\x2e\xc4\x77\xbe\x1d\x82\xb1\xd1\xf9\x6e\xb8\x81\xc6\xca\x4d\x26\x17\xe8\x12\xdd\xeb\xc0\xa\xe\xf2\x68\x9a\xf4\x61\xde\xa3\x3d\x2b\xe9\xe6\x48\x5d\x16\xa4\xb9\x45\xed\xe2\x55\x51\x4f\x99\xda\x24\x42\xea\x60\x5c\x9f\x37\x46\xbb\xb0\xb6\x7f\x3b\xe4\x8e\x73\xe7\x5b\xec\xe3\xce\xfb\x9d\xf5\x36\xa0\x6b\x40\x27\x3a\x4\xd\x15\x83\x88\x38\x63\x70\x2c\xd5\x5a\x58\x4c\x72\xac\xb3\x75\x29\x0\xd9\x35\x74\xa6\x6c\xc3\x66\x78\x56\xbc\x92\xb5\x50\x1f\xf1\x34\xa9\x1c\xcd\x3e\xb2\x8c\xbf\x44\xfc\x41\xc1\x7a\xdf\xee\x30\x65\xfa\xa2\x32\x91\x25\x80\xba\x3c\x39\x96\x54\x1\xf8\x71\x2d\x84\xa8\x6a\xfe\xaf\xa7\xf6\x4b\xc7\xd3\x8b\xf7\x3f\x8f\x9b\xfd\xbd\x19\x94\xdb\xc2\x52\x2f\x31\x2\x9\xff\xf3\x11\xb7\x95\x6\xaa\x7c\x9e\x7\x49\x4e\xd6\xa5\x1b\x1e\x1a\x64\x6f\xf0\x47\x79\x87\x7b\xc\x14\x9c\x3\x8d\xb\xcb\xd0\x7e\xd2\x89" }, - { 0x543bf8, "\x19\xf2\xd0\x35\x72\xe6\xde\xe8\x38\x97\xfe\xd4\x0\xa9\x94\x77\x50\x74\xb9\xc\x15\xce\x54\x71\x45\x65\xba\xa8\x6d\xff\xd2\x63\x86\x5b\x93\xc8\x8a\xb6\x46\x20\x73\xa3\xe2\xae\xfd\x17\x16\x9c\x7\x5\x6b\x4d\x2e\xfc\xaf\x56\xb5\x95\xd7\x42\xb8\x18\x23\xa\x34\xf0\xcd\xfa\x3c\x9d\x9e\x8e\x59\x6f\x67\x92\x68\x5f\xcc\xe3\xe0\x41\x5a\x26\xdb\xe7\x33\x1e\x53\x37\x55\xb2\xf\xdc\x28\x10\x75\xb1\x12\xf7\x6c\xda\x2b\x8c\x89\xf5\xd9\xec\xc1\xb3\xee\xdd\xa2\x4f\xef\x9f\xa1\xbf\xdf\xb7\xca\xc3\x9b\xf4\x8\xb\x83\x3f\x32\xc2\x62\x1a\x2d\x2\x69\x4\x7e\x79\x61\x4c\x44\x84\x3d\x47\x39\xd\x8f\x5c\x81\xe9\x76\x8d\xad\xc5\x80\xd8\xcf\xc6\x7d\x1c\xd6\x7a\x51\x82\xc9\x31\x4b\x6\xb4\x85\x3b\x58\xf6\x6e\xa4\x3e\xe4\xa7\x2f\x25\x7b\x30\x66\x14\xc7\x57\xc0\x64\x21\x4e\x22\x2c\x99\xbc\xbb\x52\x49\x36\x1f\x7c\xf8\xf3\x3\x90\x3a\xc4\xa0\x4a\x91\x87\xcb\xd3\x78\xfb\x11\x70\xd1\xea\xf9\x96\x9a\x9\x5e\x1\xa5\x2a\x1b\xab\xf1\xd5\x43\xed\x13\xeb\x5d\xe\x8b\xe1\x98\x48\x29\xb0\x6a\xe5\xaa\xa6\xbd\x88\x60\xac\x40\x24\xbe\x27\x7f\x1d" }, - { 0x543d08, "\x98\x9c\xb6\x1c\x91\xe3\x4d\x7\x3c\x42\xeb\x71\xda\x6c\x45\x61\x99\xd6\xb1\x14\x51\x28\x64\x3\x1e\xcf\x15\x10\xa\x75\x1b\xba\x73\x89\xc7\x69\xab\x3b\x8\x7b\x52\x82\xa9\xa0\x39\xa4\xf8\x6f\xa6\xad\x22\x9e\x50\xfc\xbf\x6\xe9\x5c\x2f\x8b\x1\x8d\xf0\x8c\xe2\xa5\xe\xe5\x4b\xf7\xaa\x66\x60\x4e\x7c\x4f\x34\xa2\xb4\x5d\xaf\xcb\x8a\xd4\xb7\x30\x88\x1d\xfe\xbb\x9a\x74\x9b\x37\xe1\x44\x3d\x38\x3a\xfb\x80\xc8\x41\x65\xc6\x4a\xd7\xf5\x70\x62\x2c\xc2\xb0\xf4\xae\x57\x21\xf6\x4\x54\x5\x2b\x83\x95\xdc\xb\x24\x94\x7f\xd0\x31\x84\x5f\xdd\xe8\x87\xce\xb8\xc5\x40\xc1\xa8\xd2\xc0\xd9\x53\xa3\x3f\x55\x6b\xa7\xf1\x1f\x13\xed\xf9\x3e\xc9\xc\x2e\x67\x96\xd1\x27\x77\xbd\x32\xde\xee\x48\xf\xc3\x76\x36\xcd\x2a\xe4\xea\xdb\x46\x6d\x25\x78\xef\x18\x11\xd8\xe7\xb5\xca\x4c\xbc\xff\xac\x5b\x97\x8e\xf2\xe0\x43\x20\x35\x93\x5e\x81\x63\x2d\x79\x68\x19\x92\x56\x12\x5a\x0\x47\xb9\xd5\xb3\x90\xf3\x1a\x33\x2\x26\xd3\x6a\x85\xcc\x7d\xa1\x23\xec\x9f\x7a\xfd\xe6\xfa\xbe\x29\xb2\x72\x7e\x49\x58\x6e\xd\x86\xc4\x16\x8f\xdf\x9\x17\x59\x9d" }, - { 0x544130, "\xc9\x1c\x8\x44\xea\x55\xb5\x3e\x8a\x54\xeb\xd3\x86\xbb\x3b\x6e\x31\x3f\x22\xbc\xe4\xfc\x81\x4b\xd7\x8c\x1e\xb7\xb4\xb\xc8\x7c\xbe\x69\x1d\x9a\xfe\x18\x2b\xde\x4f\x6c\xcb\x52\x35\xe9\xed\xad\x79\x56\xb2\x41\xe2\xf7\xdb\xff\x6b\x71\x15\xf8\x5c\xcf\x48\xa7\x3c\x92\x60\x4a\x9f\x1f\x80\x4e\x8b\x43\x90\xab\x39\xee\x5\xd9\x6a\x40\x66\xf5\xb1\x29\x65\x9b\xf1\x84\x1a\x0\x64\x5f\xe\x76\x6d\x7\xc5\x67\x5b\x4c\x73\xd1\x7a\xf\x82\x7b\x47\x85\x74\xe6\xa1\x21\x42\xd8\x8e\x95\x98\xe3\xaa\x27\xb6\xb8\x26\xc\x6\xe8\x5e\x37\xbd\x6f\xca\xc1\x14\x4d\x10\x50\x3d\xb9\xf9\x19\x97\x1b\x7e\x20\xaf\xd5\x51\x2\xa\x8f\xa3\xd6\xc3\x62\xb0\xf4\x32\x12\x94\x8d\xc0\x78\x61\xc2\xe7\x3\x30\x63\xa8\xdc\x77\x9\x89\xa0\x46\x7f\x58\xd\xac\xa2\xe5\x88\x9e\xe0\xc4\x57\x68\xf0\x36\x38\x24\x1\xec\x91\x25\xef\xfa\xd2\x13\xce\xd4\xbf\x3a\xcc\xba\x93\xf6\xfd\x5a\x45\xcd\x72\x87\x49\xa6\x2d\x53\x28\x99\x2c\xb3\x5d\xd0\x4\x34\x96\x23\x9c\xe1\xc7\x16\xf3\x2f\x17\x75\xa5\xfb\x11\xdd\x2a\xae\xa9\xda\x70\xa4\x7d\x59\xc6\xdf\xf2\x9d\x33\x83\x2e" }, - { 0x544298, "\x84\x6d\x8e\x4a\x54\x44\x86\xb1\x7b\x8f\xa3\xfe\xf2\x6f\x9b\x2a\xa\xdd\xd5\x4e\x94\xc6\x7e\x99\x46\x56\x1b\x62\xad\x9a\x1d\x5c\xb6\x11\x15\x7f\xa8\xb\x45\xe8\x18\x41\xf5\x19\x9f\x16\x31\x3e\xc7\x51\x6b\x5\xfd\x70\x10\x93\xd1\x32\x2f\xf4\x89\x64\xf7\x3b\x60\xca\x96\x4c\x90\xbd\xbf\xab\xb7\x68\xb3\xdf\x42\xd4\xa1\xcc\x21\x59\x72\xe4\xdc\x73\x9e\x79\x14\x3\xec\xda\xd7\x92\xf1\xb2\xb5\x39\x81\x4d\x5b\x1f\xf0\x67\x74\x7c\x1e\x57\x6e\xe1\xac\x30\xea\x6c\x13\x37\x3d\x98\x22\xc4\xbb\x20\x50\xc1\x27\xf6\x53\xb8\x87\xcb\xf\xd3\x48\xcd\xc3\x47\x12\x75\x2\xfa\x5d\x4f\x80\x1a\x5f\x8a\x8d\x83\x58\xa0\x52\xbe\x43\x36\x61\x8\x82\x6a\xce\xaa\xb9\xa4\xdb\x76\x3c\x8b\xc\x3a\xde\xef\x24\x2e\x4\x95\x55\xaf\xfb\xf8\xf3\xa2\xa6\x3f\x40\x66\x63\x77\xff\x65\x35\x69\x91\x85\x71\xc9\x2c\xd\xed\x97\x2b\x4b\x33\xba\x23\xf9\xe7\xc2\xc0\xe3\xeb\x5a\x9d\x78\x8c\x7a\x34\x9\x26\xd6\x5e\xe2\x1c\xc8\xb0\xa7\x28\x9c\xe6\x49\xd8\x25\x7d\xe9\x29\xe0\xd9\x6\xcf\xfc\x17\xbc\xd2\x7\xa5\xa9\xae\xc5\x38\xb4\xe5\xe\xee\x1\x2d\xd0\x0\x88" }, - { 0x546d50, "\xab\x73\xec\xa\xdc\x52\x12\x6b\xc5\x5c\x71\x5e\x44\x8f\x41\x90\x8b\xe\x83\xba\x9e\xe4\x62\x42\x20\x38\xf3\x75\xb\x1b\x17\xf5\xd4\xcb\xaa\x81\xb1\x6c\x70\xc3\x11\x76\xd1\x69\x47\xf4\x9f\xe9\x95\xf\x4c\xe3\xd8\x92\xc2\x60\x5a\xe8\xf0\xb2\x0\x7b\x18\x4e\x85\x43\x97\x16\xce\x7a\xa7\x2e\xb8\xd2\x30\x2a\x66\xc7\x5f\xdf\xdb\xd0\xb0\xbb\xe1\x96\x3e\xfe\xc0\x26\xf7\x61\xee\xcc\x48\x3d\xfb\x3c\x2b\xae\x32\x55\xb9\x36\x7e\x68\xe5\xe2\xad\xac\x2f\xb3\xf1\xa1\xc9\x1d\x29\x72\x82\x67\x79\x51\x4\x50\xed\x1\x4b\x57\x5b\x1a\xbe\x7\x8a\x4a\x56\x9a\x9b\xca\x99\x2d\xb4\x8c\xb5\xdd\x25\x1f\xa6\xf2\x35\x2c\x89\xcd\x53\x77\x7d\x1c\x19\x84\xd\x6e\xea\x4d\x88\xc1\x24\x40\xa8\x8e\xbf\xa0\x3a\x54\x22\x58\x28\x6a\x3\x94\x64\xa2\x34\xff\xd6\x93\xa3\x23\x37\x9c\x8\xa4\xc6\xfc\x6d\xb7\x45\xde\x49\x31\xa9\xe6\x9d\xd7\xfa\xe0\x4f\x3f\xfd\x78\x98\x39\x6\x91\x21\xbd\xb6\xc8\x3b\x9\xe7\xa5\x7c\xbc\xf8\xc4\xd9\xeb\xf9\x87\x7f\xda\x1e\x86\x63\x46\x5d\xd3\xc\x2\xd5\xf6\x10\x15\xcf\x14\x33\x65\x27\xaf\x59\x13\xef\x80\x5\x8d\x6f\x74" }, - { 0x544548, "\x1f\xf4\xd5\xe\x5c\x98\xdc\xdd\x53\x5a\xf0\x9c\x1b\x3b\xcb\xae\x3d\xa9\x99\x45\x97\x6b\x5b\x8\xb9\x44\xe8\x89\x6a\x92\xa0\xb3\xad\x8c\x5e\xd4\x77\x8b\x30\x72\x4e\x8f\xe0\x31\xec\xfb\x1d\xc0\xe1\xca\xab\x20\xb4\x73\x6e\xc9\xfc\x42\x35\xde\x93\x64\xaa\x85\xda\x14\xa5\x46\xa\xd0\xf6\xff\x2b\x6d\x33\x91\xa7\x59\xf1\xeb\xb2\x48\x62\xd9\x39\xf7\xfa\x75\x68\x4\xf8\xc4\x74\x6f\xe7\x41\x58\x15\x63\x55\xf5\x3\x1c\x9b\xe3\x52\xaf\xb0\x1e\x2d\xed\xe5\xa4\x5f\xd\x60\x82\xa2\x49\xbd\x7c\xcc\xb\xc3\x4b\x4a\xd8\x23\x28\x86\x51\xce\x7\x40\x7d\xd2\xe6\x4f\xa8\xfe\x9e\x65\x9a\xc1\x17\xee\x3a\x4d\x7e\xfd\x88\x12\x5\x9f\x78\x7f\xcf\x18\xea\x0\x61\xe4\x96\xdb\x6c\x26\x56\xbf\x1a\x16\x9\x80\xa3\x79\x36\xa1\x2f\x32\xf\xcd\xc5\x3c\xd6\x2c\x70\xd3\xf2\x84\xd7\xc6\xa6\x47\xf9\x34\x22\xf3\x66\x10\x38\x37\x6\x2\x54\x13\xb8\xe9\x29\xbe\x5d\x7b\xac\xb1\x67\x2a\x57\x3e\x7a\x83\x1\xb6\xc7\x9d\x94\x2e\x43\x76\x8d\x69\x8e\x24\x50\x8a\x25\xb7\x19\xd1\x87\xb5\x11\xef\xe2\xc2\xba\x21\x71\x27\x3f\x95\xdf\x81\xbb\x4c\x90\xbc\xc8\xc" }, - { 0x544700, "\x78\x6c\xc5\xc\x2d\xa7\x97\x9c\x22\x76\x3e\x81\x51\x47\x59\x71\xb1\xa2\x4a\x3c\xb5\x16\x6\x95\xb9\x1\xe6\x91\x96\x1c\x1b\xad\x61\x64\xb2\xe7\x29\x19\x52\x3b\xfa\xaf\x30\xdb\xd4\xb\xfe\x75\x1f\xbe\xcb\xf6\xea\x31\xf8\xd8\xa3\x82\x73\x1d\x99\xf0\xcc\xb6\x46\x26\xaa\x8c\x87\x90\x24\x8f\x7a\x13\xee\xd1\xa9\x5\xb3\xf7\x2\x7c\x4c\x1e\xff\xe5\x77\xab\xd6\x98\x20\x4d\xc4\x23\xf4\xa4\x85\x9a\x8e\x1a\xe\xf5\x15\x60\x38\x72\xe9\xf1\xc3\x68\xf2\x93\xd3\x2a\x48\x74\xc2\x57\xa1\x7d\x94\x37\x92\x5c\xe1\x41\x83\xd5\x65\x14\xa6\xdc\x44\x27\xef\xd7\x25\x10\x2c\x7f\x40\xa5\x55\xbd\x2b\xd\xd0\xfc\xdf\xa0\x4\x0\x62\xb4\x5a\xeb\x6b\x84\x7e\x6a\xde\xed\x66\x3\xfb\x2e\x4f\x4e\xbb\x36\x5b\x18\xe3\x69\x3f\xec\xe4\xd2\xa\x34\x63\xcf\xa8\xf9\x9b\x7b\x6f\xe8\x49\xc1\x9\x54\xf3\x50\x67\x79\xc0\x9f\x8d\x5f\x17\x70\x11\xc8\xbc\xc6\xe0\x35\x39\xc7\x6e\x21\xbf\xda\x6d\x28\xf\xdd\x33\xac\x8a\x12\xc9\xcd\xb8\x45\xae\x32\xce\xe2\x56\xfd\x42\x89\x86\xca\x4b\x3d\x5e\xba\x8b\x5d\xb0\xb7\xd9\x58\x2f\x8\x43\x3a\x53\x9e\x80\x88\x7\x9d" }, - { 0x5448a8, "\x8f\xf2\xa0\xf3\x5c\x91\xbb\xc7\xcf\x42\x8a\x62\xf4\x67\xb0\xd4\xad\x2f\xc8\x64\xe8\x6e\x40\xc5\x5d\x82\x85\xa\x24\x2a\x41\x74\x7e\xcd\xdc\x26\xea\xe7\x96\xfd\x57\x6f\x35\xa7\x29\x4a\xe4\x4e\x43\xe5\xd8\x79\xe1\xeb\x95\xc1\xa4\xed\x80\xa8\x31\x6\x44\x10\x6b\xbf\x3b\x25\x9e\x94\xee\x83\x81\x6d\x1c\x19\x78\xa5\x5\x56\x4d\x0\x93\xb2\x84\x77\xaf\x2e\x18\x7b\xd2\xf1\xd1\x23\x69\x32\x98\x73\x8c\x5b\x70\xac\x8d\x6a\xb\x30\x3e\xd3\xd9\xe6\xf6\xf0\xd\xf9\x20\x72\x50\x68\xd5\x5e\x99\xf7\xa1\xbe\x89\xca\xa9\xcc\x33\x92\x87\xc9\xb1\x9\x1f\x48\x11\xba\x8\x12\xc6\x22\x53\x71\x90\xb3\x7d\x1b\xb8\x45\x4c\xc2\x9a\x15\xdd\x7c\xb4\x55\xdb\xdf\xfc\x60\x3f\xef\x9d\x3c\x4b\x65\xc3\x13\x51\x4\xb9\xbc\x7\xd0\x97\x66\x8e\xec\x46\x54\xbd\xce\xe3\xe\x88\x8b\x16\x2c\xb5\xd6\xa3\xfe\x3a\xa2\x52\x5f\xe0\x9b\x36\x27\x3\xf5\xe9\xf8\xc\xd7\x28\xe2\xc0\xae\x86\xc4\x6c\xaa\xa6\xcb\x58\x61\x39\x1a\x7a\xab\x9f\x47\x34\x38\x2b\xde\xb6\x1\x2d\x1e\xff\x7f\x5a\x59\x4f\x76\x63\x2\x17\x21\xb7\xf\x14\x37\xfb\x49\x75\xda\x3d\xfa\x9c\x1d" }, - { 0x544a28, "\x5d\x70\xed\x8d\xab\x3e\xdb\x57\xbc\xf6\x88\xde\xd5\xa1\x80\x2e\xb0\x29\xf1\x41\x9f\x27\xc2\x5b\x1a\xd8\x61\x97\x2a\xcf\xa\x17\xf3\x18\x77\x8\x42\xbb\x2f\x94\x21\x25\x1f\xc\xb8\x3d\xa8\x87\xa7\x71\x0\xd7\x45\x36\x7a\x4a\xca\xf5\xad\x60\x9d\x83\x40\x84\x56\xe\x4\xd1\x2\x96\x73\xe6\xaf\x35\xbe\x95\xc7\x1\x81\xeb\xb5\x7f\x51\x43\x52\xaa\x50\x22\xb9\xda\x54\xea\xd\xa0\xcb\x6f\x4c\x6e\xa5\x31\xdc\xce\xd9\x7b\xb4\x7c\xb\x85\x8b\xae\x12\x2c\x4f\x34\xdd\x6b\x2d\x6a\xfe\x63\xd3\xfc\x3\x20\x6d\xf0\xe5\xc3\x19\x62\x72\x1c\xb3\xc4\x65\x9c\xee\xd6\xfd\x76\xe9\x11\xa9\xe7\x2b\x46\xbd\x78\x89\x13\x9b\xcd\x15\x99\x9a\x69\x3f\x7\x6\xcc\x37\xf4\x98\x9e\x30\x47\x6c\x3a\x23\xe4\x66\xe8\x79\x3c\x5e\x14\x91\xb7\x8c\xfb\x8f\xc0\x3b\x7d\xe0\xa4\xfa\xc6\x4d\x90\x82\x44\x5\x67\x7e\xd2\x49\x64\xc8\x74\x8e\x32\xf9\x10\xff\x5a\x48\x5c\xc9\x92\xac\x16\x68\xd0\xef\x1e\xf\x24\x58\xbf\xb2\x55\x1d\x59\xe2\x33\xb1\xa6\x86\x4e\x4b\xc1\xe1\x39\xa2\x9\xba\x75\x5f\x38\xf8\xec\xdf\x53\xb6\xe3\xc5\x26\xa3\x1b\xd4\x93\x28\x8a\xf7\xf2" }, - { 0x547670, "\x41\x55\xc1\xa3\xdf\xde\xf4\x5c\x1\x2e\xa8\xf0\x1f\x4e\x38\xf6\x9d\x24\x1a\xb3\xcc\xcf\x7e\x9a\x60\xd2\xed\xe1\x42\x92\xe\x6b\x39\x57\x8f\xad\xfa\x5f\xfd\x48\x8a\x4c\x73\x64\x7f\xf9\xbc\x77\x6a\xd0\xe7\x47\xd6\xa6\x13\xf7\xd1\xb2\x3b\x49\xbb\xbf\x19\x3e\xb9\x58\x6c\xcb\x32\x5b\xd9\x8\x2b\x86\x90\xa0\x2f\x36\xe8\xbe\x6f\xa\x44\xfb\x8d\xeb\x9f\x4\x75\x82\x72\xb6\xaf\x3\x2c\xfe\xae\xf8\x27\x4b\xf5\xcd\xb0\x4a\x35\x3d\x5d\x2\x7c\x10\xba\x2d\x76\x74\x4d\x21\x65\xdd\x98\x17\xca\x33\xd\x88\xc2\x96\xdb\x84\x53\x1e\x80\x1b\x7b\x5e\xb8\xb4\x3f\xd8\x1d\x56\x99\xec\x52\xc7\x70\xc3\x7a\xc\x34\x25\x5\xa5\xda\x16\x26\x54\xf3\xe0\xd4\x85\xbd\x9c\x68\xac\x8e\xe6\xd3\x87\xa2\x8b\xa1\x15\xb5\x78\xb\x0\x66\xea\x50\x79\x59\xaa\x22\x2a\x29\xc4\x7\x12\xee\x69\xf\xf2\x3c\xc6\x7d\x28\x9e\x6d\xc9\xe3\x20\xa9\x40\x94\x63\x71\x46\xff\x23\x4f\x14\xd5\xc5\xa7\xf1\x31\x67\x95\xe4\x93\x89\x11\x6\x91\xef\x8c\x6e\x62\xab\x51\x9\x5a\xdc\x83\x1c\xb1\xe5\xe2\x9b\xd7\x61\xb7\xc8\x3a\x43\xc0\xe9\x97\x81\x18\xce\x45\x30\xfc\xa4\x37" }, - { 0x5480c8, "\xa0\xee\x48\xc3\x70\x1d\x44\x7f\xad\x27\x74\x5c\xe0\x71\x7a\x1a\x5a\x6c\x9d\xef\x28\x88\xa4\x89\xed\x75\x67\x22\x79\xd1\x6d\x1\xc6\x25\x7c\x31\x43\xa2\x66\x10\xac\x4b\x9\x1b\xcc\x3c\x32\xb\x8e\xe4\x60\x73\xf2\x8f\xfb\x47\x9a\x4e\xc0\x55\xd5\x91\x46\x59\xfa\x7\xa3\xbd\x78\xb7\xf\xec\xcd\xa7\xc8\xd4\xe5\x64\x12\x8d\xbb\x7b\xf6\x1e\x9c\xa9\xcb\xbf\x30\x11\x2a\x83\x37\x3a\xc4\x87\x5b\xb9\x6f\xf5\xae\x40\x50\x39\x7e\xb2\xe3\x5\x8c\xf4\xff\x92\x5e\xeb\x57\x77\xb5\x96\xe2\xfd\xba\xb1\x29\x6b\x4c\x51\xf0\x81\x0\x13\xf8\x14\x65\xf7\x3e\xc1\xa1\x5d\x2d\xaf\x69\x35\x3f\xd3\x24\xdf\x1c\x23\xe1\xfe\xf3\xdd\x16\xe6\xd\xb8\xa5\x9b\x9e\x63\x8\x8b\xa\x2f\xf9\x2e\x6e\xb0\x94\xb4\x80\xd8\x4f\x4\x56\xb6\x97\x21\xcf\x93\x3d\x26\x7d\x2\xaa\xd0\x76\xe8\xde\x17\xdb\x86\xb3\xca\xd9\x84\x99\x4d\xc5\xea\x3b\xdc\xab\xbe\x18\xc7\x2c\x3\x6\x68\x4a\x2b\xc9\x62\x95\x82\x85\x33\xf1\x42\xe7\x15\x20\xce\xd2\x58\x49\x98\x45\x41\x5f\xd6\x34\xa8\xda\x8a\x54\x38\xfc\x1f\x19\xd7\xc2\xe9\x61\xa6\xc\x72\x52\x9f\x6a\xbc\xe\x36\x53\x90" }, - { 0x546af0, "\x15\x4f\x74\xa6\x26\xb3\xce\x55\x94\x77\xb4\x93\xba\xbc\x7d\xd4\xec\x2a\x79\xa2\x70\xbf\x14\x4c\x35\x4\xd7\x85\x6c\x0\x11\xf6\x69\xb8\x2\xa7\xc4\x6a\x58\x92\x39\x25\xe6\x9d\xa5\xa\xc7\xaa\xda\x36\xb5\x2d\xeb\x86\xa0\x12\x99\xb1\x9c\x34\xcc\xb7\x59\x62\xf0\xcd\x9f\x17\x8a\xca\xc3\xa3\x7\xf3\x57\x41\xe5\x88\xfb\x97\xde\xd1\x1\x24\x43\x68\x90\xa8\x4b\x72\xee\x80\xfa\x52\xf2\xe7\xf\x6f\x22\x5f\x37\x2c\x98\x73\xb2\x3a\xf8\xc9\xd0\x1c\x87\x66\xab\x5d\xf9\x9b\xb0\x32\x61\xa1\xe0\x29\x9\x31\x45\x2f\x2b\x30\x8d\x5b\x5e\xa4\xc5\x3\x51\x16\x1a\xe4\x4a\xc\x18\x1b\x6\x4d\x7c\x82\xef\x19\xb\x8c\x3f\xb9\x13\x53\xd2\x6d\xb6\x81\x64\xc1\xdd\x95\xdb\xc2\xe8\x46\x60\x8\xe1\xaf\x50\x1f\x1d\xea\xd5\xdc\xcb\xd\xdf\x83\x49\x8e\x2e\x44\x67\xff\x8f\x76\x63\xf7\xe9\x3e\x10\x47\x1e\xd6\x21\xf1\xa9\xac\x33\x89\x7b\x23\xbb\xf4\x20\xd9\xfd\xcf\x42\xc0\x3c\xc6\xe\x40\x5\x7e\x56\x7a\x38\x28\xf5\x48\xe2\x4e\x71\xbd\xc8\x5c\xed\x6e\x96\xae\x8b\x9e\xfc\x3d\x9a\x78\x5a\xfe\x91\xad\x65\xbe\x27\x84\x3b\x6b\xe3\x7f\x54\xd8\xd3\x75" }, - { 0x546bf0, "\xc5\xb4\xfe\x62\x85\x73\x6d\xa3\x55\x60\x8\x7\xa4\x84\x2f\xcd\xaa\x5a\x36\xd6\x8a\xc\x89\x9c\xa6\x43\xc2\x13\xec\x9\x2c\x16\x52\x63\x81\xf\xed\x1b\x42\xf4\x66\xb6\xfc\xdb\xe7\x1e\xd8\xd5\x29\x5e\xe1\x57\xb0\xb5\xb\x70\xe8\x1\x3b\xde\xd4\x3\x1c\xbf\x5b\x27\x24\x34\xd\xbb\x5d\x39\xbc\xf8\x5c\x4\x3d\x47\x2\xe5\xf2\xdf\xe6\xc4\x95\x7a\x77\x3c\xa0\xff\x6b\x32\x38\x8b\x1a\x7e\x14\x26\x67\xc0\x58\x50\x64\x35\x18\xe2\xd7\x3e\x74\x2d\x41\xb7\x8e\x17\x11\xca\xc7\xd1\xdd\xcb\xd0\x90\xee\xeb\x72\x4e\x53\x80\x68\x4f\x56\xbd\x86\x76\xb2\x6f\x3f\x10\xe4\xba\xfb\x44\xc6\x5\x75\x48\x30\x9a\x19\x8d\x4d\xbe\x7f\xa1\xfd\xab\x9b\xa8\xaf\xf3\x9f\x4c\xad\xef\x8f\x2b\xf0\x31\xe3\x0\x21\xa\x2a\xf5\xc9\x23\xc8\x22\x79\x12\x78\xae\xac\x9d\x3a\x40\xf1\x93\x7b\xa9\x54\x20\x88\xe9\x45\x92\xea\x99\x7d\x6c\xd2\xcf\x6e\xc3\x82\xda\xb1\xd9\xe\x6\x94\x8c\x96\x46\x5f\xd3\x7c\x98\x9e\xb9\xf7\x69\x87\xce\x6a\x83\x28\xa5\xfa\xcc\x4a\x59\xa2\x1d\x61\xf9\x65\x37\xb3\x25\xa7\x91\x71\x1f\xf6\x2e\xb8\xc1\x4b\xdc\x15\x33\x97\x51\xe0\x49" }, - { 0x544d20, "\xaf\x3a\xa1\x82\xc\x76\x4d\xed\x6a\x13\x70\xc9\xc0\x32\x7a\x63\xd\x6f\xca\xb5\xdd\x69\x8b\x83\x59\x62\x2b\x98\xa9\x60\x51\x34\xa0\x75\x8f\xef\x1e\x44\xab\x54\x9f\xbc\x4\xb7\xf1\x9a\x68\xf2\x28\x3f\xfd\x87\xfc\xb2\x10\x55\x11\x17\x47\x26\x48\x52\x4f\x25\xaa\x5c\x6c\x1c\x39\x8\xa6\x1d\xb3\xfa\xd4\xe7\x37\xa5\x8c\x22\x58\x24\x8d\x23\xad\x31\xe5\xbd\x1a\x53\xa2\x79\x71\xbf\x7\x67\xc7\xcd\x3e\xdf\x14\x21\x7b\x6b\xea\x4c\x49\x9b\x1b\xe4\x7f\xff\x29\x4b\x5d\xe9\xa8\x65\x77\xf3\xa\x6e\xd1\xe2\x89\x96\x38\xf4\x80\x3c\x6d\x2e\xc5\xc1\xf7\x92\x2c\x1f\x20\x41\x36\x2d\x12\x42\x78\x43\xce\xcf\xf\x7d\x90\x0\x5a\x30\xc6\x81\xd9\xf8\x4e\xeb\xd0\xbb\xa4\xae\xd2\xde\xe8\x5f\x9d\xd8\x27\xe6\x19\x9c\xec\x2\x74\x35\xba\x84\xe1\xb\x3b\x5\xfe\x4a\xfb\xb0\xcb\x97\xf0\x64\x86\x99\x91\x3\xbe\x45\xa3\xda\xb6\x95\x2f\xd6\xf6\xc8\x73\x33\x56\xf5\x15\xa7\xc3\x18\xd5\x8e\x93\xee\xc2\x50\xf9\x46\x7c\x6\xe3\xdc\xd7\xb4\xd3\xcc\xdb\xb9\xb1\x57\x94\x66\x85\xb8\x5b\x3d\x72\xe\x88\x40\x7e\x9\x1\x5e\x9e\x2a\x16\x61\xe0\xac\xc4\x8a" }, - { 0x544e20, "\xd7\x3b\xe0\x11\x7a\x3\xca\xc9\xdb\x34\x4a\xc8\x24\x45\x7b\xc\x61\xf9\xcb\xc4\xad\x3d\xea\xaf\x7e\x63\x8f\x66\x2a\x21\x2c\x94\xb5\x72\xb2\xc0\x30\x77\x2f\x51\x91\x6\xf8\x25\x49\x1c\x74\xff\xdf\xbd\x71\x80\x81\x2b\xe1\x0\x4d\xda\x67\x35\x29\xf3\xc1\x89\x46\x32\x7c\x69\x3e\x1b\xf0\xab\x42\x9d\x26\xc5\x20\xb8\x6e\x12\x90\xd\xa\x5f\x23\xf5\xb9\x5e\x8b\x2\xe6\xe3\xf\x6c\x13\x65\xc3\x1f\xd9\x92\xde\x16\xc7\xd8\x75\x2d\x76\x3f\x6b\xc6\x70\xa1\xee\xa0\xed\x47\x4b\xef\xe\xbb\x9c\x9e\x31\x55\x6d\x8c\x79\x60\xa5\x2e\xe9\x37\x83\x40\xcd\x36\x84\xfd\xce\xb6\x57\xa3\x14\xf2\xeb\xdc\x4c\x28\xcc\x15\xd2\x4f\x1a\x5b\x1\x6a\x50\xcf\x8d\xfe\xb0\xbe\x5d\x44\xb\x59\xd5\xd3\x33\x3c\x5a\x27\x6f\x58\xa9\x96\xb7\xd1\xf7\x5c\x68\x8e\x19\x88\x86\xa6\x1e\x7\xa7\x53\xa2\x4\x10\x54\x7f\xf1\xbf\xbc\x3a\xac\x62\x4e\x8\x99\xd0\xe4\x48\x5\xe5\xfc\x98\x9\xf6\xa4\x1d\x9b\xa8\x56\xdd\x41\xb4\xb1\xfa\x97\x52\x9a\xe2\xfb\x95\x85\xc2\x38\xd6\x8a\xaa\x39\x43\xba\x87\xe8\xf4\x22\xae\x17\xd4\x93\x82\x73\x18\xec\x78\x64\x9f\xb3\x7d\xe7" }, - { 0x546fd8, "\x40\x2d\xc5\x23\xcb\xf8\x99\x7b\x3b\xae\x91\xa6\xb8\x0\xb0\xe8\x50\x9d\xd\xaf\xd8\x1b\xd1\xe9\x9c\xc0\xc\xcc\x10\xc3\x53\xe0\xd0\x8a\x9\x2b\xb1\x47\x2\xb9\xce\xc4\x3c\xa5\x36\x1\x86\x94\x7f\x72\x7e\x2e\x17\x78\x62\xc8\x3a\x6\xd7\x32\x64\xea\xbb\x18\x8c\x1d\x66\xa9\x58\x8e\x84\x7c\x75\xcd\x45\xc9\x9b\xbf\x4d\x76\x1e\x1c\x49\x44\x3d\xef\x39\xa2\x3\x37\xdb\xbd\x5e\xbe\xf2\x6d\x67\x6c\xd5\x6b\xf\xf5\xd9\x33\x54\x2a\x82\xf6\xbc\xfd\xda\x13\x92\x68\x16\xed\x70\x9f\x5d\xeb\xec\xfc\xfb\xa3\x6e\x90\x5b\x98\x5f\x8f\xe4\xe\x15\xf4\xb5\x3f\x63\x35\x59\x85\x8d\x9e\x5\xb\xa8\x65\x60\xad\x8b\xb6\x8\x41\x12\x80\x1f\x93\xe5\x7d\x88\xa4\x4b\x89\x6f\x25\xdd\xe2\x30\x57\xf0\xac\xe1\x28\xa7\x97\xde\xee\x6a\xc1\xf7\xc7\x55\xd4\x61\x24\x51\xf9\xca\x2f\xe7\x4c\xb7\x4\xe6\x96\xe3\x11\xdf\x43\xcf\x42\xab\xb2\x83\x79\xc6\x52\xdc\xaa\xb4\x7a\x34\x4e\x26\x20\x5c\x19\xa1\xd6\xba\x48\x56\x2c\x9a\xf1\x4a\x46\x74\x5a\x95\x77\xf3\xb3\x71\x27\xd2\x73\xfa\x87\x7\xa\xd3\xa0\x29\x3e\x81\xff\x1a\x38\xc2\xfe\x14\x69\x21\x22\x4f\x31" }, - { 0x5470d8, "\x13\x32\xf2\xee\xb5\x4b\x96\xd\x64\xb2\xc\xb0\x2f\xc0\x73\x53\xbe\x4d\x4c\xbc\x6f\xd8\x95\x4f\xe0\x6b\x24\x39\x63\xbb\x2b\xc7\xb3\xf4\xf7\x86\x7c\xa6\x23\x2c\x70\x52\xbd\x8b\x48\x80\x98\xb8\xf0\x56\xed\x91\x35\x65\xc3\xd3\x62\x60\xb9\x88\x31\xe1\x37\x1b\xac\x6e\x9e\x55\x1\xea\x4a\x42\xe8\xd9\x2a\x99\x61\x3f\xe2\x68\x58\xcd\x6\xa5\xa7\xd1\x1a\xae\x20\xca\x81\x5\xc5\x3e\xad\x66\x7b\xdc\x12\xa0\xa3\x74\x0\xa8\xb\x19\xfd\xb7\xdb\xb4\xcc\x9d\x3d\xf3\x5f\x5b\x72\xaf\x87\x92\x44\xff\xd4\xc8\x76\x8e\x5d\xd5\x3b\x22\xa9\x36\x47\xf9\x18\x15\x25\x4\x83\xc9\xda\xd7\x4e\xe5\xe4\xfe\x33\xd0\xa2\x5a\x7f\xc1\xf\x1d\x2e\x8a\x8f\x50\x27\x9f\x57\x1e\xeb\x6d\xf6\x54\x59\x49\x9c\x7e\xcf\x28\x93\x45\xec\xab\xaa\xbf\xa\xd6\x78\x41\x7d\x77\x26\x46\xb6\x2\xe3\x3a\xfb\xe\x8\xcb\x51\x82\x9a\x40\x84\x9\x5e\xfc\x7\xef\x21\x14\x2d\x71\xf5\x67\x85\x29\xb1\x30\x7a\xde\x90\x1f\x3\xf1\x3c\x75\xe6\x79\x11\x94\xc2\x16\xba\x97\xa4\x10\xdd\x1c\x69\xc6\xa1\x8d\x5c\x6a\xf8\xe9\x43\x34\x6c\x17\x8c\xfa\xc4\x38\x89\xce\x9b\xdf\xd2\xe7" }, - { 0x546970, "\xe1\x9a\x3f\x1a\x1e\x5d\x57\x52\x34\xd5\x1d\x93\x35\x76\x92\xf7\xea\xb9\x5c\x3a\xe3\x1f\x70\x9b\xc\xf\xd2\x8e\x30\x4c\x4f\xb0\xb7\x8b\xfb\xaf\xd3\x58\x8\x38\x36\xa5\x0\x2c\x45\x3e\xa7\x4a\x32\x37\x2b\x56\xfe\x90\x51\xc1\x7\x6e\x23\x3b\xbc\x95\x15\x86\x16\x5a\xd0\x2e\x4e\xdd\xd8\xe5\x6b\x7d\xfa\x75\x18\x29\x7c\x48\x68\xb3\xf1\xd4\x8d\x63\x20\xba\x98\xad\xa9\x6\xfc\xb5\x84\x67\xc4\x4d\x9c\x7b\x17\xb6\xfd\x91\xcb\xe\xbb\x60\xe9\x99\x49\x83\x5\x8a\xdc\x66\x24\x21\xcc\x54\x28\x78\xd7\x7f\x2d\xcf\xca\x97\xed\x5b\xc5\x59\x94\xbd\x47\x40\x25\xde\x6d\x3d\xe4\x44\xe2\x6c\x1b\xce\x22\xb\x43\xc0\x7a\x2a\x73\x53\x31\x39\x11\x14\x3\xe7\xb2\xef\x2f\x77\x74\x88\xb1\x8c\x4\x72\x7e\x10\xee\xa4\xf5\xf8\xb4\x85\xe0\x41\x87\x9e\xeb\xc9\x50\x96\xd6\x13\x9\x26\x12\x80\x5f\xa8\x3c\xf3\x89\x46\x4b\xf4\xae\x27\xc8\xc7\x61\x82\xb8\xa3\xa1\xe6\x69\x5e\x2\xec\xab\xc3\xd1\xda\xbe\x79\xe8\x9d\xd9\xaa\xdf\xf6\xa0\x62\x8f\xac\x6f\xa6\x71\x81\xa2\xf0\x33\xa\x1\xf2\xc6\xdb\xf9\xcd\xff\x9f\xd\xc2\x64\x65\x55\x42\x1c\x19\x6a\xbf" }, - { 0x5467d8, "\xf0\x36\x69\x25\x6b\x37\xee\x56\x5d\x85\xc4\x8b\xc6\x2\x62\xe4\x70\x48\x41\x91\x9d\x38\xff\x55\xfa\x3c\x89\xe6\x73\x30\xa8\x2d\x59\x3e\xec\xf1\x2b\xc9\x9e\x87\x84\x78\x9\x3b\xcd\xb0\xe2\xd9\x31\xf\xfc\x82\xc0\xce\x50\xe3\xbc\x79\x3\x67\x72\x9b\x32\xc1\x7a\xd\xa3\x65\xf2\xd6\x97\x6d\x93\x6f\x83\xab\x11\x74\xc3\xbf\x1f\x6c\xb1\xd8\x64\xb5\x19\xdc\x2c\xac\xe\x8\xb8\x76\xcf\x26\xbb\x6e\x51\x99\xa4\x9c\x53\x4\x88\x3d\xa1\xaf\x9f\x47\x7e\xe5\xd1\x52\xf7\x18\xd7\x15\xf3\x95\xd5\x1a\x86\x68\x8f\xba\x77\xc2\xf9\x5a\x90\x46\xe0\x61\x60\x2a\xef\xdf\x12\x1d\x5c\x7\x21\x34\x9a\xb3\x57\xb4\xe7\x1c\x4c\x35\xa2\xf5\x7b\x5b\x1\x8d\xda\x42\x71\xad\xc8\xf4\x13\x4d\x63\xb6\xfb\xbd\xed\x4f\x8e\x75\x16\x20\x28\xd4\x3a\x8a\xdd\x49\x14\x10\xa0\xde\x4e\x96\xdb\xb\x40\x7f\xcb\x80\x4b\xc\x5\x1e\x24\xfd\x44\x5e\xc7\x17\xae\x7c\xb2\x22\xd3\x92\x8c\x98\x81\x0\xb9\x27\xa7\x58\xb7\xa5\x29\x54\x4a\x6\x45\x1b\x6a\x3f\x23\xf8\xe9\xaa\xca\x66\xc5\x2e\x43\xcc\xfe\xd2\x33\x2f\xa9\xe1\xe8\x7d\x5f\xa\xbe\xf6\xd0\xea\x94\xeb\xa6\x39" }, - { 0x546690, "\x34\xa1\x39\xaf\x83\xdd\x8b\xb9\xe3\xd3\x61\x77\xc\x52\x66\x5d\x31\x4\x9d\xb7\x6e\xeb\xb\x9b\x19\x2a\xb3\x7c\xe6\x53\xfc\x48\x1d\x68\x69\xed\xf8\xcb\xf1\x17\xb8\x84\xc5\x9c\x6c\x49\x97\x78\xa6\x18\xf7\xdc\x7a\x2d\x65\xd\x26\x56\xb4\xa2\x3\x93\xe9\x1c\x82\x14\x6f\xee\xd2\x74\xac\x62\xc0\x7b\x8f\xd7\x20\x35\x21\xe1\xa0\xcf\xcc\xc3\x67\x80\x55\xfe\x70\x4e\x58\xc8\x27\x0\x36\x5\xe0\x1f\x6d\x51\xd8\x25\x89\x2\x2c\x85\xde\x76\x81\x4d\x11\x9e\x2b\xe5\xcd\xda\x3b\xbd\x92\xc4\xdb\xf6\x46\xbb\xba\x75\xb6\x71\x7e\x79\x1b\xfa\xea\x64\xc1\xa9\x8c\x59\x5f\xe7\x90\x63\xb5\x5c\x98\x6b\x9f\xae\x5e\x7d\xad\xc6\x7f\x8d\x15\x6\xc2\x38\x43\x5b\x73\xa3\x96\xec\x3e\xe2\x99\x94\x1\x54\xca\xf9\x8\x24\xd0\x4f\xef\xf\x3a\x13\x72\xe8\xe4\xb0\x3d\xfd\x4c\x44\x5a\xf0\x60\xa5\xa7\x40\x88\x8a\xf4\xaa\x9\x4b\xf2\xd4\xbc\x12\x1e\x47\x41\x6a\x86\x45\xd6\x2f\x37\x50\xbe\xab\x91\xf3\x22\x8e\x95\xb1\x28\x87\xb2\x7\x3f\xdf\x16\xa4\x4a\x57\x33\x30\x23\xbf\x3c\xd9\x42\xc7\xff\xa\xf5\x29\xd1\x2e\x1a\x32\xfb\x9a\xc9\xe\xce\xa8\xd5\x10" }, - { 0x546548, "\xab\x48\xd1\x4b\xbe\x95\x99\x9\x10\x36\x91\xe\x4c\xe7\x14\xb\x96\x16\xb4\xdf\x75\x20\x80\x7f\x74\xb3\x47\x12\xf6\xb2\x4\xca\x44\xe8\x42\x9c\xd5\x86\x30\xe0\x1d\x1e\x28\xe2\x81\xde\x2a\xa2\x45\xf0\xaa\xcc\x5f\xe6\x63\x64\xd9\x1f\x70\x49\xe1\x85\x7c\xf2\xc5\x88\x9e\xb7\xba\x9b\x17\x6e\x82\xd3\x69\x3d\x6\x1\x68\x11\x71\xf7\xd8\x24\xb6\xc7\x67\x50\x7e\x9f\xfc\xe4\xf5\xbb\x55\x7\xeb\x3c\x13\xc\x4d\xd4\x25\x23\x56\xa0\x6d\x5e\xc8\x84\x61\x8f\xdc\x2\xbd\xbc\x6f\xcd\xf3\x6c\x92\xfd\x3e\x21\xed\x1c\x6b\x79\x59\xec\x41\xac\x2c\x58\x8d\x89\x35\xaf\xda\xb0\xd6\x22\x5d\xc3\xd0\xa\x1a\x2e\x43\xe9\x7d\x52\x5c\x34\xa9\xd7\x60\xb9\x53\xee\x39\x3b\xc9\xe3\xae\xdd\x4e\x57\x8e\xf8\x19\x46\xa6\x3f\xb8\x90\x8a\xc1\x33\x4f\xea\xff\x51\x2f\x66\xc6\xf\xef\xa7\x7a\x9a\xdb\x94\xd2\xfa\xa5\xd\x8c\x18\x77\xad\x87\xc0\x54\x32\x31\xa3\x38\x62\x37\xf4\x93\x98\xf9\x83\x40\xce\x15\x1b\x3a\xfe\x3\xfb\x6a\x8b\x27\xf1\x9d\x73\x5b\x65\xe5\x7b\xb5\x4a\x8\xc2\x72\xbf\xa8\xc4\x76\x29\x26\xa1\x2b\xb1\xa4\x0\x78\xcf\xcb\x5a\x5\x2d\x97" }, - { 0x545c58, "\x6\x15\x2e\xa6\xed\x8\xdb\x7b\x2a\x85\xcb\x50\x31\xf5\xb4\x63\x53\xc2\x6e\x91\x92\xe6\xaf\x68\x41\x61\x74\xf3\xbb\x23\xe4\x6a\xf8\xbc\xfe\xee\x93\x90\x6f\x5f\x8a\xf9\x81\xae\xe7\xad\xd0\x59\xcd\x57\x5b\xa5\xbe\x30\xc8\x39\x79\x35\x64\x3a\x6c\x73\x29\x13\x1c\x3c\x2d\xfa\x32\xa7\x71\xe5\x6d\x4d\xa1\x99\x51\x1d\xea\xaa\x67\x96\xe8\x98\xe0\x58\x5d\x8f\x49\x9e\x20\xb\xc6\xeb\xb5\xe\x7a\x4\xc5\x34\xc1\x1b\x77\xf6\xb3\x18\xd4\x47\x9a\x87\xca\x3d\x37\x21\x5\x3\xf2\x83\xa9\xce\x8c\xac\xd3\x9\x8d\xba\xe3\xd8\x4f\x24\x72\x36\x86\xb2\xcc\x69\xfc\x75\x9b\xd5\xd\x4c\xc3\x56\x25\x9c\x5e\x6b\x2b\xb1\x22\x60\x7\xd1\xdc\x8e\xf0\x4b\xb0\x97\x1e\x88\x27\x7c\xd7\xa0\xdf\x43\x1f\x5a\x54\xcf\xa\xa3\xd6\x78\x28\x66\x26\x89\xbd\xb6\x94\xc9\x2c\x95\x1a\x5c\xd2\xb7\xb9\x48\x17\x44\x70\xc7\x80\x52\x40\x11\xc4\x4e\xab\xda\xf\x45\x7e\x3e\x7f\xde\xbf\x1\xa2\x7d\xc\x55\xc0\x84\xa8\x65\x3b\x46\x2f\x62\x82\xef\x33\x76\x10\x14\xe2\x9f\x38\xf4\x42\xe1\xa4\xfb\xff\xfd\xec\x3f\xf1\xd9\xe9\x4a\x8b\xdd\x2\x9d\xb8\x0\x19\x16\x12\xf7" }, - { 0x545aa0, "\x93\x1a\x38\x7a\xa7\x8c\x82\x3b\x40\x4d\x17\x1\x33\x4b\x7c\xe9\x7f\x41\xcc\x62\xc4\xf2\x70\x2f\x2\xe8\x86\x81\xce\xfe\xab\xdc\xad\x30\x4\x6e\x55\xff\x59\xbd\xf5\x23\x2d\x5b\x98\x13\x52\xc7\x7e\xaa\x1e\x4c\xfb\x95\xa8\xf0\x47\xf6\xea\xa2\x1c\xfa\x1d\xe3\xcf\xd9\x12\x57\xc0\x49\x0\xbb\x68\x7d\x3d\x3\xfc\xc1\xd7\xd2\x3c\x91\xae\xa5\xbe\xb2\x51\x69\xd8\xee\xb5\xdd\xf4\x6b\xd3\x4a\x65\x8b\xaf\xde\xe2\x36\x66\xd4\xa9\xc5\x94\x46\xc3\x6\xd0\x73\x87\x27\x9a\xb6\xdb\xb3\xa6\xe0\xe6\xc9\xd\x28\x21\x60\x97\xf8\x71\x2a\x2e\x3a\xfd\xcd\x67\x63\x72\x54\x9f\xf7\x9c\xef\x9\xca\x32\x5\x37\xac\x8a\x96\xe7\x7b\x2c\x4e\xa3\x29\xdf\x31\x84\x20\x8f\xc2\x44\xf\xb7\x39\x76\x6d\x5e\xd6\xbc\x74\x9e\x5f\x78\x64\x99\x92\x6f\x42\x43\xf3\x77\x6c\x79\xb1\xa\xbf\xa1\x9b\xf1\x15\x34\xeb\x88\x50\xc\xe4\xb4\xec\x19\x7\x18\xba\x75\x6a\x48\x22\x3f\x8d\xb\x8e\x89\x5d\xc8\x11\xc6\x61\xda\x5a\xd1\xa4\x8\x10\xf9\xb8\xe\x85\x9d\x45\x56\xe1\x26\xd5\xcb\x1b\x5c\x24\x2b\x25\xb0\x83\x16\x53\xb9\x90\x80\xed\x35\x3e\x1f\x4f\x58\xe5\xa0\x14" }, - { 0x545d78, "\x28\x45\x39\x3a\x7e\x23\xae\x4c\xe5\x44\x3\x6c\x9a\xe3\xf8\x6d\x29\x79\x12\x48\xaf\x84\x19\x33\xf2\x94\x40\x9\x8\x56\x64\xa\x1\x5e\x34\x30\x95\xd5\x5d\x2b\x7b\xa1\xcd\x75\xf6\x61\xb4\xc6\x99\xe9\x1c\xde\x59\xb6\xe\xd3\xe7\xa9\xce\x5b\x15\xc8\xe8\xc5\x71\x42\x26\xa8\xb\x68\x3c\x70\x87\xc0\x5c\x20\xa3\x1d\xed\xd2\x91\xbc\x4a\x53\xfc\xb1\xbf\xc9\x37\x74\xb3\x69\x36\x5a\x32\x6e\xa6\xc4\x96\x10\x6b\x82\xbb\xe0\x93\x51\x3b\xe2\xd9\x98\x88\x47\x57\x63\xba\x1e\x4d\x8d\xb0\xa0\x22\x9d\xff\x3f\xab\x2\x9e\x41\xf\xf9\x8a\x76\xfb\x6\x6f\x14\xcb\x24\x90\xaa\xb8\xdc\x81\xfe\xb5\x83\x2c\x4\xc7\x55\xfa\xa2\xee\xc\xef\xbd\x5\x5f\x2f\x2e\xa4\xc2\x11\xf4\xe4\xf0\xcc\xf5\x4f\x92\x43\x4b\x54\xca\x3d\x8f\xb9\x66\x3e\x7a\x13\x46\xdf\xad\x7d\x72\xd1\x65\xdb\x35\xd6\x17\x31\xa5\xf7\x97\xc3\x1f\x73\x38\xe6\x89\x0\x50\xa7\x2a\x8c\xea\xec\x77\xc1\xeb\x8e\x67\xd7\xd0\xb2\x9c\x21\x7\xfd\xd\xbe\x85\x78\xcf\x2d\x86\xf3\x1a\x27\x6a\x80\xac\xf1\xd8\x58\x9f\xb7\x18\x25\xd4\x62\x4e\x1b\xe1\x49\x8b\x52\x7c\x60\xdd\xda\x16\x7f\x9b" }, - { 0x545e78, "\xa2\xb4\xa\xde\x9f\x7f\x85\x5d\xea\x41\x31\x7a\xae\x71\xd0\x1d\x56\x14\xd9\x61\xc7\x59\x69\xbf\x47\xe7\x8c\x29\xd7\xf4\x86\xb5\x2\x93\x22\x8f\x60\x11\xc1\x95\x4f\x3d\x6b\xcc\xd2\xd\x3f\x3a\xdb\xf9\xf0\x8\xb9\x4e\xb\x65\x43\x5a\xce\x4d\x91\x49\x2e\x5b\x99\x8d\xd5\x3e\xe1\x4a\x9c\x38\x78\x77\x7d\xbe\x4b\xfc\x3\x35\x33\x5\xe9\x45\xb6\x1c\xf\x2d\xaf\x53\x57\x54\xc0\xab\xfd\xa9\xcd\x12\x81\x39\x70\xc3\xff\x94\x0\x98\x96\xf5\x79\x20\x6d\xf7\x7e\x88\xf3\x5f\x75\x73\x15\xc5\xb2\x52\xda\x9e\xa5\xc4\x36\x25\xc\x7c\x42\xee\x1e\x6a\x66\x8a\x8e\xbc\xd6\x44\x74\xe8\x10\xa0\x5c\x26\x1\x68\xd4\xa7\xe3\xbd\x3c\xbb\x28\x24\xdd\xf1\x18\x27\x30\x6f\x4c\xdf\x9a\x8b\xa1\x46\xe4\xcf\x4\x67\xd1\xac\xdc\x76\xf6\x34\xa4\x80\x89\xe0\xa6\x55\x19\xb3\xad\x3b\xfe\x5e\xc8\x7\x6\x87\xd3\xfb\x6c\xe2\xf8\x6e\x48\xd8\x2b\xef\x2a\xe6\xc9\x63\xa8\x62\xb0\x2f\xc2\x16\x82\xec\x90\x1b\x23\x51\x97\x9\xf2\x7b\xcb\xe\xb1\xaa\xc6\x9d\xfa\x64\xed\xe5\x32\x50\x92\x72\xb8\x9b\x17\x58\x2c\x83\xeb\x84\x13\x40\x1a\x37\xb7\xca\xba\x21\xa3\x1f" }, - { 0x545ff8, "\xd3\x15\xec\xfd\x78\x34\xa2\x0\xbb\x4f\x7e\x3e\x16\x5e\x2f\x2e\x58\x3c\xd9\xcc\x49\x74\x1\xc\x84\xab\xfe\x2c\x93\xc7\x19\xea\x92\x36\x37\x47\x8c\xc6\x2d\x33\x6f\xf9\x5a\xd5\x56\xf\xef\xd1\xbf\xfb\xf6\x11\x7a\xbe\x6c\x57\xd2\x68\x6\xb2\x86\xf4\x89\x4e\x5d\xa\x9f\xb9\x42\x3a\x72\x65\xce\x7\xa8\xd6\x3b\x69\x64\xcf\x9e\x55\x4a\xe7\x1c\x1b\x67\x25\x7f\x38\x1e\x17\xeb\x88\xa3\x26\xa4\x8d\x87\xb7\xbc\x32\xad\xaf\x8\xde\x5f\x3f\xe8\xa9\xf8\x4b\xa5\x61\x79\xc3\x41\xe4\x9c\x83\x3\x21\x75\xb6\x54\xdd\x43\x91\x27\xfa\x66\xd4\x53\xb\x9d\xf1\x5b\x94\x39\x8e\xaa\xc8\x20\xc2\xb8\xe0\xa1\x28\x1d\x4c\xa7\xcb\x90\x6a\xd7\x40\x6b\x29\x13\x5c\x4\x8f\xe1\x9a\x31\xb1\x7c\xe2\x62\x1f\xc9\x10\x1a\xa0\x9\xb3\xe6\xf3\xc1\x5\xba\x82\x71\xc0\xe9\x60\x9b\xf0\x18\x12\x46\x48\xbd\xe3\xb4\xac\x30\xdf\xc5\x8b\xfc\x77\x81\x44\x97\xf5\xf7\x59\x98\x24\x3d\x2\x76\x22\xed\x6e\x2b\xff\xd\xc4\x70\x8a\xe5\xb5\x73\x99\xf2\x23\x52\xd8\xdb\x14\x96\xda\xb0\xd0\x45\x51\xae\xa6\x7d\x50\x6d\x95\xee\x80\x4d\xe\xca\xdc\x85\x63\x2a\x7b\xcd\x35" }, - { 0x546190, "\x96\xef\xf6\x25\x2a\x8e\x6d\xc1\x11\x1d\xb8\x33\x85\xa7\x4c\xc8\x76\xad\x24\x29\xbe\x30\xbf\x54\x5b\x21\xb5\x2f\x51\xde\xca\x74\x9f\x80\xec\xc2\x37\xb9\xe6\xc5\x3a\xe0\xf2\xc4\xd3\x3\xaa\xed\xcb\xc6\xa3\xf4\xe4\xba\x49\xb\x18\x50\xac\xf3\x4e\x64\xe3\x4f\xe\x22\x38\xdf\x94\xc7\xd7\x17\x84\x6c\xb7\xc3\x13\x4b\x47\xb0\x6\xa1\x40\x5f\xa0\x89\xf9\x8a\x3e\xab\x81\x9c\x36\x5\x1a\x62\x8b\x5c\xe8\x7f\x23\xe1\x14\x32\x61\xea\x2\xf1\x5a\x0\x4\x19\xf8\x7e\x7\xa8\x9d\x69\x8f\x1e\x79\xb6\x2d\x59\x6f\xdc\xd4\x8d\x8\x75\x16\x63\x88\x26\x99\x42\xee\x55\x77\xbb\x1c\x1b\xf0\xaf\xbc\xfa\x98\x9e\xc0\xa2\xf\x60\xa\x52\xa9\x2e\x7a\x82\x86\x2b\xce\xf7\x73\x28\xe9\xd6\x4a\x90\x43\x2c\x5e\x8c\x10\x6a\x3b\xf5\xda\x68\x3c\xe2\x91\x56\xa5\x15\xae\xcc\x31\x95\x35\x39\x71\xd0\x7b\x78\xcf\x65\x53\x41\xa4\x6b\x7c\x67\xc\x57\x4d\xfc\xa6\xd\xd2\xc9\x9\xcd\x48\x12\x97\xb4\xfd\x3d\x83\xd8\xfb\xfe\xe5\xdd\x45\x92\x7d\x6e\x1\x5d\xe7\x20\x66\x58\xff\xb3\x3f\x27\xbd\x46\x34\x72\xd5\x1f\xb1\x70\xd9\xb2\xeb\x87\x9b\x9a\xd1\x93\x44\xdb" }, - { 0x546290, "\x35\x7e\xbe\xb8\x37\x3c\x49\x22\xfe\x94\x24\x93\x78\x2\xcf\xdd\xe3\xb0\xe1\x70\xd3\xc3\xaf\x68\x6\x31\xb4\x7\x3d\xeb\x75\x76\x62\x5e\x73\xe6\xbf\x32\xd8\x9e\xdb\xda\x1b\xca\x11\xbc\x2f\x47\x6b\xed\xdc\x86\x64\x90\x65\xd0\xf4\xe4\x39\xa7\x16\x43\x8b\x5d\x61\x8a\x0\xf\xc4\xe9\xb9\x53\xe7\x15\x92\x21\xe0\x6e\xcb\x4a\xfb\x91\x9c\x97\x28\xc8\xd7\xd2\x99\x74\xb7\x4d\x63\x8e\x80\xe\xd9\xa0\x95\x2e\xc9\x7b\x42\x3a\x58\xd\x1c\xce\x84\xc6\x1e\x67\xa8\xc5\x17\x33\xcd\xd1\xdf\x8f\x66\x9f\xc7\x1\x3e\x2a\x23\x5\xb\xf9\x51\x81\x40\xb5\xef\xab\xf2\x5f\x50\x30\x6c\x26\x82\xfc\x60\x83\x3\x3b\x56\xe8\xfd\x18\xb2\x98\xba\x72\x27\xf5\xa1\xaa\x36\xec\x69\x4c\x77\x34\x59\xf3\x38\x9b\x7d\xc0\xa6\x48\xae\x20\xfa\xcc\xd5\xde\xb3\x14\xa4\xa\x5c\xad\x25\x7a\x4e\xe5\x46\x6f\xff\x52\x4b\x1d\xea\x8c\x79\xf1\x9a\x8d\xa2\xc2\xac\x89\x6a\x41\x44\xf8\x57\x9d\x9\x13\x7f\x10\x12\x2d\x45\xee\xa9\xe2\xc1\x3f\x1a\xbd\x29\x19\x54\xf7\xa5\x71\xd4\x96\x7c\x5b\x1f\x87\x4f\x4\xf0\x5a\xb6\x6d\xa3\xd6\xb1\x2b\xbb\x55\x8\x88\xf6\x85\xc\x2c" }, - { 0x546398, "\x2f\x62\x9b\xe4\xee\xdb\x3f\x8d\xd3\xd7\x9c\x32\xd6\x4a\xca\x50\xe1\x8e\x6e\xf9\x99\xc5\x4e\xdf\x46\x5d\xd5\xb7\x6d\xb1\xb9\x7e\xf\xad\x44\x96\x13\x6c\x97\x26\xa8\x9f\x85\xde\xed\x56\xce\xda\xb0\xb\x1c\xb8\x3d\x5a\x1f\xdd\x84\xf3\xcd\x9e\x73\x28\x61\x8c\xbb\x69\x64\x4f\x0\x49\x3c\x75\xc3\x29\x8a\xe2\x4d\xc7\xcb\x10\xd\xe9\x7f\xc4\x60\x1b\x5f\xd1\x45\x42\x93\x59\xe8\x74\xff\x7a\x72\xea\xd4\xa\x3e\x7d\xc1\x31\xa4\x66\x92\xfd\xf6\x6b\x3b\xba\xbc\x19\x6a\x54\x4b\x38\x47\x43\x33\x91\x8b\xe\xae\x4\x76\x4c\xab\xc6\xbe\x36\xd0\xa0\x67\x90\x87\xf5\x9a\x77\xe6\xcf\xb2\x12\x22\x8\x37\x30\xaf\x16\x3\x58\xf1\xaa\x1e\x25\xeb\xf4\x21\xa9\xfe\x27\x83\xdc\x6\x2a\x48\x78\x68\xb4\xa7\x79\x9\x80\x81\xc8\x52\x17\xcc\x2d\x15\x94\x8f\xa1\x14\x98\xe7\xd9\x7b\xb6\x82\x5\xbf\x39\x88\xac\x86\xa2\xf8\xef\x23\x2e\x95\xd2\xa6\xf2\x2c\x3a\x2b\x65\x55\x18\xc9\x35\x57\x24\xd8\xec\xf7\xf0\xb3\x5b\x6f\xfb\x20\xbd\x5c\xfa\x71\x63\xc0\x1d\xe0\x53\x2\xa5\x7c\x51\x11\xb5\xfc\x1a\x5e\x9d\x40\x34\x1\x7\x89\xa3\xc\x70\xe5\xe3\x41\xc2" }, -}; - -static const struct buffer_t type_four_list[NUM_TYPE_FOURS]={ - { 0x55f320, "\x39\x25\x29\x3c\x2b\x3a\x32\x23\x26\x24\x2d\x3d\x35\x2e\x3b\x38\x20\x27\x28\x22\x33\x3f\x2c\x3e\x36\x2a\x30\x2f\x21\x34\x31\x37\x00" }, - { 0x55f340, "\x5f\x4b\x40\x5e\x43\x4e\x55\x41\x5a\x57\x5d\x5b\x51\x4f\x4a\x52\x53\x58\x42\x44\x49\x46\x4d\x47\x48\x45\x50\x59\x4c\x54\x56\x5c\x00" }, - { 0x55f360, "\x7a\x7c\x6f\x6c\x60\x62\x73\x69\x71\x65\x6d\x72\x78\x6b\x64\x70\x74\x7b\x7e\x76\x67\x68\x63\x77\x79\x7f\x61\x6e\x75\x66\x6a\x7d\x00" }, - { 0x55f604, "\x17\xc\x1a\x19\x13\x12\x3\x1b\xa\x7\x1e\x1d\x5\x16\x15\x14\xd\x8\xb\x10\xf\x1\x4\x0\x18\x1c\xe\x11\x6\x1f\x2\x9\x00" }, - { 0x5628c4, "\xd9\xd6\xd5\xc9\xda\xdd\xd2\xdf\xdc\xd7\xc3\xd3\xc8\xc6\xc4\xd1\xca\xcc\xc1\xc5\xd4\xc2\xc0\xcb\xdb\xde\xcf\xcd\xce\xd0\xd8\xc7\x00" }, - { 0x5628e4, "\xf0\xff\xfc\xe4\xfb\xf1\xf3\xe3\xf5\xfe\xea\xf7\xf6\xe2\xe5\xe7\xf8\xe8\xef\xf9\xf4\xeb\xed\xfd\xe9\xfa\xe0\xe1\xec\xf2\xee\xe6\x00" }, - { 0x5628a4, "\xa0\xb0\xb7\xb1\xbe\xbf\xab\xb2\xa6\xa9\xa8\xa2\xb4\xb3\xa5\xaf\xba\xac\xb8\xbc\xbd\xae\xbb\xa1\xb5\xad\xb9\xa3\xaa\xb6\xa7\xa4\x00" }, - { 0x55f6a4, "\xa9\xaf\xb5\xa6\xa1\xbf\xac\xb9\xa0\xb0\xa5\xad\xa4\xbd\xba\xb1\xbb\xae\xab\xb8\xb4\xb2\xa8\xa3\xb7\xbe\xa2\xb3\xaa\xb6\xbc\xa7\x00" }, - { 0x55f6c4, "\xcf\xd1\xd8\xc8\xc2\xce\xd9\xd2\xd6\xca\xc0\xd5\xdb\xcb\xc3\xc6\xd3\xd7\xdd\xdc\xc9\xd4\xde\xc1\xc7\xc4\xc5\xcc\xcd\xd0\xdf\xda\x00" }, - { 0x55f6e4, "\xee\xf5\xf3\xe7\xe1\xef\xfc\xf7\xed\xe6\xe4\xf8\xe8\xec\xff\xf0\xe2\xea\xe5\xe9\xf2\xfa\xf9\xfd\xeb\xfe\xf4\xe0\xf6\xf1\xe3\xfb\x00" }, - { 0x562928, "\x31\x3b\x33\x29\x34\x25\x24\x3d\x23\x28\x32\x27\x3a\x3e\x20\x22\x2b\x2e\x3c\x38\x30\x2c\x39\x35\x37\x2f\x3f\x2d\x2a\x26\x36\x21\x00" }, - { 0x55f744, "\x51\x41\x4c\x5d\x46\x5c\x5a\x43\x49\x48\x5e\x42\x53\x47\x54\x4d\x45\x55\x58\x40\x4b\x5b\x56\x4f\x5f\x57\x4e\x52\x4a\x44\x59\x50\x00" }, - { 0x562884, "\x84\x98\x8a\x88\x82\x92\x8d\x96\x85\x97\x8f\x90\x95\x8c\x80\x9c\x94\x9f\x91\x87\x86\x9d\x9e\x93\x9a\x9b\x8b\x83\x89\x81\x99\x8e\x00" }, - { 0x55f784, "\x96\x9c\x8a\x8c\x92\x81\x82\x84\x95\x93\x91\x9f\x90\x85\x9b\x9d\x80\x89\x8e\x8b\x94\x83\x99\x87\x8f\x97\x88\x8d\x9a\x86\x9e\x98\x00" }, - { 0x55f7a4, "\xb2\xa6\xa2\xaa\xa9\xb8\xac\xae\xab\xb7\xaf\xbc\xa3\xa0\xb0\xa5\xbf\xa1\xb3\xba\xb5\xbe\xb4\xbb\xb6\xbd\xb9\xa7\xa8\xa4\xad\xb1\x00" }, - { 0x55f7c4, "\xd7\xdc\xc0\xdb\xd9\xd5\xc7\xc4\xd4\xd6\xc2\xce\xd8\xc3\xd1\xca\xcc\xc1\xc8\xcd\xc5\xc6\xd2\xcf\xde\xd3\xd0\xda\xc9\xcb\xdd\xdf\x00" }, - { 0x55f7e4, "\xe4\xec\xf1\xf9\xe1\xfc\xe2\xe3\xfb\xe5\xef\xe7\xfd\xf7\xe6\xf8\xf3\xf5\xea\xfa\xe8\xeb\xed\xfe\xff\xf2\xf4\xe9\xee\xf0\xf6\xe0\x00" }, - { 0x55f804, "\x1e\xa\xe\x13\x1b\xc\x14\x10\x8\xb\xd\x18\x2\x1c\x1a\x16\x11\x4\x15\x17\x9\x5\xf\x7\x12\x1d\x1\x19\x6\x3\x0\x1f\x00" }, - { 0x55f824, "\x3c\x39\x32\x34\x35\x20\x3a\x2c\x3d\x2a\x2b\x26\x30\x38\x23\x33\x29\x2d\x36\x3e\x21\x25\x2f\x2e\x37\x31\x28\x24\x22\x3b\x27\x3f\x00" }, - { 0x55f844, "\x57\x4c\x51\x45\x53\x54\x4b\x5b\x59\x49\x56\x47\x42\x4e\x58\x5d\x5e\x40\x5f\x46\x52\x5a\x55\x44\x50\x4d\x48\x5c\x41\x43\x4a\x4f\x00" }, - { 0x55f864, "\x7b\x6b\x7d\x63\x7c\x61\x7a\x79\x71\x6c\x73\x74\x6e\x6a\x68\x7f\x66\x77\x67\x69\x60\x7e\x62\x6d\x76\x78\x6f\x72\x70\x65\x75\x64\x00" }, - { 0x55f884, "\x92\x9c\x98\x8a\x96\x84\x80\x9f\x9b\x97\x93\x8e\x9a\x87\x88\x85\x8b\x94\x86\x8c\x90\x8d\x9d\x91\x82\x89\x8f\x99\x81\x83\x95\x9e\x00" }, - { 0x55f8a4, "\xb8\xa9\xbf\xa3\xb3\xaa\xa2\xa5\xb6\xbd\xa7\xaf\xb4\xac\xa4\xba\xae\xa0\xbe\xb9\xa8\xbc\xa6\xb7\xab\xb5\xa1\xad\xb1\xb2\xbb\xb0\x00" }, - { 0x55f91c, "\x1d\x1e\x1\xc\x12\xd\x14\x8\xe\x15\x9\xb\xa\x18\x1a\x7\x1b\x6\x4\xf\x16\x2\x0\x3\x10\x17\x11\x19\x13\x1c\x5\x1f\x00" }, - { 0x55f93c, "\x3d\x2e\x2f\x35\x37\x25\x3f\x32\x3e\x23\x21\x27\x22\x2d\x3a\x39\x3c\x2a\x3b\x30\x29\x31\x26\x34\x24\x2c\x33\x2b\x20\x36\x38\x28\x00" }, - { 0x55f9d0, "\xcc\xd6\xce\xc0\xcd\xd5\xd0\xde\xdc\xd2\xc1\xc9\xc5\xc8\xc6\xd7\xcf\xdb\xc4\xd1\xdf\xd9\xdd\xc3\xd3\xd8\xc2\xd4\xcb\xda\xc7\xca\x00" }, - { 0x560280, "\x83\x85\x8d\x89\x9a\x96\x88\x90\x86\x9e\x9c\x95\x82\x84\x97\x8c\x98\x8b\x99\x91\x9b\x94\x93\x8a\x8e\x80\x9d\x9f\x81\x8f\x87\x92\x00" }, - { 0x56034c, "\x4d\x46\x52\x58\x5c\x51\x41\x5b\x42\x40\x43\x5e\x48\x56\x49\x4e\x44\x50\x45\x53\x47\x5f\x55\x57\x5d\x4c\x5a\x4a\x4f\x54\x59\x4b\x00" }, - { 0x56036c, "\x70\x74\x60\x65\x69\x6f\x79\x7e\x61\x6e\x64\x62\x75\x6b\x7f\x7b\x72\x71\x73\x7d\x6a\x66\x67\x78\x63\x7c\x6d\x77\x6c\x68\x76\x7a\x00" }, - { 0x5605b0, "\xa7\xa3\xbe\xaa\xbd\xa8\xa9\xa0\xa4\xa1\xa6\xb5\xb4\xb0\xa2\xba\xb2\xb7\xb3\xbb\xb9\xaf\xac\xbf\xbc\xb6\xab\xb8\xad\xb1\xa5\xae\x00" }, - { 0x560bcc, "\xd0\xc1\xd2\xcd\xca\xda\xd4\xdb\xc7\xd3\xc8\xc3\xcc\xd5\xc4\xc6\xdd\xcf\xc9\xcb\xc5\xc0\xd9\xd8\xd6\xde\xdf\xc2\xd1\xdc\xce\xd7\x00" }, - { 0x560bec, "\xe2\xee\xfb\xfe\xf2\xe5\xf9\xef\xed\xe7\xe3\xfd\xfc\xe6\xfa\xea\xeb\xec\xf0\xf1\xf3\xe0\xf4\xe8\xff\xe1\xf7\xe4\xf5\xf8\xe9\xf6\x00" }, - { 0x560c10, "\x2\x1b\x1\x11\x17\x1e\xa\x1d\xe\x8\x4\xf\x1a\x7\x9\xb\x10\x0\x1c\x18\x3\x12\x1f\xd\x19\x16\x14\x6\x5\xc\x15\x13\x00" }, - { 0x560d34, "\x37\x36\x29\x3a\x3d\x2e\x38\x25\x28\x39\x3c\x26\x2d\x24\x30\x23\x21\x31\x3e\x34\x27\x22\x2f\x2c\x2a\x3f\x3b\x35\x33\x20\x2b\x32\x00" }, - { 0x560e38, "\x23\x32\x27\x39\x28\x30\x36\x20\x3e\x3c\x38\x24\x34\x21\x35\x2e\x3a\x3b\x31\x3f\x2b\x37\x3d\x2a\x2f\x26\x22\x25\x33\x29\x2c\x2d\x00" }, - { 0x561014, "\x16\xe\x19\x1\x15\x2\xa\x14\x1c\xf\x10\x4\x8\xc\xd\x0\x18\x5\x1f\x1a\x17\x1e\x13\x6\x9\x3\x7\x12\x1b\x11\x1d\xb\x00" }, - { 0x561074, "\x65\x73\x7b\x7e\x6d\x69\x7f\x7d\x68\x6a\x60\x72\x78\x62\x67\x70\x61\x6c\x74\x79\x66\x71\x7c\x76\x64\x6e\x6b\x75\x63\x7a\x77\x6f\x00" }, - { 0x561094, "\x83\x9a\x89\x87\x9f\x8d\x97\x92\x9d\x95\x99\x81\x88\x82\x8c\x8f\x85\x84\x94\x8a\x8b\x9c\x86\x9b\x96\x90\x93\x8e\x80\x9e\x98\x91\x00" }, - { 0x5610b4, "\xbd\xbc\xa3\xa4\xbe\xb3\xa8\xab\xb0\xba\xb5\xb8\xb9\xaf\xb7\xa1\xb6\xaa\xac\xad\xbb\xb2\xae\xbf\xb1\xa5\xa0\xb4\xa2\xa9\xa6\xa7\x00" }, - { 0x5610d4, "\xc1\xc8\xc9\xc0\xdb\xce\xd1\xd6\xd3\xdd\xd2\xdc\xcb\xd4\xc4\xc7\xd9\xd7\xd8\xcc\xda\xc2\xcf\xca\xc6\xd0\xc5\xde\xd5\xdf\xc3\xcd\x00" }, - { 0x561190, "\x93\x94\x9c\x88\x80\x9d\x83\x8b\x8f\x97\x81\x87\x8c\x8d\x95\x96\x9a\x82\x92\x8a\x9b\x91\x9e\x98\x84\x86\x90\x85\x89\x99\x9f\x8e\x00" }, - { 0x5611b0, "\xae\xa0\xb1\xb7\xa1\xa6\xa5\xa7\xaf\xa4\xbc\xac\xb6\xb3\xb0\xa8\xb8\xbe\xb2\xab\xb9\xbd\xa9\xb5\xbf\xa2\xbb\xa3\xba\xb4\xad\xaa\x00" }, - { 0x5611d0, "\xcc\xd7\xd5\xca\xc0\xcd\xc4\xc2\xd8\xdf\xdc\xd1\xd4\xcb\xc6\xda\xc1\xd2\xcf\xc3\xdd\xce\xc7\xd6\xde\xd9\xc5\xc9\xd3\xc8\xd0\xdb\x00" }, - { 0x562968, "\x7a\x78\x79\x7d\x6b\x62\x7c\x6d\x75\x6f\x7f\x65\x61\x60\x73\x77\x63\x6e\x71\x66\x70\x6c\x68\x6a\x76\x74\x69\x64\x72\x67\x7b\x7e\x00" }, - { 0x55f214, "\xd\x14\x4\xc\x1d\x5\x7\x9\x1c\xe\x16\x11\x17\x3\x6\x15\xb\x0\x12\x13\x1\x19\x1b\x1f\x1a\x2\xa\x10\xf\x1e\x18\x8\x00" }, - { 0x55f380, "\x98\x88\x94\x97\x83\x90\x99\x84\x8d\x9c\x86\x9d\x9e\x92\x91\x8b\x8f\x82\x8e\x9b\x93\x85\x87\x96\x95\x8a\x8c\x9a\x80\x81\x9f\x89\x00" } -}; - -static const struct buffer_t type_five_list[NUM_TYPE_FIVES]={ - { 0x55f3f8, "\xef\xe7\xf6\xfd\xeb\xf4\xec\xe2\xf7\xf9\xea\xe4\xf8\xff\xf5\xfa\xe8\xee\xfc\xe9\xe5\xfb\xe6\xe0\xfe\xed\xf2\xe1\xf1\xf0\xe3\xf3\x00" }, - { 0x562948, "\x47\x41\x56\x59\x45\x40\x58\x48\x49\x57\x55\x54\x5a\x4c\x4f\x4d\x51\x5c\x53\x4a\x52\x5d\x5f\x5e\x50\x43\x42\x5b\x44\x46\x4b\x4e\x00" }, - { 0x561258, "\x5b\x49\x5f\x43\x57\x4c\x54\x59\x5c\x5a\x51\x52\x5d\x4a\x5e\x47\x44\x56\x55\x4d\x40\x50\x58\x48\x46\x45\x4f\x41\x4b\x4e\x53\x42\x00" }, - { 0x561278, "\x6b\x63\x7e\x69\x64\x7f\x70\x76\x68\x7d\x71\x60\x7c\x6d\x66\x77\x67\x6a\x7a\x78\x6f\x61\x62\x75\x7b\x74\x72\x65\x6c\x79\x6e\x73\x00" }, - { 0x561298, "\x91\x97\x98\x8d\x8a\x8f\x82\x95\x84\x93\x99\x92\x9d\x86\x85\x94\x83\x90\x81\x80\x8c\x9f\x96\x9b\x88\x8e\x89\x87\x9c\x9e\x9a\x8b\x00" }, - { 0x5613a0, "\xb1\xb0\xa4\xbd\xa8\xb5\xba\xbb\xb4\xb8\xaf\xb7\xb6\xa7\xbe\xae\xb2\xaa\xb3\xab\xac\xa0\xa6\xa2\xbf\xb9\xa9\xbc\xa1\xad\xa3\xa5\x00" }, - { 0x5613c0, "\xc0\xc5\xd0\xdc\xcc\xda\xc4\xdb\xca\xcd\xd4\xcb\xc7\xc3\xd2\xde\xc6\xd1\xc1\xc8\xd5\xc9\xdf\xcf\xd9\xd8\xd6\xc2\xd3\xce\xd7\xdd\x00" }, - { 0x5613e4, "\xf0\xee\xf8\xe4\xe8\xfb\xfa\xef\xf6\xf9\xf3\xec\xe3\xe0\xed\xf4\xe7\xff\xea\xfe\xe1\xe9\xf5\xf1\xfc\xe6\xe2\xe5\xfd\xf2\xf7\xeb\x00" }, - { 0x561404, "\x1a\x16\x2\x19\x11\x1b\x17\xf\x14\x9\x18\x5\xe\xa\x6\x1d\x0\x1e\x7\x15\x4\x12\x8\x13\x10\xc\x1c\x1\xd\xb\x1f\x3\x00" }, - { 0x5615a0, "\xba\xb8\xb2\xb5\xa0\xbc\xa1\xab\xb9\xbb\xbf\xb1\xa7\xb0\xbe\xa6\xb7\xa4\xaa\xae\xad\xac\xb6\xa8\xa2\xa3\xb3\xb4\xa9\xbd\xa5\xaf\x00" }, - { 0x561628, "\x34\x35\x2f\x3a\x30\x32\x31\x21\x27\x3c\x37\x23\x3b\x2c\x26\x36\x24\x25\x29\x3f\x33\x3e\x22\x2d\x3d\x38\x39\x20\x28\x2b\x2e\x2a\x00" }, - { 0x561748, "\x52\x54\x41\x5f\x53\x43\x5e\x56\x5c\x44\x5a\x46\x4d\x4b\x57\x5d\x51\x45\x58\x5b\x42\x49\x48\x59\x4a\x40\x47\x50\x4f\x4c\x55\x4e\x00" }, - { 0x561768, "\x6f\x6b\x7d\x63\x6a\x79\x7f\x7c\x6d\x78\x62\x67\x69\x74\x75\x66\x7a\x6e\x70\x7e\x72\x61\x7b\x71\x73\x68\x60\x65\x64\x76\x6c\x77\x00" }, - { 0x5617f0, "\xed\xe3\xeb\xe0\xf7\xf3\xfa\xf2\xf0\xfc\xfe\xfb\xfd\xe8\xe2\xef\xea\xf4\xe5\xe1\xee\xf8\xec\xe4\xe9\xf5\xff\xe7\xf6\xf1\xf9\xe6\x00" }, - { 0x561ea0, "\xa9\xaf\xb0\xac\xa3\xb5\xa7\xb7\xae\xab\xbd\xa8\xb9\xb1\xa0\xaa\xa1\xa6\xb8\xb6\xad\xb3\xb4\xb2\xa2\xbb\xba\xa4\xa5\xbf\xbc\xbe\x00" }, - { 0x561f38, "\x37\x31\x3a\x3e\x20\x33\x26\x3d\x29\x25\x2e\x39\x2b\x28\x36\x22\x23\x38\x35\x30\x2d\x2c\x21\x2f\x3b\x27\x32\x2a\x34\x3f\x3c\x24\x00" }, - { 0x561f58, "\x55\x44\x47\x4d\x57\x4c\x43\x4a\x51\x53\x41\x5f\x49\x4e\x54\x5c\x4b\x5d\x45\x5b\x56\x52\x50\x46\x59\x5e\x40\x4f\x48\x42\x5a\x58\x00" }, - { 0x561f7c, "\x79\x69\x61\x7e\x73\x7f\x6b\x66\x76\x7c\x63\x6e\x72\x6d\x67\x6f\x77\x71\x75\x64\x62\x74\x68\x7b\x70\x78\x6a\x65\x60\x7a\x6c\x7d\x00" }, - { 0x561f9c, "\x9a\x82\x90\x8d\x8f\x94\x89\x9d\x81\x9f\x93\x85\x84\x98\x9c\x88\x8e\x86\x97\x92\x9e\x87\x9b\x99\x83\x8b\x95\x96\x91\x8a\x8c\x80\x00" }, - { 0x562198, "\x96\x8e\x80\x89\x94\x99\x8a\x87\x90\x8d\x92\x9e\x84\x86\x9a\x82\x8f\x9b\x9f\x8b\x9d\x81\x88\x97\x95\x8c\x91\x93\x83\x98\x85\x9c\x00" }, - { 0x5622f0, "\xf0\xeb\xe7\xe9\xed\xe1\xfd\xea\xe3\xf3\xee\xf9\xe0\xfe\xe5\xf5\xfb\xec\xef\xf8\xfa\xf6\xf1\xff\xe6\xe4\xf2\xf4\xf7\xe8\xe2\xfc\x00" }, - { 0x562864, "\x73\x63\x69\x72\x64\x7f\x7b\x6d\x74\x75\x70\x6e\x66\x62\x77\x68\x6c\x7a\x6b\x76\x61\x71\x7d\x65\x78\x7e\x67\x7c\x60\x6f\x79\x6a\x00" }, - { 0x56238c, "\x97\x87\x80\x8a\x93\x9b\x88\x96\x92\x8e\x83\x9a\x82\x85\x9c\x8d\x9f\x95\x9d\x8c\x86\x89\x8f\x90\x94\x91\x98\x81\x8b\x84\x99\x9e\x00" }, - { 0x5623ac, "\xae\xb6\xbb\xb1\xad\xaf\xbf\xb2\xa9\xb4\xaa\xa6\xa0\xa8\xb7\xac\xb0\xa5\xb3\xba\xab\xa3\xa7\xa2\xb8\xbe\xa1\xbc\xb5\xbd\xa4\xb9\x00" }, - { 0x5623cc, "\xc2\xd8\xde\xd2\xd0\xce\xca\xda\xd4\xc1\xdb\xc0\xd1\xdd\xc4\xd5\xcb\xc3\xdf\xc8\xcf\xd7\xc7\xd3\xd6\xc6\xc9\xdc\xcc\xcd\xd9\xc5\x00" }, - { 0x5623ec, "\xec\xe1\xef\xee\xfd\xe8\xf4\xe7\xf8\xf1\xf0\xff\xf7\xfb\xfc\xf9\xed\xf5\xeb\xe5\xf6\xfa\xfe\xf2\xe4\xea\xe0\xe2\xf3\xe3\xe6\xe9\x00" }, - { 0x562908, "\x13\x1c\x1a\x1d\x19\x15\x1f\x11\x18\x1\x0\xe\x12\x1e\xf\x1b\x17\x3\x14\xd\x6\x8\x10\x2\xc\x9\xb\x4\x5\x16\xa\x7\x00" }, - { 0x56249c, "\x89\x9c\x8c\x97\x81\x96\x9a\x80\x91\x83\x8b\x93\x9f\x88\x8f\x8e\x87\x84\x94\x82\x8a\x95\x86\x98\x9e\x90\x92\x9d\x9b\x85\x8d\x99\x00" }, - { 0x562544, "\x43\x42\x55\x4c\x48\x5b\x5d\x46\x50\x40\x49\x5c\x5e\x41\x53\x57\x58\x5f\x51\x47\x45\x4b\x52\x5a\x59\x54\x44\x56\x4f\x4a\x4d\x4e\x00" }, - { 0x562564, "\x75\x65\x7b\x62\x7e\x60\x66\x6d\x61\x69\x6f\x7c\x6a\x76\x7f\x73\x63\x6c\x79\x7a\x70\x7d\x72\x71\x67\x68\x64\x74\x6e\x78\x6b\x77\x00" }, - { 0x5625a0, "\xbf\xab\xb3\xa0\xb6\xb5\xb4\xaa\xbd\xa5\xbe\xba\xaf\xa4\xae\xa1\xb9\xa7\xa2\xb2\xac\xb7\xa8\xa9\xa3\xb1\xb8\xb0\xbc\xbb\xa6\xad\x00" }, - { 0x5625c0, "\xc2\xdb\xcc\xd7\xdf\xc5\xd5\xde\xd6\xc9\xda\xd2\xcf\xdc\xd8\xca\xd9\xd0\xcd\xd3\xc4\xd1\xc8\xd4\xdd\xce\xc6\xc0\xc1\xc7\xcb\xc3\x00" }, - { 0x5625e0, "\xe0\xe6\xeb\xe8\xec\xe4\xfa\xfc\xe5\xfe\xf4\xe3\xea\xf8\xf2\xfd\xf6\xff\xe7\xe9\xef\xee\xf7\xf3\xf1\xf9\xf0\xed\xfb\xe2\xe1\xf5\x00" }, - { 0x562600, "\x12\x3\x1a\x15\x4\x19\xb\x1b\x17\x1e\xd\x5\x11\x14\x1c\x0\x18\x10\xa\x6\xe\x8\x2\x7\x13\x9\x16\x1d\xf\xc\x1\x1f\x00" }, - { 0x562620, "\x3e\x3b\x31\x27\x28\x26\x38\x37\x2d\x2f\x32\x23\x3d\x24\x2a\x3a\x2c\x33\x34\x3f\x2b\x39\x30\x21\x36\x25\x3c\x2e\x22\x20\x29\x35\x00" }, - { 0x562640, "\x4f\x5d\x57\x56\x4d\x45\x53\x5f\x5b\x49\x5c\x5e\x55\x41\x46\x48\x4c\x50\x4b\x42\x44\x4a\x47\x5a\x58\x4e\x43\x51\x52\x54\x59\x40\x00" }, - { 0x562660, "\x6f\x64\x7d\x7b\x75\x70\x61\x6b\x60\x77\x73\x67\x7e\x7f\x68\x6a\x79\x69\x65\x66\x6c\x7a\x74\x76\x6e\x78\x63\x7c\x72\x71\x6d\x62\x00" } -}; - -static unsigned int yahoo_auth_fibonacci(unsigned int challenge, int divisor, int outer_loop, int inner_loop); -static unsigned char yahoo_auth_read45(unsigned int buffer, int offset); -static unsigned char yahoo_auth_read3(unsigned int buffer, int offset); -static unsigned int yahoo_auth_typefourfive(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int initial); -static unsigned int yahoo_auth_typethree(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int offset); -static unsigned int yahoo_auth_typetwo(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int type_two_variable, int type_two_variable2); -static unsigned int yahoo_auth_typeone(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int type_one_variable); - -/****************************************************************************** - y a h o o _ a u t h _ f i b o n a c c i () -******************************************************************************/ - -static unsigned int yahoo_auth_fibonacci(unsigned int challenge, int divisor, int outer_loop, int inner_loop) -{ - unsigned int hash = (challenge & 0xff) * 0x9e3779b1; - - hash ^= (challenge & 0xff00) >> 0x8; - hash *= 0x9e3779b1; - hash ^= (challenge & 0xff0000) >> 0x10; - hash *= 0x9e3779b1; - hash ^= (challenge & 0xff000000) >> 0x18; - hash *= 0x9e3779b1; - - if (outer_loop > 1) { - const auth_function_t *ft; - - int remainder; - - hash = ((((hash ^ (hash >> 0x8)) >> 0x10) ^ hash) ^ (hash >> 0x8)) & 0xff; - - remainder = hash % divisor; - - outer_loop--; - challenge *= 0x10dcd; - - ft = &main_function_list[inner_loop][remainder]; - - if (ft) { - - switch (ft->type) { - - case 0: - return challenge; - case 1: - return yahoo_auth_typeone(challenge, divisor, outer_loop, inner_loop, ft->var1); - - case 2: - return yahoo_auth_typetwo(challenge, divisor, outer_loop, inner_loop, ft->var1, ft->var2); - - case 3: - return yahoo_auth_typethree(challenge, divisor, outer_loop, inner_loop, ft->var1); - - case 4: - case 5: - return yahoo_auth_typefourfive(challenge, divisor, outer_loop, inner_loop, ft->var1); - - default: - break; - } - } - } - - return challenge; -} - -/****************************************************************************** - y a h o o _ a u t h _ r e a d 4 5 () -******************************************************************************/ - -static unsigned char yahoo_auth_read45(unsigned int buffer, int offset) -{ - int i; - - if (offset > 32) - return 0; - - for (i = 0; i < NUM_TYPE_FOURS; i++) { - if (type_four_list[i].buffer_start == buffer) - return type_four_list[i].buffer[offset] ^ (buffer & 0xff); - } - - for (i = 0; i < NUM_TYPE_FIVES; i++) { - if (type_five_list[i].buffer_start == buffer) - return type_five_list[i].buffer[offset] ^ (buffer & 0xff); - } - - return 0; -} - -/****************************************************************************** - y a h o o _ a u t h _ r e a d 3 () -******************************************************************************/ - -static unsigned char yahoo_auth_read3(unsigned int buffer, int offset) -{ - int i; - - if (offset > 256) - return 0; - - for (i = 0; i < NUM_TYPE_THREES; i++) { - if (type_three_list[i].buffer_start == buffer) - return type_three_list[i].buffer[offset] ^ (buffer & 0xff); - } - - return 0; -} - -/****************************************************************************** - y a h o o _ a u t h _ t y p e f o u r f i v e () -******************************************************************************/ - -static unsigned int yahoo_auth_typefourfive(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int initial) -{ - unsigned int final_value = 0; - - int i; - - /* Run through each bit. */ - - for (i = 0; i < 32; i++) - { - unsigned char buffer = yahoo_auth_read45(initial, i); /* Find the location in the challenge to put the 1/0 bit */ - int mask = ~(1 << buffer); /* so that we can do a replace of our current value. */ - int new_value = (challenge >> i) & 1; /* Is this bit 1 or 0? */ - - final_value = (final_value & mask) | (new_value << buffer); - } - - return yahoo_auth_fibonacci(final_value, divisor, outer_loop, inner_loop); -} - -/****************************************************************************** - y a h o o _ a u t h _ t y p e t h r e e () -******************************************************************************/ - -static unsigned int yahoo_auth_typethree(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int offset) -{ - int new_challenge = yahoo_auth_read3(offset, (challenge & 0xff000000) >> 0x18) << 0x18; - - new_challenge |= yahoo_auth_read3(offset, (challenge & 0x00ff0000) >> 0x10) << 0x10; - new_challenge |= yahoo_auth_read3(offset, (challenge & 0x0000ff00) >> 0x8) << 0x8; - new_challenge |= yahoo_auth_read3(offset, (challenge & 0x000000ff)); - - return yahoo_auth_fibonacci(new_challenge, divisor, outer_loop, inner_loop); -} - -/****************************************************************************** - y a h o o _ a u t h _ t y p e t w o () -******************************************************************************/ - -static unsigned int yahoo_auth_typetwo(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int type_two_variable, int type_two_variable2) -{ - return yahoo_auth_fibonacci((challenge * type_two_variable) + type_two_variable2, divisor, outer_loop, inner_loop); -} - -/****************************************************************************** - y a h o o _ a u t h _ t y p e o n e () -******************************************************************************/ - -static unsigned int yahoo_auth_typeone(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int type_one_variable) -{ - return yahoo_auth_fibonacci(challenge ^ type_one_variable, divisor, outer_loop, inner_loop); -} - -/****************************************************************************** - y a h o o _ a u t h _ f i n a l C o u n t d o w n () -******************************************************************************/ - -unsigned int yahoo_auth_finalCountdown(unsigned int challenge, int divisor, int inner_loop, int outer_loop) -{ - const auth_function_t *ft; - - int remainder = challenge % divisor; - - ft = &main_function_list[inner_loop][remainder]; - - if (ft) { - - switch(ft->type) { - - case 0: - break; - - case 1: - challenge = yahoo_auth_typeone(challenge, divisor, outer_loop, inner_loop, ft->var1); - break; - - case 2: - challenge = yahoo_auth_typetwo(challenge, divisor, outer_loop, inner_loop, ft->var1, ft->var2); - break; - - case 3: - challenge = yahoo_auth_typethree(challenge, divisor, outer_loop, inner_loop, ft->var1); - break; - - case 4: - case 5: - challenge = yahoo_auth_typefourfive(challenge, divisor, outer_loop, inner_loop, ft->var1); - break; - } - } - - return challenge; -}
--- a/libpurple/protocols/yahoo/yahoo_auth.h Fri May 01 21:36:29 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -/* - * yahoo_auth.h: Header for Yahoo Messenger authentication schemes. Eew. - * - * Copyright(c) 2003 Cerulean Studios - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA - * - */ - -#ifndef _YAHOO_AUTH_H_ -#define _YAHOO_AUTH_H_ - -#define NUM_TYPE_THREES 105 -#define NUM_TYPE_FOURS 56 -#define NUM_TYPE_FIVES 37 - -unsigned int yahoo_auth_finalCountdown(unsigned int challenge, int divisor, int inner_loop, int outer_loop); - -/* We've defined the Yahoo authentication functions as having types 1-5; all take either 1 or 2 arguments. - */ - -typedef struct _auth { - int type; - int var1; - int var2; -} auth_function_t; - -/* Type 3, 4 and 5 require lookups into ypager.exe's many static chunks of 256 bytes. Store them here. - */ - -struct buffer_t { - unsigned int buffer_start; - unsigned char buffer[257]; -}; - -#endif /* _YAHOO_AUTH_H_ */
--- a/libpurple/protocols/yahoo/yahoo_crypt.c Fri May 01 21:36:29 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,207 +0,0 @@ -/* One way encryption based on MD5 sum. - Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02111-1301 USA. */ - -/* warmenhoven took this file and made it work with the md5.[ch] we - * already had. isn't that lovely. people should just use linux or - * freebsd, crypt works properly on those systems. i hate solaris */ - -#include <string.h> -#include <stdlib.h> -#include <glib.h> - -#include "cipher.h" -#include "yahoo_crypt.h" - -/* Define our magic string to mark salt for MD5 "encryption" - replacement. This is meant to be the same as for other MD5 based - encryption implementations. */ -static const char md5_salt_prefix[] = "$1$"; - -/* Table with characters for base64 transformation. */ -static const char b64t[64] = -"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - -char *yahoo_crypt(const char *key, const char *salt) -{ - PurpleCipher *cipher; - PurpleCipherContext *context1, *context2; - guchar digest[16]; - static char *buffer = NULL; - static int buflen = 0; - int needed = 3 + strlen (salt) + 1 + 26 + 1; - - size_t salt_len; - size_t key_len; - size_t cnt; - - char *cp; - - if (buflen < needed) { - buflen = needed; - if ((buffer = g_realloc(buffer, buflen)) == NULL) - return NULL; - } - - cipher = purple_ciphers_find_cipher("md5"); - context1 = purple_cipher_context_new(cipher, NULL); - context2 = purple_cipher_context_new(cipher, NULL); - - /* Find beginning of salt string. The prefix should normally always - * be present. Just in case it is not. - */ - if (strncmp (md5_salt_prefix, salt, sizeof (md5_salt_prefix) - 1) == 0) - /* Skip salt prefix. */ - salt += sizeof (md5_salt_prefix) - 1; - - salt_len = MIN (strcspn (salt, "$"), 8); - key_len = strlen (key); - - /* Add the key string. */ - purple_cipher_context_append(context1, (const guchar *)key, key_len); - - /* Because the SALT argument need not always have the salt prefix we - * add it separately. - */ - purple_cipher_context_append(context1, (const guchar *)md5_salt_prefix, - sizeof(md5_salt_prefix) - 1); - - /* The last part is the salt string. This must be at most 8 - * characters and it ends at the first `$' character (for - * compatibility which existing solutions). - */ - purple_cipher_context_append(context1, (const guchar *)salt, salt_len); - - /* Compute alternate MD5 sum with input KEY, SALT, and KEY. The - * final result will be added to the first context. - */ - - /* Add key. */ - purple_cipher_context_append(context2, (const guchar *)key, key_len); - - /* Add salt. */ - purple_cipher_context_append(context2, (const guchar *)salt, salt_len); - - /* Add key again. */ - purple_cipher_context_append(context2, (const guchar *)key, key_len); - - /* Now get result of this (16 bytes) and add it to the other context. */ - purple_cipher_context_digest(context2, sizeof(digest), digest, NULL); - - /* Add for any character in the key one byte of the alternate sum. */ - for (cnt = key_len; cnt > 16; cnt -= 16) - purple_cipher_context_append(context1, digest, 16); - purple_cipher_context_append(context1, digest, cnt); - - /* For the following code we need a NUL byte. */ - digest[0] = '\0'; - - /* The original implementation now does something weird: for every 1 - * bit in the key the first 0 is added to the buffer, for every 0 - * bit the first character of the key. This does not seem to be - * what was intended but we have to follow this to be compatible. - */ - for (cnt = key_len; cnt > 0; cnt >>= 1) - purple_cipher_context_append(context1, - (cnt & 1) != 0 ? digest : (guchar *)key, 1); - - /* Create intermediate result. */ - purple_cipher_context_digest(context1, sizeof(digest), digest, NULL); - - /* Now comes another weirdness. In fear of password crackers here - * comes a quite long loop which just processes the output of the - * previous round again. We cannot ignore this here. - */ - for (cnt = 0; cnt < 1000; ++cnt) { - /* New context. */ - purple_cipher_context_reset(context2, NULL); - - /* Add key or last result. */ - if ((cnt & 1) != 0) - purple_cipher_context_append(context2, (const guchar *)key, key_len); - else - purple_cipher_context_append(context2, digest, 16); - - /* Add salt for numbers not divisible by 3. */ - if (cnt % 3 != 0) - purple_cipher_context_append(context2, (const guchar *)salt, salt_len); - - /* Add key for numbers not divisible by 7. */ - if (cnt % 7 != 0) - purple_cipher_context_append(context2, (const guchar *)key, key_len); - - /* Add key or last result. */ - if ((cnt & 1) != 0) - purple_cipher_context_append(context2, digest, 16); - else - purple_cipher_context_append(context2, (const guchar *)key, key_len); - - /* Create intermediate result. */ - purple_cipher_context_digest(context2, sizeof(digest), digest, NULL); - } - - /* Now we can construct the result string. It consists of three parts. */ - strncpy(buffer, md5_salt_prefix, MAX (0, buflen)); - cp = buffer + strlen(buffer); - buflen -= sizeof (md5_salt_prefix); - - strncpy(cp, salt, MIN ((size_t) buflen, salt_len)); - cp = cp + strlen(cp); - buflen -= MIN ((size_t) buflen, salt_len); - - if (buflen > 0) { - *cp++ = '$'; - --buflen; - } - -#define b64_from_24bit(B2, B1, B0, N) \ - do { \ - unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \ - int n = (N); \ - while (n-- > 0 && buflen > 0) { \ - *cp++ = b64t[w & 0x3f]; \ - --buflen; \ - w >>= 6; \ - }\ - } while (0) - - b64_from_24bit (digest[0], digest[6], digest[12], 4); - b64_from_24bit (digest[1], digest[7], digest[13], 4); - b64_from_24bit (digest[2], digest[8], digest[14], 4); - b64_from_24bit (digest[3], digest[9], digest[15], 4); - b64_from_24bit (digest[4], digest[10], digest[5], 4); - b64_from_24bit (0, 0, digest[11], 2); - if (buflen <= 0) { - g_free(buffer); - buffer = NULL; - } else - *cp = '\0'; /* Terminate the string. */ - - /* Clear the buffer for the intermediate result so that people - * attaching to processes or reading core dumps cannot get any - * information. We do it in this way to clear correct_words[] - * inside the MD5 implementation as well. - */ - purple_cipher_context_reset(context1, NULL); - purple_cipher_context_digest(context1, sizeof(digest), digest, NULL); - purple_cipher_context_destroy(context1); - purple_cipher_context_destroy(context2); - - return buffer; -}
--- a/libpurple/protocols/yahoo/yahoo_crypt.h Fri May 01 21:36:29 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -/* - * purple - * - * Purple is the legal property of its developers, whose names are too numerous - * to list here. Please refer to the COPYRIGHT file distributed with this - * source distribution. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA - */ -#ifndef _YAHOO_CRYPT_H_ -#define _YAHOO_CRYPT_H_ - -char *yahoo_crypt(const char *key, const char *salt); - -#endif /* _YAHOO_CRYPT_H */
--- a/libpurple/protocols/yahoo/yahoo_doodle.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/yahoo/yahoo_doodle.c Mon May 18 19:54:24 2009 +0000 @@ -46,7 +46,6 @@ #include "yahoo_friend.h" #include "yahoochat.h" #include "ycht.h" -#include "yahoo_auth.h" #include "yahoo_filexfer.h" #include "yahoo_picture.h"
--- a/libpurple/protocols/yahoo/yahoo_filexfer.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/yahoo/yahoo_filexfer.c Mon May 18 19:54:24 2009 +0000 @@ -1249,7 +1249,11 @@ if(xd->info_val_249 == 2) { /* sending file via p2p, we are connected as client */ - xd->txbuf = g_strdup_printf("POST /%s HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost: %s\r\nContent-Length: %ld\r\nCache-Control: no-cache\r\n\r\n", + xd->txbuf = g_strdup_printf("POST /%s HTTP/1.1\r\n" + "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" + "Host: %s\r\n" + "Content-Length: %ld\r\n" + "Cache-Control: no-cache\r\n\r\n", xd->path, xd->host, (long int)xfer->size); /* to do, add Referer */ @@ -1257,7 +1261,12 @@ else { /* sending file via relaying */ - xd->txbuf = g_strdup_printf("POST /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\nCookie:%s\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost: %s\r\nContent-Length: %ld\r\nCache-Control: no-cache\r\n\r\n", + xd->txbuf = g_strdup_printf("POST /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n" + "Cookie:%s\r\n" + "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" + "Host: %s\r\n" + "Content-Length: %ld\r\n" + "Cache-Control: no-cache\r\n\r\n", purple_url_encode(xd->xfer_idstring_for_relay), purple_normalize(account, purple_account_get_username(account)), xfer->who, @@ -1271,12 +1280,24 @@ if(xd->info_val_249 == 1) { /* receiving file via p2p, connected as client */ - xd->txbuf = g_strdup_printf("HEAD /%s HTTP/1.1\r\nAccept:*/*\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost: %s\r\nContent-Length: 0\r\nCache-Control: no-cache\r\n\r\n",xd->path,xd->host); + xd->txbuf = g_strdup_printf("HEAD /%s HTTP/1.1\r\n" + "Accept: */*\r\n" + "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" + "Host: %s\r\n" + "Content-Length: 0\r\n" + "Cache-Control: no-cache\r\n\r\n", + xd->path,xd->host); } else { /* receiving file via relaying */ - xd->txbuf = g_strdup_printf("HEAD /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\nAccept:*/*\r\nCookie:%s\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost:%s\r\nContent-Length: 0\r\nCache-Control: no-cache\r\n\r\n", + xd->txbuf = g_strdup_printf("HEAD /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n" + "Accept: */*\r\n" + "Cookie: %s\r\n" + "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" + "Host: %s\r\n" + "Content-Length: 0\r\n" + "Cache-Control: no-cache\r\n\r\n", purple_url_encode(xd->xfer_idstring_for_relay), purple_normalize(account, purple_account_get_username(account)), xfer->who, @@ -1289,12 +1310,20 @@ if(xd->info_val_249 == 1) { /* receiving file via p2p, connected as client */ - xd->txbuf = g_strdup_printf("GET /%s HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost: %s\r\nConnection: Keep-Alive\r\n\r\n",xd->path,xd->host); + xd->txbuf = g_strdup_printf("GET /%s HTTP/1.1\r\n" + "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" + "Host: %s\r\n" + "Connection: Keep-Alive\r\n\r\n", + xd->path, xd->host); } else { /* receiving file via relaying */ - xd->txbuf = g_strdup_printf("GET /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\nCookie:%s\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost:%s\r\nConnection: Keep-Alive\r\n\r\n", + xd->txbuf = g_strdup_printf("GET /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n" + "Cookie: %s\r\n" + "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" + "Host: %s\r\n" + "Connection: Keep-Alive\r\n\r\n", purple_url_encode(xd->xfer_idstring_for_relay), purple_normalize(account, purple_account_get_username(account)), xfer->who,
--- a/libpurple/protocols/yahoo/yahoo_packet.h Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/yahoo/yahoo_packet.h Mon May 18 19:54:24 2009 +0000 @@ -125,8 +125,8 @@ }; #define YAHOO_WEBMESSENGER_PROTO_VER 0x0065 -#define YAHOO_PROTO_VER 0x000f -#define YAHOO_PROTO_VER_JAPAN 0x000f +#define YAHOO_PROTO_VER 0x0010 +#define YAHOO_PROTO_VER_JAPAN 0x0010 #define YAHOO_PACKET_HDRLEN (4 + 2 + 2 + 2 + 2 + 4 + 4)
--- a/libpurple/protocols/yahoo/yahoo_picture.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/protocols/yahoo/yahoo_picture.c Mon May 18 19:54:24 2009 +0000 @@ -134,6 +134,7 @@ data->gc = gc; data->who = g_strdup(who); data->checksum = checksum; + /* TODO: Does this need to be MSIE 5.0? */ url_data = purple_util_fetch_url(url, use_whole_url, "Mozilla/4.0 (compatible; MSIE 5.0)", FALSE, yahoo_fetch_picture_cb, data); @@ -499,7 +500,7 @@ port = purple_account_get_int(account, "xfer_port", YAHOO_XFER_PORT); tmp = g_strdup_printf("%s:%d", host, port); header = g_strdup_printf("POST %s%s/notifyft HTTP/1.1\r\n" - "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n" + "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" "Cookie: T=%s; Y=%s\r\n" "Host: %s\r\n" "Content-Length: %" G_GSIZE_FORMAT "\r\n"
--- a/libpurple/savedstatuses.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/savedstatuses.c Mon May 18 19:54:24 2009 +0000 @@ -285,13 +285,13 @@ xmlnode_set_attrib(node, "transient", "true"); } - snprintf(buf, sizeof(buf), "%lu", status->creation_time); + g_snprintf(buf, sizeof(buf), "%lu", status->creation_time); xmlnode_set_attrib(node, "created", buf); - snprintf(buf, sizeof(buf), "%lu", status->lastused); + g_snprintf(buf, sizeof(buf), "%lu", status->lastused); xmlnode_set_attrib(node, "lastused", buf); - snprintf(buf, sizeof(buf), "%u", status->usage_count); + g_snprintf(buf, sizeof(buf), "%u", status->usage_count); xmlnode_set_attrib(node, "usage_count", buf); child = xmlnode_new_child(node, "state");
--- a/libpurple/upnp.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/upnp.c Mon May 18 19:54:24 2009 +0000 @@ -130,7 +130,7 @@ guint tima; /* purple_timeout_add handle */ int fd; struct sockaddr_in server; - gchar service_type[25]; + gchar service_type[20]; int retry_count; gchar *full_url; } UPnPDiscoveryData;
--- a/libpurple/util.c Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/util.c Mon May 18 19:54:24 2009 +0000 @@ -129,7 +129,7 @@ ascii = g_malloc(len * 2 + 1); for (i = 0; i < len; i++) - snprintf(&ascii[i * 2], 3, "%02hhx", data[i]); + g_snprintf(&ascii[i * 2], 3, "%02hhx", data[i]); return ascii; } @@ -1623,7 +1623,7 @@ pt->dest_tag = "a"; tags = g_list_prepend(tags, pt); if(xhtml) - g_string_append_printf(xhtml, "<a href='%s'>", url ? g_strstrip(url->str) : ""); + g_string_append_printf(xhtml, "<a href=\"%s\">", url ? g_strstrip(url->str) : ""); continue; } if(!g_ascii_strncasecmp(c, "<font", 5) && (*(c+5) == '>' || *(c+5) == ' ')) { @@ -2017,7 +2017,6 @@ case '<': case '>': case '"': - case '\'': return TRUE; default: return FALSE; @@ -3920,7 +3919,10 @@ } } - purple_debug_misc("util", "Request: '%s'\n", gfud->request); + if(g_getenv("PURPLE_UNSAFE_DEBUG")) + purple_debug_misc("util", "Request: '%s'\n", gfud->request); + else + purple_debug_misc("util", "request constructed\n"); total_len = strlen(gfud->request); @@ -4023,9 +4025,12 @@ g_return_val_if_fail(url != NULL, NULL); g_return_val_if_fail(callback != NULL, NULL); - purple_debug_info("util", - "requested to fetch (%s), full=%d, user_agent=(%s), http11=%d\n", - url, full, user_agent?user_agent:"(null)", http11); + if(g_getenv("PURPLE_UNSAFE_DEBUG")) + purple_debug_info("util", + "requested to fetch (%s), full=%d, user_agent=(%s), http11=%d\n", + url, full, user_agent?user_agent:"(null)", http11); + else + purple_debug_info("util", "requesting to fetch a URL\n"); gfud = g_new0(PurpleUtilFetchUrlData, 1);
--- a/libpurple/util.h Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/util.h Mon May 18 19:54:24 2009 +0000 @@ -496,7 +496,8 @@ char *purple_markup_linkify(const char *str); /** - * Unescapes HTML entities to their literal characters. + * Unescapes HTML entities to their literal characters. Also translates + * "<br>" to "\n". * For example "&" is replaced by '&' and so on. * Actually only "&", """, "<" and ">" are currently * supported. @@ -505,6 +506,8 @@ * * @return The text with HTML entities literalized. You must g_free * this string when finished with it. + * + * @see purple_escape_html */ char *purple_unescape_html(const char *html);
--- a/libpurple/win32/global.mak Fri May 01 21:36:29 2009 +0000 +++ b/libpurple/win32/global.mak Mon May 18 19:54:24 2009 +0000 @@ -103,6 +103,7 @@ endif GMSGFMT ?= $(GTK_BIN)/msgfmt MAKENSIS ?= makensis.exe +MAKENSISOPT ?= / PERL ?= /cygdrive/c/perl/bin/perl WINDRES ?= windres STRIP ?= strip
--- a/pidgin/gtkblist.c Fri May 01 21:36:29 2009 +0000 +++ b/pidgin/gtkblist.c Mon May 18 19:54:24 2009 +0000 @@ -75,47 +75,40 @@ typedef struct { PurpleAccount *account; - GtkWidget *window; + GtkBox *vbox; + GtkWidget *account_menu; + GtkSizeGroup *sg; +} PidginBlistRequestData; + +typedef struct +{ + PidginBlistRequestData rq_data; GtkWidget *combo; GtkWidget *entry; GtkWidget *entry_for_alias; - GtkWidget *account_box; } PidginAddBuddyData; typedef struct { - PurpleAccount *account; + PidginBlistRequestData rq_data; gchar *default_chat_name; - - GtkWidget *window; - GtkWidget *account_menu; + GList *entries; +} PidginChatData; + +typedef struct +{ + PidginChatData chat_data; + GtkWidget *alias_entry; GtkWidget *group_combo; - GtkWidget *entries_box; - GtkSizeGroup *sg; GtkWidget *autojoin; GtkWidget *persistent; - - GList *entries; - } PidginAddChatData; typedef struct { - PurpleAccount *account; - - GtkWidget *window; - GtkWidget *account_menu; - GtkWidget *entries_box; - GtkSizeGroup *sg; - - GList *entries; -} PidginJoinChatData; - -typedef struct -{ /** Used to hold error minidialogs. Gets packed * inside PidginBuddyList.error_buttons */ @@ -868,7 +861,7 @@ } static void -do_join_chat(PidginJoinChatData *data) +do_join_chat(PidginChatData *data) { if (data) { @@ -894,14 +887,14 @@ } } - chat = purple_chat_new(data->account, NULL, components); + chat = purple_chat_new(data->rq_data.account, NULL, components); gtk_blist_join_chat(chat); purple_blist_remove_chat(chat); } } static void -do_joinchat(GtkWidget *dialog, int id, PidginJoinChatData *info) +do_joinchat(GtkWidget *dialog, int id, PidginChatData *info) { switch(id) { @@ -910,7 +903,7 @@ break; case 1: - pidgin_roomlist_dialog_show_with_account(info->account); + pidgin_roomlist_dialog_show_with_account(info->rq_data.account); return; break; @@ -926,11 +919,11 @@ * strings are empty then don't allow the user to click on "OK." */ static void -joinchat_set_sensitive_if_input_cb(GtkWidget *entry, gpointer user_data) +set_sensitive_if_input_cb(GtkWidget *entry, gpointer user_data) { PurplePluginProtocolInfo *prpl_info; PurpleConnection *gc; - PidginJoinChatData *data; + PidginChatData *data; GList *tmp; const char *text; gboolean required; @@ -949,13 +942,13 @@ } } - gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), GTK_RESPONSE_OK, sensitive); - - gc = purple_account_get_connection(data->account); + gtk_dialog_set_response_sensitive(GTK_DIALOG(data->rq_data.window), GTK_RESPONSE_OK, sensitive); + + gc = purple_account_get_connection(data->rq_data.account); prpl_info = (gc != NULL) ? PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl) : NULL; sensitive = (prpl_info != NULL && prpl_info->roomlist_get_list != NULL); - gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), 1, sensitive); + gtk_dialog_set_response_sensitive(GTK_DIALOG(data->rq_data.window), 1, sensitive); } static void @@ -967,97 +960,6 @@ pidgin_blist_update_buddy(purple_get_blist(), PURPLE_BLIST_NODE(buddy), TRUE); } -static void -rebuild_joinchat_entries(PidginJoinChatData *data) -{ - PurpleConnection *gc; - GList *list = NULL, *tmp; - GHashTable *defaults = NULL; - struct proto_chat_entry *pce; - gboolean focus = TRUE; - - g_return_if_fail(data->account != NULL); - - gc = purple_account_get_connection(data->account); - - gtk_container_foreach(GTK_CONTAINER(data->entries_box), (GtkCallback)gtk_widget_destroy, NULL); - - g_list_free(data->entries); - data->entries = NULL; - - if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL) - list = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info(gc); - - if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL) - defaults = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, NULL); - - for (tmp = list; tmp; tmp = tmp->next) - { - GtkWidget *input; - - pce = tmp->data; - - if (pce->is_int) - { - GtkObject *adjust; - adjust = gtk_adjustment_new(pce->min, pce->min, pce->max, - 1, 10, 10); - input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0); - gtk_widget_set_size_request(input, 50, -1); - pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, FALSE, NULL); - } - else - { - char *value; - input = gtk_entry_new(); - gtk_entry_set_activates_default(GTK_ENTRY(input), TRUE); - value = g_hash_table_lookup(defaults, pce->identifier); - if (value != NULL) - gtk_entry_set_text(GTK_ENTRY(input), value); - if (pce->secret) - { - gtk_entry_set_visibility(GTK_ENTRY(input), FALSE); -#if !GTK_CHECK_VERSION(2,16,0) - if (gtk_entry_get_invisible_char(GTK_ENTRY(input)) == '*') - gtk_entry_set_invisible_char(GTK_ENTRY(input), PIDGIN_INVISIBLE_CHAR); -#endif /* Less than GTK+ 2.16 */ - } - pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, TRUE, NULL); - g_signal_connect(G_OBJECT(input), "changed", - G_CALLBACK(joinchat_set_sensitive_if_input_cb), data); - } - - /* Do the following for any type of input widget */ - if (focus) - { - gtk_widget_grab_focus(input); - focus = FALSE; - } - g_object_set_data(G_OBJECT(input), "identifier", (gpointer)pce->identifier); - g_object_set_data(G_OBJECT(input), "is_spin", GINT_TO_POINTER(pce->is_int)); - g_object_set_data(G_OBJECT(input), "required", GINT_TO_POINTER(pce->required)); - data->entries = g_list_append(data->entries, input); - - g_free(pce); - } - - g_list_free(list); - g_hash_table_destroy(defaults); - - /* Set whether the "OK" button should be clickable initially */ - joinchat_set_sensitive_if_input_cb(NULL, data); - - gtk_widget_show_all(data->entries_box); -} - -static void -joinchat_select_account_cb(GObject *w, PurpleAccount *account, - PidginJoinChatData *data) -{ - data->account = account; - rebuild_joinchat_entries(data); -} - static gboolean chat_account_filter_func(PurpleAccount *account) { @@ -1085,32 +987,38 @@ return FALSE; } -void -pidgin_blist_joinchat_show(void) -{ - GtkWidget *hbox, *vbox; +static GtkWidget * +make_blist_request_dialog(PidginBlistRequestData *data, PurpleAccount *account, + const char *title, const char *window_role, const char *label_text, + GCallback callback_func, PurpleFilterAccountFunc filter_func, + GCallback response_cb) +{ GtkWidget *label; + GtkWidget *img; + GtkWidget *hbox; + GtkWidget *vbox; + GtkWindow *blist_window; PidginBuddyList *gtkblist; - GtkWidget *img = NULL; - PidginJoinChatData *data = NULL; - - gtkblist = purple_blist_get_ui_data(); + + data->account = account; + img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION, - gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE)); - data = g_new0(PidginJoinChatData, 1); - - data->window = gtk_dialog_new_with_buttons(_("Join a Chat"), - NULL, GTK_DIALOG_NO_SEPARATOR, - _("Room _List"), 1, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - PIDGIN_STOCK_CHAT, GTK_RESPONSE_OK, NULL); + gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE)); + + gtkblist = PIDGIN_BLIST(purple_get_blist()); + blist_window = gtkblist ? GTK_WINDOW(gtkblist->window) : NULL; + + data->window = gtk_dialog_new_with_buttons(title, + blist_window, GTK_DIALOG_NO_SEPARATOR, + NULL); + + gtk_window_set_transient_for(GTK_WINDOW(data->window), blist_window); gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK); gtk_container_set_border_width(GTK_CONTAINER(data->window), PIDGIN_HIG_BOX_SPACE); gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE); gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BORDER); - gtk_container_set_border_width( - GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BOX_SPACE); - gtk_window_set_role(GTK_WINDOW(data->window), "join_chat"); + gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BOX_SPACE); + gtk_window_set_role(GTK_WINDOW(data->window), window_role); hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox); @@ -1118,37 +1026,154 @@ gtk_misc_set_alignment(GTK_MISC(img), 0, 0); vbox = gtk_vbox_new(FALSE, 5); - gtk_container_set_border_width(GTK_CONTAINER(vbox), 0); gtk_container_add(GTK_CONTAINER(hbox), vbox); - label = gtk_label_new(_("Please enter the appropriate information " - "about the chat you would like to join.\n")); + label = gtk_label_new(label_text); + + gtk_widget_set_size_request(label, 400, -1); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - data->account_menu = pidgin_account_option_menu_new(NULL, FALSE, - G_CALLBACK(joinchat_select_account_cb), - chat_account_filter_func, data); - - pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Account:"), data->sg, data->account_menu, TRUE, NULL); - - data->entries_box = gtk_vbox_new(FALSE, 5); - gtk_container_add(GTK_CONTAINER(vbox), data->entries_box); - gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0); - - data->account = pidgin_account_option_menu_get_selected(data->account_menu); - - rebuild_joinchat_entries(data); - - g_signal_connect(G_OBJECT(data->window), "response", - G_CALLBACK(do_joinchat), data); + data->account_menu = pidgin_account_option_menu_new(account, FALSE, + callback_func, filter_func, data); + pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("A_ccount"), data->sg, data->account_menu, TRUE, NULL); + + data->vbox = GTK_BOX(gtk_vbox_new(FALSE, 5)); + gtk_container_set_border_width(GTK_CONTAINER(data->vbox), 0); + gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(data->vbox), FALSE, FALSE, 0); + + g_signal_connect(G_OBJECT(data->window), "response", response_cb, data); g_object_unref(data->sg); - gtk_widget_show_all(data->window); + return vbox; +} + +static void +rebuild_chat_entries(PidginChatData *data, const char *default_chat_name) +{ + PurpleConnection *gc; + GList *list = NULL, *tmp; + GHashTable *defaults = NULL; + struct proto_chat_entry *pce; + gboolean focus = TRUE; + + g_return_if_fail(data->rq_data.account != NULL); + + gc = purple_account_get_connection(data->rq_data.account); + + gtk_container_foreach(GTK_CONTAINER(data->rq_data.vbox), (GtkCallback)gtk_widget_destroy, NULL); + + g_list_free(data->entries); + data->entries = NULL; + + if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL) + list = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info(gc); + + if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL) + defaults = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, default_chat_name); + + for (tmp = list; tmp; tmp = tmp->next) + { + GtkWidget *input; + + pce = tmp->data; + + if (pce->is_int) + { + GtkObject *adjust; + adjust = gtk_adjustment_new(pce->min, pce->min, pce->max, + 1, 10, 10); + input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0); + gtk_widget_set_size_request(input, 50, -1); + pidgin_add_widget_to_vbox(GTK_BOX(data->rq_data.vbox), pce->label, data->rq_data.sg, input, FALSE, NULL); + } + else + { + char *value; + input = gtk_entry_new(); + gtk_entry_set_activates_default(GTK_ENTRY(input), TRUE); + value = g_hash_table_lookup(defaults, pce->identifier); + if (value != NULL) + gtk_entry_set_text(GTK_ENTRY(input), value); + if (pce->secret) + { + gtk_entry_set_visibility(GTK_ENTRY(input), FALSE); +#if !GTK_CHECK_VERSION(2,16,0) + if (gtk_entry_get_invisible_char(GTK_ENTRY(input)) == '*') + gtk_entry_set_invisible_char(GTK_ENTRY(input), PIDGIN_INVISIBLE_CHAR); +#endif /* Less than GTK+ 2.16 */ + } + pidgin_add_widget_to_vbox(data->rq_data.vbox, pce->label, data->rq_data.sg, input, TRUE, NULL); + g_signal_connect(G_OBJECT(input), "changed", + G_CALLBACK(set_sensitive_if_input_cb), data); + } + + /* Do the following for any type of input widget */ + if (focus) + { + gtk_widget_grab_focus(input); + focus = FALSE; + } + g_object_set_data(G_OBJECT(input), "identifier", (gpointer)pce->identifier); + g_object_set_data(G_OBJECT(input), "is_spin", GINT_TO_POINTER(pce->is_int)); + g_object_set_data(G_OBJECT(input), "required", GINT_TO_POINTER(pce->required)); + data->entries = g_list_append(data->entries, input); + + g_free(pce); + } + + g_list_free(list); + g_hash_table_destroy(defaults); + + /* Set whether the "OK" button should be clickable initially */ + set_sensitive_if_input_cb(NULL, data); + + gtk_widget_show_all(GTK_WIDGET(data->rq_data.vbox)); +} + +static void +chat_select_account_cb(GObject *w, PurpleAccount *account, + PidginChatData *data) +{ + if (strcmp(purple_account_get_protocol_id(data->rq_data.account), + purple_account_get_protocol_id(account)) == 0) + { + data->rq_data.account = account; + } + else + { + data->rq_data.account = account; + rebuild_chat_entries(data, data->default_chat_name); + } +} + +void +pidgin_blist_joinchat_show(void) +{ + PidginChatData *data = NULL; + + data = g_new0(PidginChatData, 1); + + make_blist_request_dialog((PidginBlistRequestData *)data, NULL, + _("Join a Chat"), "join_chat", + _("Please enter the appropriate information about the chat " + "you would like to join.\n"), + G_CALLBACK(chat_select_account_cb), + chat_account_filter_func, (GCallback)do_joinchat); + gtk_dialog_add_buttons(GTK_DIALOG(data->rq_data.window), + _("Room _List"), 1, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + PIDGIN_STOCK_CHAT, GTK_RESPONSE_OK, NULL); + data->default_chat_name = NULL; + data->rq_data.account = pidgin_account_option_menu_get_selected(data->rq_data.account_menu); + + rebuild_chat_entries(data, NULL); + + gtk_widget_show_all(data->rq_data.window); } static void gtk_blist_row_expanded_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data) @@ -6734,7 +6759,7 @@ PidginAddBuddyData *data) { /* Save our account */ - data->account = account; + data->rq_data.account = account; } static void @@ -6747,6 +6772,7 @@ add_buddy_cb(GtkWidget *w, int resp, PidginAddBuddyData *data) { const char *grp, *who, *whoalias; + PurpleAccount *account; PurpleGroup *g; PurpleBuddy *b; PurpleConversation *c; @@ -6760,6 +6786,8 @@ if (*whoalias == '\0') whoalias = NULL; + account = data->rq_data.account; + g = NULL; if ((grp != NULL) && (*grp != '\0')) { @@ -6769,20 +6797,20 @@ purple_blist_add_group(g, NULL); } - b = purple_find_buddy_in_group(data->account, who, g); + b = purple_find_buddy_in_group(account, who, g); } - else if ((b = purple_find_buddy(data->account, who)) != NULL) + else if ((b = purple_find_buddy(account, who)) != NULL) { g = purple_buddy_get_group(b); } if (b == NULL) { - b = purple_buddy_new(data->account, who, whoalias); + b = purple_buddy_new(account, who, whoalias); purple_blist_add_buddy(b, NULL, g, NULL); } - purple_account_add_buddy(data->account, b); + purple_account_add_buddy(account, b); /* Offer to merge people with the same alias. */ if (whoalias != NULL && g != NULL) @@ -6803,7 +6831,7 @@ * Or something. --Mark */ - c = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, data->account); + c = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, data->rq_data.account); if (c != NULL) { icon = purple_conv_im_get_icon(PURPLE_CONV_IM(c)); if (icon != NULL) @@ -6811,103 +6839,52 @@ } } - gtk_widget_destroy(data->window); + gtk_widget_destroy(data->rq_data.window); } static void pidgin_blist_request_add_buddy(PurpleAccount *account, const char *username, const char *group, const char *alias) { - GtkWidget *table; - GtkWidget *label; - GtkWidget *hbox; - GtkWidget *vbox; - GtkWidget *img; - PidginBuddyList *gtkblist; PidginAddBuddyData *data = g_new0(PidginAddBuddyData, 1); - data->account = + make_blist_request_dialog((PidginBlistRequestData *)data, (account != NULL - ? account - : purple_connection_get_account(purple_connections_get_all()->data)); - - img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION, - gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE)); - - gtkblist = PIDGIN_BLIST(purple_get_blist()); - - data->window = gtk_dialog_new_with_buttons(_("Add Buddy"), - gtkblist ? GTK_WINDOW(gtkblist->window) : NULL, GTK_DIALOG_NO_SEPARATOR, + ? account : purple_connection_get_account(purple_connections_get_all()->data)), + _("Add Buddy"), "add_buddy", + _("Add a buddy.\n"), + G_CALLBACK(add_buddy_select_account_cb), NULL, + G_CALLBACK(add_buddy_cb)); + gtk_dialog_add_buttons(GTK_DIALOG(data->rq_data.window), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_ADD, GTK_RESPONSE_OK, NULL); - if (gtkblist) - gtk_window_set_transient_for(GTK_WINDOW(data->window), GTK_WINDOW(gtkblist->window)); - gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK); - gtk_container_set_border_width(GTK_CONTAINER(data->window), PIDGIN_HIG_BOX_SPACE); - gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE); - gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BORDER); - gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BOX_SPACE); - gtk_window_set_role(GTK_WINDOW(data->window), "add_buddy"); - gtk_window_set_type_hint(GTK_WINDOW(data->window), - GDK_WINDOW_TYPE_HINT_DIALOG); - - hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); - gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox); - gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); - gtk_misc_set_alignment(GTK_MISC(img), 0, 0); - - vbox = gtk_vbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(hbox), vbox); - - g_signal_connect(G_OBJECT(data->window), "destroy", + g_signal_connect(G_OBJECT(data->rq_data.window), "destroy", G_CALLBACK(destroy_add_buddy_dialog_cb), data); - label = gtk_label_new(_("Add a buddy.\n")); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0); - gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); - - table = gtk_table_new(4, 2, FALSE); - gtk_table_set_row_spacings(GTK_TABLE(table), 5); - gtk_table_set_col_spacings(GTK_TABLE(table), 5); - gtk_container_set_border_width(GTK_CONTAINER(table), 0); - gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); - - data->account_box = pidgin_account_option_menu_new(account, FALSE, - G_CALLBACK(add_buddy_select_account_cb), NULL, data); - - gtk_table_attach_defaults(GTK_TABLE(table), data->account_box, 0, 2, 0, 1); - - label = gtk_label_new_with_mnemonic(_("Buddy's _username:")); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); - data->entry = gtk_entry_new(); - gtk_table_attach_defaults(GTK_TABLE(table), data->entry, 1, 2, 1, 2); + + pidgin_add_widget_to_vbox(data->rq_data.vbox, _("Buddy's _username:"), + data->rq_data.sg, data->entry, TRUE, NULL); gtk_widget_grab_focus(data->entry); if (username != NULL) gtk_entry_set_text(GTK_ENTRY(data->entry), username); else - gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), + gtk_dialog_set_response_sensitive(GTK_DIALOG(data->rq_data.window), GTK_RESPONSE_OK, FALSE); gtk_entry_set_activates_default (GTK_ENTRY(data->entry), TRUE); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), data->entry); - pidgin_set_accessible_label (data->entry, label); g_signal_connect(G_OBJECT(data->entry), "changed", G_CALLBACK(pidgin_set_sensitive_if_input), - data->window); - - label = gtk_label_new_with_mnemonic(_("(Optional) A_lias:")); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3); + data->rq_data.window); data->entry_for_alias = gtk_entry_new(); - gtk_table_attach_defaults(GTK_TABLE(table), - data->entry_for_alias, 1, 2, 2, 3); + pidgin_add_widget_to_vbox(data->rq_data.vbox, _("(Optional) A_lias:"), + data->rq_data.sg, data->entry_for_alias, TRUE, + NULL); if (alias != NULL) gtk_entry_set_text(GTK_ENTRY(data->entry_for_alias), alias); @@ -6915,23 +6892,11 @@ if (username != NULL) gtk_widget_grab_focus(GTK_WIDGET(data->entry_for_alias)); - gtk_entry_set_activates_default (GTK_ENTRY(data->entry_for_alias), TRUE); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), data->entry_for_alias); - pidgin_set_accessible_label (data->entry_for_alias, label); - - label = gtk_label_new_with_mnemonic(_("Add buddy to _group:")); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 3, 4); - data->combo = pidgin_text_combo_box_entry_new(group, groups_tree()); - gtk_table_attach_defaults(GTK_TABLE(table), data->combo, 1, 2, 3, 4); - gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_BIN(data->combo)->child); - pidgin_set_accessible_label (data->combo, label); - - g_signal_connect(G_OBJECT(data->window), "response", - G_CALLBACK(add_buddy_cb), data); - - gtk_widget_show_all(data->window); + pidgin_add_widget_to_vbox(data->rq_data.vbox, _("Add buddy to _group:"), + data->rq_data.sg, data->combo, TRUE, NULL); + + gtk_widget_show_all(data->rq_data.window); } static void @@ -6947,7 +6912,7 @@ components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); - for (tmp = data->entries; tmp; tmp = tmp->next) + for (tmp = data->chat_data.entries; tmp; tmp = tmp->next) { if (g_object_get_data(tmp->data, "is_spin")) { @@ -6966,7 +6931,7 @@ } } - chat = purple_chat_new(data->account, + chat = purple_chat_new(data->chat_data.rq_data.account, gtk_entry_get_text(GTK_ENTRY(data->alias_entry)), components); @@ -6990,9 +6955,9 @@ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->persistent))) purple_blist_node_set_bool((PurpleBlistNode*)chat, "gtk-persistent", TRUE); - gtk_widget_destroy(data->window); - g_free(data->default_chat_name); - g_list_free(data->entries); + gtk_widget_destroy(data->chat_data.rq_data.window); + g_free(data->chat_data.default_chat_name); + g_list_free(data->chat_data.entries); g_free(data); } @@ -7005,166 +6970,25 @@ } else if (resp == 1) { - pidgin_roomlist_dialog_show_with_account(data->account); + pidgin_roomlist_dialog_show_with_account(data->chat_data.rq_data.account); } else { - gtk_widget_destroy(data->window); - g_free(data->default_chat_name); - g_list_free(data->entries); + gtk_widget_destroy(data->chat_data.rq_data.window); + g_free(data->chat_data.default_chat_name); + g_list_free(data->chat_data.entries); g_free(data); } } -/* - * Check the values of all the text entry boxes. If any required input - * strings are empty then don't allow the user to click on "OK." - */ -static void -addchat_set_sensitive_if_input_cb(GtkWidget *entry, gpointer user_data) -{ - PurplePluginProtocolInfo *prpl_info; - PurpleConnection *gc; - PidginAddChatData *data; - GList *tmp; - const char *text; - gboolean required; - gboolean sensitive = TRUE; - - data = user_data; - - for (tmp = data->entries; tmp != NULL; tmp = tmp->next) - { - if (!g_object_get_data(tmp->data, "is_spin")) - { - required = GPOINTER_TO_INT(g_object_get_data(tmp->data, "required")); - text = gtk_entry_get_text(tmp->data); - if (required && (*text == '\0')) - sensitive = FALSE; - } - } - - gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), GTK_RESPONSE_OK, sensitive); - - gc = purple_account_get_connection(data->account); - prpl_info = (gc != NULL) ? PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl) : NULL; - sensitive = (prpl_info != NULL && prpl_info->roomlist_get_list != NULL); - - gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), 1, sensitive); -} - -static void -rebuild_addchat_entries(PidginAddChatData *data) -{ - PurpleConnection *gc; - GList *list = NULL, *tmp; - GHashTable *defaults = NULL; - struct proto_chat_entry *pce; - gboolean focus = TRUE; - - g_return_if_fail(data->account != NULL); - - gc = purple_account_get_connection(data->account); - - gtk_container_foreach(GTK_CONTAINER(data->entries_box), (GtkCallback)gtk_widget_destroy, NULL); - - g_list_free(data->entries); - - data->entries = NULL; - - if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL) - list = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info(gc); - - if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL) - defaults = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, data->default_chat_name); - - for (tmp = list; tmp; tmp = tmp->next) - { - GtkWidget *input; - - pce = tmp->data; - - if (pce->is_int) - { - GtkObject *adjust; - adjust = gtk_adjustment_new(pce->min, pce->min, pce->max, - 1, 10, 10); - input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0); - gtk_widget_set_size_request(input, 50, -1); - pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, FALSE, NULL); - } - else - { - char *value; - input = gtk_entry_new(); - gtk_entry_set_activates_default(GTK_ENTRY(input), TRUE); - value = g_hash_table_lookup(defaults, pce->identifier); - if (value != NULL) - gtk_entry_set_text(GTK_ENTRY(input), value); - if (pce->secret) - { - gtk_entry_set_visibility(GTK_ENTRY(input), FALSE); -#if !GTK_CHECK_VERSION(2,16,0) - if (gtk_entry_get_invisible_char(GTK_ENTRY(input)) == '*') - gtk_entry_set_invisible_char(GTK_ENTRY(input), PIDGIN_INVISIBLE_CHAR); -#endif /* Less than GTK+ 2.16 */ - } - pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, TRUE, NULL); - g_signal_connect(G_OBJECT(input), "changed", - G_CALLBACK(addchat_set_sensitive_if_input_cb), data); - } - - /* Do the following for any type of input widget */ - if (focus) - { - gtk_widget_grab_focus(input); - focus = FALSE; - } - g_object_set_data(G_OBJECT(input), "identifier", (gpointer)pce->identifier); - g_object_set_data(G_OBJECT(input), "is_spin", GINT_TO_POINTER(pce->is_int)); - g_object_set_data(G_OBJECT(input), "required", GINT_TO_POINTER(pce->required)); - data->entries = g_list_append(data->entries, input); - - g_free(pce); - } - - g_list_free(list); - g_hash_table_destroy(defaults); - - /* Set whether the "OK" button should be clickable initially */ - addchat_set_sensitive_if_input_cb(NULL, data); - - gtk_widget_show_all(data->entries_box); -} - -static void -addchat_select_account_cb(GObject *w, PurpleAccount *account, - PidginAddChatData *data) -{ - if (strcmp(purple_account_get_protocol_id(data->account), - purple_account_get_protocol_id(account)) == 0) - { - data->account = account; - } - else - { - data->account = account; - rebuild_addchat_entries(data); - } -} - static void pidgin_blist_request_add_chat(PurpleAccount *account, PurpleGroup *group, const char *alias, const char *name) { PidginAddChatData *data; - PidginBuddyList *gtkblist; GList *l; PurpleConnection *gc; - GtkWidget *label; - GtkWidget *hbox; - GtkWidget *vbox; - GtkWidget *img; + GtkBox *vbox; if (account != NULL) { gc = purple_account_get_connection(account); @@ -7193,82 +7017,44 @@ } data = g_new0(PidginAddChatData, 1); - data->account = account; - data->default_chat_name = g_strdup(name); - - img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION, - gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE)); - - gtkblist = PIDGIN_BLIST(purple_get_blist()); - - data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - - data->window = gtk_dialog_new_with_buttons(_("Add Chat"), - gtkblist ? GTK_WINDOW(gtkblist->window) : NULL, GTK_DIALOG_NO_SEPARATOR, - _("Room _List"), 1, + vbox = GTK_BOX(make_blist_request_dialog((PidginBlistRequestData *)data, account, + _("Add Chat"), "add_chat", + _("Please enter an alias, and the appropriate information " + "about the chat you would like to add to your buddy list.\n"), + G_CALLBACK(chat_select_account_cb), chat_account_filter_func, + G_CALLBACK(add_chat_resp_cb))); + gtk_dialog_add_buttons(GTK_DIALOG(data->chat_data.rq_data.window), + _("Room List"), 1, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_ADD, GTK_RESPONSE_OK, NULL); - if (gtkblist) - gtk_window_set_transient_for(GTK_WINDOW(data->window), GTK_WINDOW(gtkblist->window)); - gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK); - gtk_container_set_border_width(GTK_CONTAINER(data->window), PIDGIN_HIG_BOX_SPACE); - gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE); - gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BORDER); - gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BOX_SPACE); - gtk_window_set_role(GTK_WINDOW(data->window), "add_chat"); - gtk_window_set_type_hint(GTK_WINDOW(data->window), - GDK_WINDOW_TYPE_HINT_DIALOG); - - hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); - gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox); - gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); - gtk_misc_set_alignment(GTK_MISC(img), 0, 0); - - vbox = gtk_vbox_new(FALSE, 5); - gtk_container_add(GTK_CONTAINER(hbox), vbox); - - label = gtk_label_new( - _("Please enter an alias, and the appropriate information " - "about the chat you would like to add to your buddy list.\n")); - gtk_widget_set_size_request(label, 400, -1); - gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0); - gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); - - data->account_menu = pidgin_account_option_menu_new(account, FALSE, - G_CALLBACK(addchat_select_account_cb), - chat_account_filter_func, data); - pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Account:"), data->sg, data->account_menu, TRUE, NULL); - - data->entries_box = gtk_vbox_new(FALSE, 5); - gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0); - gtk_box_pack_start(GTK_BOX(vbox), data->entries_box, TRUE, TRUE, 0); - - rebuild_addchat_entries(data); + data->chat_data.default_chat_name = g_strdup(name); + + rebuild_chat_entries((PidginChatData *)data, name); data->alias_entry = gtk_entry_new(); if (alias != NULL) gtk_entry_set_text(GTK_ENTRY(data->alias_entry), alias); gtk_entry_set_activates_default(GTK_ENTRY(data->alias_entry), TRUE); - pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("A_lias:"), data->sg, data->alias_entry, TRUE, NULL); + pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("A_lias:"), + data->chat_data.rq_data.sg, data->alias_entry, + TRUE, NULL); if (name != NULL) gtk_widget_grab_focus(data->alias_entry); data->group_combo = pidgin_text_combo_box_entry_new(group ? group->name : NULL, groups_tree()); - pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Group:"), data->sg, data->group_combo, TRUE, NULL); + pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Group:"), + data->chat_data.rq_data.sg, data->group_combo, + TRUE, NULL); data->autojoin = gtk_check_button_new_with_mnemonic(_("Auto_join when account becomes online.")); data->persistent = gtk_check_button_new_with_mnemonic(_("_Remain in chat after window is closed.")); gtk_box_pack_start(GTK_BOX(vbox), data->autojoin, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), data->persistent, FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(data->window), "response", - G_CALLBACK(add_chat_resp_cb), data); - - gtk_widget_show_all(data->window); + gtk_widget_show_all(data->chat_data.rq_data.window); } static void @@ -8195,4 +7981,3 @@ if (activeitem) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(activeitem), TRUE); } -
--- a/pidgin/gtkconv.c Fri May 01 21:36:29 2009 +0000 +++ b/pidgin/gtkconv.c Mon May 18 19:54:24 2009 +0000 @@ -4496,19 +4496,26 @@ } static void -buddy_added_cb(PurpleBuddy *buddy, PurpleConversation *conv) -{ - buddy_cb_common(buddy, conv, TRUE); -} - -static void -buddy_removed_cb(PurpleBuddy *buddy, PurpleConversation *conv) -{ +buddy_added_cb(PurpleBlistNode *node, PurpleConversation *conv) +{ + if (!PURPLE_BLIST_NODE_IS_BUDDY(node)) + return; + + buddy_cb_common(PURPLE_BUDDY(node), conv, TRUE); +} + +static void +buddy_removed_cb(PurpleBlistNode *node, PurpleConversation *conv) +{ + if (!PURPLE_BLIST_NODE_IS_BUDDY(node)) + return; + /* If there's another buddy for the same "dude" on the list, do nothing. */ - if (purple_find_buddy(buddy->account, buddy->name) != NULL) + if (purple_find_buddy(purple_buddy_get_account(PURPLE_BUDDY(node)), + purple_buddy_get_name(PURPLE_BUDDY(node))) != NULL) return; - buddy_cb_common(buddy, conv, FALSE); + buddy_cb_common(PURPLE_BUDDY(node), conv, FALSE); } static void send_menu_cb(GtkWidget *widget, PidginConversation *gtkconv) @@ -4747,9 +4754,9 @@ "weight", CHAT_USERS_WEIGHT_COLUMN, NULL); - purple_signal_connect(blist_handle, "buddy-added", + purple_signal_connect(blist_handle, "blist-node-added", gtkchat, PURPLE_CALLBACK(buddy_added_cb), conv); - purple_signal_connect(blist_handle, "buddy-removed", + purple_signal_connect(blist_handle, "blist-node-removed", gtkchat, PURPLE_CALLBACK(buddy_removed_cb), conv); purple_signal_connect(blist_handle, "blist-node-aliased", gtkchat, PURPLE_CALLBACK(blist_node_aliased_cb), conv); @@ -5121,7 +5128,8 @@ GList *list; g_return_if_fail(bnode); - g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(bnode)); + if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) + return; for (list = pidgin_conv_windows_get_list(); list; list = list->next) { @@ -6301,6 +6309,10 @@ if (!smiley) return; + smiley->data = g_realloc(smiley->data, smiley->datasize + size); + g_memmove(smiley->data + smiley->datasize, data, size); + smiley->datasize += size; + loader = smiley->loader; if (!loader) return; @@ -8017,9 +8029,9 @@ handle, PURPLE_CALLBACK(account_status_changed_cb), NULL); /* Callbacks to update a conversation */ - purple_signal_connect(blist_handle, "buddy-added", handle, + purple_signal_connect(blist_handle, "blist-node-added", handle, G_CALLBACK(buddy_update_cb), NULL); - purple_signal_connect(blist_handle, "buddy-removed", handle, + purple_signal_connect(blist_handle, "blist-node-removed", handle, G_CALLBACK(buddy_update_cb), NULL); purple_signal_connect(blist_handle, "buddy-signed-on", handle, PURPLE_CALLBACK(update_buddy_sign), "on"); @@ -8316,6 +8328,9 @@ gtkconv->unseen_state = state; } + purple_conversation_set_data(gtkconv->active_conv, "unseen-count", GINT_TO_POINTER(gtkconv->unseen_count)); + purple_conversation_set_data(gtkconv->active_conv, "unseen-state", GINT_TO_POINTER(gtkconv->unseen_state)); + purple_conversation_update(gtkconv->active_conv, PURPLE_CONV_UPDATE_UNSEEN); }
--- a/pidgin/gtkimhtml.c Fri May 01 21:36:29 2009 +0000 +++ b/pidgin/gtkimhtml.c Mon May 18 19:54:24 2009 +0000 @@ -82,6 +82,11 @@ GtkTextMark *mark; }; +typedef struct { + GtkIMHtmlScalable *image; + gpointer data; + gsize datasize; +} GtkIMHtmlImageSave; struct im_image_data { int id; @@ -3641,96 +3646,109 @@ } static void -image_save_yes_cb(GtkIMHtmlImage *image, const char *filename) -{ - gchar *type = NULL; +image_save_yes_cb(GtkIMHtmlImageSave *save, const char *filename) +{ GError *error = NULL; -#if GTK_CHECK_VERSION(2,2,0) - GSList *formats = gdk_pixbuf_get_formats(); -#else - char *basename = g_path_get_basename(filename); - char *ext = strrchr(basename, '.'); -#endif - char *newfilename; + GtkIMHtmlImage *image = (GtkIMHtmlImage *)save->image; gtk_widget_destroy(image->filesel); image->filesel = NULL; + if (save->data && save->datasize) { +#if GLIB_CHECK_VERSION(2,8,0) + g_file_set_contents(filename, save->data, save->datasize, &error); +#else + purple_util_write_data_to_file_absolute(filename, save->data, save->datasize); +#endif + } else { + gchar *type = NULL; #if GTK_CHECK_VERSION(2,2,0) - while (formats) { - GdkPixbufFormat *format = formats->data; - gchar **extensions = gdk_pixbuf_format_get_extensions(format); - gpointer p = extensions; - - while(gdk_pixbuf_format_is_writable(format) && extensions && extensions[0]){ - gchar *fmt_ext = extensions[0]; - const gchar* file_ext = filename + strlen(filename) - strlen(fmt_ext); - - if(!g_ascii_strcasecmp(fmt_ext, file_ext)){ - type = gdk_pixbuf_format_get_name(format); + GSList *formats = gdk_pixbuf_get_formats(); +#else + char *basename = g_path_get_basename(filename); + char *ext = strrchr(basename, '.'); +#endif + char *newfilename; + +#if GTK_CHECK_VERSION(2,2,0) + while (formats) { + GdkPixbufFormat *format = formats->data; + gchar **extensions = gdk_pixbuf_format_get_extensions(format); + gpointer p = extensions; + + while(gdk_pixbuf_format_is_writable(format) && extensions && extensions[0]){ + gchar *fmt_ext = extensions[0]; + const gchar* file_ext = filename + strlen(filename) - strlen(fmt_ext); + + if(!g_ascii_strcasecmp(fmt_ext, file_ext)){ + type = gdk_pixbuf_format_get_name(format); + break; + } + + extensions++; + } + + g_strfreev(p); + + if (type) break; - } - - extensions++; + + formats = formats->next; } - g_strfreev(p); - - if (type) - break; - - formats = formats->next; - } - - g_slist_free(formats); + g_slist_free(formats); +#else + /* this is really ugly code, but I think it will work */ + if (ext) { + ext++; + if (!g_ascii_strcasecmp(ext, "jpeg") || !g_ascii_strcasecmp(ext, "jpg")) + type = g_strdup("jpeg"); + else if (!g_ascii_strcasecmp(ext, "png")) + type = g_strdup("png"); + } + + g_free(basename); +#endif + + /* If I can't find a valid type, I will just tell the user about it and then assume + it's a png */ + if (!type){ + char *basename, *tmp; + char *dirname; +#if GTK_CHECK_VERSION(2,4,0) + GtkWidget *dialog = gtk_message_dialog_new_with_markup(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, + _("<span size='larger' weight='bold'>Unrecognized file type</span>\n\nDefaulting to PNG.")); #else - /* this is really ugly code, but I think it will work */ - if (ext) { - ext++; - if (!g_ascii_strcasecmp(ext, "jpeg") || !g_ascii_strcasecmp(ext, "jpg")) - type = g_strdup("jpeg"); - else if (!g_ascii_strcasecmp(ext, "png")) + GtkWidget *dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, + _("Unrecognized file type\n\nDefaulting to PNG.")); +#endif + + g_signal_connect_swapped(dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog); + gtk_widget_show(dialog); + type = g_strdup("png"); + dirname = g_path_get_dirname(filename); + basename = g_path_get_basename(filename); + tmp = strrchr(basename, '.'); + if (tmp != NULL) + tmp[0] = '\0'; + newfilename = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s.png", dirname, basename); + g_free(dirname); + g_free(basename); + } else { + /* + * We're able to save the file in it's original format, so we + * can use the original file name. + */ + newfilename = g_strdup(filename); + } + + gdk_pixbuf_save(image->pixbuf, newfilename, type, &error, NULL); + + g_free(newfilename); + g_free(type); } - g_free(basename); -#endif - - /* If I can't find a valid type, I will just tell the user about it and then assume - it's a png */ - if (!type){ - char *basename, *tmp; -#if GTK_CHECK_VERSION(2,4,0) - GtkWidget *dialog = gtk_message_dialog_new_with_markup(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, - _("<span size='larger' weight='bold'>Unrecognized file type</span>\n\nDefaulting to PNG.")); -#else - GtkWidget *dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, - _("Unrecognized file type\n\nDefaulting to PNG.")); -#endif - - g_signal_connect_swapped(dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog); - gtk_widget_show(dialog); - - type = g_strdup("png"); - basename = g_path_get_basename(filename); - tmp = strrchr(basename, '.'); - if (tmp != NULL) - tmp[0] = '\0'; - newfilename = g_strdup_printf("%s.png", basename); - g_free(basename); - } else { - /* - * We're able to save the file in it's original format, so we - * can use the original file name. - */ - newfilename = g_strdup(filename); - } - - gdk_pixbuf_save(image->pixbuf, newfilename, type, &error, NULL); - - g_free(newfilename); - g_free(type); - if (error){ #if GTK_CHECK_VERSION(2,4,0) GtkWidget *dialog = gtk_message_dialog_new_with_markup(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, @@ -3747,9 +3765,10 @@ #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ static void -image_save_check_if_exists_cb(GtkWidget *widget, gint response, GtkIMHtmlImage *image) +image_save_check_if_exists_cb(GtkWidget *widget, gint response, GtkIMHtmlImageSave *save) { gchar *filename; + GtkIMHtmlImage *image = (GtkIMHtmlImage *)save->image; if (response != GTK_RESPONSE_ACCEPT) { gtk_widget_destroy(widget); @@ -3760,9 +3779,10 @@ filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); #else /* FILECHOOSER */ static void -image_save_check_if_exists_cb(GtkWidget *button, GtkIMHtmlImage *image) +image_save_check_if_exists_cb(GtkWidget *button, GtkIMHtmlImageSave *save) { gchar *filename; + GtkIMHtmlImage *image = (GtkIMHtmlImage *)save->image; filename = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(image->filesel))); @@ -3795,7 +3815,7 @@ image_save_yes_cb(image, filename); */ - image_save_yes_cb(image, filename); + image_save_yes_cb(save, filename); g_free(filename); } @@ -3810,8 +3830,10 @@ #endif /* FILECHOOSER */ static void -gtk_imhtml_image_save(GtkWidget *w, GtkIMHtmlImage *image) -{ +gtk_imhtml_image_save(GtkWidget *w, GtkIMHtmlImageSave *save) +{ + GtkIMHtmlImage *image = (GtkIMHtmlImage *)save->image; + if (image->filesel != NULL) { gtk_window_present(GTK_WINDOW(image->filesel)); return; @@ -3828,7 +3850,7 @@ if (image->filename != NULL) gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(image->filesel), image->filename); g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(image->filesel)), "response", - G_CALLBACK(image_save_check_if_exists_cb), image); + G_CALLBACK(image_save_check_if_exists_cb), save); #else /* FILECHOOSER */ image->filesel = gtk_file_selection_new(_("Save Image")); if (image->filename != NULL) @@ -3838,7 +3860,7 @@ g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(image->filesel)->cancel_button), "clicked", G_CALLBACK(image_save_cancel_cb), image); g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(image->filesel)->ok_button), "clicked", - G_CALLBACK(image_save_check_if_exists_cb), image); + G_CALLBACK(image_save_check_if_exists_cb), save); #endif /* FILECHOOSER */ gtk_widget_show(image->filesel); @@ -3860,30 +3882,29 @@ * embedded in the conversation. Someone should make the Purple core handle * all of that. */ -static gboolean gtk_imhtml_image_clicked(GtkWidget *w, GdkEvent *event, GtkIMHtmlImage *image) +static gboolean gtk_imhtml_image_clicked(GtkWidget *w, GdkEvent *event, GtkIMHtmlImageSave *save) { GdkEventButton *event_button = (GdkEventButton *) event; + GtkIMHtmlImage *image = (GtkIMHtmlImage *)save->image; if (event->type == GDK_BUTTON_RELEASE) { if(event_button->button == 3) { GtkWidget *img, *item, *menu; - gchar *text = g_strdup_printf(_("_Save Image...")); menu = gtk_menu_new(); /* buttons and such */ img = gtk_image_new_from_stock(GTK_STOCK_SAVE, GTK_ICON_SIZE_MENU); - item = gtk_image_menu_item_new_with_mnemonic(text); + item = gtk_image_menu_item_new_with_mnemonic(_("_Save Image...")); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), img); - g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(gtk_imhtml_image_save), image); + g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(gtk_imhtml_image_save), save); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); /* Add menu item for adding custom smiley to local smileys */ /* we only add the menu if the image is of "custom smiley size" <= 96x96 pixels */ if (image->width <= 96 && image->height <= 96) { - text = g_strdup_printf(_("_Add Custom Smiley...")); img = gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU); - item = gtk_image_menu_item_new_with_mnemonic(text); + item = gtk_image_menu_item_new_with_mnemonic(_("_Add Custom Smiley...")); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), img); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(gtk_imhtml_custom_smiley_save), image); @@ -3894,7 +3915,6 @@ gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event_button->button, event_button->time); - g_free(text); return TRUE; } } @@ -3909,7 +3929,7 @@ static gboolean gtk_imhtml_smiley_clicked(GtkWidget *w, GdkEvent *event, GtkIMHtmlSmiley *smiley) { GdkPixbufAnimation *anim = NULL; - GtkIMHtmlScalable *image = NULL; + GtkIMHtmlImageSave *save = NULL; gboolean ret; if (event->type != GDK_BUTTON_RELEASE || ((GdkEventButton*)event)->button != 3) @@ -3919,9 +3939,14 @@ if (!anim) return FALSE; - image = gtk_imhtml_animation_new(anim, smiley->smile, 0); - ret = gtk_imhtml_image_clicked(w, event, (GtkIMHtmlImage*)image); - g_object_set_data_full(G_OBJECT(w), "image-data", image, (GDestroyNotify)gtk_imhtml_animation_free); + save = g_new0(GtkIMHtmlImageSave, 1); + save->image = (GtkIMHtmlScalable *)gtk_imhtml_animation_new(anim, smiley->smile, 0); + save->data = smiley->data; /* Do not need to memdup here, since the smiley is not + destroyed before this GtkIMHtmlImageSave */ + save->datasize = smiley->datasize; + ret = gtk_imhtml_image_clicked(w, event, save); + g_object_set_data_full(G_OBJECT(w), "image-data", save->image, (GDestroyNotify)gtk_imhtml_animation_free); + g_object_set_data_full(G_OBJECT(w), "image-save-data", save, (GDestroyNotify)g_free); return ret; } @@ -3955,6 +3980,7 @@ GtkWidget *box = gtk_event_box_new(); char *tag; GtkTextChildAnchor *anchor = gtk_text_buffer_create_child_anchor(imhtml->text_buffer, iter); + GtkIMHtmlImageSave *save; gtk_container_add(GTK_CONTAINER(box), GTK_WIDGET(image->image)); @@ -3969,7 +3995,11 @@ g_object_set_data(G_OBJECT(anchor), "gtkimhtml_plaintext", "[Image]"); gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(imhtml), box, anchor); - g_signal_connect(G_OBJECT(box), "event", G_CALLBACK(gtk_imhtml_image_clicked), image); + + save = g_new0(GtkIMHtmlImageSave, 1); + save->image = scale; + g_signal_connect(G_OBJECT(box), "event", G_CALLBACK(gtk_imhtml_image_clicked), save); + g_object_set_data_full(G_OBJECT(box), "image-save-data", save, (GDestroyNotify)g_free); } GtkIMHtmlScalable *gtk_imhtml_hr_new() @@ -4420,15 +4450,19 @@ * people can highlight stuff. */ /* gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(imhtml), editable); */ - imhtml->editable = editable; - imhtml->format_functions = GTK_IMHTML_ALL; - - if (editable) - { + if (editable && !imhtml->editable) { g_signal_connect_after(G_OBJECT(GTK_IMHTML(imhtml)->text_buffer), "mark-set", G_CALLBACK(mark_set_cb), imhtml); g_signal_connect(G_OBJECT(imhtml), "backspace", G_CALLBACK(smart_backspace_cb), NULL); + } else if (!editable && imhtml->editable) { + g_signal_handlers_disconnect_by_func(G_OBJECT(GTK_IMHTML(imhtml)->text_buffer), + mark_set_cb, imhtml); + g_signal_handlers_disconnect_by_func(G_OBJECT(imhtml), + smart_backspace_cb, NULL); } + + imhtml->editable = editable; + imhtml->format_functions = GTK_IMHTML_ALL; } void gtk_imhtml_set_whole_buffer_formatting_only(GtkIMHtml *imhtml, gboolean wbfo) @@ -5769,6 +5803,7 @@ g_object_unref(smiley->icon); if (smiley->loader) g_object_unref(smiley->loader); + g_free(smiley->data); g_free(smiley); } @@ -5880,3 +5915,28 @@ g_signal_connect(G_OBJECT(imhtml), "message_send", G_CALLBACK(return_add_newline_cb), NULL); } + +void gtk_imhtml_set_populate_primary_clipboard(GtkIMHtml *imhtml, gboolean populate) +{ + gulong signal_id; + signal_id = g_signal_handler_find(imhtml->text_buffer, + G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_UNBLOCKED, 0, 0, NULL, + mark_set_so_update_selection_cb, NULL); + if (populate) { + if (!signal_id) { + /* We didn't find an unblocked signal handler, which means there + is a blocked handler. Now unblock it. + This is necessary to avoid a mutex-lock when the debug message + saying 'no handler is blocked' is printed in the debug window. + -- sad + */ + g_signal_handlers_unblock_matched(imhtml->text_buffer, + G_SIGNAL_MATCH_FUNC, 0, 0, NULL, + mark_set_so_update_selection_cb, NULL); + } + } else { + /* Block only if we found an unblocked handler */ + if (signal_id) + g_signal_handler_block(imhtml->text_buffer, signal_id); + } +}
--- a/pidgin/gtkimhtml.h Fri May 01 21:36:29 2009 +0000 +++ b/pidgin/gtkimhtml.h Mon May 18 19:54:24 2009 +0000 @@ -188,6 +188,8 @@ GSList *anchors; GtkIMHtmlSmileyFlags flags; GtkIMHtml *imhtml; + gpointer data; /** @Since 2.6.0 */ + gsize datasize; /** @Since 2.6.0 */ }; struct _GtkIMHtmlScalable { @@ -957,6 +959,16 @@ */ void gtk_imhtml_set_return_inserts_newline(GtkIMHtml *imhtml); +/** + * By default this widget populates the PRIMARY clipboard with any selected + * text (as you would expect). For scenarios (e.g. select-on-focus) where this + * would be problematic, this function can disable the PRIMARY population. + * + * @param imhtml The GtkIMHtml to enable/disable populating PRIMARY + * @param populate enable/disable PRIMARY population + */ +void gtk_imhtml_set_populate_primary_clipboard(GtkIMHtml *imhtml, gboolean populate); + /*@}*/ #ifdef __cplusplus
--- a/pidgin/gtknotify.c Fri May 01 21:36:29 2009 +0000 +++ b/pidgin/gtknotify.c Mon May 18 19:54:24 2009 +0000 @@ -1104,6 +1104,9 @@ { PidginNotifyMailData *data = (PidginNotifyMailData *)ui_handle; + /* Close the notification dialog */ + pidgin_notify_emails(purple_account_get_connection(data->account), + 0, FALSE, NULL, NULL, NULL, NULL); if (data) { g_free(data->url); g_free(data);
--- a/pidgin/gtksavedstatuses.c Fri May 01 21:36:29 2009 +0000 +++ b/pidgin/gtksavedstatuses.c Mon May 18 19:54:24 2009 +0000 @@ -390,7 +390,7 @@ gtk_widget_set_sensitive(dialog->use_button, (num_selected == 1) && can_use); gtk_widget_set_sensitive(dialog->modify_button, (num_selected > 0)); - gtk_widget_set_sensitive(dialog->delete_button, can_delete); + gtk_widget_set_sensitive(dialog->delete_button, num_selected > 0 && can_delete); g_list_free(sel_paths); } @@ -648,6 +648,7 @@ button = pidgin_dialog_add_button(GTK_DIALOG(win), PIDGIN_STOCK_MODIFY, G_CALLBACK(status_window_modify_cb), dialog); dialog->modify_button = button; + gtk_widget_set_sensitive(button, FALSE); /* Delete button */ button = pidgin_dialog_add_button(GTK_DIALOG(win), GTK_STOCK_DELETE,
--- a/pidgin/gtkstatusbox.c Fri May 01 21:36:29 2009 +0000 +++ b/pidgin/gtkstatusbox.c Mon May 18 19:54:24 2009 +0000 @@ -93,6 +93,7 @@ static void do_colorshift (GdkPixbuf *dest, GdkPixbuf *src, int shift); static void icon_choose_cb(const char *filename, gpointer data); static void remove_buddy_icon_cb(GtkWidget *w, PidginStatusBox *box); +static void choose_buddy_icon_cb(GtkWidget *w, PidginStatusBox *box); enum { /** A PidginStatusBoxItemType */ @@ -265,6 +266,9 @@ break; } + gtk_imhtml_set_populate_primary_clipboard( + GTK_IMHTML(status_box->imhtml), TRUE); + if (status_no != -1) { GtkTreePath *path; gtk_widget_set_sensitive(GTK_WIDGET(status_box), FALSE); @@ -314,6 +318,10 @@ box->icon_box_menu = gtk_menu_new(); + menu_item = pidgin_new_item_from_stock(box->icon_box_menu, _("Select Buddy Icon"), GTK_STOCK_ADD, + G_CALLBACK(choose_buddy_icon_cb), + box, 0, 0, NULL); + menu_item = pidgin_new_item_from_stock(box->icon_box_menu, _("Remove"), GTK_STOCK_REMOVE, G_CALLBACK(remove_buddy_icon_cb), box, 0, 0, NULL); @@ -324,13 +332,7 @@ event->button, event->time); } else { - if (box->buddy_icon_sel) { - gtk_window_present(GTK_WINDOW(box->buddy_icon_sel)); - return FALSE; - } - - box->buddy_icon_sel = pidgin_buddy_icon_chooser_new(GTK_WINDOW(gtk_widget_get_toplevel(widget)), icon_choose_cb, box); - gtk_widget_show_all(box->buddy_icon_sel); + choose_buddy_icon_cb(widget, box); } return FALSE; } @@ -465,16 +467,15 @@ PurpleStoredImage *img = NULL; if (filename != NULL) - { - gchar *contents; - gsize size; - if (g_file_get_contents(filename, &contents, &size, NULL)) - { - img = purple_imgstore_add(contents, size, filename); - } - } + img = purple_imgstore_new_from_file(filename); pidgin_status_box_set_buddy_icon(status_box, img); + if (img) + /* + * purple_imgstore_new gives us a reference and + * pidgin_status_box_set_buddy_icon also takes one. + */ + purple_imgstore_unref(img); } status_box->hand_cursor = gdk_cursor_new (GDK_HAND2); @@ -1149,6 +1150,8 @@ { purple_timeout_remove(status_box->typing); status_box->typing = 0; + gtk_imhtml_set_populate_primary_clipboard( + GTK_IMHTML(status_box->imhtml), TRUE); if (status_box->account != NULL) update_to_reflect_account_status(status_box, status_box->account, purple_account_get_active_status(status_box->account)); @@ -1469,6 +1472,13 @@ if (filename) data = pidgin_convert_buddy_icon(plug, filename, &len); img = purple_buddy_icons_set_account_icon(box->account, data, len); + if (img) + /* + * set_account_icon doesn't give us a reference, but we + * unref one below (for the other code path) + */ + purple_imgstore_ref(img); + purple_account_set_buddy_icon_path(box->account, filename); purple_account_set_bool(box->account, "use-global-buddyicon", (filename != NULL)); @@ -1488,7 +1498,7 @@ size_t len = 0; if (filename) data = pidgin_convert_buddy_icon(plug, filename, &len); - img = purple_buddy_icons_set_account_icon(account, data, len); + purple_buddy_icons_set_account_icon(account, data, len); purple_account_set_buddy_icon_path(account, filename); } } @@ -1496,17 +1506,12 @@ /* Even if no accounts were processed, load the icon that was set. */ if (filename != NULL) - { - gchar *contents; - gsize size; - if (g_file_get_contents(filename, &contents, &size, NULL)) - { - img = purple_imgstore_add(contents, size, filename); - } - } + img = purple_imgstore_new_from_file(filename); } pidgin_status_box_set_buddy_icon(box, img); + if (img) + purple_imgstore_unref(img); } static void @@ -1523,6 +1528,17 @@ } static void +choose_buddy_icon_cb(GtkWidget *w, PidginStatusBox *box) +{ + if (box->buddy_icon_sel) { + gtk_window_present(GTK_WINDOW(box->buddy_icon_sel)); + } else { + box->buddy_icon_sel = pidgin_buddy_icon_chooser_new(GTK_WINDOW(gtk_widget_get_toplevel(w)), icon_choose_cb, box); + gtk_widget_show_all(box->buddy_icon_sel); + } +} + +static void icon_choose_cb(const char *filename, gpointer data) { PidginStatusBox *box = data; @@ -1876,7 +1892,7 @@ g_signal_connect(G_OBJECT(status_box->imhtml), "key_press_event", G_CALLBACK(imhtml_remove_focus), status_box); g_signal_connect_swapped(G_OBJECT(status_box->imhtml), "message_send", G_CALLBACK(remove_typing_cb), status_box); - gtk_imhtml_set_editable(GTK_IMHTML(status_box->imhtml), TRUE); + #ifdef USE_GTKSPELL if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/spellcheck")) pidgin_setup_gtkspell(GTK_TEXT_VIEW(status_box->imhtml)); @@ -2583,6 +2599,9 @@ return; } + gtk_imhtml_set_populate_primary_clipboard( + GTK_IMHTML(status_box->imhtml), TRUE); + purple_timeout_remove(status_box->typing); status_box->typing = 0; @@ -2682,6 +2701,10 @@ status_box->typing = purple_timeout_add_seconds(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, status_box); gtk_widget_grab_focus(status_box->imhtml); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(status_box->imhtml)); + + gtk_imhtml_set_populate_primary_clipboard( + GTK_IMHTML(status_box->imhtml), FALSE); + gtk_text_buffer_get_bounds(buffer, &start, &end); gtk_text_buffer_move_mark(buffer, gtk_text_buffer_get_mark(buffer, "insert"), &end); gtk_text_buffer_move_mark(buffer, gtk_text_buffer_get_mark(buffer, "selection_bound"), &start);
--- a/pidgin/pixmaps/emotes/default/24/default.theme.in Fri May 01 21:36:29 2009 +0000 +++ b/pidgin/pixmaps/emotes/default/24/default.theme.in Mon May 18 19:54:24 2009 +0000 @@ -399,13 +399,16 @@ smile-big.png :D :-D =D wink.png ;) ;-) ;^) shock.png :-o -tongue.png :P :-P +tongue.png :P :-P :-p glasses-cool.png B-) angry.png X-( -sad.png :( +sad.png :( :-( =( crying.png :'( neutral.png :-| thinking.png :-/ love.png <3 monkey.png :(|) victory.png \\m/ +! skywalker.png C:-) c:-) C:) c:) +! monkey.png :-(|) :(|) 8-|) +! cyclops.png O-) o-)
--- a/pidgin/pixmaps/emotes/small/16/small.theme.in Fri May 01 21:36:29 2009 +0000 +++ b/pidgin/pixmaps/emotes/small/16/small.theme.in Mon May 18 19:54:24 2009 +0000 @@ -161,10 +161,10 @@ smile-big.png :D :-D =D wink.png ;) ;-) ;^) shock.png :-o -tongue.png :P :-P +tongue.png :P :-P :-p glasses-cool.png B-) angry.png X-( -sad.png :( +sad.png :( :-( =( crying.png :'( neutral.png :-| thinking.png :-/
--- a/pidgin/win32/pidgin_dll_rc.rc.in Fri May 01 21:36:29 2009 +0000 +++ b/pidgin/win32/pidgin_dll_rc.rc.in Mon May 18 19:54:24 2009 +0000 @@ -2,8 +2,6 @@ #include "version.h" #include "resource.h" -#define PIXMAPDIR "pixmaps/tray/16/" - VS_VERSION_INFO VERSIONINFO FILEVERSION PURPLE_MAJOR_VERSION,PURPLE_MINOR_VERSION,PURPLE_MICRO_VERSION,0 PRODUCTVERSION PURPLE_MAJOR_VERSION,PURPLE_MINOR_VERSION,PURPLE_MICRO_VERSION,0 @@ -33,11 +31,11 @@ END END -PIDGIN_TRAY_AVAILABLE_4BIT ICON PIXMAPDIR "available_4bit.ico" -PIDGIN_TRAY_AWAY_4BIT ICON PIXMAPDIR "away_4bit.ico" -PIDGIN_TRAY_BUSY_4BIT ICON PIXMAPDIR "busy_4bit.ico" -PIDGIN_TRAY_XA_4BIT ICON PIXMAPDIR "extended-away_4bit.ico" -PIDGIN_TRAY_OFFLINE_4BIT ICON PIXMAPDIR "offline_4bit.ico" -PIDGIN_TRAY_CONNECTING_4BIT ICON PIXMAPDIR "connecting_4bit.ico" -PIDGIN_TRAY_PENDING_4BIT ICON PIXMAPDIR "message_4bit.ico" -PIDGIN_TRAY_INVISIBLE_4BIT ICON PIXMAPDIR "invisible_4bit.ico" +PIDGIN_TRAY_AVAILABLE_4BIT ICON "pixmaps/tray/16/available_4bit.ico" +PIDGIN_TRAY_AWAY_4BIT ICON "pixmaps/tray/16/away_4bit.ico" +PIDGIN_TRAY_BUSY_4BIT ICON "pixmaps/tray/16/busy_4bit.ico" +PIDGIN_TRAY_XA_4BIT ICON "pixmaps/tray/16/extended-away_4bit.ico" +PIDGIN_TRAY_OFFLINE_4BIT ICON "pixmaps/tray/16/offline_4bit.ico" +PIDGIN_TRAY_CONNECTING_4BIT ICON "pixmaps/tray/16/connecting_4bit.ico" +PIDGIN_TRAY_PENDING_4BIT ICON "pixmaps/tray/16/message_4bit.ico" +PIDGIN_TRAY_INVISIBLE_4BIT ICON "pixmaps/tray/16/invisible_4bit.ico"
--- a/pidgin/win32/pidgin_exe_rc.rc.in Fri May 01 21:36:29 2009 +0000 +++ b/pidgin/win32/pidgin_exe_rc.rc.in Mon May 18 19:54:24 2009 +0000 @@ -2,8 +2,6 @@ #include "resource.h" #include "version.h" -#define PIXMAPDIR "pixmaps/" - VS_VERSION_INFO VERSIONINFO FILEVERSION PURPLE_MAJOR_VERSION,PURPLE_MINOR_VERSION,PURPLE_MICRO_VERSION,0 PRODUCTVERSION PURPLE_MAJOR_VERSION,PURPLE_MINOR_VERSION,PURPLE_MICRO_VERSION,0 @@ -33,4 +31,4 @@ END END -PIDGIN_ICON ICON PIXMAPDIR "pidgin.ico" +PIDGIN_ICON ICON "pixmaps/pidgin.ico"
--- a/pidgin/win32/winpidgin.c Fri May 01 21:36:29 2009 +0000 +++ b/pidgin/win32/winpidgin.c Mon May 18 19:54:24 2009 +0000 @@ -586,7 +586,7 @@ return; } - printf("Trying to handle protocol message:\n'%*s'\n", len, tmp1); + printf("Trying to handle protocol message:\n'%.*s'\n", len, tmp1); /* MEM_COMMIT initializes the memory to zero, * so we don't need to worry that our section of tmp1 isn't nul-terminated */
--- a/po/ca.po Fri May 01 21:36:29 2009 +0000 +++ b/po/ca.po Mon May 18 19:54:24 2009 +0000 @@ -33,8 +33,8 @@ msgstr "" "Project-Id-Version: Pidgin\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-04-30 10:37-0400\n" -"PO-Revision-Date: 2009-03-05 22:37+0100\n" +"POT-Creation-Date: 2009-05-17 14:59+0200\n" +"PO-Revision-Date: 2009-05-17 15:05+0200\n" "Last-Translator: Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>\n" "Language-Team: Catalan <tradgnome@softcatala.net>\n" "MIME-Version: 1.0\n" @@ -902,12 +902,11 @@ msgid "System Log" msgstr "Registre del sistema" -#, fuzzy msgid "Calling ... " -msgstr "S'està calculant..." +msgstr "S'està trucant..." msgid "Hangup" -msgstr "" +msgstr "Penja" #. Number of actions msgid "Accept" @@ -917,25 +916,26 @@ msgstr "Rebutja" msgid "Call in progress." -msgstr "" +msgstr "S'està fent una trucada." msgid "The call has been terminated." -msgstr "" +msgstr "Ha finalitzat la trucada." #, c-format msgid "%s wishes to start an audio session with you." -msgstr "" +msgstr "%s vol iniciar una sessió d'àudio." #, c-format msgid "%s is trying to start an unsupported media session type with you." msgstr "" - -#, fuzzy +"%s està intentant iniciar una sessió amb medi d'un tipus que no està " +"implementat." + msgid "You have rejected the call." -msgstr "Heu sortit del canal%s%s" +msgstr "Heu rebutjat la trucada." msgid "call: Make an audio call." -msgstr "" +msgstr "call: fa una trucada d'àudio." msgid "Emails" msgstr "Correus electrònics" @@ -1594,22 +1594,24 @@ "\n" "Fetching TinyURL..." msgstr "" +"\n" +"S'està aconseguint un TinyURL..." msgid "Only create TinyURL for urls of this length or greater" -msgstr "" +msgstr "Crea TinyURL per a URL així de llargues o més" msgid "TinyURL (or other) address prefix" -msgstr "" - -#, fuzzy +msgstr "Prefix de l'adreça TinyURL (o altra)" + msgid "TinyURL" -msgstr "URL de la melodia" +msgstr "TinyURL" msgid "TinyURL plugin" -msgstr "" +msgstr "Connector TinyURL" msgid "When receiving a message with URL(s), TinyURL for easier copying" msgstr "" +"Quan rebeu missagtes amb URL, feu servir TinyURL per a copiar més fàcilment" msgid "accounts" msgstr "comptes" @@ -1814,6 +1816,8 @@ msgid "+++ %s signed off" msgstr "+++ %s se n'ha anat" +#. Unknown error +#. Unknown error! msgid "Unknown error" msgstr "Error desconegut" @@ -1860,9 +1864,8 @@ msgid "%s left the room (%s)." msgstr "%s ha sortit de la sala (%s)." -#, fuzzy msgid "Invite to chat" -msgstr "Convida a la conferència" +msgstr "Convida al xat" #. Put our happy label in it. msgid "" @@ -2705,10 +2708,10 @@ msgid "Do not ask. Always save in pounce." msgstr "No ho demanis, desa-ho sempre en un avís." -#, fuzzy msgid "One Time Password" -msgstr "Introduïu la contrasenya" - +msgstr "Contrasenya d'un sol ús" + +# FIXME ? #. *< type #. *< ui_requirement #. *< flags @@ -2716,13 +2719,13 @@ #. *< priority #. *< id msgid "One Time Password Support" -msgstr "" +msgstr "Contrasenyes d'un sol ús" #. *< name #. *< version #. * summary msgid "Enforce that passwords are used only once." -msgstr "" +msgstr "Força que les contrasenyes només s'emprin una vegada." #. * description msgid "" @@ -2730,6 +2733,10 @@ "are only used in a single successful connection.\n" "Note: The account password must not be saved for this to work." msgstr "" +"Us permet forçar que les contrasenyes siguin d'un sol ús per a comptes dels " +"quals no es desin les contrasenyes.\n" +"Nota: per poder fer servir això, cal que no es desi la contrasenya del " +"compte." #. *< type #. *< ui_requirement @@ -3483,13 +3490,12 @@ #. We only want to do the following dance if the connection #. has not been successfully completed. If it has, just #. notify the user that their /nick command didn't go. -#, fuzzy, c-format +#, c-format msgid "The nickname \"%s\" is already being used." -msgstr "Aquest nom de xat ja existeix" - -#, fuzzy +msgstr "Ja hi ha algú amb el sobrenom «%s»." + msgid "Nickname in use" -msgstr "Sobrenom: %s\n" +msgstr "El sobrenom ja s'està fent servir" msgid "Cannot change nick" msgstr "No es pot canviar el sobrenom" @@ -3764,33 +3770,27 @@ msgstr "Error en el SASL" msgid "The BOSH connection manager terminated your session." -msgstr "" - -#, fuzzy +msgstr "El gestor de connexions BOSH ha tancat la connexió." + msgid "No session ID given" -msgstr "No s'ha indicat cap motiu" - -#, fuzzy +msgstr "No s'ha indicat cap ID" + msgid "Unsupported version of BOSH protocol" -msgstr "Aquesta versió no està implementada" - -#, fuzzy +msgstr "Aquesta versió del protocol BOSH no està implementada" + msgid "Unable to establish a connection with the server" -msgstr "" -"No s'ha pogut establir una connexió amb al servidor:\n" -"%s" +msgstr "No s'ha pogut establir una connexió amb el servidor" #, c-format msgid "" "Could not establish a connection with the server:\n" "%s" msgstr "" -"No s'ha pogut establir una connexió amb al servidor:\n" +"No s'ha pogut establir una connexió amb el servidor:\n" "%s" -#, fuzzy msgid "Unable to establish SSL connection" -msgstr "No s'ha pogut inicialitzar la connexió" +msgstr "No s'ha pogut establir una connexió SSL" msgid "Unable to create socket" msgstr "No s'ha pogut crear el sòcol" @@ -3864,9 +3864,8 @@ msgid "Operating System" msgstr "Sistema operatiu" -#, fuzzy msgid "Local Time" -msgstr "Fitxer local:" +msgstr "Hora local" msgid "Last Activity" msgstr "Darrera activitat" @@ -4040,6 +4039,13 @@ msgid "Resource" msgstr "Recurs" +#, c-format +msgid "%s ago" +msgstr "fa %s" + +msgid "Logged off" +msgstr "Desconnectat" + # Segons la viquipèdia msgid "Middle Name" msgstr "Nom del mig" @@ -4208,6 +4214,15 @@ msgid "Find Rooms" msgstr "Cerca sales" +msgid "Affiliations:" +msgstr "Afiliacions:" + +msgid "No users found" +msgstr "No s'ha trobat cap usuari" + +msgid "Roles:" +msgstr "Rols:" + msgid "You require encryption, but it is not available on this server." msgstr "Requeriu xifratge, però no està disponible en aquest servidor." @@ -4222,6 +4237,8 @@ "Could not find alternative XMPP connection methods after failing to connect " "directly.\n" msgstr "" +"No s'ha pogut trobar cap mètode alternatiu de connexió XMPP després de no " +"haver pogut connectar directament.\n" msgid "Invalid XMPP ID" msgstr "ID de l'XMPP invàlid" @@ -4229,9 +4246,8 @@ msgid "Invalid XMPP ID. Domain must be set." msgstr "L'ID de l'XMPP no és vàlid. Cal especificar un domini." -#, fuzzy msgid "Malformed BOSH Connect Server" -msgstr "No s'ha pogut connectar al servidor." +msgstr "" #, c-format msgid "Registration of %s@%s successful" @@ -4600,12 +4616,13 @@ msgstr "" "No s'ha pogut botzinar possiblement perquè l'usuari %s està desconnectat." -#, fuzzy, c-format +#, c-format msgid "" "Unable to buzz, because %s does not support it or does not wish to receive " "buzzes now." msgstr "" -"No s'ha pogut botzinar perquè no és pot, o bé l'usuari %s no ho permet." +"No s'ha pogut botzinar l'usuari %s perquè no ho implementa, o bé ara mateix " +"no ho permet." #, c-format msgid "Buzzing %s..." @@ -4620,37 +4637,36 @@ msgid "%s has buzzed you!" msgstr "%s us ha botzinat!" -#, fuzzy, c-format +#, c-format msgid "Unable to initiate media with %s: invalid JID" -msgstr "No s'ha pogut enviar el fitxer a %s, el JID no és vàlid" - -#, fuzzy, c-format +msgstr "No s'ha pogut iniciar el medi amb %s: el JID no és vàlid" + +#, c-format msgid "Unable to initiate media with %s: user is not online" -msgstr "No s'ha pogut enviar el fitxer a %s, l'usuari no està connectat" - -# FIXME: uh? -#, fuzzy, c-format +msgstr "No s'ha pogut iniciar el medi amb %s: l'usuari no està connectat" + +#, c-format msgid "Unable to initiate media with %s: not subscribed to user presence" msgstr "" -"No s'ha pogut enviar el fitxer a %s, no esteu subscrit a la presència de " +"No s'ha pogut iniciar el medi amb %s: no esteu subscrit a la presència de " "l'usuari" -#, fuzzy msgid "Media Initiation Failed" -msgstr "Ha fallat el registre" - -#, fuzzy, c-format +msgstr "Ha fallat la iniciació del medi" + +# FIXME: "media session" -> "sessió amb medi"? +#, c-format msgid "" "Please select the resource of %s with which you would like to start a media " "session." -msgstr "Escolliu a quin recurs de %s voleu enviar un fitxer" +msgstr "" +"Escolliu el recurs de %s amb el qual voleu iniciar una sessió amb medi." msgid "Select a Resource" msgstr "Seleccioneu un recurs" -#, fuzzy msgid "Initiate Media" -msgstr "Inicia un _xat" +msgstr "Inicia el medi" msgid "config: Configure a chat room." msgstr "config: configura la sala de xat." @@ -4671,18 +4687,18 @@ msgstr "ban <user> [motiu]: bandeja de la sala un usuari." msgid "" -"affiliate <user> <owner|admin|member|outcast|none>: Set a user's " -"affiliation with the room." -msgstr "" -"affiliate <usuari> <owner|admin|member|outcast|none>: estableix " -"l'afiliació de l'usuari a la sala." - -msgid "" -"role <user> <moderator|participant|visitor|none>: Set a user's " -"role in the room." -msgstr "" -"role <usuari> <moderator|participant|visitor|none>: estableix el " -"rol d'un usuari en una sala." +"affiliate <owner|admin|member|outcast|none> [nick1] [nick2] ...: Get " +"the users with an affiliation or set users' affiliation with the room." +msgstr "" +"affiliate <owner|admin|member|outcast|none> [sobrenom1] " +"[sobrenom2] ...: obtén els usuaris amb una afiliació, o els l'estableix." + +msgid "" +"role <moderator|participant|visitor|none> [nick1] [nick2] ...: Get the " +"users with an role or set users' role with the room." +msgstr "" +"role <usuari> <moderator|participant|visitor|none> [sobrenom1] " +"[sobrenom2] ...: obtén els usuaris amb el rol especificat, o els l'estableix." msgid "invite <user> [message]: Invite a user to the room." msgstr "invite <usuari> [sala]: convida un usuari a la sala." @@ -4805,9 +4821,8 @@ msgid "Error in chat %s" msgstr "S'ha produït un error en el xat %s" -#, fuzzy msgid "An error occured on the in-band bytestream transfer\n" -msgstr "S'ha produït un error en obrir el fitxer." +msgstr "" msgid "Transfer was closed." msgstr "La transferència s'ha tancat." @@ -5498,14 +5513,17 @@ msgid "%s just sent you a Nudge!" msgstr "%s us ha donat un cop de colze!" -#. char *adl = g_strndup(payload, len); +#, c-format +msgid "Unknown error (%d): %s" +msgstr "Error desconegut (%d): %s" + +msgid "Unable to add user" +msgstr "No s'ha pogut afegir l'usuari" + #, c-format msgid "Unknown error (%d)" msgstr "Error desconegut (%d)" -msgid "Unable to add user" -msgstr "No s'ha pogut afegir l'usuari" - msgid "The following users are missing from your addressbook" msgstr "Manquen aquests usuaris a la vostra llista d'amics" @@ -5764,6 +5782,8 @@ msgstr "S'ha perdut la connexió amb el servidor" #. Can't write _()'d strings in array initializers. Workaround. +#. khc: then use N_() in the array initializer and use _() when they are +#. used msgid "New mail messages" msgstr "Missatges de correu nous" @@ -5961,15 +5981,15 @@ #. * connotation, for example, "he was zapped by electricity when #. * he put a fork in the toaster." msgid "Zap" -msgstr "" +msgstr "Enrampar" #, c-format msgid "%s has zapped you!" -msgstr "" +msgstr "%s us ha enrampat!" #, c-format msgid "Zapping %s..." -msgstr "" +msgstr "S'està enrampant %s..." #. Whack means "to hit or strike someone with a sharp blow" msgid "Whack" @@ -5977,7 +5997,7 @@ #, c-format msgid "%s has whacked you!" -msgstr "%s us ha bufetejat [%s]" +msgstr "%s us ha bufetejat!" #, c-format msgid "Whacking %s..." @@ -6063,17 +6083,16 @@ #. We're not entirely sure what the MySpace people mean by #. * this... but we think it's the equivalent of "prank." Or, for #. * someone to perform a mischievous trick or practical joke. -#, fuzzy msgid "Punk" -msgstr "Enredar" - -#, fuzzy, c-format +msgstr "Pren el pèl" + +#, c-format msgid "%s has punk'd you!" -msgstr "%s us ha enredat!" - -#, fuzzy, c-format +msgstr "%s us ha près el pèl!" + +#, c-format msgid "Punking %s..." -msgstr "S'està enredant %s..." +msgstr "S'està prenent el pèl a %s..." #. Raspberry is a slang term for the vibrating sound made #. * when you stick your tongue out of your mouth with your @@ -6082,17 +6101,16 @@ #. * gesture, so it does not carry a harsh negative #. * connotation. It is generally used in a playful tone #. * with friends. -#, fuzzy msgid "Raspberry" msgstr "Llengoteja" -#, fuzzy, c-format +#, c-format msgid "%s has raspberried you!" -msgstr "%s s'ha connectat." - -#, fuzzy, c-format +msgstr "%s us ha fet una llengota!" + +#, c-format msgid "Raspberrying %s..." -msgstr "Morrejant" +msgstr "S'està fent una llengota a %s..." msgid "Required parameters not passed in" msgstr "No s'han passat tots els paràmetres requerits" @@ -6611,9 +6629,6 @@ msgid "iChat AV" msgstr "iChat AV" -msgid "Live Video" -msgstr "Vídeo en directe" - msgid "Camera" msgstr "Càmera" @@ -7821,7 +7836,7 @@ msgstr "<p><b>Comprovadors del codi</b>:<br>\n" msgid "and more, please let me know... thank you!))" -msgstr "" +msgstr "i més, si us plau feu-m'ho saber... gràcies!!!))" # FIXME: ush... traducció lliure... msgid "<p><i>And, all the boys in the backroom...</i><br>\n" @@ -9569,7 +9584,7 @@ "implementat." msgid "Your SMS was not delivered" -msgstr "" +msgstr "No s'ha enviat l'SMS" msgid "Your Yahoo! message did not get sent." msgstr "No s'ha pogut enviar el vostre missatge de Yahoo!" @@ -9595,6 +9610,30 @@ msgid "Add buddy rejected" msgstr "S'ha rebutjat afegir l'amic" +#. Some error in the received stream +msgid "Received invalid data" +msgstr "S'han rebut dades invàlides" + +#. Password incorrect +msgid "Incorrect Password" +msgstr "La contrasenya no és correcta" + +#. security lock from too many failed login attempts +msgid "Account locked: Too many failed login attempts" +msgstr "S'ha blocat el compte: s'ha intentat entrar massa vegades" + +#. the username does not exist +msgid "Username does not exist" +msgstr "L'usuari no existeix" + +#. indicates a lock of some description +msgid "Account locked: See the debug log" +msgstr "El compte està blocat: vegeu el registre de depuració" + +#. username or password missing +msgid "Username or password missing" +msgstr "Manquen el nom d'uruari o la contrasenya" + #, c-format msgid "" "The Yahoo server has requested the use of an unrecognized authentication " @@ -10300,13 +10339,13 @@ msgid "Unable to connect to %s: %s" msgstr "No s'ha pogut connectar a %s: %s" -#, fuzzy, c-format +#, c-format msgid "" "Unable to connect to %s: Server requires TLS/SSL, but no TLS/SSL support was " "found." msgstr "" -"El servidor requereix TLS/SSL per entrar. No s'ha trobat suport per a TLS/" -"SSL." +"No s'ha pogut connectar a %s: el servidor requereix TLS/SSL, però no s'ha " +"trobat cap implementació de TLS/SSL." #, c-format msgid " - %s" @@ -10458,9 +10497,8 @@ msgid "Create _this new account on the server" msgstr "Crea _aquest compte nou al servidor" -#, fuzzy msgid "_Proxy" -msgstr "Servidor intermediari" +msgstr "Servidor _intermediari" msgid "Enabled" msgstr "Habilitat" @@ -10511,8 +10549,8 @@ msgid "Please update the necessary fields." msgstr "Actualitzeu els camps necessaris." -msgid "Room _List" -msgstr "_Llista de sales" +msgid "A_ccount" +msgstr "_Compte" msgid "" "Please enter the appropriate information about the chat you would like to " @@ -10520,8 +10558,8 @@ msgstr "" "Introduïu la informació necessària sobre el xat al qual vulgueu entrar.\n" -msgid "_Account:" -msgstr "C_ompte:" +msgid "Room _List" +msgstr "_Llista de sales" msgid "_Block" msgstr "_Bloca" @@ -10539,16 +10577,14 @@ msgid "I_M" msgstr "_MI" -#, fuzzy msgid "_Audio Call" -msgstr "Finalitza la trucada" +msgstr "_Trucada amb àudio" msgid "Audio/_Video Call" -msgstr "" - -#, fuzzy +msgstr "Trucada d'àudio i _vídeo" + msgid "_Video Call" -msgstr "Xat de vídeo" +msgstr "Trucada de _vídeo" msgid "_Send File..." msgstr "_Envia un fitxer..." @@ -10832,7 +10868,7 @@ msgstr "Rehabilita" msgid "SSL FAQs" -msgstr "" +msgstr "PMF sobre SSL" msgid "Welcome back!" msgstr "Ben tornat!" @@ -11050,21 +11086,17 @@ msgid "/Conversation/Clea_r Scrollback" msgstr "/Conversa/_Neteja la finestra" -#, fuzzy msgid "/Conversation/M_edia" -msgstr "/Conversa/_Més" - -#, fuzzy +msgstr "/Conversa/M_edi" + msgid "/Conversation/Media/_Audio Call" -msgstr "/Conversa/_Més" - -#, fuzzy +msgstr "/Conversa/Medi/_Trucada d'àudio" + msgid "/Conversation/Media/_Video Call" -msgstr "/Conversa/_Més" - -#, fuzzy +msgstr "/Conversa/Medi/Trucada de _vídeo" + msgid "/Conversation/Media/Audio\\/Video _Call" -msgstr "/Conversa/Visualitza el _registre" +msgstr "/Conversa/Medi/Tru_cada d'àudio i vídeo" msgid "/Conversation/Se_nd File..." msgstr "/Conversa/Envia un _fitxer..." @@ -11138,17 +11170,14 @@ msgid "/Conversation/View Log" msgstr "/Conversa/Visualitza el registre" -#, fuzzy msgid "/Conversation/Media/Audio Call" -msgstr "/Conversa/Més" - -#, fuzzy +msgstr "/Conversa/Medi/Trucada d'àudio" + msgid "/Conversation/Media/Video Call" -msgstr "/Conversa/Visualitza el registre" - -#, fuzzy +msgstr "/Conversa/Medi/Trucada de vídeo" + msgid "/Conversation/Media/Audio\\/Video Call" -msgstr "/Conversa/Més" +msgstr "/Conversa/Medi/Trucada d'àudio i vídeo" msgid "/Conversation/Send File..." msgstr "/Conversa/Envia un fitxer..." @@ -11337,7 +11366,7 @@ msgstr "Ka-Hing Cheung" msgid "voice and video" -msgstr "" +msgstr "veu i vídeo" msgid "support" msgstr "suport" @@ -11481,9 +11510,8 @@ msgid "Ubuntu Georgian Translators" msgstr "Traductors al georgià de l'Ubuntu" -#, fuzzy msgid "Khmer" -msgstr "Altres" +msgstr "Khmer" msgid "Kannada" msgstr "Kannada" @@ -12006,11 +12034,9 @@ msgid "Save Image" msgstr "Desa imatge" -#, c-format msgid "_Save Image..." msgstr "_Desa la imatge..." -#, c-format msgid "_Add Custom Smiley..." msgstr "_Afegeix una emoticona personalitzada..." @@ -12325,22 +12351,21 @@ "se.\n" msgid "/_Media" -msgstr "" +msgstr "/_Medi" msgid "/Media/_Hangup" -msgstr "" - -#, fuzzy +msgstr "/Medi/_Penja" + msgid "Calling..." -msgstr "S'està calculant..." +msgstr "S'està trucant..." #, c-format msgid "%s wishes to start an audio/video session with you." -msgstr "" +msgstr "%s vol iniciar una sessió d'àudio/vídeo." #, c-format msgid "%s wishes to start a video session with you." -msgstr "" +msgstr "%s vol iniciar una sessió de vídeo." #, c-format msgid "%s has %d new message." @@ -12376,20 +12401,19 @@ msgid "<span weight=\"bold\" size=\"larger\">You have mail!</span>" msgstr "<span weight=\"bold\" size=\"larger\">Teniu correu electrònic.</span>" -#, fuzzy msgid "New Pounces" -msgstr "Avís nou per a l'amic" - +msgstr "Avisos nous" + +# FIXME: Cancel·la? msgid "Dismiss" -msgstr "" - -#, fuzzy +msgstr "Rebutja" + +# FIXME: pounced -> envestir? msgid "<span weight=\"bold\" size=\"larger\">You have pounced!</span>" -msgstr "<span weight=\"bold\" size=\"larger\">Teniu correu electrònic.</span>" - -#, fuzzy +msgstr "<span weight=\"bold\" size=\"larger\">Us han envestit!</span>" + msgid "No message" -msgstr "(1 missatge)" +msgstr "Cap missatge" msgid "The following plugins will be unloaded." msgstr "Es descarregaran els connectors següents." @@ -12447,6 +12471,9 @@ msgid "Pounce on Whom" msgstr "Avisa dels Whom" +msgid "_Account:" +msgstr "C_ompte:" + msgid "_Buddy name:" msgstr "_Nom de l'amic:" @@ -12517,47 +12544,47 @@ msgid "Pounce Target" msgstr "Objectiu de l'avís" -#, fuzzy, c-format +#, c-format msgid "Started typing" -msgstr "Comenci a escriure" - -#, fuzzy, c-format +msgstr "Hagi començat a escriure" + +#, c-format msgid "Paused while typing" msgstr "S'aturi mentre tecleja" -#, fuzzy, c-format +#, c-format msgid "Signed on" msgstr "Es connecti" -#, fuzzy, c-format +#, c-format msgid "Returned from being idle" -msgstr "Tor_na a estar actiu" - -#, fuzzy, c-format +msgstr "Torna a estar actiu" + +#, c-format msgid "Returned from being away" msgstr "Torni a estar present" -#, fuzzy, c-format +#, c-format msgid "Stopped typing" msgstr "Pari d'escriure" -#, fuzzy, c-format +#, c-format msgid "Signed off" msgstr "Es desconnecti" -#, fuzzy, c-format +#, c-format msgid "Became idle" msgstr "Passi a inactiu" -#, fuzzy, c-format +#, c-format msgid "Went away" msgstr "En estar absent" -#, fuzzy, c-format +#, c-format msgid "Sent a message" msgstr "Envia un missatge" -#, fuzzy, c-format +#, c-format msgid "Unknown.... Please report this!" msgstr "Esdeveniment d'avís desconegut, informeu-nos-en." @@ -12726,7 +12753,7 @@ #. TURN server msgid "Relay Server (TURN)" -msgstr "" +msgstr "Servidor repetidor (TURN)" msgid "Proxy Server & Browser" msgstr "Servidor intermediari i navegador" @@ -13123,6 +13150,9 @@ msgid "Custom Smiley Manager" msgstr "Gestor d'emoticones personalitzades" +msgid "Select Buddy Icon" +msgstr "Seleccioneu una icona per a l'amic" + msgid "Click to change your buddyicon for this account." msgstr "Feu clic per canviar la icona d'amic d'aquest compte." @@ -14289,6 +14319,9 @@ msgid "This plugin is useful for debbuging XMPP servers or clients." msgstr "Aquest connector és útil per a depurar servidors i clients XMPP." +#~ msgid "Live Video" +#~ msgstr "Vídeo en directe" + #~ msgid "Invite message" #~ msgstr "Missatge d'invitació" @@ -14768,9 +14801,6 @@ #~ "llista d'amics. Opcionalment podeu entrar un àlies, o sobrenom, per a " #~ "l'amic. El sobrenom substituirà el nom d'usuari allà on sigui possible.\n" -#~ msgid "A_ccount:" -#~ msgstr "_Compte:" - #~ msgid "User has typed something and stopped" #~ msgstr "L'usuari ha escrit alguna cosa i s'ha aturat"
--- a/po/de.po Fri May 01 21:36:29 2009 +0000 +++ b/po/de.po Mon May 18 19:54:24 2009 +0000 @@ -11,8 +11,8 @@ msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-04-30 10:37-0400\n" -"PO-Revision-Date: 2009-04-26 12:11+0200\n" +"POT-Creation-Date: 2009-05-15 19:56+0200\n" +"PO-Revision-Date: 2009-05-15 19:56+0200\n" "Last-Translator: Jochen Kemnade <jochenkemnade@web.de>\n" "Language-Team: Deutsch <de@li.org>\n" "MIME-Version: 1.0\n" @@ -1562,7 +1562,6 @@ msgid "Lastlog plugin." msgstr "Verlauf-Plugin." -#, c-format msgid "" "\n" "Fetching TinyURL..." @@ -1890,7 +1889,6 @@ "Fehler beim Lesen vom Auflösungsprozess:\n" "%s" -#, c-format msgid "Resolver process exited without answering our request" msgstr "Auflösungsprozess hat sich beendet ohne die Anfrage zu beantworten" @@ -3760,11 +3758,8 @@ msgid "Unsupported version of BOSH protocol" msgstr "Nicht-unterstützte Version" -#, fuzzy msgid "Unable to establish a connection with the server" -msgstr "" -"Die Verbindung mit dem Server konnte nicht hergestellt werden:\n" -"%s" +msgstr "Die Verbindung mit dem Server konnte nicht hergestellt werden" #, c-format msgid "" @@ -3774,9 +3769,8 @@ "Die Verbindung mit dem Server konnte nicht hergestellt werden:\n" "%s" -#, fuzzy msgid "Unable to establish SSL connection" -msgstr "Kann Verbindung nicht erstellen" +msgstr "Kann SSL-Verbindung nicht erstellen" msgid "Unable to create socket" msgstr "Kann Socket nicht erstellen" @@ -4012,6 +4006,14 @@ msgid "Resource" msgstr "Ressource" +#, fuzzy, c-format +msgid "%s ago" +msgstr "vor %s" + +#, fuzzy +msgid "Logged off" +msgstr "Abgemeldet" + msgid "Middle Name" msgstr "Zweiter Name" @@ -4181,6 +4183,17 @@ msgid "Find Rooms" msgstr "Finde Räume" +#, fuzzy +msgid "Affiliations:" +msgstr "Alias:" + +msgid "No users found" +msgstr "Keine Benutzer gefunden" + +#, fuzzy +msgid "Roles:" +msgstr "Funktion" + msgid "You require encryption, but it is not available on this server." msgstr "" "Sie fordern Verschlüsselung, aber diese ist auf dem Server nicht verfügbar." @@ -4191,7 +4204,6 @@ msgid "Read Error" msgstr "Fehler beim Lesen" -#, c-format msgid "" "Could not find alternative XMPP connection methods after failing to connect " "directly.\n" @@ -4645,16 +4657,18 @@ msgid "ban <user> [reason]: Ban a user from the room." msgstr "ban <Benutzer> [Grund]: Verbanne einen Benutzer aus dem Raum." -msgid "" -"affiliate <user> <owner|admin|member|outcast|none>: Set a user's " -"affiliation with the room." +#, fuzzy +msgid "" +"affiliate <owner|admin|member|outcast|none> [nick1] [nick2] ...: Get " +"the users with an affiliation or set users' affiliation with the room." msgstr "" "affiliate <Benutzer> <owner|admin|member|outcast|none>: Setze " "eine Benutzerzugehörigkeit für den Raum." -msgid "" -"role <user> <moderator|participant|visitor|none>: Set a user's " -"role in the room." +#, fuzzy +msgid "" +"role <moderator|participant|visitor|none> [nick1] [nick2] ...: Get the " +"users with an role or set users' role with the room." msgstr "" "role <Benutzer> <moderator|participant|visitor|none>: Setze eine " "Rolle für den Benutzer im Raum." @@ -4888,219 +4902,166 @@ "%s ist auf der lokalen Liste, aber nicht auf der Serverliste. Möchten Sie, " "dass der Buddy hinzugefügt wird?" -#, c-format msgid "Unable to parse message" msgstr "Kann die Nachricht nicht parsen" -#, c-format msgid "Syntax Error (probably a client bug)" msgstr "Syntaxfehler (wahrscheinlich ein Client-Bug)" -#, c-format msgid "Invalid email address" msgstr "Ungültige E-Mail-Adresse" -#, c-format msgid "User does not exist" msgstr "Benutzer existiert nicht" -#, c-format msgid "Fully qualified domain name missing" msgstr "Der Fully Qualified Domain Name fehlt" -#, c-format msgid "Already logged in" msgstr "Schon angemeldet" -#, c-format msgid "Invalid username" msgstr "Ungültiger Benutzername" -#, c-format msgid "Invalid friendly name" msgstr "Ungültiger Freundesname" -#, c-format msgid "List full" msgstr "Liste voll" -#, c-format msgid "Already there" msgstr "Schon da" -#, c-format msgid "Not on list" msgstr "Nicht auf der Liste" -#, c-format msgid "User is offline" msgstr "Benutzer ist offline" -#, c-format msgid "Already in the mode" msgstr "Bereits in diesem Modus" -#, c-format msgid "Already in opposite list" msgstr "Bereits in der „Gegenteil-Liste“" -#, c-format msgid "Too many groups" msgstr "Zu viele Gruppen" -#, c-format msgid "Invalid group" msgstr "Ungültige Gruppe" -#, c-format msgid "User not in group" msgstr "Benutzer ist nicht in der Gruppe" -#, c-format msgid "Group name too long" msgstr "Name der Gruppe ist zu lang" -#, c-format msgid "Cannot remove group zero" msgstr "Kann die Gruppe „Null“ nicht entfernen" -#, c-format msgid "Tried to add a user to a group that doesn't exist" msgstr "" "Versuchte einen Benutzer zu einer nichtexistierenden Gruppe hinzuzufügen" -#, c-format msgid "Switchboard failed" msgstr "Vermittlung gescheitert" -#, c-format msgid "Notify transfer failed" msgstr "Übertragung der Benachrichtigung gescheitert" -#, c-format msgid "Required fields missing" msgstr "Notwendige Felder fehlen" -#, c-format msgid "Too many hits to a FND" msgstr "Zu viele Treffer zu einem FND" -#, c-format msgid "Not logged in" msgstr "Nicht angemeldet" -#, c-format msgid "Service temporarily unavailable" msgstr "Dienst momentan nicht verfügbar" -#, c-format msgid "Database server error" msgstr "Fehler des Datenbank-Servers" -#, c-format msgid "Command disabled" msgstr "Kommando abgeschaltet" -#, c-format msgid "File operation error" msgstr "Dateiverarbeitungsfehler" -#, c-format msgid "Memory allocation error" msgstr "Fehler bei der Speicheranforderung" -#, c-format msgid "Wrong CHL value sent to server" msgstr "Falscher CHL-Wert zum Server gesendet" -#, c-format msgid "Server busy" msgstr "Server beschäftigt" -#, c-format msgid "Server unavailable" msgstr "Server unerreichbar" -#, c-format msgid "Peer notification server down" msgstr "Peer-Benachrichtigungsserver nicht erreichbar" -#, c-format msgid "Database connect error" msgstr "Datenbank-Verbindungsfehler" -#, c-format msgid "Server is going down (abandon ship)" msgstr "Server fährt runter (melden Sie sich ab)" -#, c-format msgid "Error creating connection" msgstr "Fehler beim Herstellen der Verbindung" -#, c-format msgid "CVR parameters are either unknown or not allowed" msgstr "CVR-Parameter sind entweder unbekannt oder nicht erlaubt" -#, c-format msgid "Unable to write" msgstr "Schreiben nicht möglich" -#, c-format msgid "Session overload" msgstr "Sitzung überlastet" -#, c-format msgid "User is too active" msgstr "Benutzer ist zu aktiv" -#, c-format msgid "Too many sessions" msgstr "Zu viele Sitzungen" -#, c-format msgid "Passport not verified" msgstr "Passport (MSN Benutzerausweis) wurde nicht überprüft" -#, c-format msgid "Bad friend file" msgstr "Falsche Friends-Datei" -#, c-format msgid "Not expected" msgstr "Nicht erwartet" -#, c-format msgid "Friendly name changes too rapidly" msgstr "Benutzernamen werden zu oft geändert" -#, c-format msgid "Server too busy" msgstr "Server ist zu beschäftigt" -#, c-format msgid "Authentication failed" msgstr "Authentifizierung fehlgeschlagen" -#, c-format msgid "Not allowed when offline" msgstr "Nicht erlaubt im Offline-Modus" -#, c-format msgid "Not accepting new users" msgstr "Akzeptiert keine neuen Benutzer" -#, c-format msgid "Kids Passport without parental consent" msgstr "Kinder-Passwort ohne die Zustimmung der Eltern" -#, c-format msgid "Passport account not yet verified" msgstr "Passport-Konto wurde noch nicht überprüft" msgid "Passport account suspended" msgstr "Passport-Konto gesperrt" -#, c-format msgid "Bad ticket" msgstr "Falsches Ticket" @@ -5477,14 +5438,17 @@ msgid "%s just sent you a Nudge!" msgstr "%s hat Sie gerade angestoßen!" -#. char *adl = g_strndup(payload, len); +#, c-format +msgid "Unknown error (%d): %s" +msgstr "Unbekannter Fehler (%d): %s" + +msgid "Unable to add user" +msgstr "Kann den Benutzer nicht hinzufügen" + #, c-format msgid "Unknown error (%d)" msgstr "Unbekannter Fehler (%d)" -msgid "Unable to add user" -msgstr "Kann den Benutzer nicht hinzufügen" - msgid "The following users are missing from your addressbook" msgstr "Die folgenden Benutzer fehlen in Ihrem Adressbuch" @@ -5749,6 +5713,8 @@ msgstr "Verbindung zum Server verloren" #. Can't write _()'d strings in array initializers. Workaround. +#. khc: then use N_() in the array initializer and use _() when they are +#. used msgid "New mail messages" msgstr "Neue Mail-Nachrichten" @@ -6591,9 +6557,6 @@ msgid "iChat AV" msgstr "iChat AV" -msgid "Live Video" -msgstr "Live-Video" - msgid "Camera" msgstr "Kamera" @@ -8653,7 +8616,6 @@ msgid "<br><b>Channel Topic:</b><br>%s" msgstr "<br><b>Thema des Kanals:</b><br>%s" -#, c-format msgid "<br><b>Channel Modes:</b> " msgstr "<br><b>Kanal-Modi:</b> " @@ -8678,7 +8640,6 @@ msgid "Channel Public Keys List" msgstr "Liste der öffentlichen Schlüssel des Kanals" -#, c-format msgid "" "Channel authentication is used to secure the channel from unauthorized " "access. The authentication may be based on passphrase and digital " @@ -9080,7 +9041,6 @@ msgid "Your Current Mood" msgstr "Ihre momentane Stimmung" -#, c-format msgid "Normal" msgstr "Normal" @@ -9466,47 +9426,37 @@ msgid "No server statistics available" msgstr "Keine Serverstatistik verfügbar" -#, c-format msgid "Failure: Version mismatch, upgrade your client" msgstr "Fehler: Unterschiedliche Version, aktualisieren Sie Ihren Client" -#, c-format msgid "Failure: Remote does not trust/support your public key" msgstr "" "Fehler: Die entfernte Seite vertraut Ihrem öffentlichen Schlüssel nicht" -#, c-format msgid "Failure: Remote does not support proposed KE group" msgstr "" "Fehler: Entferntes Programm unterstützt nicht die vorgeschlagen KE-Gruppe" -#, c-format msgid "Failure: Remote does not support proposed cipher" msgstr "" "Fehler: Entferntes Programm unterstützt die vorgeschlagene Cipher nicht" -#, c-format msgid "Failure: Remote does not support proposed PKCS" msgstr "Fehler: Entferntes Programm unterstützt die vorgeschlagene PKCS nicht" -#, c-format msgid "Failure: Remote does not support proposed hash function" msgstr "" "Fehler: Entferntes Programm unterstützt die vorgeschlagen Hashfunktion nicht" -#, c-format msgid "Failure: Remote does not support proposed HMAC" msgstr "Fehler: Entferntes Programm unterstützt das vorgeschlagene HMAC nicht" -#, c-format msgid "Failure: Incorrect signature" msgstr "Fehler: Falsche Signatur" -#, c-format msgid "Failure: Invalid cookie" msgstr "Fehler: Ungültiger Cookie" -#, c-format msgid "Failure: Authentication failed" msgstr "Fehler: Authentifizierung fehlgeschlagen" @@ -10322,29 +10272,24 @@ msgstr " (%s)" #. 10053 -#, c-format msgid "Connection interrupted by other software on your computer." msgstr "" "Die Verbindung wurde von einer anderen Software auf ihrem Computer " "unterbrochen." #. 10054 -#, c-format msgid "Remote host closed connection." msgstr "Der entfernte Host hat die Verbindung beendet." #. 10060 -#, c-format msgid "Connection timed out." msgstr "Verbindungsabbruch wegen Zeitüberschreitung." #. 10061 -#, c-format msgid "Connection refused." msgstr "Verbindung abgelehnt." #. 10048 -#, c-format msgid "Address already in use." msgstr "Adresse wird bereits benutzt." @@ -11620,7 +11565,6 @@ "geschützt. Die Datei 'COPYRIGHT' enthält die komplette Liste der " "Mitwirkenden. Wir übernehmen keine Haftung für dieses Programm.<BR><BR>" -#, c-format msgid "" "<FONT SIZE=\"4\">FAQ:</FONT> <A HREF=\"http://developer.pidgin.im/wiki/FAQ" "\">http://developer.pidgin.im/wiki/FAQ</A><BR/><BR/>" @@ -11628,7 +11572,6 @@ "<FONT SIZE=\"4\">FAQ:</FONT> <A HREF=\"http://developer.pidgin.im/wiki/FAQ" "\">http://developer.pidgin.im/wiki/FAQ</A><BR/><BR/>" -#, c-format msgid "" "<FONT SIZE=\"4\">Help via e-mail:</FONT> <A HREF=\"mailto:support@pidgin.im" "\">support@pidgin.im</A><BR/><BR/>" @@ -11636,13 +11579,11 @@ "<FONT SIZE=\"4\">Hilfe per E-Mail:</FONT> <A HREF=\"mailto:support@pidgin.im" "\">support@pidgin.im</A><BR/><BR/>" -#, c-format msgid "" "<FONT SIZE=\"4\">IRC Channel:</FONT> #pidgin on irc.freenode.net<BR><BR>" msgstr "" "<FONT SIZE=\"4\">IRC-Kanal:</FONT> #pidgin auf irc.freenode.net<BR><BR>" -#, c-format msgid "<FONT SIZE=\"4\">XMPP MUC:</FONT> devel@conference.pidgin.im<BR><BR>" msgstr "<FONT SIZE=\"4\">XMPP-MUC:</FONT> devel@conference.pidgin.im<BR><BR>" @@ -12001,11 +11942,9 @@ msgid "Save Image" msgstr "Bild speichern" -#, c-format msgid "_Save Image..." msgstr "Bild _speichern..." -#, c-format msgid "_Add Custom Smiley..." msgstr "Benutzerdefinierten Smiley _hinzufügen..." @@ -12305,7 +12244,6 @@ msgid "Pidgin" msgstr "Pidgin" -#, c-format msgid "Exiting because another libpurple client is already running.\n" msgstr "Wird geschlossen, da bereits ein anderer libpurple-Client läuft\n" @@ -12493,47 +12431,36 @@ msgid "Pounce Target" msgstr "Alarm-Ziel" -#, c-format msgid "Started typing" msgstr "Beginnt zu tippen" -#, c-format msgid "Paused while typing" msgstr "Hat beim Tippen angehalten" -#, c-format msgid "Signed on" msgstr "Hat sich anmeldet" -#, c-format msgid "Returned from being idle" msgstr "Ist nicht mehr inaktiv" -#, c-format msgid "Returned from being away" msgstr "Ist wieder anwesend" -#, c-format msgid "Stopped typing" msgstr "Hat das Tippen gestoppt" -#, c-format msgid "Signed off" msgstr "Hat sich abmeldet" -#, c-format msgid "Became idle" msgstr "Wurde untätig" -#, c-format msgid "Went away" msgstr "Ging hinaus" -#, c-format msgid "Sent a message" msgstr "Eine Nachricht senden" -#, c-format msgid "Unknown.... Please report this!" msgstr "Unbekannt.... Bitte berichten Sie dieses Problem!" @@ -12814,27 +12741,21 @@ msgid "Sound Selection" msgstr "Klang-Auswahl" -#, c-format msgid "Quietest" msgstr "Am leisesten" -#, c-format msgid "Quieter" msgstr "Leiser" -#, c-format msgid "Quiet" msgstr "Leise" -#, c-format msgid "Loud" msgstr "Laut" -#, c-format msgid "Louder" msgstr "Lauter" -#, c-format msgid "Loudest" msgstr "Am lautesten" @@ -13871,7 +13792,6 @@ msgid "Select Color" msgstr "Farbe auswählen" -#, c-format msgid "Select Interface Font" msgstr "Schriftart wählen" @@ -14096,7 +14016,6 @@ msgid "Timestamp Format Options" msgstr "Zeitstempelformat-Optionen" -#, c-format msgid "_Force 24-hour time format" msgstr "_Erzwinge 24-Stunden Zeitformat" @@ -14265,6 +14184,9 @@ msgstr "" "Dieses Plugin ist nützlich zur Fehlersuche in XMPP-Servern oder -Clients." +#~ msgid "Live Video" +#~ msgstr "Live-Video" + #~ msgid "Invite message" #~ msgstr "Einladungsnachricht"